Merge branch 'MDL-60820-master-workshopsubmissiontypes' of git://github.com/mudrd8mz/moodle

This commit is contained in:
David Monllao 2018-09-04 13:07:00 +02:00
commit 6a98671916
21 changed files with 546 additions and 37 deletions

1
mod/workshop/amd/build/modform.min.js vendored Normal file
View File

@ -0,0 +1 @@
define(["jquery"],function(a){function b(a,b){a.available.prop("checked")||(a.required.prop("disabled",!0),a.required.prop("checked",!1),b.available.prop("checked")&&(b.required.prop("disabled",!0),b.required.prop("checked",!0),b.requiredHidden.val(1)))}function c(a){a.required.prop("disabled",!1),a.required.prop("checked",!1),a.requiredHidden.val(0)}function d(){b(e.file,e.text),b(e.text,e.file),e.text.available.prop("checked")&&e.file.available.prop("checked")&&(c(e.text),c(e.file))}var e={text:{available:null,required:null,requiredHidden:null},file:{available:null,required:null,requiredHidden:null}};return{init:function(){e.text.available=a("#id_submissiontypetextavailable"),e.text.required=a("#id_submissiontypetextrequired"),e.text.requiredHidden=a('input[name="submissiontypetextrequired"][type="hidden"]'),e.file.available=a("#id_submissiontypefileavailable"),e.file.required=a("#id_submissiontypefilerequired"),e.file.requiredHidden=a('input[name="submissiontypefilerequired"][type="hidden"]'),e.text.available.on("change",d),e.file.available.on("change",d),d()}}});

View File

@ -0,0 +1,99 @@
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Additional javascript for the Workshop module form.
*
* @module mod_workshop/modform
* @copyright The Open University 2018
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(['jquery'], function($) {
var submissionTypes = {
text: {
available: null,
required: null,
requiredHidden: null
},
file: {
available: null,
required: null,
requiredHidden: null
}
};
/**
* Determine whether one of the submission types has been marked as not available.
*
* If it has been marked not available, clear and disable its required checkbox. Then determine if the other submission
* type is available, and if it is, check and disable its required checkbox.
*
* @param {Object} checkUnavailable
* @param {Object} checkAvailable
*/
function checkAvailability(checkUnavailable, checkAvailable) {
if (!checkUnavailable.available.prop('checked')) {
checkUnavailable.required.prop('disabled', true);
checkUnavailable.required.prop('checked', false);
if (checkAvailable.available.prop('checked')) {
checkAvailable.required.prop('disabled', true);
checkAvailable.required.prop('checked', true);
// Also set the checkbox's hidden field to 1 so a 'required' value is submitted for the submission type.
checkAvailable.requiredHidden.val(1);
}
}
}
/**
* Enable the submission type's required checkbox and uncheck it.
*
* @param {Object} submissionType
*/
function enableRequired(submissionType) {
submissionType.required.prop('disabled', false);
submissionType.required.prop('checked', false);
submissionType.requiredHidden.val(0);
}
/**
* Check which submission types have been marked as available, and disable required checkboxes as necessary.
*/
function submissionTypeChanged() {
checkAvailability(submissionTypes.file, submissionTypes.text);
checkAvailability(submissionTypes.text, submissionTypes.file);
if (submissionTypes.text.available.prop('checked') && submissionTypes.file.available.prop('checked')) {
enableRequired(submissionTypes.text);
enableRequired(submissionTypes.file);
}
}
return /** @alias module:mod_workshop/modform */ {
/**
* Find all the required fields, set up event listeners, and set the initial state of required checkboxes.
*/
init: function() {
submissionTypes.text.available = $('#id_submissiontypetextavailable');
submissionTypes.text.required = $('#id_submissiontypetextrequired');
submissionTypes.text.requiredHidden = $('input[name="submissiontypetextrequired"][type="hidden"]');
submissionTypes.file.available = $('#id_submissiontypefileavailable');
submissionTypes.file.required = $('#id_submissiontypefilerequired');
submissionTypes.file.requiredHidden = $('input[name="submissiontypefilerequired"][type="hidden"]');
submissionTypes.text.available.on('change', submissionTypeChanged);
submissionTypes.file.available.on('change', submissionTypeChanged);
submissionTypeChanged();
}
};
});

View File

@ -369,7 +369,14 @@ function workshop_upgrade_transform_instance(stdClass $old) {
$new->name = $old->name;
$new->intro = $old->description;
$new->introformat = $old->format;
$new->nattachments = $old->nattachments;
if ($old->nattachments == 0) {
// Convert to the new method for disabling file submissions.
$new->submissiontypefile = WORKSHOP_SUBMISSION_TYPE_DISABLED;
$new->submissiontypetext = WORKSHOP_SUBMISSION_TYPE_REQUIRED;
$new->nattachments = 1;
} else {
$new->nattachments = $old->nattachments;
}
$new->maxbytes = $old->maxbytes;
$new->grade = $old->grade;
$new->gradinggrade = $old->gradinggrade;
@ -409,4 +416,4 @@ function workshop_upgrade_transform_instance(stdClass $old) {
}
return $new;
}
}

