atlas-academy/docs/COURSES.md
Atlas Developer 03829a38b2 feat: Atlas Academy — Odoo eLearning platform, full fusion
9-course Dutch e-learning platform fused onto atlasacademy.nl via Caddy
reverse proxy. Odoo 19 Community as course engine (website_slides), static
HTML for marketing front. Single Odoo account system.

- static/: 8 marketing pages (index, pricing, coaching, leerpad, over, shop, bisl, esf)
- backend/odoo_relay.py: lead relay Flask service (POST /academy-lead → Odoo CRM)
- caddy/academy.caddyfile: full Caddy config with Odoo proxy + auth rewrites
- docs/: ARCHITECTURE, USERFLOW, COURSES, DEPLOYMENT, SECURITY, ODOO

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 00:48:45 +02:00

169 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Cursusstructuur — Atlas Academy
## Catalogus
| ID | Naam | Slug | Secties | Lessen | Quizvragen | Cover kleur |
|----|------|------|---------|--------|------------|-------------|
| 1 | Praktijktraining Lean | `praktijktraining-lean-1` | 2 | 7 | 21 | `#1a4fa0` |
| 2 | Sales vanaf Nul | `sales-vanaf-nul-2` | 2 | 10 | 30 | `#0f7a3d` |
| 3 | Netwerken & Relaties | `netwerken-relaties-3` | 1 | 5 | 12 | `#7b2d8b` |
| 4 | Strategisch Denken | `strategisch-denken-4` | 2 | 9 | 26 | `#c47a1e` |
| 5 | Alles Automatiseren met AI | `alles-automatiseren-met-ai-5` | 1 | 5 | 15 | `#1a8a8a` |
| 6 | IT-Basis & Manier van Denken | `it-basis-manier-van-denken-6` | 1 | 3 | 9 | `#8a3a1a` |
| 7 | Business & Juridisch | `business-juridisch-7` | 1 | 3 | 9 | `#2a6a8a` |
| 8 | Marketing & Funnels | `marketing-funnels-8` | 1 | 4 | 12 | `#8a1a4a` |
| 9 | Startup & Groei | `startup-groei-9` | 2 | 7 | 19 | `#3a7a1a` |
**Totaal:** 53 lessen · 153 quizvragen
URL-patroon: `https://atlasacademy.nl/slides/<slug>`
---
## Cursusstructuur (Odoo-modellen)
### `slide.channel` — Cursus
```python
{
'name': 'Sales vanaf Nul',
'website_id': 3, # Atlas Academy
'website_published': True,
'website_slug': 'sales-vanaf-nul-2',
'cover_properties': '{"background-color": "#0f7a3d", ...}',
'channel_type': 'documentation',
}
```
### `slide.slide` — Sectie (is_category=True)
```python
{
'channel_id': 2,
'name': 'Deel 1: Mindset & Voorbereiding',
'is_category': True,
'sequence': 1,
}
```
### `slide.slide` — Les (artikel)
```python
{
'channel_id': 2,
'name': 'Les 1 — De verkoper als adviseur',
'slide_category': 'article',
'is_category': False,
'category_id': <sectie-id>,
'html_content': '<p>Theorie tekst...</p>',
'sequence': 2,
'website_published': True,
}
```
### `slide.question` — Quizvraag
```python
{
'slide_id': <les-id>,
'question': 'Wat is het primaire doel van een adviseur-verkoper?',
}
```
### `slide.answer` — Antwoordoptie
```python
{
'question_id': <vraag-id>,
'text_value': 'Vertrouwen opbouwen en de klant echte waarde bieden',
'is_correct': True,
'comment': 'Een adviseur-verkoper stelt klantbelang centraal.',
}
```
---
## Cursus bouwen via ORM shell
```python
# save als /tmp/build_cursus.py, dan:
# ssh atlas-01 "docker exec -i atlas-odoo odoo shell -d atlas --no-http < /tmp/build_cursus.py"
env = env # Odoo shell
# 1. Cursus aanmaken
channel = env['slide.channel'].sudo().create({
'name': 'Mijn Nieuwe Cursus',
'website_id': 3,
'website_published': True,
'channel_type': 'documentation',
})
# 2. Sectie toevoegen
sectie = env['slide.slide'].sudo().create({
'channel_id': channel.id,
'name': 'Deel 1: Introductie',
'is_category': True,
'sequence': 1,
})
# 3. Les toevoegen
les = env['slide.slide'].sudo().create({
'channel_id': channel.id,
'name': 'Les 1 — Overzicht',
'slide_category': 'article',
'is_category': False,
'category_id': sectie.id,
'html_content': '<p>Theorie...</p>',
'sequence': 2,
'website_published': True,
})
# 4. Quizvraag + antwoorden
vraag = env['slide.question'].sudo().create({
'slide_id': les.id,
'question': 'Wat leer je in les 1?',
})
for tekst, correct, uitleg in [
('Optie A', True, 'Correct omdat...'),
('Optie B', False, 'Fout omdat...'),
('Optie C', False, 'Fout omdat...'),
]:
env['slide.answer'].sudo().create({
'question_id': vraag.id,
'text_value': tekst,
'is_correct': correct,
'comment': uitleg,
})
env.cr.commit()
print(f"Cursus aangemaakt: /slides/{channel.website_slug}")
```
---
## Content-richtlijnen
- **Theorie per les:** 300500 woorden, plain HTML (`<h2>`, `<p>`, `<ul>`)
- **Quizvragen per les:** minimaal 3, maximaal 5
- **Antwoordopties:** altijd 3, precies 1 correct
- **Uitleg:** altijd een `comment` bij elke optie (leermoment)
- **Toon:** generiek en professioneel — niet Chaib-centric, voor de community
- **Taal:** Nederlands
---
## Slug-conventie
`<naam-in-kebab-case>-<channel-id>`
Voorbeeld: channel ID 4, naam "Strategisch Denken" → `strategisch-denken-4`
Odoo genereert de slug automatisch op basis van de naam bij aanmaken.
---
## ESF / BiSL (apart, nog te migreren)
| Pagina | Status | Doel |
|--------|--------|------|
| `bisl.html` | Statisch (actief) | BiSL Foundation examentrainer (custom engine) |
| `bisl_examen.html` | Statisch (actief) | ~82-97 vragen, eigen JS-quizengine |
| `esf.html` | Statisch, noindex | Persoonlijk ITMG ESF-studieoverzicht |
Migratie naar Odoo eLearning is gepland maar niet launch-blocking.