Исправлена ошибка 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>
This commit is contained in:
2025-12-31 01:05:47 +03:00
parent b59ad725cb
commit eb6a3c1874
7 changed files with 184 additions and 39 deletions

View File

@@ -2,6 +2,7 @@ from django.contrib import admin
from django.db import models
from django.utils.html import format_html
from .models import Customer, WalletTransaction, ContactChannel
from tenants.admin_mixins import TenantAdminOnlyMixin
class IsSystemCustomerFilter(admin.SimpleListFilter):
@@ -23,8 +24,11 @@ class IsSystemCustomerFilter(admin.SimpleListFilter):
@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
"""Административный интерфейс для управления клиентами цветочного магазина"""
class CustomerAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
"""
Административный интерфейс для управления клиентами цветочного магазина.
TenantAdminOnlyMixin - скрывает от public admin (таблица только в tenant схемах).
"""
list_display = (
'full_name',
'email',
@@ -124,8 +128,11 @@ CustomerAdmin.inlines = [ContactChannelInline, WalletTransactionInline]
@admin.register(WalletTransaction)
class WalletTransactionAdmin(admin.ModelAdmin):
"""Админка для просмотра всех транзакций кошелька"""
class WalletTransactionAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
"""
Админка для просмотра всех транзакций кошелька.
TenantAdminOnlyMixin - скрывает от public admin.
"""
list_display = ('created_at', 'customer', 'transaction_type', 'amount_display', 'balance_after', 'order', 'created_by')
list_filter = ('transaction_type', 'balance_category', 'created_at')
search_fields = ('customer__name', 'customer__email', 'customer__phone', 'description')