Skip to content

Commit

Permalink
Validation - Send notification to version author and validation reque…
Browse files Browse the repository at this point in the history
…ster on request change and validation
  • Loading branch information
Adrien Jézégou committed Jan 15, 2024
1 parent a1c9b30 commit 570ea8c
Show file tree
Hide file tree
Showing 4 changed files with 304 additions and 37 deletions.
58 changes: 44 additions & 14 deletions src/backend/partaj/core/api/referral_report_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -481,11 +481,26 @@ def request_change(self, request, pk):

# All previous validations and request change by the same user has to be
# inactivated / canceled
version.events.filter(
active_request_validation_query_set = version.events.filter(
state=ReportEventState.ACTIVE,
verb=ReportEventVerb.REQUEST_VALIDATION,
metadata__receiver_role=sender_role,
).update(state=ReportEventState.INACTIVE)
)

active_request_validation_event_authors = [
active_event.user
for active_event in active_request_validation_query_set.all()
]

notified_users = list(
set(active_request_validation_event_authors + [version.created_by])
)

# All previous validation requests has to be also
# inactivated / canceled
active_request_validation_query_set.update(
state=ReportEventState.INACTIVE
)

request_change_event = ReportEventFactory().create_request_change_event(
sender=request.user,
Expand All @@ -494,14 +509,16 @@ def request_change(self, request, pk):
comment=comment,
)
version.report.referral.save()
notification = Notification.objects.create(
notification_type=NotificationEvents.VERSION_REQUEST_CHANGE,
notifier=request.user,
notified=version.created_by,
preview=comment,
item_content_object=request_change_event,
)
notification.notify(version.report.referral, version)

for notified_user in notified_users:
notification = Notification.objects.create(
notification_type=NotificationEvents.VERSION_REQUEST_CHANGE,
notifier=request.user,
notified=notified_user,
preview=comment,
item_content_object=request_change_event,
)
notification.notify(version.report.referral, version)

except (IntegrityError, PermissionError, Exception) as error:
for i in error.args:
Expand Down Expand Up @@ -550,11 +567,24 @@ def validate(self, request, pk):
metadata__sender_unit_name=request.user.unit_name,
).update(state=ReportEventState.INACTIVE)

version.events.filter(
active_request_validation_query_set = version.events.filter(
state=ReportEventState.ACTIVE,
verb=ReportEventVerb.REQUEST_VALIDATION,
metadata__receiver_role=sender_role,
).update(state=ReportEventState.INACTIVE)
)

active_request_validation_event_authors = [
active_event.user
for active_event in active_request_validation_query_set.all()
]

notified_users = list(
set(active_request_validation_event_authors + [version.created_by])
)

active_request_validation_query_set.update(
state=ReportEventState.INACTIVE
)

# Finally create the new validation event
validate_version_event = ReportEventFactory().validate_version_event(
Expand All @@ -565,11 +595,11 @@ def validate(self, request, pk):
)
version.report.referral.save()

for assignee in version.report.referral.assignees.all():
for notified_user in notified_users:
notification = Notification.objects.create(
notification_type=NotificationEvents.VERSION_VALIDATED,
notifier=request.user,
notified=assignee,
notified=notified_user,
preview=comment,
item_content_object=validate_version_event,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class ReferralReportRequestChangeApiTestCase(TestCase):
"""

# Request validation API TESTS
def test_referralreport_requestchange_behavior(self, mock_mailer_send):
def test_referralreport_requestchange_scenario_1(self, mock_mailer_send):
"""
Test
- Request change can be done by unit granted users on last version
Expand Down Expand Up @@ -171,7 +171,127 @@ def test_referralreport_requestchange_behavior(self, mock_mailer_send):
).count()
self.assertEqual(active_validation_request_events, 2)

def test_referralreport_requestvalidation_state_and_mails(self, mock_mailer_send):
def test_referralreportversion_validate_scenario_2(self, mock_mailer_send):
"""
Test
- Referral doesn't change its state after request change
- Mails are sent to version author and request validation author
"""

