*
* @global stdClass $USER
* @global moodle_database $DB
- * @global stdClass $SESSION
* @param int $gradeitemid Grade item ID we're interested in
* @param bool $grabthelot If true, grabs all scores for current user on
* this course, so that later ones come from cache
* or 37.21), or false if user does not have a grade yet
*/
private function get_cached_grade_score($gradeitemid, $grabthelot=false, $userid=0) {
- global $USER, $DB, $SESSION;
- if ($userid==0 || $userid==$USER->id) {
- // For current user, go via cache in session
- if (empty($SESSION->gradescorecache) || $SESSION->gradescorecacheuserid!=$USER->id) {
- $SESSION->gradescorecache = array();
- $SESSION->gradescorecacheuserid = $USER->id;
- }
- if (!array_key_exists($gradeitemid, $SESSION->gradescorecache)) {
- if ($grabthelot) {
- // Get all grades for the current course
- $rs = $DB->get_recordset_sql('
- SELECT
- gi.id,gg.finalgrade,gg.rawgrademin,gg.rawgrademax
- FROM
- {grade_items} gi
- LEFT JOIN {grade_grades} gg ON gi.id=gg.itemid AND gg.userid=?
- WHERE
- gi.courseid = ?', array($USER->id, $this->item->course));
- foreach ($rs as $record) {
- $SESSION->gradescorecache[$record->id] =
- is_null($record->finalgrade)
- // No grade = false
- ? false
- // Otherwise convert grade to percentage
- : (($record->finalgrade - $record->rawgrademin) * 100) /
- ($record->rawgrademax - $record->rawgrademin);
+ global $USER, $DB;
+ if (!$userid) {
+ $userid = $USER->id;
+ }
+ $cache = cache::make('core', 'gradecondition');
+ if (($cachedgrades = $cache->get($userid)) === false) {
+ $cachedgrades = array();
+ }
+ if (!array_key_exists($gradeitemid, $cachedgrades)) {
+ if ($grabthelot) {
+ // Get all grades for the current course
+ $rs = $DB->get_recordset_sql('
+ SELECT
+ gi.id,gg.finalgrade,gg.rawgrademin,gg.rawgrademax
+ FROM
+ {grade_items} gi
+ LEFT JOIN {grade_grades} gg ON gi.id=gg.itemid AND gg.userid=?
+ WHERE
+ gi.courseid = ?', array($userid, $this->item->course));
+ foreach ($rs as $record) {
+ $cachedgrades[$record->id] =
+ is_null($record->finalgrade)
+ // No grade = false
+ ? false
+ // Otherwise convert grade to percentage
+ : (($record->finalgrade - $record->rawgrademin) * 100) /
+ ($record->rawgrademax - $record->rawgrademin);
- }
- $rs->close();
- // And if it's still not set, well it doesn't exist (eg
- // maybe the user set it as a condition, then deleted the
- // grade item) so we call it false
- if (!array_key_exists($gradeitemid, $SESSION->gradescorecache)) {
- $SESSION->gradescorecache[$gradeitemid] = false;
- }
- } else {
- // Just get current grade
- $record = $DB->get_record('grade_grades', array(
- 'userid'=>$USER->id, 'itemid'=>$gradeitemid));
- if ($record && !is_null($record->finalgrade)) {
- $score = (($record->finalgrade - $record->rawgrademin) * 100) /
- ($record->rawgrademax - $record->rawgrademin);
- } else {
- // Treat the case where row exists but is null, same as
- // case where row doesn't exist
- $score = false;
- }
- $SESSION->gradescorecache[$gradeitemid]=$score;
}
- }
- return $SESSION->gradescorecache[$gradeitemid];
- } else {
- // Not the current user, so request the score individually
- $record = $DB->get_record('grade_grades', array(
- 'userid'=>$userid, 'itemid'=>$gradeitemid));
- if ($record && !is_null($record->finalgrade)) {
- $score = (($record->finalgrade - $record->rawgrademin) * 100) /
- ($record->rawgrademax - $record->rawgrademin);
+ $rs->close();
+ // And if it's still not set, well it doesn't exist (eg
+ // maybe the user set it as a condition, then deleted the
+ // grade item) so we call it false
+ if (!array_key_exists($gradeitemid, $cachedgrades)) {
+ $cachedgrades[$gradeitemid] = false;
+ }
} else {
- // Treat the case where row exists but is null, same as
- // case where row doesn't exist
- $score = false;
+ // Just get current grade
+ $record = $DB->get_record('grade_grades', array(
+ 'userid'=>$userid, 'itemid'=>$gradeitemid));
+ if ($record && !is_null($record->finalgrade)) {
+ $score = (($record->finalgrade - $record->rawgrademin) * 100) /
+ ($record->rawgrademax - $record->rawgrademin);
+ } else {
+ // Treat the case where row exists but is null, same as
+ // case where row doesn't exist
+ $score = false;
+ }
+ $cachedgrades[$gradeitemid]=$score;
}
- return $score;
+ $cache->set($userid, $cachedgrades);
}
+ return $cachedgrades[$gradeitemid];
}
/**
* @param bool $deleted
*/
public static function inform_grade_changed($grade, $deleted) {
- global $USER, $SESSION;
- // In case of self-grading we can purge cache immediately.
- if ($USER->id == $grade->userid) {
- unset($SESSION->gradescorecache[$grade->itemid]);
- }
+ cache::make('core', 'gradecondition')->delete($grade->userid);
}
/**
}
/**
- * For testing only. Wipes information cached in user session.
- *
- * @global stdClass $SESSION
+ * For testing only. Wipes information cached in cache.
+ * Replaced with {@link core_conditionlib_testcase::wipe_condition_cache()}
+ * @deprecated since 2.6
*/
static function wipe_session_cache() {
- global $SESSION;
- unset($SESSION->gradescorecache);
- unset($SESSION->gradescorecacheuserid);
- unset($SESSION->userfieldcache);
- unset($SESSION->userfieldcacheuserid);
+ cache::make('core', 'gradecondition')->purge();
}
/**
$this->setUser($user);
}
+ protected function wipe_condition_cache() {
+ cache::make('core', 'gradecondition')->purge();
+ }
+
public function test_constructor() {
global $DB;
$cm = new stdClass;
$ci = new condition_info((object)array('id'=>$cmid), CONDITION_MISSING_EVERYTHING);
$ci->add_completion_condition($oldid, COMPLETION_COMPLETE);
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertFalse($ci->is_available($text, false));
$this->assertEquals(get_string('requires_completion_1', 'condition', 'xxx'), $text);
$completion = new completion_info($DB->get_record('course', array('id'=>$courseid)));
$completion->update_state($oldcm, COMPLETION_COMPLETE);
completion_info::wipe_session_cache();
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
$this->assertFalse($ci->is_available($text, false, $USER->id+1));
completion_info::wipe_session_cache();
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$completion = new completion_info($DB->get_record('course', array('id'=>$courseid)));
$completion->update_state($oldcm, COMPLETION_INCOMPLETE);
$this->assertFalse($ci->is_available($text));
$ci->wipe_conditions();
$ci->add_completion_condition($oldid, COMPLETION_INCOMPLETE);
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
$this->assertTrue($ci->is_available($text, false, $USER->id+1));
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text, true));
// Grade.
// Fake it existing.
$DB->insert_record('grade_grades', (object)array(
'itemid'=>$gradeitemid, 'userid'=>$USER->id, 'finalgrade'=>3.78));
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text, true));
// Now require that user gets more than 3.78001.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, 3.78001, null, true);
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertFalse($ci->is_available($text));
$this->assertEquals(get_string('requires_grade_min', 'condition', 'frog'), $text);
// ...just on 3.78...
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, 3.78, null, true);
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
// ...less than 3.78.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, null, 3.78, true);
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertFalse($ci->is_available($text));
$this->assertEquals(get_string('requires_grade_max', 'condition', 'frog'), $text);
// ...less than 3.78001.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, null, 3.78001, true);
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
// ...in a range that includes it.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, 3, 4, true);
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
// ...in a range that doesn't include it.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, 4, 5, true);
- condition_info::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertFalse($ci->is_available($text));
$this->assertEquals(get_string('requires_grade_range', 'condition', 'frog'), $text);
}
$ci = new condition_info_section((object)array('id' => $sectionid),
CONDITION_MISSING_EVERYTHING);
$ci->add_completion_condition($cmid, COMPLETION_COMPLETE);
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
// Completion: Check.
$this->assertFalse($ci->is_available($text, false));
$completion = new completion_info($DB->get_record('course', array('id' => $courseid)));
$completion->update_state($cm, COMPLETION_COMPLETE);
completion_info::wipe_session_cache();
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
$this->assertFalse($ci->is_available($text, false, $USER->id + 1));
// Completion: Uncheck.
completion_info::wipe_session_cache();
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$completion = new completion_info($DB->get_record('course', array('id' => $courseid)));
$completion->update_state($cm, COMPLETION_INCOMPLETE);
$this->assertFalse($ci->is_available($text));
// Completion: Incomplete condition.
$ci->wipe_conditions();
$ci->add_completion_condition($cmid, COMPLETION_INCOMPLETE);
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
$this->assertTrue($ci->is_available($text, false, $USER->id + 1));
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text, true));
// Grade: Add a fake grade item.
// Grade: Fake it existing.
$DB->insert_record('grade_grades', (object)array(
'itemid' => $gradeitemid, 'userid' => $USER->id, 'finalgrade' => 3.78));
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text, true));
// Grade: Now require that user gets more than 3.78001.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, 3.78001, null, true);
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertFalse($ci->is_available($text));
$this->assertEquals(get_string('requires_grade_min', 'condition', 'frog'), $text);
// Grade: ...just on 3.78...
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, 3.78, null, true);
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
// Grade: ...less than 3.78.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, null, 3.78, true);
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertFalse($ci->is_available($text));
$this->assertEquals(get_string('requires_grade_max', 'condition', 'frog'), $text);
// Grade: ...less than 3.78001.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, null, 3.78001, true);
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
// Grade: ...in a range that includes it.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, 3, 4, true);
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertTrue($ci->is_available($text));
// Grade: ...in a range that doesn't include it.
$ci->wipe_conditions();
$ci->add_grade_condition($gradeitemid, 4, 5, true);
- condition_info_section::wipe_session_cache();
+ $this->wipe_condition_cache();
$this->assertFalse($ci->is_available($text));
$this->assertEquals(get_string('requires_grade_range', 'condition', 'frog'), $text);