refaktorálás javításai

This commit is contained in:
Roo
2026-03-13 10:22:41 +00:00
parent 2d8d23f469
commit f53e0b53df
140 changed files with 7316 additions and 4579 deletions

View File

@@ -26,23 +26,23 @@ logger = logging.getLogger("Seed-Catalog")
async def quick_seed():
""" Katalógus és Discovery adatok inicializálása. """
async with AsyncSessionLocal() as db:
logger.info("🚀 Katalógus alapozás indítása...")
try:
# 1. Felderítendő Városok (DiscoveryParameter)
# A Scout robot ezekben a városokban kezdi meg a szervizek kutatását.
cities = [
("BUDAPEST", "HU"),
("DEBRECEN", "HU"),
("GYŐR", "HU"),
("SZEGED", "HU")
]
for city_name, country in cities:
async with AsyncSessionLocal() as db:
logger.info("🚀 Katalógus alapozás indítása...")
try:
# 1. Felderítendő Városok (DiscoveryParameter)
# A Scout robot ezekben a városokban kezdi meg a szervizek kutatását.
cities = [
("BUDAPEST", "HU"),
("DEBRECEN", "HU"),
("GYŐR", "HU"),
("SZEGED", "HU")
]
for city_name, country in cities:
db.add(DiscoveryParameter(
city=city_name,
country_code=country,
city=city_name,
keyword=country,
is_active=True
))

View File

