-
Notifications
You must be signed in to change notification settings - Fork 25
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
invitations_views: Add helper to accept all available invitations
Used in Inclusion Connect and ProConnect login flow
- Loading branch information
Showing
7 changed files
with
222 additions
and
56 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
from django.contrib import messages | ||
from django.core.exceptions import PermissionDenied | ||
|
||
from itou.invitations.models import EmployerInvitation, LaborInspectorInvitation, PrescriberWithOrgInvitation | ||
from itou.users.enums import UserKind | ||
|
||
|
||
def handle_prescriber_intivation(invitation, request): | ||
if not invitation.guest_can_join_organization(request): | ||
raise PermissionDenied() | ||
|
||
if invitation.can_be_accepted: | ||
invitation.add_invited_user_to_organization() | ||
# Send an email after the model changes | ||
invitation.accept() | ||
messages.success( | ||
request, f"Vous êtes désormais membre de l'organisation {invitation.organization.display_name}." | ||
) | ||
elif not invitation.accepted_at: | ||
messages.error(request, "Cette invitation n'est plus valide.") | ||
|
||
|
||
def handle_employer_invitation(invitation, request): | ||
if not invitation.guest_can_join_company(request): | ||
raise PermissionDenied() | ||
|
||
if not invitation.company.is_active: | ||
messages.error(request, "Cette structure n'est plus active.") | ||
elif invitation.can_be_accepted: | ||
invitation.add_invited_user_to_company() | ||
invitation.accept() | ||
messages.success(request, f"Vous êtes désormais membre de la structure {invitation.company.display_name}.") | ||
elif not invitation.accepted_at: | ||
messages.error(request, "Cette invitation n'est plus valide.") | ||
|
||
|
||
def handle_labor_inspector_invitation(invitation, request): | ||
if not invitation.guest_can_join_institution(request): | ||
raise PermissionDenied() | ||
|
||
if invitation.can_be_accepted: | ||
invitation.add_invited_user_to_institution() | ||
invitation.accept() | ||
messages.success( | ||
request, f"Vous êtes désormais membre de l'organisation {invitation.institution.display_name}." | ||
) | ||
elif not invitation.accepted_at: | ||
messages.error(request, "Cette invitation n'est plus valide.") | ||
|
||
|
||
def accept_all_pending_invitations(request): | ||
if not request.user.is_authenticated: | ||
return False | ||
|
||
MAPPING = { | ||
UserKind.PRESCRIBER: (PrescriberWithOrgInvitation, handle_prescriber_intivation), | ||
UserKind.EMPLOYER: (EmployerInvitation, handle_employer_invitation), | ||
UserKind.LABOR_INSPECTOR: (LaborInspectorInvitation, handle_labor_inspector_invitation), | ||
} | ||
|
||
InvitationModel, handle_invitation = MAPPING[request.user.kind] | ||
|
||
invitations = list(InvitationModel.objects.pending().filter(email=request.user.email)) | ||
for invitation in invitations: | ||
handle_invitation(invitation, request) | ||
return invitations |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
from django.contrib.auth.models import AnonymousUser | ||
from django.contrib.messages.middleware import MessageMiddleware | ||
from django.contrib.sessions.middleware import SessionMiddleware | ||
from django.test import RequestFactory | ||
from django.utils import timezone | ||
|
||
from itou.www.invitations_views.helpers import accept_all_pending_invitations | ||
from tests.invitations.factories import ( | ||
EmployerInvitationFactory, | ||
LaborInspectorInvitationFactory, | ||
PrescriberWithOrgSentInvitationFactory, | ||
) | ||
from tests.users.factories import EmployerFactory, LaborInspectorFactory, PrescriberFactory | ||
from tests.utils.tests import get_response_for_middlewaremixin | ||
|
||
|
||
def test_anonymous_user(): | ||
request = RequestFactory() | ||
request.user = AnonymousUser() | ||
assert accept_all_pending_invitations(request) == 0 | ||
|
||
|
||
def fake_request(): | ||
request = RequestFactory().get("/") | ||
SessionMiddleware(get_response_for_middlewaremixin).process_request(request) | ||
MessageMiddleware(get_response_for_middlewaremixin).process_request(request) | ||
return request | ||
|
||
|
||
def test_accept_prescriber_invitations(): | ||
request = fake_request() | ||
prescriber = PrescriberFactory() | ||
request.user = prescriber | ||
|
||
valid_invitation_1 = PrescriberWithOrgSentInvitationFactory(email=prescriber.email) | ||
valid_invitation_2 = PrescriberWithOrgSentInvitationFactory(email=prescriber.email) | ||
# non pending invitations | ||
PrescriberWithOrgSentInvitationFactory(email=prescriber.email, expired=True) | ||
PrescriberWithOrgSentInvitationFactory(email=prescriber.email, accepted=True, accepted_at=timezone.now()) | ||
# other user kind invitations | ||
EmployerInvitationFactory(email=prescriber.email) | ||
LaborInspectorInvitationFactory(email=prescriber.email) | ||
|
||
assert accept_all_pending_invitations(request) == [valid_invitation_1, valid_invitation_2] | ||
|
||
|
||
def test_accept_employer_invitations(): | ||
request = fake_request() | ||
prescriber = EmployerFactory() | ||
request.user = prescriber | ||
|
||
valid_invitation_1 = EmployerInvitationFactory(email=prescriber.email) | ||
valid_invitation_2 = EmployerInvitationFactory(email=prescriber.email) | ||
# non pending invitations | ||
EmployerInvitationFactory(email=prescriber.email, expired=True) | ||
EmployerInvitationFactory(email=prescriber.email, accepted=True, accepted_at=timezone.now()) | ||
# other user kind invitations | ||
PrescriberWithOrgSentInvitationFactory(email=prescriber.email) | ||
LaborInspectorInvitationFactory(email=prescriber.email) | ||
|
||
assert accept_all_pending_invitations(request) == [valid_invitation_1, valid_invitation_2] | ||
|
||
|
||
def test_accept_labor_inspector_invitations(): | ||
request = fake_request() | ||
prescriber = LaborInspectorFactory() | ||
request.user = prescriber | ||
|
||
valid_invitation_1 = LaborInspectorInvitationFactory(email=prescriber.email) | ||
valid_invitation_2 = LaborInspectorInvitationFactory(email=prescriber.email) | ||
# non pending invitations | ||
LaborInspectorInvitationFactory(email=prescriber.email, expired=True) | ||
LaborInspectorInvitationFactory(email=prescriber.email, accepted=True, accepted_at=timezone.now()) | ||
# other user kind invitations | ||
EmployerInvitationFactory(email=prescriber.email) | ||
PrescriberWithOrgSentInvitationFactory(email=prescriber.email) | ||
|
||
assert accept_all_pending_invitations(request) == [valid_invitation_1, valid_invitation_2] |
Oops, something went wrong.