Hide public model from tenant admin in django

Viewed 673

I am using Django Tenant Schema in my project. Some of my models are public and shared by all tenants and some to tenant_schema. I have registered all models from ( shared_app and tenant_app ). Suppose models public1, public2 are shared app and I have 2 registered tenant (tenant1 and tenant2). Problems I am facing: 1. when I open admin of tenant1 ( tenant1.domain.com/api/admin ) I am able to view public1 model but i am not able to view data consistently in both tenant1 and tenant2. 2. Is there a way to hide public schema in tenant admin and and only show public model in domain admin ( domain/api/admin )

1 Answers

Assuming that your tenant model resides in 'tenants' app, your tenants admin.py should be like that: (based on https://www.javaer101.com/en/article/12974795.html)

from django.contrib import admin
from django.apps import apps
from django_tenants.utils import get_public_schema_name


class TenantsAdmin(admin.ModelAdmin):
    '''
    Hides public models from tenants
    '''
    def has_view_permission(self,request, view=None):
        if request.tenant.schema_name == get_public_schema_name():
            return True
        else:
            return False
    
    def has_add_permission(self,request, view=None):
        if request.tenant.schema_name == get_public_schema_name():
            return True
        else:
            return False
    
    def has_change_permission(self,request, view=None):
        if request.tenant.schema_name == get_public_schema_name():
            return True
        else:
            return False
    
    def has_delete_permission(self,request, view=None):
        if request.tenant.schema_name == get_public_schema_name():
            return True
        else:
            return False
    
    def has_view_or_change_permission(self, request, view=None):
        if request.tenant.schema_name == get_public_schema_name():
            return True
        else:
            return False
    
app = apps.get_app_config('tenants')
for model_name, model in app.models.items():
    admin.site.register(model, TenantsAdmin)
Related