diff --git a/lpon_site/frontend/admin.py b/lpon_site/frontend/admin.py index 64bd13e..3a83afa 100644 --- a/lpon_site/frontend/admin.py +++ b/lpon_site/frontend/admin.py @@ -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') diff --git a/lpon_site/frontend/migrations/0003_remove_tbsource_l_source_currency_and_more.py b/lpon_site/frontend/migrations/0003_remove_tbsource_l_source_currency_and_more.py new file mode 100644 index 0000000..f5ffb78 --- /dev/null +++ b/lpon_site/frontend/migrations/0003_remove_tbsource_l_source_currency_and_more.py @@ -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='Валюта источника'), + ), + ] diff --git a/lpon_site/frontend/models.py b/lpon_site/frontend/models.py index 5efc246..0de6a92 100644 --- a/lpon_site/frontend/models.py +++ b/lpon_site/frontend/models.py @@ -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='Техническое название продавца или магазина. Например: Клюква Рекодс. Может совпадать' ' с названием продавца, если лейбл сам реализует свои издания через сайт.', ) + 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,