From 68382692dec2f5abf243f320d85b0bc0f8247494 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 3 Aug 2026 23:02:47 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20(?= =?UTF-8?q?19)=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8F=20j=5Farticle=5Fmetadata=20=D0=B8=20i?= =?UTF-8?q?=5Farticle=5Fsort=20=D0=B4=D0=BB=D1=8F=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=B9=20+=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20ArticleTy?= =?UTF-8?q?pe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._remove_tboffer_s_offer_skip32_and_more.py | 41 +++++++++++++++++++ lpon_site/frontend/models.py | 24 +++++++++-- 2 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 lpon_site/frontend/migrations/0005_remove_tboffer_s_offer_skip32_and_more.py diff --git a/lpon_site/frontend/migrations/0005_remove_tboffer_s_offer_skip32_and_more.py b/lpon_site/frontend/migrations/0005_remove_tboffer_s_offer_skip32_and_more.py new file mode 100644 index 0000000..c4e9cf3 --- /dev/null +++ b/lpon_site/frontend/migrations/0005_remove_tboffer_s_offer_skip32_and_more.py @@ -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).
ВАЖНО: Так как статья привязывается к исполнителям, лейблам, продавцам, музыкальным стилям, её изображение можно использовать как логотип, пиктограмму или баннер этих сущностей. Рекомендуется использовать прозрачный фон (движок поддерживает 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='Тип статьи'), + ), + ] diff --git a/lpon_site/frontend/models.py b/lpon_site/frontend/models.py index 5a1f3d2..1e43345 100644 --- a/lpon_site/frontend/models.py +++ b/lpon_site/frontend/models.py @@ -1,5 +1,4 @@ # LPON Store — Django E-Commerce Database Schema (SQLite optimized) -# # ER-ДИАГРАММА СХЕМЫ БД (v2.0 - переделана правильно!) # # Легенда: @@ -52,7 +51,7 @@ # # TbArticle (текстовый контент и SEO): # 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 # 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 @@ -327,9 +326,10 @@ class TbArticle(models.Model): SELLER = 'seller', 'Seller: продавец или магазин' BLOG = 'blog', 'Новость или блог' ACTION = 'action', 'Спецпредложение, акция, распродажа и т.д.' - TO_MAIN = 'to_main', 'Текст/Блок для главной страницы' ADV = 'adv', 'Реклама или баннер' - OTHER = '???', 'Другое' + HUB = 'HUB', 'СТАТЬЯ-ХАБ (использует DSL для отображения контента)' + TXT = 'txt', 'Текстовый контент (для условий конфиденциальности, правил, соглашений и т.д.)' + OTHER = '?¿?', 'Другое' s_article_title = models.CharField( max_length=255, @@ -368,6 +368,14 @@ class TbArticle(models.Model): ' Если не указано, статья будет отображаться всегда (или до тех пор, пока не будет удалена ' ' или снята с публикации через `b_article_published`)', ) + i_article_sort = models.IntegerField( + default=0, + db_index=True, + verbose_name='Приоритет', + help_text='Сортировка/Приоритет для HUB. Статьи-хабы (и, возможно, обычные статьи) будут сортироваться' + ' в первую очередь по этому полю. Чем меньше число, тем выше приоритет. Используется для' + ' формирования меню, навигации, разделов и т.д.' + ) s_article_title_html = models.CharField( max_length=255, blank=True, @@ -428,6 +436,14 @@ class TbArticle(models.Model): db_index=True, verbose_name='Слаг статьи', ) + j_article_metadata = models.JSONField( + blank=True, + null=True, + default=dict, + verbose_name='Метаданные статьи', + help_text='JSON с дополнительными данными статьи. Может быть понадобится. Например, можно хранить информацию' + ' об источнике данных, авторе статьи, ссылках на внешние ресурсы, историю переименований slug и т.д.', + ) seo_title = models.CharField( max_length=255, blank=True,