Files
rf4-spotter/apps/api/app/seed.py
T

88 lines
4.4 KiB
Python

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
spot_description = settings.seed_demo_data
spot1 = spot(vyunok, "spot1", 110, 103, "Кромка травы у северного берега" if spot_description else None)
spot2 = spot(kuori, "spot2", 85, 92, "Свальчик в глубину" if spot_description else None)
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()