From 67aad9ab11a950fabcd8c4d517475931399b7bce Mon Sep 17 00:00:00 2001 From: erjemin Date: Thu, 2 Jul 2026 19:17:52 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=20=D1=84=D0=BE=D1=80=D0=BC,=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D1=81=D0=B5=D1=80=D0=B0=20=D0=B8=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=B9=20(17)=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D1=8B=20=D1=85=D0=B5=D0=BB=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D1=8B=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=81=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=BA=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8F=D0=BC=20(=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=20TbSeller=20=D0=B8=20=D0=B0=D0=B4=D0=BC?= =?UTF-8?q?=D0=B8=D0=BD=D0=BA=D0=B5=20SellerAdmin).=20=D0=9F=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D1=81=D0=B8=D0=BD=D0=BE=D0=BD?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=D0=B2=D1=86=D0=BE=D0=B2=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BD=D1=83=D0=B6=D0=BD=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lpon_site/frontend/admin.py | 32 ++++++++++++++++++++++++++++++++ lpon_site/frontend/models.py | 23 +++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/lpon_site/frontend/admin.py b/lpon_site/frontend/admin.py index a33eee2..7a1c6e9 100644 --- a/lpon_site/frontend/admin.py +++ b/lpon_site/frontend/admin.py @@ -797,6 +797,38 @@ class SellerAdmin(admin.ModelAdmin): }), ) + # ВАЖНО. Так как продавцам не нужны синонимы, то CSS и JS для админки обогащать не нужно. + def save_model( + self, + request: HttpRequest, + obj: TbSeller, + form: forms.ModelForm, + change: bool, + ) -> None: + """ + Переопределяем save_model для добавления информативных сообщений в админку. + + Максимально поджарый код - все сложности с получением старого значения + и определением типа операции делает хелпер generate_admin_save_message(). + """ + # Стандартное сохранение записи через Django + # (в т.ч. автоматическое создание связанной статьи в методе save модели TbSeller) + super().save_model(request, obj, form, change) + + # Генерируем и отправляем информативное сообщение о сохранении + # Хелпер сам: + # - определяет тип операции (create vs update) + # - формирует нужное сообщение (success vs warning) + generate_admin_save_message( + request=request, + obj=obj, + is_new=not change, # Django: change=False для новых, True для существующих + related_article=obj.k_seller_to_article, + obj_field_name='s_seller', + article_title_field='s_article_title', + ) + + # ============================================================================ # АДМИНКА ИСТОЧНИКОВ ДАННЫХ diff --git a/lpon_site/frontend/models.py b/lpon_site/frontend/models.py index 13251db..29adafb 100644 --- a/lpon_site/frontend/models.py +++ b/lpon_site/frontend/models.py @@ -952,6 +952,29 @@ class TbSeller(models.Model): def __str__(self): return f"seller: {self.id:0>2}: {self.s_seller}" + def save(self, *args, **kwargs): + """ + Переопределяем save для привязки связанной статьи о продавце. + + 0. ВАЖНО: Продавцам не нужны синонимы (хотя технически возможно), потому синонимы не проверяем и не обновляем + 1. Если статья не привязана - создаём новую статью исполнителя автоматически + 2. Генерируем технический заголовок и slug для статьи + """ + # ===== СОЗДАНИЕ ИЛИ ПОЛУЧЕНИЕ СВЯЗАННОЙ СТАТЬИ ===== + # Используем универсальный хелпер для создания/поиска статьи + # Хелпер сам проверит через обратный FK, не дублирует статьи даже если админ переименовал + article = create_or_get_related_article( + self, + TbArticle.ArticleType.SELLER, + 's_seller', + 'j_seller_metadata', + 'k_seller_to_article' # ← Явно передаем имя FK поля (избегаем "магии") + ) + self.k_seller_to_article = article + + # Вызываем оригинальный save родительского класса + super().save(*args, **kwargs) + class Meta: verbose_name = 'Продавец' verbose_name_plural = 'Продавцы'