From 0c3c7bc9ac3e28cf1e7d1225bb879d64754d0c09 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 15 Jun 2026 22:15:31 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20(?= =?UTF-8?q?07)=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=20make?= =?UTF-8?q?=5Fslug=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BB=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2,=20=D0=B2=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20TbLab?= =?UTF-8?q?el=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BE=D0=BF=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20sav?= =?UTF-8?q?e()=20=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20=D0=B5=D1=81=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D0=B0=D1=8F=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=8C=D1=8F=20=D0=B2=20TbArticle,=20=D0=BE?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=8C=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=B8=20(=D0=BE=D0=B1=D1=8F=D0=B7=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lpon_site/frontend/admin.py | 2 -- lpon_site/frontend/models.py | 48 +++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/lpon_site/frontend/admin.py b/lpon_site/frontend/admin.py index 429365e..dd036e5 100644 --- a/lpon_site/frontend/admin.py +++ b/lpon_site/frontend/admin.py @@ -421,8 +421,6 @@ class ArtistAdmin(admin.ModelAdmin): ) - - # ================ # АДМИН-ПАНЕЛЬ ДЛЯ ЛЕЙБЛОВ/ИЗДАТЕЛЕЙ # diff --git a/lpon_site/frontend/models.py b/lpon_site/frontend/models.py index a42e9d2..ed35333 100644 --- a/lpon_site/frontend/models.py +++ b/lpon_site/frontend/models.py @@ -242,6 +242,7 @@ from django.db.models import F from django.utils.text import slugify from filer.fields.image import FilerImageField from filer.fields.file import FilerFileField +from frontend.utils import make_slug import datetime @@ -332,6 +333,7 @@ class TbArticle(models.Model): ARTIST = 'artist', 'Artis: артист, группа или бренд' STYLE = 'style', 'Slyle: музыкальный стиль' ITEM = 'item', 'Item: Альбом, релиз или товар (кассета, hifi, аксессуар)' + LABEL = 'label', 'Label: Лейбл, издатель или компания' OFFER = 'offer', 'Offer: конкретное предложение от продавца' SELLER = 'seller', 'Seller: продавец или магазин' BLOG = 'blog', 'Новость или блог' @@ -481,7 +483,7 @@ class TbArticle(models.Model): # Если slug не установлен (новая запись) — генерируем его из названия if not self.slug: # Генерируем базовый slug на основе заголовка статьи - base_slug = slugify(self.s_article_title, allow_unicode=True) + base_slug = make_slug(self.s_article_title) # Проверяем на уникальность и добавляем счетчик если нужно # Это гарантирует, что slug будет уникален даже для похожих названий @@ -750,6 +752,50 @@ class TbLabel(models.Model): def __str__(self): return f"label: {self.id:0>5}: {self.s_label}" + def save(self, *args, **kwargs): + """ + Переопределяем save для создания связанной статьи для лейблов (если ее нет). + + При сохранении лейбла: + 1. Если связанная статья не существует - создаем её автоматически + 2. Генерируем правильный заголовок статьи (техническое название лейбла) + 3. Генерируем slug для URL + 4. Устанавливаем тип статьи как 'label' + 5. Гарантируем целостность данных при парсинге + """ + # Флаг для отслеживания новой записи (нужна ли статья) + is_new = self.pk is None + + # Если статья не забыта (но может быть пустой из-за blank=True) + if not self.k_label_to_article: + # Генерируем техническое название для статьи на основе названия лейбла + # Формат: "Label: {название лейбла}" + article_title = f"[label] {self.s_label} (auto-make)" + + # Пытаемся найти существующую статью с таким же названием + # (может быть ситуация, когда статья создана отдельно) + try: + article = TbArticle.objects.get(s_article_title=article_title) + except TbArticle.DoesNotExist: + # Если статьи нет - создаем новую + article = TbArticle( + s_article_title=article_title, + s_article_title_html = self.s_label, + seo_title = self.s_label, + seo_keywords = f"{self.s_label}, лейбл, производитель", + 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 + + # Вызываем оригинальный save родительского класса + super().save(*args, **kwargs) + class Meta: verbose_name = 'Лейбл' verbose_name_plural = 'Лейблы'