gemification_admin bekötve

This commit is contained in:
Roo
2026-06-30 08:56:55 +00:00
parent df4a0f07ff
commit cbfb955580
313 changed files with 18490 additions and 2895 deletions

View File

@@ -6,7 +6,7 @@ A rendszerparaméterek prioritásos felülbírálást támogatnak: User > Region
import logging
from typing import Optional, Any, Dict
from sqlalchemy import select, func # HOZZÁADVA: func a NOW() híváshoz
from sqlalchemy import select, func
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
@@ -60,7 +60,7 @@ class SystemService:
for scope_level, scope_id in scopes:
stmt = select(SystemParameter).where(
SystemParameter.key == key,
SystemParameter.scope_level == scope_level,
SystemParameter.scope_level == scope_level.value,
SystemParameter.is_active == True,
)
if scope_id is not None:
@@ -97,42 +97,65 @@ class SystemService:
"""
Létrehoz vagy frissít egy rendszerparamétert a megadott scope-ban.
Ha már létezik ugyanazzal a kulccsal, scope_level-lel és scope_id-vel, felülírja.
Megjegyzés: PostgreSQL-ben a UNIQUE constraint nem blokkolja a NULL scope_id-jű
duplikátumokat (mert NULL != NULL). Ezért kétlépéses megközelítést használunk:
először megpróbáljuk frissíteni a meglévő rekordot, és ha nem találjuk, beszúrjuk.
"""
from sqlalchemy.dialects.postgresql import insert
# UPSERT logika: ON CONFLICT DO UPDATE
insert_stmt = insert(SystemParameter).values(
key=key,
value=value,
scope_level=scope_level,
scope_id=scope_id,
category=category,
description=description,
last_modified_by=last_modified_by,
is_active=True,
# 1. lépés: Próbáljuk megkeresni a meglévő rekordot
stmt_find = select(SystemParameter).where(
SystemParameter.key == key,
SystemParameter.scope_level == scope_level.value,
SystemParameter.is_active == True,
)
upsert_stmt = insert_stmt.on_conflict_do_update(
constraint="uix_param_scope",
set_=dict(
if scope_id is not None:
stmt_find = stmt_find.where(SystemParameter.scope_id == scope_id)
else:
stmt_find = stmt_find.where(SystemParameter.scope_id.is_(None))
result = await db.execute(stmt_find)
existing = result.scalar_one_or_none()
if existing:
# 2a. lépés: Frissítjük a meglévő rekordot
existing.value = value
existing.category = category
existing.description = description
existing.last_modified_by = last_modified_by
existing.updated_at = func.now()
await db.commit()
return existing
else:
# 2b. lépés: Beszúrunk egy új rekordot
insert_stmt = insert(SystemParameter).values(
key=key,
value=value,
scope_level=scope_level.value,
scope_id=scope_id,
category=category,
description=description,
last_modified_by=last_modified_by,
updated_at=func.now(),
),
)
await db.execute(upsert_stmt)
await db.commit()
is_active=True,
)
await db.execute(insert_stmt)
await db.commit()
# Visszaolvassuk a létrehozott/frissített rekordot
stmt = select(SystemParameter).where(
SystemParameter.key == key,
SystemParameter.scope_level == scope_level,
SystemParameter.scope_id == scope_id,
)
result = await db.execute(stmt)
param = result.scalar_one()
return param
# Visszaolvassuk a létrehozott rekordot
stmt_read = select(SystemParameter).where(
SystemParameter.key == key,
SystemParameter.scope_level == scope_level.value,
SystemParameter.is_active == True,
)
if scope_id is not None:
stmt_read = stmt_read.where(SystemParameter.scope_id == scope_id)
else:
stmt_read = stmt_read.where(SystemParameter.scope_id.is_(None))
result = await db.execute(stmt_read)
param = result.scalar_one()
return param
# --- GLOBÁLIS PÉLDÁNY ÉS SEGÉDFÜGGVÉNYEK ---
# Ezek a fájl legszélén vannak (0-s behúzás), így kívülről importálhatóak!