Merge branch 'MDL-59240-master' of git://github.com/jleyva/moodle

This commit is contained in:
Dan Poltawski
2017-07-25 07:31:34 +01:00
4 changed files with 214 additions and 1 deletions
+105
View File
@@ -27,6 +27,7 @@
defined('MOODLE_INTERNAL') || die;
require_once("$CFG->libdir/externallib.php");
require_once($CFG->dirroot . '/mod/workshop/locallib.php');
use mod_workshop\external\workshop_summary_exporter;
@@ -126,4 +127,108 @@ class mod_workshop_external extends external_api {
)
);
}
/**
* Utility function for validating a workshop.
*
* @param int $workshopid workshop instance id
* @return array array containing the workshop object, course, context and course module objects
* @since Moodle 3.4
*/
protected static function validate_workshop($workshopid) {
global $DB, $USER;
// Request and permission validation.
$workshop = $DB->get_record('workshop', array('id' => $workshopid), '*', MUST_EXIST);
list($course, $cm) = get_course_and_cm_from_instance($workshop, 'workshop');
$context = context_module::instance($cm->id);
self::validate_context($context);
$workshop = new workshop($workshop, $cm, $course);
return array($workshop, $course, $cm, $context);
}
/**
* Describes the parameters for get_workshop_access_information.
*
* @return external_external_function_parameters
* @since Moodle 3.4
*/
public static function get_workshop_access_information_parameters() {
return new external_function_parameters (
array(
'workshopid' => new external_value(PARAM_INT, 'Workshop instance id.')
)
);
}
/**
* Return access information for a given workshop.
*
* @param int $workshopid workshop instance id
* @return array of warnings and the access information
* @since Moodle 3.4
* @throws moodle_exception
*/
public static function get_workshop_access_information($workshopid) {
global $USER;
$params = self::validate_parameters(self::get_workshop_access_information_parameters(), array('workshopid' => $workshopid));
list($workshop, $course, $cm, $context) = self::validate_workshop($params['workshopid']);
$result = array();
// Return all the available capabilities.
$capabilities = load_capability_def('mod_workshop');
foreach ($capabilities as $capname => $capdata) {
// Get fields like cansubmit so it is consistent with the access_information function implemented in other modules.
$field = 'can' . str_replace('mod/workshop:', '', $capname);
$result[$field] = has_capability($capname, $context);
}
// Now, specific features access information.
$result['creatingsubmissionallowed'] = $workshop->creating_submission_allowed($USER->id);
$result['modifyingsubmissionallowed'] = $workshop->modifying_submission_allowed($USER->id);
$result['assessingallowed'] = $workshop->assessing_allowed($USER->id);
$result['assessingexamplesallowed'] = $workshop->assessing_examples_allowed();
if (is_null($result['assessingexamplesallowed'])) {
$result['assessingexamplesallowed'] = false;
}
$result['warnings'] = array();
return $result;
}
/**
* Describes the get_workshop_access_information return value.
*
* @return external_single_structure
* @since Moodle 3.4
*/
public static function get_workshop_access_information_returns() {
$structure = array(
'creatingsubmissionallowed' => new external_value(PARAM_BOOL,
'Is the given user allowed to create their submission?'),
'modifyingsubmissionallowed' => new external_value(PARAM_BOOL,
'Is the user allowed to modify his existing submission?'),
'assessingallowed' => new external_value(PARAM_BOOL,
'Is the user allowed to create/edit his assessments?'),
'assessingexamplesallowed' => new external_value(PARAM_BOOL,
'Are reviewers allowed to create/edit their assessments of the example submissions?.'),
'warnings' => new external_warnings()
);
$capabilities = load_capability_def('mod_workshop');
foreach ($capabilities as $capname => $capdata) {
// Get fields like cansubmit so it is consistent with the access_information function implemented in other modules.
$field = 'can' . str_replace('mod/workshop:', '', $capname);
$structure[$field] = new external_value(PARAM_BOOL, 'Whether the user has the capability ' . $capname . ' allowed.');
}
return new external_single_structure($structure);
}
}
+8
View File
@@ -37,4 +37,12 @@ $functions = array(
'capabilities' => 'mod/workshop:view',
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
),
'mod_workshop_get_workshop_access_information' => array(
'classname' => 'mod_workshop_external',
'methodname' => 'get_workshop_access_information',
'description' => 'Return access information for a given workshop.',
'type' => 'read',
'capabilities' => 'mod/workshop:view',
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
),
);
+100
View File
@@ -180,4 +180,104 @@ class mod_workshop_external_testcase extends externallib_advanced_testcase {
$this->assertEquals('1', $result['warnings'][0]['warningcode']);
$this->assertEquals($course2->id, $result['warnings'][0]['itemid']);
}
/**
* Test mod_workshop_get_workshop_access_information for students.
*/
public function test_mod_workshop_get_workshop_access_information_student() {
self::setUser($this->student);
$result = mod_workshop_external::get_workshop_access_information($this->workshop->id);
$result = external_api::clean_returnvalue(mod_workshop_external::get_workshop_access_information_returns(), $result);
// Check default values for capabilities.
$enabledcaps = array('canpeerassess', 'cansubmit', 'canview', 'canviewauthornames', 'canviewauthorpublished',
'canviewpublishedsubmissions', 'canexportsubmissions');
foreach ($result as $capname => $capvalue) {
if (strpos($capname, 'can') !== 0) {
continue;
}
if (in_array($capname, $enabledcaps)) {
$this->assertTrue($capvalue);
} else {
$this->assertFalse($capvalue);
}
}
// Now, unassign some capabilities.
unassign_capability('mod/workshop:peerassess', $this->studentrole->id);
unassign_capability('mod/workshop:submit', $this->studentrole->id);
unset($enabledcaps[0]);
unset($enabledcaps[1]);
accesslib_clear_all_caches_for_unit_testing();
$result = mod_workshop_external::get_workshop_access_information($this->workshop->id);
$result = external_api::clean_returnvalue(mod_workshop_external::get_workshop_access_information_returns(), $result);
foreach ($result as $capname => $capvalue) {
if (strpos($capname, 'can') !== 0) {
continue;
}
if (in_array($capname, $enabledcaps)) {
$this->assertTrue($capvalue);
} else {
$this->assertFalse($capvalue);
}
}
// Now, specific functionalities.
$this->assertFalse($result['creatingsubmissionallowed']);
$this->assertFalse($result['modifyingsubmissionallowed']);
$this->assertFalse($result['assessingallowed']);
$this->assertFalse($result['assessingexamplesallowed']);
// Switch phase.
$workshop = new workshop($this->workshop, $this->cm, $this->course);
$workshop->switch_phase(workshop::PHASE_SUBMISSION);
$result = mod_workshop_external::get_workshop_access_information($this->workshop->id);
$result = external_api::clean_returnvalue(mod_workshop_external::get_workshop_access_information_returns(), $result);
$this->assertTrue($result['creatingsubmissionallowed']);
$this->assertTrue($result['modifyingsubmissionallowed']);
$this->assertFalse($result['assessingallowed']);
$this->assertFalse($result['assessingexamplesallowed']);
// Switch to next (to assessment).
$workshop = new workshop($this->workshop, $this->cm, $this->course);
$workshop->switch_phase(workshop::PHASE_ASSESSMENT);
$result = mod_workshop_external::get_workshop_access_information($this->workshop->id);
$result = external_api::clean_returnvalue(mod_workshop_external::get_workshop_access_information_returns(), $result);
$this->assertFalse($result['creatingsubmissionallowed']);
$this->assertFalse($result['modifyingsubmissionallowed']);
$this->assertTrue($result['assessingallowed']);
$this->assertFalse($result['assessingexamplesallowed']);
}
/**
* Test mod_workshop_get_workshop_access_information for teachers.
*/
public function test_mod_workshop_get_workshop_access_information_teacher() {
self::setUser($this->teacher);
$result = mod_workshop_external::get_workshop_access_information($this->workshop->id);
$result = external_api::clean_returnvalue(mod_workshop_external::get_workshop_access_information_returns(), $result);
// Check default values.
$disabledcaps = array('canpeerassess', 'cansubmit');
foreach ($result as $capname => $capvalue) {
if (strpos($capname, 'can') !== 0) {
continue;
}
if (in_array($capname, $disabledcaps)) {
$this->assertFalse($capvalue);
} else {
$this->assertTrue($capvalue);
}
}
// Now, specific functionalities.
$this->assertFalse($result['creatingsubmissionallowed']);
$this->assertFalse($result['modifyingsubmissionallowed']);
$this->assertFalse($result['assessingallowed']);
$this->assertFalse($result['assessingexamplesallowed']);
}
}
+1 -1
View File
@@ -24,7 +24,7 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2017051501; // The current module version (YYYYMMDDXX)
$plugin->version = 2017051502; // The current module version (YYYYMMDDXX)
$plugin->requires = 2017050500; // Requires this Moodle version.
$plugin->component = 'mod_workshop';
$plugin->cron = 60; // Give as a chance every minute.