mod: minor: валидатор форм, парсера и моделей (28) миграции и переименование поля s_offer_skip32 в s_offer_code в модели TbOffer

This commit is contained in:
2026-07-15 17:20:54 +03:00
parent a2986cf719
commit 9ba5ef2af6
4 changed files with 113 additions and 29 deletions
@@ -0,0 +1,64 @@
# Generated by Django 6.0.5 on 2026-07-15 14:00
import django.db.models.deletion
import django.utils.timezone
import filer.fields.image
import frontend.models
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('frontend', '0003_remove_tbimagemetadata_f_img_confidence_score_and_more'),
migrations.swappable_dependency(settings.FILER_IMAGE_MODEL),
]
operations = [
migrations.AlterField(
model_name='tbarticle',
name='k_article_to_image',
field=filer.fields.image.FilerImageField(blank=True, help_text='Обложка или иллюстрация статьи из файлового хранилища (django_filer). Метаданные: image.metadata.i_img_sort и image.metadata.j_img_metadata.<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='tbimagemetadata',
name='j_img_metadata',
field=models.JSONField(blank=True, default=frontend.models.get_image_metadata_default, help_text='JSON с дополнительными данными: тип (реальное/абстрактное), источник (парсер/админка), URL источника и заметки. Предзаполнено структурой для удобства.', verbose_name='Метаданные'),
),
migrations.AlterField(
model_name='tboffer',
name='d_offer_date_release',
field=models.DateField(blank=True, db_index=True, default=None, help_text='Дата релиза (например, дата выпуска переиздания) или выхода по предзаказу, если она известна', null=True, verbose_name='Дата релиза'),
),
migrations.AlterField(
model_name='tboffer',
name='i_offer_discount_to_daily_sale',
field=models.IntegerField(blank=True, db_index=True, default=0, help_text='Процент возможной скидки, если участвует в "ежедневной распродаже" или акции. Если указано <tt>0</tt> то данное предложение не может участвовать в распродажах, спецпредложениях и акциях', verbose_name='Возможна cкидка (%)'),
),
migrations.AlterField(
model_name='tboffer',
name='j_offer_metadata',
field=models.JSONField(default=frontend.models.get_offer_metadata_default, help_text='Дополнительные данные о предложении в виде JSON-словаря. Например:<pre style="background-color:#80808080;border:1px solid #ccc; padding:1ex;max-width: calc(75% - 13em);">{\n "OFR_NT": "Уценка: замят угол конверта, повреждены наклейки.",\n "OFR_MF": {\n "lp": 2,\n "cd": 1\n }\n}</pre>Ключи:<ul> <li>"OFR_NT" — Примечание к офферу</li> <li>"OFR_MF" — Какие носители входят в коммерческое предложение.<br/> Допустимые значения: "lp" — Vinyl Long-Play (12"), "ep" — Vinyl Extended-Play (12", 10", 7"), "45" — Vinyl 7" (45 rpm), "cd" — Compact Disc, "ld" — LaserDisc, "md" — MiniDisc Record, "ms" — Used MiniDisc (для записи), "cs" — Cassette Record, "uc" — Used Cassette (для записи), "tp" — Tape Reel Record, "ur" — Used Tape Reel (для записи), "??" — Other</li></ul>', null=True, verbose_name='Дополнительные данные'),
),
migrations.AlterField(
model_name='tboffer',
name='k_offer_to_label',
field=models.ForeignKey(blank=True, default=None, help_text='Лейбл, на котором был выпущен релиз (если известен), или производитель для аудиио-кассет и MD под запись, технику или аксессуар.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='label_to_offer', to='frontend.tblabel', verbose_name='Лейбл/Производитель'),
),
migrations.AlterField(
model_name='tboffer',
name='l_offer_to_format',
field=models.CharField(choices=[('lp', 'Vinyl Long-Play (12")'), ('ep', 'Vinyl Extended-Play (12", 10", 7")'), ('45', 'Vinyl 7" (45 rpm)'), ('cd', 'Compact Disc'), ('ld', 'LaserDisc'), ('md', 'MiniDisc Record'), ('ms', 'Used MiniDisc (для записи)'), ('cs', 'Cassette Record'), ('uc', 'Used Cassette (для записи)'), ('tp', 'Tape Reel Record'), ('ur', 'Used Tape Reel (для записи)'), ('??', 'Other')], db_index=True, default='??', help_text='Форматы основного носителей (пластинка, CD, кассета и т.п.). Если несколько носителей (и разных), то это указывать в "Дополнительных данных" в JSON-формате. Например: <tt>{"OFR_MF": {"lp": 2, "cd": 1},}</tt>', max_length=2, verbose_name='Формат'),
),
migrations.AlterField(
model_name='tboffer',
name='s_offer_code',
field=models.CharField(help_text='Уникальный код товара для идентификации в корзине и при заказе (чтобы не светить id). Например: "4gfFCJ". Формируется автоматически через Hashids на основе ID оффера. <b>Не редактировать вручную!</b>', max_length=12, unique=True, verbose_name='Код товара'),
),
migrations.AlterField(
model_name='tbofferhistory',
name='t_history_created',
field=models.DateTimeField(db_index=True, default=django.utils.timezone.now, help_text='Дата создания записи истории. Автоматически устанавливается на текущее время при создании, но может быть отредактирована для загрузки исторических данных из Excel-файлов.', verbose_name='Дата создания'),
),
]