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>
169 lines
4.6 KiB
Markdown
169 lines
4.6 KiB
Markdown
# 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:** 300–500 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.
|