Skip to content

Commit

Permalink
MDL-81612 assign: show current value when editing a student's extension
Browse files Browse the repository at this point in the history
Also, if there is not currently an extension set, the set extension form
will default to whatever is the latest out of the due date, the cut-off date
and midnight tonight (in the server time-zone).
  • Loading branch information
timhunt committed Sep 19, 2024
1 parent 506015c commit a95a257
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 49 deletions.
96 changes: 79 additions & 17 deletions mod/assign/extensionform.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,34 +53,66 @@ public function definition() {
$this->instance = $instance;

// Get the assignment class.
/** @var assign $assign */
$assign = $params['assign'];
$userlist = $params['userlist'];
$usercount = 0;
$usershtml = '';

// Load current extensions for all selected users.
[$usercondition, $params] = $DB->get_in_or_equal($userlist);
array_unshift($params, $assign->get_instance()->id);
$userinfo = $DB->get_records_sql("
SELECT u.*, auf.extensionduedate
FROM {user} u
LEFT JOIN {assign_user_flags} auf ON auf.userid = u.id AND auf.assignment = ?
WHERE u.id $usercondition
", $params);

// Prepare display of up to 5 users.
// TODO Does not support custom user profile fields (MDL-70456).
$extrauserfields = \core_user\fields::get_identity_fields($assign->get_context(), false);
$displayedusercount = 0;
$usershtml = '';
foreach ($userlist as $userid) {
if ($usercount >= 5) {
$displayedusercount += 1;
if ($displayedusercount > 5) {
$usershtml .= get_string('moreusers', 'assign', count($userlist) - 5);
break;
}
$user = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);

$usershtml .= $assign->get_renderer()->render(new assign_user_summary($user,
$assign->get_course()->id,
has_capability('moodle/site:viewfullnames',
$assign->get_course_context()),
$assign->is_blind_marking(),
$assign->get_uniqueid_for_user($user->id),
$extrauserfields,
!$assign->is_active_user($userid)));
$usercount += 1;

$user = $userinfo[$userid];
$usershtml .= $assign->get_renderer()->render(
new assign_user_summary($user,
$assign->get_course()->id,
has_capability('moodle/site:viewfullnames',
$assign->get_course_context()),
$assign->is_blind_marking(),
$assign->get_uniqueid_for_user($user->id),
$extrauserfields,
!$assign->is_active_user($userid)
),
);
}

$userscount = count($userlist);
// Find the range of extensions that currently exist for these users.
$earliestextension = null;
$lateststextension = 0;
$userswithoutanextension = 0;
foreach ($userlist as $userid) {
$user = $userinfo[$userid];

if ($user->extensionduedate) {
$lateststextension = max($lateststextension, $user->extensionduedate);
if ($earliestextension !== null) {
$earliestextension = min($earliestextension, $user->extensionduedate);
} else {
$earliestextension = $user->extensionduedate;
}
} else {
$userswithoutanextension += 1;
}
}

$listusersmessage = get_string('grantextensionforusers', 'assign', $userscount);
$listusersmessage = get_string('grantextensionforusers', 'assign', count($userlist));
$mform->addElement('header', 'general', $listusersmessage);
$mform->addElement('static', 'userslist', get_string('selectedusers', 'assign'), $usershtml);

Expand All @@ -98,9 +130,39 @@ public function definition() {
$mform->addElement('static', 'cutoffdate', get_string('cutoffdate', 'assign'), userdate($instance->cutoffdate));
$finaldate = $instance->cutoffdate;
}

if ($userswithoutanextension == count($userlist)) {
// All users don't have an extension yet.
$currentdatesdisplay = get_string('extensionduedatenone', 'assign');

} else {
if ($earliestextension == $lateststextension) {
$currentdatesdisplay = userdate($lateststextension);
} else {
$currentdatesdisplay = get_string('extensionduedaterange', 'assign', (object) [
'earliest' => userdate($earliestextension),
'latest' => userdate($lateststextension),
]);
}
if ($userswithoutanextension) {
$currentdatesdisplay .= '<br>' . get_string('extensionduedatewithout', 'assign', $userswithoutanextension);
}
}

$mform->addElement('static', 'currentextension', get_string('extensionduedatecurrent', 'assign'),
$currentdatesdisplay);

if ($lateststextension) {
// If there are existing extensions, edit based on the current (latest) value.
$defaultdate = $lateststextension;
} else {
// Otherwise take the later of the deadline and one minute before midnight tonight (server time).
$endoftoday = new DateTimeImmutable('today 23:59', core_date::get_server_timezone_object());
$defaultdate = max($finaldate, $endoftoday->getTimestamp());
}
$mform->addElement('date_time_selector', 'extensionduedate',
get_string('extensionduedate', 'assign'), array('optional'=>true));
$mform->setDefault('extensionduedate', $finaldate);
$mform->setDefault('extensionduedate', $defaultdate);

$mform->addElement('hidden', 'id');
$mform->setType('id', PARAM_INT);
Expand Down
4 changes: 4 additions & 0 deletions mod/assign/lang/en/assign.php
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,10 @@
$string['eventworkflowstateupdated'] = 'The state of the workflow has been updated.';
$string['expandreviewpanel'] = 'Expand review panel';
$string['extensionduedate'] = 'Extension due date';
$string['extensionduedatecurrent'] = 'Current extension due date';
$string['extensionduedatenone'] = 'None';
$string['extensionduedaterange'] = 'Various between {$a->earliest} and {$a->latest}';
$string['extensionduedatewithout'] = 'Users with no current extension: {$a}';
$string['extensionnotafterduedate'] = 'Extension date must be after the due date';
$string['extensionnotafterfromdate'] = 'Extension date must be after the allow submissions from date';
$string['fixrescalednullgrades'] = 'This assignment contains some erroneous grades. You can <a href="{$a->link}">automatically fix these grades</a>. This may affect course totals.';
Expand Down
79 changes: 47 additions & 32 deletions mod/assign/tests/behat/grant_extension.feature
Original file line number Diff line number Diff line change
Expand Up @@ -7,49 +7,62 @@ Feature: Grant an extension to an offline student
Background:
Given the following "courses" exist:
| fullname | shortname | category | groupmode |
| Course 1 | C1 | 0 | 1 |
| Course 1 | C1 | 0 | 1 |
And the following "users" exist:
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@example.com |
| student1 | Student | 1 | student1@example.com |
| student2 | Student | 2 | student2@example.com |
| student3 | Student | 3 | student3@example.com |
| student4 | Student | 4 | student4@example.com |
| student5 | Student | 5 | student5@example.com |
| student6 | Student | 6 | student6@example.com |
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@example.com |
| student1 | Student | 1 | student1@example.com |
| student2 | Student | 2 | student2@example.com |
| student3 | Student | 3 | student3@example.com |
| student4 | Student | 4 | student4@example.com |
| student5 | Student | 5 | student5@example.com |
| student6 | Student | 6 | student6@example.com |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | editingteacher |
| student1 | C1 | student |
| student2 | C1 | student |
| student3 | C1 | student |
| student4 | C1 | student |
| student5 | C1 | student |
| student6 | C1 | student |
| user | course | role |
| teacher1 | C1 | editingteacher |
| student1 | C1 | student |
| student2 | C1 | student |
| student3 | C1 | student |
| student4 | C1 | student |
| student5 | C1 | student |
| student6 | C1 | student |

@javascript
Scenario: Granting an extension to an offline assignment
Given the following "activities" exist:
| activity | course | name | intro | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled | duedate |
| assign | C1 | Test assignment name | Test assignment description | 0 | 0 | 1388534400 |
| activity | course | name | intro | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled | duedate |
| assign | C1 | Test assignment name | Test assignment description | 0 | 0 | ## 2014-01-01 ## |
And I am on the "Test assignment name" Activity page logged in as teacher1
When I navigate to "Submissions" in current page administration
And I open the action menu in "Student 1" "table_row"
And I follow "Grant extension"
And I should see "Student 1 ([email protected])"
And I set the field "Enable" to "1"
And I should see "Wednesday, 1 January 2014, 12:00 AM" in the "fitem_id_duedate" "region"
And I should see "Current extension due date" in the "fitem_id_currentextension" "region"
And I should see "None" in the "fitem_id_currentextension" "region"
And I set the field "Extension due date" to "## 2014-02-02 ##"
And I press "Save changes"
Then I should see "Extension granted until:" in the "Student 1" "table_row"
And I open the action menu in "Student 1" "table_row"
And I follow "Grant extension"
And I should see "Student 1 ([email protected])"
And I should see "Wednesday, 1 January 2014, 12:00 AM" in the "fitem_id_duedate" "region"
And I should see "Sunday, 2 February 2014, 12:00 AM" in the "fitem_id_currentextension" "region"
And the field "id_extensionduedate_day" matches value "2"
And the field "id_extensionduedate_month" matches value "February"
And I log out

And I am on the "Test assignment name" Activity page logged in as student1
And I should see "Extension due date"

@javascript @_alert
@javascript
Scenario: Granting extensions to an offline assignment (batch action)
Given the following "activities" exist:
| activity | course | name | intro | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled | duedate |
| assign | C1 | Test assignment name | Test assignment description | 0 | 0 | 1388534400 |
| activity | course | name | intro | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled | duedate |
| assign | C1 | Test assignment name | Test assignment description | 0 | 0 | ## 2014-01-01 ## |
And the following "mod_assign > extensions" exist:
| assign | user | extensionduedate |
| Test assignment name | student2 | ## 2014-02-02 ## |
| Test assignment name | student3 | ## 2014-03-03 ## |
And I am on the "Test assignment name" Activity page logged in as teacher1
When I navigate to "Submissions" in current page administration
And I set the field "selectall" to "1"
Expand All @@ -61,6 +74,9 @@ Feature: Grant an extension to an offline student
And I should see "Student 4 ([email protected])"
And I should see "Student 5 ([email protected])"
And I should see "1 more..."
And I should see "Wednesday, 1 January 2014, 12:00 AM" in the "fitem_id_duedate" "region"
And I should see "Various between Sunday, 2 February 2014, 12:00 AM and Monday, 3 March 2014, 12:00 AM" in the "fitem_id_currentextension" "region"
And I should see "Users with no current extension: 4" in the "fitem_id_currentextension" "region"
And I set the field "Enable" to "1"
And I press "Save changes"
Then I should see "Extension granted until:" in the "Student 1" "table_row"
Expand All @@ -70,15 +86,14 @@ Feature: Grant an extension to an offline student
And I should see "Extension granted until:" in the "Student 5" "table_row"
And I should see "Extension granted until:" in the "Student 6" "table_row"
And I log out

And I am on the "Test assignment name" Activity page logged in as student1
And I should see "Extension due date"

@javascript
Scenario: Validating that extension date is after due date
Given the following "activities" exist:
| activity | course | name | intro | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled | allowsubmissionsfromdate | duedate |
| assign | C1 | Test assignment name | Test assignment description | 0 | 0 | 1388534400 | 1388620800 |
| activity | course | name | intro | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled | allowsubmissionsfromdate | duedate |
| assign | C1 | Test assignment name | Test assignment description | 0 | 0 | ## 2034-01-01 ## | ## 2034-01-02 ## |
And I am on the "Test assignment name" Activity page logged in as teacher1
When I navigate to "Submissions" in current page administration
And I open the action menu in "Student 1" "table_row"
Expand All @@ -90,15 +105,15 @@ Feature: Grant an extension to an offline student
And I press "Save changes"
Then I should see "Extension date must be after the due date"
And I set the following fields to these values:
| extensionduedate[year] | 2013 |
| extensionduedate[year] | 2023 |
And I press "Save changes"
Then I should see "Extension date must be after the allow submissions from date"

@javascript @_alert
@javascript
Scenario: Granting extensions to an offline assignment (batch action)
Given the following "activities" exist:
| activity | course | name | intro | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled | allowsubmissionsfromdate | duedate |
| assign | C1 | Test assignment name | Test assignment description | 0 | 0 | 1388534400 | 1388620800 |
| activity | course | name | intro | assignsubmission_onlinetext_enabled | assignsubmission_file_enabled | allowsubmissionsfromdate | duedate |
| assign | C1 | Test assignment name | Test assignment description | 0 | 0 | ## 2034-01-01 ## | ## 2034-01-02 ## |
And I am on the "Test assignment name" Activity page logged in as teacher1
When I navigate to "Submissions" in current page administration
And I set the field "selectall" to "1"
Expand All @@ -116,6 +131,6 @@ Feature: Grant an extension to an offline student
And I press "Save changes"
Then I should see "Extension date must be after the due date"
And I set the following fields to these values:
| extensionduedate[year] | 2013 |
| extensionduedate[year] | 2023 |
And I press "Save changes"
Then I should see "Extension date must be after the allow submissions from date"

0 comments on commit a95a257

Please sign in to comment.