Исправлена ошибка 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

@@ -1,7 +1,13 @@
# -*- coding: utf-8 -*-
"""
Админка для приложения orders.
Все модели tenant-only, поэтому используют TenantAdminOnlyMixin
для скрытия от public admin (localhost/admin/).
"""
from django.contrib import admin
from django.utils.html import format_html
from .models import Order, OrderItem, Transaction, PaymentMethod, Address, OrderStatus, Recipient, Delivery
from tenants.admin_mixins import TenantAdminOnlyMixin
class TransactionInline(admin.TabularInline):
@@ -44,10 +50,8 @@ class DeliveryInline(admin.StackedInline):
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
"""
Админ-панель для управления заказами.
"""
class OrderAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
"""Админ-панель для управления заказами."""
list_display = [
'order_number',
'customer',
@@ -150,7 +154,7 @@ class OrderAdmin(admin.ModelAdmin):
@admin.register(Transaction)
class TransactionAdmin(admin.ModelAdmin):
class TransactionAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
"""
Админ-панель для управления транзакциями.
"""
@@ -189,7 +193,7 @@ class TransactionAdmin(admin.ModelAdmin):
@admin.register(OrderItem)
class OrderItemAdmin(admin.ModelAdmin):
class OrderItemAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
"""
Админ-панель для управления позициями заказов.
"""
@@ -232,7 +236,7 @@ class OrderItemAdmin(admin.ModelAdmin):
@admin.register(Address)
class AddressAdmin(admin.ModelAdmin):
class AddressAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
"""
Админ-панель для управления адресами доставки заказов.
"""
@@ -276,7 +280,7 @@ class AddressAdmin(admin.ModelAdmin):
@admin.register(Recipient)
class RecipientAdmin(admin.ModelAdmin):
class RecipientAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
"""
Админ-панель для управления получателями заказов.
"""
@@ -309,7 +313,7 @@ class RecipientAdmin(admin.ModelAdmin):
@admin.register(OrderStatus)
class OrderStatusAdmin(admin.ModelAdmin):
class OrderStatusAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
"""
Админ-панель для управления статусами заказов.
"""
@@ -406,7 +410,7 @@ class OrderStatusAdmin(admin.ModelAdmin):
@admin.register(PaymentMethod)
class PaymentMethodAdmin(admin.ModelAdmin):
class PaymentMethodAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
"""
Админ-панель для управления способами оплаты.
"""