View File

@ -53,8 +53,8 @@ class backup_workshop_activity_structure_step extends backup_activity_structure_
'instructauthorsformat', 'instructreviewers',
'instructreviewersformat', 'timemodified', 'phase', 'useexamples',
'usepeerassessment', 'useselfassessment', 'grade', 'gradinggrade',
'strategy', 'evaluation', 'gradedecimals', 'nattachments', 'submissionfiletypes',
'latesubmissions', 'maxbytes', 'examplesmode', 'submissionstart',
'strategy', 'evaluation', 'gradedecimals', 'submissiontypetext', 'submissiontypefile', 'nattachments',
'submissionfiletypes', 'latesubmissions', 'maxbytes', 'examplesmode', 'submissionstart',
'submissionend', 'assessmentstart', 'assessmentend',
'conclusion', 'conclusionformat', 'overallfeedbackmode',
'overallfeedbackfiles', 'overallfeedbackfiletypes', 'overallfeedbackmaxbytes'));

View File

@ -111,6 +111,13 @@ class restore_workshop_activity_structure_step extends restore_activity_structur
$data->assessmentstart = $this->apply_date_offset($data->assessmentstart);
$data->assessmentend = $this->apply_date_offset($data->assessmentend);
if ($data->nattachments == 0) {
// Convert to the new method for disabling file submissions.
$data->submissiontypefile = WORKSHOP_SUBMISSION_TYPE_DISABLED;
$data->submissiontypetext = WORKSHOP_SUBMISSION_TYPE_REQUIRED;
$data->nattachments = 1;
}
// insert the workshop record
$newitemid = $DB->insert_record('workshop', $data);
// immediately after inserting "activity" record, call this

View File

