From c549ed5fe03cffbf46cca66b1392136f1c1d17f0 Mon Sep 17 00:00:00 2001
From: Antoine LAURENT
Date: Fri, 9 Aug 2024 15:55:05 +0200
Subject: [PATCH] www: Add job_seeker page
---
config/urls.py | 1 +
itou/eligibility/models/common.py | 9 +++
.../geiq/geiq_diagnosis_allowance_alert.html | 20 +++++++
.../includes/geiq/geiq_diagnosis_details.html | 21 +------
itou/templates/job_seekers_views/details.html | 38 +++++++++++++
.../includes/eligibility_diagnosis.html | 56 +++++++++++++++++++
itou/www/job_seekers_views/__init__.py | 0
itou/www/job_seekers_views/urls.py | 10 ++++
itou/www/job_seekers_views/views.py | 48 ++++++++++++++++
9 files changed, 183 insertions(+), 20 deletions(-)
create mode 100644 itou/templates/apply/includes/geiq/geiq_diagnosis_allowance_alert.html
create mode 100644 itou/templates/job_seekers_views/details.html
create mode 100644 itou/templates/job_seekers_views/includes/eligibility_diagnosis.html
create mode 100644 itou/www/job_seekers_views/__init__.py
create mode 100644 itou/www/job_seekers_views/urls.py
create mode 100644 itou/www/job_seekers_views/views.py
diff --git a/config/urls.py b/config/urls.py
index 7023eaa9600..e684c8acd35 100644
--- a/config/urls.py
+++ b/config/urls.py
@@ -64,6 +64,7 @@
path("geiq/", include("itou.www.geiq_views.urls")),
path("institutions/", include("itou.www.institutions_views.urls")),
path("invitations/", include("itou.www.invitations_views.urls")),
+ path("job-seekers/", include("itou.www.job_seekers_views.urls")),
path("prescribers/", include("itou.www.prescribers_views.urls")),
path("search/", include("itou.www.search.urls")),
path("company/", include("itou.www.companies_views.urls")),
diff --git a/itou/eligibility/models/common.py b/itou/eligibility/models/common.py
index 82d14c148ed..cece2720e54 100644
--- a/itou/eligibility/models/common.py
+++ b/itou/eligibility/models/common.py
@@ -6,6 +6,7 @@
from django.utils import timezone
from itou.eligibility.enums import AdministrativeCriteriaLevel, AuthorKind
+from itou.job_applications.enums import SenderKind
class CommonEligibilityDiagnosisQuerySet(models.QuerySet):
@@ -76,6 +77,14 @@ def criteria_can_be_certified(self):
and self.administrative_criteria.certifiable().exists()
)
+ def get_author_kind_display(self):
+ if self.sender_kind == SenderKind.PRESCRIBER and (
+ not self.sender_prescriber_organization or not self.sender_prescriber_organization.is_authorized
+ ):
+ return "Orienteur"
+ else:
+ return SenderKind(self.sender_kind).label
+
class AdministrativeCriteriaQuerySet(models.QuerySet):
def level1(self):
diff --git a/itou/templates/apply/includes/geiq/geiq_diagnosis_allowance_alert.html b/itou/templates/apply/includes/geiq/geiq_diagnosis_allowance_alert.html
new file mode 100644
index 00000000000..e9d71d01c0d
--- /dev/null
+++ b/itou/templates/apply/includes/geiq/geiq_diagnosis_allowance_alert.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ Aide à l'accompagement GEIQ
+
+
+ {% if diagnosis.author_prescriber_organization %}
+ Ce diagnostic émis par un prescripteur habilité vous donnera droit en cas d’embauche,
+ {% else %}
+ Les critères que vous avez sélectionnés vous donnent droit en cas d’embauche,
+ {% endif %}
+ à une aide financière de l’État s’élevant à {{ diagnosis.allowance_amount }} € (sous réserve de la contractualisation initialement prévue et de l’enveloppe disponible).
+
+
+
+
diff --git a/itou/templates/apply/includes/geiq/geiq_diagnosis_details.html b/itou/templates/apply/includes/geiq/geiq_diagnosis_details.html
index 9f32b39f56c..a78273c878e 100644
--- a/itou/templates/apply/includes/geiq/geiq_diagnosis_details.html
+++ b/itou/templates/apply/includes/geiq/geiq_diagnosis_details.html
@@ -31,26 +31,7 @@ Situation administrative du candidat
Durée de validité du diagnostic : du {{ diagnosis.created_at|date:"d/m/Y" }} au {{ diagnosis.expires_at|date:"d/m/Y" }}.
{% if request.user.is_employer %}
-
-
-
-
-
-
-
- Aide à l'accompagement GEIQ
-
-
- {% if diagnosis.author_prescriber_organization %}
- Ce diagnostic émis par un prescripteur habilité vous donnera droit en cas d’embauche,
- {% else %}
- Les critères que vous avez sélectionnés vous donnent droit en cas d’embauche,
- {% endif %}
- à une aide financière de l’État s’élevant à {{ diagnosis.allowance_amount }} € (sous réserve de la contractualisation initialement prévue et de l’enveloppe disponible).
-
-
-
-
+ {% include "apply/includes/geiq/geiq_diagnosis_allowance_alert.html" with diagnosis=eligibility_diagnosis only %}
{% endif %}
{% elif request.user.is_employer %}
{# Existing GEIQ, diagnosis but no allowance #}
diff --git a/itou/templates/job_seekers_views/details.html b/itou/templates/job_seekers_views/details.html
new file mode 100644
index 00000000000..0d2a146891d
--- /dev/null
+++ b/itou/templates/job_seekers_views/details.html
@@ -0,0 +1,38 @@
+{% extends "layout/base.html" %}
+{% load matomo %}
+{% load str_filters %}
+{% load format_filters %}
+
+{% block title %}Profil de {{ job_seeker.get_full_name }} {{ block.super }}{% endblock %}
+
+{% block title_content %}{{ job_seeker.get_full_name }}
{% endblock %}
+
+{% block title_prevstep %}
+ {% include "layout/previous_step.html" with back_url=back_url only %}
+{% endblock %}
+
+{% block content %}
+
+
+
+
+
Informations
+
+ {% include "apply/includes/job_seeker_info.html" with job_seeker=job_seeker job_application=None with_matomo_event=True can_view_personal_information=can_view_personal_information can_edit_personal_information=can_edit_personal_information request=request csrf_token=csrf_token SenderKind=SenderKind only %}
+
+ {% if iae_eligibility_diagnosis %}
+ {% include "job_seekers_views/includes/eligibility_diagnosis.html" with eligibility_diagnosis=iae_eligibility_diagnosis kind="IAE" only %}
+ {% endif %}
+ {% if geiq_eligibility_diagnosis %}
+ {% include "job_seekers_views/includes/eligibility_diagnosis.html" with eligibility_diagnosis=geiq_eligibility_diagnosis kind="GEIQ" with_details=request.user.is_employer only %}
+ {% endif %}
+
+ {% if approval %}
+
+ {% include "approvals/includes/box.html" with approval=approval only %}
+
+ {% endif %}
+
+
+
+{% endblock %}
diff --git a/itou/templates/job_seekers_views/includes/eligibility_diagnosis.html b/itou/templates/job_seekers_views/includes/eligibility_diagnosis.html
new file mode 100644
index 00000000000..f7071fb54c9
--- /dev/null
+++ b/itou/templates/job_seekers_views/includes/eligibility_diagnosis.html
@@ -0,0 +1,56 @@
+
+
+
+
+ {% if kind == "IAE" %}
+
Diagnostic IAE
+ {% else %}
+ Diagnostic public prioritaire GEIQ
+ {% endif %}
+ Valide du {{ eligibility_diagnosis.created_at|date:"d/m/Y" }} au {{ eligibility_diagnosis.expires_at|date:"d/m/Y" }}
+
+
+
+
+ {% if kind == "IAE" %}
+ Éligible à l’IAE
+ {% else %}
+ Éligible public prioritaire GEIQ
+ {% endif %}
+
+
+
+
+
+
+ Confirmé par
+
+ {{ eligibility_diagnosis.author.get_full_name }}
+ {% if eligibility_diagnosis.author_siae %}({{ eligibility_diagnosis.author_siae.display_name }}){% endif %}
+ {% if eligibility_diagnosis.author_prescriber_organization %}
+ ({{ eligibility_diagnosis.author_prescriber_organization.display_name }})
+ {% endif %}
+
+
+
+ Type
+
+ {{ eligibility_diagnosis.get_author_kind_display }}
+
+
+
+ Critère administratifs selectionés
+
+ {# Keep ordering from manager (level then ui_rank) #}
+ {% for criteria in eligibility_diagnosis.administrative_criteria.all %}
+ {{ criteria.name }}
+
+ {% endfor %}
+
+
+ {% if kind == "GEIQ" %}
+ {% if with_details %}
+ {% include "apply/includes/geiq/geiq_diagnosis_allowance_alert.html" with diagnosis=eligibility_diagnosis only %}
+ {% endif %}
+ {% endif %}
+
diff --git a/itou/www/job_seekers_views/__init__.py b/itou/www/job_seekers_views/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/itou/www/job_seekers_views/urls.py b/itou/www/job_seekers_views/urls.py
new file mode 100644
index 00000000000..4065e072796
--- /dev/null
+++ b/itou/www/job_seekers_views/urls.py
@@ -0,0 +1,10 @@
+from django.urls import path
+
+from . import views
+
+
+app_name = "job_seekers_views"
+
+urlpatterns = [
+ path("details/", views.JobSeekerDetailView.as_view(), name="details"),
+]
diff --git a/itou/www/job_seekers_views/views.py b/itou/www/job_seekers_views/views.py
new file mode 100644
index 00000000000..fb108ef020d
--- /dev/null
+++ b/itou/www/job_seekers_views/views.py
@@ -0,0 +1,48 @@
+from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
+from django.views.generic import DetailView
+
+from itou.companies.enums import CompanyKind
+from itou.eligibility.models.geiq import GEIQEligibilityDiagnosis
+from itou.eligibility.models.iae import EligibilityDiagnosis
+from itou.users.models import User
+
+
+class JobSeekerDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
+ model = User
+ queryset = User.objects.select_related("jobseeker_profile").prefetch_related()
+ template_name = "job_seekers_views/details.html"
+ slug_field = "public_id"
+ slug_url_kwarg = "public_id"
+ context_object_name = "job_seeker"
+
+ def test_func(self):
+ return self.request.user.is_authenticated and self.request.user.can_view_personal_information(
+ self.get_object()
+ )
+
+ def get_context_data(self, **kwargs):
+ geiq_eligibility_diagnosis = None
+ if self.request.user.is_prescriber or self.request.current_organization.kind == CompanyKind.GEIQ:
+ geiq_eligibility_diagnosis = GEIQEligibilityDiagnosis.objects.valid_diagnoses_for(
+ self.object,
+ for_geiq=self.request.current_organization if self.request.user.is_employer else None,
+ ).first()
+
+ approval = None
+ iae_eligibility_diagnosis = None
+ if self.request.user.is_prescriber or self.request.current_organization.is_subject_to_eligibility_rules:
+ approval = self.object.approvals.valid().first()
+ iae_eligibility_diagnosis = EligibilityDiagnosis.objects.last_considered_valid(
+ self.object,
+ for_siae=self.request.current_organization if self.request.user.is_employer else None,
+ )
+
+ return super().get_context_data(**kwargs) | {
+ "geiq_eligibility_diagnosis": geiq_eligibility_diagnosis,
+ "iae_eligibility_diagnosis": iae_eligibility_diagnosis,
+ "matomo_custom_title": "Détail candidat",
+ "approval": approval,
+ # already checked in test_func because the user name is displayed in the title
+ "can_view_personal_information": True,
+ "can_edit_personal_information": self.request.user.can_edit_personal_information(self.object),
+ }