Author SHA1 Message Date
Jens 7a4af57be9 ci: add lightweight validation fast path 2026-09-03 00:30:21 +00:00
Jens 2d1964106b Merge pull request 'fix: use local calendar dates in demo seed' (#4) from fix/demo-seed-local-calendar-date-20260903 into main
Unraid autoredeploy / Deploy vacatureradar (push) Failing after 14s
2026-09-03 00:10:15 +00:00
NuklearRabbit 7c4652ac49 fix: use local calendar dates in demo seed
Managed validation / full (pull_request) Successful in 3m2s
2026-09-03 01:11:07 +02:00
Jens c855253072 Merge pull request 'hygiene: prepare public release' (#3) from chore/public-release-hygiene-20260902 into main
Unraid autoredeploy / Deploy vacatureradar (push) Failing after 15s
2026-09-02 21:44:28 +00:00
NuklearRabbit f20b7de053 hygiene: prepare VacatureRadar for public release
Managed validation / full (pull_request) Successful in 3m1s
2026-09-02 23:37:30 +02:00
Jens afa7474094 Merge pull request 'docs: record VacatureRadar release-history blocker' (#2) from chatgpt/repo-hygiene-vacatureradar into main
Reviewed-on: #2
2026-09-01 16:12:25 +00:00
9 changed files with 52 additions and 14 deletions
+2 -2
View File
@@ -16,8 +16,8 @@ DJANGO_SECRET_KEY=CHANGE_ME_generate_at_least_50_random_characters
DJANGO_DEBUG=0 DJANGO_DEBUG=0
# Leeg laten tot er een publieke HTTPS-URL is. # Leeg laten tot er een publieke HTTPS-URL is.
PUBLIC_BASE_URL= PUBLIC_BASE_URL=
DJANGO_ALLOWED_HOSTS=192.168.10.150,127.0.0.1,localhost DJANGO_ALLOWED_HOSTS=vacatureradar.local,127.0.0.1,localhost
DJANGO_CSRF_TRUSTED_ORIGINS=http://192.168.10.150:1226,http://127.0.0.1:1226 DJANGO_CSRF_TRUSTED_ORIGINS=http://vacatureradar.local:1226,http://127.0.0.1:1226
DJANGO_TIME_ZONE=Europe/Brussels DJANGO_TIME_ZONE=Europe/Brussels
VACATURERADAR_OWNER_NAME=Jens VACATURERADAR_OWNER_NAME=Jens
VACATURERADAR_VERSION=0.3.12 VACATURERADAR_VERSION=0.3.12
+29
View File
@@ -21,6 +21,8 @@ concurrency:
jobs: jobs:
full: full:
name: full name: full
# Public fork code must never execute automatically on the private runner.
if: ${{ gitea.event_name != 'pull_request' || gitea.event.pull_request.head.repo.full_name == gitea.repository }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 30 timeout-minutes: 30
container: container:
@@ -53,6 +55,33 @@ jobs:
exit 1 exit 1
fi fi
# MANAGED_FAST_PATH: documentation and this baseline workflow cannot
# affect the shipped runtime. Keep the required status check, but do
# not install toolchains or execute the full product suite.
if [[ -n "${GITHUB_BASE_REF:-}" ]]; then
git fetch --no-tags --depth=1 origin "${GITHUB_BASE_REF}"
managed_base="origin/${GITHUB_BASE_REF}"
git diff --check "${managed_base}..HEAD"
mapfile -t managed_changed_files < <(
git diff --name-only --diff-filter=ACMR "${managed_base}..HEAD"
)
managed_runtime_change=0
for managed_path in "${managed_changed_files[@]}"; do
case "${managed_path}" in
*.md|*.mdx|docs/*|.github/ISSUE_TEMPLATE/*|.gitea/ISSUE_TEMPLATE/*|.gitea/runner-scope.sh|.gitea/workflows/managed-validation.yml)
;;
*)
managed_runtime_change=1
break
;;
esac
done
if [[ "${#managed_changed_files[@]}" -gt 0 && "${managed_runtime_change}" -eq 0 ]]; then
printf 'Managed validation fast path: %s non-runtime file(s); full product suite skipped.\n' \
"${#managed_changed_files[@]}"
exit 0
fi
fi
if [[ -f pyproject.toml || -f requirements.txt ]]; then if [[ -f pyproject.toml || -f requirements.txt ]]; then
# Compile only tracked Python sources. Running compileall after a # Compile only tracked Python sources. Running compileall after a
# Node install would otherwise traverse node_modules and turn a # Node install would otherwise traverse node_modules and turn a
+2 -1
View File
@@ -38,7 +38,8 @@ Deze data mag nooit shell-, netwerk-, e-mail-, bestandssysteem- of sollicitatiea
## Kwetsbaarheid melden ## Kwetsbaarheid melden
Maak geen publieke issue met secrets of persoonlijke vacaturegegevens. Documenteer intern: Maak geen publieke issue met secrets of persoonlijke vacaturegegevens. Meld een
kwetsbaarheid privé via `security@itworx.tech` en vermeld:
1. component en versie/commit; 1. component en versie/commit;
2. reproduceerbare stappen met synthetische data; 2. reproduceerbare stappen met synthetische data;
+3 -2
View File
@@ -152,6 +152,7 @@ def seed_demo_environment(user) -> None:
profile.save(update_fields=["is_active"]) profile.save(update_fields=["is_active"])
now = timezone.now() now = timezone.now()
today = timezone.localdate(now)
workplace_map = { workplace_map = {
"hybrid": JobPosting.Workplace.HYBRID, "hybrid": JobPosting.Workplace.HYBRID,
"remote": JobPosting.Workplace.REMOTE, "remote": JobPosting.Workplace.REMOTE,
@@ -254,7 +255,7 @@ def seed_demo_environment(user) -> None:
defaults={ defaults={
"status": Application.Status.INTERVIEW, "status": Application.Status.INTERVIEW,
"applied_at": now - timedelta(days=6), "applied_at": now - timedelta(days=6),
"follow_up_date": (now + timedelta(days=2)).date(), "follow_up_date": today + timedelta(days=2),
"contact_name": "Sofie Vandael", "contact_name": "Sofie Vandael",
"contact_email": "sofie.vandael@cloudnexus.example", "contact_email": "sofie.vandael@cloudnexus.example",
"notes": "Eerste gesprek gepland. Demo-data.", "notes": "Eerste gesprek gepland. Demo-data.",
@@ -267,7 +268,7 @@ def seed_demo_environment(user) -> None:
defaults={ defaults={
"status": Application.Status.APPLIED, "status": Application.Status.APPLIED,
"applied_at": now - timedelta(days=2), "applied_at": now - timedelta(days=2),
"follow_up_date": (now + timedelta(days=5)).date(), "follow_up_date": today + timedelta(days=5),
"notes": "Sollicitatie verstuurd. Demo-data.", "notes": "Sollicitatie verstuurd. Demo-data.",
}, },
) )
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -461,7 +461,7 @@ VR-208-herverificatie op 2026-07-22:
## Deploymentstatus ## Deploymentstatus
- `main` is via de bestaande Gitea-SSH-sleutel naar `NuklearRabbit/VacatureRadar` gepusht. - `main` is via de bestaande Gitea-SSH-sleutel naar `NuklearRabbit/VacatureRadar` gepusht.
- De applicatie draait op de Unraid-server via `http://192.168.10.150:1226/` als één Dockerman-container; Supervisor bewaakt intern PostgreSQL 17, Redis, web, worker en scheduler. - De applicatie draait op de Unraid-server via de geconfigureerde private host en poort `1226` als één Dockerman-container; Supervisor bewaakt intern PostgreSQL 17, Redis, web, worker en scheduler.
- De Dockerman-tegel gebruikt de lokale VacatureRadar-favicon en opent rechtstreeks de WebUI op poort 1226. - De Dockerman-tegel gebruikt de lokale VacatureRadar-favicon en opent rechtstreeks de WebUI op poort 1226.
- De server-side `.env` heeft rechten `0600`; gegenereerde secrets zijn niet naar Git of logs gekopieerd. - De server-side `.env` heeft rechten `0600`; gegenereerde secrets zijn niet naar Git of logs gekopieerd.
- Historisch bewijs (2026-07-22, inmiddels vervangen): de self-hosted runner was - Historisch bewijs (2026-07-22, inmiddels vervangen): de self-hosted runner was
+1 -1
View File
@@ -105,7 +105,7 @@ Gebruik vanaf een beheerwerkstation altijd een benoemde SSH-hostalias met een af
```sshconfig ```sshconfig
Host unraid-itworx Host unraid-itworx
HostName 192.168.10.150 HostName server.example.test
Port 22 Port 22
User root User root
IdentityFile ~/.ssh/itworx_unraid_deploy IdentityFile ~/.ssh/itworx_unraid_deploy
+11 -4
View File
@@ -145,15 +145,22 @@ def test_demo_login_logs_in_and_seeds_environment(client):
assert "minstens één import actief" in sources.content.decode("utf-8") assert "minstens één import actief" in sources.content.decode("utf-8")
def test_demo_login_is_idempotent(client): def test_demo_login_is_idempotent(client, monkeypatch):
from datetime import timedelta from datetime import UTC, datetime, timedelta
from django.utils import timezone from django.utils import timezone
from apps.jobs.models import Application, JobPosting from apps.jobs.models import Application, JobPosting
from apps.jobs.services import demo_seed
from apps.profiles.models import SearchProfile from apps.profiles.models import SearchProfile
from apps.sources.models import MailboxConnection, Source from apps.sources.models import MailboxConnection, Source
# 22:30 UTC is already the following calendar day in Europe/Brussels.
# Freezing this boundary prevents UTC `.date()` calls from creeping back in.
near_local_midnight = datetime(2026, 9, 2, 22, 30, tzinfo=UTC)
monkeypatch.setattr(demo_seed.timezone, "now", lambda: near_local_midnight)
expected_local_day = timezone.localdate(near_local_midnight)
client.post(reverse("demo-login")) client.post(reverse("demo-login"))
first = JobPosting.objects.count() first = JobPosting.objects.count()
demo_user = get_user_model().objects.get(username=settings.DEMO_USERNAME) demo_user = get_user_model().objects.get(username=settings.DEMO_USERNAME)
@@ -172,8 +179,8 @@ def test_demo_login_is_idempotent(client):
job.refresh_from_db() job.refresh_from_db()
application.refresh_from_db() application.refresh_from_db()
assert job.status == JobPosting.Status.ACTIVE assert job.status == JobPosting.Status.ACTIVE
assert job.last_seen.date() == timezone.localdate() assert timezone.localdate(job.last_seen) == expected_local_day
assert application.follow_up_date > timezone.localdate() assert application.follow_up_date > expected_local_day
assert profile.scores.count() == 6 assert profile.scores.count() == 6
assert MailboxConnection.objects.filter(user=demo_user, enabled=True).count() == 9 assert MailboxConnection.objects.filter(user=demo_user, enabled=True).count() == 9
assert Source.objects.filter(source_type=Source.Type.EMAIL, failure_count=0).count() >= 9 assert Source.objects.filter(source_type=Source.Type.EMAIL, failure_count=0).count() >= 9
+3 -3
View File
@@ -49,8 +49,8 @@ def test_configure_public_url_updates_only_public_security_settings(tmp_path: Pa
env_file.write_text( env_file.write_text(
"DJANGO_SECRET_KEY=keep-this-secret\n" "DJANGO_SECRET_KEY=keep-this-secret\n"
"POSTGRES_PASSWORD=keep-this-password\n" "POSTGRES_PASSWORD=keep-this-password\n"
"DJANGO_ALLOWED_HOSTS=192.168.10.150,localhost\n" "DJANGO_ALLOWED_HOSTS=vacatureradar.local,localhost\n"
"DJANGO_CSRF_TRUSTED_ORIGINS=http://192.168.10.150:1226\n", "DJANGO_CSRF_TRUSTED_ORIGINS=http://vacatureradar.local:1226\n",
encoding="utf-8", encoding="utf-8",
) )
@@ -67,7 +67,7 @@ def test_configure_public_url_updates_only_public_security_settings(tmp_path: Pa
assert "DJANGO_DEBUG=0" in content assert "DJANGO_DEBUG=0" in content
assert "vacatureradar.itworx.tech" in content assert "vacatureradar.itworx.tech" in content
assert ( assert (
"DJANGO_CSRF_TRUSTED_ORIGINS=http://192.168.10.150:1226,https://vacatureradar.itworx.tech" "DJANGO_CSRF_TRUSTED_ORIGINS=http://vacatureradar.local:1226,https://vacatureradar.itworx.tech"
) in content ) in content
assert "CACHE_URL=redis://127.0.0.1:6379/1" in content assert "CACHE_URL=redis://127.0.0.1:6379/1" in content
assert "TRUSTED_PROXY_CIDRS=172.18.0.0/16" in content assert "TRUSTED_PROXY_CIDRS=172.18.0.0/16" in content