Проблема: при входе в localhost/admin/ (public схема) возникала ошибка "relation user_roles_userrole does not exist", так как tenant-only таблицы не существуют в public схеме. Решение: - Создан TenantAdminOnlyMixin для скрытия tenant-only моделей от public admin - Применён миксин ко всем ModelAdmin классам в tenant-only приложениях: user_roles, customers, orders, inventory, products - Добавлена проверка _is_public_schema() в RoleBasedPermissionBackend для предотвращения запросов к tenant-only таблицам в public схеме Теперь: - localhost/admin/ показывает только public модели (Client, Domain, User) - shop.localhost/admin/ показывает все модели магазина 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
48 lines
2.0 KiB
Python
48 lines
2.0 KiB
Python
from django.contrib import admin
|
|
from user_roles.models import Role, UserRole
|
|
from user_roles.mixins import OwnerOnlyAdminMixin
|
|
from tenants.admin_mixins import TenantAdminOnlyMixin
|
|
|
|
|
|
@admin.register(Role)
|
|
class RoleAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
|
|
"""
|
|
Админка ролей.
|
|
TenantAdminOnlyMixin - скрывает от public admin (localhost/admin/),
|
|
так как таблица Role существует только в схемах тенантов.
|
|
"""
|
|
list_display = ['code', 'name', 'is_system']
|
|
list_filter = ['is_system']
|
|
search_fields = ['code', 'name']
|
|
readonly_fields = ['created_at']
|
|
|
|
def has_delete_permission(self, request, obj=None):
|
|
"""Запрет удаления системных ролей"""
|
|
if obj and obj.is_system:
|
|
return False
|
|
return super().has_delete_permission(request, obj)
|
|
|
|
|
|
@admin.register(UserRole)
|
|
class UserRoleAdmin(TenantAdminOnlyMixin, OwnerOnlyAdminMixin, admin.ModelAdmin):
|
|
"""
|
|
Админка ролей пользователей.
|
|
|
|
TenantAdminOnlyMixin - скрывает от public admin (таблица только в tenant схемах)
|
|
OwnerOnlyAdminMixin - доступна только владельцу магазина
|
|
|
|
ВАЖНО: UserRole изолирован по тенантам автоматически через django-tenants,
|
|
поэтому владелец видит только пользователей своего магазина!
|
|
"""
|
|
list_display = ['user', 'role', 'is_active', 'created_at']
|
|
list_filter = ['role', 'is_active']
|
|
search_fields = ['user__email', 'user__name']
|
|
readonly_fields = ['created_at', 'created_by']
|
|
autocomplete_fields = ['user']
|
|
|
|
def save_model(self, request, obj, form, change):
|
|
"""Автоматически устанавливаем created_by"""
|
|
if not change:
|
|
obj.created_by = request.user
|
|
super().save_model(request, obj, form, change)
|