from __future__ import annotations from datetime import datetime, timedelta, timezone from uuid import UUID from sqlalchemy import select from .config import settings from .database import SessionLocal from .models import Bait, BaitKind, CatchReport, Fish, ModerationStatus, SourceType, Spot, Waterbody IDS = { "vyunok": UUID("10000000-0000-0000-0000-000000000001"), "kuori": UUID("10000000-0000-0000-0000-000000000002"), "pike": UUID("20000000-0000-0000-0000-000000000001"), "trout": UUID("20000000-0000-0000-0000-000000000002"), "spiker": UUID("30000000-0000-0000-0000-000000000001"), "shad": UUID("30000000-0000-0000-0000-000000000002"), "spot1": UUID("40000000-0000-0000-0000-000000000001"), "spot2": UUID("40000000-0000-0000-0000-000000000002"), } def seed() -> None: with SessionLocal.begin() as db: def entity(model, key: str, value: str, **values): item = db.scalar(select(model).where(getattr(model, key) == value)) if item is None: item = model(**values) db.add(item) db.flush() return item vyunok = entity(Waterbody, "slug", "vyunok", id=IDS["vyunok"], slug="vyunok", name_ru="Вьюнок", unlock_level=1) kuori = entity(Waterbody, "slug", "kuori", id=IDS["kuori"], slug="kuori", name_ru="Куори", unlock_level=16) pike = entity(Fish, "slug", "pike", id=IDS["pike"], slug="pike", name_ru="Щука", trophy_weight_g=10_000) trout = entity(Fish, "slug", "lake-trout", id=IDS["trout"], slug="lake-trout", name_ru="Озёрная форель", trophy_weight_g=10_000) spiker = entity(Bait, "normalized_name", "spiker #2 01-015", id=IDS["spiker"], name="Spiker #2 01-015", normalized_name="spiker #2 01-015", kind=BaitKind.lure) shad = entity(Bait, "normalized_name", "salmon t1 shad 12 005", id=IDS["shad"], name="Salmon T1 Shad 12 005", normalized_name="salmon t1 shad 12 005", kind=BaitKind.lure) def spot(waterbody: Waterbody, identity: str, x: int, y: int, description: str) -> Spot: item = db.scalar(select(Spot).where(Spot.waterbody_id == waterbody.id, Spot.x == x, Spot.y == y)) if item is None: item = Spot(id=IDS[identity], waterbody=waterbody, x=x, y=y, description=description) db.add(item) db.flush() return item spot1 = spot(vyunok, "spot1", 110, 103, "Кромка травы у северного берега") spot2 = spot(kuori, "spot2", 85, 92, "Свальчик в глубину") if not settings.seed_demo_data: return now = datetime.now(timezone.utc) for index in range(12): external_id = f"seed:pike:{index}" if db.scalar(select(CatchReport.id).where(CatchReport.source_external_id == external_id)): continue db.add(CatchReport( fish=pike, spot=spot1, waterbody=vyunok, bait=spiker, weight_g=2_600 + index * 480, fishing_method="spinning", retrieve_method="равномерная", retrieve_speed=22, caught_at=now - timedelta(minutes=25 + index * 47), reported_at=now - timedelta(minutes=20 + index * 47), player_name=f"DemoPlayer{index % 7 + 1}", source_type=SourceType.manual_import, source_external_id=external_id, source_confidence=80 + index % 3 * 5, moderation_status=ModerationStatus.approved, )) for index in range(5): external_id = f"seed:trout:{index}" if db.scalar(select(CatchReport.id).where(CatchReport.source_external_id == external_id)): continue db.add(CatchReport( fish=trout, spot=spot2, waterbody=kuori, bait=shad, weight_g=4_200 + index * 900, fishing_method="spinning", retrieve_method="ступенчатая", retrieve_speed=18, caught_at=now - timedelta(hours=2 + index * 4), reported_at=now - timedelta(hours=2 + index * 4), player_name=f"DemoAngler{index + 1}", source_type=SourceType.manual_import, source_external_id=external_id, source_confidence=85, moderation_status=ModerationStatus.approved, )) if __name__ == "__main__": seed()