Skip to content

Commit 41afff5

Browse files
committed
Add audit log entries for grant status changes
1 parent 59308df commit 41afff5

2 files changed

Lines changed: 75 additions & 0 deletions

File tree

backend/grants/admin.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,31 @@ class GrantAdmin(ExportMixin, ConferencePermissionMixin, admin.ModelAdmin):
564564
),
565565
)
566566

567+
def save_model(self, request, obj, form, change):
568+
"""
569+
Override to log admin actions when status is changed.
570+
"""
571+
if change:
572+
if obj.status != obj._original_status:
573+
create_change_admin_log_entry(
574+
request.user,
575+
obj,
576+
change_message=f"Status changed from '{obj._original_status}' to '{obj.status}'",
577+
)
578+
if obj.pending_status != obj._original_pending_status:
579+
create_change_admin_log_entry(
580+
request.user,
581+
obj,
582+
change_message=f"Pending status changed from '{obj._original_pending_status}' to '{obj.pending_status}'",
583+
)
584+
else:
585+
create_addition_admin_log_entry(
586+
request.user,
587+
obj,
588+
change_message="Grant created",
589+
)
590+
super().save_model(request, obj, form, change)
591+
567592
def change_view(self, request, object_id, form_url="", extra_context=None):
568593
extra_context = extra_context or {}
569594
grant = self.model.objects.get(id=object_id)

backend/grants/tests/test_admin.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from conferences.tests.factories import ConferenceFactory, ConferenceVoucherFactory
1212
from grants.admin import (
1313
confirm_pending_status,
14+
GrantAdmin,
1415
GrantReimbursementAdmin,
1516
create_grant_vouchers,
1617
mark_rejected_and_send_email,
@@ -703,3 +704,52 @@ def test_delete_reimbursement_from_admin_logs_audit_log_entry(rf, admin_user):
703704
object_id=grant.id,
704705
change_message=f"Reimbursement removed: {reimbursement.category.name}",
705706
).exists()
707+
708+
709+
def test_save_grant_in_admin_logs_audit_log_entry(rf, admin_user):
710+
grant = GrantFactory()
711+
request = rf.get("/")
712+
request.user = admin_user
713+
714+
admin = GrantAdmin(Grant, AdminSite())
715+
admin.save_model(request, grant, None, False)
716+
717+
assert LogEntry.objects.filter(
718+
user=admin_user,
719+
object_id=grant.id,
720+
change_message="Grant created",
721+
).exists()
722+
723+
724+
def test_save_grant_in_admin_logs_audit_log_entry_for_status_change(rf, admin_user):
725+
grant = GrantFactory(status=Grant.Status.pending)
726+
request = rf.get("/")
727+
request.user = admin_user
728+
729+
admin = GrantAdmin(Grant, AdminSite())
730+
grant.status = Grant.Status.confirmed
731+
admin.save_model(request, grant, None, True)
732+
733+
assert LogEntry.objects.filter(
734+
user=admin_user,
735+
object_id=grant.id,
736+
change_message="Status changed from 'pending' to 'confirmed'",
737+
).exists()
738+
739+
740+
def test_save_grant_in_admin_logs_audit_log_entry_for_pending_status_change(
741+
rf, admin_user
742+
):
743+
grant = GrantFactory(pending_status=Grant.Status.pending)
744+
request = rf.get("/")
745+
request.user = admin_user
746+
747+
admin = GrantAdmin(Grant, AdminSite())
748+
grant.pending_status = Grant.Status.confirmed
749+
admin.save_model(request, grant, None, True)
750+
751+
assert LogEntry.objects.filter(
752+
user=admin_user,
753+
object_id=grant.id,
754+
change_message="Pending status changed from 'pending' to 'confirmed'",
755+
).exists()

0 commit comments

Comments
 (0)