From 7188b11f6528ce71644277f6773e033fe5898243 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Mon, 1 Dec 2025 01:22:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=95=D0=B4=D0=B8=D0=BD=D1=8B=D0=B9=20=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=20=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BD=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=D0=BE=D0=B2=20=D0=BE=D0=BF=D0=BB=D0=B0=D1=82?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема #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 - скрипт для существующих тенантов --- add_payment_methods_to_buba.py | 40 ++++++++++++++++++++++++++++ myproject/orders/admin.py | 6 ++--- myproject/tenants/admin.py | 48 ++++------------------------------ 3 files changed, 48 insertions(+), 46 deletions(-) create mode 100644 add_payment_methods_to_buba.py diff --git a/add_payment_methods_to_buba.py b/add_payment_methods_to_buba.py new file mode 100644 index 0000000..a9cf52e --- /dev/null +++ b/add_payment_methods_to_buba.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Скрипт для добавления способов оплаты в тенант buba +""" +import os +import sys +import django + +# Добавляем путь к проекту +sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'myproject')) + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') +django.setup() + +from django_tenants.utils import schema_context +from django.core.management import call_command + +print("=" * 70) +print("Добавление способов оплаты в тенант 'buba'") +print("=" * 70) + +# Переключаемся на схему buba и создаём способы оплаты +with schema_context('buba'): + print("\n1. Создание способов оплаты...") + call_command('create_payment_methods') + + # Проверяем что создалось + from orders.models import PaymentMethod + methods = PaymentMethod.objects.all().order_by('order') + + print(f"\n2. Проверка созданных способов оплаты:") + print(f" Всего: {methods.count()}") + for method in methods: + status = "✓" if method.is_active else "✗" + print(f" {status} [{method.order}] {method.name} ({method.code})") + +print("\n" + "=" * 70) +print("✓ Готово!") +print("=" * 70) diff --git a/myproject/orders/admin.py b/myproject/orders/admin.py index de1493c..f0867d4 100644 --- a/myproject/orders/admin.py +++ b/myproject/orders/admin.py @@ -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('{}', count) return format_html('{}', 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) diff --git a/myproject/tenants/admin.py b/myproject/tenants/admin.py index 16ce529..71f26ec 100644 --- a/myproject/tenants/admin.py +++ b/myproject/tenants/admin.py @@ -312,51 +312,13 @@ class TenantRegistrationAdmin(admin.ModelAdmin): # Создаем системные способы оплаты logger.info(f"Создание системных способов оплаты для тенанта: {client.id}") - from orders.models import PaymentMethod + from django.core.management import call_command try: - payment_methods = [ - { - 'code': 'cash', - 'name': 'Наличными', - 'description': 'Оплата наличными деньгами', - 'is_system': True, - 'order': 1 - }, - { - 'code': 'card', - 'name': 'Картой', - 'description': 'Оплата банковской картой', - 'is_system': True, - 'order': 2 - }, - { - 'code': 'online', - 'name': 'Онлайн', - 'description': 'Онлайн оплата через платежную систему', - 'is_system': True, - 'order': 3 - }, - { - 'code': 'legal_entity', - 'name': 'Безнал от ЮРЛИЦ', - 'description': 'Безналичный расчёт от юридических лиц', - 'is_system': True, - 'order': 4 - }, - ] - - created_count = 0 - for method_data in payment_methods: - method, created = PaymentMethod.objects.get_or_create( - code=method_data['code'], - defaults=method_data - ) - if created: - created_count += 1 - logger.info(f"Создан способ оплаты: {method.name}") - - logger.info(f"Системные способы оплаты успешно созданы: {created_count} новых") + # Вызываем команду создания способов оплаты + # Это единственный источник истины для списка способов оплаты + call_command('create_payment_methods') + logger.info("Системные способы оплаты успешно созданы") except Exception as e: logger.error(f"Ошибка при создании способов оплаты: {e}", exc_info=True) # Не прерываем процесс, т.к. это не критично