# Lokale ontwikkeling ## Ondersteunde omgeving - Linux, macOS of WSL2; - Python 3.12 of 3.13; - `uv` voor dependency- en lockfilebeheer; - optioneel Docker Compose voor PostgreSQL, Redis en de volledige stack. Tests gebruiken standaard SQLite, eager Celery en een in-memory e-mailbackend. Ze hebben geen internet, Redis, mailbox of Ollama nodig. ## Eerste start ```bash ./scripts/codex_bootstrap.sh uv run python manage.py runserver 0.0.0.0:8080 ``` Het script maakt alleen voor lokale ontwikkeling een `.env`, installeert de gelockte dependencies, migreert, laadt veilige demodata en draait alle kwaliteitsgates. De lokaal aangemaakte login is `admin / codex-local-only`. Verwijder of wijzig deze credentials vóór ieder gedeeld of bereikbaar gebruik. ## Handmatige start ```bash uv sync --all-groups mkdir -p local media logs backups cp .env.example .env # Laat DATABASE_URL leeg voor SQLite en vul een unieke DJANGO_SECRET_KEY in. uv run python manage.py migrate uv run python manage.py bootstrap_instance --with-demo uv run python manage.py runserver 0.0.0.0:8080 ``` ## Veelgebruikte commando's ```bash make help make test make lint make format make verify uv run python manage.py shell uv run python manage.py seed_sources uv run python manage.py import_job_fixture fixtures/pages/sample_jsonld_job.html ``` De volgende achtergrondprocessen zijn alleen nodig wanneer `CELERY_TASK_ALWAYS_EAGER=0`: ```bash uv run celery -A config worker -l INFO -Q high,default,low uv run celery -A config beat -l INFO ``` ## Demo opnieuw opbouwen ```bash ./scripts/reset_demo.sh ``` Dit verwijdert uitsluitend `local/db.sqlite3`. Gebruik het niet tegen een productievolume. ## Testen per laag ```bash uv run pytest tests/unit uv run pytest tests/integration uv run pytest tests/security uv run pytest tests/integration/test_pipeline.py -q uv run pytest --cov=apps --cov=config --cov-report=term-missing ``` Voeg bij iedere parserwijziging een bronfixture toe. Tests mogen alleen een echte netwerkcall doen in een expliciet afgescheiden, handmatig gestarte smoke-test die niet in CI draait. ## Databasewijzigingen ```bash uv run python manage.py makemigrations uv run python manage.py migrate uv run python manage.py makemigrations --check --dry-run ``` Controleer de gegenereerde migratie. Voor destructieve wijzigingen is een ADR, datamigratie, herstelpad en back-uptest verplicht. ## Static files In development serveert Django static files. Productie gebruikt `collectstatic` in de container en WhiteNoise: ```bash uv run python manage.py collectstatic --noinput ``` ## Troubleshooting **`uv` ontbreekt:** installeer `uv` volgens de officiële instructies van de gekozen werkmachine en heropen de shell. **Database lock op SQLite:** stop tweede web/workerprocessen of gebruik lokaal PostgreSQL voor parallel werk. **Redis connection refused:** zet voor eenvoudige lokale runs `CELERY_TASK_ALWAYS_EAGER=1`, of start Redis/Compose. **Geen digest zichtbaar:** met console-backend staat de mail in de terminal; controleer daarnaast `DigestOutbox` in Django admin. **Bron wordt overgeslagen:** controleer `policy=allow`, een toegestane status, `next_run_at`, de domeinpolicy en de platformdenylist. Forceer nooit een fetch om een veiligheidsblokkade te omzeilen.