@@ -13,8 +13,32 @@ async def run_simulation():
async with AsyncSessionLocal() as db:
print("--- 1. TAKARÍTÁS (MB2.0 Séma-tisztítás) ---")
# Szigorú sorrend a kényszerek miatt (Cascade)
await db.execute(text("TRUNCATE identity.users, identity.persons, data.service_providers, data.votes, data.competitions RESTART IDENTITY CASCADE"))
await db.commit()
# Ellenőrizzük, mely táblák léteznek
tables_to_check = [
("identity.users", "users"),
("identity.persons", "persons"),
("marketplace.service_providers", "service_providers"),
("marketplace.votes", "votes"),
("system.competitions", "competitions")
]
existing_tables = []
for full_name, table_name in tables_to_check:
try:
result = await db.execute(text(f"SELECT 1 FROM information_schema.tables WHERE table_schema = '{full_name.split('.')[0]}' AND table_name = '{table_name}'"))
if result.scalar() == 1:
existing_tables.append(full_name)
else:
print(f"⚠️ {full_name} tábla nem létezik, kihagyva a törlést")
except Exception:
print(f"⚠️ {full_name} tábla nem létezik, kihagyva a törlést")
if existing_tables:
tables_str = ", ".join(existing_tables)
await db.execute(text(f"TRUNCATE {tables_str} RESTART IDENTITY CASCADE"))
await db.commit()
else:
print(" Nincs törlendő tábla")
print("\n--- 2. SZEREPLŐK LÉTREHOZÁSA (Person + User) ---")
users_to_create = [
@@ -26,17 +50,19 @@ async def run_simulation():
created_users = {}
for email, name, role in users_to_create:
p = Person(id_uuid=uuid.uuid4(), first_name=name.split()[0], last_name=name.split()[1], is_active=True)
name_parts = name.split()
first_name = name_parts[0] if name_parts else "Unknown"
last_name = name_parts[1] if len(name_parts) > 1 else "User"
p = Person(id_uuid=uuid.uuid4(), first_name=first_name, last_name=last_name, is_active=True)
db.add(p)
await db.flush()
u = User(
email=email,
hashed_password=get_password_hash("test1234"),
person_id=p.id,
role=role,
is_active=True,
reputation_score=5 if "good" in email else (-8 if "bad" in email else 0)
email=email,
hashed_password=get_password_hash("test1234"),
person_id=p.id,
role=role,
is_active=True
)
db.add(u)
await db.flush()
@@ -45,62 +71,86 @@ async def run_simulation():
await db.commit()
print("\n--- 3. VERSENY INDÍTÁSA ---")
race = Competition(
name="Téli Szervizvadászat",
start_date=datetime.now(timezone.utc) - timedelta(days=1),
end_date=datetime.now(timezone.utc) + timedelta(days=30),
is_active=True
)
db.add(race)
await db.commit()
# Ellenőrizzük, hogy a competitions tábla létezik-e
try:
result = await db.execute(text("SELECT 1 FROM information_schema.tables WHERE table_schema = 'system' AND table_name = 'competitions'"))
if result.scalar() == 1:
race = Competition(
name="Téli Szervizvadászat",
start_date=datetime.now(timezone.utc) - timedelta(days=1),
end_date=datetime.now(timezone.utc) + timedelta(days=30),
is_active=True
)
db.add(race)
await db.commit()
print("✅ Verseny létrehozva")
else:
print("⚠️ system.competitions tábla nem létezik, kihagyva a verseny létrehozását")
except Exception as e:
print(f"⚠️ Hiba a competitions tábla ellenőrzése közben: {e}, kihagyva a verseny létrehozását")
# Szereplők kiemelése a szimulációhoz
good_user = created_users["good@test.com"]
bad_user = created_users["bad@test.com"]
voter = created_users["voter@test.com"]
print("\n--- 4. SZCENÁRIÓ A: POZITÍV VALIDÁCIÓ ---")
# Rendes srác beküld egy szervizt
shop = ServiceProvider(
name="Profi Gumis",
address="Budapest, Váci út 10.",
added_by_user_id=good_user.id,
status=ModerationStatus.pending
)
db.add(shop)
await db.flush()
# Ellenőrizzük, hogy a szükséges táblák léteznek-e a szociális szimulációhoz
try:
result = await db.execute(text("SELECT 1 FROM information_schema.tables WHERE table_schema = 'marketplace' AND table_name = 'service_providers'"))
service_providers_exists = result.scalar() == 1
result = await db.execute(text("SELECT 1 FROM information_schema.tables WHERE table_schema = 'marketplace' AND table_name = 'votes'"))
votes_exists = result.scalar() == 1
if service_providers_exists and votes_exists:
print("\n--- 4. SZCENÁRIÓ A: POZITÍV VALIDÁCIÓ ---")
# Rendes srác beküld egy szervizt
shop = ServiceProvider(
name="Profi Gumis",
address="Budapest, Váci út 10.",
added_by_user_id=good_user.id,
status=ModerationStatus.pending
)
db.add(shop)
await db.flush()
# Szavazatok szimulálása (SocialService használatával a pontszámítás miatt)
print(f"Szavazás a '{shop.name}'-re...")
# Szimulálunk 5 pozitív szavazatot különböző "virtuális" szavazóktól
for _ in range(5):
await SocialService.vote_for_provider(db, voter.id, shop.id, 1)
# Szavazatok szimulálása (SocialService használatával a pontszámítás miatt)
print(f"Szavazás a '{shop.name}'-re...")
# Szimulálunk 5 pozitív szavazatot különböző "virtuális" szavazóktól
for _ in range(5):
await SocialService.vote_for_provider(db, voter.id, shop.id, 1)
await db.refresh(good_user)
print(f"Jó felhasználó hírneve: {good_user.reputation_score}")
await db.refresh(good_user)
print(f"Jó felhasználó hírneve: {good_user.reputation_score}")
print("\n--- 5. SZCENÁRIÓ B: AUTO-BAN (SPAM SZŰRÉS) ---")
fake_shop = ServiceProvider(
name="KAMU SZERVIZ",
address="Nincs ilyen utca 0.",
added_by_user_id=bad_user.id,
status=ModerationStatus.pending
)
db.add(fake_shop)
await db.flush()
print("\n--- 5. SZCENÁRIÓ B: AUTO-BAN (SPAM SZŰRÉS) ---")
fake_shop = ServiceProvider(
name="KAMU SZERVIZ",
address="Nincs ilyen utca 0.",
added_by_user_id=bad_user.id,
status=ModerationStatus.pending
)
db.add(fake_shop)
await db.flush()
# Leszavazás (Kell -3 a bukáshoz)
print("Spam jelentése...")
await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1)
await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1)
await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1)
# Leszavazás (Kell -3 a bukáshoz)
print("Spam jelentése...")
await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1)
await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1)
await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1)
await db.refresh(bad_user)
print(f"Rossz felhasználó hírneve: {bad_user.reputation_score}")
print(f"Fiók státusza: {'KITILTVA' if not bad_user.is_active else 'AKTÍV'}")
await db.refresh(bad_user)
print(f"Rossz felhasználó hírneve: {bad_user.reputation_score}")
print(f"Fiók státusza: {'KITILTVA' if not bad_user.is_active else 'AKTÍV'}")
if not bad_user.is_active:
print("✅ SIKER: A Sentinel automatikusan leállította a spammert!")
if not bad_user.is_active:
print("✅ SIKER: A Sentinel automatikusan leállította a spammert!")
else:
print("\n⚠️ Marketplace táblák (service_providers, votes) nem léteznek, kihagyva a szociális szimulációt")
print(" Alap felhasználók sikeresen létrehozva")
except Exception as e:
print(f"\n⚠️ Hiba a táblák ellenőrzése közben: {e}, kihagyva a szociális szimulációt")
print(" Alap felhasználók sikeresen létrehozva")
if __name__ == "__main__":
asyncio.run(run_simulation())

