def reverser_func(self, name, tenant): """ Reverses `name` in the urlconf returned from `tenant`. """ urlconf_path = get_subfolder_urlconf(tenant) urlconf = import_module(urlconf_path) reverse_response = reverse(name, urlconf=urlconf) del sys.modules[urlconf_path] # required to simulate new thread next time return reverse_response
def process_request(self, request): # Short circuit if tenant is already set by another middleware. # This allows for multiple tenant-resolving middleware chained together. if hasattr(request, "tenant"): return connection.set_schema_to_public() tenant = None urlconf = None TenantModel = get_tenant_model() hostname = self.hostname_from_request(request) subfolder_prefix_path = "/{}/".format(get_subfolder_prefix()) # We are in the public tenant if not request.path.startswith(subfolder_prefix_path): try: tenant = TenantModel.objects.get( schema_name=get_public_schema_name()) except TenantModel.DoesNotExist: raise self.TENANT_NOT_FOUND_EXCEPTION( "Unable to find public tenant") # Do we have a public-specific urlconf? if (hasattr(settings, "PUBLIC_SCHEMA_URLCONF") and tenant.schema_name == get_public_schema_name()): urlconf = settings.PUBLIC_SCHEMA_URLCONF # We are in a specific tenant else: path_chunks = request.path[len(subfolder_prefix_path):].split("/") tenant_subfolder = path_chunks[0] try: tenant = TenantModel.objects.get( domains__domain=tenant_subfolder) except TenantModel.DoesNotExist: raise self.TENANT_NOT_FOUND_EXCEPTION( 'No tenant for subfolder "%s"' % (tenant_subfolder or "")) tenant.domain_subfolder = tenant_subfolder urlconf = get_subfolder_urlconf(tenant) tenant.domain_url = hostname request.tenant = tenant connection.set_tenant(request.tenant) clear_url_caches( ) # Required to remove previous tenant prefix from cache, if present if urlconf: request.urlconf = urlconf set_urlconf(urlconf)
def __call__(self, request): # Short circuit if tenant is already set by another middleware. # This allows for multiple tenant-resolving middleware chained together. if hasattr(request, "tenant"): return connection.set_schema_to_public() urlconf = None tenant_model = get_tenant_model() domain_model = get_tenant_domain_model() hostname = self.hostname_from_request(request) subfolder_prefix_path = "/{}/".format(get_subfolder_prefix()) # We are in the public tenant if not request.path.startswith(subfolder_prefix_path): try: tenant = tenant_model.objects.get( schema_name=get_public_schema_name()) except tenant_model.DoesNotExist: raise self.TENANT_NOT_FOUND_EXCEPTION( "Unable to find public tenant") request.urlconf = settings.PUBLIC_SCHEMA_URLCONF # We are in a specific tenant else: path_chunks = request.path[len(subfolder_prefix_path):].split("/") tenant_subfolder = path_chunks[0] try: tenant = self.get_tenant(domain_model=domain_model, hostname=tenant_subfolder) except domain_model.DoesNotExist: return self.no_tenant_found(request, hostname) tenant.domain_subfolder = tenant_subfolder urlconf = get_subfolder_urlconf(tenant) tenant.domain_url = hostname request.tenant = tenant connection.set_tenant(request.tenant) clear_url_caches( ) # Required to remove previous tenant prefix from cache, if present if urlconf: request.urlconf = urlconf set_urlconf(urlconf) return self.get_response(request)