feat: personalize scoring and add skills radar
This commit is contained in:
@@ -5,6 +5,7 @@ from django.urls import reverse
|
||||
|
||||
from apps.jobs.models import GeocodeLocationLookup
|
||||
from apps.profiles.forms import SearchProfileForm
|
||||
from apps.profiles.taxonomy import iter_choices
|
||||
|
||||
|
||||
def _profile_post_data(**overrides):
|
||||
@@ -13,6 +14,7 @@ def _profile_post_data(**overrides):
|
||||
"is_active": "on",
|
||||
"home_postal_code": "3500",
|
||||
"max_distance_km": "45",
|
||||
"experience_years": "10",
|
||||
"desired_titles": ["infrastructure engineer", "cloud engineer"],
|
||||
"excluded_titles": ["sales"],
|
||||
"desired_skills": ["azure", "terraform"],
|
||||
@@ -38,8 +40,18 @@ def test_profile_form_uses_guided_choices_and_preserves_existing_custom_values(p
|
||||
assert "home_latitude" not in form.fields
|
||||
assert "home_longitude" not in form.fields
|
||||
assert form.fields["desired_titles"].widget.allow_multiple_selected is True
|
||||
assert ("systeembeheerder", "systeembeheerder") in form.fields["desired_titles"].choices
|
||||
assert ("VMware", "VMware") in form.fields["desired_skills"].choices
|
||||
title_choices = list(iter_choices(form.fields["desired_titles"].choices))
|
||||
skill_choices = list(iter_choices(form.fields["desired_skills"].choices))
|
||||
assert ("it field engineer", "IT Field Engineer") in title_choices
|
||||
assert ("system network engineer", "System & Network Engineer") in title_choices
|
||||
assert ("systeembeheerder", "Systeembeheerder") in title_choices
|
||||
assert ("vmware", "VMware") in skill_choices
|
||||
assert ("microsoft copilot", "Microsoft Copilot") in skill_choices
|
||||
assert ("fortinet", "Fortinet / FortiGate") in skill_choices
|
||||
assert ("itil", "ITIL / IT-servicemanagement") in skill_choices
|
||||
assert form.fields["desired_titles"].widget.attrs["class"] == "grouped-choices"
|
||||
assert form.fields["experience_years"].widget.allow_multiple_selected is False
|
||||
assert "nooit mee" in form.fields["experience_years"].help_text
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -83,6 +95,7 @@ def test_profile_update_derives_home_location_from_postcode(client, user, profil
|
||||
assert profile.home_postal_code == "3500"
|
||||
assert profile.home_municipality == "Hasselt"
|
||||
assert profile.home_latitude == Decimal("50.930700")
|
||||
assert profile.experience_years == 10
|
||||
assert profile.desired_titles == ["infrastructure engineer", "cloud engineer"]
|
||||
assert profile.preferred_workplace == ["hybrid"]
|
||||
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
import pytest
|
||||
from django.urls import reverse
|
||||
|
||||
from apps.jobs.models import JobPosting, ScoreRun
|
||||
|
||||
|
||||
@pytest.mark.integration
|
||||
@pytest.mark.django_db
|
||||
def test_skill_insights_require_login(client):
|
||||
response = client.get(reverse("jobs:skill-insights"))
|
||||
|
||||
assert response.status_code == 302
|
||||
assert reverse("login") in response.url
|
||||
|
||||
|
||||
@pytest.mark.integration
|
||||
@pytest.mark.django_db
|
||||
def test_skill_insights_use_current_profile_and_exclude_hidden_jobs(client, user, profile, job):
|
||||
job.skills_required = ["Microsoft 365"]
|
||||
job.description_text = "Microsoft 365, Dynamics 365 en Microsoft Copilot governance."
|
||||
job.save(update_fields=["skills_required", "description_text"])
|
||||
ScoreRun.objects.create(
|
||||
job=job,
|
||||
profile=profile,
|
||||
profile_version=profile.version,
|
||||
score=74,
|
||||
confidence=0.9,
|
||||
recommendation=ScoreRun.Recommendation.POSSIBLE,
|
||||
)
|
||||
hidden = JobPosting.objects.create(
|
||||
employer=job.employer,
|
||||
original_title="Network Engineer buiten bereik",
|
||||
normalized_title="network engineer buiten bereik",
|
||||
canonical_url="https://jobs.example.org/vacatures/network-hidden",
|
||||
canonical_key="1" * 64,
|
||||
content_hash="2" * 64,
|
||||
description_text="Beheer FortiGate-firewalls.",
|
||||
status=JobPosting.Status.ACTIVE,
|
||||
)
|
||||
ScoreRun.objects.create(
|
||||
job=hidden,
|
||||
profile=profile,
|
||||
profile_version=profile.version,
|
||||
score=80,
|
||||
confidence=0.9,
|
||||
recommendation=ScoreRun.Recommendation.HIDDEN,
|
||||
hard_exclusions=["Buiten de zoekradius."],
|
||||
)
|
||||
client.force_login(user)
|
||||
|
||||
response = client.get(reverse("jobs:skill-insights"))
|
||||
body = response.content.decode()
|
||||
|
||||
assert response.status_code == 200
|
||||
assert "Skillsradar" in body
|
||||
assert "Microsoft 365" in body
|
||||
assert "Microsoft Dynamics 365" in body
|
||||
assert "Microsoft Copilot" in body
|
||||
assert "Fortinet / FortiGate" not in body
|
||||
assert "Ervaringsjaren tellen nergens mee" in body
|
||||
|
||||
|
||||
@pytest.mark.integration
|
||||
@pytest.mark.django_db
|
||||
def test_skill_insights_offer_category_and_gap_filters(client, user, profile, job):
|
||||
job.skills_required = ["Microsoft 365", "FortiGate"]
|
||||
job.description_text = "Microsoft 365 en FortiGate-beheer."
|
||||
job.save(update_fields=["skills_required", "description_text"])
|
||||
ScoreRun.objects.create(
|
||||
job=job,
|
||||
profile=profile,
|
||||
profile_version=profile.version,
|
||||
score=74,
|
||||
confidence=0.9,
|
||||
recommendation=ScoreRun.Recommendation.POSSIBLE,
|
||||
)
|
||||
client.force_login(user)
|
||||
|
||||
response = client.get(
|
||||
reverse("jobs:skill-insights"),
|
||||
{"category": "netwerk-security", "coverage": "gap"},
|
||||
)
|
||||
body = response.content.decode()
|
||||
|
||||
assert response.status_code == 200
|
||||
assert "Fortinet / FortiGate" in body
|
||||
assert "Microsoft 365" not in body
|
||||
assert "Leerkans" in body
|
||||
Reference in New Issue
Block a user