mod: валидатор форм, парсера и моделей (15) все хелперы валидации и автоматического создания статей подключены музыкальным стилям (модель TbMusicStyle, формам MusicStyleAdminForm и админке MusicStyleAdmin)
This commit is contained in:
@@ -565,6 +565,42 @@ class TbMusicStyle(models.Model):
|
||||
def __str__(self):
|
||||
return self.s_style_name
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
"""
|
||||
Переопределяем save для управления синонимами музыкального стиля и создания связанной статьи.
|
||||
|
||||
При сохранении музыкального стиля (создание и обновление):
|
||||
1. Управляем синонимами:
|
||||
- Для новых музыкальных стилей: добавляем текущий s_style_name в SYNONYM
|
||||
- При изменении s_style_name: добавляем как старый, так и новый s_style_name в SYNONYM
|
||||
- При редактировании: используем j_style_metadata из формы (приоритет админу)
|
||||
2. Если статья не привязана - создаём новую статью музыкального стиля автоматически
|
||||
3. Генерируем технический заголовок и slug для статьи
|
||||
"""
|
||||
# ===== ВАЛИДАЦИЯ НА ДУБЛИКАТЫ =====
|
||||
# Проверяем ДО работы с синонимами и метаданными!
|
||||
# Страховка: защита от прямого вызова save() минуя админку или (в будущем) парсер
|
||||
validate_and_raise_for_duplicates(self, 's_style_name', 'j_style_metadata')
|
||||
|
||||
# ===== УПРАВЛЕНИЕ СИНОНИМАМИ =====
|
||||
# Обновляем список синонимов в метаданных (универсальный хелпер для всех моделей)
|
||||
update_synonyms_in_metadata(self, 's_style_name', 'j_style_metadata')
|
||||
|
||||
# ===== СОЗДАНИЕ ИЛИ ПОЛУЧЕНИЕ СВЯЗАННОЙ СТАТЬИ =====
|
||||
# Используем универсальный хелпер для создания/поиска статьи
|
||||
# Хелпер сам проверит через обратный FK. Не дублирует статьи, даже если админ переименовал
|
||||
article = create_or_get_related_article(
|
||||
self,
|
||||
TbArticle.ArticleType.STYLE,
|
||||
's_style_name',
|
||||
'j_style_metadata',
|
||||
'k_style_to_article' # ← Явно передаем имя FK поля (избегаем "магии")
|
||||
)
|
||||
self.k_style_to_article = article
|
||||
|
||||
# Вызываем оригинальный save родительского класса
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Музыкальный стиль'
|
||||
verbose_name_plural = 'Музыкальные стили'
|
||||
|
||||
Reference in New Issue
Block a user