View File

@@ -0,0 +1,62 @@
#!/usr/bin/env python3
"""
Seed script az Economy 1 modulhoz: árfolyam paraméterek beszúrása a system.system_parameters táblába.
"""
import asyncio
import sys
from decimal import Decimal
sys.path.insert(0, "/app")
from sqlalchemy import select
from app.database import AsyncSessionLocal
from app.models.system import SystemParameter
async def seed_economy():
"""Árfolyam paraméterek beszúrása."""
parameters = [
{
"key": "EXCHANGE_RATE_EUR_HUF",
"value": "390.0",
"description": "EUR/HUF átváltási árfolyam (1 EUR = X HUF)",
"category": "finance",
"is_active": True,
},
{
"key": "EXCHANGE_RATE_USDC_HUF",
"value": "380.0",
"description": "USDC/HUF átváltási árfolyam (1 USDC = X HUF)",
"category": "finance",
"is_active": True,
},
]
async with AsyncSessionLocal() as session:
for param in parameters:
# Ellenőrizzük, hogy létezik-e már
existing = await session.execute(
select(SystemParameter).where(SystemParameter.key == param["key"])
)
existing = existing.scalar_one_or_none()
if existing:
print(f"⚠️ {param['key']} már létezik, kihagyva.")
continue
new_param = SystemParameter(
key=param["key"],
value=param["value"],
description=param["description"],
category=param["category"],
is_active=param["is_active"],
)
session.add(new_param)
print(f"{param['key']} beszúrva.")
await session.commit()
print("🎉 Árfolyam paraméterek sikeresen seedelve.")
if __name__ == "__main__":
asyncio.run(seed_economy())

View File

@@ -53,7 +53,7 @@ async def seed_expertises():
print("🌱 Szakmai címkék feltöltése...")
for key, name, cat in tags:
stmt = text("""
INSERT INTO data.expertise_tags (key, name_hu, category, is_official)
INSERT INTO marketplace.expertise_tags (key, name_hu, category, is_official)
VALUES (:k, :n, :c, true)
ON CONFLICT (key) DO UPDATE SET name_hu = EXCLUDED.name_hu, category = EXCLUDED.category
""")

View File

