Law/app/scripts/upsert_quotes.py
2026-02-23 15:20:00 +03:00

68 lines
1.9 KiB
Python

from __future__ import annotations
from datetime import datetime, timezone
from sqlalchemy.orm import Session
from app.data.quotes_justice_seed import JUSTICE_QUOTES
from app.db.session import SessionLocal
from app.models.quote import Quote
def upsert_quotes(db: Session, quotes: list[dict]) -> tuple[int, int]:
created = 0
updated = 0
for index, item in enumerate(quotes, start=1):
author = str(item["author"]).strip()
text = str(item["text"]).strip()
source = str(item.get("source") or "").strip() or None
sort_order = int(item.get("sort_order") or index)
is_active = bool(item.get("is_active", True))
row = db.query(Quote).filter(Quote.author == author, Quote.text == text).first()
if row is None:
db.add(
Quote(
author=author,
text=text,
source=source,
sort_order=sort_order,
is_active=is_active,
)
)
created += 1
continue
changed = False
if row.source != source:
row.source = source
changed = True
if row.sort_order != sort_order:
row.sort_order = sort_order
changed = True
if row.is_active != is_active:
row.is_active = is_active
changed = True
if changed:
row.updated_at = datetime.now(timezone.utc)
db.add(row)
updated += 1
db.commit()
return created, updated
def main() -> None:
db = SessionLocal()
try:
created, updated = upsert_quotes(db, JUSTICE_QUOTES)
total = db.query(Quote).count()
finally:
db.close()
print(f"quotes upsert done: created={created}, updated={updated}, total={total}")
if __name__ == "__main__":
main()