diff --git a/aidants_connect_web/admin.py b/aidants_connect_web/admin.py
index f287a2a47..0e0ade9f2 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()
@@ -818,14 +819,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 = set(ignored_emails - existing_emails)
+ already_refused_emails = set(
+ HabilitationRequest.objects.filter(
+ email__in=existing_emails,
+ status__in=(
+ HabilitationRequest.STATUS_REFUSED,
+ HabilitationRequest.STATUS_CANCELLED,
+ ),
+ ).values_list("email", flat=True)
+ )
+ 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/models.py b/aidants_connect_web/models.py
index 6664cafa5..b093015ab 100644
--- a/aidants_connect_web/models.py
+++ b/aidants_connect_web/models.py
@@ -533,18 +533,25 @@ 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, 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:
- 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
- aidant = Aidant(
+ aidant = Aidant.objects.create(
last_name=self.last_name,
first_name=self.first_name,
profession=self.profession,
@@ -553,7 +560,6 @@ def validate_and_create_aidant(self):
username=self.email,
)
self.status = self.STATUS_VALIDATED
- aidant.save()
self.save()
return True
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..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
@@ -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 indéterminée s'est produite pour l'adresse mail suivante,
+ {% plural %}
+ 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 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 }}
diff --git a/aidants_connect_web/tests/test_models.py b/aidants_connect_web/tests/test_models.py
index e4b5314f5..2470cf8fe 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,9 +1607,26 @@ 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,
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")