# Initialize requesters, unit members and referral
unit = factories.UnitFactory(name='unit_name')
unit_member_1 = factories.UserFactory(unit_name=unit.name)

# Add unit members
unit.members.add(unit_member_1)

# Add unit owner
unit_owner_1 = factories.UserFactory(unit_name=unit.name)
factories.UnitMembershipFactory(
role=models.UnitMembershipRole.OWNER,
unit=unit,
user=unit_owner_1
)

# Add unit admin
unit_admin = factories.UserFactory(unit_name="admin_unit")
factories.UnitMembershipFactory(
role=models.UnitMembershipRole.ADMIN,
unit=unit,
user=unit_admin
)

requester_1 = factories.UserFactory(unit_name='tieps')
requester_2 = factories.UserFactory(unit_name='tieps')

report = factories.ReferralReportFactory()
referral = mock_create_referral(
models.ReferralState.PROCESSING,
report,
unit
)

# Set requesters
referral.users.set([requester_1.id, requester_2.id])

created_referral = models.Referral.objects.get(id=referral.id)
created_referral.refresh_from_db()

"""
Send a first version with the unit_member_1 and validate it by granted user
"""
first_attachment_file = BytesIO(b"attachment_file")
first_attachment_file.name = "the first attachment file name.doc"
unit_member_1_token = Token.objects.get_or_create(user=unit_member_1)[0]
unit_owner_token_1 = Token.objects.get_or_create(user=unit_owner_1)[0]
unit_admin_token_1 = Token.objects.get_or_create(user=unit_admin)[0]

# Send first version
first_version_response = self.client.post(
"/api/referralreportversions/",
{
"report": str(created_referral.report.id),
"files": (first_attachment_file,),
},
HTTP_AUTHORIZATION=f"Token {unit_member_1_token}",
)

version = models.ReferralReportVersion.objects.get(
id=first_version_response.json()['id'])

self.assertEqual(first_version_response.status_code, 201)

# Request validation from unit owner of unit member version
request_validation_response = self.client.post(
f"/api/referralreportversions/{first_version_response.json()['id']}/request_validation/",
{
"comment": "blabla admin_1",
"selected_options": [
{
"role": "admin",
"unit_name": "admin_unit",
}
]
},
content_type="application/json",
HTTP_AUTHORIZATION=f"Token {unit_owner_token_1}",
)
self.assertEqual(request_validation_response.status_code, 200)

admin_validation_response = self.client.post(
f"/api/referralreportversions/{first_version_response.json()['id']}/request_change/",
{"comment": "blabla owner_1"},
content_type="application/json",
HTTP_AUTHORIZATION=f"Token {unit_admin_token_1}",
)
self.assertEqual(admin_validation_response.status_code, 200)

mailer_send_args = [call[0] for call in mock_mailer_send.call_args_list]

self.assertEquals(referral.state, models.ReferralState.PROCESSING)
self.assertTrue(
get_request_change(
notified_user=unit_member_1,
referral=referral,
validator=unit_admin,
unit_name=unit_admin.unit_name,
version=version
)
in mailer_send_args
)

self.assertTrue(
get_request_change(
notified_user=unit_owner_1,
referral=referral,
validator=unit_admin,
unit_name=unit_admin.unit_name,
version=version
)
in mailer_send_args
)

def test_referralreport_requestchange_scenario_3(self, mock_mailer_send):
"""
Test
- Referral doesn't change its state after request change
Expand Down Expand Up @@ -247,10 +367,10 @@ def test_referralreport_requestvalidation_state_and_mails(self, mock_mailer_send

self.assertTrue(
get_request_change(
requester=unit_member_1,
notified_user=unit_member_1,
referral=referral,
validator=unit_owner_1,
unit=referral.units.get(),
unit_name=unit_owner_1.unit_name,
version=version
)
in mailer_send_args
Expand Down
Loading

0 comments on commit 570ea8c

Please sign in to comment.