$string['enabled'] = 'Feedback comments';
$string['enabled_help'] = 'If enabled, the marker can leave feedback comments for each submission. ';
$string['pluginname'] = 'Feedback comments';
+$string['commentinline'] = 'Comment inline';
+$string['commentinline_help'] = 'If enabled, the submission text will be copied into the feedback comment field during grading, making it easier to comment inline (using a different colour, perhaps) or to edit the original text.';
+$string['commentinlinedefault'] = 'Comment inline by default';
+$string['commentinlinedefault_help'] = 'If set, this comment inline functionality will be enabled by default for all new assignments.';
}
}
+ /**
+ * Save the settings for feedback comments plugin
+ *
+ * @param stdClass $data
+ * @return bool
+ */
+ public function save_settings(stdClass $data) {
+ $this->set_config('commentinline', !empty($data->assignfeedback_comments_commentinline));
+ return true;
+ }
+
+ /**
+ * Get the default setting for feedback comments plugin
+ *
+ * @param MoodleQuickForm $mform The form to add elements to
+ * @return void
+ */
+ public function get_settings(MoodleQuickForm $mform) {
+ $default = get_config('assignfeedback_comments', 'inline');
+ $mform->addElement('selectyesno',
+ 'assignfeedback_comments_commentinline',
+ get_string('commentinline', 'assignfeedback_comments'));
+ $mform->addHelpButton('assignfeedback_comments_commentinline', 'commentinline', 'assignfeedback_comments');
+ $mform->setDefault('assignfeedback_comments_commentinline', $default);
+ // Disable comment online if comment feedback plugin is disabled.
+ $mform->disabledIf('assignfeedback_comments_commentinline', 'assignfeedback_comments_enabled', 'notchecked');
+ }
+
+ /**
+ * A student submission may contain image tags that refer to images stored
+ * in the file area for the submission. We cannot allow these links to be copied to
+ * the feedback text fields, so we must strip them from the content.
+ *
+ * @param string $source The submission text
+ * @return string The stripped text
+ */
+ protected function strip_moodle_content($source) {
+ $baseurl = '@@PLUGINFILE@@';
+ // Looking for something like < .* "@@pluginfile@@.*" .* >
+ $pattern = '$<[^<>]+["\']' . $baseurl . '[^"\']*["\'][^<>]*>$';
+ $stripped = preg_replace($pattern, '', $source);
+ // Use purify html to rebalence potentially mismatched tags and generally cleanup.
+ return purify_html($stripped);
+ }
+
+ /**
+ * Convert the text from any submission plugin that has an editor field to
+ * a format suitable for inserting in the feedback text field.
+ *
+ * @param stdClass $submission
+ * @param stdClass $data - Form data to be filled with the converted submission text and format.
+ * @return boolean - True if feedback text was set.
+ */
+ protected function convert_submission_text_to_feedback($submission, $data) {
+ $format = false;
+ $text = '';
+
+ foreach ($this->assignment->get_submission_plugins() as $plugin) {
+ $fields = $plugin->get_editor_fields();
+ if ($plugin->is_enabled() && $plugin->is_visible() && !empty($fields)) {
+ foreach ($fields as $key => $description) {
+ $rawtext = $this->strip_moodle_content($plugin->get_editor_text($key, $submission->id));
+
+ $newformat = $plugin->get_editor_format($key, $submission->id);
+
+ if ($format !== false && $newformat != $format) {
+ // There are 2 or more editor fields using different formats, set to plain as a fallback.
+ $format = FORMAT_PLAIN;
+ } else {
+ $format = $newformat;
+ }
+ $text .= $rawtext;
+ }
+ }
+ }
+
+ $data->assignfeedbackcomments_editor['text'] = $text;
+ $data->assignfeedbackcomments_editor['format'] = $format;
+ return true;
+ }
+
/**
* Get form elements for the grading page
*
* @param stdClass $data
* @return bool true if elements were added to the form
*/
- public function get_form_elements($grade, MoodleQuickForm $mform, stdClass $data) {
+ public function get_form_elements_for_user($grade, MoodleQuickForm $mform, stdClass $data, $userid) {
+ $commentinlinenabled = $this->get_config('commentinline');
+ $submission = $this->assignment->get_user_submission($userid, false);
+ $feedbackcomments = false;
+
if ($grade) {
$feedbackcomments = $this->get_feedback_comments($grade->id);
- if ($feedbackcomments) {
- $data->assignfeedbackcomments_editor['text'] = $feedbackcomments->commenttext;
- $data->assignfeedbackcomments_editor['format'] = $feedbackcomments->commentformat;
+ }
+
+ if ($feedbackcomments && !empty($feedbackcomments->commenttext)) {
+ $data->assignfeedbackcomments_editor['text'] = $feedbackcomments->commenttext;
+ $data->assignfeedbackcomments_editor['format'] = $feedbackcomments->commentformat;
+ } else {
+ // No feedback given yet - maybe we need to copy the text from the submission?
+ if (!empty($commentinlinenabled) && $submission) {
+ $this->convert_submission_text_to_feedback($submission, $data);
}
}
* @return bool was it a success? (false will trigger a rollback)
*/
public function upgrade_settings(context $oldcontext, stdClass $oldassignment, & $log) {
+ if ($oldassignment->assignmenttype == 'online') {
+ $this->set_config('commentinline', $oldassignment->var1);
+ return true;
+ }
return true;
}
new lang_string('default', 'assignfeedback_comments'),
new lang_string('default_help', 'assignfeedback_comments'), 1));
+$setting = new admin_setting_configcheckbox('assignfeedback_comments/inline',
+ new lang_string('commentinlinedefault', 'assignfeedback_comments'),
+ new lang_string('commentinlinedefault_help', 'assignfeedback_comments'), 0);
+
+$setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false);
+$setting->set_locked_flag_options(admin_setting_flag::ENABLED, false);
+
+$settings->add($setting);
defined('MOODLE_INTERNAL') || die();
-$plugin->version = 2013110500;
+$plugin->version = 2013121000;
$plugin->requires = 2013110500;
$plugin->component = 'assignfeedback_comments';
--- /dev/null
+@mod @mod_assign
+Feature: In an assignment, teachers can edit a students submission inline
+ In order to easily mark students assignments
+ As a teacher
+ I need to have a students submission text copied to the grading online form.
+
+ @javascript
+ Scenario: Submit a text online and edit the submission
+ Given the following "courses" exists:
+ | fullname | shortname | category | groupmode |
+ | Course 1 | C1 | 0 | 1 |
+ And the following "users" exists:
+ | username | firstname | lastname | email |
+ | teacher1 | Teacher | 1 | teacher1@asd.com |
+ | student1 | Student | 1 | student1@asd.com |
+ And the following "course enrolments" exists:
+ | user | course | role |
+ | teacher1 | C1 | editingteacher |
+ | student1 | C1 | student |
+ And I log in as "teacher1"
+ And I follow "Course 1"
+ And I turn editing mode on
+ And I add a "Assignment" to section "1" and I fill the form with:
+ | Assignment name | Test assignment name |
+ | Description | Submit your online text |
+ | assignsubmission_onlinetext_enabled | 1 |
+ | assignsubmission_file_enabled | 0 |
+ | assignfeedback_comments_enabled | 1 |
+ | assignfeedback_comments_commentinline | 1 |
+ And I log out
+ And I log in as "student1"
+ And I follow "Course 1"
+ And I follow "Test assignment name"
+ And I press "Add submission"
+ And I fill the moodle form with:
+ | Online text | I'm the student first submission |
+ And I press "Save changes"
+ And I log out
+ When I log in as "teacher1"
+ And I follow "Course 1"
+ And I follow "Test assignment name"
+ And I follow "View/grade all submissions"
+ And I click on "Grade Student 1" "link" in the "Student 1" "table_row"
+ And I press "Save changes"
+ And I press "Continue"
+ And I log out
+ When I log in as "student1"
+ And I follow "Course 1"
+ And I follow "Test assignment name"
+ And I should see "I'm the student first submission" in the "Feedback comments" "table_row"
$CFG->usecomments = $commentconfig;
}
+ /**
+ * Testing for comment inline settings
+ */
+ public function test_feedback_comment_commentinline() {
+ global $CFG;
+
+ $sourcetext = "Hello!
+
+I'm writing to you from the Moodle Majlis in Muscat, Oman, where we just had several days of Moodle community goodness.
+
+URL outside a tag: https://moodle.org/logo/logo-240x60.gif
+Plugin url outside a tag: @@PLUGINFILE@@/logo-240x60.gif
+
+External link 1:<img src='https://moodle.org/logo/logo-240x60.gif' alt='Moodle'/>
+External link 2:<img alt=\"Moodle\" src=\"https://moodle.org/logo/logo-240x60.gif\"/>
+Internal link 1:<img src='@@PLUGINFILE@@/logo-240x60.gif' alt='Moodle'/>
+Internal link 2:<img alt=\"Moodle\" src=\"@@PLUGINFILE@@logo-240x60.gif\"/>
+Anchor link 1:<a href=\"@@PLUGINFILE@@logo-240x60.gif\" alt=\"bananas\">Link text</a>
+Anchor link 2:<a title=\"bananas\" href=\"../logo-240x60.gif\">Link text</a>
+";
+
+ // Note the internal images have been stripped and the html is purified (quotes fixed in this case).
+ $filteredtext = "Hello!
+
+I'm writing to you from the Moodle Majlis in Muscat, Oman, where we just had several days of Moodle community goodness.
+
+URL outside a tag: https://moodle.org/logo/logo-240x60.gif
+Plugin url outside a tag: @@PLUGINFILE@@/logo-240x60.gif
+
+External link 1:<img src=\"https://moodle.org/logo/logo-240x60.gif\" alt=\"Moodle\" />
+External link 2:<img alt=\"Moodle\" src=\"https://moodle.org/logo/logo-240x60.gif\" />
+Internal link 1:
+Internal link 2:
+Anchor link 1:Link text
+Anchor link 2:<a title=\"bananas\" href=\"../logo-240x60.gif\">Link text</a>
+";
+
+ $this->setUser($this->editingteachers[0]);
+ $params = array('assignsubmission_onlinetext_enabled' => 1,
+ 'assignfeedback_comments_enabled' => 1,
+ 'assignfeedback_comments_commentinline' => 1);
+ $assign = $this->create_instance($params);
+
+ $this->setUser($this->students[0]);
+ // Add a submission but don't submit now.
+ $submission = $assign->get_user_submission($this->students[0]->id, true);
+ $data = new stdClass();
+
+ // Test the internal link is stripped, but the external one is not.
+ $data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
+ 'text'=>$sourcetext,
+ 'format'=>FORMAT_MOODLE);
+
+ $plugin = $assign->get_submission_plugin_by_type('onlinetext');
+ $plugin->save($submission, $data);
+
+ $this->setUser($this->editingteachers[0]);
+
+ $data = new stdClass();
+ require_once($CFG->dirroot . '/mod/assign/gradeform.php');
+ $pagination = array('userid'=>$this->students[0]->id,
+ 'rownum'=>0,
+ 'last'=>true,
+ 'useridlistid'=>time(),
+ 'attemptnumber'=>0);
+ $formparams = array($assign, $data, $pagination);
+ $mform = new mod_assign_grade_form(null, $formparams);
+
+ $this->assertEquals($filteredtext, $data->assignfeedbackcomments_editor['text']);
+ }
+
/**
* Testing for feedback comment plugin settings
*/