mod: модели (preliminary 05) + миграции

А) Валюта перенесена из TbSource в TbSeller
This commit is contained in:
2026-06-12 15:46:46 +03:00
parent de81cc1b34
commit 5d71ca291d
3 changed files with 49 additions and 25 deletions

View File

@@ -309,16 +309,16 @@ class LabelAdmin(admin.ModelAdmin):
class SellerAdmin(admin.ModelAdmin):
"""Админ для продавцов"""
list_display = ('id', 's_seller', 'l_seller_type', 't_seller_created')
list_filter = ('l_seller_type',)
list_display = ('id', 's_seller', 'l_seller_type', 'l_seller_currency', 't_seller_created')
list_filter = ('l_seller_type', 'l_seller_currency', )
search_fields = ('s_seller',)
readonly_fields = ('t_seller_created', 't_seller_updated')
class SourceAdmin(admin.ModelAdmin):
"""Админ для источников"""
list_display = ('id', 's_source_name', 'k_source_to_seller', 'l_source_type', 'l_source_currency', 't_source_data')
list_filter = ('l_source_type', 'l_source_currency', 't_source_data')
list_display = ('id', 's_source_name', 'k_source_to_seller', 'l_source_type', 't_source_data')
list_filter = ('l_source_type', 't_source_data')
search_fields = ('s_source_name',)
readonly_fields = ('t_source_created', 't_source_updated')

View File

@@ -0,0 +1,22 @@
# Generated by Django 6.0.5 on 2026-06-12 12:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('frontend', '0002_remove_tboffer_k_offer_to_format_and_more'),
]
operations = [
migrations.RemoveField(
model_name='tbsource',
name='l_source_currency',
),
migrations.AddField(
model_name='tbseller',
name='l_seller_currency',
field=models.CharField(choices=[('rub', 'RUB: российский рубль'), ('usd', 'USD: американский доллар'), ('eur', 'EUR: евро'), ('amd', 'AMD: армянских драм'), ('try', 'TRY: турецкая лира'), ('jpy', 'JPY: японская иена'), ('gbp', 'GBP: британский фунт'), ('cny', 'CNY: китайский юань'), ('byn', 'BYN: белорусский рубль'), ('ton', 'TON: криптовалюта TON'), ('??', 'Other')], default='rub', help_text='В какой валюте указаны цены в этом источнике. Все офферы из этого источника будут в этой валюте.', max_length=3, verbose_name='Валюта источника'),
),
]

View File

@@ -105,6 +105,7 @@
# ├──────────────────────┼──────────────────────────────────────────────────────
# │ PK: id │ AutoField
# │ s_seller │ Название (уникальный)
# │ l_seller_currency │ (rub, usd, eur, ...)
# │ l_seller_type │ Тип (seller, label, diy, crowdfunding, other)
# │ k_seller_to_article │ 1:1 FK → TbArticle (content, SEO, slug)
# │ t_seller_created │ Timestamp
@@ -120,7 +121,6 @@
# │ PK: id │ AutoField
# │ k_source_to_seller │ FK → TbSeller [indexed]
# │ l_source_type │ (excel, csv, url, other)
# │ l_source_currency │ (rub, usd, eur, ...)
# │ s_source_name │ Название источника
# │ source_file │ FilerFileField
# │ s_source_url │ URL источника
@@ -747,6 +747,8 @@ class TbLabel(models.Model):
# ============================================================================
# ПРОДАВЦЫ / МАГАЗИНЫ
# - Валюта привязана к продавцу. Если у продавца несколько валют,
# создаем несколько продавцов с разными валютами.
# ============================================================================
class TbSeller(models.Model):
"""Продавец или магазин, который продаёт товары."""
@@ -757,6 +759,19 @@ class TbSeller(models.Model):
CROWD = 'crowd', 'Краудфандинг'
OTHER = '???', 'Другое'
class Currency(models.TextChoices):
RUB = 'rub', 'RUB: российский рубль'
USD = 'usd', 'USD: американский доллар'
EUR = 'eur', 'EUR: евро'
AMD = 'amd', 'AMD: армянских драм'
TRY = 'try', 'TRY: турецкая лира'
JPY = 'jpy', 'JPY: японская иена'
GBP = 'gbp', 'GBP: британский фунт'
CNY = 'cny', 'CNY: китайский юань'
BYN = 'byn', 'BYN: белорусский рубль'
TON = 'ton', 'TON: криптовалюта TON'
OTHER = '??', 'Other'
# Используем SmallAutoField для оптимизации (макс ~32k)
# Продавцов обычно до 1000-10000, поэтому достаточно
id = models.SmallAutoField(primary_key=True)
@@ -768,6 +783,13 @@ class TbSeller(models.Model):
help_text='Техническое название продавца или магазина. Например: <tt>Клюква Рекодс</tt>. Может совпадать'
' с названием продавца, если лейбл сам реализует свои издания через сайт.',
)
l_seller_currency = models.CharField(
max_length=3,
choices=Currency.choices,
default=Currency.RUB,
verbose_name='Валюта источника',
help_text='В какой валюте указаны цены в этом источнике. Все офферы из этого источника будут в этой валюте.',
)
k_seller_to_article = models.OneToOneField(
TbArticle,
on_delete=models.SET_NULL,
@@ -1042,19 +1064,6 @@ class TbSource(models.Model):
URL = 'url', 'URL страницы с данными (например, HTML-страница с каталогом товаров)'
OTHER = '??', 'Другое'
class Currency(models.TextChoices):
RUB = 'rub', 'RUB: российский рубль'
USD = 'usd', 'USD: американский доллар'
EUR = 'eur', 'EUR: евро'
TRY = 'try', 'TRY: турецкая лира'
AMD = 'amd', 'AMD: армянский драм'
JPY = 'jpy', 'JPY: японская иена'
GBP = 'gbp', 'GBP: британский фунт'
CNY = 'cny', 'CNY: китайский юань'
BYN = 'byn', 'BYN: белорусский рубль'
TON = 'ton', 'TON: криптовалюта TON'
OTHER = '??', 'Other'
# Используем SmallAutoField для оптимизации (макс ~32k)
# Источников обычно до 1000, достаточно
id = models.SmallAutoField(primary_key=True)
@@ -1067,13 +1076,6 @@ class TbSource(models.Model):
db_index=True, # Принудительно создаем индекс, т.к. SQLite их сам не создаст.
verbose_name='Продавец',
)
l_source_currency = models.CharField(
max_length=3,
choices=Currency.choices,
default=Currency.RUB,
verbose_name='Валюта источника',
help_text='В какой валюте указаны цены в этом источнике. Все офферы из этого источника будут в этой валюте.',
)
s_source_name = models.CharField(
max_length=128,
blank=True,