diff --git a/mod/workshop/classes/dates.php b/mod/workshop/classes/dates.php new file mode 100644 index 00000000000..b3ed3a6a6ed --- /dev/null +++ b/mod/workshop/classes/dates.php @@ -0,0 +1,87 @@ +. + +/** + * Contains the class for fetching the important dates in mod_workshop for a given module instance and a user. + * + * @package mod_workshop + * @copyright 2021 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +declare(strict_types=1); + +namespace mod_workshop; + +use core\activity_dates; + +/** + * Class for fetching the important dates in mod_workshop for a given module instance and a user. + * + * @copyright 2021 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class dates extends activity_dates { + + /** + * Returns a list of important dates in mod_workshop + * + * @return array + */ + protected function get_dates(): array { + $submissionstart = $this->cm->customdata['submissionstart'] ?? null; + $submissionend = $this->cm->customdata['submissionend'] ?? null; + $assessmentstart = $this->cm->customdata['assessmentstart'] ?? null; + $assessmentend = $this->cm->customdata['assessmentend'] ?? null; + + $now = time(); + $dates = []; + + if ($submissionstart) { + $openlabelid = $submissionstart > $now ? 'activitydate:submissionsopen' : 'activitydate:submissionsopened'; + $dates[] = [ + 'label' => get_string($openlabelid, 'mod_workshop'), + 'timestamp' => (int) $submissionstart, + ]; + } + + if ($submissionend) { + $closelabelid = $submissionend > $now ? 'activitydate:submissionsclose' : 'activitydate:submissionsclosed'; + $dates[] = [ + 'label' => get_string($closelabelid, 'mod_workshop'), + 'timestamp' => (int) $submissionend, + ]; + } + + if ($assessmentstart) { + $openlabelid = $assessmentstart > $now ? 'activitydate:assessmentsopen' : 'activitydate:assessmentsopened'; + $dates[] = [ + 'label' => get_string($openlabelid, 'mod_workshop'), + 'timestamp' => (int) $assessmentstart, + ]; + } + + if ($assessmentend) { + $closelabelid = $assessmentend > $now ? 'activitydate:assessmentsclose' : 'activitydate:assessmentsclosed'; + $dates[] = [ + 'label' => get_string($closelabelid, 'mod_workshop'), + 'timestamp' => (int) $assessmentend, + ]; + } + + return $dates; + } +} diff --git a/mod/workshop/lang/en/workshop.php b/mod/workshop/lang/en/workshop.php index b8a24182907..ffcc1374549 100644 --- a/mod/workshop/lang/en/workshop.php +++ b/mod/workshop/lang/en/workshop.php @@ -22,6 +22,14 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ +$string['activitydate:assessmentsclose'] = 'Assessments close:'; +$string['activitydate:assessmentsclosed'] = 'Assessments closed:'; +$string['activitydate:assessmentsopen'] = 'Assessments open:'; +$string['activitydate:assessmentsopened'] = 'Assessments opened:'; +$string['activitydate:submissionsclose'] = 'Submissions close:'; +$string['activitydate:submissionsclosed'] = 'Submissions closed:'; +$string['activitydate:submissionsopen'] = 'Submissions open:'; +$string['activitydate:submissionsopened'] = 'Submissions opened:'; $string['aggregategrades'] = 'Re-calculate grades'; $string['aggregation'] = 'Grades aggregation'; $string['allocate'] = 'Allocate submissions'; diff --git a/mod/workshop/tests/dates_test.php b/mod/workshop/tests/dates_test.php new file mode 100644 index 00000000000..bf733302439 --- /dev/null +++ b/mod/workshop/tests/dates_test.php @@ -0,0 +1,152 @@ +. + +/** + * Contains unit tests for mod_workshop\dates. + * + * @package mod_workshop + * @category test + * @copyright 2021 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +declare(strict_types=1); + +namespace mod_workshop; + +use advanced_testcase; +use cm_info; +use core\activity_dates; + +/** + * Class for unit testing mod_workshop\dates. + * + * @copyright 2021 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class dates_test extends advanced_testcase { + + /** + * Data provider for get_dates_for_module(). + * @return array[] + */ + public function get_dates_for_module_provider(): array { + $now = time(); + $before = $now - DAYSECS; + $earlier = $before - DAYSECS; + $earliest = $earlier - DAYSECS; + $after = $now + DAYSECS; + $later = $after + DAYSECS; + $latest = $later + DAYSECS; + + return [ + 'without any dates' => [ + null, null, null, null, [] + ], + 'only with start time for submissions' => [ + $after, null, null, null, [ + ['label' => 'Submissions open:', 'timestamp' => $after], + ] + ], + 'only with end time for submissions' => [ + null, $after, null, null, [ + ['label' => 'Submissions close:', 'timestamp' => $after], + ] + ], + 'only with start time for assessments' => [ + null, null, $after, null, [ + ['label' => 'Assessments open:', 'timestamp' => $after], + ] + ], + 'only with end time for assessments' => [ + null, null, null, $after, [ + ['label' => 'Assessments close:', 'timestamp' => $after], + ] + ], + 'all times in future' => [ + $after, $later, $latest, $latest + DAYSECS, [ + ['label' => 'Submissions open:', 'timestamp' => $after], + ['label' => 'Submissions close:', 'timestamp' => $later], + ['label' => 'Assessments open:', 'timestamp' => $latest], + ['label' => 'Assessments close:', 'timestamp' => $latest + DAYSECS], + ] + ], + 'all times in the past' => [ + $earliest - DAYSECS, $earliest, $earlier, $before, [ + ['label' => 'Submissions opened:', 'timestamp' => $earliest - DAYSECS], + ['label' => 'Submissions closed:', 'timestamp' => $earliest], + ['label' => 'Assessments opened:', 'timestamp' => $earlier], + ['label' => 'Assessments closed:', 'timestamp' => $before], + ] + ], + 'between submission and assessment' => [ + $earlier, $before, $after, $later, [ + ['label' => 'Submissions opened:', 'timestamp' => $earlier], + ['label' => 'Submissions closed:', 'timestamp' => $before], + ['label' => 'Assessments open:', 'timestamp' => $after], + ['label' => 'Assessments close:', 'timestamp' => $later], + ] + ], + ]; + } + + /** + * Test for get_dates_for_module(). + * + * @dataProvider get_dates_for_module_provider + * @param int|null $submissionstart The 'Open for submissions from' value of the workshop. + * @param int|null $submissionend The 'Submissions deadline' value of the workshop. + * @param int|null $assessmentstart The 'Open for assessment from' value of the workshop. + * @param int|null $assessmentend The 'Deadline for assessment' value of the workshop. + * @param array $expected The expected value of calling get_dates_for_module() + */ + public function test_get_dates_for_module(?int $submissionstart, ?int $submissionend, + ?int $assessmentstart, ?int $assessmentend, + array $expected) { + + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course(); + $user = $this->getDataGenerator()->create_user(); + $this->getDataGenerator()->enrol_user($user->id, $course->id); + + $data = ['course' => $course->id]; + if ($submissionstart) { + $data['submissionstart'] = $submissionstart; + } + if ($submissionend) { + $data['submissionend'] = $submissionend; + } + if ($assessmentstart) { + $data['assessmentstart'] = $assessmentstart; + } + if ($assessmentend) { + $data['assessmentend'] = $assessmentend; + } + $this->setAdminUser(); + $workshop = $this->getDataGenerator()->create_module('workshop', $data); + + $this->setUser($user); + + $cm = get_coursemodule_from_instance('workshop', $workshop->id); + // Make sure we're using a cm_info object. + $cm = cm_info::create($cm); + + $dates = activity_dates::get_dates_for_module($cm, (int) $user->id); + + $this->assertEquals($expected, $dates); + } +}