Files
octopus/myproject/user_roles/admin.py
Andrey Smakotin eb6a3c1874 Исправлена ошибка public admin для мультитенантной архитектуры
Проблема: при входе в 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>
2025-12-31 01:05:47 +03:00

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)