refaktorálás javításai
This commit is contained in:
@@ -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
|
||||
))
|
||||
|
||||
|
||||
@@ -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())
|
||||
62
backend/app/tests_internal/seeds/seed_economy.py
Normal file
62
backend/app/tests_internal/seeds/seed_economy.py
Normal 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())
|
||||
@@ -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
|
||||
""")
|
||||
|
||||
123
backend/app/tests_internal/seeds/seed_tco_categories.py
Normal file
123
backend/app/tests_internal/seeds/seed_tco_categories.py
Normal 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.")
|
||||
Reference in New Issue
Block a user