@@ -0,0 +1,123 @@
#!/usr/bin/env python3
"""
TCO (Total Cost of Ownership) alap költségkategóriák seedelése.
Rendszerszintű kategóriák (is_system=True) amelyek nem törölhetők.
"""
import asyncio
import sys
from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession
# A projekt gyökérből importáljuk a database modult
sys.path.insert(0, '/opt/docker/dev/service_finder/backend')
from app.database import AsyncSessionLocal
from app.models.vehicle import CostCategory
# A 10 alap TCO kategória definíciója
SYSTEM_CATEGORIES = [
{
"code": "FUEL",
"name": "Üzemanyag / Töltés",
"description": "Benzin, dízel, elektromos töltés, LPG, hidrogén"
},
{
"code": "MAINTENANCE",
"name": "Szerviz & Karbantartás",
"description": "Olajcsere, szűrők, fékbetét, futómű, egyéb szerviz munkák"
},
{
"code": "TIRES",
"name": "Gumiabroncsok",
"description": "Nyári/téli gumik, felni, kiegyensúlyozás, gumicsere"
},
{
"code": "INSURANCE",
"name": "Biztosítás",
"description": "KASCO, kötelező gépjármű-felelősségbiztosítás, casco, utasbiztosítás"
},
{
"code": "TAX",
"name": "Adók",
"description": "Gépjárműadó, forgalmi adó, közlekedési adó"
},
{
"code": "FEES",
"name": "Útdíj & Parkolás",
"description": "Autópálya matrica, parkolási díjak, városi belépési díjak"
},
{
"code": "ADMIN",
"name": "Hatósági díjak",
"description": "Műszaki vizsga, forgalmi engedély, okmányok, adminisztratív költségek"
},
{
"code": "FINANCE",
"name": "Finanszírozás",
"description": "Lízing díj, hiteltörlesztés, kamatok, banki költségek"
},
{
"code": "CLEANING",
"name": "Ápolás & Kozmetika",
"description": "Autómosás, polírozás, belső tisztítás, festékvédelem"
},
{
"code": "OTHER",
"name": "Egyéb",
"description": "Egyéb, nem besorolható költségek"
}
]
async def seed_tco_categories():
"""
Törli a meglévő kategóriákat és beszúrja a 10 rendszerszintű TCO kategóriát.
"""
print("🚀 TCO költségkategóriák seedelése...")
async with AsyncSessionLocal() as session:
try:
# 1. Tábla ürítése (TRUNCATE) - csak a seed kategóriák, ne érintse a felhasználói kategóriákat?
# Mivel most csak rendszerszintűek vannak, töröljük az összeset
print(" ↳ Tábla ürítése (TRUNCATE vehicle.cost_categories)...")
await session.execute(text("TRUNCATE TABLE vehicle.cost_categories RESTART IDENTITY CASCADE"))
await session.commit()
# 2. Kategóriák beszúrása
inserted = 0
for cat_data in SYSTEM_CATEGORIES:
category = CostCategory(
code=cat_data["code"],
name=cat_data["name"],
description=cat_data["description"],
is_system=True,
parent_id=None # Jelenleg nincs hierarchia, később bővíthető
)
session.add(category)
inserted += 1
await session.commit()
print(f"{inserted} rendszerszintű kategória beszúrva.")
# 3. Ellenőrzés
result = await session.execute(text("SELECT COUNT(*) FROM vehicle.cost_categories"))
count = result.scalar()
print(f" 📊 vehicle.cost_categories táblában jelenleg {count} sor van.")
# Listázás
result = await session.execute(text("SELECT code, name FROM vehicle.cost_categories ORDER BY code"))
rows = result.fetchall()
print(" 📋 Kategóriák listája:")
for code, name in rows:
print(f" - {code}: {name}")
except Exception as e:
await session.rollback()
print(f" ❌ Hiba történt: {e}")
raise
if __name__ == "__main__":
asyncio.run(seed_tco_categories())
print("🎉 TCO kategória seedelés sikeresen befejeződött.")