@@ -83,6 +83,16 @@ public static function get_metadata(collection $collection): collection {
8383 $ collection ->add_database_table ('publication_file ' , $ publicationfile , 'privacy:metadata:files ' );
8484 $ collection ->add_database_table ('publication_groupapproval ' , $ publicationgroupapproval , 'privacy:metadata:groupapproval ' );
8585
86+ $ publicationoverrides = [
87+ 'userid ' => 'privacy:metadata:userid ' ,
88+ 'groupid ' => 'privacy:metadata:groupid ' ,
89+ 'allowsubmissionsfromdate ' => 'privacy:metadata:allowsubmissionsfromdate ' ,
90+ 'duedate ' => 'privacy:metadata:duedate ' ,
91+ 'approvalfromdate ' => 'privacy:metadata:approvalfromdate ' ,
92+ 'approvaltodate ' => 'privacy:metadata:approvaltodate ' ,
93+ ];
94+ $ collection ->add_database_table ('publication_overrides ' , $ publicationoverrides , 'privacy:metadata:overrides ' );
95+
8696 $ collection ->add_user_preference ('publication_perpage ' , 'privacy:metadata:publicationperpage ' );
8797
8898 // Link to subplugins.
@@ -107,6 +117,7 @@ public static function get_contexts_for_userid(int $userid): contextlist {
107117 'guserid ' => $ userid ,
108118 'extuserid ' => $ userid ,
109119 'fuserid ' => $ userid ,
120+ 'ovruserid ' => $ userid ,
110121 ];
111122
112123 $ enroled = enrol_get_all_users_courses ($ userid );
@@ -138,13 +149,15 @@ public static function get_contexts_for_userid(int $userid): contextlist {
138149LEFT JOIN {publication_extduedates} ext ON p.id = ext.publication
139150LEFT JOIN {publication_file} f ON p.id = f.publication
140151LEFT JOIN {publication_groupapproval} ga ON f.id = ga.fileid
152+ LEFT JOIN {publication_overrides} po ON p.id = po.publication
141153LEFT JOIN {assign} a ON p.importfrom = a.id
142154LEFT JOIN {groups} g ON g.courseid = p.course
143155LEFT JOIN {groups_members} gm ON g.id = gm.groupid AND gm.userid = :guserid
144156 WHERE ((p.importfrom > 0 AND a.teamsubmission > 0)
145157 AND ((gm.userid = :userid AND (ext.userid = gm.groupid OR f.userid = gm.groupid))
146158 OR (gm.userid IS NULL AND f.userid = 0 AND a.preventsubmissionnotingroup = 0 AND g.courseid $ enrolsql)))
147- OR ((p.importfrom <= 0 OR a.teamsubmission = 0) AND (ext.userid = :extuserid OR f.userid = :fuserid)) " ;
159+ OR ((p.importfrom <= 0 OR a.teamsubmission = 0) AND (ext.userid = :extuserid OR f.userid = :fuserid))
160+ OR (po.userid = :ovruserid OR po.groupid = gm.groupid) " ;
148161 $ contextlist = new contextlist ();
149162 $ contextlist ->add_from_sql ($ sql , $ params );
150163
@@ -227,6 +240,27 @@ public static function get_users_in_context(userlist $userlist) {
227240 JOIN {publication_groupapproval} ga ON p.id = ga.fileid
228241 WHERE ctx.id = :contextid AND ctx.contextlevel = :contextlevel " ;
229242 $ userlist ->add_from_sql ('userid ' , $ sql , $ params );
243+
244+ // Get all users with user-specific overrides.
245+ $ sql = "SELECT po.userid
246+ FROM {context} ctx
247+ JOIN {course_modules} cm ON cm.id = ctx.instanceid
248+ JOIN {modules} m ON m.id = cm.module AND m.name = :modulename
249+ JOIN {publication} p ON p.id = cm.instance
250+ JOIN {publication_overrides} po ON po.publication = p.id
251+ WHERE ctx.id = :contextid AND ctx.contextlevel = :contextlevel AND po.userid IS NOT NULL " ;
252+ $ userlist ->add_from_sql ('userid ' , $ sql , $ params );
253+
254+ // Get all users who belong to a group with an override.
255+ $ sql = "SELECT gm.userid
256+ FROM {context} ctx
257+ JOIN {course_modules} cm ON cm.id = ctx.instanceid
258+ JOIN {modules} m ON m.id = cm.module AND m.name = :modulename
259+ JOIN {publication} p ON p.id = cm.instance
260+ JOIN {publication_overrides} po ON po.publication = p.id
261+ JOIN {groups_members} gm ON gm.groupid = po.groupid
262+ WHERE ctx.id = :contextid AND ctx.contextlevel = :contextlevel AND po.groupid IS NOT NULL " ;
263+ $ userlist ->add_from_sql ('userid ' , $ sql , $ params );
230264 }
231265
232266 /**
@@ -261,9 +295,11 @@ public static function delete_data_for_users(approved_userlist $userlist) {
261295
262296 list ($ usersql , $ userparams ) = $ DB ->get_in_or_equal ($ userids , SQL_PARAMS_NAMED , 'usr ' );
263297
264- // Delete users' files, extended due dates and groupapprovals for this publication!
298+ // Delete users' files, extended due dates, overrides and groupapprovals for this publication!
265299 $ DB ->delete_records_select ('publication_extduedates ' , "publication = :id AND userid " .$ usersql ,
266300 ['id ' => $ id ] + $ userparams );
301+ $ DB ->delete_records_select ('publication_overrides ' , "publication = :id AND userid " .$ usersql ,
302+ ['id ' => $ id ] + $ userparams );
267303 $ files = $ DB ->get_records_select ('publication_file ' , "publication = :id AND userid " .$ usersql ,
268304 ['id ' => $ id ] + $ userparams );
269305
@@ -344,6 +380,7 @@ public static function export_user_data(approved_contextlist $contextlist) {
344380 static ::export_user_preferences ($ user ->id );
345381 static ::export_extensions ($ context , $ publication , $ user );
346382 static ::export_files ($ context , $ publication , $ user , []);
383+ static ::export_overrides ($ context , $ publication , $ user );
347384 }
348385 }
349386
@@ -395,6 +432,60 @@ public static function export_extensions(\context $context, \publication $pub, \
395432 }
396433 }
397434
435+ /**
436+ * Export publication overrides relevant to this user (user and group-based).
437+ *
438+ * @param \context $context Context
439+ * @param \publication $pub The publication object.
440+ * @param \stdClass $user The user object.
441+ * @throws \dml_exception
442+ */
443+ protected static function export_overrides (\context $ context , \publication $ pub , \stdClass $ user ) {
444+ global $ DB ;
445+
446+ $ publicationid = $ pub ->get_instance ()->id ;
447+ $ courseid = $ pub ->get_instance ()->course ;
448+
449+ // User-specific overrides.
450+ $ overrides = $ DB ->get_records ('publication_overrides ' , [
451+ 'publication ' => $ publicationid ,
452+ 'userid ' => $ user ->id ,
453+ ]);
454+
455+ // Group-based overrides for any of user's groups in this course.
456+ $ groups = groups_get_user_groups ($ courseid , $ user ->id );
457+ $ groupids = [];
458+ if (!empty ($ groups ) && isset ($ groups [0 ]) && is_array ($ groups [0 ])) {
459+ $ groupids = $ groups [0 ];
460+ }
461+ if (!empty ($ groupids )) {
462+ list ($ insql , $ inparams ) = $ DB ->get_in_or_equal ($ groupids , SQL_PARAMS_NAMED , 'grp ' );
463+ $ sql = "SELECT * FROM {publication_overrides} WHERE publication = :publication AND groupid " . $ insql ;
464+ $ recs = $ DB ->get_records_sql ($ sql , ['publication ' => $ publicationid ] + $ inparams );
465+ $ overrides = $ overrides + $ recs ;
466+ }
467+
468+ foreach ($ overrides as $ ovr ) {
469+ $ data = (object )[
470+ 'userid ' => $ ovr ->userid ,
471+ 'groupid ' => $ ovr ->groupid ,
472+ ];
473+ if (!is_null ($ ovr ->allowsubmissionsfromdate ) && $ ovr ->allowsubmissionsfromdate != 0 ) {
474+ $ data ->allowsubmissionsfromdate = transform::datetime ($ ovr ->allowsubmissionsfromdate );
475+ }
476+ if (!is_null ($ ovr ->duedate ) && $ ovr ->duedate != 0 ) {
477+ $ data ->duedate = transform::datetime ($ ovr ->duedate );
478+ }
479+ if (!is_null ($ ovr ->approvalfromdate ) && $ ovr ->approvalfromdate != 0 ) {
480+ $ data ->approvalfromdate = transform::datetime ($ ovr ->approvalfromdate );
481+ }
482+ if (!is_null ($ ovr ->approvaltodate ) && $ ovr ->approvaltodate != 0 ) {
483+ $ data ->approvaltodate = transform::datetime ($ ovr ->approvaltodate );
484+ }
485+ writer::with_context ($ context )->export_data ([], $ data );
486+ }
487+ }
488+
398489 /**
399490 * Fetches all of the user's files and adds them to the export
400491 *
@@ -647,6 +738,7 @@ public static function delete_data_for_all_users_in_context(\context $context) {
647738 }
648739
649740 $ DB ->delete_records ('publication_extduedates ' , ['publication ' => $ id ]);
741+ $ DB ->delete_records ('publication_overrides ' , ['publication ' => $ id ]);
650742 }
651743 }
652744 }
@@ -736,6 +828,7 @@ public static function delete_data_for_user(approved_contextlist $contextlist) {
736828 }
737829
738830 $ DB ->delete_records ('publication_extduedates ' , ['publication ' => $ pub ->id , 'userid ' => $ user ->id ]);
831+ $ DB ->delete_records ('publication_overrides ' , ['publication ' => $ pub ->id , 'userid ' => $ user ->id ]);
739832 }
740833 }
741834}
0 commit comments