gemification_admin bekötve
This commit is contained in:
@@ -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!
|
||||
|
||||
Reference in New Issue
Block a user