diff --git a/mod/assign/amd/build/grading_navigation.min.js b/mod/assign/amd/build/grading_navigation.min.js index 002899aacc6..fe0805d6477 100644 --- a/mod/assign/amd/build/grading_navigation.min.js +++ b/mod/assign/amd/build/grading_navigation.min.js @@ -1 +1 @@ -define(["jquery","core/notification","core/str","core/form-autocomplete","core/ajax","mod_assign/grading_form_change_checker"],function(a,b,c,d,e,f){var g=function(e){this._regionSelector=e,this._region=a(e),this._filters=[],this._users=[],this._filteredUsers=[],this._loadAllUsers(),this._region.find('[data-action="previous-user"]').on("click",this._handlePreviousUser.bind(this)),this._region.find('[data-action="next-user"]').on("click",this._handleNextUser.bind(this)),this._region.find('[data-action="change-user"]').on("change",this._handleChangeUser.bind(this)),this._region.find('[data-region="user-filters"]').on("click",this._toggleExpandFilters.bind(this)),a(document).on("user-changed",this._refreshSelector.bind(this));var f=this._region.find('[data-region="user-filters"]'),g=a(document.getElementById(f.attr("aria-controls")));g.on("change",'[type="checkbox"]',this._filterChanged.bind(this));var h=a('[data-region="grading-navigation-panel"]').data("first-userid");h&&this._selectUserById(h),c.get_string("changeuser","mod_assign").done(function(a){d.enhance("[data-action=change-user]",!1,"mod_assign/participant_selector",a)}).fail(b.exception),a(document).bind("start-loading-user",function(){this._isLoading=!0}.bind(this)),a(document).bind("finish-loading-user",function(){this._isLoading=!1}.bind(this))};return g.prototype._isLoading=!1,g.prototype._regionSelector=null,g.prototype._filters=null,g.prototype._users=null,g.prototype._region=null,g.prototype._loadAllUsers=function(){var a=this._region.find("[data-action=change-user]"),c=a.attr("data-assignmentid"),d=a.attr("data-groupid");e.call([{methodname:"mod_assign_list_participants",args:{assignid:c,groupid:d,filter:"",onlyids:!0},done:this._usersLoaded.bind(this),fail:b.exception}])},g.prototype._usersLoaded=function(b){if(this._filteredUsers=this._users=b,this._users.length){var c=this._region.find('[data-region="user-filters"]'),d=a(document.getElementById(c.attr("aria-controls")));d.find('[type="checkbox"]').trigger("change")}else this._selectNoUser()},g.prototype._checkClickOutsideConfigureFilters=function(b){var c=this._region.find('[data-region="configure-filters"]');if(!c.is(b.target)&&0===c.has(b.target).length){var d=this._region.find('[data-region="user-filters"]');c.hide(),c.attr("aria-hidden","true"),d.attr("aria-expanded","false"),a(document).unbind("click.mod_assign_grading_navigation")}},g.prototype._filterChanged=function(d){var e=a(d.target).attr("name"),f=e.split("_").pop(),g=a(d.target).prop("checked");if(g)this._filters.indexOf(f)==-1&&(this._filters[this._filters.length]=f);else{var h=this._filters.indexOf(f);h!=-1&&this._filters.splice(h,1)}var i=[];this._region.find('[data-region="configure-filters"]').find('[type="checkbox"]').each(function(b,c){a(c).prop("checked")&&(i[i.length]=a(c).closest("label").text())}),i.length?this._region.find('[data-region="user-filters"] span').text(i.join(", ")):c.get_string("nofilters","mod_assign").done(function(a){this._region.find('[data-region="user-filters"] span').text(a)}.bind(this)).fail(b.exception);var j=this._region.find("[data-action=change-user]"),k=j.attr("data-selected"),l=0;this._filteredUsers=[],a.each(this._users,function(b,c){var d=!0;a.each(this._filters,function(a,b){"submitted"==b?"0"==c.submitted&&(d=!1):"notsubmitted"==b?"1"==c.submitted&&(d=!1):"requiregrading"==b&&"0"==c.requiregrading&&(d=!1)}),d&&(this._filteredUsers[this._filteredUsers.length]=c,k==c.id&&(l=this._filteredUsers.length-1))}.bind(this)),this._filteredUsers.length?this._selectUserById(this._filteredUsers[l].id):this._selectNoUser()},g.prototype._selectNoUser=function(){this._isLoading||(f.checkFormForChanges('[data-region="grade-panel"] .gradeform')?c.get_strings([{key:"unsavedchanges",component:"mod_assign"},{key:"unsavedchangesquestion",component:"mod_assign"},{key:"saveandcontinue",component:"mod_assign"},{key:"cancel",component:"core"}]).done(function(c){b.confirm(c[0],c[1],c[2],c[3],function(){a(document).trigger("save-changes",-1)})}):a(document).trigger("user-changed",-1))},g.prototype._selectUserById=function(d){var e=this._region.find("[data-action=change-user]"),g=parseInt(d,10);this._isLoading||(f.checkFormForChanges('[data-region="grade-panel"] .gradeform')?c.get_strings([{key:"unsavedchanges",component:"mod_assign"},{key:"unsavedchangesquestion",component:"mod_assign"},{key:"saveandcontinue",component:"mod_assign"},{key:"cancel",component:"core"}]).done(function(c){b.confirm(c[0],c[1],c[2],c[3],function(){a(document).trigger("save-changes",g)})}):(e.attr("data-selected",d),!isNaN(g)&&g>0&&a(document).trigger("user-changed",d)))},g.prototype._toggleExpandFilters=function(b){b.preventDefault();var c=a(b.target).closest('[data-region="user-filters"]'),d="true"==c.attr("aria-expanded"),e=a(document.getElementById(c.attr("aria-controls")));d?(e.hide(),e.attr("aria-hidden","true"),c.attr("aria-expanded","false"),a(document).unbind("click.mod_assign_grading_navigation")):(e.css("display","inline-block"),e.attr("aria-hidden","false"),c.attr("aria-expanded","true"),b.stopPropagation(),a(document).on("click.mod_assign_grading_navigation",this._checkClickOutsideConfigureFilters.bind(this)))},g.prototype._handlePreviousUser=function(a){a.preventDefault();var b=this._region.find("[data-action=change-user]"),c=b.attr("data-selected"),d=0,e=0;for(d=0;d0&&c.attr("data-selected",b),this._refreshCount()},g.prototype._handleChangeUser=function(){var d=this._region.find("[data-action=change-user]"),e=parseInt(d.val(),10);this._isLoading||(f.checkFormForChanges('[data-region="grade-panel"] .gradeform')?c.get_strings([{key:"unsavedchanges",component:"mod_assign"},{key:"unsavedchangesquestion",component:"mod_assign"},{key:"saveandcontinue",component:"mod_assign"},{key:"cancel",component:"core"}]).done(function(c){b.confirm(c[0],c[1],c[2],c[3],function(){a(document).trigger("save-changes",e)})}):!isNaN(e)&&e>0&&(d.attr("data-selected",e),a(document).trigger("user-changed",e)))},g}); \ No newline at end of file +define(["jquery","core/notification","core/str","core/form-autocomplete","core/ajax","mod_assign/grading_form_change_checker"],function(a,b,c,d,e,f){var g=function(e){this._regionSelector=e,this._region=a(e),this._filters=[],this._users=[],this._filteredUsers=[],this._loadAllUsers(),this._region.find('[data-action="previous-user"]').on("click",this._handlePreviousUser.bind(this)),this._region.find('[data-action="next-user"]').on("click",this._handleNextUser.bind(this)),this._region.find('[data-action="change-user"]').on("change",this._handleChangeUser.bind(this)),this._region.find('[data-region="user-filters"]').on("click",this._toggleExpandFilters.bind(this)),a(document).on("user-changed",this._refreshSelector.bind(this));var f=this._region.find('[data-region="user-filters"]'),g=a(document.getElementById(f.attr("aria-controls")));g.on("change",'[type="checkbox"]',this._filterChanged.bind(this));var h=a('[data-region="grading-navigation-panel"]').data("first-userid");h&&this._selectUserById(h),c.get_string("changeuser","mod_assign").done(function(a){d.enhance("[data-action=change-user]",!1,"mod_assign/participant_selector",a)}).fail(b.exception),a(document).bind("start-loading-user",function(){this._isLoading=!0}.bind(this)),a(document).bind("finish-loading-user",function(){this._isLoading=!1}.bind(this))};return g.prototype._isLoading=!1,g.prototype._regionSelector=null,g.prototype._filters=null,g.prototype._users=null,g.prototype._region=null,g.prototype._loadAllUsers=function(){var a=this._region.find("[data-action=change-user]"),c=a.attr("data-assignmentid"),d=a.attr("data-groupid");e.call([{methodname:"mod_assign_list_participants",args:{assignid:c,groupid:d,filter:"",onlyids:!0},done:this._usersLoaded.bind(this),fail:b.exception}])},g.prototype._usersLoaded=function(b){if(this._filteredUsers=this._users=b,this._users.length){var c=this._region.find('[data-region="user-filters"]'),d=a(document.getElementById(c.attr("aria-controls")));d.find('[type="checkbox"]').trigger("change")}else this._selectNoUser()},g.prototype._checkClickOutsideConfigureFilters=function(b){var c=this._region.find('[data-region="configure-filters"]');if(!c.is(b.target)&&0===c.has(b.target).length){var d=this._region.find('[data-region="user-filters"]');c.hide(),c.attr("aria-hidden","true"),d.attr("aria-expanded","false"),a(document).unbind("click.mod_assign_grading_navigation")}},g.prototype._filterChanged=function(d){var e=a(d.target).attr("name"),f=e.split("_").pop(),g=a(d.target).prop("checked");if(g)this._filters.indexOf(f)==-1&&(this._filters[this._filters.length]=f);else{var h=this._filters.indexOf(f);h!=-1&&this._filters.splice(h,1)}var i=[];this._region.find('[data-region="configure-filters"]').find('[type="checkbox"]').each(function(b,c){a(c).prop("checked")&&(i[i.length]=a(c).closest("label").text())}),i.length?this._region.find('[data-region="user-filters"] span').text(i.join(", ")):c.get_string("nofilters","mod_assign").done(function(a){this._region.find('[data-region="user-filters"] span').text(a)}.bind(this)).fail(b.exception);var j=this._region.find("[data-action=change-user]"),k=j.attr("data-selected"),l=0;this._filteredUsers=[],a.each(this._users,function(b,c){var d=!0;a.each(this._filters,function(a,b){"submitted"==b?"0"==c.submitted&&(d=!1):"notsubmitted"==b?"1"==c.submitted&&(d=!1):"requiregrading"==b?"0"==c.requiregrading&&(d=!1):"grantedextension"==b&&"0"==c.grantedextension&&(d=!1)}),d&&(this._filteredUsers[this._filteredUsers.length]=c,k==c.id&&(l=this._filteredUsers.length-1))}.bind(this)),this._filteredUsers.length?this._selectUserById(this._filteredUsers[l].id):this._selectNoUser()},g.prototype._selectNoUser=function(){this._isLoading||(f.checkFormForChanges('[data-region="grade-panel"] .gradeform')?c.get_strings([{key:"unsavedchanges",component:"mod_assign"},{key:"unsavedchangesquestion",component:"mod_assign"},{key:"saveandcontinue",component:"mod_assign"},{key:"cancel",component:"core"}]).done(function(c){b.confirm(c[0],c[1],c[2],c[3],function(){a(document).trigger("save-changes",-1)})}):a(document).trigger("user-changed",-1))},g.prototype._selectUserById=function(d){var e=this._region.find("[data-action=change-user]"),g=parseInt(d,10);this._isLoading||(f.checkFormForChanges('[data-region="grade-panel"] .gradeform')?c.get_strings([{key:"unsavedchanges",component:"mod_assign"},{key:"unsavedchangesquestion",component:"mod_assign"},{key:"saveandcontinue",component:"mod_assign"},{key:"cancel",component:"core"}]).done(function(c){b.confirm(c[0],c[1],c[2],c[3],function(){a(document).trigger("save-changes",g)})}):(e.attr("data-selected",d),!isNaN(g)&&g>0&&a(document).trigger("user-changed",d)))},g.prototype._toggleExpandFilters=function(b){b.preventDefault();var c=a(b.target).closest('[data-region="user-filters"]'),d="true"==c.attr("aria-expanded"),e=a(document.getElementById(c.attr("aria-controls")));d?(e.hide(),e.attr("aria-hidden","true"),c.attr("aria-expanded","false"),a(document).unbind("click.mod_assign_grading_navigation")):(e.css("display","inline-block"),e.attr("aria-hidden","false"),c.attr("aria-expanded","true"),b.stopPropagation(),a(document).on("click.mod_assign_grading_navigation",this._checkClickOutsideConfigureFilters.bind(this)))},g.prototype._handlePreviousUser=function(a){a.preventDefault();var b=this._region.find("[data-action=change-user]"),c=b.attr("data-selected"),d=0,e=0;for(d=0;d0&&c.attr("data-selected",b),this._refreshCount()},g.prototype._handleChangeUser=function(){var d=this._region.find("[data-action=change-user]"),e=parseInt(d.val(),10);this._isLoading||(f.checkFormForChanges('[data-region="grade-panel"] .gradeform')?c.get_strings([{key:"unsavedchanges",component:"mod_assign"},{key:"unsavedchangesquestion",component:"mod_assign"},{key:"saveandcontinue",component:"mod_assign"},{key:"cancel",component:"core"}]).done(function(c){b.confirm(c[0],c[1],c[2],c[3],function(){a(document).trigger("save-changes",e)})}):!isNaN(e)&&e>0&&(d.attr("data-selected",e),a(document).trigger("user-changed",e)))},g}); \ No newline at end of file diff --git a/mod/assign/amd/build/participant_selector.min.js b/mod/assign/amd/build/participant_selector.min.js index 01f1ea5e10e..7ad166abea3 100644 --- a/mod/assign/amd/build/participant_selector.min.js +++ b/mod/assign/amd/build/participant_selector.min.js @@ -1 +1 @@ -define(["core/ajax","jquery","core/templates"],function(a,b,c){return{processResults:function(a,b){return b},transport:function(d,e,f,g){var h=b(d).attr("data-assignmentid"),i=b(d).attr("data-groupid"),j=b('[data-region="configure-filters"] input[type="checkbox"]'),k=[];j.each(function(a,c){k[b(c).attr("name")]=b(c).prop("checked")}),a.call([{methodname:"mod_assign_list_participants",args:{assignid:h,groupid:i,filter:e,limit:30,includeenrolments:!1}}])[0].then(function(a){var d=[],e=b("[data-showuseridentity]").data("showuseridentity").split(",");return b.each(a,function(a,f){var g=f,h=[],i=!0;k.filter_submitted&&!f.submitted&&(i=!1),k.filter_notsubmitted&&f.submitted&&(i=!1),k.filter_requiregrading&&!f.requiregrading&&(i=!1),i&&(b.each(e,function(a,b){"undefined"!=typeof f[b]&&""!==f[b]&&(g.hasidentity=!0,h.push(f[b]))}),g.identity=h.join(", "),d.push(c.render("mod_assign/list_participant_user_summary",g).then(function(a){return{value:f.id,label:a}})))}),b.when.apply(b,d)}).then(function(){var a=[];arguments[0]&&(a=Array.prototype.slice.call(arguments)),f(a)})["catch"](g)}}}); \ No newline at end of file +define(["core/ajax","jquery","core/templates"],function(a,b,c){return{processResults:function(a,b){return b},transport:function(d,e,f,g){var h=b(d).attr("data-assignmentid"),i=b(d).attr("data-groupid"),j=b('[data-region="configure-filters"] input[type="checkbox"]'),k=[];j.each(function(a,c){k[b(c).attr("name")]=b(c).prop("checked")}),a.call([{methodname:"mod_assign_list_participants",args:{assignid:h,groupid:i,filter:e,limit:30,includeenrolments:!1}}])[0].then(function(a){var d=[],e=b("[data-showuseridentity]").data("showuseridentity").split(",");return b.each(a,function(a,f){var g=f,h=[],i=!0;k.filter_submitted&&!f.submitted&&(i=!1),k.filter_notsubmitted&&f.submitted&&(i=!1),k.filter_requiregrading&&!f.requiregrading&&(i=!1),k.filter_grantedextension&&!f.grantedextension&&(i=!1),i&&(b.each(e,function(a,b){"undefined"!=typeof f[b]&&""!==f[b]&&(g.hasidentity=!0,h.push(f[b]))}),g.identity=h.join(", "),d.push(c.render("mod_assign/list_participant_user_summary",g).then(function(a){return{value:f.id,label:a}})))}),b.when.apply(b,d)}).then(function(){var a=[];arguments[0]&&(a=Array.prototype.slice.call(arguments)),f(a)})["catch"](g)}}}); \ No newline at end of file diff --git a/mod/assign/amd/src/grading_navigation.js b/mod/assign/amd/src/grading_navigation.js index 0aa7a79c21b..fe827befb7c 100644 --- a/mod/assign/amd/src/grading_navigation.js +++ b/mod/assign/amd/src/grading_navigation.js @@ -212,6 +212,10 @@ define(['jquery', 'core/notification', 'core/str', 'core/form-autocomplete', if (user.requiregrading == "0") { show = false; } + } else if (filter == "grantedextension") { + if (user.grantedextension == "0") { + show = false; + } } }); diff --git a/mod/assign/amd/src/participant_selector.js b/mod/assign/amd/src/participant_selector.js index b2cc28dfe0f..f1d055e9a4a 100644 --- a/mod/assign/amd/src/participant_selector.js +++ b/mod/assign/amd/src/participant_selector.js @@ -79,6 +79,9 @@ define(['core/ajax', 'jquery', 'core/templates'], function(ajax, $, templates) { if (filterstrings.filter_requiregrading && !user.requiregrading) { show = false; } + if (filterstrings.filter_grantedextension && !user.grantedextension) { + show = false; + } if (show) { $.each(identityfields, function(i, k) { if (typeof user[k] !== 'undefined' && user[k] !== '') { diff --git a/mod/assign/classes/output/grading_app.php b/mod/assign/classes/output/grading_app.php index a0567329896..aa2f65984ac 100644 --- a/mod/assign/classes/output/grading_app.php +++ b/mod/assign/classes/output/grading_app.php @@ -97,6 +97,7 @@ class grading_app implements templatable, renderable { $user->id = $record->id; $user->fullname = fullname($record); $user->requiregrading = $record->requiregrading; + $user->grantedextension = $record->grantedextension; $user->submitted = $record->submitted; if (!empty($record->groupid)) { $user->groupid = $record->groupid; diff --git a/mod/assign/externallib.php b/mod/assign/externallib.php index 76614d37a79..15e20e56c36 100644 --- a/mod/assign/externallib.php +++ b/mod/assign/externallib.php @@ -2617,6 +2617,7 @@ class mod_assign_external extends external_api { $userdetails['fullname'] = $fullname; $userdetails['submitted'] = $record->submitted; $userdetails['requiregrading'] = $record->requiregrading; + $userdetails['grantedextension'] = $record->grantedextension; if (!empty($record->groupid)) { $userdetails['groupid'] = $record->groupid; } @@ -2687,6 +2688,7 @@ class mod_assign_external extends external_api { ), 'submitted' => new external_value(PARAM_BOOL, 'have they submitted their assignment'), 'requiregrading' => new external_value(PARAM_BOOL, 'is their submission waiting for grading'), + 'grantedextension' => new external_value(PARAM_BOOL, 'have they been granted an extension'), 'groupid' => new external_value(PARAM_INT, 'for group assignments this is the group id', VALUE_OPTIONAL), 'groupname' => new external_value(PARAM_NOTAGS, 'for group assignments this is the group name', VALUE_OPTIONAL), ]; @@ -2752,6 +2754,7 @@ class mod_assign_external extends external_api { 'fullname' => $participant->fullname, 'submitted' => $participant->submitted, 'requiregrading' => $participant->requiregrading, + 'grantedextension' => $participant->grantedextension, 'blindmarking' => $assign->is_blind_marking(), 'allowsubmissionsfromdate' => $assign->get_instance()->allowsubmissionsfromdate, 'duedate' => $assign->get_instance()->duedate, @@ -2791,6 +2794,7 @@ class mod_assign_external extends external_api { 'fullname' => new external_value(PARAM_NOTAGS, 'The fullname of the user'), 'submitted' => new external_value(PARAM_BOOL, 'have they submitted their assignment'), 'requiregrading' => new external_value(PARAM_BOOL, 'is their submission waiting for grading'), + 'grantedextension' => new external_value(PARAM_BOOL, 'have they been granted an extension'), 'blindmarking' => new external_value(PARAM_BOOL, 'is blind marking enabled for this assignment'), 'allowsubmissionsfromdate' => new external_value(PARAM_INT, 'allowsubmissionsfromdate for the user'), 'duedate' => new external_value(PARAM_INT, 'duedate for the user'), diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 367990e966a..ae287f06666 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -1669,7 +1669,7 @@ class assign { * Get the submission status/grading status for all submissions in this assignment for the * given paticipants. * - * These statuses match the available filters (requiregrading, submitted, notsubmitted). + * These statuses match the available filters (requiregrading, submitted, notsubmitted, grantedextension). * If this is a group assignment, group info is also returned. * * @param array $participants an associative array where the key is the participant id and @@ -1689,8 +1689,9 @@ class assign { $assignid = $this->get_instance()->id; $params['assignmentid1'] = $assignid; $params['assignmentid2'] = $assignid; + $params['assignmentid3'] = $assignid; - $fields = 'SELECT u.id, s.status, s.timemodified AS stime, g.timemodified AS gtime, g.grade'; + $fields = 'SELECT u.id, s.status, s.timemodified AS stime, g.timemodified AS gtime, g.grade, uf.extensionduedate'; $from = ' FROM {user} u LEFT JOIN {assign_submission} s ON u.id = s.userid @@ -1700,14 +1701,17 @@ class assign { ON u.id = g.userid AND g.assignment = :assignmentid2 AND g.attemptnumber = s.attemptnumber + LEFT JOIN {assign_user_flags} uf + ON u.id = uf.userid + AND uf.assignment = :assignmentid3 '; $where = ' WHERE u.id ' . $insql; if (!empty($this->get_instance()->blindmarking)) { $from .= 'LEFT JOIN {assign_user_mapping} um ON u.id = um.userid - AND um.assignment = :assignmentid3 '; - $params['assignmentid3'] = $assignid; + AND um.assignment = :assignmentid4 '; + $params['assignmentid4'] = $assignid; $fields .= ', um.id as recordid '; } @@ -1727,12 +1731,14 @@ class assign { $participants[$userid]->fullname = $this->fullname($participant); $participants[$userid]->submitted = false; $participants[$userid]->requiregrading = false; + $participants[$userid]->grantedextension = false; } foreach ($records as $userid => $submissioninfo) { // These filters are 100% the same as the ones in the grading table SQL. $submitted = false; $requiregrading = false; + $grantedextension = false; if (!empty($submissioninfo->stime) && $submissioninfo->status == ASSIGN_SUBMISSION_STATUS_SUBMITTED) { $submitted = true; @@ -1744,8 +1750,13 @@ class assign { $requiregrading = true; } + if (!empty($submissioninfo->extensionduedate)) { + $grantedextension = true; + } + $participants[$userid]->submitted = $submitted; $participants[$userid]->requiregrading = $requiregrading; + $participants[$userid]->grantedextension = $grantedextension; if ($this->get_instance()->teamsubmission) { $group = $this->get_submission_group($userid); if ($group) { @@ -1759,11 +1770,12 @@ class assign { /** * Get the submission status/grading status for all submissions in this assignment. - * These statuses match the available filters (requiregrading, submitted, notsubmitted). + * These statuses match the available filters (requiregrading, submitted, notsubmitted, grantedextension). * If this is a group assignment, group info is also returned. * * @param int $currentgroup - * @return array List of user records with extra fields 'submitted', 'notsubmitted', 'requiregrading', 'groupid', 'groupname' + * @return array List of user records with extra fields 'submitted', 'notsubmitted', 'requiregrading', 'grantedextension', + * 'groupid', 'groupname' */ public function list_participants_with_filter_status_and_group($currentgroup) { $participants = $this->list_participants($currentgroup, false); diff --git a/mod/assign/templates/grading_navigation_user_selector.mustache b/mod/assign/templates/grading_navigation_user_selector.mustache index 888da9f875b..65d351951a6 100644 --- a/mod/assign/templates/grading_navigation_user_selector.mustache +++ b/mod/assign/templates/grading_navigation_user_selector.mustache @@ -50,6 +50,7 @@ + diff --git a/mod/assign/tests/externallib_test.php b/mod/assign/tests/externallib_test.php index 3860001bb85..38906920540 100644 --- a/mod/assign/tests/externallib_test.php +++ b/mod/assign/tests/externallib_test.php @@ -2228,6 +2228,7 @@ class mod_assign_external_testcase extends externallib_advanced_testcase { $this->assertFalse(fullname($student) == $result['fullname']); $this->assertFalse($result['submitted']); $this->assertFalse($result['requiregrading']); + $this->assertFalse($result['grantedextension']); $this->assertTrue($result['blindmarking']); // Make sure we don't get any additional info. $this->assertTrue(empty($result['user'])); @@ -2280,6 +2281,7 @@ class mod_assign_external_testcase extends externallib_advanced_testcase { $this->assertEquals(fullname($student), $result['fullname']); $this->assertTrue($result['submitted']); $this->assertTrue($result['requiregrading']); + $this->assertFalse($result['grantedextension']); $this->assertFalse($result['blindmarking']); // Make sure we don't get any additional info. $this->assertTrue(empty($result['user'])); diff --git a/mod/assign/tests/locallib_test.php b/mod/assign/tests/locallib_test.php index 8ec2f967dfc..de14bfcc712 100644 --- a/mod/assign/tests/locallib_test.php +++ b/mod/assign/tests/locallib_test.php @@ -799,6 +799,20 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { $this->assertEquals($student->id, $participant->id); $this->assertFalse($participant->submitted); $this->assertFalse($participant->requiregrading); + $this->assertFalse($participant->grantedextension); + } + + public function test_get_participant_granted_extension() { + $assign = $this->create_instance(array('grade' => 100)); + $student = $this->students[0]; + $this->setUser($this->editingteachers[0]); + $assign->save_user_extension($student->id, time()); + $participant = $assign->get_participant($student->id); + + $this->assertEquals($student->id, $participant->id); + $this->assertFalse($participant->submitted); + $this->assertFalse($participant->requiregrading); + $this->assertTrue($participant->grantedextension); } public function test_get_participant_with_ungraded_submission() { @@ -828,6 +842,7 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { $this->assertEquals($student->id, $participant->id); $this->assertTrue($participant->submitted); $this->assertTrue($participant->requiregrading); + $this->assertFalse($participant->grantedextension); } public function test_get_participant_with_graded_submission() { @@ -867,6 +882,7 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { $this->assertEquals($student->id, $participant->id); $this->assertTrue($participant->submitted); $this->assertFalse($participant->requiregrading); + $this->assertFalse($participant->grantedextension); } public function test_count_teams() { diff --git a/theme/boost/templates/mod_assign/grading_navigation_user_selector.mustache b/theme/boost/templates/mod_assign/grading_navigation_user_selector.mustache index 8906fa88fa2..ab809172534 100644 --- a/theme/boost/templates/mod_assign/grading_navigation_user_selector.mustache +++ b/theme/boost/templates/mod_assign/grading_navigation_user_selector.mustache @@ -49,6 +49,7 @@ +