Org-Parking
Un'applicazione leggera gestionale per i parcheggi aziendali, progettata per le organizzazioni. Offre un algoritmo di assegnazione equa, tracciamento delle presenze ed è ottimizzata per basse risorse.
Funzionalità
- Modello Centrato sull'Ufficio: I posti auto appartengono agli Uffici, non ai Manager o agli Utenti.
- Algoritmo di Assegnazione Equa: Gli utenti con il rapporto parcheggi/presenze più basso hanno la priorità.
- Tracciamento Presenze: Marcatura delle presenze basata su calendario (presente/remoto/assente).
- Regole di Chiusura Flessibili: Supporto per chiusure in date specifiche e chiusure settimanali ricorrenti per ufficio.
- Garanzie ed Esclusioni: Regole di parcheggio per utente gestite dagli amministratori dell'ufficio.
- Accesso Basato sui Ruoli:
- Admin: Controllo completo del sistema, creazione uffici, gestione utenti.
- Manager: Gestisce le impostazioni del proprio ufficio e il team.
- Impiegato: Segna presenza, visualizza calendario, controlla stato parcheggio.
- Basso Consumo di Memoria: Ottimizzato per piccoli server (<500MB RAM).
- Autenticazione: Auth JWT integrata o integrazione SSO con Authelia.
Architettura
app/
├── routes/ # API endpoints
│ ├── auth.py # Autenticazione
│ ├── users.py # Gestione utenti
│ ├── offices.py # Gestione uffici (quote, regole)
│ ├── presence.py # Marcatura presenze
│ └── parking.py # Logica di assegnazione
└── config.py # Configurazione
database/
├── models.py # Modelli SQLAlchemy ORM
└── connection.py # Setup Database
frontend/ # Frontend Vanilla JS pulito
├── pages/ # Viste HTML
├── js/ # Moduli logici
└── css/ # Stili
Guida Rapida
Sviluppo Locale
-
Setup Ambiente:
python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt -
Avvio Server:
python main.pyAccedi a
http://localhost:8000
Deployment Docker (Consigliato)
Questa applicazione è ottimizzata per ambienti con risorse limitate (es. Raspberry Pi, piccoli VPS).
-
Build:
docker compose build -
Run:
docker compose up -dNota sull'Uso della Memoria: Il
Dockerfileè configurato per eseguireuvicorncon--workers 1per minimizzare l'uso della memoria (~50MB in idle). Se in esecuzione su un server più grande, puoi rimuovere questo flag nelDockerfile.
Configurazione
Copia .env.example in .env e configura:
| Variabile | Descrizione | Default |
|---|---|---|
SECRET_KEY |
Richiesto. Chiave cripto per JWT. | "" (Esce se mancante) |
DATABASE_URL |
Vedi docs SQLAlchemy. | sqlite:///data/parking.db |
AUTHELIA_ENABLED |
Abilita supporto header SSO. | false |
SMTP_ENABLED |
Abilita notifiche email. | false |
LOG_LEVEL |
Verbosità log. | INFO |
Algoritmo di Equità
I posti auto vengono assegnati giornalmente basandosi su un rapporto di equità:
Rapporto = (Giorni Parcheggiati con successo) / (Giorni di Presenza in ufficio)
- Gli utenti Garantiti vengono assegnati per primi.
- I posti Rimanenti sono distribuiti agli utenti presenti iniziando da chi ha il rapporto più basso.
- Gli utenti Esclusi non ricevono mai un posto.
API Endpoints
Di seguito la lista delle chiamate API disponibili suddivise per modulo.
Auth (/api/auth)
Gestione autenticazione e sessione.
POST /register: Registrazione nuovo utente (Disabilitato se Authelia è attivo).POST /login: Login con email e password (ritorna token JWT/cookie).POST /logout: Logout e invalidazione sessione.GET /me: Ritorna informazioni sull'utente corrente.GET /config: Ritorna la configurazione pubblica di autenticazione.GET /holidays/{year}: Ritorna i giorni festivi per l'anno specificato.
Users (/api/users)
Gestione utenti e profili.
GET /: Lista di tutti gli utenti (Solo Admin).POST /: Crea un nuovo utente (Solo Admin).GET /{user_id}: Dettaglio di un utente specifico (Solo Admin).PUT /{user_id}: Aggiorna dati di un utente (Solo Admin).DELETE /{user_id}: Elimina un utente (Solo Admin).GET /me/profile: Ottieni il proprio profilo.PUT /me/profile: Aggiorna il proprio profilo.GET /me/settings: Ottieni le proprie impostazioni.PUT /me/settings: Aggiorna le proprie impostazioni.POST /me/change-password: Modifica la propria password.GET /me/exclusion: Lista delle proprie auto-esclusioni.POST /me/exclusion: Crea una nuova auto-esclusione.PUT /me/exclusion/{exclusion_id}: Modifica una auto-esclusione.DELETE /me/exclusion/{exclusion_id}: Elimina una auto-esclusione.
Offices (/api/offices)
Gestione uffici, regole di chiusura e quote.
GET /: Lista di tutti gli uffici.POST /: Crea un nuovo ufficio (Solo Admin).GET /{office_id}: Dettagli di un ufficio.PUT /{office_id}: Aggiorna configurazione ufficio (Solo Admin).DELETE /{office_id}: Elimina un ufficio (Solo Admin).GET /{office_id}/users: Lista utenti assegnati all'ufficio.GET /{office_id}/closing-days: Lista giorni di chiusura specifici.POST /{office_id}/closing-days: Aggiungi giorno di chiusura.DELETE /{office_id}/closing-days/{id}: Rimuovi giorno di chiusura.GET /{office_id}/weekly-closing-days: Lista giorni di chiusura settimanali (es. Sabato/Domenica).POST /{office_id}/weekly-closing-days: Aggiungi giorno di chiusura settimanale.DELETE /{office_id}/weekly-closing-days/{id}: Rimuovi giorno di chiusura settimanale.GET /{office_id}/guarantees: Lista utenti con posto garantito.POST /{office_id}/guarantees: Aggiungi garanzia posto.DELETE /{office_id}/guarantees/{id}: Rimuovi garanzia.GET /{office_id}/exclusions: Lista utenti esclusi dal parcheggio.POST /{office_id}/exclusions: Aggiungi esclusione.DELETE /{office_id}/exclusions/{id}: Rimuovi esclusione.
Presence (/api/presence)
Gestione presenze giornaliere.
POST /mark: Segna la propria presenza per una data (Presente/Remoto/Assente).GET /my-presences: Lista delle proprie presenze.DELETE /{date}: Rimuovi la propria presenza per una data.POST /admin/mark: Segna presenza per un altro utente (Manager/Admin).DELETE /admin/{user_id}/{date}: Rimuovi presenza di un altro utente (Manager/Admin).GET /team: Visualizza presenze e stato parcheggio del team.GET /admin/{user_id}: Storico presenze di un utente (Manager/Admin).POST /admin/clear-office-presence: Pulisce presenze e parcheggi di un ufficio per un range di date (Test/Admin).
Parking (/api/parking)
Gestione assegnazioni posti auto.
POST /init-office-pool: Inizializza i posti disponibili per un giorno.GET /assignments/{date}: Lista assegnazioni per una data.GET /my-assignments: Le mie assegnazioni parcheggio.POST /run-allocation: Esegui manualmente l'algoritmo di assegnazione per una data.POST /clear-assignments: Cancella tutte le assegnazioni per una data.POST /manual-assign: Assegna manualmente un posto a un utente.POST /reassign-spot: Riassegna o libera un posto già assegnato.POST /release-my-spot/{id}: Rilascia il proprio posto assegnato.GET /eligible-users/{id}: Lista utenti idonei a ricevere un posto riassegnato.POST /test-email: Invia email di test (Test Tool).
Reports (/api/reports)
Esportazione dati.
GET /team-export: Esporta dati presenze e parcheggi del team in Excel.
Utilizzo con AUTHELIA
Org-Parking supporta l'integrazione nativa con Authelia (o altri provider SSO compatibili con Forward Auth). Questo permette il Single Sign-On (SSO) e la gestione centralizzata degli utenti.
Configurazione
-
Abilita Authelia: Nel file
.env, impostaAUTHELIA_ENABLED=true. -
Configura gli Header del Proxy: Assicurati che il tuo reverse proxy (es. Traefik, Nginx) passi i seguenti header all'applicazione dopo l'autenticazione:
Remote-User: Username dell'utente (spesso uguale all'email).Remote-Email: Email dell'utente.Remote-Name: Nome completo dell'utente (Opzionale).Remote-Groups: Gruppi di appartenenza (separati da virgola).
-
Gestione Admin: L'applicazione assegna automaticamente il ruolo di Admin agli utenti che appartengono al gruppo specificato nella variabile
AUTHELIA_ADMIN_GROUP(default:parking_admins).- Se un utente viene rimosso da questo gruppo su Authelia, perderà i privilegi di admin al login successivo.
- Gli altri ruoli (Manager, Employee) e l'assegnazione agli uffici vengono gestiti manualmente all'interno di Org-Parking da un amministratore.
Comportamento
- Creazione Utenti: Gli utenti vengono creati automaticamente nel database di Org-Parking al loro primo accesso riuscito tramite Authelia.
- Login/Logout: Le pagine di login e registrazione interne vengono disabilitate o reindirizzano al portale SSO.
- Password: Org-Parking non gestisce le password in questa modalità; l'autenticazione è interamente delegata al provider esterno.
- Sicurezza: L'applicazione si fida degli header
Remote-*solo seAUTHELIA_ENABLEDè attivo. Assicurarsi che il container non sia esposto direttamente a internet senza passare per il proxy di autenticazione.
Note di Deployment
- Database: SQLite è usato di default per semplicità e basso overhead. I dati persistono in
./data/parking.db. - Sicurezza:
- Rate limiting è attivo sugli endpoint sensibili (Login/Register).
- Le password sono hashate con Bcrypt.
- L'autenticazione via cookie è sicura di default.
Risoluzione Problemi Comuni
Errore: "Il reindirizzamento è stato determinato per essere non sicuro"
Questo errore appare se si tenta di accedere all'applicazione tramite HTTP (es. http://lvh.me:8000) mentre Authelia è su HTTPS. Authelia blocca i reindirizzamenti verso protocolli non sicuri.
Soluzione: Accedere all'applicazione tramite il Reverse Proxy (Caddy) usando HTTPS, ad esempio https://parking.lvh.me. Assicurarsi che Caddy sia configurato per gestire il dominio e l'autenticazione.
Licenza
MIT