Единый источник истины для способов оплаты

Проблема #1: Дублирование кода способов оплаты
- В tenants/admin.py был полный список способов оплаты (45 строк)
- В orders/management/commands/create_payment_methods.py был другой список
- При создании тенанта отсутствовал способ 'account_balance'
- Нарушение DRY принципа

Решение: Single Source of Truth
- Единственный источник истины: команда create_payment_methods
- В tenants/admin.py заменено дублирование на call_command()
- Удалено 45 строк дублирующего кода
- Теперь все тенанты получают одинаковый полный список

Проблема #2: AttributeError в админке PaymentMethod
- obj.payments.count() вызывал ошибку
- В модели Transaction связь называется 'transactions', а не 'payments'

Решение: Исправлено в orders/admin.py
- obj.payments → obj.transactions (2 места)
- Админка PaymentMethod теперь работает корректно

Для тенанта buba:
- Создан скрипт add_payment_methods_to_buba.py
- Добавлен недостающий способ оплаты 'С баланса счёта'

Изменённые файлы:
- myproject/tenants/admin.py - вызов команды вместо дублирования
- myproject/orders/admin.py - исправлено на transactions
- add_payment_methods_to_buba.py - скрипт для существующих тенантов
This commit is contained in:
2025-12-01 01:22:40 +03:00
parent 293e8640ef
commit 7188b11f65
3 changed files with 48 additions and 46 deletions

View File

@@ -441,7 +441,7 @@ class PaymentMethodAdmin(admin.ModelAdmin):
def payments_count(self, obj):
"""Количество платежей этим способом"""
count = obj.payments.count()
count = obj.transactions.count()
if count == 0:
return format_html('<span style="color: #999;">{}</span>', count)
return format_html('<span style="font-weight: bold;">{}</span>', count)
@@ -450,7 +450,7 @@ class PaymentMethodAdmin(admin.ModelAdmin):
def has_delete_permission(self, request, obj=None):
"""Запрещаем удаление используемых способов оплаты"""
if obj:
# Разрешаем удаление только если нет связанных платежей
if obj.payments.exists():
# Разрешаем удаление только если нет связанных транзакций
if obj.transactions.exists():
return False
return super().has_delete_permission(request, obj)