暂无描述

middleware.py 1.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. from __future__ import annotations
  2. from typing import Optional
  3. from django.utils.deprecation import MiddlewareMixin
  4. from django.contrib.sites.models import Site
  5. from .models import OrganizationSite, Organization
  6. class CurrentOrganizationMiddleware(MiddlewareMixin):
  7. def process_request(self, request):
  8. request.site = None # type: ignore[attr-defined]
  9. request.org: Optional[Organization] = None # type: ignore[attr-defined]
  10. host = request.get_host().split(":")[0].lower()
  11. # Resolve Site by host
  12. try:
  13. request.site = Site.objects.get(domain__iexact=host)
  14. except Site.DoesNotExist:
  15. try:
  16. request.site = Site.objects.get_current()
  17. except Exception:
  18. request.site = None
  19. # Map Site -> Organization
  20. if request.site is not None:
  21. try:
  22. mapping = OrganizationSite.objects.select_related("organization").get(site=request.site)
  23. request.org = mapping.organization
  24. except OrganizationSite.DoesNotExist:
  25. request.org = None
  26. # Fallback to user's org if not mapped
  27. if request.org is None and getattr(request, "user", None) and request.user.is_authenticated:
  28. request.org = getattr(getattr(request.user, "recycle_profile", None), "organization", None)
  29. return None