Нет описания

middleware.py 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from __future__ import annotations
  2. from typing import Optional
  3. from django.utils.deprecation import MiddlewareMixin
  4. try:
  5. from django.contrib.sites.models import Site
  6. except Exception: # pragma: no cover
  7. Site = None # type: ignore
  8. from .models import OrganizationSite, Organization
  9. class CurrentOrganizationMiddleware(MiddlewareMixin):
  10. """Resolve request.site and request.org from the Host header.
  11. - Matches Site by request host (ignores port)
  12. - Maps Site -> Organization via OrganizationSite
  13. - Falls back to user's profile organization, if available
  14. """
  15. def process_request(self, request):
  16. request.site = None # type: ignore[attr-defined]
  17. request.org: Optional[Organization] = None # type: ignore[attr-defined]
  18. host = request.get_host().split(":")[0].lower()
  19. # Resolve Site by host
  20. if Site is not None:
  21. try:
  22. request.site = Site.objects.get(domain__iexact=host)
  23. except Exception:
  24. try:
  25. request.site = Site.objects.get_current()
  26. except Exception:
  27. request.site = None
  28. # Map Site -> Organization
  29. if request.site is not None:
  30. try:
  31. mapping = OrganizationSite.objects.select_related("organization").get(site=request.site)
  32. request.org = mapping.organization
  33. except OrganizationSite.DoesNotExist:
  34. request.org = None
  35. # Fallback to user's org if not mapped
  36. if request.org is None and getattr(request, "user", None) and request.user.is_authenticated:
  37. request.org = getattr(getattr(request.user, "recycle_profile", None), "organization", None)
  38. return None