feat: implement pivot-currency model, rbac smart tokens & fix circular imports

This commit is contained in:
2026-02-10 10:20:45 +00:00
parent 24d35fe0c1
commit e255fea3a5
117 changed files with 2247 additions and 3542 deletions

View File

@@ -1,58 +1,97 @@
import asyncio
from datetime import datetime
import logging
import uuid
from sqlalchemy import select
from app.db.session import SessionLocal
from app.models.legal import LegalDocument
from app.models.email_template import EmailTemplate, EmailType
from app.models.email_provider import EmailProviderConfig
from app.models import (
User, Person, UserRole, 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__)
async def seed_data():
async with SessionLocal() as db:
# 1. Jogi dokumentumok (HU)
legal_docs = [
LegalDocument(
title="Általános Szerződési Feltételek",
content="Ide jön az ÁSZF szövege... Kérjük görgessen az aljáig.",
version="v1.0",
region_code="HU",
language="hu"
),
LegalDocument(
title="Adatkezelési Tájékoztató (GDPR)",
content="Ide jön a GDPR szövege... Kérjük görgessen az aljáig.",
version="v1.0",
region_code="HU",
language="hu"
logger.info("🚀 Alapadatok feltöltése biztonságos módban...")
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!")
return
stmt = select(User).where(User.email == admin_email)
admin_exists = (await db.execute(stmt)).scalar_one_or_none()
if not admin_exists:
new_person = Person(
first_name="Rendszer",
last_name="Adminisztrátor",
id_uuid=uuid.uuid4()
)
db.add(new_person)
await db.flush()
new_admin = User(
email=admin_email,
hashed_password=get_password_hash(admin_password),
role=UserRole.admin,
is_active=True,
# JAVÍTÁS: is_verified eltávolítva, mert nincs ilyen mező a modellben
person_id=new_person.id
)
db.add(new_admin)
await db.flush()
db.add(UserStats(user_id=new_admin.id, total_xp=0, current_level=1))
logger.info(f"✅ Admin 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. 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")
]
# 2. Email Sablon (Regisztráció)
reg_template = EmailTemplate(
type=EmailType.REGISTRATION,
subject="Üdvözöljük a Service Finderben!",
body_html="""
<h3>Kedves {{ name }}!</h3>
<p>Köszönjük a regisztrációt! Az aktiváláshoz kattints ide:</p>
<a href="{{ link }}">Fiók aktiválása</a>
<p>A link 24 óráig érvényes.</p>
"""
)
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():
db.add(PointRule(action_key=key, points=pts, description=desc))
# 3. Email Szolgáltató (SendGrid)
sendgrid_provider = EmailProviderConfig(
name="SendGrid_Primary",
provider_type="SENDGRID",
priority=1,
settings={"api_key": "YOUR_SENDGRID_KEY_HERE"}, # Ezt majd az adminon írjuk át
max_fail_threshold=3
)
# --- 3. Gamification Szintek ---
stmt_level = select(LevelConfig)
if not (await db.execute(stmt_level)).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")
])
# --- 4. Előfizetési csomagok (MVP korlátok) ---
stmt_tier = select(SubscriptionTier)
if not (await db.execute(stmt_tier)).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})
])
db.add_all(legal_docs)
db.add(reg_template)
db.add(sendgrid_provider)
await db.commit()
print("🌱 Alapadatok sikeresen feltöltve!")
logger.info(" A rendszer alapadatai és a Gamification motor készen áll!")
if __name__ == "__main__":
asyncio.run(seed_data())
asyncio.run(seed_data())