MDL-40468 libraries: removed usages of get_related_contexts_string() in core

Also tidied up the functions by removing unused parameters.
This commit is contained in:
Mark Nelson 2013-07-09 13:34:39 +08:00
parent b645284403
commit 4e829d48d1
10 changed files with 96 additions and 104 deletions

View file

@ -161,12 +161,16 @@ function grade_import_commit($courseid, $importcode, $importfeedback=true, $verb
*/ */
function get_unenrolled_users_in_import($importcode, $courseid) { function get_unenrolled_users_in_import($importcode, $courseid) {
global $CFG, $DB; global $CFG, $DB;
$relatedctxcondition = get_related_contexts_string(context_course::instance($courseid));
//users with a gradeable role $coursecontext = context_course::instance($courseid);
// We want to query both the current context and parent contexts.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($coursecontext->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
// Users with a gradeable role.
list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $CFG->gradebookroles), SQL_PARAMS_NAMED, 'grbr'); list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $CFG->gradebookroles), SQL_PARAMS_NAMED, 'grbr');
//enrolled users // Enrolled users.
$context = context_course::instance($courseid); $context = context_course::instance($courseid);
list($enrolledsql, $enrolledparams) = get_enrolled_sql($context); list($enrolledsql, $enrolledparams) = get_enrolled_sql($context);
list($sort, $sortparams) = users_order_by_sql('u'); list($sort, $sortparams) = users_order_by_sql('u');
@ -183,11 +187,11 @@ function get_unenrolled_users_in_import($importcode, $courseid) {
LEFT JOIN ($enrolledsql) je LEFT JOIN ($enrolledsql) je
ON je.id = u.id ON je.id = u.id
LEFT JOIN {role_assignments} ra LEFT JOIN {role_assignments} ra
ON (giv.userid = ra.userid AND ra.roleid $gradebookrolessql AND ra.contextid $relatedctxcondition) ON (giv.userid = ra.userid AND ra.roleid $gradebookrolessql AND ra.contextid $relatedctxsql)
WHERE giv.importcode = :importcode WHERE giv.importcode = :importcode
AND (ra.id IS NULL OR je.id IS NULL) AND (ra.id IS NULL OR je.id IS NULL)
ORDER BY gradeidnumber, $sort"; ORDER BY gradeidnumber, $sort";
$params = array_merge($gradebookrolesparams, $enrolledparams, $sortparams); $params = array_merge($gradebookrolesparams, $enrolledparams, $sortparams, $relatedctxparams);
$params['importcode'] = $importcode; $params['importcode'] = $importcode;
return $DB->get_records_sql($sql, $params); return $DB->get_records_sql($sql, $params);

View file

@ -138,18 +138,17 @@ class graded_users_iterator {
export_verify_grades($this->course->id); export_verify_grades($this->course->id);
$course_item = grade_item::fetch_course_item($this->course->id); $course_item = grade_item::fetch_course_item($this->course->id);
if ($course_item->needsupdate) { if ($course_item->needsupdate) {
// can not calculate all final grades - sorry // Can not calculate all final grades - sorry.
return false; return false;
} }
$coursecontext = context_course::instance($this->course->id); $coursecontext = context_course::instance($this->course->id);
$relatedcontexts = get_related_contexts_string($coursecontext);
list($gradebookroles_sql, $params) = list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($coursecontext->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
$DB->get_in_or_equal(explode(',', $CFG->gradebookroles), SQL_PARAMS_NAMED, 'grbr'); list($gradebookroles_sql, $params) = $DB->get_in_or_equal(explode(',', $CFG->gradebookroles), SQL_PARAMS_NAMED, 'grbr');
list($enrolledsql, $enrolledparams) = get_enrolled_sql($coursecontext, '', 0, $this->onlyactive); list($enrolledsql, $enrolledparams) = get_enrolled_sql($coursecontext, '', 0, $this->onlyactive);
$params = array_merge($params, $enrolledparams); $params = array_merge($params, $enrolledparams, $relatedctxparams);
if ($this->groupid) { if ($this->groupid) {
$groupsql = "INNER JOIN {groups_members} gm ON gm.userid = u.id"; $groupsql = "INNER JOIN {groups_members} gm ON gm.userid = u.id";
@ -162,7 +161,7 @@ class graded_users_iterator {
} }
if (empty($this->sortfield1)) { if (empty($this->sortfield1)) {
// we must do some sorting even if not specified // We must do some sorting even if not specified.
$ofields = ", u.id AS usrt"; $ofields = ", u.id AS usrt";
$order = "usrt ASC"; $order = "usrt ASC";
@ -174,8 +173,8 @@ class graded_users_iterator {
$order .= ", usrt2 $this->sortorder2"; $order .= ", usrt2 $this->sortorder2";
} }
if ($this->sortfield1 != 'id' and $this->sortfield2 != 'id') { if ($this->sortfield1 != 'id' and $this->sortfield2 != 'id') {
// user order MUST be the same in both queries, // User order MUST be the same in both queries,
// must include the only unique user->id if not already present // must include the only unique user->id if not already present.
$ofields .= ", u.id AS usrt"; $ofields .= ", u.id AS usrt";
$order .= ", usrt ASC"; $order .= ", usrt ASC";
} }
@ -199,7 +198,6 @@ class graded_users_iterator {
} }
} }
// $params contents: gradebookroles and groupid (for $groupwheresql)
$users_sql = "SELECT $userfields $ofields $users_sql = "SELECT $userfields $ofields
FROM {user} u FROM {user} u
JOIN ($enrolledsql) je ON je.id = u.id JOIN ($enrolledsql) je ON je.id = u.id
@ -208,7 +206,7 @@ class graded_users_iterator {
SELECT DISTINCT ra.userid SELECT DISTINCT ra.userid
FROM {role_assignments} ra FROM {role_assignments} ra
WHERE ra.roleid $gradebookroles_sql WHERE ra.roleid $gradebookroles_sql
AND ra.contextid $relatedcontexts AND ra.contextid $relatedctxsql
) rainner ON rainner.userid = u.id ) rainner ON rainner.userid = u.id
WHERE u.deleted = 0 WHERE u.deleted = 0
$groupwheresql $groupwheresql
@ -226,7 +224,6 @@ class graded_users_iterator {
$itemids = array_keys($this->grade_items); $itemids = array_keys($this->grade_items);
list($itemidsql, $grades_params) = $DB->get_in_or_equal($itemids, SQL_PARAMS_NAMED, 'items'); list($itemidsql, $grades_params) = $DB->get_in_or_equal($itemids, SQL_PARAMS_NAMED, 'items');
$params = array_merge($params, $grades_params); $params = array_merge($params, $grades_params);
// $params contents: gradebookroles, enrolledparams, groupid (for $groupwheresql) and itemids
$grades_sql = "SELECT g.* $ofields $grades_sql = "SELECT g.* $ofields
FROM {grade_grades} g FROM {grade_grades} g
@ -237,7 +234,7 @@ class graded_users_iterator {
SELECT DISTINCT ra.userid SELECT DISTINCT ra.userid
FROM {role_assignments} ra FROM {role_assignments} ra
WHERE ra.roleid $gradebookroles_sql WHERE ra.roleid $gradebookroles_sql
AND ra.contextid $relatedcontexts AND ra.contextid $relatedctxsql
) rainner ON rainner.userid = u.id ) rainner ON rainner.userid = u.id
WHERE u.deleted = 0 WHERE u.deleted = 0
AND g.itemid $itemidsql AND g.itemid $itemidsql
@ -418,7 +415,7 @@ function print_graded_users_selector($course, $actionpage, $userid=0, $groupid=0
} }
function grade_get_graded_users_select($report, $course, $userid, $groupid, $includeall) { function grade_get_graded_users_select($report, $course, $userid, $groupid, $includeall) {
global $USER; global $USER, $CFG;
if (is_null($userid)) { if (is_null($userid)) {
$userid = $USER->id; $userid = $USER->id;

View file

@ -394,24 +394,25 @@ class grade_report_grader extends grade_report {
return; return;
} }
//limit to users with a gradeable role // Limit to users with a gradeable role.
list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
//limit to users with an active enrollment // Limit to users with an active enrollment.
list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context);
//fields we need from the user table // Fields we need from the user table.
$userfields = user_picture::fields('u', get_extra_user_fields($this->context)); $userfields = user_picture::fields('u', get_extra_user_fields($this->context));
$sortjoin = $sort = $params = null; // We want to query both the current context and parent contexts.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
//if the user has clicked one of the sort asc/desc arrows // If the user has clicked one of the sort asc/desc arrows.
if (is_numeric($this->sortitemid)) { if (is_numeric($this->sortitemid)) {
$params = array_merge(array('gitemid'=>$this->sortitemid), $gradebookrolesparams, $this->groupwheresql_params, $enrolledparams); $params = array_merge(array('gitemid' => $this->sortitemid), $gradebookrolesparams, $this->groupwheresql_params, $enrolledparams,
$relatedctxparams);
$sortjoin = "LEFT JOIN {grade_grades} g ON g.userid = u.id AND g.itemid = $this->sortitemid"; $sortjoin = "LEFT JOIN {grade_grades} g ON g.userid = u.id AND g.itemid = $this->sortitemid";
$sort = "g.finalgrade $this->sortorder"; $sort = "g.finalgrade $this->sortorder";
} else { } else {
$sortjoin = ''; $sortjoin = '';
switch($this->sortitemid) { switch($this->sortitemid) {
@ -430,7 +431,7 @@ class grade_report_grader extends grade_report {
break; break;
} }
$params = array_merge($gradebookrolesparams, $this->groupwheresql_params, $enrolledparams); $params = array_merge($gradebookrolesparams, $this->groupwheresql_params, $enrolledparams, $relatedctxparams);
} }
$sql = "SELECT $userfields $sql = "SELECT $userfields
@ -442,12 +443,11 @@ class grade_report_grader extends grade_report {
SELECT DISTINCT ra.userid SELECT DISTINCT ra.userid
FROM {role_assignments} ra FROM {role_assignments} ra
WHERE ra.roleid IN ($this->gradebookroles) WHERE ra.roleid IN ($this->gradebookroles)
AND ra.contextid " . get_related_contexts_string($this->context) . " AND ra.contextid $relatedctxsql
) rainner ON rainner.userid = u.id ) rainner ON rainner.userid = u.id
AND u.deleted = 0 AND u.deleted = 0
$this->groupwheresql $this->groupwheresql
ORDER BY $sort"; ORDER BY $sort";
$studentsperpage = $this->get_students_per_page(); $studentsperpage = $this->get_students_per_page();
$this->users = $DB->get_records_sql($sql, $params, $studentsperpage * $this->page, $studentsperpage); $this->users = $DB->get_records_sql($sql, $params, $studentsperpage * $this->page, $studentsperpage);
@ -1273,56 +1273,46 @@ class grade_report_grader extends grade_report {
* @return array Array of rows for the right part of the report * @return array Array of rows for the right part of the report
*/ */
public function get_right_avg_row($rows=array(), $grouponly=false) { public function get_right_avg_row($rows=array(), $grouponly=false) {
global $CFG, $USER, $DB, $OUTPUT; global $USER, $DB, $OUTPUT;
if (!$this->canviewhidden) { if (!$this->canviewhidden) {
// totals might be affected by hiding, if user can not see hidden grades the aggregations might be altered // Totals might be affected by hiding, if user can not see hidden grades the aggregations might be altered
// better not show them at all if user can not see all hidden grades // better not show them at all if user can not see all hidden grades.
return $rows; return $rows;
} }
$showaverages = $this->get_pref('showaverages');
$showaveragesgroup = $this->currentgroup && $showaverages;
$averagesdisplaytype = $this->get_pref('averagesdisplaytype'); $averagesdisplaytype = $this->get_pref('averagesdisplaytype');
$averagesdecimalpoints = $this->get_pref('averagesdecimalpoints'); $averagesdecimalpoints = $this->get_pref('averagesdecimalpoints');
$meanselection = $this->get_pref('meanselection'); $meanselection = $this->get_pref('meanselection');
$shownumberofgrades = $this->get_pref('shownumberofgrades'); $shownumberofgrades = $this->get_pref('shownumberofgrades');
$avghtml = '';
$avgcssclass = 'avg';
if ($grouponly) { if ($grouponly) {
$straverage = get_string('groupavg', 'grades');
$showaverages = $this->currentgroup && $this->get_pref('showaverages'); $showaverages = $this->currentgroup && $this->get_pref('showaverages');
$groupsql = $this->groupsql; $groupsql = $this->groupsql;
$groupwheresql = $this->groupwheresql; $groupwheresql = $this->groupwheresql;
$groupwheresqlparams = $this->groupwheresql_params; $groupwheresqlparams = $this->groupwheresql_params;
$avgcssclass = 'groupavg';
} else { } else {
$straverage = get_string('overallaverage', 'grades');
$showaverages = $this->get_pref('showaverages'); $showaverages = $this->get_pref('showaverages');
$groupsql = ""; $groupsql = "";
$groupwheresql = ""; $groupwheresql = "";
$groupwheresqlparams = array(); $groupwheresqlparams = array();
} }
if ($shownumberofgrades) {
$straverage .= ' (' . get_string('submissions', 'grades') . ') ';
}
$totalcount = $this->get_numusers($grouponly);
//limit to users with a gradeable role
list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
//limit to users with an active enrollment
list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context);
if ($showaverages) { if ($showaverages) {
$params = array_merge(array('courseid'=>$this->courseid), $gradebookrolesparams, $enrolledparams, $groupwheresqlparams); $totalcount = $this->get_numusers($grouponly);
// find sums of all grade items in course // Limit to users with a gradeable role.
list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
// Limit to users with an active enrollment.
list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context);
// We want to query both the current context and parent contexts.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
$params = array_merge(array('courseid' => $this->courseid), $gradebookrolesparams, $enrolledparams, $groupwheresqlparams, $relatedctxparams);
// Find sums of all grade items in course.
$sql = "SELECT g.itemid, SUM(g.finalgrade) AS sum $sql = "SELECT g.itemid, SUM(g.finalgrade) AS sum
FROM {grade_items} gi FROM {grade_items} gi
JOIN {grade_grades} g ON g.itemid = gi.id JOIN {grade_grades} g ON g.itemid = gi.id
@ -1332,7 +1322,7 @@ class grade_report_grader extends grade_report {
SELECT DISTINCT ra.userid SELECT DISTINCT ra.userid
FROM {role_assignments} ra FROM {role_assignments} ra
WHERE ra.roleid $gradebookrolessql WHERE ra.roleid $gradebookrolessql
AND ra.contextid " . get_related_contexts_string($this->context) . " AND ra.contextid $relatedctxsql
) rainner ON rainner.userid = u.id ) rainner ON rainner.userid = u.id
$groupsql $groupsql
WHERE gi.courseid = :courseid WHERE gi.courseid = :courseid
@ -1361,7 +1351,7 @@ class grade_report_grader extends grade_report {
$groupsql $groupsql
WHERE gi.courseid = :courseid WHERE gi.courseid = :courseid
AND ra.roleid $gradebookrolessql AND ra.roleid $gradebookrolessql
AND ra.contextid ".get_related_contexts_string($this->context)." AND ra.contextid $relatedctxsql
AND u.deleted = 0 AND u.deleted = 0
AND g.id IS NULL AND g.id IS NULL
$groupwheresql $groupwheresql
@ -1399,8 +1389,6 @@ class grade_report_grader extends grade_report {
$meancount = $totalcount; $meancount = $totalcount;
} }
$decimalpoints = $item->get_decimals();
// Determine which display type to use for this average // Determine which display type to use for this average
if ($USER->gradeediting[$this->courseid]) { if ($USER->gradeediting[$this->courseid]) {
$displaytype = GRADE_DISPLAY_TYPE_REAL; $displaytype = GRADE_DISPLAY_TYPE_REAL;

View file

@ -271,18 +271,21 @@ abstract class grade_report {
* @return int Count of users * @return int Count of users
*/ */
public function get_numusers($groups=true) { public function get_numusers($groups=true) {
global $CFG, $DB; global $DB;
$groupsql = ""; $groupsql = "";
$groupwheresql = ""; $groupwheresql = "";
//limit to users with a gradeable role // Limit to users with a gradeable role.
list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
//limit to users with an active enrollment // Limit to users with an active enrollment.
list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context);
$params = array_merge($gradebookrolesparams, $enrolledparams); // We want to query both the current context and parent contexts.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
$params = array_merge($gradebookrolesparams, $enrolledparams, $relatedctxparams);
if ($groups) { if ($groups) {
$groupsql = $this->groupsql; $groupsql = $this->groupsql;
@ -300,7 +303,7 @@ abstract class grade_report {
WHERE ra.roleid $gradebookrolessql WHERE ra.roleid $gradebookrolessql
AND u.deleted = 0 AND u.deleted = 0
$groupwheresql $groupwheresql
AND ra.contextid ".get_related_contexts_string($this->context); AND ra.contextid $relatedctxsql";
return $DB->count_records_sql($countsql, $params); return $DB->count_records_sql($countsql, $params);
} }

View file

@ -611,42 +611,34 @@ class grade_report_user extends grade_report {
/** /**
* Builds the grade item averages. * Builds the grade item averages.
*
*/ */
function calculate_averages() { function calculate_averages() {
global $USER, $DB; global $USER, $DB;
if ($this->showaverage) { if ($this->showaverage) {
// this settings are actually grader report settings (not user report) // This settings are actually grader report settings (not user report)
// however we're using them as having two separate but identical settings the // however we're using them as having two separate but identical settings the
// user would have to keep in sync would be annoying // user would have to keep in sync would be annoying.
$averagesdisplaytype = $this->get_pref('averagesdisplaytype'); $averagesdisplaytype = $this->get_pref('averagesdisplaytype');
$averagesdecimalpoints = $this->get_pref('averagesdecimalpoints'); $averagesdecimalpoints = $this->get_pref('averagesdecimalpoints');
$meanselection = $this->get_pref('meanselection'); $meanselection = $this->get_pref('meanselection');
$shownumberofgrades = $this->get_pref('shownumberofgrades'); $shownumberofgrades = $this->get_pref('shownumberofgrades');
$avghtml = ''; $avghtml = '';
$avgcssclass = 'avg';
$straverage = get_string('overallaverage', 'grades');
$groupsql = $this->groupsql; $groupsql = $this->groupsql;
$groupwheresql = $this->groupwheresql; $groupwheresql = $this->groupwheresql;
//$groupwheresqlparams = ;
if ($shownumberofgrades) {
$straverage .= ' (' . get_string('submissions', 'grades') . ') ';
}
$totalcount = $this->get_numusers(false); $totalcount = $this->get_numusers(false);
//limit to users with a gradeable role ie students // We want to query both the current context and parent contexts.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
// Limit to users with a gradeable role ie students.
list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
//limit to users with an active enrolment // Limit to users with an active enrolment.
list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context);
$params = array_merge($this->groupwheresql_params, $gradebookrolesparams, $enrolledparams); $params = array_merge($this->groupwheresql_params, $gradebookrolesparams, $enrolledparams, $relatedctxparams);
$params['courseid'] = $this->courseid; $params['courseid'] = $this->courseid;
// find sums of all grade items in course // find sums of all grade items in course
@ -659,7 +651,7 @@ class grade_report_user extends grade_report {
SELECT DISTINCT ra.userid SELECT DISTINCT ra.userid
FROM {role_assignments} ra FROM {role_assignments} ra
WHERE ra.roleid $gradebookrolessql WHERE ra.roleid $gradebookrolessql
AND ra.contextid " . get_related_contexts_string($this->context) . " AND ra.contextid $relatedctxsql
) rainner ON rainner.userid = u.id ) rainner ON rainner.userid = u.id
$groupsql $groupsql
WHERE gi.courseid = :courseid WHERE gi.courseid = :courseid
@ -690,7 +682,7 @@ class grade_report_user extends grade_report {
SELECT DISTINCT ra.userid SELECT DISTINCT ra.userid
FROM {role_assignments} ra FROM {role_assignments} ra
WHERE ra.roleid $gradebookrolessql WHERE ra.roleid $gradebookrolessql
AND ra.contextid " . get_related_contexts_string($this->context) . " AND ra.contextid $relatedctxsql
) rainner ON rainner.userid = u.id ) rainner ON rainner.userid = u.id
LEFT JOIN {grade_grades} gg LEFT JOIN {grade_grades} gg
ON (gg.itemid = gi.id AND gg.userid = u.id AND gg.finalgrade IS NOT NULL AND gg.hidden = 0) ON (gg.itemid = gi.id AND gg.userid = u.id AND gg.finalgrade IS NOT NULL AND gg.hidden = 0)
@ -731,8 +723,6 @@ class grade_report_user extends grade_report {
$mean_count = $totalcount; $mean_count = $totalcount;
} }
$decimalpoints = $item->get_decimals();
// Determine which display type to use for this average // Determine which display type to use for this average
if (!empty($USER->gradeediting) && $USER->gradeediting[$this->courseid]) { if (!empty($USER->gradeediting) && $USER->gradeediting[$this->courseid]) {
$displaytype = GRADE_DISPLAY_TYPE_REAL; $displaytype = GRADE_DISPLAY_TYPE_REAL;
@ -747,7 +737,6 @@ class grade_report_user extends grade_report {
// Override grade_item setting if a display preference (not inherit) was set for the averages // Override grade_item setting if a display preference (not inherit) was set for the averages
if ($averagesdecimalpoints == GRADE_REPORT_PREFERENCE_INHERIT) { if ($averagesdecimalpoints == GRADE_REPORT_PREFERENCE_INHERIT) {
$decimalpoints = $item->get_decimals(); $decimalpoints = $item->get_decimals();
} else { } else {
$decimalpoints = $averagesdecimalpoints; $decimalpoints = $averagesdecimalpoints;
} }

View file

@ -684,16 +684,16 @@ function groups_get_potential_members($courseid, $roleid = null, $cohortid = nul
$context = context_course::instance($courseid); $context = context_course::instance($courseid);
// we are looking for all users with this role assigned in this context or higher
$listofcontexts = get_related_contexts_string($context);
list($esql, $params) = get_enrolled_sql($context); list($esql, $params) = get_enrolled_sql($context);
if ($roleid) { if ($roleid) {
$params['roleid'] = $roleid; // We are looking for all users with this role assigned in this context or higher.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
$params = array_merge($params, $relatedctxparams, array('roleid' => $roleid));
$where = "WHERE u.id IN (SELECT userid $where = "WHERE u.id IN (SELECT userid
FROM {role_assignments} FROM {role_assignments}
WHERE roleid = :roleid AND contextid $listofcontexts)"; WHERE roleid = :roleid AND contextid $relatedctxsql)";
} else { } else {
$where = ""; $where = "";
} }
@ -812,12 +812,15 @@ function groups_unassign_grouping($groupingid, $groupid, $invalidatecache = true
*/ */
function groups_get_members_by_role($groupid, $courseid, $fields='u.*', function groups_get_members_by_role($groupid, $courseid, $fields='u.*',
$sort=null, $extrawheretest='', $whereorsortparams=array()) { $sort=null, $extrawheretest='', $whereorsortparams=array()) {
global $CFG, $DB; global $DB;
// Retrieve information about all users and their roles on the course or // Retrieve information about all users and their roles on the course or
// parent ('related') contexts // parent ('related') contexts
$context = context_course::instance($courseid); $context = context_course::instance($courseid);
// We are looking for all users with this role assigned in this context or higher.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
if ($extrawheretest) { if ($extrawheretest) {
$extrawheretest = ' AND ' . $extrawheretest; $extrawheretest = ' AND ' . $extrawheretest;
} }
@ -830,12 +833,12 @@ function groups_get_members_by_role($groupid, $courseid, $fields='u.*',
$sql = "SELECT r.id AS roleid, u.id AS userid, $fields $sql = "SELECT r.id AS roleid, u.id AS userid, $fields
FROM {groups_members} gm FROM {groups_members} gm
JOIN {user} u ON u.id = gm.userid JOIN {user} u ON u.id = gm.userid
LEFT JOIN {role_assignments} ra ON (ra.userid = u.id AND ra.contextid ".get_related_contexts_string($context).") LEFT JOIN {role_assignments} ra ON (ra.userid = u.id AND ra.contextid $relatedctxsql)
LEFT JOIN {role} r ON r.id = ra.roleid LEFT JOIN {role} r ON r.id = ra.roleid
WHERE gm.groupid=:mgroupid WHERE gm.groupid=:mgroupid
".$extrawheretest." ".$extrawheretest."
ORDER BY r.sortorder, $sort"; ORDER BY r.sortorder, $sort";
$whereorsortparams['mgroupid'] = $groupid; $whereorsortparams = array_merge($whereorsortparams, $relatedctxparams, array('mgroupid' => $groupid));
$rs = $DB->get_recordset_sql($sql, $whereorsortparams); $rs = $DB->get_recordset_sql($sql, $whereorsortparams);
return groups_calculate_role_people($rs, $context); return groups_calculate_role_people($rs, $context);

View file

@ -177,14 +177,17 @@ function search_users($courseid, $groupid, $searchtext, $sort='', array $excepti
} else { } else {
$context = context_course::instance($courseid); $context = context_course::instance($courseid);
$contextlists = get_related_contexts_string($context);
// We want to query both the current context and parent contexts.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
$sql = "SELECT u.id, u.firstname, u.lastname, u.email $sql = "SELECT u.id, u.firstname, u.lastname, u.email
FROM {user} u FROM {user} u
JOIN {role_assignments} ra ON ra.userid = u.id JOIN {role_assignments} ra ON ra.userid = u.id
WHERE $select AND ra.contextid $contextlists WHERE $select AND ra.contextid $relatedctxsql
$except $except
$order"; $order";
$params = array_merge($params, $relatedctxparams);
return $DB->get_records_sql($sql, $params); return $DB->get_records_sql($sql, $params);
} }
} }

View file

@ -214,14 +214,16 @@ if (!empty($instanceid) && !empty($roleid)) {
list($actionsql, $params) = $DB->get_in_or_equal($actions, SQL_PARAMS_NAMED, 'action'); list($actionsql, $params) = $DB->get_in_or_equal($actions, SQL_PARAMS_NAMED, 'action');
$actionsql = "action $actionsql"; $actionsql = "action $actionsql";
$relatedcontexts = get_related_contexts_string($context); // We want to query both the current context and parent contexts.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
$sql = "SELECT ra.userid, u.firstname, u.lastname, u.idnumber, l.actioncount AS count $sql = "SELECT ra.userid, u.firstname, u.lastname, u.idnumber, l.actioncount AS count
FROM (SELECT * FROM {role_assignments} WHERE contextid $relatedcontexts AND roleid = :roleid ) ra FROM (SELECT * FROM {role_assignments} WHERE contextid $relatedctxsql AND roleid = :roleid ) ra
JOIN {user} u ON u.id = ra.userid JOIN {user} u ON u.id = ra.userid
LEFT JOIN ( LEFT JOIN (
SELECT userid, COUNT(action) AS actioncount FROM {log} WHERE cmid = :instanceid AND time > :timefrom AND $actionsql GROUP BY userid SELECT userid, COUNT(action) AS actioncount FROM {log} WHERE cmid = :instanceid AND time > :timefrom AND $actionsql GROUP BY userid
) l ON (l.userid = ra.userid)"; ) l ON (l.userid = ra.userid)";
$params = array_merge($params, $relatedctxparams);
$params['roleid'] = $roleid; $params['roleid'] = $roleid;
$params['instanceid'] = $instanceid; $params['instanceid'] = $instanceid;
$params['timefrom'] = $timefrom; $params['timefrom'] = $timefrom;
@ -239,7 +241,7 @@ if (!empty($instanceid) && !empty($roleid)) {
$countsql = "SELECT COUNT(DISTINCT(ra.userid)) $countsql = "SELECT COUNT(DISTINCT(ra.userid))
FROM {role_assignments} ra FROM {role_assignments} ra
JOIN {user} u ON u.id = ra.userid JOIN {user} u ON u.id = ra.userid
WHERE ra.contextid $relatedcontexts AND ra.roleid = :roleid"; WHERE ra.contextid $relatedctxsql AND ra.roleid = :roleid";
$totalcount = $DB->count_records_sql($countsql, $params); $totalcount = $DB->count_records_sql($countsql, $params);

View file

@ -370,9 +370,6 @@
)); ));
$table->setup(); $table->setup();
// we are looking for all users with this role assigned in this context or higher
$contextlist = get_related_contexts_string($context);
list($esql, $params) = get_enrolled_sql($context, NULL, $currentgroup, true); list($esql, $params) = get_enrolled_sql($context, NULL, $currentgroup, true);
$joins = array("FROM {user} u"); $joins = array("FROM {user} u");
$wheres = array(); $wheres = array();
@ -410,8 +407,11 @@
// limit list to users with some role only // limit list to users with some role only
if ($roleid) { if ($roleid) {
$wheres[] = "u.id IN (SELECT userid FROM {role_assignments} WHERE roleid = :roleid AND contextid $contextlist)"; // We want to query both the current context and parent contexts.
$params['roleid'] = $roleid; list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
$wheres[] = "u.id IN (SELECT userid FROM {role_assignments} WHERE roleid = :roleid AND contextid $relatedctxsql)";
$params = array_merge($params, array('roleid' => $roleid), $relatedctxparams);
} }
$from = implode("\n", $joins); $from = implode("\n", $joins);

View file

@ -781,6 +781,9 @@ class group_non_members_selector extends groups_user_selector_base {
$roleparams = array(); $roleparams = array();
} }
// We want to query both the current context and parent contexts.
list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx');
// Get the search condition. // Get the search condition.
list($searchcondition, $searchparams) = $this->search_sql($search, 'u'); list($searchcondition, $searchparams) = $this->search_sql($search, 'u');
@ -794,7 +797,7 @@ class group_non_members_selector extends groups_user_selector_base {
WHERE igm.userid = u.id AND ig.courseid = :courseid) AS numgroups"; WHERE igm.userid = u.id AND ig.courseid = :courseid) AS numgroups";
$sql = " FROM {user} u $sql = " FROM {user} u
JOIN ($enrolsql) e ON e.id = u.id JOIN ($enrolsql) e ON e.id = u.id
LEFT JOIN {role_assignments} ra ON (ra.userid = u.id AND ra.contextid " . get_related_contexts_string($context) . " AND ra.roleid $roleids) LEFT JOIN {role_assignments} ra ON (ra.userid = u.id AND ra.contextid $relatedctxsql AND ra.roleid $roleids)
LEFT JOIN {role} r ON r.id = ra.roleid LEFT JOIN {role} r ON r.id = ra.roleid
LEFT JOIN {groups_members} gm ON (gm.userid = u.id AND gm.groupid = :groupid) LEFT JOIN {groups_members} gm ON (gm.userid = u.id AND gm.groupid = :groupid)
WHERE u.deleted = 0 WHERE u.deleted = 0
@ -804,7 +807,7 @@ class group_non_members_selector extends groups_user_selector_base {
list($sort, $sortparams) = users_order_by_sql('u', $search, $this->accesscontext); list($sort, $sortparams) = users_order_by_sql('u', $search, $this->accesscontext);
$orderby = ' ORDER BY ' . $sort; $orderby = ' ORDER BY ' . $sort;
$params = array_merge($searchparams, $roleparams, $enrolparams); $params = array_merge($searchparams, $roleparams, $enrolparams, $relatedctxparams);
$params['courseid'] = $this->courseid; $params['courseid'] = $this->courseid;
$params['groupid'] = $this->groupid; $params['groupid'] = $this->groupid;