125 lines
4.4 KiB
Python
125 lines
4.4 KiB
Python
"""
|
|
Gamification Point Rules Seed Script
|
|
=====================================
|
|
Cél: Dinamikus pontszabályok feltöltése a gamification.point_rules táblába.
|
|
A pontértékek NINCSENEK beégetve a kódba, hanem az adatbázisból
|
|
(point_rules tábla) olvassuk ki őket futásidőben.
|
|
|
|
A Vezető Tervező utasítása szerint:
|
|
- TILOS hardcoded pontszámokat használni a service rétegben!
|
|
- Minden pontértéket a point_rules táblából kell lekérdezni action_key alapján.
|
|
|
|
Használat:
|
|
docker compose exec sf_api python3 /app/backend/app/scripts/seed_gamification_rules.py
|
|
"""
|
|
|
|
import asyncio
|
|
import logging
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Projekt gyökér hozzáadása a Python path-hoz
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent))
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
|
|
from app.core.config import settings
|
|
from app.models.gamification.gamification import PointRule
|
|
|
|
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
|
|
logger = logging.getLogger("Seed-Gamification-Rules")
|
|
|
|
# A seed-elendő pontszabályok definíciói
|
|
# FIGYELEM: Ezek a definíciók csak a seed script számára vannak itt.
|
|
# A service rétegben a pontokat az adatbázisból (point_rules tábla) kell kiolvasni!
|
|
SEED_RULES = [
|
|
{
|
|
"action_key": "ADD_NEW_PROVIDER",
|
|
"points": 500,
|
|
"description": "Új szolgáltató rögzítése a rendszerbe",
|
|
"is_active": True,
|
|
},
|
|
{
|
|
"action_key": "USE_UNVERIFIED_PROVIDER",
|
|
"points": 200,
|
|
"description": "Szervizesemény/költség rögzítése olyan szolgáltatónál, aminek még nincs 5 megerősítése",
|
|
"is_active": True,
|
|
},
|
|
{
|
|
"action_key": "RATE_PROVIDER",
|
|
"points": 250,
|
|
"description": "Szolgáltató értékelése (tagekkel)",
|
|
"is_active": True,
|
|
},
|
|
{
|
|
"action_key": "UPDATE_PROVIDER",
|
|
"points": 100,
|
|
"description": "Szolgáltató adatainak szerkesztése (kategóriák, címkék frissítése)",
|
|
"is_active": True,
|
|
},
|
|
]
|
|
|
|
|
|
async def seed_point_rules():
|
|
"""
|
|
Feltölti a gamification.point_rules táblát a fenti szabályokkal,
|
|
de csak azokat a rekordokat szúrja be, amelyek még nem léteznek
|
|
(action_key alapján UPSERT helyett INSERT WHERE NOT EXISTS).
|
|
"""
|
|
# Adatbázis kapcsolat létrehozása
|
|
engine = create_async_engine(settings.DATABASE_URL, echo=False)
|
|
async_session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
|
|
|
async with async_session() as db:
|
|
try:
|
|
inserted_count = 0
|
|
skipped_count = 0
|
|
|
|
for rule_data in SEED_RULES:
|
|
# Ellenőrizzük, hogy létezik-e már ez a szabály
|
|
stmt = select(PointRule).where(
|
|
PointRule.action_key == rule_data["action_key"]
|
|
)
|
|
result = await db.execute(stmt)
|
|
existing = result.scalar_one_or_none()
|
|
|
|
if existing:
|
|
logger.info(
|
|
f"⏭️ Szabály már létezik: {rule_data['action_key']} "
|
|
f"(pont: {existing.points}, ID: {existing.id})"
|
|
)
|
|
skipped_count += 1
|
|
continue
|
|
|
|
# Új szabály beszúrása
|
|
new_rule = PointRule(
|
|
action_key=rule_data["action_key"],
|
|
points=rule_data["points"],
|
|
description=rule_data["description"],
|
|
is_active=rule_data["is_active"],
|
|
)
|
|
db.add(new_rule)
|
|
await db.flush()
|
|
logger.info(
|
|
f"✅ Szabály létrehozva: {rule_data['action_key']} "
|
|
f"(pont: {rule_data['points']}, ID: {new_rule.id})"
|
|
)
|
|
inserted_count += 1
|
|
|
|
await db.commit()
|
|
logger.info(
|
|
f"\n📊 Összegzés: {inserted_count} új szabály beszúrva, "
|
|
f"{skipped_count} már létezett."
|
|
)
|
|
|
|
except Exception as e:
|
|
await db.rollback()
|
|
logger.error(f"❌ Hiba a seedelés során: {e}", exc_info=True)
|
|
raise
|
|
finally:
|
|
await engine.dispose()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(seed_point_rules())
|