From be542e37ab8bdfe0defd21084c9cb4b32e665d7e Mon Sep 17 00:00:00 2001 From: erjemin Date: Tue, 30 Jun 2026 16:39:50 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20(?= =?UTF-8?q?10)=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81?= =?UTF-8?q?=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D0=B5=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=D0=B8=20=D0=B2=20TbLabel=20=D0=B2=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D0=B5=20save()=20=D0=B2=D1=8B=D0=BD?= =?UTF-8?q?=D0=B5=D1=81=D0=B5=D0=BD=D0=BE=20=D0=B2=20=D1=83=D0=BD=D0=B8?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B0=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20?= =?UTF-8?q?=D1=85=D0=B5=D0=BB=D0=BF=D0=B5=D1=80-=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D1=8E.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lpon_site/frontend/models.py | 52 +++++++++--------------------------- 1 file changed, 12 insertions(+), 40 deletions(-) diff --git a/lpon_site/frontend/models.py b/lpon_site/frontend/models.py index cf54295..4ffbdb8 100644 --- a/lpon_site/frontend/models.py +++ b/lpon_site/frontend/models.py @@ -241,8 +241,7 @@ from django.db import models from django.db.models import F from filer.fields.image import FilerImageField from filer.fields.file import FilerFileField -from frontend.utils import make_slug, validate_and_raise_for_duplicates, update_synonyms_in_metadata -from lpon_site.settings import KEY_SYNONYM +from frontend.utils import make_slug, validate_and_raise_for_duplicates, update_synonyms_in_metadata, create_or_get_related_article import datetime import logging @@ -777,44 +776,17 @@ class TbLabel(models.Model): # Обновляем список синонимов в метаданных (универсальный хелпер для всех моделей) update_synonyms_in_metadata(self, 's_label', 'j_label_metadata') - # ===== СОЗДАНИЕ СВЯЗАННОЙ СТАТЬИ ===== - # Если статья не привязана (но может быть пустой из-за blank=True) - if not self.k_label_to_article: - # Генерируем техническое название для статьи (для админа) - # Формат: "[label] {название лейбла} (auto-make)" - article_title = f"[label] {self.s_label} (auto-make)" - - # Пытаемся найти существующую статью с таким же названием - # (может быть ситуация, когда статья уже создана отдельно) - try: - article = TbArticle.objects.get(s_article_title=article_title) - except TbArticle.DoesNotExist: - # Если статьи нет - создаём новую - # Собираем все синонимы для SEO ключевых слов - # (на этом этапе в SYNONYM уже есть текущий s_label и все, что добавил пользователь) - synonyms_list = self.j_label_metadata.get(KEY_SYNONYM, []) - - # Исключаем текущий s_label из списка (он будет добавлен первым в SEO) - other_synonyms = [s for s in synonyms_list if str(s) != self.s_label] - - # Собираем все синонимы с текущим s_label первым (для приоритета в поиске) - all_synonyms = [self.s_label] + other_synonyms if other_synonyms else [self.s_label] - synonyms_str = ", ".join(str(s) for s in all_synonyms) - - article = TbArticle( - s_article_title=article_title, - s_article_title_html=self.s_label, - seo_title=self.s_label, - seo_keywords=f"{synonyms_str}, лейбл, производитель", - seo_description=f"Информация о лейбле {self.s_label}.", - l_article_type=TbArticle.ArticleType.LABEL, - b_article_published=True, - slug=make_slug(slug_it=self.s_label, slug_default='label'), - ) - article.save() - - # Привязываем статью к лейблу - self.k_label_to_article = article + # ===== СОЗДАНИЕ ИЛИ ПОЛУЧЕНИЕ СВЯЗАННОЙ СТАТЬИ ===== + # Используем универсальный хелпер для создания/поиска статьи + # Хелпер сам проверит через обратный FK, не дублирует статьи даже если админ переименовал + article = create_or_get_related_article( + self, + TbArticle.ArticleType.LABEL, + 's_label', + 'j_label_metadata', + 'k_label_to_article' # ← Явно передаем имя FK поля (избегаем "магии") + ) + self.k_label_to_article = article # Вызываем оригинальный save родительского класса super().save(*args, **kwargs)