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.
5) Runtime corrente e fallback parcheggiato
Runtime principale SafeOps:
route host: /dynamic/compila/<documento_id>;
view: DynamicDocumentBuilderView.compila;
template host: app/templates/appbuilder/custom/dynamic_compila.html;
pack iframe: app/static/ras/ras_pack_hotfix35_finalize_zip.html.
legacy_dynamic_compila.html non e' il runtime principale: resta un riferimento storico/compatibilita' e non deve ricevere nuove evoluzioni funzionali.
Il parametro pack_variant=legacy del template host carica app/static/ras/ras_pack_hotfix35_legacy_parked.html. Quel file e' un fallback parcheggiato per diagnosi/rollback controllato, non il percorso ordinario.
Per produzione e tablet/offline, sviluppare e validare solo il runtime principale. Il fallback legacy va usato solo con URL esplicito e dopo verifica tecnica.
Torna su