@ -145,10 +145,24 @@ class workshop_summary_exporter extends exporter {
'description' => 'Number of digits that should be shown after the decimal point when displaying grades.',
'optional' => true,
),
'submissiontypetext' => array (
'type' => PARAM_INT,
'default' => 1,
'description' => 'Indicates whether text is required as part of each submission. ' .
'0 for no, 1 for optional, 2 for required.',
'optional' => true
),
'submissiontypefile' => array (
'type' => PARAM_INT,
'default' => 2,
'description' => 'Indicates whether a file upload is required as part of each submission. ' .
'0 for no, 1 for optional, 2 for required.',
'optional' => true
),
'nattachments' => array(
'type' => PARAM_INT,
'default' => 0,
'description' => 'Number of required submission attachments.',
'default' => 1,
'description' => 'Maximum number of submission attachments.',
'optional' => true,
),
'submissionfiletypes' => array(

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="mod/workshop/db" VERSION="20180427" COMMENT="XMLDB file for Moodle mod/workshop"
<XMLDB PATH="mod/workshop/db" VERSION="20180626" COMMENT="XMLDB file for Moodle mod/workshop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
>
@ -25,7 +25,9 @@
<FIELD NAME="strategy" TYPE="char" LENGTH="30" NOTNULL="true" SEQUENCE="false" COMMENT="The type of the current grading strategy used in this workshop"/>
<FIELD NAME="evaluation" TYPE="char" LENGTH="30" NOTNULL="true" SEQUENCE="false" COMMENT="The recently used grading evaluation method"/>
<FIELD NAME="gradedecimals" TYPE="int" LENGTH="3" NOTNULL="false" DEFAULT="0" SEQUENCE="false" COMMENT="Number of digits that should be shown after the decimal point when displaying grades"/>
<FIELD NAME="nattachments" TYPE="int" LENGTH="3" NOTNULL="false" DEFAULT="0" SEQUENCE="false" COMMENT="Number of required submission attachments"/>
<FIELD NAME="submissiontypetext" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="1" SEQUENCE="false" COMMENT="Can students enter text for their submissions? 0 for no, 1 for optional, 2 for required."/>
<FIELD NAME="submissiontypefile" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="1" SEQUENCE="false" COMMENT="Can students attach files for their submissions? 0 for no, 1 for optional, 2 for required."/>
<FIELD NAME="nattachments" TYPE="int" LENGTH="3" NOTNULL="false" DEFAULT="1" SEQUENCE="false" COMMENT="Maximum number of submission attachments"/>
<FIELD NAME="submissionfiletypes" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="comma separated list of file extensions"/>
<FIELD NAME="latesubmissions" TYPE="int" LENGTH="2" NOTNULL="false" DEFAULT="0" SEQUENCE="false" COMMENT="Allow submitting the work after the deadline"/>
<FIELD NAME="maxbytes" TYPE="int" LENGTH="10" NOTNULL="false" DEFAULT="100000" SEQUENCE="false" COMMENT="Maximum size of the one attached file"/>
@ -133,4 +135,4 @@
</KEYS>
</TABLE>
</TABLES>
</XMLDB>
</XMLDB>

View File

@ -68,5 +68,46 @@ function xmldb_workshop_upgrade($oldversion) {
// Automatically generated Moodle v3.5.0 release upgrade line.
// Put any upgrade step following this.
if ($oldversion < 2018062600) {
// Define field submissiontypetext to be added to workshop.
$table = new xmldb_table('workshop');
$field = new xmldb_field('submissiontypetext', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1', 'gradedecimals');
// Conditionally launch add field submissiontypetext.
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
$field = new xmldb_field('submissiontypefile', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '2',
'submissiontypetext');
// Conditionally launch add field submissiontypefile.
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// Convert existing workshops with attachments disabled to use the new settings.
$workshops = $DB->get_records('workshop', ['nattachments' => 0]);
foreach ($workshops as $workshop) {
$update = (object) [
'id' => $workshop->id,
'submissiontypefile' => 0,
'submissiontypetext' => 2,
'nattachments' => 1
];
$DB->update_record('workshop', $update);
}
// Changing the default of field nattachments on table workshop to 1.
$field = new xmldb_field('nattachments', XMLDB_TYPE_INTEGER, '3', null, null, null, '1', 'submissiontypefile');
// Launch change of default for field nattachments.
$dbman->change_field_default($table, $field);
// Workshop savepoint reached.
upgrade_mod_savepoint(true, 2018062600, 'workshop');
}
return true;
}

View File

@ -204,6 +204,7 @@ $string['mysubmission'] = 'My submission';
$string['nattachments'] = 'Maximum number of submission attachments';
$string['noexamples'] = 'No examples yet in this workshop';
$string['noexamplesformready'] = 'You must define the assessment form before providing example submissions';
$string['nosubmissiontype'] = 'At least one submission type must be available';
$string['nogradeyet'] = 'No grade yet';
$string['nosubmissionfound'] = 'No submission found for this user';
$string['nosubmissions'] = 'No submissions yet in this workshop';
@ -333,6 +334,12 @@ $string['submissionstart'] = 'Open for submissions from';
$string['submissionstartevent'] = '{$a} opens for submissions';
$string['submissionstartdatetime'] = 'Open for submissions from {$a->daydatetime} ({$a->distanceday})';
$string['submissiontitle'] = 'Title';
$string['submissiontypefileavailable'] = 'File attachment<span class="accesshide"> available</span>';
$string['submissiontypefilerequired'] = '<span class="accesshide">File attachment </span>Required';
$string['submissiontypetextavailable'] = 'Online text<span class="accesshide"> available</span>';
$string['submissiontypetextrequired'] = '<span class="accesshide">Online text </span>Required';
$string['submissiontypedisabled'] = 'This submission type is disabled for this workshop.';
$string['submissiontypes'] = 'Submission types';
$string['submissionsreport'] = 'Workshop submissions report';
$string['submittednotsubmitted'] = 'Submitted ({$a->submitted}) / not submitted ({$a->notsubmitted})';
$string['subplugintype_workshopallocation'] = 'Submissions allocation method';

View File

@ -34,6 +34,9 @@ define('WORKSHOP_EVENT_TYPE_SUBMISSION_OPEN', 'opensubmission');
define('WORKSHOP_EVENT_TYPE_SUBMISSION_CLOSE', 'closesubmission');
define('WORKSHOP_EVENT_TYPE_ASSESSMENT_OPEN', 'openassessment');
define('WORKSHOP_EVENT_TYPE_ASSESSMENT_CLOSE', 'closeassessment');
define('WORKSHOP_SUBMISSION_TYPE_DISABLED', 0);
define('WORKSHOP_SUBMISSION_TYPE_AVAILABLE', 1);
define('WORKSHOP_SUBMISSION_TYPE_REQUIRED', 2);
////////////////////////////////////////////////////////////////////////////////
// Moodle core API //

View File

@ -171,6 +171,12 @@ class workshop {
/** @var int maximum size of one file attached to the overall feedback */
public $overallfeedbackmaxbytes;
/** @var int Should the submission form show the text field? */
public $submissiontypetext;
/** @var int Should the submission form show the file attachment field? */
public $submissiontypefile;
/**
* @var workshop_strategy grading strategy instance
* Do not use directly, get the instance using {@link workshop::grading_strategy_instance()}
@ -2870,9 +2876,39 @@ class workshop {
$errors['title'] = get_string('err_multiplesubmissions', 'mod_workshop');
}
}
// Get the workshop record by id or cmid, depending on whether we're creating or editing a submission.
if (empty($data['workshopid'])) {
$workshop = $DB->get_record_select('workshop', 'id = (SELECT instance FROM {course_modules} WHERE id = ?)',
[$data['cmid']]);
} else {
$workshop = $DB->get_record('workshop', ['id' => $data['workshopid']]);
}
$getfiles = file_get_drafarea_files($data['attachment_filemanager']);
if (empty($getfiles->list) and html_is_blank($data['content_editor']['text'])) {
if (isset($data['attachment_filemanager'])) {
$getfiles = file_get_drafarea_files($data['attachment_filemanager']);
$attachments = $getfiles->list;
} else {
$attachments = array();
}
if ($workshop->submissiontypefile == WORKSHOP_SUBMISSION_TYPE_REQUIRED) {
if (empty($attachments)) {
$errors['attachment_filemanager'] = get_string('err_required', 'form');
}
} else if ($workshop->submissiontypefile == WORKSHOP_SUBMISSION_TYPE_DISABLED && !empty($data['attachment_filemanager'])) {
$errors['attachment_filemanager'] = get_string('submissiontypedisabled', 'mod_workshop');
}
if ($workshop->submissiontypetext == WORKSHOP_SUBMISSION_TYPE_REQUIRED && html_is_blank($data['content_editor']['text'])) {
$errors['content_editor'] = get_string('err_required', 'form');
} else if ($workshop->submissiontypetext == WORKSHOP_SUBMISSION_TYPE_DISABLED && !empty($data['content_editor']['text'])) {
$errors['content_editor'] = get_string('submissiontypedisabled', 'mod_workshop');
}
// If neither type is explicitly required, one or the other must be submitted.
if ($workshop->submissiontypetext != WORKSHOP_SUBMISSION_TYPE_REQUIRED
&& $workshop->submissiontypefile != WORKSHOP_SUBMISSION_TYPE_REQUIRED
&& empty($attachments) && html_is_blank($data['content_editor']['text'])) {
$errors['content_editor'] = get_string('submissionrequiredcontent', 'mod_workshop');
$errors['attachment_filemanager'] = get_string('submissionrequiredfile', 'mod_workshop');
}
@ -2939,8 +2975,10 @@ class workshop {
$params['objectid'] = $submission->id;
// Save and relink embedded images and save attachments.
$submission = file_postupdate_standard_editor($submission, 'content', $this->submission_content_options(),
$this->context, 'mod_workshop', 'submission_content', $submission->id);
if ($this->submissiontypetext != WORKSHOP_SUBMISSION_TYPE_DISABLED) {
$submission = file_postupdate_standard_editor($submission, 'content', $this->submission_content_options(),
$this->context, 'mod_workshop', 'submission_content', $submission->id);
}
$submission = file_postupdate_standard_filemanager($submission, 'attachment', $this->submission_attachment_options(),
$this->context, 'mod_workshop', 'submission_attachment', $submission->id);

View File

@ -54,7 +54,7 @@ class mod_workshop_mod_form extends moodleform_mod {
* @return void
*/
public function definition() {
global $CFG;
global $CFG, $PAGE;
$workshopconfig = get_config('workshop');
$mform = $this->_form;
@ -129,23 +129,39 @@ class mod_workshop_mod_form extends moodleform_mod {
$mform->addElement('editor', 'instructauthorseditor', $label, null,
workshop::instruction_editors_options($this->context));
$typeelements = [];
foreach (['submissiontypetext', 'submissiontypefile'] as $type) {
$available = $type . 'available';
$required = $type . 'required';
$availablelabel = get_string($available, 'workshop');
$requiredlabel = get_string($required, 'workshop');
$typeelements[] = $mform->createElement('advcheckbox', $available, '', $availablelabel);
$typeelements[] = $mform->createElement('advcheckbox', $required, '', $requiredlabel);
$mform->setDefault($available, 1);
}
// We can't use <br> as the separator as it does not work well in this case with the Boost theme.
// Instead, separate both tuples with a full-width empty div.
$mform->addGroup($typeelements, 'submissiontypes', get_string('submissiontypes', 'workshop'),
array(' ', '<div style="width:100%"></div>'), false);
$options = array();
for ($i = 7; $i >= 0; $i--) {
for ($i = 7; $i >= 1; $i--) {
$options[$i] = $i;
}
$label = get_string('nattachments', 'workshop');
$mform->addElement('select', 'nattachments', $label, $options);
$mform->setDefault('nattachments', 1);
$mform->disabledIf('nattachments', 'submissiontypefileavailable');
$label = get_string('allowedfiletypesforsubmission', 'workshop');
$mform->addElement('filetypes', 'submissionfiletypes', $label);
$mform->addHelpButton('submissionfiletypes', 'allowedfiletypesforsubmission', 'workshop');
$mform->disabledIf('submissionfiletypes', 'nattachments', 'eq', 0);
$mform->disabledIf('submissionfiletypes', 'submissiontypefileavailable');
$options = get_max_upload_sizes($CFG->maxbytes, $this->course->maxbytes, 0, $workshopconfig->maxbytes);
$mform->addElement('select', 'maxbytes', get_string('maxbytes', 'workshop'), $options);
$mform->setDefault('maxbytes', $workshopconfig->maxbytes);
$mform->disabledIf('maxbytes', 'nattachments', 'eq', 0);
$mform->disabledIf('maxbytes', 'submissiontypefileavailable');
$label = get_string('latesubmissions', 'workshop');
$text = get_string('latesubmissions_desc', 'workshop');
@ -243,6 +259,8 @@ class mod_workshop_mod_form extends moodleform_mod {
// Standard buttons, common to all modules ------------------------------------
$this->add_action_buttons();
$PAGE->requires->js_call_amd('mod_workshop/modform', 'init');
}
/**
@ -280,6 +298,16 @@ class mod_workshop_mod_form extends moodleform_mod {
$data['conclusion']);
$data['conclusioneditor']['format'] = $data['conclusionformat'];
$data['conclusioneditor']['itemid'] = $draftitemid;
// Set submission type checkboxes.
foreach (['submissiontypetext', 'submissiontypefile'] as $type) {
$data[$type . 'available'] = 1;
$data[$type . 'required'] = 0;
if ($data[$type] == WORKSHOP_SUBMISSION_TYPE_DISABLED) {
$data[$type . 'available'] = 0;
} else if ($data[$type] == WORKSHOP_SUBMISSION_TYPE_REQUIRED) {
$data[$type . 'required'] = 1;
}
}
} else {
// adding a new workshop instance
$draftitemid = file_get_submitted_draft_itemid('instructauthors');
@ -296,6 +324,30 @@ class mod_workshop_mod_form extends moodleform_mod {
}
}
/**
* Combine submission type checkboxes into integer values for the database.
*
* @param stdClass $data The submitted form data.
*/
public function data_postprocessing($data) {
parent::data_postprocessing($data);
foreach (['text', 'file'] as $type) {
$field = 'submissiontype' . $type;
$available = $field . 'available';
$required = $field . 'required';
if ($data->$required) {
$data->$field = WORKSHOP_SUBMISSION_TYPE_REQUIRED;
} else if ($data->$available) {
$data->$field = WORKSHOP_SUBMISSION_TYPE_AVAILABLE;
} else {
$data->$field = WORKSHOP_SUBMISSION_TYPE_DISABLED;
}
unset($data->$available);
unset($data->$required);
}
}
/**
* Set the grade item categories when editing an instance
*/
@ -341,6 +393,13 @@ class mod_workshop_mod_form extends moodleform_mod {
}
}
}
$typevalues = $mform->getElementValue('submissiontypes');
foreach (['submissiontypetext', 'submissiontypefile'] as $type) {
// Don't leave a disabled "required" checkbox checked.
if (!$typevalues[$type . 'available']) {
$mform->setDefault($type . 'required', 0);
}
}
parent::definition_after_data();
}
@ -404,6 +463,11 @@ class mod_workshop_mod_form extends moodleform_mod {
}
}
if (!$data['submissiontypetextavailable'] && !$data['submissiontypefileavailable']) {
// One submission type must be available.
$errors['submissiontypes'] = get_string('nosubmissiontype', 'workshop');
}
return $errors;
}
}

