Merge branch 'MDL-62384-34' of git://github.com/andrewnicols/moodle into MOODLE_34_STABLE

This commit is contained in:
Eloy Lafuente (stronk7) 2018-05-11 18:27:58 +02:00
commit 6204ed292e
13 changed files with 125 additions and 59 deletions

View file

@ -74,10 +74,8 @@ class provider implements
*/ */
public static function add_contexts_for_userid(contextlist $contextlist, $userid) { public static function add_contexts_for_userid(contextlist $contextlist, $userid) {
$sql = " $sql = "
SELECT ctx.id SELECT l.contextid
FROM {context} ctx FROM {logstore_standard_log} l
JOIN {logstore_standard_log} l
ON l.contextid = ctx.id
WHERE l.userid = :userid1 WHERE l.userid = :userid1
OR l.relateduserid = :userid2 OR l.relateduserid = :userid2
OR l.realuserid = :userid3"; OR l.realuserid = :userid3";

View file

@ -91,8 +91,10 @@ class provider implements \core_privacy\local\metadata\provider, \core_privacy\l
$sql = "SELECT DISTINCT ctx.id $sql = "SELECT DISTINCT ctx.id
FROM {context} ctx FROM {context} ctx
LEFT JOIN {tool_monitor_rules} mr ON ctx.instanceid = mr.userid AND ctx.contextlevel = :contextuserrule LEFT JOIN {tool_monitor_rules} mr ON ctx.instanceid = mr.userid AND ctx.contextlevel = :contextuserrule
AND mr.userid = :useridsubscriptions
LEFT JOIN {tool_monitor_subscriptions} ms ON ctx.instanceid = ms.userid AND ctx.contextlevel = :contextusersub LEFT JOIN {tool_monitor_subscriptions} ms ON ctx.instanceid = ms.userid AND ctx.contextlevel = :contextusersub
WHERE (ms.userid = :useridrules OR mr.userid = :useridsubscriptions)"; AND ms.userid = :useridrules
WHERE ms.id IS NOT NULL OR mr.id IS NOT NULL";
$contextlist = new contextlist(); $contextlist = new contextlist();
$contextlist->add_from_sql($sql, $params); $contextlist->add_from_sql($sql, $params);

View file

@ -75,8 +75,7 @@ class provider implements
public static function get_contexts_for_userid(int $userid) : contextlist { public static function get_contexts_for_userid(int $userid) : contextlist {
$sql = "SELECT ctx.id $sql = "SELECT ctx.id
FROM {auth_oauth2_linked_login} ao FROM {auth_oauth2_linked_login} ao
JOIN {user} u ON ao.userid = u.id JOIN {context} ctx ON ctx.instanceid = ao.userid AND ctx.contextlevel = :contextlevel
JOIN {context} ctx ON ctx.instanceid = u.id AND ctx.contextlevel = :contextlevel
WHERE ao.userid = :userid"; WHERE ao.userid = :userid";
$params = ['userid' => $userid, 'contextlevel' => CONTEXT_USER]; $params = ['userid' => $userid, 'contextlevel' => CONTEXT_USER];
$contextlist = new contextlist(); $contextlist = new contextlist();

View file

@ -250,11 +250,13 @@ class provider implements
ON tpl.contextid = ctx.id ON tpl.contextid = ctx.id
LEFT JOIN {" . template_cohort::TABLE . "} tch LEFT JOIN {" . template_cohort::TABLE . "} tch
ON tch.templateid = tpl.id ON tch.templateid = tpl.id
AND tch.usermodified = :userid2
LEFT JOIN {" . template_competency::TABLE . "} tc LEFT JOIN {" . template_competency::TABLE . "} tc
ON tc.templateid = tpl.id ON tc.templateid = tpl.id
AND tc.usermodified = :userid3
WHERE tpl.usermodified = :userid1 WHERE tpl.usermodified = :userid1
OR tch.usermodified = :userid2 OR tch.id IS NOT NULL
OR tc.usermodified = :userid3"; OR tc.id IS NOT NULL";
$params = ['userid1' => $userid, 'userid2' => $userid, 'userid3' => $userid]; $params = ['userid1' => $userid, 'userid2' => $userid, 'userid3' => $userid];
$contextlist->add_from_sql($sql, $params); $contextlist->add_from_sql($sql, $params);
@ -309,12 +311,14 @@ class provider implements
AND ctx.contextlevel = :userlevel AND ctx.contextlevel = :userlevel
LEFT JOIN {" . plan_competency::TABLE . "} pc LEFT JOIN {" . plan_competency::TABLE . "} pc
ON pc.planid = p.id ON pc.planid = p.id
AND pc.usermodified = :userid3
LEFT JOIN {" . user_competency_plan::TABLE . "} upc LEFT JOIN {" . user_competency_plan::TABLE . "} upc
ON upc.planid = p.id ON upc.planid = p.id
AND upc.usermodified = :userid4
WHERE p.usermodified = :userid1 WHERE p.usermodified = :userid1
OR p.reviewerid = :userid2 OR p.reviewerid = :userid2
OR pc.usermodified = :userid3 OR pc.id IS NOT NULL
OR upc.usermodified = :userid4"; OR upc.id IS NOT NULL";
$params = [ $params = [
'userlevel' => CONTEXT_USER, 'userlevel' => CONTEXT_USER,
'userid1' => $userid, 'userid1' => $userid,
@ -333,17 +337,19 @@ class provider implements
AND ctx.contextlevel = :userlevel1 AND ctx.contextlevel = :userlevel1
LEFT JOIN {" . evidence::TABLE . "} e LEFT JOIN {" . evidence::TABLE . "} e
ON e.usercompetencyid = uc.id ON e.usercompetencyid = uc.id
AND (e.usermodified = :userid3 OR e.actionuserid = :userid4)
LEFT JOIN {" . user_evidence::TABLE . "} ue LEFT JOIN {" . user_evidence::TABLE . "} ue
ON ue.userid = ctx.instanceid ON ue.userid = ctx.instanceid
AND ctx.contextlevel = :userlevel2 AND ctx.contextlevel = :userlevel2
AND ue.usermodified = :userid5
LEFT JOIN {" . user_evidence_competency::TABLE . "} uec LEFT JOIN {" . user_evidence_competency::TABLE . "} uec
ON uec.userevidenceid = ue.id ON uec.userevidenceid = ue.id
AND uec.usermodified = :userid6
WHERE uc.usermodified = :userid1 WHERE uc.usermodified = :userid1
OR uc.reviewerid = :userid2 OR uc.reviewerid = :userid2
OR e.usermodified = :userid3 OR e.id IS NOT NULL
OR e.actionuserid = :userid4 OR ue.id IS NOT NULL
OR ue.usermodified = :userid5 OR uec.id IS NOT NULL";
OR uec.usermodified = :userid6";
$params = [ $params = [
'userlevel1' => CONTEXT_USER, 'userlevel1' => CONTEXT_USER,
'userlevel2' => CONTEXT_USER, 'userlevel2' => CONTEXT_USER,
@ -367,15 +373,19 @@ class provider implements
LEFT JOIN {" . user_competency::TABLE . "} uc LEFT JOIN {" . user_competency::TABLE . "} uc
ON uc.userid = ctx.instanceid ON uc.userid = ctx.instanceid
AND ctx.contextlevel = :userlevel2 AND ctx.contextlevel = :userlevel2
AND uc.userid = :userid2
LEFT JOIN {" . user_evidence::TABLE . "} ue LEFT JOIN {" . user_evidence::TABLE . "} ue
ON ue.userid = ctx.instanceid ON ue.userid = ctx.instanceid
AND ctx.contextlevel = :userlevel3 AND ctx.contextlevel = :userlevel3
AND ue.userid = :userid3
LEFT JOIN {" . user_competency_course::TABLE . "} ucc LEFT JOIN {" . user_competency_course::TABLE . "} ucc
ON ucc.courseid = ctx.instanceid AND ctx.contextlevel = :courselevel ON ucc.courseid = ctx.instanceid
AND ctx.contextlevel = :courselevel
AND ucc.userid = :userid4
WHERE p.userid = :userid1 WHERE p.userid = :userid1
OR uc.userid = :userid2 OR uc.id IS NOT NULL
OR ue.userid = :userid3 OR ue.id IS NOT NULL
OR ucc.userid = :userid4"; OR ucc.id IS NOT NULL";
$params = [ $params = [
'userlevel1' => CONTEXT_USER, 'userlevel1' => CONTEXT_USER,
'userlevel2' => CONTEXT_USER, 'userlevel2' => CONTEXT_USER,

View file

@ -89,8 +89,10 @@ class provider implements \core_privacy\local\metadata\provider, \core_privacy\l
$join = "JOIN {course_completion_criteria} {$cccalias} ON {$joinfield} = {$cccalias}.course $join = "JOIN {course_completion_criteria} {$cccalias} ON {$joinfield} = {$cccalias}.course
LEFT JOIN {course_modules_completion} {$cmcalias} ON {$cccalias}.moduleinstance = {$cmcalias}.coursemoduleid LEFT JOIN {course_modules_completion} {$cmcalias} ON {$cccalias}.moduleinstance = {$cmcalias}.coursemoduleid
LEFT JOIN {course_completion_crit_compl} {$ccccalias} ON {$ccccalias}.criteriaid = {$cccalias}.id"; AND {$cmcalias}.userid = :{$prefix}_moduleuserid
$where = "{$cmcalias}.userid = :{$prefix}_moduleuserid OR {$ccccalias}.userid = :{$prefix}_courseuserid"; LEFT JOIN {course_completion_crit_compl} {$ccccalias} ON {$ccccalias}.criteriaid = {$cccalias}.id
AND {$ccccalias}.userid = :{$prefix}_courseuserid";
$where = "{$cmcalias}.id IS NOT NULL OR {$ccccalias}.id IS NOT NULL";
$params = ["{$prefix}_moduleuserid" => $userid, "{$prefix}_courseuserid" => $userid]; $params = ["{$prefix}_moduleuserid" => $userid, "{$prefix}_courseuserid" => $userid];
return [$join, $where, $params]; return [$join, $where, $params];

View file

@ -103,8 +103,9 @@ trait completion_creation {
* Complete some of the course completion criteria. * Complete some of the course completion criteria.
* *
* @param stdClass $user The user object * @param stdClass $user The user object
* @param bool $modulecompletion If true will complete the activity module completion thing.
*/ */
public function complete_course($user) { public function complete_course($user, $modulecompletion = true) {
$this->getDataGenerator()->enrol_user($user->id, $this->course->id, 'student'); $this->getDataGenerator()->enrol_user($user->id, $this->course->id, 'student');
$completion = new \completion_info($this->course); $completion = new \completion_info($this->course);
$criteriacompletions = $completion->get_completions($user->id, COMPLETION_CRITERIA_TYPE_ROLE); $criteriacompletions = $completion->get_completions($user->id, COMPLETION_CRITERIA_TYPE_ROLE);
@ -112,7 +113,9 @@ trait completion_creation {
foreach ($criteriacompletions as $ccompletion) { foreach ($criteriacompletions as $ccompletion) {
$criteria->complete($ccompletion); $criteria->complete($ccompletion);
} }
// Set activity as complete. if ($modulecompletion) {
$completion->update_state($this->cm, COMPLETION_COMPLETE, $user->id); // Set activity as complete.
$completion->update_state($this->cm, COMPLETION_COMPLETE, $user->id);
}
} }
} }

View file

@ -47,7 +47,7 @@ class core_completion_privacy_test extends \core_privacy\tests\provider_testcase
$this->resetAfterTest(); $this->resetAfterTest();
$user = $this->getDataGenerator()->create_user(); $user = $this->getDataGenerator()->create_user();
$this->create_course_completion(); $this->create_course_completion();
$this->complete_course($user); $this->complete_course($user, false);
list($join, $where, $params) = \core_completion\privacy\provider::get_course_completion_join_sql($user->id, 'comp', 'c.id'); list($join, $where, $params) = \core_completion\privacy\provider::get_course_completion_join_sql($user->id, 'comp', 'c.id');
$sql = "SELECT DISTINCT c.id $sql = "SELECT DISTINCT c.id

View file

@ -127,18 +127,21 @@ class provider implements
$sql = " $sql = "
SELECT DISTINCT ctx.id SELECT DISTINCT ctx.id
FROM {context} ctx FROM {context} ctx
LEFT JOIN {grade_outcomes_history} goh LEFT JOIN {grade_outcomes_history} goh ON goh.loggeduser = :userid1 AND (
ON (goh.courseid > 0 AND goh.courseid = ctx.instanceid AND ctx.contextlevel = :courselevel1) (goh.courseid > 0 AND goh.courseid = ctx.instanceid AND ctx.contextlevel = :courselevel1)
OR ((goh.courseid IS NULL OR goh.courseid < 1) AND ctx.id = :syscontextid) OR ((goh.courseid IS NULL OR goh.courseid < 1) AND ctx.id = :syscontextid)
LEFT JOIN {grade_categories_history} gch )
ON gch.courseid = ctx.instanceid LEFT JOIN {grade_categories_history} gch ON gch.loggeduser = :userid2 AND (
gch.courseid = ctx.instanceid
AND ctx.contextlevel = :courselevel2 AND ctx.contextlevel = :courselevel2
LEFT JOIN {grade_items_history} gih )
ON gih.courseid = ctx.instanceid LEFT JOIN {grade_items_history} gih ON gih.loggeduser = :userid3 AND (
gih.courseid = ctx.instanceid
AND ctx.contextlevel = :courselevel3 AND ctx.contextlevel = :courselevel3
WHERE goh.loggeduser = :userid1 )
OR gch.loggeduser = :userid2 WHERE goh.id IS NOT NULL
OR gih.loggeduser = :userid3"; OR gch.id IS NOT NULL
OR gih.id IS NOT NULL";
$params = [ $params = [
'syscontextid' => SYSCONTEXTID, 'syscontextid' => SYSCONTEXTID,
'courselevel1' => CONTEXT_COURSE, 'courselevel1' => CONTEXT_COURSE,
@ -159,13 +162,16 @@ class provider implements
AND ctx.contextlevel = :courselevel AND ctx.contextlevel = :courselevel
LEFT JOIN {grade_grades} gg LEFT JOIN {grade_grades} gg
ON gg.itemid = gi.id ON gg.itemid = gi.id
AND (gg.userid = :userid1 OR gg.usermodified = :userid2)
LEFT JOIN {grade_grades_history} ggh LEFT JOIN {grade_grades_history} ggh
ON ggh.itemid = gi.id ON ggh.itemid = gi.id
WHERE gg.userid = :userid1 AND (
OR gg.usermodified = :userid2 ggh.userid = :userid3
OR ggh.userid = :userid3
OR ggh.loggeduser = :userid4 OR ggh.loggeduser = :userid4
OR ggh.usermodified = :userid5"; OR ggh.usermodified = :userid5
)
WHERE gg.id IS NOT NULL
OR ggh.id IS NOT NULL";
$params = [ $params = [
'courselevel' => CONTEXT_COURSE, 'courselevel' => CONTEXT_COURSE,
'userid1' => $userid, 'userid1' => $userid,
@ -184,14 +190,14 @@ class provider implements
JOIN {grade_grades_history} ggh JOIN {grade_grades_history} ggh
ON ctx.contextlevel = :userlevel ON ctx.contextlevel = :userlevel
AND ggh.userid = ctx.instanceid AND ggh.userid = ctx.instanceid
LEFT JOIN {grade_items} gi
ON ggh.itemid = gi.id
WHERE gi.id IS NULL
AND ( AND (
ggh.userid = :userid1 ggh.userid = :userid1
OR ggh.usermodified = :userid2 OR ggh.usermodified = :userid2
OR ggh.loggeduser = :userid3 OR ggh.loggeduser = :userid3
)"; )
LEFT JOIN {grade_items} gi
ON ggh.itemid = gi.id
WHERE gi.id IS NULL";
$params = [ $params = [
'userlevel' => CONTEXT_USER, 'userlevel' => CONTEXT_USER,
'userid1' => $userid, 'userid1' => $userid,

View file

@ -139,15 +139,53 @@ class provider implements metadataprovider, pluginprovider, preference_provider
JOIN {modules} m ON cm.module = m.id AND m.name = :modulename JOIN {modules} m ON cm.module = m.id AND m.name = :modulename
JOIN {assign} a ON cm.instance = a.id JOIN {assign} a ON cm.instance = a.id
JOIN {context} ctx ON cm.id = ctx.instanceid AND ctx.contextlevel = :contextlevel JOIN {context} ctx ON cm.id = ctx.instanceid AND ctx.contextlevel = :contextlevel
LEFT JOIN {assign_grades} ag ON a.id = ag.assignment JOIN {assign_grades} ag ON a.id = ag.assignment AND (ag.userid = :userid OR ag.grader = :graderid)";
LEFT JOIN {assign_overrides} ao ON a.id = ao.assignid
LEFT JOIN {assign_submission} asn ON a.id = asn.assignment global $DB;
LEFT JOIN {assign_user_flags} auf ON a.id = auf.assignment
LEFT JOIN {assign_user_mapping} aum ON a.id = aum.assignment
WHERE ag.userid = :userid OR ag.grader = :graderid OR ao.userid = :aouserid
OR asn.userid = :asnuserid OR auf.userid = :aufuserid OR aum.userid = :aumuserid";
$contextlist = new contextlist(); $contextlist = new contextlist();
$contextlist->add_from_sql($sql, $params); $contextlist->add_from_sql($sql, $params);
$sql = "SELECT ctx.id
FROM {course_modules} cm
JOIN {modules} m ON cm.module = m.id AND m.name = :modulename
JOIN {assign} a ON cm.instance = a.id
JOIN {context} ctx ON cm.id = ctx.instanceid AND ctx.contextlevel = :contextlevel
JOIN {assign_overrides} ao ON a.id = ao.assignid
WHERE ao.userid = :aouserid";
$contextlist->add_from_sql($sql, $params);
$sql = "SELECT ctx.id
FROM {course_modules} cm
JOIN {modules} m ON cm.module = m.id AND m.name = :modulename
JOIN {assign} a ON cm.instance = a.id
JOIN {context} ctx ON cm.id = ctx.instanceid AND ctx.contextlevel = :contextlevel
JOIN {assign_submission} asn ON a.id = asn.assignment
WHERE asn.userid = :asnuserid";
$contextlist->add_from_sql($sql, $params);
$sql = "SELECT ctx.id
FROM {course_modules} cm
JOIN {modules} m ON cm.module = m.id AND m.name = :modulename
JOIN {assign} a ON cm.instance = a.id
JOIN {context} ctx ON cm.id = ctx.instanceid AND ctx.contextlevel = :contextlevel
JOIN {assign_user_flags} auf ON a.id = auf.assignment
WHERE auf.userid = :aufuserid";
$contextlist->add_from_sql($sql, $params);
$sql = "SELECT ctx.id
FROM {course_modules} cm
JOIN {modules} m ON cm.module = m.id AND m.name = :modulename
JOIN {assign} a ON cm.instance = a.id
JOIN {context} ctx ON cm.id = ctx.instanceid AND ctx.contextlevel = :contextlevel
JOIN {assign_user_mapping} aum ON a.id = aum.assignment
WHERE aum.userid = :aumuserid";
$contextlist->add_from_sql($sql, $params);
manager::plugintype_class_callback('assignfeedback', self::ASSIGNFEEDBACK_INTERFACE, manager::plugintype_class_callback('assignfeedback', self::ASSIGNFEEDBACK_INTERFACE,
'get_context_for_userid_within_feedback', [$userid, $contextlist]); 'get_context_for_userid_within_feedback', [$userid, $contextlist]);
manager::plugintype_class_callback('assignsubmission', self::ASSIGNSUBMISSION_INTERFACE, manager::plugintype_class_callback('assignsubmission', self::ASSIGNSUBMISSION_INTERFACE,

View file

@ -105,9 +105,10 @@ class provider implements
INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname INNER JOIN {modules} m ON m.id = cm.module AND m.name = :modname
INNER JOIN {data} d ON d.id = cm.instance INNER JOIN {data} d ON d.id = cm.instance
INNER JOIN {data_records} dr ON dr.dataid = d.id INNER JOIN {data_records} dr ON dr.dataid = d.id
LEFT JOIN {comments} com ON com.commentarea=:commentarea and com.itemid = dr.id LEFT JOIN {comments} com ON com.commentarea=:commentarea and com.itemid = dr.id AND com.userid = :userid1
LEFT JOIN {rating} r ON r.contextid = c.id AND r.itemid = dr.id AND r.component = :moddata AND r.ratingarea = :ratingarea LEFT JOIN {rating} r ON r.contextid = c.id AND r.itemid = dr.id AND r.component = :moddata
WHERE dr.userid = :userid OR com.userid = :userid1 OR r.userid = :userid2"; AND r.ratingarea = :ratingarea AND r.userid = :userid2
WHERE dr.userid = :userid OR com.id IS NOT NULL OR r.id IS NOT NULL";
$params = [ $params = [
'modname' => 'data', 'modname' => 'data',

View file

@ -133,19 +133,24 @@ class provider implements
AND ctx.contextlevel = :modulelevel AND ctx.contextlevel = :modulelevel
LEFT JOIN {lesson_attempts} la LEFT JOIN {lesson_attempts} la
ON la.lessonid = l.id ON la.lessonid = l.id
AND la.userid = :userid1
LEFT JOIN {lesson_branch} lb LEFT JOIN {lesson_branch} lb
ON lb.lessonid = l.id ON lb.lessonid = l.id
AND lb.userid = :userid2
LEFT JOIN {lesson_grades} lg LEFT JOIN {lesson_grades} lg
ON lg.lessonid = l.id ON lg.lessonid = l.id
AND lg.userid = :userid3
LEFT JOIN {lesson_overrides} lo LEFT JOIN {lesson_overrides} lo
ON lo.lessonid = l.id ON lo.lessonid = l.id
AND lo.userid = :userid4
LEFT JOIN {lesson_timer} lt LEFT JOIN {lesson_timer} lt
ON lt.lessonid = l.id ON lt.lessonid = l.id
WHERE la.userid = :userid1 AND lt.userid = :userid5
OR lb.userid = :userid2 WHERE la.id IS NOT NULL
OR lg.userid = :userid3 OR lb.id IS NOT NULL
OR lt.userid = :userid4 OR lg.id IS NOT NULL
OR lo.userid = :userid5"; OR lo.id IS NOT NULL
OR lt.id IS NOT NULL";
$params = [ $params = [
'lesson' => 'lesson', 'lesson' => 'lesson',

View file

@ -148,7 +148,8 @@ class provider implements
" . $qubaid->from . " " . $qubaid->from . "
WHERE ( WHERE (
qa.userid = :qauserid OR qa.userid = :qauserid OR
" . $qubaid->where() . " " . $qubaid->where() . " OR
qo.id IS NOT NULL
) AND qa.preview = 0 ) AND qa.preview = 0
"; ";

View file

@ -139,12 +139,13 @@ class provider implements
// Join the rating table with the specified alias and the relevant join params. // Join the rating table with the specified alias and the relevant join params.
$join = "LEFT JOIN {rating} {$alias} ON "; $join = "LEFT JOIN {rating} {$alias} ON ";
$join .= "{$alias}.userid = :ratinguserid{$count} AND ";
$join .= "{$alias}.component = :ratingcomponent{$count} AND "; $join .= "{$alias}.component = :ratingcomponent{$count} AND ";
$join .= "{$alias}.ratingarea = :ratingarea{$count} AND "; $join .= "{$alias}.ratingarea = :ratingarea{$count} AND ";
$join .= "{$alias}.itemid = {$itemidjoin}"; $join .= "{$alias}.itemid = {$itemidjoin}";
// Match against the specified user. // Match against the specified user.
$userwhere = "{$alias}.userid = :ratinguserid{$count}"; $userwhere = "{$alias}.id IS NOT NULL";
$params = [ $params = [
'ratingcomponent' . $count => $component, 'ratingcomponent' . $count => $component,