2929 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
3030 */
3131class custom_completion extends activity_custom_completion {
32-
3332 /**
3433 * Fetches the completion state for a given completion rule.
3534 *
@@ -38,26 +37,62 @@ class custom_completion extends activity_custom_completion {
3837 */
3938 public function get_state (string $ rule ): int {
4039 global $ CFG , $ DB ;
40+ require_once ($ CFG ->dirroot . '/mod/publication/locallib.php ' );
41+ require_once ($ CFG ->libdir . '/grouplib.php ' );
4142
4243 $ this ->validate_rule ($ rule );
4344
44- $ userid = $ this ->userid ;
4545 $ cm = $ this ->cm ;
4646
47- require_once ( $ CFG -> dirroot . ' /mod/publication/locallib.php ' ) ;
47+ $ userid = $ this -> userid ;
4848
4949 $ publication = new \publication ($ cm , $ cm ->course , \context_module::instance ($ cm ->id ));
50- $ status = false ;
51- if ($ publication ->get_mode () == PUBLICATION_MODE_FILEUPLOAD ) {
52- $ filescount = $ DB ->count_records ('publication_file ' , [
53- 'publication ' => $ publication ->get_instance ()->id ,
54- 'userid ' => $ userid ,
55- ]);
56- $ status = $ filescount > 0 ;
57- } else {
58- $ status = true ;
50+ $ mode = $ publication ->get_mode ();
51+ $ status = COMPLETION_UNKNOWN ;
52+ if ($ rule == 'completionupload ' && $ publication ->get_instance ()->completionupload ) {
53+ if ($ mode == PUBLICATION_MODE_FILEUPLOAD ) {
54+ $ filescount = $ DB ->count_records ('publication_file ' , [
55+ 'publication ' => $ publication ->get_instance ()->id ,
56+ 'userid ' => $ userid ,
57+ ]);
58+ $ status = $ filescount > 0 ? COMPLETION_COMPLETE : COMPLETION_INCOMPLETE ;
59+ } else {
60+ $ status = COMPLETION_COMPLETE ;
61+ }
62+ } else if ($ rule == 'completionassignsubmission ' && $ publication ->get_instance ()->completionassignsubmission ) {
63+ if ($ mode == PUBLICATION_MODE_FILEUPLOAD ) {
64+ $ status = COMPLETION_COMPLETE ;
65+ } else if ($ mode == PUBLICATION_MODE_ASSIGN_IMPORT ) {
66+ $ filescount = $ DB ->count_records ('publication_file ' , [
67+ 'publication ' => $ publication ->get_instance ()->id ,
68+ 'userid ' => $ userid ,
69+ ]);
70+ $ status = $ filescount > 0 ? COMPLETION_COMPLETE : COMPLETION_INCOMPLETE ;
71+ } else if ($ mode == PUBLICATION_MODE_ASSIGN_TEAMSUBMISSION ) {
72+ $ status = COMPLETION_INCOMPLETE ;
73+ $ groups = \groups_get_user_groups ($ cm ->course , $ userid );
74+ $ groupids = [];
75+ if (!empty ($ groups [0 ])) {
76+ $ groupids = $ groups [0 ];
77+ } else if (!$ publication ->requiregroup ()) {
78+ $ groupids [] = 0 ; // Use groupid 0 for users without groups.
79+ }
80+ if (empty ($ groupids )) {
81+ return $ status ; // User is not in any group and groups are required.
82+ }
83+ foreach ($ groupids as $ groupid ) { // Iterate over all groups of the user.
84+ $ filescount = $ DB ->count_records ('publication_file ' , [
85+ 'publication ' => $ publication ->get_instance ()->id ,
86+ 'userid ' => $ groupid ,
87+ ]);
88+ if ($ filescount > 0 ) {
89+ $ status = COMPLETION_COMPLETE ;
90+ break ;
91+ }
92+ }
93+ }
5994 }
60- return $ status ? COMPLETION_COMPLETE : COMPLETION_INCOMPLETE ;
95+ return $ status ;
6196 }
6297
6398 /**
@@ -66,7 +101,7 @@ public function get_state(string $rule): int {
66101 * @return array
67102 */
68103 public static function get_defined_custom_rules (): array {
69- return ['completionupload ' ];
104+ return ['completionupload ' , ' completionassignsubmission ' ];
70105 }
71106
72107 /**
@@ -77,6 +112,7 @@ public static function get_defined_custom_rules(): array {
77112 public function get_custom_rule_descriptions (): array {
78113 return [
79114 'completionupload ' => get_string ('completiondetail:upload ' , 'publication ' ),
115+ 'completionassignsubmission ' => get_string ('completiondetail:assignsubmission ' , 'publication ' ),
80116 ];
81117 }
82118
@@ -89,6 +125,7 @@ public function get_sort_order(): array {
89125 return [
90126 'completionview ' ,
91127 'completionupload ' ,
128+ 'completionassignsubmission ' ,
92129 ];
93130 }
94131}
0 commit comments