View File

@ -44,13 +44,21 @@ class workshop_submission_form extends moodleform {
$mform->addRule('title', null, 'required', null, 'client');
$mform->addRule('title', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
$mform->addElement('editor', 'content_editor', get_string('submissioncontent', 'workshop'), null, $contentopts);
$mform->setType('content', PARAM_RAW);
if ($workshop->submissiontypetext != WORKSHOP_SUBMISSION_TYPE_DISABLED) {
$mform->addElement('editor', 'content_editor', get_string('submissioncontent', 'workshop'), null, $contentopts);
$mform->setType('content_editor', PARAM_RAW);
if ($workshop->submissiontypetext == WORKSHOP_SUBMISSION_TYPE_REQUIRED) {
$mform->addRule('content_editor', null, 'required', null, 'client');
}
}
if ($workshop->nattachments > 0) {
if ($workshop->submissiontypefile != WORKSHOP_SUBMISSION_TYPE_DISABLED) {
$mform->addElement('static', 'filemanagerinfo', get_string('nattachments', 'workshop'), $workshop->nattachments);
$mform->addElement('filemanager', 'attachment_filemanager', get_string('submissionattachment', 'workshop'),
null, $attachmentopts);
if ($workshop->submissiontypefile == WORKSHOP_SUBMISSION_TYPE_REQUIRED) {
$mform->addRule('attachment_filemanager', null, 'required', null, 'client');
}
}
$mform->addElement('hidden', 'id', $current->id);

View File

@ -21,8 +21,8 @@ Feature: Workshop submission removal
| student3 | c1 | student |
| teacher1 | c1 | editingteacher |
And the following "activities" exist:
| activity | name | intro | course | idnumber |
| workshop | TestWorkshop | Test workshop description | c1 | workshop1 |
| activity | name | intro | course | idnumber | submissiontypefile |
| workshop | TestWorkshop | Test workshop description | c1 | workshop1 | 1 |
# Teacher sets up assessment form and changes the phase to submission.
And I log in as "teacher1"
And I am on "Course1" course homepage

View File

@ -19,8 +19,8 @@ Feature: Exporting workshop submissions and assessments to a portfolio
| student2 | c1 | student |
| teacher1 | c1 | editingteacher |
And the following "activities" exist:
| activity | name | intro | course | idnumber |
| workshop | TestWorkshop | Test workshop description | c1 | workshop1 |
| activity | name | intro | course | idnumber | submissiontypefile |
| workshop | TestWorkshop | Test workshop description | c1 | workshop1 | 1 |
# Admin needs to enable portfolio API and set a portfolio instance first.
And I log in as "admin"
And the following config values are set as admin:

View File

@ -19,8 +19,8 @@ Feature: File types of the submission and feedback attachments can be limitted
| student1 | c1 | student |
| student2 | c1 | student |
And the following "activities" exist:
| activity | name | intro | course | idnumber |
| workshop | TestWorkshop | Test workshop description | c1 | workshop1 |
| activity | name | intro | course | idnumber | submissiontypetext | submissiontypefile |
| workshop | TestWorkshop | Test workshop description | c1 | workshop1 | 2 | 1 |
@_file_upload @javascript
Scenario: Student submission attachments obey the list of allowed file types

View File

@ -0,0 +1,198 @@
@mod @mod_workshop
Feature: Submission types
In order to Submit the correct type of materials
As a student
I want have a clear indication of which fields are accepted and required on the submission form
Background:
Given the following "courses" exist:
| fullname | shortname |
| Test | TEST |
And I log in as "admin"
@javascript
Scenario: Test workshop settings validation
Given I am on "Test" course homepage with editing mode on
And I add a "Workshop" to section "0"
When I set the following fields to these values:
| Workshop name | Test workshop |
| submissiontypetextavailable | 0 |
| submissiontypefileavailable | 0 |
And I press "Save and display"
Then I should see "At least one submission type must be available"
When I set the following fields to these values:
| submissiontypetextavailable | 1 |
Then the "submissiontypetextrequired" "field" should be disabled
Then the "submissiontypefilerequired" "field" should be disabled
And the field "submissiontypetextrequired" matches value "1"
And the field "submissiontypefilerequired" matches value "0"
When I set the following fields to these values:
| submissiontypetextavailable | 0 |
| submissiontypefileavailable | 1 |
Then the "submissiontypetextrequired" "field" should be disabled
Then the "submissiontypefilerequired" "field" should be disabled
And the field "submissiontypetextrequired" matches value "0"
And the field "submissiontypefilerequired" matches value "1"
When I set the following fields to these values:
| submissiontypetextavailable | 1 |
| submissiontypetextrequired | 1 |
| submissiontypefileavailable | 1 |
| submissiontypefilerequired | 1 |
And I press "Save and display"
Then I should see "Setup phase" in the "h3#mod_workshop-userplanheading" "css_element"
When I navigate to "Edit settings" in current page administration
And I set the following fields to these values:
| submissiontypetextrequired | 0 |
And I press "Save and display"
Then I should see "Setup phase" in the "h3#mod_workshop-userplanheading" "css_element"
When I navigate to "Edit settings" in current page administration
And I set the following fields to these values:
| submissiontypetextrequired | 1 |
| submissiontypefilerequired | 0 |
And I press "Save and display"
Then I should see "Setup phase" in the "h3#mod_workshop-userplanheading" "css_element"
When I navigate to "Edit settings" in current page administration
And I set the following fields to these values:
| submissiontypefileavailable | 0 |
And I press "Save and display"
Then I should see "Setup phase" in the "h3#mod_workshop-userplanheading" "css_element"
When I navigate to "Edit settings" in current page administration
And I set the following fields to these values:
| submissiontypefileavailable | 1 |
| submissiontypefilerequired | 1 |
| submissiontypetextavailable | 0 |
And I press "Save and display"
Then I should see "Setup phase" in the "h3#mod_workshop-userplanheading" "css_element"
@javascript @_file_upload
Scenario: All submission fields required
Given the following "activities" exist:
| activity | name | intro | course | idnumber | submissiontypetext | submissiontypefile |
| workshop | All required | Test workshop description | TEST | workshop1 | 2 | 2 |
And I am on "Test" course homepage
And I follow "All required"
And I follow "Switch to the submission phase"
And I press "Continue"
And I press "Start preparing your submission"
And I set the field "Title" to "Test submission"
When I press "Save changes"
Then I should see "You must supply a value here." in the "Submission content" "form_row"
And I set the field "Submission content" to "Lorem ipsum dolor"
And I press "Save changes"
And I should see "You must supply a value here." in the "Attachment" "form_row"
And I set the following fields to these values:
| Attachment | mod/workshop/tests/fixtures/moodlelogo.png |
And I press "Save changes"
And I should not see "You must supply a value here."
And I should see "My submission"
And "Edit submission" "button" should exist
Scenario: Online text required, file attachment optional
Given the following "activities" exist:
| activity | name | intro | course | idnumber | submissiontypetext | submissiontypefile |
| workshop | Optional file | Test workshop description | TEST | workshop1 | 2 | 1 |
And I am on "Test" course homepage
And I follow "Optional file"
And I follow "Switch to the submission phase"
And I press "Continue"
And I press "Start preparing your submission"
And I set the field "Title" to "Test submission"
When I press "Save changes"
Then I should see "You must supply a value here." in the "Submission content" "form_row"
And I set the following fields to these values:
| Submission content | Lorem ipsum dolor |
And I press "Save changes"
And I should not see "You must supply a value here."
And I should see "My submission"
And "Edit submission" "button" should exist
@javascript @_file_upload
Scenario: Online text optional, file attachment required
Given the following "activities" exist:
| activity | name | intro | course | idnumber | submissiontypetext | submissiontypefile |
| workshop | Optional text | Test workshop description | TEST | workshop1 | 1 | 2 |
And I am on "Test" course homepage
And I follow "Optional text"
And I follow "Switch to the submission phase"
And I press "Continue"
And I press "Start preparing your submission"
And I set the field "Title" to "Test submission"
When I press "Save changes"
Then I should see "You must supply a value here." in the "Attachment" "form_row"
And I set the following fields to these values:
| Attachment | mod/workshop/tests/fixtures/moodlelogo.png |
And I press "Save changes"
And I should not see "You must supply a value here."
And I should see "My submission"
And "Edit submission" "button" should exist
Scenario: Online text only
Given the following "activities" exist:
| activity | name | intro | course | idnumber | submissiontypetext | submissiontypefile |
| workshop | Only text | Test workshop description | TEST | workshop1 | 2 | 0 |
And I am on "Test" course homepage
And I follow "Only text"
And I follow "Switch to the submission phase"
And I press "Continue"
When I press "Start preparing your submission"
Then "Attachment" "field" should not exist
And I set the field "Title" to "Test submission"
And I press "Save changes"
And I should see "You must supply a value here." in the "Submission content" "form_row"
And I set the following fields to these values:
| Submission content | Lorem ipsum dolor |
And I press "Save changes"
And I should not see "You must supply a value here."
And I should see "My submission"
And "Edit submission" "button" should exist
@javascript @_file_upload
Scenario: File attachment only
Given the following "activities" exist:
| activity | name | intro | course | idnumber | submissiontypetext | submissiontypefile |
| workshop | Only file | Test workshop description | TEST | workshop1 | 0 | 2 |
And I am on "Test" course homepage
And I follow "Only file"
And I follow "Switch to the submission phase"
And I press "Continue"
When I press "Start preparing your submission"
Then "Submission content" "field" should not exist
And I set the field "Title" to "Test submission"
And I press "Save changes"
And I should see "You must supply a value here." in the "Attachment" "form_row"
And "Submission content" "form_row" should not exist
And I set the following fields to these values:
| Attachment | mod/workshop/tests/fixtures/moodlelogo.png |
And I press "Save changes"
And I should not see "You must supply a value here."
And I should see "My submission"
And "Edit submission" "button" should exist
@javascript @_file_upload
Scenario: Neither submission type explicitly required
Given the following "activities" exist:
| activity | name | intro | course | idnumber |
| workshop | Neither required | Test workshop description | TEST | workshop1 |
And I am on "Test" course homepage
And I follow "Neither required"
And I follow "Switch to the submission phase"
And I press "Continue"
And I press "Start preparing your submission"
And I set the field "Title" to "Test submission"
When I press "Save changes"
Then I should see "You need to add a file or enter some text." in the "Attachment" "form_row"
And I should see "You need to enter some text or add a file." in the "Submission content" "form_row"
And I set the following fields to these values:
| Submission content | Lorem ipsum dolor |
And I press "Save changes"
And I should not see "You need to add a file or enter some text."
And I should not see "You need to enter some text or add a file."
And I should see "My submission"
And "Edit submission" "button" should exist
And I press "Edit submission"
And I set the following fields to these values:
| Submission content | |
| Attachment | mod/workshop/tests/fixtures/moodlelogo.png |
And I press "Save changes"
And I should not see "You need to add a file or enter some text."
And I should not see "You need to enter some text or add a file."

View File

@ -23,8 +23,8 @@ Feature: Workshop submission and assessment
| student4 | c1 | student |
| teacher1 | c1 | editingteacher |
And the following "activities" exist:
| activity | name | intro | course | idnumber |
| workshop | TestWorkshop | Test workshop description | c1 | workshop1 |
| activity | name | intro | course | idnumber | submissiontypetext | submissiontypefile |
| workshop | TestWorkshop | Test workshop description | c1 | workshop1 | 2 | 1 |
# teacher1 sets up assessment form and changes the phase to submission
When I log in as "teacher1"
And I am on "Course1" course homepage

View File

@ -162,6 +162,8 @@ class mod_workshop_external_testcase extends externallib_advanced_testcase {
$workshop1->instructreviewersformat = 1;
$workshop1->conclusionfiles = [];
$workshop1->conclusionformat = 1;
$workshop1->submissiontypetext = 1;
$workshop1->submissiontypefile = 1;
$workshop2->coursemodule = $workshop2->cmid;
$workshop2->introformat = 1;
@ -172,6 +174,8 @@ class mod_workshop_external_testcase extends externallib_advanced_testcase {
$workshop2->instructreviewersformat = 1;
$workshop2->conclusionfiles = [];
$workshop2->conclusionformat = 1;
$workshop2->submissiontypetext = 1;
$workshop2->submissiontypefile = 1;
foreach ($expectedfields as $field) {
if (!empty($properties[$field]) && $properties[$field]['type'] == PARAM_BOOL) {
@ -551,24 +555,35 @@ class mod_workshop_external_testcase extends externallib_advanced_testcase {
public function test_add_submission_already_added() {
$this->setUser($this->student);
$usercontext = context_user::instance($this->student->id);
$fs = get_file_storage();
$draftidattach = file_get_unused_draft_itemid();
$filerecordattach = [
'contextid' => $usercontext->id,
'component' => 'user',
'filearea' => 'draft',
'itemid' => $draftidattach,
'filepath' => '/',
'filename' => 'attachement.txt'
];
$fs->create_file_from_string($filerecordattach, 'simple text attachment');
// Switch to submission phase.
$workshop = new workshop($this->workshop, $this->cm, $this->course);
$workshop->switch_phase(workshop::PHASE_SUBMISSION);
// Create the submission.
$result = mod_workshop_external::add_submission($this->workshop->id, 'My submission');
$result = mod_workshop_external::add_submission($this->workshop->id, 'My submission', '', FORMAT_MOODLE, 0, $draftidattach);
$result = external_api::clean_returnvalue(mod_workshop_external::add_submission_returns(), $result);
// Try to create it again.
$result = mod_workshop_external::add_submission($this->workshop->id, 'My submission');
$result = mod_workshop_external::add_submission($this->workshop->id, 'My submission', '', FORMAT_MOODLE, 0, $draftidattach);
$result = external_api::clean_returnvalue(mod_workshop_external::add_submission_returns(), $result);
$this->assertFalse($result['status']);
$this->assertArrayNotHasKey('submissionid', $result);
$this->assertCount(2, $result['warnings']);
$this->assertCount(1, $result['warnings']);
$this->assertEquals('fielderror', $result['warnings'][0]['warningcode']);
$this->assertEquals('content_editor', $result['warnings'][0]['item']);
$this->assertEquals('fielderror', $result['warnings'][1]['warningcode']);
$this->assertEquals('attachment_filemanager', $result['warnings'][1]['item']);
$this->assertEquals('title', $result['warnings'][0]['item']);
}
/**
@ -587,7 +602,7 @@ class mod_workshop_external_testcase extends externallib_advanced_testcase {
// Create a file in a draft area for inline attachments.
$fs = get_file_storage();
$draftidinlineattach = file_get_unused_draft_itemid();
$usercontext = context_user::instance($this->student->id);
$usercontext = context_user::instance($user->id);
$filenameimg = 'shouldbeanimage.txt';
$filerecordinline = array(
'contextid' => $usercontext->id,
@ -832,7 +847,7 @@ class mod_workshop_external_testcase extends externallib_advanced_testcase {
// Create a couple of submissions with files.
$firstsubmissionid = $this->create_test_submission($this->student); // Create submission with files.
$secondsubmissionid = $this->create_test_submission($this->anotherstudentg1->id);
$secondsubmissionid = $this->create_test_submission($this->anotherstudentg1);
$this->setUser($this->student);
$result = mod_workshop_external::get_submissions($this->workshop->id);

View File

@ -1,6 +1,11 @@
This files describes API changes in /mod/workshop - activity modules,
information provided here is intended especially for developers.
=== 3.6 ===
* The external function get_workshops_by_courses now returns 2 additional fields: submissiontypetext and
submissiontypefile, indicating which submission types are available and required.
=== 3.4 ===
* workshop_strategy::get_dimensions_info now returns also the scale items (if scales are being used).

View File

@ -24,7 +24,7 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2018051400; // The current module version (YYYYMMDDXX)
$plugin->version = 2018062600; // The current module version (YYYYMMDDXX)
$plugin->requires = 2018050800; // Requires this Moodle version.
$plugin->component = 'mod_workshop';
$plugin->cron = 60; // Give as a chance every minute.