mod: модели (19) добавлены поля j_article_metadata и i_article_sort для статей + расширен список ArticleType

This commit is contained in:
2026-08-03 23:02:47 +03:00
parent f6bd5c5861
commit 68382692de
2 changed files with 61 additions and 4 deletions
@@ -0,0 +1,41 @@
# Generated by Django 6.0.5 on 2026-08-03 19:55
import django.db.models.deletion
import filer.fields.image
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('frontend', '0004_alter_tbarticle_k_article_to_image_and_more'),
migrations.swappable_dependency(settings.FILER_IMAGE_MODEL),
]
operations = [
migrations.RemoveField(
model_name='tboffer',
name='s_offer_skip32',
),
migrations.AddField(
model_name='tbarticle',
name='i_article_sort',
field=models.IntegerField(db_index=True, default=0, help_text='Сортировка/Приоритет для HUB. Статьи-хабы (и, возможно, обычные статьи) будут сортироваться в первую очередь по этому полю. Чем меньше число, тем выше приоритет. Используется для формирования меню, навигации, разделов и т.д.', verbose_name='Приоритет'),
),
migrations.AddField(
model_name='tbarticle',
name='j_article_metadata',
field=models.JSONField(blank=True, default=dict, help_text='JSON с дополнительными данными статьи. Может быть понадобится. Например, можно хранить информацию об источнике данных, авторе статьи, ссылках на внешние ресурсы, историю переименований slug и т.д.', null=True, verbose_name='Метаданные статьи'),
),
migrations.AlterField(
model_name='tbarticle',
name='k_article_to_image',
field=filer.fields.image.FilerImageField(blank=True, help_text='Обложка или иллюстрация статьи из файлового хранилища (django_filer). Для получения метаданных: TbImageMetadata.objects.filter(k_image_to_image=article.k_article_to_image).<br/><b>ВАЖНО</b>: Так как статья привязывается к исполнителям, лейблам, продавцам, музыкальным стилям, её изображение можно использовать как логотип, пиктограмму или баннер этих сущностей. Рекомендуется использовать прозрачный фон (движок поддерживает SVG, WebP и PNG).', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='image_to_article', to=settings.FILER_IMAGE_MODEL, verbose_name='Изображение для статьи'),
),
migrations.AlterField(
model_name='tbarticle',
name='l_article_type',
field=models.CharField(blank=True, choices=[('artist', 'Artis: артист, группа или бренд'), ('style', 'Slyle: музыкальный стиль'), ('item', 'Item: Альбом, релиз или товар (кассета, hifi, аксессуар)'), ('label', 'Label: Лейбл, издатель или компания'), ('offer', 'Offer: конкретное предложение от продавца'), ('seller', 'Seller: продавец или магазин'), ('blog', 'Новость или блог'), ('action', 'Спецпредложение, акция, распродажа и т.д.'), ('adv', 'Реклама или баннер'), ('HUB', 'СТАТЬЯ-ХАБ (использует DSL для отображения контента)'), ('txt', 'Текстовый контент (для условий конфиденциальности, правил, соглашений и т.д.)'), ('other', 'Другое')], db_index=True, default='other', max_length=7, verbose_name='Тип статьи'),
),
]
+20 -4
View File
@@ -1,5 +1,4 @@
# LPON Store — Django E-Commerce Database Schema (SQLite optimized) # LPON Store — Django E-Commerce Database Schema (SQLite optimized)
#
# ER-ДИАГРАММА СХЕМЫ БД (v2.0 - переделана правильно!) # ER-ДИАГРАММА СХЕМЫ БД (v2.0 - переделана правильно!)
# #
# Легенда: # Легенда:
@@ -52,7 +51,7 @@
# #
# TbArticle (текстовый контент и SEO): # TbArticle (текстовый контент и SEO):
# id, s_article_title (уникальный), l_article_type, b_article_published # id, s_article_title (уникальный), l_article_type, b_article_published
# s_article_title_html, k_article_to_image (→filer.Image) # s_article_title_html, k_article_to_image (→filer.Image), i_article_sort, j_article_metadata (JSON)
# k_article_to_styles (M2M→TbMusicStyle), i_article_views, i_article_favorites # k_article_to_styles (M2M→TbMusicStyle), i_article_views, i_article_favorites
# slug (уникальный, для URL), seo_title, seo_description, s_article_teaser_html # slug (уникальный, для URL), seo_title, seo_description, s_article_teaser_html
# s_article_content_html, t_article_started, t_article_ended, t_article_created, t_article_updated # s_article_content_html, t_article_started, t_article_ended, t_article_created, t_article_updated
@@ -327,9 +326,10 @@ class TbArticle(models.Model):
SELLER = 'seller', 'Seller: продавец или магазин' SELLER = 'seller', 'Seller: продавец или магазин'
BLOG = 'blog', 'Новость или блог' BLOG = 'blog', 'Новость или блог'
ACTION = 'action', 'Спецпредложение, акция, распродажа и т.д.' ACTION = 'action', 'Спецпредложение, акция, распродажа и т.д.'
TO_MAIN = 'to_main', 'Текст/Блок для главной страницы'
ADV = 'adv', 'Реклама или баннер' ADV = 'adv', 'Реклама или баннер'
OTHER = '???', 'Другое' HUB = 'HUB', 'СТАТЬЯ-ХАБ (использует DSL для отображения контента)'
TXT = 'txt', 'Текстовый контент (для условий конфиденциальности, правил, соглашений и т.д.)'
OTHER = '?¿?', 'Другое'
s_article_title = models.CharField( s_article_title = models.CharField(
max_length=255, max_length=255,
@@ -368,6 +368,14 @@ class TbArticle(models.Model):
' Если не указано, статья будет отображаться всегда (или до тех пор, пока не будет удалена ' ' Если не указано, статья будет отображаться всегда (или до тех пор, пока не будет удалена '
' или снята с публикации через `b_article_published`)', ' или снята с публикации через `b_article_published`)',
) )
i_article_sort = models.IntegerField(
default=0,
db_index=True,
verbose_name='Приоритет',
help_text='Сортировка/Приоритет для HUB. Статьи-хабы (и, возможно, обычные статьи) будут сортироваться'
' в первую очередь по этому полю. Чем меньше число, тем выше приоритет. Используется для'
' формирования меню, навигации, разделов и т.д.'
)
s_article_title_html = models.CharField( s_article_title_html = models.CharField(
max_length=255, max_length=255,
blank=True, blank=True,
@@ -428,6 +436,14 @@ class TbArticle(models.Model):
db_index=True, db_index=True,
verbose_name='Слаг статьи', verbose_name='Слаг статьи',
) )
j_article_metadata = models.JSONField(
blank=True,
null=True,
default=dict,
verbose_name='Метаданные статьи',
help_text='JSON с дополнительными данными статьи. Может быть понадобится. Например, можно хранить информацию'
' об источнике данных, авторе статьи, ссылках на внешние ресурсы, историю переименований slug и т.д.',
)
seo_title = models.CharField( seo_title = models.CharField(
max_length=255, max_length=255,
blank=True, blank=True,