Skip to content

Commit

Permalink
Habilitation en masse par e-mail : évolutions #610
Browse files Browse the repository at this point in the history
  • Loading branch information
tut-tuuut authored Apr 7, 2022
2 parents 48282b3 + 144a8d7 commit b1b00f7
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 14 deletions.
28 changes: 27 additions & 1 deletion aidants_connect_web/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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
Expand Down
14 changes: 10 additions & 4 deletions aidants_connect_web/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -553,7 +560,6 @@ def validate_and_create_aidant(self):
username=self.email,
)
self.status = self.STATUS_VALIDATED
aidant.save()
self.save()
return True

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,64 @@ <h1>Habilitation en masse à partir des adresses e-mail</h1>
{% if ignored_emails %}
<div class="errornote">
{% 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 %}
</div>
{% endif %}
{% if non_existing_emails %}
<div class="errornote">
{% 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 %}
<ul>
{% for email in non_existing_emails %}
<li>{{ email }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if already_refused_emails %}
<div class="errornote">
{% 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 %}
<ul>
{% for email in already_refused_emails %}
<li>{{ email }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if undefined_error_emails %}
<div class="errornote">
{% 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.<br>
Aucun compte aidant n'a été créé.
<ul>
{% for email in ignored_emails %}
{% for email in undefined_error_emails %}
<li>{{ email }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if treated_emails %}
<div class="successnote">
<p>Les demandes suivantes ont été validées, les comptes aidant ont été créés :</p>
<p>Les demandes suivantes ont été validées, les comptes aidant ont été créés et/ou activés :</p>
<ul>
{% for email in treated_emails %}
<li><span aria-hidden="true"></span>{{ email }}</li>
Expand Down
21 changes: 19 additions & 2 deletions aidants_connect_web/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
):
Expand Down
3 changes: 2 additions & 1 deletion aidants_connect_web/tests/test_views/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")

0 comments on commit b1b00f7

Please sign in to comment.