RAS/Dynamic Legacy Flow (As-Is)
1) Flusso end-to-end (vecchio progetto incoming/safeops1)
- Selezione contesto:
GET /ras/nuovo (RASCompView.nuovo) mostra clienti idonei.
- Regole: cliente deve essere Condominio (
TIPO_CONDOMINI_ID=3) e non avere gia un RAS in categoria CAT_RAS_ID=6.
- Creazione istanza:
POST /ras/nuovo crea DocumentoIstanza con cliente_id, tipo_id, modello_id.
- Redirect a
GET /ras/compila/<istanza_id> (RASCompView.panel).
- Apertura compilazione:
- Template host:
app/templates/appbuilder/dynamic/ras_compila.html.
- Carica pack statico
app/static/ras/ras_pack_hotfix35_finalize_zip.html con query:
istanza_id
api_base=/ras/api
csrf
- Caricamento schema+risposte:
- UI pack chiama
GET /ras/api/export?istanza_id=....
- Backend prepara:
schema (con fallback da ModelloDocumentoSchema)
sections (albero ordinato)
questionsBySection
answers (DB + merge draft server)
photo_tray
- Compilazione live:
GET /ras/api/section per sezione corrente.
POST /ras/api/save e POST /ras/api/bulk_save per risposte.
POST /ras/api/draft_save + GET /ras/api/draft_load per bozza versionata (rev con conflict 409).
POST /ras/api/upload_blob + GET /ras/api/image_url + GET /ras/api/object per media.
- Finalizzazione:
- Pulsante
Finalizza nel template host.
POST /ras/finalizza/<istanza_id>:
- costruisce
pack.json finale (_build_final_pack_payload)
- crea ZIP (
pack.json + photos + manifest) via _make_final_zip_bytes
- upload ZIP su MinIO
- enqueue pipeline PDF (Celery) tramite
DocumentActions.generate
- redirect a
/ras/status/<istanza_id>
- Stato finale:
GET /ras/status/<istanza_id> mostra stato ZIP/PDF.
2) Dipendenze reali (vecchio progetto)
- View principale:
incoming/safeops1/app/views/ras_compile.py (class RASCompView).
- Template host compilazione:
incoming/safeops1/app/templates/appbuilder/dynamic/ras_compila.html.
- Pack UI:
incoming/safeops1/app/static/ras/ras_pack_hotfix35_finalize_zip.html.
- Modelli core:
DocumentoIstanza, RispostaDocumento, ModelloDocumento, ModelloDocumentoSchema, RasInstanceLease in incoming/safeops1/app/models/models_dynamic.py
RasDraftHead, RasDraftVersion, RasPresence in incoming/safeops1/app/models/ras_draft.py
- Storage/infra:
- MinIO per media e ZIP finale
- Celery per generazione PDF finale
- Sicurezza/permessi:
- controllo ruolo/profile (
admin, tecnico, etc.) e guardia su modello in draft (_guard_draft_access)
- lease/checkout con token (header
X-RAS-Lease-Token) per scritture concorrenti.
3) Regole operative importanti (as-is)
- Canonicalizzazione
question_id (sigillo qid) per evitare collisioni tra sezioni.
bulk_save con strategia robusta su race condition (IntegrityError + retry + last-write-wins su _ts).
- Draft server con
rev:
- mismatch
base_rev => 409 conflict con server_rev.
- Finalizza bloccata se ci sono immagini
local: non ancora sincronizzate su server.
- Accesso a istanza legato a cliente/ruolo + blocco su modello
draft per ruoli non autorizzati.
- Endpoints extra usati dal pack: lease (
status/acquire/renew/release), whoami, progress, reset, import, libretto/anagrafica.
4) Delta principale verso il progetto corrente (SafeOps)
- Nel progetto corrente il bridge copre i principali endpoint runtime:
export/section/save/bulk_save/draft_load/draft_save/upload_blob/image_url/object/libretto/anagrafica/finalizza;
- lease/checkout (
status/acquire/renew/release);
progress, import, reset.
finalizza corrente:
- crea snapshot JSON e
DocumentoVersion;
- per
RAS accoda anche la generazione stampa finale in Celery (libretto + schede allegato).
- Rispetto al legacy storico:
- non viene piu prodotto lo ZIP finale
pack.json + photos + manifest come output primario del flusso utente.