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), + }