Skip to content

Commit 292c974

Browse files
committed
GRADEME-129: Add setting to limit block items based on maximum age
1 parent 6fee979 commit 292c974

File tree

4 files changed

+117
-13
lines changed

4 files changed

+117
-13
lines changed

lang/en/block_grade_me.php

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434

3535
$string['settings_maxcourses'] = 'Maximum Courses Displayed';
3636
$string['settings_configmaxcourses'] = 'Set the maximum number of ungraded courses to show. Setting this too high may impact performance.';
37+
$string['settings_maxage'] = 'Maximum Age';
38+
$string['settings_configmaxage'] = 'The maximum age of gradable items, in days, to show. Items older than this will be hidden. Enter 0 for no limit.';
3739
$string['settings_adminviewall'] = 'Admins View All';
3840
$string['settings_configadminviewall'] = 'Enable to give administrators the rights to see all ungraded work — not just for courses where they have a grader role.';
3941
$string['settings_configshowhidden'] = 'Enable showing items to grade within hidden courses';

lib.php

+7-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function block_grade_me_array2str($array) {
3939
* @return string $query
4040
*/
4141
function block_grade_me_query_prefix() {
42-
$query = 'SELECT bgm.courseid, bgm.coursename, bgm.itemmodule, bgm.iteminstance, bgm.itemname, ' .
42+
$query = 'SELECT * FROM (SELECT bgm.courseid, bgm.coursename, bgm.itemmodule, bgm.iteminstance, bgm.itemname, ' .
4343
'bgm.coursemoduleid, bgm.itemsortorder';
4444
return $query;
4545
}
@@ -51,8 +51,12 @@ function block_grade_me_query_prefix() {
5151
* @return string $string
5252
*/
5353
function block_grade_me_query_suffix($mod) {
54-
$query = " AND bgm.courseid = ?
55-
AND bgm.itemmodule = '$mod'";
54+
$query = " AND bgm.courseid = ? AND bgm.itemmodule = '$mod') allitems";
55+
$maxage = get_config(null, 'block_grade_me_maxage');
56+
if (!empty($maxage) && is_numeric($maxage)) {
57+
$maxtimesubmitted = time()-((int)$maxage * DAYSECS);
58+
$query .= " WHERE allitems.timesubmitted >= ".$maxtimesubmitted;
59+
}
5660
return $query;
5761
}
5862

settings.php

+3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
$settings->add(new admin_setting_configtext('block_grade_me_maxcourses', get_string('settings_maxcourses', 'block_grade_me'),
2525
get_string('settings_configmaxcourses', 'block_grade_me'), 10, PARAM_INT));
2626

27+
$settings->add(new admin_setting_configtext('block_grade_me_maxage', get_string('settings_maxage', 'block_grade_me'),
28+
get_string('settings_configmaxage', 'block_grade_me'), 0, PARAM_INT));
29+
2730
$settings->add(new admin_setting_configcheckbox('block_grade_me_enableshowhidden',
2831
get_string('settings_showhidden', 'block_grade_me'), get_string('settings_configshowhidden', 'block_grade_me'), 0));
2932

tests/grade_me_test.php

+105-10
Original file line numberDiff line numberDiff line change
@@ -262,21 +262,116 @@ public function test_query_assign() {
262262
}
263263

264264
/**
265-
* Test the block_grade_me_query_prefix function
265+
* Test the function block_grade_me_query_assign using a maximum age.
266+
*
267+
* @depends test_load_db
266268
*/
267-
public function test_query_prefix() {
268-
$expected = "SELECT bgm.courseid, bgm.coursename, bgm.itemmodule, bgm.iteminstance, bgm.itemname, " .
269-
"bgm.coursemoduleid, bgm.itemsortorder";
270-
$this->assertEquals($expected, block_grade_me_query_prefix());
269+
public function test_query_assign_maxage() {
270+
global $DB;
271+
272+
$this->resetAfterTest(true);
273+
274+
// 0 maxage indicates unlimited age.
275+
set_config('block_grade_me_maxage', 0);
276+
list($users, $courses, $plugins) = $this->create_grade_me_data('block_grade_me.xml');
277+
278+
$rec = new stdClass();
279+
$rec->id = $plugins[2]->id;
280+
$rec->courseid = $courses[0]->id;
281+
$rec->submissionid = '2';
282+
$rec->userid = $users[0]->id;
283+
$rec->timesubmitted = '2';
284+
$rec->attemptnumber = '1';
285+
$rec->maxattempts = '-1';
286+
287+
$rec2 = new stdClass();
288+
$rec2->id = $plugins[3]->id;
289+
$rec2->courseid = $courses[0]->id;
290+
$rec2->submissionid = '3';
291+
$rec2->userid = $users[0]->id;
292+
$rec2->timesubmitted = '3';
293+
$rec2->attemptnumber = '1';
294+
$rec2->maxattempts = '-1';
295+
296+
// Tests resubmission.
297+
$rec3 = new stdClass();
298+
$rec3->id = $plugins[4]->id;
299+
$rec3->courseid = $courses[0]->id;
300+
$rec3->submissionid = '7';
301+
$rec3->userid = $users[0]->id;
302+
$rec3->timesubmitted = '6';
303+
$rec3->attemptnumber = '1';
304+
$rec3->maxattempts = '-1';
305+
306+
$rec4 = new stdClass();
307+
$rec4->id = $plugins[1]->id;
308+
$rec4->courseid = $courses[0]->id;
309+
$rec4->submissionid = '1';
310+
$rec4->userid = $users[0]->id;
311+
$rec4->timesubmitted = '1';
312+
$rec4->attemptnumber = '1';
313+
$rec4->maxattempts = '-1';
314+
315+
$expected = array($rec->id => $rec, $rec2->id => $rec2, $rec3->id => $rec3, $rec4->id => $rec4);
316+
list($sql, $inparams) = block_grade_me_query_assign(array($users[0]->id));
317+
$query = block_grade_me_query_prefix().', a.id as assignid '.$sql.block_grade_me_query_suffix('assign');
318+
$values = array_merge($inparams, ['courseid' => $courses[0]->id]);
319+
$actual = [];
320+
$rs = $DB->get_recordset_sql($query, $values);
321+
foreach ($rs as $record) {
322+
$actual[$record->assignid] = (object)[
323+
'id' => $record->assignid,
324+
'courseid' => $record->courseid,
325+
'submissionid' => $record->submissionid,
326+
'userid' => $record->userid,
327+
'timesubmitted' => $record->timesubmitted,
328+
'attemptnumber' => $record->attemptnumber,
329+
'maxattempts' => $record->maxattempts
330+
];
331+
}
332+
$this->assertEquals($expected, $actual);
333+
$this->assertFalse(block_grade_me_query_assign(array()));
334+
335+
// Test with a maximum age.
336+
set_config('block_grade_me_maxage', 10);
337+
$now = time();
338+
$oldesttimestamp = $now - (10*DAYSECS);
339+
// Set all submissions to be current, therefore included.
340+
$DB->execute('UPDATE {assign_submission} SET timemodified = '.$now);
341+
// Set submission 2 to be older than configured max age.
342+
$DB->execute('UPDATE {assign_submission} SET timemodified = '.($oldesttimestamp-1000).' WHERE id = 2');
343+
// Expected array should now not include $rec.
344+
$expected = array($rec2->id => $rec2, $rec3->id => $rec3, $rec4->id => $rec4);
345+
foreach ($expected as $id => $record) {
346+
$expected[$id]->timesubmitted = $now;
347+
}
348+
list($sql, $inparams) = block_grade_me_query_assign(array($users[0]->id));
349+
$query = block_grade_me_query_prefix().', a.id as assignid '.$sql.block_grade_me_query_suffix('assign');
350+
$values = array_merge($inparams, ['courseid' => $courses[0]->id]);
351+
$actual = [];
352+
$rs = $DB->get_recordset_sql($query, $values);
353+
foreach ($rs as $record) {
354+
$actual[$record->assignid] = (object)[
355+
'id' => $record->assignid,
356+
'courseid' => $record->courseid,
357+
'submissionid' => $record->submissionid,
358+
'userid' => $record->userid,
359+
'timesubmitted' => $record->timesubmitted,
360+
'attemptnumber' => $record->attemptnumber,
361+
'maxattempts' => $record->maxattempts
362+
];
363+
}
364+
$this->assertEquals($expected, $actual);
365+
$this->assertFalse(block_grade_me_query_assign(array()));
271366
}
272367

273368
/**
274-
* Test the block_grade_me_query_suffix function
369+
* Test the block_grade_me_query_prefix function
275370
*/
276-
public function test_query_suffix() {
277-
$expected = " AND bgm.courseid = ?
278-
AND bgm.itemmodule = 'assign'";
279-
$this->assertEquals($expected, block_grade_me_query_suffix('assign'));
371+
public function test_query_prefix() {
372+
$expected = "SELECT * FROM (SELECT bgm.courseid, bgm.coursename, bgm.itemmodule, bgm.iteminstance, bgm.itemname, " .
373+
"bgm.coursemoduleid, bgm.itemsortorder";
374+
$this->assertEquals($expected, block_grade_me_query_prefix());
280375
}
281376

282377
/**

0 commit comments

Comments
 (0)