شامل کارهای چند نشست موازی که تا اینجا فقط روی سرور بود: - نقشهٔ دفتر مرکزی در فوتر (LazyOfficeMap) + MapViewport/LazyMaps/mapProjects - صفحهٔ مدیریت مقالات (AdminArticlesPage) + میانبر ویرایش پیشنویس در وبلاگ - مهاجرت ۰۰۰۴: updated_at مقالات/پروژهها - chatbot/Dockerfile: نصب دومرحلهای torch (کاربردی برای PyPI فیلترشده) - seed: خالیکردن آمارهای دموی story - docker-compose: اصلاح پسوند @file میانافزارهای Traefik - حذف فایل موقت frontend/.tmp-style.json و اصلاحات جزئی UI با این کامیت، آنچه روی سرور اجرا میشود Exactly همان چیزی است که در مخزن ثبت شده.
40 lines
1.5 KiB
Python
40 lines
1.5 KiB
Python
"""زمان آخرین بهروزرسانی مقالهها و پروژهها — ستون updated_at برای lastmod نقشه سایت.
|
|
|
|
نقشه سایت lastmod معتبر لازم دارد که آخرین تغییر معنادار محتوا را نشان دهد؛
|
|
تاریخ نمایشی مقالهها (شمسی دستنویس) برای این کار مناسب نیست. ردیفهای قدیمی
|
|
NULL میمانند و lastmod فقط برای ردیفهایی صادر میشود که بعداً در پنل ذخیره شدهاند —
|
|
تاریخ جعلی همگن (همه = امروز) بهعنوان سیگنال منفی شناخته میشود.
|
|
|
|
Revision ID: 0004
|
|
Revises: 0003
|
|
Create Date: 2026-10-11
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision: str = "0004"
|
|
down_revision: Union[str, None] = "0003"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
_TABLES = ("articles", "projects")
|
|
|
|
|
|
def upgrade() -> None:
|
|
for table in _TABLES:
|
|
cols = {c["name"] for c in sa.inspect(op.get_bind()).get_columns(table)}
|
|
if "updated_at" not in cols:
|
|
op.add_column(
|
|
table,
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
for table in _TABLES:
|
|
cols = {c["name"] for c in sa.inspect(op.get_bind()).get_columns(table)}
|
|
if "updated_at" in cols:
|
|
op.drop_column(table, "updated_at")
|