From 47b5151a27281ecf717e60deebd5dfd942bd6ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agn=C3=A8s=20Haasser?= Date: Wed, 6 Apr 2022 12:06:21 +0200 Subject: [PATCH 1/7] If aidant already exists but is inactive: activate account --- aidants_connect_web/models.py | 4 +++- aidants_connect_web/tests/test_models.py | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/aidants_connect_web/models.py b/aidants_connect_web/models.py index 6664cafa5..b56727ab0 100644 --- a/aidants_connect_web/models.py +++ b/aidants_connect_web/models.py @@ -538,8 +538,10 @@ def validate_and_create_aidant(self): return False if Aidant.objects.filter(username=self.email).count() > 0: - aidant = Aidant.objects.get(username=self.email) + aidant: Aidant = Aidant.objects.get(username=self.email) aidant.organisations.add(self.organisation) + aidant.is_active = True + aidant.save() self.status = self.STATUS_VALIDATED self.save() return True diff --git a/aidants_connect_web/tests/test_models.py b/aidants_connect_web/tests/test_models.py index e4b5314f5..b11572059 100644 --- a/aidants_connect_web/tests/test_models.py +++ b/aidants_connect_web/tests/test_models.py @@ -1591,7 +1591,7 @@ def test_validate_when_all_is_fine(self): db_hab_request.status, HabilitationRequest.STATUS_VALIDATED ) - def test_validate_if_aidant_already_exists(self): + def test_validate_if_active_aidant_already_exists(self): aidant = AidantFactory() habilitation_request = HabilitationRequestFactory( status=HabilitationRequest.STATUS_PROCESSING, email=aidant.email @@ -1607,6 +1607,24 @@ def test_validate_if_aidant_already_exists(self): aidant.refresh_from_db() self.assertIn(habilitation_request.organisation, aidant.organisations.all()) + def test_validate_if_inactive_aidant_already_exists(self): + aidant = AidantFactory(is_active=False) + self.assertFalse(aidant.is_active) + habilitation_request = HabilitationRequestFactory( + status=HabilitationRequest.STATUS_PROCESSING, email=aidant.email + ) + self.assertTrue(habilitation_request.validate_and_create_aidant()) + self.assertEqual( + 1, Aidant.objects.filter(email=habilitation_request.email).count() + ) + habilitation_request.refresh_from_db() + self.assertEqual( + habilitation_request.status, HabilitationRequest.STATUS_VALIDATED + ) + aidant.refresh_from_db() + self.assertTrue(aidant.is_active) + self.assertIn(habilitation_request.organisation, aidant.organisations.all()) + def test_do_not_validate_if_invalid_status(self): for status in ( HabilitationRequest.STATUS_VALIDATED, From 123307ab16f551d3a100e0e068f78b01369cbf53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agn=C3=A8s=20Haasser?= Date: Wed, 6 Apr 2022 15:40:29 +0200 Subject: [PATCH 2/7] Make error messages more precise when some emails are not treated --- aidants_connect_web/admin.py | 27 +++++++++- .../mass-habilitation.html | 54 ++++++++++++++++--- 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/aidants_connect_web/admin.py b/aidants_connect_web/admin.py index f287a2a47..c84c954f2 100644 --- a/aidants_connect_web/admin.py +++ b/aidants_connect_web/admin.py @@ -818,14 +818,39 @@ def __validate_from_email_post(self, request): return HttpResponseRedirect( reverse("otpadmin:aidants_connect_web_habilitationrequest_changelist") ) + ignored_emails = email_list - treated_emails context["treated_emails"] = treated_emails - context["ignored_emails"] = email_list - treated_emails + context["ignored_emails"] = ignored_emails + context.update(self.__extract_more_precise_errors(ignored_emails)) return render( request, "aidants_connect_web/admin/habilitation_request/mass-habilitation.html", context, ) + def __extract_more_precise_errors(self, ignored_emails): + existing_emails = set( + HabilitationRequest.objects.filter(email__in=ignored_emails).values_list( + "email", flat=True + ) + ) + non_existing_emails = ignored_emails - existing_emails + already_refused_emails = set( + HabilitationRequest.objects.filter( + email__in=existing_emails, + status__in=( + HabilitationRequest.STATUS_REFUSED, + HabilitationRequest.STATUS_CANCELLED, + ), + ) + ) + undefined_error_emails = existing_emails - already_refused_emails + return { + "non_existing_emails": non_existing_emails, + "already_refused_emails": already_refused_emails, + "undefined_error_emails": undefined_error_emails, + } + class UsagerAutorisationInline(VisibleToTechAdmin, NestedTabularInline): model = Autorisation diff --git a/aidants_connect_web/templates/aidants_connect_web/admin/habilitation_request/mass-habilitation.html b/aidants_connect_web/templates/aidants_connect_web/admin/habilitation_request/mass-habilitation.html index b98ae5ec3..94696a494 100644 --- a/aidants_connect_web/templates/aidants_connect_web/admin/habilitation_request/mass-habilitation.html +++ b/aidants_connect_web/templates/aidants_connect_web/admin/habilitation_request/mass-habilitation.html @@ -23,14 +23,56 @@

Habilitation en masse à partir des adresses e-mail

{% if ignored_emails %}
{% blocktranslate count counter=ignored_emails|length %} - Nous n'avons pas pu traiter l'adress e-mail suivante : aucune demande - ne correspond, ou alors elle a déjà été annulée ou validée. + Une adresse e-mail a été ignorée. Veuillez retrouver le détail ci-dessous. {% plural %} - Nous n'avons pas pu traiter les {{ counter }} e-mails suivants : aucune demande ne correspond, - ou alors elles ont déjà été validées/annulées. + {{ counter }} adresses e-mails ont été ignorées. Veuillez retrouver le détail + ci-dessous. + {% endblocktranslate %} +
+ {% endif %} + {% if non_existing_emails %} +
+ {% blocktranslate count counter=non_existing_emails|length %} + Nous n'avons trouvé aucun aidant à former portant l'e-mail suivant : aucun compte + aidant n'a été créé. + {% plural %} + Nous n'avons trouvé aucun aidant à former pour les {{ counter }} e-mails suivants : + aucun compte aidant n'a été créé. + {% endblocktranslate %} +
    + {% for email in non_existing_emails %} +
  • {{ email }}
  • + {% endfor %} +
+
+ {% endif %} + {% if already_refused_emails %} +
+ {% blocktranslate count counter=already_refused_emails|length %} + Il existe bien un aidant à former portant l'adresse e-mail suivante, mais + la demande était déjà annulée ou refusée : aucun compte aidant n'a été créé. + {% plural %} + Il existe bien des aidants à former portant les adresses e-mail suivantes, mais + les demandes étaient déjà annulée ou refusée : aucun compte aidant n'a été créé. + {% endblocktranslate %} +
    + {% for email in already_refused_emails %} +
  • {{ email }}
  • + {% endfor %} +
+
+ {% endif %} + {% if undefined_error_emails %} +
+ {% blocktranslate count counter=undefined_error_emails|length %} + Une erreur s'est produite pour l'adresse mail suivante, mais je ne sais pas + laquelle et j'espère que vous ne verrez jamais ce message. :s + {% plural %} + Une erreur s'est produite pour les adresses mails suivantes, mais je ne sais pas + laquelle et j'espère que vous ne verrez jamais ce message. :s {% endblocktranslate %}
    - {% for email in ignored_emails %} + {% for email in undefined_error_emails %}
  • {{ email }}
  • {% endfor %}
@@ -38,7 +80,7 @@

Habilitation en masse à partir des adresses e-mail

{% endif %} {% if treated_emails %}
-

Les demandes suivantes ont été validées, les comptes aidant ont été créés :

+

Les demandes suivantes ont été validées, les comptes aidant ont été créés et/ou activés :

    {% for email in treated_emails %}
  • {{ email }}
  • From 0e537d60310bac51b0e08ce03b512e8c2f7edea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agn=C3=A8s=20Haasser?= Date: Wed, 6 Apr 2022 15:58:40 +0200 Subject: [PATCH 3/7] Treat already validated issues --- aidants_connect_web/admin.py | 1 + aidants_connect_web/models.py | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/aidants_connect_web/admin.py b/aidants_connect_web/admin.py index c84c954f2..55a34a171 100644 --- a/aidants_connect_web/admin.py +++ b/aidants_connect_web/admin.py @@ -803,6 +803,7 @@ def __validate_from_email_post(self, request): status__in=( HabilitationRequest.STATUS_PROCESSING, HabilitationRequest.STATUS_NEW, + HabilitationRequest.STATUS_VALIDATED, ) ) treated_emails = set() diff --git a/aidants_connect_web/models.py b/aidants_connect_web/models.py index b56727ab0..13ae418c9 100644 --- a/aidants_connect_web/models.py +++ b/aidants_connect_web/models.py @@ -534,7 +534,11 @@ def __str__(self): return f"{self.email}" def validate_and_create_aidant(self): - if self.status not in (self.STATUS_PROCESSING, self.STATUS_NEW): + if self.status not in ( + self.STATUS_PROCESSING, + self.STATUS_NEW, + self.STATUS_VALIDATED, + ): return False if Aidant.objects.filter(username=self.email).count() > 0: From c75b951a856bfab577ed12c1f79ebfe2e7e21e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agn=C3=A8s=20Haasser?= Date: Wed, 6 Apr 2022 15:59:02 +0200 Subject: [PATCH 4/7] Fix display error in error display --- aidants_connect_web/admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aidants_connect_web/admin.py b/aidants_connect_web/admin.py index 55a34a171..0e0ade9f2 100644 --- a/aidants_connect_web/admin.py +++ b/aidants_connect_web/admin.py @@ -835,7 +835,7 @@ def __extract_more_precise_errors(self, ignored_emails): "email", flat=True ) ) - non_existing_emails = ignored_emails - existing_emails + non_existing_emails = set(ignored_emails - existing_emails) already_refused_emails = set( HabilitationRequest.objects.filter( email__in=existing_emails, @@ -843,7 +843,7 @@ def __extract_more_precise_errors(self, ignored_emails): HabilitationRequest.STATUS_REFUSED, HabilitationRequest.STATUS_CANCELLED, ), - ) + ).values_list("email", flat=True) ) undefined_error_emails = existing_emails - already_refused_emails return { From f59aa500404b254c7d21f7eefa9779bcc94818f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agn=C3=A8s=20Haasser?= Date: Wed, 6 Apr 2022 16:01:03 +0200 Subject: [PATCH 5/7] Improve undefined error message --- .../admin/habilitation_request/mass-habilitation.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aidants_connect_web/templates/aidants_connect_web/admin/habilitation_request/mass-habilitation.html b/aidants_connect_web/templates/aidants_connect_web/admin/habilitation_request/mass-habilitation.html index 94696a494..24a927ab0 100644 --- a/aidants_connect_web/templates/aidants_connect_web/admin/habilitation_request/mass-habilitation.html +++ b/aidants_connect_web/templates/aidants_connect_web/admin/habilitation_request/mass-habilitation.html @@ -65,12 +65,12 @@

    Habilitation en masse à partir des adresses e-mail

    {% if undefined_error_emails %}
    {% blocktranslate count counter=undefined_error_emails|length %} - Une erreur s'est produite pour l'adresse mail suivante, mais je ne sais pas - laquelle et j'espère que vous ne verrez jamais ce message. :s + Une erreur indéterminée s'est produite pour l'adresse mail suivante, {% plural %} - Une erreur s'est produite pour les adresses mails suivantes, mais je ne sais pas - laquelle et j'espère que vous ne verrez jamais ce message. :s + Une erreur indéterminée s'est produite pour les adresses mails suivantes, {% endblocktranslate %} + parlez-en à quelqu'un(e) de l'équipe technique pour voir ce qui aurait pu la causer.
    + Aucun compte aidant n'a été créé.
      {% for email in undefined_error_emails %}
    • {{ email }}
    • From d613fa1bf05027ecfa42ec604ec4783b02838d99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agn=C3=A8s=20Haasser?= Date: Wed, 6 Apr 2022 16:08:56 +0200 Subject: [PATCH 6/7] Make aidant creation atomic --- aidants_connect_web/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aidants_connect_web/models.py b/aidants_connect_web/models.py index 13ae418c9..b093015ab 100644 --- a/aidants_connect_web/models.py +++ b/aidants_connect_web/models.py @@ -533,6 +533,7 @@ class Meta: def __str__(self): return f"{self.email}" + @transaction.atomic def validate_and_create_aidant(self): if self.status not in ( self.STATUS_PROCESSING, @@ -550,7 +551,7 @@ def validate_and_create_aidant(self): self.save() return True - aidant = Aidant( + aidant = Aidant.objects.create( last_name=self.last_name, first_name=self.first_name, profession=self.profession, @@ -559,7 +560,6 @@ def validate_and_create_aidant(self): username=self.email, ) self.status = self.STATUS_VALIDATED - aidant.save() self.save() return True From 144a8d7b6724e0bc1fcc37177e1a9f1641b44f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agn=C3=A8s=20Haasser?= Date: Wed, 6 Apr 2022 16:17:18 +0200 Subject: [PATCH 7/7] Update tests to fit new rules for mass email habilitation --- aidants_connect_web/tests/test_models.py | 1 - aidants_connect_web/tests/test_views/test_admin.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aidants_connect_web/tests/test_models.py b/aidants_connect_web/tests/test_models.py index b11572059..2470cf8fe 100644 --- a/aidants_connect_web/tests/test_models.py +++ b/aidants_connect_web/tests/test_models.py @@ -1627,7 +1627,6 @@ def test_validate_if_inactive_aidant_already_exists(self): def test_do_not_validate_if_invalid_status(self): for status in ( - HabilitationRequest.STATUS_VALIDATED, HabilitationRequest.STATUS_REFUSED, HabilitationRequest.STATUS_CANCELLED, ): diff --git a/aidants_connect_web/tests/test_views/test_admin.py b/aidants_connect_web/tests/test_views/test_admin.py index bd4474034..ae8665873 100644 --- a/aidants_connect_web/tests/test_views/test_admin.py +++ b/aidants_connect_web/tests/test_views/test_admin.py @@ -592,4 +592,5 @@ def test_mass_habilitation_with_valid_and_invalid_addresses(self): "ont été créés" ), ) - self.assertContains(response, "Nous n'avons pas pu traiter les") + self.assertContains(response, "2 adresses e-mails ont été ignorées.") + self.assertContains(response, "Nous n'avons trouvé aucun")