mod: валидатор форм, парсера и моделей (14) все хелперы валидации и автоматического создания статей подключены исполнителям (модель TbArtist, формам ArtistAdminForm и админке ArtistAdmin)

This commit is contained in:
2026-07-01 21:12:27 +03:00
parent 429d2fb417
commit 9522d3fe69
2 changed files with 145 additions and 38 deletions
+36
View File
@@ -614,6 +614,42 @@ class TbArtist(models.Model):
def __str__(self):
return f"artist {self.id:0>4}: {self.s_artist}"
def save(self, *args, **kwargs):
"""
Переопределяем save для управления синонимами исполнителей и создания связанной статьи.
При сохранении исполнителя (создание и обновление):
1. Управляем синонимами:
- Для новых исполнителей: добавляем текущий s_artist в SYNONYM
- При изменении s_artist: добавляем как старый, так и новый s_artist в SYNONYM
- При редактировании: используем j_artist_metadata из формы (приоритет админу)
2. Если статья не привязана - создаём новую статью исполнителя автоматически
3. Генерируем технический заголовок и slug для статьи
"""
# ===== ВАЛИДАЦИЯ НА ДУБЛИКАТЫ =====
# Проверяем ДО работы с синонимами и метаданными!
# Страховка: защита от прямого вызова save() минуя админку или (в будущем) парсер
validate_and_raise_for_duplicates(self, 's_artist', 'j_artist_metadata')
# ===== УПРАВЛЕНИЕ СИНОНИМАМИ =====
# Обновляем список синонимов в метаданных (универсальный хелпер для всех моделей)
update_synonyms_in_metadata(self, 's_artist', 'j_artist_metadata')
# ===== СОЗДАНИЕ ИЛИ ПОЛУЧЕНИЕ СВЯЗАННОЙ СТАТЬИ =====
# Используем универсальный хелпер для создания/поиска статьи
# Хелпер сам проверит через обратный FK, не дублирует статьи даже если админ переименовал
article = create_or_get_related_article(
self,
TbArticle.ArticleType.ARTIST,
's_artist',
'j_artist_metadata',
'k_artist_to_article' # ← Явно передаем имя FK поля (избегаем "магии")
)
self.k_artist_to_article = article
# Вызываем оригинальный save родительского класса
super().save(*args, **kwargs)
class Meta:
verbose_name = 'Исполнитель'
verbose_name_plural = 'Исполнители'