quiz recent activity: MDL-20586 was showing scores even if quiz settings said not to.

Fix started with a patch from Yolanda Ordoñez Rufat but with significant reworking by me.
This commit is contained in:
Tim Hunt
2010-04-29 10:46:39 +00:00
parent 8275477c13
commit 8d2971888f
+82 -77
View File
@@ -791,23 +791,11 @@ function quiz_refresh_events($courseid = 0) {
/**
* Returns all quiz graded users since a given time for specified quiz
*
* @global stdClass
* @global object
* @global object
* @global object
* @uses CONTEXT_MODULE
* @param array $activities By reference
* @param int $index By reference
* @param int $timestart
* @param int $courseid
* @param int $cmid
* @param int $userid
* @param int $groupid
* @return void
*/
function quiz_get_recent_mod_activity(&$activities, &$index, $timestart, $courseid, $cmid, $userid=0, $groupid=0) {
function quiz_get_recent_mod_activity(&$activities, &$index, $timestart,
$courseid, $cmid, $userid = 0, $groupid = 0) {
global $CFG, $COURSE, $USER, $DB;
require_once('locallib.php');
if ($COURSE->id == $courseid) {
$course = $COURSE;
@@ -818,85 +806,105 @@ function quiz_get_recent_mod_activity(&$activities, &$index, $timestart, $course
$modinfo =& get_fast_modinfo($course);
$cm = $modinfo->cms[$cmid];
$params = array($timestart, $cm->instance);
$quiz = $DB->get_record('quiz', array('id' => $cm->instance));
if ($userid) {
$userselect = "AND u.id = ?";
$params[] = $userid;
$userselect = "AND u.id = :userid";
$params['userid'] = $userid;
} else {
$userselect = "";
$userselect = '';
}
if ($groupid) {
$groupselect = "AND gm.groupid = ?";
$groupjoin = "JOIN {groups_members} gm ON gm.userid=u.id";
$params[] = $groupid;
$groupselect = 'AND gm.groupid = :groupid';
$groupjoin = 'JOIN {groups_members} gm ON gm.userid=u.id';
$params['groupid'] = $groupid;
} else {
$groupselect = "";
$groupjoin = "";
$groupselect = '';
$groupjoin = '';
}
if (!$attempts = $DB->get_records_sql("SELECT qa.*, q.sumgrades AS maxgrade,
u.firstname, u.lastname, u.email, u.picture
FROM {quiz_attempts} qa
JOIN {quiz} q ON q.id = qa.quiz
JOIN {user} u ON u.id = qa.userid
$groupjoin
WHERE qa.timefinish > $timestart AND q.id = $cm->instance
$userselect $groupselect
ORDER BY qa.timefinish ASC", $params)) {
return;
$params = array(
'timestart' => $timestart,
'quizid' => $quiz->id
);
if (!$attempts = $DB->get_records_sql("
SELECT qa.*,
u.firstname, u.lastname, u.email, u.picture, u.imagealt
FROM {quiz_attempts} qa
JOIN {user} u ON u.id = qa.userid
$groupjoin
WHERE qa.timefinish > :timestart
AND qa.quiz = :quizid
AND qa.preview = 0
$userselect
$groupselect
ORDER BY qa.timefinish ASC", $params)) {
return;
}
$cm_context = get_context_instance(CONTEXT_MODULE, $cm->id);
$grader = has_capability('moodle/grade:viewall', $cm_context);
$accessallgroups = has_capability('moodle/site:accessallgroups', $cm_context);
$viewfullnames = has_capability('moodle/site:viewfullnames', $cm_context);
$grader = has_capability('mod/quiz:grade', $cm_context);
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
$grader = has_capability('moodle/grade:viewall', $context);
$accessallgroups = has_capability('moodle/site:accessallgroups', $context);
$viewfullnames = has_capability('moodle/site:viewfullnames', $context);
$grader = has_capability('mod/quiz:grade', $context);
$groupmode = groups_get_activity_groupmode($cm, $course);
if (is_null($modinfo->groups)) {
$modinfo->groups = groups_get_user_groups($course->id); // load all my groups and cache it in modinfo
}
$usersgroups = null;
$aname = format_string($cm->name,true);
foreach ($attempts as $attempt) {
if ($attempt->userid != $USER->id) {
if (!$grader) {
// grade permission required
// Grade permission required
continue;
}
if ($groupmode == SEPARATEGROUPS and !$accessallgroups) {
$usersgroups = groups_get_all_groups($course->id, $attempt->userid, $cm->groupingid);
if (!is_array($usersgroups)) {
continue;
if (is_null($usersgroups)) {
$usersgroups = groups_get_all_groups($course->id,
$attempt->userid, $cm->groupingid);
if (is_array($usersgroups)) {
$usersgroups = array_keys($usersgroups);
} else {
$usersgroups = array();
}
}
$usersgroups = array_keys($usersgroups);
$interset = array_intersect($usersgroups, $modinfo->groups[$cm->id]);
if (empty($intersect)) {
if (!array_intersect($usersgroups, $modinfo->groups[$cm->id])) {
continue;
}
}
}
}
$tmpactivity = new object();
$options = quiz_get_reviewoptions($quiz, $attempt, $context);
$tmpactivity->type = 'quiz';
$tmpactivity->cmid = $cm->id;
$tmpactivity->name = $aname;
$tmpactivity->sectionnum= $cm->sectionnum;
$tmpactivity->timestamp = $attempt->timefinish;
$tmpactivity = new stdClass;
$tmpactivity->type = 'quiz';
$tmpactivity->cmid = $cm->id;
$tmpactivity->name = $aname;
$tmpactivity->sectionnum = $cm->sectionnum;
$tmpactivity->timestamp = $attempt->timefinish;
$tmpactivity->content->attemptid = $attempt->id;
$tmpactivity->content->sumgrades = $attempt->sumgrades;
$tmpactivity->content->maxgrade = $attempt->maxgrade;
$tmpactivity->content->attempt = $attempt->attempt;
if (quiz_has_grades($quiz) && $options->scores) {
$tmpactivity->content->sumgrades = quiz_format_grade($quiz, $attempt->sumgrades);
$tmpactivity->content->maxgrade = quiz_format_grade($quiz, $quiz->sumgrades);
} else {
$tmpactivity->content->sumgrades = null;
$tmpactivity->content->maxgrade = null;
}
$tmpactivity->user->userid = $attempt->userid;
$tmpactivity->user->id = $attempt->id;
$tmpactivity->user->firstname = $attempt->firstname;
$tmpactivity->user->lastname = $attempt->lastname;
$tmpactivity->user->fullname = fullname($attempt, $viewfullnames);
$tmpactivity->user->picture = $attempt->picture;
$tmpactivity->user->imagealt = $attempt->imagealt;
$activities[$index++] = $tmpactivity;
}
@@ -904,44 +912,41 @@ function quiz_get_recent_mod_activity(&$activities, &$index, $timestart, $course
return;
}
/**
* @global stdClass
* @param object $activity
* @param int $courseid
* @param bool $detail
* @param array $modnames
* @return void output is echo'd
*/
function quiz_print_recent_mod_activity($activity, $courseid, $detail, $modnames) {
global $CFG, $OUTPUT;
echo '<table border="0" cellpadding="3" cellspacing="0" class="forum-recent">';
echo "<tr><td class=\"userpicture\" valign=\"top\">";
echo $OUTPUT->user_picture($activity->user, array('courseid'=>$courseid));
echo "</td><td>";
echo '<tr><td class="userpicture" valign="top">';
echo $OUTPUT->user_picture($activity->user, array('courseid' => $courseid));
echo '</td><td>';
if ($detail) {
$modname = $modnames[$activity->type];
echo '<div class="title">';
echo "<img src=\"" . $OUTPUT->pix_url('icon', $activity->type) . "\" ".
"class=\"icon\" alt=\"$modname\" />";
echo "<a href=\"$CFG->wwwroot/mod/quiz/view.php?id={$activity->cmid}\">{$activity->name}</a>";
echo '<img src="' . $OUTPUT->pix_url('icon', $activity->type) . '" ' .
'class="icon" alt="' . $modname . '" />';
echo '<a href="' . $CFG->wwwroot . '/mod/quiz/view.php?id=' .
$activity->cmid . '">' . $activity->name . '</a>';
echo '</div>';
}
echo '<div class="grade">';
echo get_string("attempt", "quiz")." {$activity->content->attempt}: ";
$grades = "({$activity->content->sumgrades} / {$activity->content->maxgrade})";
echo "<a href=\"$CFG->wwwroot/mod/quiz/review.php?attempt={$activity->content->attemptid}\">$grades</a>";
echo get_string('attempt', 'quiz', $activity->content->attempt);
if (isset($activity->content->maxgrade)) {
$grades = $activity->content->sumgrades . ' / ' . $activity->content->maxgrade;
echo ': (<a href="' . $CFG->wwwroot . '/mod/quiz/review.php?attempt=' .
$activity->content->attemptid . '">' . $grades . '</a>)';
}
echo '</div>';
echo '<div class="user">';
echo "<a href=\"$CFG->wwwroot/user/view.php?id={$activity->user->userid}&amp;course=$courseid\">"
."{$activity->user->fullname}</a> - ".userdate($activity->timestamp);
echo '<a href="' . $CFG->wwwroot . '/user/view.php?id=' . $activity->user->id .
'&amp;course=' . $courseid . '">' . $activity->user->fullname .
'</a> - ' . userdate($activity->timestamp);
echo '</div>';
echo "</td></tr></table>";
echo '</td></tr></table>';
return;
}