Utiliser le SessionNamespace pour sécuriser l’édition des fiches de poste [GEN-2311] - #6044
Conversation
| if edit_session_id: | ||
| session_namespace = SessionNamespace(request.session, JOB_DESCRIPTION_EDIT_SESSION_KIND, edit_session_id) | ||
| if not session_namespace.exists(): | ||
| raise Http404 | ||
| session_data = session_namespace.as_dict() | ||
| else: | ||
| session_namespace = None | ||
| session_data = {} | ||
|
|
||
| # TODO(François): Drop this fallback next week. | ||
| if job_description_id is None and edit_session_id is None: | ||
| session_data = request.session.get(ITOU_SESSION_JOB_DESCRIPTION_KEY, {}) | ||
| job_description_id = session_data.get("pk") | ||
|
|
||
| if job_description_id: | ||
| job_description = get_object_or_404( | ||
| JobDescription.objects.select_related("appellation", "location"), | ||
| pk=job_description_id, | ||
| company=request.current_organization, | ||
| ) | ||
| if job_description_id | ||
| else None | ||
| ) | ||
| else: | ||
| job_description = None | ||
|
|
||
| form = companies_forms.EditJobDescriptionForm( | ||
| request.current_organization, instance=job_description, data=request.POST or None, initial=session_data | ||
| ) | ||
|
|
||
| if request.method == "POST" and form.is_valid(): | ||
| request.session[ITOU_SESSION_JOB_DESCRIPTION_KEY] = {**session_data, **form.cleaned_data} | ||
| return HttpResponseRedirect(reverse("companies_views:edit_job_description_details")) | ||
| session_data.update(form.cleaned_data) | ||
| if session_namespace is None: | ||
| session_namespace = SessionNamespace.create_uuid_namespace( | ||
| request.session, JOB_DESCRIPTION_EDIT_SESSION_KIND, session_data | ||
| ) | ||
| else: | ||
| session_namespace.update(session_data) |
There was a problem hiding this comment.
Suite à la discussion de jeudi, c’est le micmac de création de la SessionNamespace que j’aimerais simplifier.
Si je trouve le temps dans les semaines à venir, je tenterai mon réusinage. :)
| path("edit_job_description/<uuid:edit_session_id>", views.edit_job_description, name="edit_job_description"), | ||
| path("edit_job_description/<int:job_description_id>", views.edit_job_description, name="edit_job_description"), | ||
| path( | ||
| "edit_job_description/<int:job_description_id>/<uuid:edit_session_id>", | ||
| views.edit_job_description, | ||
| name="edit_job_description", | ||
| ), |
There was a problem hiding this comment.
Est-ce que des URLs en job_description/<int:job_description_id>/edit/..., job_description/create/... ne seraient pas plus jolis ?
There was a problem hiding this comment.
Si certainement, mais pas au milieu de cette PR qui a déjà assez à s’occuper de la rétrocompatibilité sans avoir à ajouter des changements cosmétiques.
| path("job_description_list", views.job_description_list, name="job_description_list"), | ||
| path("edit_job_description", views.edit_job_description, name="edit_job_description"), |
There was a problem hiding this comment.
job_description/list & job_description/create ? 🥹
mais bon ça serait dans une autre PR.
There was a problem hiding this comment.
Je me mets un TODO pour ces URLs, après avoir supprimé la compat’.
Like other views in the system (apply, job_seekers, …), prevent collisions with multiple tabs by specifying the session key in the URL. Clarify URLs by adding the `job_description_id` in their path. The tunnel now starts with `edit_job_description` instead of `update_job_description`. The `update_job_description` is a useless redirect. When edit data exists in the session (using the back_url), `edit_job_description` will use the existing session namespace. Otherwise, it’ll initialize a session namespace. test_empty_session_during_edit was removed, as a SessionNamespace is now required for edit views after the starting view: edit_job_description.
3a74266 to
19afc76
Compare
🤔 Pourquoi ?
Protéger le parcours des problèmes d’une session modifiée dans des onglets multiples.
🍰 Comment ?
En écrivant l’ID de la session dans l’URL.
J’en ai profité pour ajouter
job_description_iddans les URLs, afin de mieux indiquer si le parcours est une création de fiche de poste ou une mise à jour.test_empty_session_during_edita été supprimé, puisque laSessionNamespacerequiert dorénavant uneedit_session_id.🏝️ Comment tester ?
Créer une fiche de poste.
Mettre à jour une fiche de poste.