1616from flask import current_app
1717from flask_login import current_user
1818from invenio_access .permissions import authenticated_user , system_identity
19+ from invenio_audit_logs .services .uow import AuditLogOp
1920from invenio_base import invenio_url_for
2021from invenio_drafts_resources .services .records import RecordService
2122from invenio_drafts_resources .services .records .uow import ParentRecordCommitOp
3031from marshmallow .exceptions import ValidationError
3132from sqlalchemy .orm .exc import NoResultFound
3233
34+ from invenio_rdm_records .auditlog .actions import (
35+ RDMDraftAccessSettingsAuditLog ,
36+ RDMDraftGrantAuditLog ,
37+ RDMDraftSecretLinkAuditLog ,
38+ RDMRecordAccessSettingsAuditLog ,
39+ RDMRecordGrantAuditLog ,
40+ RDMRecordSecretLinkAuditLog ,
41+ )
3342from invenio_rdm_records .notifications .builders import (
3443 GrantUserAccessNotificationBuilder ,
3544 GuestAccessRequestTokenCreateNotificationBuilder ,
@@ -222,6 +231,22 @@ def create_secret_link(self, identity, id_, data, links_config=None, uow=None):
222231 uow .register (ParentRecordCommitOp (parent , indexer_context = dict (service = self )))
223232 self ._update_parent_request (parent , uow )
224233
234+ audit_log_builder = (
235+ RDMRecordSecretLinkAuditLog
236+ if isinstance (record , self .record_cls )
237+ else RDMDraftSecretLinkAuditLog
238+ )
239+ uow .register (
240+ AuditLogOp (
241+ audit_log_builder .build (
242+ identity ,
243+ parent .pid .pid_value ,
244+ before = {},
245+ after = link .to_dict (),
246+ triggered_by = record ,
247+ )
248+ )
249+ )
225250 return self .link_result_item (
226251 self ,
227252 identity ,
@@ -301,6 +326,7 @@ def update_secret_link(
301326
302327 link_idx = link_ids .index (link_id )
303328 link = parent .access .links [link_idx ].resolve ()
329+ old_link = link .to_dict ()
304330
305331 # Validation
306332 data , __ = self .schema_secret_link .load (
@@ -323,6 +349,22 @@ def update_secret_link(
323349 uow .register (ParentRecordCommitOp (parent , indexer_context = dict (service = self )))
324350 self ._update_parent_request (parent , uow )
325351
352+ audit_log_builder = (
353+ RDMRecordSecretLinkAuditLog
354+ if isinstance (record , self .record_cls )
355+ else RDMDraftSecretLinkAuditLog
356+ )
357+ uow .register (
358+ AuditLogOp (
359+ audit_log_builder .build (
360+ identity ,
361+ parent .pid .pid_value ,
362+ before = old_link ,
363+ after = link .to_dict (),
364+ triggered_by = record ,
365+ )
366+ )
367+ )
326368 return self .link_result_item (
327369 self ,
328370 identity ,
@@ -353,6 +395,22 @@ def delete_secret_link(self, identity, id_, link_id, links_config=None, uow=None
353395 uow .register (ParentRecordCommitOp (parent , indexer_context = dict (service = self )))
354396 self ._update_parent_request (parent , uow )
355397
398+ audit_log_builder = (
399+ RDMRecordSecretLinkAuditLog
400+ if isinstance (record , self .record_cls )
401+ else RDMDraftSecretLinkAuditLog
402+ )
403+ uow .register (
404+ AuditLogOp (
405+ audit_log_builder .build (
406+ identity ,
407+ parent .pid .pid_value ,
408+ before = link .to_dict (),
409+ after = {},
410+ triggered_by = record ,
411+ )
412+ )
413+ )
356414 return True
357415
358416 #
@@ -447,6 +505,22 @@ def bulk_create_grants(self, identity, id_, data, expand=False, uow=None):
447505 uow .register (ParentRecordCommitOp (parent , indexer_context = dict (service = self )))
448506 self ._update_parent_request (parent , uow )
449507
508+ audit_log_builder = (
509+ RDMRecordGrantAuditLog
510+ if isinstance (record , self .record_cls )
511+ else RDMDraftGrantAuditLog
512+ )
513+ uow .register (
514+ AuditLogOp (
515+ audit_log_builder .build (
516+ identity ,
517+ parent .pid .pid_value ,
518+ before = [],
519+ after = [g .to_dict () for g in new_grants ],
520+ triggered_by = record ,
521+ )
522+ )
523+ )
450524 return self .grants_result_list (
451525 self ,
452526 identity ,
@@ -542,6 +616,22 @@ def update_grant(
542616 uow .register (ParentRecordCommitOp (parent , indexer_context = dict (service = self )))
543617 self ._update_parent_request (parent , uow )
544618
619+ audit_log_builder = (
620+ RDMRecordGrantAuditLog
621+ if isinstance (record , self .record_cls )
622+ else RDMDraftGrantAuditLog
623+ )
624+ uow .register (
625+ AuditLogOp (
626+ audit_log_builder .build (
627+ identity ,
628+ parent .pid .pid_value ,
629+ before = [old_grant .to_dict ()],
630+ after = [new_grant .to_dict ()],
631+ triggered_by = record ,
632+ )
633+ )
634+ )
545635 return self .grant_result_item (
546636 self ,
547637 identity ,
@@ -596,11 +686,27 @@ def delete_grant(self, identity, id_, grant_id, uow=None):
596686 raise PermissionDeniedError ()
597687
598688 # Deletion
599- parent .access .grants .pop (grant_id )
689+ deleted_grant = parent .access .grants .pop (grant_id )
600690
601691 uow .register (ParentRecordCommitOp (parent , indexer_context = dict (service = self )))
602692 self ._update_parent_request (parent , uow )
603693
694+ audit_log_builder = (
695+ RDMRecordGrantAuditLog
696+ if isinstance (record , self .record_cls )
697+ else RDMDraftGrantAuditLog
698+ )
699+ uow .register (
700+ AuditLogOp (
701+ audit_log_builder .build (
702+ identity ,
703+ parent .pid .pid_value ,
704+ before = [deleted_grant .to_dict ()],
705+ after = [],
706+ triggered_by = record ,
707+ )
708+ )
709+ )
604710 return True
605711
606712 def _exists (self , created_by , record_id , request_type ):
@@ -844,10 +950,28 @@ def update_access_settings(
844950 )
845951
846952 # Update
953+ old_settings = parent .access .settings .dump ()
847954 setattr (parent .access , "settings" , data )
848955
849956 uow .register (ParentRecordCommitOp (parent , indexer_context = dict (service = self )))
850957
958+ audit_log_builder = (
959+ RDMRecordAccessSettingsAuditLog
960+ if isinstance (record , self .record_cls )
961+ else RDMDraftAccessSettingsAuditLog
962+ )
963+ uow .register (
964+ AuditLogOp (
965+ audit_log_builder .build (
966+ identity ,
967+ parent .pid .pid_value ,
968+ before = old_settings ,
969+ after = parent .access .settings .dump (),
970+ triggered_by = record ,
971+ )
972+ )
973+ )
974+
851975 return self .result_item (
852976 self ,
853977 identity ,
@@ -964,6 +1088,22 @@ def update_grant_by_subject(
9641088 uow .register (ParentRecordCommitOp (parent , indexer_context = dict (service = self )))
9651089 self ._update_parent_request (parent , uow )
9661090
1091+ audit_log_builder = (
1092+ RDMRecordGrantAuditLog
1093+ if isinstance (record , self .record_cls )
1094+ else RDMDraftGrantAuditLog
1095+ )
1096+ uow .register (
1097+ AuditLogOp (
1098+ audit_log_builder .build (
1099+ identity ,
1100+ parent .pid .pid_value ,
1101+ before = [old_grant .to_dict ()],
1102+ after = [new_grant .to_dict ()],
1103+ triggered_by = record ,
1104+ )
1105+ )
1106+ )
9671107 return self .grant_result_item (
9681108 self ,
9691109 identity ,
@@ -995,4 +1135,20 @@ def delete_grant_by_subject(
9951135 uow .register (ParentRecordCommitOp (parent , indexer_context = dict (service = self )))
9961136 self ._update_parent_request (parent , uow )
9971137
1138+ audit_log_builder = (
1139+ RDMRecordGrantAuditLog
1140+ if isinstance (record , self .record_cls )
1141+ else RDMDraftGrantAuditLog
1142+ )
1143+ uow .register (
1144+ AuditLogOp (
1145+ audit_log_builder .build (
1146+ identity ,
1147+ parent .pid .pid_value ,
1148+ before = [result .to_dict ()],
1149+ after = [],
1150+ triggered_by = record ,
1151+ )
1152+ )
1153+ )
9981154 return True
0 commit comments