refactor: derive VK description postfix from measure_name, drop global postfix setting
Each product's description is now built as "Name (цена за M.)" using its own measure_name. The global description_postfix setting is removed — it couldn't handle per-product units. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
"""Add price_multiplier and description_postfix to sync_configs."""
|
"""Add price_multiplier to sync_configs."""
|
||||||
revision = "0008"
|
revision = "0008"
|
||||||
down_revision = "0007"
|
down_revision = "0007"
|
||||||
branch_labels = None
|
branch_labels = None
|
||||||
@@ -10,9 +10,7 @@ from alembic import op
|
|||||||
|
|
||||||
def upgrade():
|
def upgrade():
|
||||||
op.add_column("sync_configs", sa.Column("price_multiplier", sa.Numeric(10, 4), nullable=False, server_default="1.0"))
|
op.add_column("sync_configs", sa.Column("price_multiplier", sa.Numeric(10, 4), nullable=False, server_default="1.0"))
|
||||||
op.add_column("sync_configs", sa.Column("description_postfix", sa.String(255), nullable=True))
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
def downgrade():
|
||||||
op.drop_column("sync_configs", "description_postfix")
|
|
||||||
op.drop_column("sync_configs", "price_multiplier")
|
op.drop_column("sync_configs", "price_multiplier")
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ class SyncConfig(Base):
|
|||||||
is_enabled = Column(Boolean, nullable=False, default=False)
|
is_enabled = Column(Boolean, nullable=False, default=False)
|
||||||
confirmed_at = Column(DateTime, nullable=True)
|
confirmed_at = Column(DateTime, nullable=True)
|
||||||
price_multiplier = Column(Numeric(10, 4), nullable=False, default=1.0)
|
price_multiplier = Column(Numeric(10, 4), nullable=False, default=1.0)
|
||||||
description_postfix = Column(String(255), nullable=True)
|
|
||||||
created_at = Column(DateTime, nullable=False, server_default=func.now())
|
created_at = Column(DateTime, nullable=False, server_default=func.now())
|
||||||
updated_at = Column(DateTime, nullable=False, server_default=func.now(), onupdate=func.now())
|
updated_at = Column(DateTime, nullable=False, server_default=func.now(), onupdate=func.now())
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ async def sync_settings_post(request: Request, db: Session = Depends(get_db)):
|
|||||||
|
|
||||||
form = await request.form()
|
form = await request.form()
|
||||||
raw_multiplier = str(form.get("price_multiplier", "1")).strip()
|
raw_multiplier = str(form.get("price_multiplier", "1")).strip()
|
||||||
postfix = str(form.get("description_postfix", "")).strip() or None
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
multiplier = float(raw_multiplier)
|
multiplier = float(raw_multiplier)
|
||||||
@@ -61,13 +60,11 @@ async def sync_settings_post(request: Request, db: Session = Depends(get_db)):
|
|||||||
config = db.query(SyncConfig).filter_by(user_id=user.id).first()
|
config = db.query(SyncConfig).filter_by(user_id=user.id).first()
|
||||||
if config:
|
if config:
|
||||||
config.price_multiplier = multiplier
|
config.price_multiplier = multiplier
|
||||||
config.description_postfix = postfix
|
|
||||||
else:
|
else:
|
||||||
config = SyncConfig(
|
config = SyncConfig(
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
is_enabled=False,
|
is_enabled=False,
|
||||||
price_multiplier=multiplier,
|
price_multiplier=multiplier,
|
||||||
description_postfix=postfix,
|
|
||||||
)
|
)
|
||||||
db.add(config)
|
db.add(config)
|
||||||
|
|
||||||
|
|||||||
@@ -153,8 +153,8 @@ def _sync_product(
|
|||||||
name = _name_for_vk(product.name)
|
name = _name_for_vk(product.name)
|
||||||
multiplier = float(sync_config.price_multiplier) if sync_config and sync_config.price_multiplier else 1.0
|
multiplier = float(sync_config.price_multiplier) if sync_config and sync_config.price_multiplier else 1.0
|
||||||
price_rubles = _calc_price(product.price) * multiplier
|
price_rubles = _calc_price(product.price) * multiplier
|
||||||
postfix = (sync_config.description_postfix or "").strip() if sync_config else ""
|
measure = (product.measure_name or "").strip()
|
||||||
desc = f"{product.name} ({postfix})" if postfix else product.name
|
desc = f"{product.name} (цена за {measure}.)" if measure else product.name
|
||||||
stock = settings.VK_STOCK_AMOUNT if product.allow_to_sell else 0
|
stock = settings.VK_STOCK_AMOUNT if product.allow_to_sell else 0
|
||||||
owner_id = f"-{vk_group_id}"
|
owner_id = f"-{vk_group_id}"
|
||||||
now = _now()
|
now = _now()
|
||||||
|
|||||||
@@ -11,24 +11,15 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<article class="card">
|
<article class="card">
|
||||||
<h2 style="font-size:1.1rem; margin-bottom:1.25rem;">Настройки цены и описания</h2>
|
<h2 style="font-size:1.1rem; margin-bottom:1.25rem;">Настройки цены</h2>
|
||||||
<form method="post" action="/sync/settings">
|
<form method="post" action="/sync/settings">
|
||||||
<div class="grid" style="grid-template-columns: 1fr 1fr; gap:1.5rem;">
|
<label style="max-width:320px;">
|
||||||
<label>
|
Множитель цены
|
||||||
Множитель цены
|
<input type="number" name="price_multiplier" step="0.0001" min="0.0001"
|
||||||
<input type="number" name="price_multiplier" step="0.0001" min="0.0001"
|
value="{{ config.price_multiplier if config else '1' }}"
|
||||||
value="{{ config.price_multiplier if config else '1' }}"
|
placeholder="1">
|
||||||
placeholder="1">
|
<small class="text-muted">Цена из Эвотор умножается на это значение перед отправкой в ВК. По умолчанию: 1.</small>
|
||||||
<small class="text-muted">Цена из Эвотор умножается на это значение перед отправкой в ВК. По умолчанию: 1.</small>
|
</label>
|
||||||
</label>
|
|
||||||
<label>
|
|
||||||
Постфикс описания
|
|
||||||
<input type="text" name="description_postfix"
|
|
||||||
value="{{ config.description_postfix if config and config.description_postfix else '' }}"
|
|
||||||
placeholder="цена за 10г.">
|
|
||||||
<small class="text-muted">Если заполнено, добавляется к описанию: «Название (постфикс)». Оставьте пустым, чтобы не добавлять.</small>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<button type="submit" style="margin-top:1rem;">Сохранить</button>
|
<button type="submit" style="margin-top:1rem;">Сохранить</button>
|
||||||
</form>
|
</form>
|
||||||
</article>
|
</article>
|
||||||
|
|||||||
Reference in New Issue
Block a user