Vai al contenuto

RAS/Dynamic Legacy Flow (As-Is)

1) Flusso end-to-end (vecchio progetto incoming/safeops1)

  1. Selezione contesto:
  2. GET /ras/nuovo (RASCompView.nuovo) mostra clienti idonei.
  3. Regole: cliente deve essere Condominio (TIPO_CONDOMINI_ID=3) e non avere gia un RAS in categoria CAT_RAS_ID=6.
  4. Creazione istanza:
  5. POST /ras/nuovo crea DocumentoIstanza con cliente_id, tipo_id, modello_id.
  6. Redirect a GET /ras/compila/<istanza_id> (RASCompView.panel).
  7. Apertura compilazione:
  8. Template host: app/templates/appbuilder/dynamic/ras_compila.html.
  9. Carica pack statico app/static/ras/ras_pack_hotfix35_finalize_zip.html con query:
  10. istanza_id
  11. api_base=/ras/api
  12. csrf
  13. Caricamento schema+risposte:
  14. UI pack chiama GET /ras/api/export?istanza_id=....
  15. Backend prepara:
  16. schema (con fallback da ModelloDocumentoSchema)
  17. sections (albero ordinato)
  18. questionsBySection
  19. answers (DB + merge draft server)
  20. photo_tray
  21. Compilazione live:
  22. GET /ras/api/section per sezione corrente.
  23. POST /ras/api/save e POST /ras/api/bulk_save per risposte.
  24. POST /ras/api/draft_save + GET /ras/api/draft_load per bozza versionata (rev con conflict 409).
  25. POST /ras/api/upload_blob + GET /ras/api/image_url + GET /ras/api/object per media.
  26. Finalizzazione:
  27. Pulsante Finalizza nel template host.
  28. POST /ras/finalizza/<istanza_id>:
  29. costruisce pack.json finale (_build_final_pack_payload)
  30. crea ZIP (pack.json + photos + manifest) via _make_final_zip_bytes
  31. upload ZIP su MinIO
  32. enqueue pipeline PDF (Celery) tramite DocumentActions.generate
  33. redirect a /ras/status/<istanza_id>
  34. Stato finale:
  35. 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.