@@ -218,17 +218,32 @@ def send_reply_emails(modeladmin, request, queryset):
218218 grant .save ()
219219 send_grant_reply_approved_email .delay (grant_id = grant .id , is_reminder = False )
220220
221+ create_change_admin_log_entry (
222+ request .user ,
223+ grant ,
224+ change_message = "Sent Approved reply email to applicant." ,
225+ )
221226 messages .info (request , f"Sent Approved reply email to { grant .name } " )
222227
223228 if (
224229 grant .status == Grant .Status .waiting_list
225230 or grant .status == Grant .Status .waiting_list_maybe
226231 ):
227232 send_grant_reply_waiting_list_email .delay (grant_id = grant .id )
233+ create_change_admin_log_entry (
234+ request .user ,
235+ grant ,
236+ change_message = "Sent Waiting List reply email to applicant." ,
237+ )
228238 messages .info (request , f"Sent Waiting List reply email to { grant .name } " )
229239
230240 if grant .status == Grant .Status .rejected :
231241 send_grant_reply_rejected_email .delay (grant_id = grant .id )
242+ create_change_admin_log_entry (
243+ request .user ,
244+ grant ,
245+ change_message = "Sent Rejected reply email to applicant." ,
246+ )
232247 messages .info (request , f"Sent Rejected reply email to { grant .name } " )
233248
234249
@@ -252,6 +267,11 @@ def send_grant_reminder_to_waiting_for_confirmation(modeladmin, request, queryse
252267
253268 send_grant_reply_approved_email .delay (grant_id = grant .id , is_reminder = True )
254269
270+ create_change_admin_log_entry (
271+ request .user ,
272+ grant ,
273+ change_message = "Sent Approved reminder email to applicant." ,
274+ )
255275 messages .info (request , f"Grant reminder sent to { grant .name } " )
256276
257277
@@ -267,6 +287,11 @@ def send_reply_email_waiting_list_update(modeladmin, request, queryset):
267287
268288 for grant in queryset :
269289 send_grant_reply_waiting_list_update_email .delay (grant_id = grant .id )
290+ create_change_admin_log_entry (
291+ request .user ,
292+ grant ,
293+ change_message = "Sent Waiting List update reply email to applicant." ,
294+ )
270295 messages .info (request , f"Sent Waiting List update reply email to { grant .name } " )
271296
272297
@@ -300,7 +325,7 @@ def create_grant_vouchers(modeladmin, request, queryset):
300325 create_addition_admin_log_entry (
301326 request .user ,
302327 grant ,
303- change_message = "Created voucher for this grant" ,
328+ change_message = "Created voucher for this grant. " ,
304329 )
305330
306331 vouchers_to_create .append (
@@ -321,12 +346,12 @@ def create_grant_vouchers(modeladmin, request, queryset):
321346 create_change_admin_log_entry (
322347 request .user ,
323348 existing_voucher ,
324- change_message = "Upgraded Co-Speaker voucher to Grant voucher" ,
349+ change_message = "Upgraded Co-Speaker voucher to Grant voucher. " ,
325350 )
326351 create_change_admin_log_entry (
327352 request .user ,
328353 grant ,
329- change_message = "Updated existing Co-Speaker voucher to grant" ,
354+ change_message = "Updated existing Co-Speaker voucher to grant. " ,
330355 )
331356 existing_voucher .voucher_type = ConferenceVoucher .VoucherType .GRANT
332357 vouchers_to_update .append (existing_voucher )
@@ -348,9 +373,16 @@ def mark_rejected_and_send_email(modeladmin, request, queryset):
348373 )
349374
350375 for grant in queryset :
376+ old_status = grant .status
351377 grant .status = Grant .Status .rejected
352378 grant .save ()
353379
380+ create_change_admin_log_entry (
381+ request .user ,
382+ grant ,
383+ change_message = f"Status changed from '{ old_status } ' to 'rejected' and rejection email sent." ,
384+ )
385+
354386 send_grant_reply_rejected_email .delay (grant_id = grant .id )
355387 messages .info (request , f"Sent Rejected reply email to { grant .name } " )
356388
@@ -405,13 +437,29 @@ class GrantReimbursementAdmin(ConferencePermissionMixin, admin.ModelAdmin):
405437 search_fields = ("grant__full_name" , "grant__email" )
406438 autocomplete_fields = ("grant" ,)
407439
440+ def delete_model (self , request , obj ):
441+ create_change_admin_log_entry (
442+ request .user ,
443+ obj .grant ,
444+ change_message = f"Reimbursement removed: { obj .category .name } ." ,
445+ )
446+ super ().delete_model (request , obj )
447+
408448
409449class GrantReimbursementInline (admin .TabularInline ):
410450 model = GrantReimbursement
411451 extra = 0
412452 autocomplete_fields = ["category" ]
413453 fields = ["category" , "granted_amount" ]
414454
455+ def delete_model (self , request , obj ):
456+ create_change_admin_log_entry (
457+ request .user ,
458+ obj .grant ,
459+ change_message = f"Reimbursement removed: { obj .category .name } ." ,
460+ )
461+ super ().delete_model (request , obj )
462+
415463
416464@admin .register (Grant )
417465class GrantAdmin (ExportMixin , ConferencePermissionMixin , admin .ModelAdmin ):
@@ -516,6 +564,31 @@ class GrantAdmin(ExportMixin, ConferencePermissionMixin, admin.ModelAdmin):
516564 ),
517565 )
518566
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+
519592 def change_view (self , request , object_id , form_url = "" , extra_context = None ):
520593 extra_context = extra_context or {}
521594 grant = self .model .objects .get (id = object_id )
0 commit comments