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 = 'Продавцы'