Här är en sammanfattning av arkitekturen och besluten vi spikat, redo att användas som specifikation när du börjar koda. ### 1. Teknikstack * **Backend:** Django (Micro-framework stil, allt i en fil). * **Databas:** SQLite (med WAL-mode aktiverat för prestanda). * **Frontend:** Django Templates + **HTMX** (för SPA-känsla utan build-steg). * **Server:** Gunicorn (kör appen) bakom **Caddy** (hanterar HTTPS och statiska filer). ### 2. Filstruktur & Setup Projektet består primärt av **en enda Python-fil** (`quiz.py`) som innehåller: * Django Settings. * Modeller (`User`, `Question`, `Option`, `QuizResult`). * Vyer & URLs. * HTML-templates (som skrivs till disk vid start). * Import-logik. **Mappstruktur:** ```text / ├── quiz.py # Hela applikationen ├── db.sqlite3 # Databasen └── static/ # Genereras av collectstatic ``` Gamla Tentor/YYYY-mm-dd/nn.md från obsidian ### 3. Nyckelfunktioner #### A. Dataimport (Markdown) * **Källa:** Läser `.md`-filer från `import_folder`. * **Trigg:** Sker automatiskt i `AppConfig.ready()` när servern startar. * **Logik:** Använder filsökvägen som ID för att uppdatera frågor snarare än att skapa dubbletter. #### B. Användare (Lazy Auth) * Ingen inloggningsskärm. * **Middleware:** Skapar automatiskt en osynlig `User` och loggar in besökaren om de är anonyma. #### C. Quiz-flöde * Sidan laddas inte om. * `index.html` startar quizet. * Svar skickas via HTMX (`hx-post`) -> Servern validerar -> Returnerar nästa fråga (`partials/question.html`) som byts ut i DOM:en. ### 4. Deployment & Drift #### Gitea Action (Deploy) Ingen `pm2`. Vi dödar och startar om processen med enkla shell-kommandon: ```bash pkill -f "gunicorn quiz:application" || true nohup gunicorn quiz:application --workers 3 --bind 127.0.0.1:8000 > app.log 2>&1 & ``` #### Caddy (Reverse Proxy) Hanterar SSL och avlastar Python från att servera statiska filer. ```caddy din-domän.se { root * /sökväg/till/static file_server /static/* reverse_proxy 127.0.0.1:8000 } ``` #### Databassäkerhet För att undvika "Database locked" vid omstarter/concurrent writes: ```sql PRAGMA journal_mode = WAL; ```