40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
from django.http import JsonResponse
|
|
from tenants.models import Tenant
|
|
|
|
class TenantMiddleware:
|
|
def __init__(self, get_response):
|
|
self.get_response = get_response
|
|
self.exempt_paths = [
|
|
'/admin/',
|
|
'/api/schema/',
|
|
'/api/docs/',
|
|
'/api/auth/login/',
|
|
'/api/auth/register/',
|
|
'/api/auth/token/refresh/',
|
|
'/api/auth/profile/',
|
|
]
|
|
|
|
def __call__(self, request):
|
|
if any(request.path.startswith(path) for path in self.exempt_paths):
|
|
request.tenant = None
|
|
return self.get_response(request)
|
|
|
|
# 1. Check Header
|
|
tenant_id = request.headers.get('X-Tenant-ID')
|
|
if not tenant_id:
|
|
# 2. Check Subdomain (Optional, skipping for now, can implement later)
|
|
# host = request.get_host().split(':')[0]
|
|
# subdomain = host.split('.')[0]
|
|
pass
|
|
|
|
if tenant_id:
|
|
try:
|
|
request.tenant = Tenant.objects.get(id=tenant_id, is_active=True)
|
|
except Tenant.DoesNotExist:
|
|
return JsonResponse({"detail": "Invalid or inactive tenant ID supplied."}, status=403)
|
|
else:
|
|
# Normally we might enforce tenant_id, but we'll let permission classes handle it.
|
|
request.tenant = None
|
|
|
|
return self.get_response(request)
|