feat(5.20): US-004/005/006/009 ingestie+API+worker+import pe mediu RAR
US-004: rezolva_rar_env (cerere>default cont>ancora globala) + MediuIndisponibil + cod RAR_MEDIU_INDISPONIBIL. US-005: camp rar_env pe POST /v1/prezentari + /valideaza (Literal), echo in SubmissionResult/ValidareResult/GET, build_key + INSERT env-aware. US-006: AccountSessions re-cheiat (account_id, rar_env); RarClient base_url per env; creds din slotul env; purge + recover_orphans scoped pe env (E1/1a, 1b/E6); claim_one propaga rar_env (1c/E8); keepalive pe ancora globala (M2). US-009: selector mediu la import (>=2 medii), eticheta la 1, banner la 0; commit seteaza rar_env pe submissions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -89,3 +89,68 @@ def medii_disponibile_cont(conn: sqlite3.Connection, account_id: int) -> list[st
|
||||
|
||||
def rar_env_efectiv_cont(conn: sqlite3.Connection, account_id: int) -> str | None:
|
||||
return rar_env_efectiv(load_account_env(conn, account_id))
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------- #
|
||||
# Exceptie si rezolvator de mediu tinta (US-004, dependent de US-002) #
|
||||
# --------------------------------------------------------------------------- #
|
||||
|
||||
class MediuIndisponibil(Exception):
|
||||
"""Mediul RAR cerut e valid dar nu e disponibil pentru contul dat.
|
||||
|
||||
Atribute
|
||||
--------
|
||||
env: mediul cerut (ex. 'test')
|
||||
disponibile: lista mediilor disponibile pentru cont in momentul erorii
|
||||
"""
|
||||
|
||||
def __init__(self, env: str, disponibile: list[str]) -> None:
|
||||
self.env = env
|
||||
self.disponibile = disponibile
|
||||
super().__init__(
|
||||
f"mediu indisponibil: {env!r} (disponibile: {disponibile!r})"
|
||||
)
|
||||
|
||||
|
||||
def rezolva_rar_env(
|
||||
conn: sqlite3.Connection,
|
||||
account_id: int,
|
||||
cerut: str | None = None,
|
||||
) -> str:
|
||||
"""Determina mediul RAR tinta pentru un submission la ingestie.
|
||||
|
||||
Precedenta stricta (de la cea mai mare la cea mai mica):
|
||||
1. `cerut` explicit si disponibil -> intoarce `cerut`.
|
||||
2. `cerut` explicit dar indisponibil -> ridica MediuIndisponibil.
|
||||
3. `cerut` invalid (nu in VALID_ENVS) -> ridica ValueError (fara fallback silentios).
|
||||
4. `cerut` None -> incearca rar_env_efectiv_cont (default-ul contului).
|
||||
5. Daca contul nu are niciun mediu disponibil (rar_env_efectiv_cont == None)
|
||||
-> cade pe ancora globala get_settings().rar_env, normalizata la VALID_ENVS.
|
||||
Acest fallback e intentionat (PRD 5.20 §2 Non-Goals): AUTOPASS_RAR_ENV ramane
|
||||
ancora de migrare si fallback pentru actiuni fara cont (keepalive, canal API cu
|
||||
creds efemere pe conturi nou-create fara medii configurate).
|
||||
|
||||
Ridica
|
||||
------
|
||||
ValueError -- `cerut` nu e in VALID_ENVS
|
||||
MediuIndisponibil -- `cerut` e valid dar nu e disponibil pentru cont
|
||||
"""
|
||||
if cerut is not None:
|
||||
if cerut not in VALID_ENVS:
|
||||
raise ValueError(f"mediu invalid: {cerut!r}")
|
||||
disp = medii_disponibile_cont(conn, account_id)
|
||||
if cerut not in disp:
|
||||
raise MediuIndisponibil(cerut, disp)
|
||||
return cerut
|
||||
|
||||
# cerut e None: incearca default-ul contului
|
||||
efectiv = rar_env_efectiv_cont(conn, account_id)
|
||||
if efectiv is not None:
|
||||
return efectiv
|
||||
|
||||
# Ancora globala: 0 medii disponibile pe cont -> fallback la AUTOPASS_RAR_ENV.
|
||||
from .config import get_settings
|
||||
global_env = get_settings().rar_env
|
||||
if global_env in VALID_ENVS:
|
||||
return global_env
|
||||
return "test" # rar_env invalid in config -> cel mai sigur default
|
||||
|
||||
Reference in New Issue
Block a user