mod: модели (preliminary 05) + миграции
А) Валюта перенесена из TbSource в TbSeller
This commit is contained in:
@@ -309,16 +309,16 @@ class LabelAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
class SellerAdmin(admin.ModelAdmin):
|
class SellerAdmin(admin.ModelAdmin):
|
||||||
"""Админ для продавцов"""
|
"""Админ для продавцов"""
|
||||||
list_display = ('id', 's_seller', 'l_seller_type', 't_seller_created')
|
list_display = ('id', 's_seller', 'l_seller_type', 'l_seller_currency', 't_seller_created')
|
||||||
list_filter = ('l_seller_type',)
|
list_filter = ('l_seller_type', 'l_seller_currency', )
|
||||||
search_fields = ('s_seller',)
|
search_fields = ('s_seller',)
|
||||||
readonly_fields = ('t_seller_created', 't_seller_updated')
|
readonly_fields = ('t_seller_created', 't_seller_updated')
|
||||||
|
|
||||||
|
|
||||||
class SourceAdmin(admin.ModelAdmin):
|
class SourceAdmin(admin.ModelAdmin):
|
||||||
"""Админ для источников"""
|
"""Админ для источников"""
|
||||||
list_display = ('id', 's_source_name', 'k_source_to_seller', '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', 'l_source_currency', 't_source_data')
|
list_filter = ('l_source_type', 't_source_data')
|
||||||
search_fields = ('s_source_name',)
|
search_fields = ('s_source_name',)
|
||||||
readonly_fields = ('t_source_created', 't_source_updated')
|
readonly_fields = ('t_source_created', 't_source_updated')
|
||||||
|
|
||||||
|
|||||||
@@ -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='Валюта источника'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -105,6 +105,7 @@
|
|||||||
# ├──────────────────────┼──────────────────────────────────────────────────────
|
# ├──────────────────────┼──────────────────────────────────────────────────────
|
||||||
# │ PK: id │ AutoField
|
# │ PK: id │ AutoField
|
||||||
# │ s_seller │ Название (уникальный)
|
# │ s_seller │ Название (уникальный)
|
||||||
|
# │ l_seller_currency │ (rub, usd, eur, ...)
|
||||||
# │ l_seller_type │ Тип (seller, label, diy, crowdfunding, other)
|
# │ l_seller_type │ Тип (seller, label, diy, crowdfunding, other)
|
||||||
# │ k_seller_to_article │ 1:1 FK → TbArticle (content, SEO, slug)
|
# │ k_seller_to_article │ 1:1 FK → TbArticle (content, SEO, slug)
|
||||||
# │ t_seller_created │ Timestamp
|
# │ t_seller_created │ Timestamp
|
||||||
@@ -120,7 +121,6 @@
|
|||||||
# │ PK: id │ AutoField
|
# │ PK: id │ AutoField
|
||||||
# │ k_source_to_seller │ FK → TbSeller [indexed]
|
# │ k_source_to_seller │ FK → TbSeller [indexed]
|
||||||
# │ l_source_type │ (excel, csv, url, other)
|
# │ l_source_type │ (excel, csv, url, other)
|
||||||
# │ l_source_currency │ (rub, usd, eur, ...)
|
|
||||||
# │ s_source_name │ Название источника
|
# │ s_source_name │ Название источника
|
||||||
# │ source_file │ FilerFileField
|
# │ source_file │ FilerFileField
|
||||||
# │ s_source_url │ URL источника
|
# │ s_source_url │ URL источника
|
||||||
@@ -747,6 +747,8 @@ class TbLabel(models.Model):
|
|||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# ПРОДАВЦЫ / МАГАЗИНЫ
|
# ПРОДАВЦЫ / МАГАЗИНЫ
|
||||||
|
# - Валюта привязана к продавцу. Если у продавца несколько валют,
|
||||||
|
# создаем несколько продавцов с разными валютами.
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
class TbSeller(models.Model):
|
class TbSeller(models.Model):
|
||||||
"""Продавец или магазин, который продаёт товары."""
|
"""Продавец или магазин, который продаёт товары."""
|
||||||
@@ -757,6 +759,19 @@ class TbSeller(models.Model):
|
|||||||
CROWD = 'crowd', 'Краудфандинг'
|
CROWD = 'crowd', 'Краудфандинг'
|
||||||
OTHER = '???', 'Другое'
|
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)
|
# Используем SmallAutoField для оптимизации (макс ~32k)
|
||||||
# Продавцов обычно до 1000-10000, поэтому достаточно
|
# Продавцов обычно до 1000-10000, поэтому достаточно
|
||||||
id = models.SmallAutoField(primary_key=True)
|
id = models.SmallAutoField(primary_key=True)
|
||||||
@@ -768,6 +783,13 @@ class TbSeller(models.Model):
|
|||||||
help_text='Техническое название продавца или магазина. Например: <tt>Клюква Рекодс</tt>. Может совпадать'
|
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(
|
k_seller_to_article = models.OneToOneField(
|
||||||
TbArticle,
|
TbArticle,
|
||||||
on_delete=models.SET_NULL,
|
on_delete=models.SET_NULL,
|
||||||
@@ -1042,19 +1064,6 @@ class TbSource(models.Model):
|
|||||||
URL = 'url', 'URL страницы с данными (например, HTML-страница с каталогом товаров)'
|
URL = 'url', 'URL страницы с данными (например, HTML-страница с каталогом товаров)'
|
||||||
OTHER = '??', 'Другое'
|
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)
|
# Используем SmallAutoField для оптимизации (макс ~32k)
|
||||||
# Источников обычно до 1000, достаточно
|
# Источников обычно до 1000, достаточно
|
||||||
id = models.SmallAutoField(primary_key=True)
|
id = models.SmallAutoField(primary_key=True)
|
||||||
@@ -1067,13 +1076,6 @@ class TbSource(models.Model):
|
|||||||
db_index=True, # Принудительно создаем индекс, т.к. SQLite их сам не создаст.
|
db_index=True, # Принудительно создаем индекс, т.к. SQLite их сам не создаст.
|
||||||
verbose_name='Продавец',
|
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(
|
s_source_name = models.CharField(
|
||||||
max_length=128,
|
max_length=128,
|
||||||
blank=True,
|
blank=True,
|
||||||
|
|||||||
Reference in New Issue
Block a user