From 4b1f9082bf1ece70de21a64b234704bc2bb104c2 Mon Sep 17 00:00:00 2001 From: Johan Dahlin Date: Sun, 21 Dec 2025 14:40:49 +0100 Subject: [PATCH] vault backup: 2025-12-21 14:40:49 --- content/.obsidian/workspace.json | 9 +++-- content/z-Tech/Quiz-app.md | 69 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 content/z-Tech/Quiz-app.md diff --git a/content/.obsidian/workspace.json b/content/.obsidian/workspace.json index e9d0980..ebb4e48 100644 --- a/content/.obsidian/workspace.json +++ b/content/.obsidian/workspace.json @@ -13,13 +13,13 @@ "state": { "type": "markdown", "state": { - "file": "Anatomi & Histologi 2/Gamla tentor/2022-01-15/1.md", + "file": "Anatomi & Histologi 2/Schema.md", "mode": "source", - "source": true, + "source": false, "backlinks": false }, "icon": "lucide-file", - "title": "1" + "title": "Schema" } } ] @@ -213,9 +213,10 @@ }, "active": "baa45c5e57825965", "lastOpenFiles": [ + "z-Tech/Quiz-app.md", + "Anatomi & Histologi 2/Gamla tentor/2022-01-15/1.md", "Anatomi & Histologi 2/Gamla tentor/2022-01-15/!2022-01-15-0032-BWD.pdf", "Anatomi & Histologi 2/Gamla tentor/2022-01-15/!2022-01-15-0032-BWD.md", - "Anatomi & Histologi 2/Gamla tentor/2022-01-15/1.md", "Anatomi & Histologi 2/Gamla tentor/2025-06-03/24.md", "Anatomi & Histologi 2/Gamla tentor/2025-06-03/25.md", "Anatomi & Histologi 2/Gamla tentor/2025-06-03/30.md", diff --git a/content/z-Tech/Quiz-app.md b/content/z-Tech/Quiz-app.md new file mode 100644 index 0000000..12d1bc3 --- /dev/null +++ b/content/z-Tech/Quiz-app.md @@ -0,0 +1,69 @@ + +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; +``` +