Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Habilitation en masse par e-mail : évolutions #610

Merged
merged 7 commits into from
Apr 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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")