STABLE: Final schema sync, optimized gitignore
This commit is contained in:
@@ -1,97 +1,107 @@
|
||||
# /opt/docker/dev/service_finder/backend/app/seed_system.py
|
||||
import asyncio
|
||||
import logging
|
||||
import uuid
|
||||
from sqlalchemy import select
|
||||
from app.db.session import SessionLocal
|
||||
from app.models import (
|
||||
User, Person, UserRole, SystemParameter,
|
||||
PointRule, LevelConfig, SubscriptionTier, UserStats
|
||||
)
|
||||
from app.database import AsyncSessionLocal
|
||||
from app.models.identity import User, Person, UserRole
|
||||
from app.models.system import SystemParameter, PointRule, LevelConfig, SubscriptionTier, UserStats
|
||||
from app.core.security import get_password_hash
|
||||
from app.core.config import settings
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
# Logolás beállítása a Sentinel monitorozáshoz
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Seed: %(message)s')
|
||||
logger = logging.getLogger("System-Seeder")
|
||||
|
||||
async def seed_data():
|
||||
async with SessionLocal() as db:
|
||||
logger.info("🚀 Alapadatok feltöltése biztonságos módban...")
|
||||
"""
|
||||
Rendszer alapadatok inicializálása:
|
||||
Admin, Gamification szabályok és Előfizetési szintek.
|
||||
"""
|
||||
async with AsyncSessionLocal() as db:
|
||||
logger.info("🚀 Rendszer-alapozás indítása (MB2.0 Standard)...")
|
||||
|
||||
admin_email = settings.INITIAL_ADMIN_EMAIL
|
||||
admin_password = settings.INITIAL_ADMIN_PASSWORD
|
||||
|
||||
if not admin_email or not admin_password:
|
||||
logger.error("❌ HIBA: INITIAL_ADMIN_EMAIL vagy PASSWORD nincs beállítva!")
|
||||
logger.error("❌ HIBA: Admin hitelesítési adatok hiányoznak a környezeti változókból!")
|
||||
return
|
||||
|
||||
# 1. LOGIKA: Superadmin létrehozása (Identity + Person link)
|
||||
stmt = select(User).where(User.email == admin_email)
|
||||
admin_exists = (await db.execute(stmt)).scalar_one_or_none()
|
||||
|
||||
if not admin_exists:
|
||||
# Személy létrehozása
|
||||
new_person = Person(
|
||||
first_name="Rendszer",
|
||||
last_name="Adminisztrátor",
|
||||
id_uuid=uuid.uuid4()
|
||||
id_uuid=uuid.uuid4(),
|
||||
is_active=True
|
||||
)
|
||||
db.add(new_person)
|
||||
await db.flush()
|
||||
|
||||
# Felhasználó létrehozása
|
||||
new_admin = User(
|
||||
email=admin_email,
|
||||
hashed_password=get_password_hash(admin_password),
|
||||
role=UserRole.admin,
|
||||
role=UserRole.superadmin,
|
||||
is_active=True,
|
||||
# JAVÍTÁS: is_verified eltávolítva, mert nincs ilyen mező a modellben
|
||||
person_id=new_person.id
|
||||
person_id=new_person.id,
|
||||
reputation_score=100 # Az admin hírneve alapértelmezetten magas
|
||||
)
|
||||
db.add(new_admin)
|
||||
await db.flush()
|
||||
|
||||
# Statisztikai rekord létrehozása a Gamificationhöz
|
||||
db.add(UserStats(user_id=new_admin.id, total_xp=0, current_level=1))
|
||||
logger.info(f"✅ Admin létrehozva: {admin_email}")
|
||||
logger.info(f"✅ Superadmin létrehozva: {admin_email}")
|
||||
|
||||
# --- 1. Értékelési szempontok (Admin Motor) ---
|
||||
criteria_key = "ASSET_REVIEW_CRITERIA"
|
||||
stmt_crit = select(SystemParameter).where(SystemParameter.key == criteria_key)
|
||||
if not (await db.execute(stmt_crit)).scalar_one_or_none():
|
||||
db.add(SystemParameter(
|
||||
key=criteria_key,
|
||||
value=["Kényelem", "Fogyasztás", "Megbízhatóság", "Vezetési élmény", "Szervizigény"],
|
||||
description="Járműértékelési szempontok"
|
||||
))
|
||||
# 2. LOGIKA: Rendszerparaméterek (Sentinel Config)
|
||||
params = [
|
||||
("ASSET_REVIEW_CRITERIA", ["Kényelem", "Fogyasztás", "Megbízhatóság", "Szervizigény"], "Értékelési szempontok"),
|
||||
("SECURITY_MAX_RECORDS_PER_HOUR", "50", "Biztonsági limit óránkénti feltöltésre")
|
||||
]
|
||||
for key, val, desc in params:
|
||||
stmt_p = select(SystemParameter).where(SystemParameter.key == key)
|
||||
if not (await db.execute(stmt_p)).scalar_one_or_none():
|
||||
db.add(SystemParameter(key=key, value=val, description=desc))
|
||||
|
||||
# --- 2. Gamification Pontszabályok ---
|
||||
# 3. LOGIKA: Gamification Pontszabályok
|
||||
rules = [
|
||||
("ASSET_REGISTER", 100, "Új jármű felvétele"),
|
||||
("ASSET_REVIEW", 75, "Jármű értékelése"),
|
||||
("COST_RECORD", 50, "Költség/Tankolás rögzítése")
|
||||
("COST_RECORD", 50, "Költség rögzítése (tankolás/szerviz)"),
|
||||
("OCR_UPLOAD", 120, "Dokumentum sikeres OCR feldolgozása")
|
||||
]
|
||||
for key, pts, desc in rules:
|
||||
stmt_rule = select(PointRule).where(PointRule.action_key == key)
|
||||
if not (await db.execute(stmt_rule)).scalar_one_or_none():
|
||||
stmt_r = select(PointRule).where(PointRule.action_key == key)
|
||||
if not (await db.execute(stmt_r)).scalar_one_or_none():
|
||||
db.add(PointRule(action_key=key, points=pts, description=desc))
|
||||
|
||||
# --- 3. Gamification Szintek ---
|
||||
stmt_level = select(LevelConfig)
|
||||
if not (await db.execute(stmt_level)).first():
|
||||
# 4. LOGIKA: Gamification Rangok (Levels)
|
||||
stmt_l = select(LevelConfig)
|
||||
if not (await db.execute(stmt_l)).first():
|
||||
db.add_all([
|
||||
LevelConfig(level_number=1, min_points=0, rank_name="Kezdő Sofőr"),
|
||||
LevelConfig(level_number=2, min_points=500, rank_name="Tapasztalt Vezető"),
|
||||
LevelConfig(level_number=3, min_points=2000, rank_name="Flotta Mester")
|
||||
LevelConfig(level_number=2, min_points=1000, rank_name="Tapasztalt Vezető"),
|
||||
LevelConfig(level_number=3, min_points=5000, rank_name="Flotta Mester"),
|
||||
LevelConfig(level_number=4, min_points=15000, rank_name="Sentinel Legenda")
|
||||
])
|
||||
|
||||
# --- 4. Előfizetési csomagok (MVP korlátok) ---
|
||||
stmt_tier = select(SubscriptionTier)
|
||||
if not (await db.execute(stmt_tier)).first():
|
||||
# 5. LOGIKA: Előfizetési Csomagok (Subscription Tiers)
|
||||
stmt_t = select(SubscriptionTier)
|
||||
if not (await db.execute(stmt_t)).first():
|
||||
db.add_all([
|
||||
SubscriptionTier(name="Ingyenes", rules={"max_assets": 1, "reports": False}),
|
||||
SubscriptionTier(name="Prémium", rules={"max_assets": 5, "reports": True}),
|
||||
SubscriptionTier(name="Flotta", rules={"max_assets": 100, "reports": True})
|
||||
SubscriptionTier(name="FREE", rules={"max_assets": 1, "ai_ocr": False, "reports": False}),
|
||||
SubscriptionTier(name="PREMIUM", rules={"max_assets": 10, "ai_ocr": True, "reports": True}),
|
||||
SubscriptionTier(name="FLEET", rules={"max_assets": 500, "ai_ocr": True, "reports": True, "api_access": True})
|
||||
])
|
||||
|
||||
|
||||
await db.commit()
|
||||
logger.info("✨ A rendszer alapadatai és a Gamification motor készen áll!")
|
||||
logger.info("✨ A Sentinel ökoszisztéma alapjai sikeresen rögzítve!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(seed_data())
|
||||
Reference in New Issue
Block a user