signals.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import logging
  2. from allauth.account.signals import user_logged_in
  3. from allauth.socialaccount.models import SocialAccount, SocialApp
  4. from django.db.models import Prefetch
  5. from django.dispatch import receiver
  6. from apps.organizations_ext.models import (
  7. OrganizationUser,
  8. )
  9. logger = logging.getLogger(__name__)
  10. @receiver(user_logged_in)
  11. def add_user_to_socialapp_organization(request, user, **kwargs):
  12. """
  13. Add user to organization if organization-social app exists
  14. """
  15. social_apps = (
  16. SocialApp.objects.filter(
  17. provider__in=SocialAccount.objects.filter(user=user).values_list(
  18. "provider", flat=True
  19. )
  20. )
  21. .select_related("organizationsocialapp__organization")
  22. .prefetch_related(
  23. Prefetch(
  24. "organizationsocialapp__organization__organization_users",
  25. queryset=OrganizationUser.objects.filter(user=user),
  26. to_attr="matched_user",
  27. )
  28. )
  29. .all()
  30. )
  31. for social_app in social_apps:
  32. if not social_app.organizationsocialapp.organization.matched_user: # type: ignore
  33. social_app.organizationsocialapp.organization.add_user(user) # type: ignore
  34. logger.info(
  35. f"Added {social_app.organizationsocialapp.organization} to {user}"
  36. ) # type: ignore