HomeProgettiServiziTecnologieGuideContatti

Portale Clienti Toscana Stampaggi.

Ho progettato e sviluppato da solo il portale clienti di Toscana Stampaggi: un backend Django e PostgreSQL che serve il backoffice Unfold per gli operatori, il portale web per i clienti e un'API a token per l'app Flutter, tutto in produzione su VPS con Docker, HTTPS e monitoraggio.

Toscana Stampaggi logo
Periodo
2026 - In corso
Ruolo
Full Stack Developer
Ambito
Portale clienti e app mobile
Cliente
Toscana Stampaggi

01 / Il progetto

Da dove siamo partiti.

  1. 01

    Contesto

    Lo stato degli ordini veniva comunicato ai clienti per telefono o via email. L'azienda voleva un accesso riservato, sempre disponibile, in cui ogni cliente vedesse solo i propri ordini, consegne e cantieri; nella prima versione gli ordini vengono inseriti dagli operatori, senza collegamento diretto al gestionale.

  2. 02

    Obiettivo

    Costruire un unico backend che alimentasse tre canali (backoffice, portale web, app mobile) con le stesse regole di dominio e gli stessi numeri, mantenendo l'architettura pronta per una futura integrazione con il gestionale aziendale.

  3. 03

    Sfida

    L'isolamento dei dati tra clienti doveva essere strutturale e non affidato alle singole viste: un cliente non deve poter vedere ordini di un'altra azienda nemmeno manipolando URL, ID o parametri. Allo stesso tempo, concetti come "in ritardo", "urgente" o "imminente" dovevano essere calcolati in un solo punto, perché dashboard, liste, calendario, API e app restassero sempre allineati.

02 / Il mio contributo

Cosa ho realizzato.

  1. 01

    Ho impostato il backend Django a livelli: le viste non contengono logica di dominio e la chiedono a selector (letture già filtrate per utente), services (scritture con controllo permessi e storico), policies (chi può accedere a cosa) e rules (regole di dominio).

  2. 02

    Ho scritto le regole degli ordini in due forme equivalenti, un filtro Q per le query e una funzione sul singolo ordine, con soglie configurabili da settings (ORDER_RULES) e validate da system check di Django all'avvio, così un refuso blocca l'avvio invece di falsare i contatori.

  3. 03

    Ho garantito l'isolamento facendo partire ogni lettura da un'unica policy che restituisce solo gli ordini delle aziende collegate all'utente: il selettore azienda risponde 403 su aziende non collegate, i filtri ignorano cantieri di altri clienti e ogni vista o endpoint ha il suo test di isolamento.

  4. 04

    Ho modellato i dati con utenti personalizzati e ruoli separati (staff o cliente, mai entrambi, imposto dai manager ORM), aziende con più utenti collegati, cantieri, allegati e uno storico immutabile delle modifiche, di cui il cliente vede solo stato, date e allegati.

  5. 05

    Ho personalizzato il backoffice con Django Unfold, con dashboard per gli operatori, e realizzato il portale clienti con template Django, grafici SVG generati lato server, tema chiaro/scuro e JavaScript usato solo come miglioramento progressivo.

  6. 06

    Ho sviluppato l'API REST per l'app mobile con Django REST Framework e token Knox (revoca, logout da tutti i dispositivi, limite di dispositivi per utente) e l'app Flutter per iOS e Android, che non ricalcola le regole ma usa quelle del backend; un test verifica che la dashboard dell'API restituisca gli stessi numeri del portale.

  7. 07

    Ho curato la sicurezza: password Argon2, django-axes contro i tentativi ripetuti di login (blocco per username, risposta 429), allegati serviti solo da una vista che controlla i permessi e mai direttamente dal web server, header di sicurezza e HSTS in produzione.

  8. 08

    Ho messo il progetto in produzione su VPS con Docker Compose (gunicorn, PostgreSQL e Caddy su reti separate, solo Caddy esposto con HTTPS Let's Encrypt), con rilasci per tag, backup automatico prima di ogni deploy e rollback alla versione precedente.

  9. 09

    Ho aggiunto il monitoraggio con Prometheus, Grafana, Loki e Alloy (metriche di macchina, container, Caddy e PostgreSQL, controllo del login e del certificato, avvisi e log centralizzati), raggiungibile solo dalla rete Tailscale.

  10. 10

    Ho coperto il codice con circa 250 test pytest, lint con Ruff, una CI su GitHub Actions e una collection Postman con report HTML per testare l'API.

03 / Stack utilizzato

  • Python
  • Django
  • Django REST
  • PostgreSQL
  • Flutter
  • Docker
  • Caddy
  • Prometheus
  • Grafana

Approfondisci:Python Django REST PostgreSQL Docker

04 / Risultati

Cosa è cambiato.

Iniziamo

Ti serve qualcosa di simile?