first commit

This commit is contained in:
CHIEFSOFT\ameye
2024-09-30 18:11:26 -04:00
commit e592ca6823
27270 changed files with 5002257 additions and 0 deletions
@@ -0,0 +1,66 @@
<?php
// 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/>.
/**
* This file contains the class for backup of this submission plugin
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Provides the information to backup onlinetext submissions
*
* This just adds its filearea to the annotations and records the submissiontext and format
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class backup_assignsubmission_onlinetext_subplugin extends backup_subplugin {
/**
* Returns the subplugin information to attach to submission element
*
* @return backup_subplugin_element
*/
protected function define_submission_subplugin_structure() {
// Create XML elements.
$subplugin = $this->get_subplugin_element();
$subpluginwrapper = new backup_nested_element($this->get_recommended_name());
$subpluginelement = new backup_nested_element('submission_onlinetext',
null,
array('onlinetext', 'onlineformat', 'submission'));
// Connect XML elements into the tree.
$subplugin->add_child($subpluginwrapper);
$subpluginwrapper->add_child($subpluginelement);
// Set source to populate the data.
$subpluginelement->set_source_table('assignsubmission_onlinetext',
array('submission' => backup::VAR_PARENTID));
$subpluginelement->annotate_files('assignsubmission_onlinetext',
'submissions_onlinetext',
'submission');
return $subplugin;
}
}
@@ -0,0 +1,74 @@
<?php
// 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/>.
/**
* This file contains the class for restore of this submission plugin
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Restore subplugin class.
*
* Provides the necessary information needed to restore
* one assign_submission subplugin.
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class restore_assignsubmission_onlinetext_subplugin extends restore_subplugin {
/**
* Returns array the paths to be handled by the subplugin at assignment level
* @return array
*/
protected function define_submission_subplugin_structure() {
$paths = array();
$elename = $this->get_namefor('submission');
// We used get_recommended_name() so this works.
$elepath = $this->get_pathfor('/submission_onlinetext');
$paths[] = new restore_path_element($elename, $elepath);
return $paths;
}
/**
* Processes one assignsubmission_onlinetext element
*
* @param mixed $data
*/
public function process_assignsubmission_onlinetext_submission($data) {
global $DB;
$data = (object)$data;
$data->assignment = $this->get_new_parentid('assign');
$oldsubmissionid = $data->submission;
// The mapping is set in the restore for the core assign activity
// when a submission node is processed.
$data->submission = $this->get_mappingid('submission', $data->submission);
$DB->insert_record('assignsubmission_onlinetext', $data);
$this->add_related_files('assignsubmission_onlinetext', 'submissions_onlinetext', 'submission', null, $oldsubmissionid);
}
}
@@ -0,0 +1,86 @@
<?php
// 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/>.
/**
* The assignsubmission_onlinetext assessable uploaded event.
*
* @package assignsubmission_onlinetext
* @copyright 2013 Frédéric Massart
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace assignsubmission_onlinetext\event;
defined('MOODLE_INTERNAL') || die();
/**
* The assignsubmission_onlinetext assessable uploaded event class.
*
* @property-read array $other {
* Extra information about event.
*
* - string format: (optional) content format.
* }
*
* @package assignsubmission_onlinetext
* @since Moodle 2.6
* @copyright 2013 Frédéric Massart
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class assessable_uploaded extends \core\event\assessable_uploaded {
/**
* Returns description of what happened.
*
* @return string
*/
public function get_description() {
return "The user with id '$this->userid' has saved an online text submission with id '$this->objectid' " .
"in the assignment activity with course module id '$this->contextinstanceid'.";
}
/**
* Return localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventassessableuploaded', 'assignsubmission_onlinetext');
}
/**
* Get URL related to the action.
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/mod/assign/view.php', array('id' => $this->contextinstanceid));
}
/**
* Init method.
*
* @return void
*/
protected function init() {
parent::init();
$this->data['objecttable'] = 'assign_submission';
}
public static function get_objectid_mapping() {
return array('db' => 'assign_submission', 'restore' => 'submission');
}
}
@@ -0,0 +1,88 @@
<?php
// 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/>.
/**
* The assignsubmission_onlinetext submission_created event.
*
* @package assignsubmission_onlinetext
* @copyright 2014 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace assignsubmission_onlinetext\event;
defined('MOODLE_INTERNAL') || die();
/**
* The assignsubmission_onlinetext submission_created event class.
*
* @property-read array $other {
* Extra information about the event.
*
* - int onlinetextwordcount: Word count of the online text submission.
* }
*
* @package assignsubmission_onlinetext
* @since Moodle 2.7
* @copyright 2014 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class submission_created extends \mod_assign\event\submission_created {
/**
* Init method.
*/
protected function init() {
parent::init();
$this->data['objecttable'] = 'assignsubmission_onlinetext';
}
/**
* Returns non-localised description of what happened.
*
* @return string
*/
public function get_description() {
$descriptionstring = "The user with id '$this->userid' created an online text submission with " .
"'{$this->other['onlinetextwordcount']}' words in the assignment with course module id " .
"'$this->contextinstanceid'";
if (!empty($this->other['groupid'])) {
$descriptionstring .= " for the group with id '{$this->other['groupid']}'.";
} else {
$descriptionstring .= ".";
}
return $descriptionstring;
}
/**
* Custom validation.
*
* @throws \coding_exception
* @return void
*/
protected function validate_data() {
parent::validate_data();
if (!isset($this->other['onlinetextwordcount'])) {
throw new \coding_exception('The \'onlinetextwordcount\' value must be set in other.');
}
}
public static function get_objectid_mapping() {
// No mapping available for 'assignsubmission_onlinetext'.
return array('db' => 'assignsubmission_onlinetext', 'restore' => \core\event\base::NOT_MAPPED);
}
}
@@ -0,0 +1,88 @@
<?php
// 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/>.
/**
* The assignsubmission_onlinetext submission_updated event.
*
* @package assignsubmission_onlinetext
* @copyright 2014 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace assignsubmission_onlinetext\event;
defined('MOODLE_INTERNAL') || die();
/**
* The assignsubmission_onlinetext submission_updated event class.
*
* @property-read array $other {
* Extra information about the event.
*
* - int onlinetextwordcount: Word count of the online text submission.
* }
*
* @package assignsubmission_onlinetext
* @since Moodle 2.7
* @copyright 2014 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class submission_updated extends \mod_assign\event\submission_updated {
/**
* Init method.
*/
protected function init() {
parent::init();
$this->data['objecttable'] = 'assignsubmission_onlinetext';
}
/**
* Returns non-localised description of what happened.
*
* @return string
*/
public function get_description() {
$descriptionstring = "The user with id '$this->userid' updated an online text submission with " .
"'{$this->other['onlinetextwordcount']}' words in the assignment with course module id " .
"'$this->contextinstanceid'";
if (!empty($this->other['groupid'])) {
$descriptionstring .= " for the group with id '{$this->other['groupid']}'.";
} else {
$descriptionstring .= ".";
}
return $descriptionstring;
}
/**
* Custom validation.
*
* @throws \coding_exception
* @return void
*/
protected function validate_data() {
parent::validate_data();
if (!isset($this->other['onlinetextwordcount'])) {
throw new \coding_exception('The \'onlinetextwordcount\' value must be set in other.');
}
}
public static function get_objectid_mapping() {
// No mapping available for 'assignsubmission_onlinetext'.
return array('db' => 'assignsubmission_onlinetext', 'restore' => \core\event\base::NOT_MAPPED);
}
}
@@ -0,0 +1,201 @@
<?php
// 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/>.
/**
* Privacy class for requesting user data.
*
* @package assignsubmission_onlinetext
* @copyright 2018 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace assignsubmission_onlinetext\privacy;
defined('MOODLE_INTERNAL') || die();
require_once($CFG->dirroot . '/mod/assign/locallib.php');
use \core_privacy\local\metadata\collection;
use \core_privacy\local\request\writer;
use \core_privacy\local\request\contextlist;
use \mod_assign\privacy\assign_plugin_request_data;
/**
* Privacy class for requesting user data.
*
* @package assignsubmission_onlinetext
* @copyright 2018 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class provider implements
\core_privacy\local\metadata\provider,
\mod_assign\privacy\assignsubmission_provider,
\mod_assign\privacy\assignsubmission_user_provider {
/**
* Return meta data about this plugin.
*
* @param collection $collection A list of information to add to.
* @return collection Return the collection after adding to it.
*/
public static function get_metadata(collection $collection): collection {
$detail = [
'assignment' => 'privacy:metadata:assignmentid',
'submission' => 'privacy:metadata:submissionpurpose',
'onlinetext' => 'privacy:metadata:textpurpose'
];
$collection->add_database_table('assignsubmission_onlinetext', $detail, 'privacy:metadata:tablepurpose');
$collection->link_subsystem('core_files', 'privacy:metadata:filepurpose');
return $collection;
}
/**
* This is covered by mod_assign provider and the query on assign_submissions.
*
* @param int $userid The user ID that we are finding contexts for.
* @param contextlist $contextlist A context list to add sql and params to for contexts.
*/
public static function get_context_for_userid_within_submission(int $userid, contextlist $contextlist) {
// This is already fetched from mod_assign.
}
/**
* This is also covered by the mod_assign provider and it's queries.
*
* @param \mod_assign\privacy\useridlist $useridlist An object for obtaining user IDs of students.
*/
public static function get_student_user_ids(\mod_assign\privacy\useridlist $useridlist) {
// No need.
}
/**
* If you have tables that contain userids and you can generate entries in your tables without creating an
* entry in the assign_submission table then please fill in this method.
*
* @param \core_privacy\local\request\userlist $userlist The userlist object
*/
public static function get_userids_from_context(\core_privacy\local\request\userlist $userlist) {
// Not required.
}
/**
* Export all user data for this plugin.
*
* @param assign_plugin_request_data $exportdata Data used to determine which context and user to export and other useful
* information to help with exporting.
*/
public static function export_submission_user_data(assign_plugin_request_data $exportdata) {
// We currently don't show submissions to teachers when exporting their data.
if ($exportdata->get_user() != null) {
return null;
}
// Retrieve text for this submission.
$assign = $exportdata->get_assign();
$plugin = $assign->get_plugin_by_type('assignsubmission', 'onlinetext');
$submission = $exportdata->get_pluginobject();
$editortext = $plugin->get_editor_text('onlinetext', $submission->id);
$context = $exportdata->get_context();
if (!empty($editortext)) {
$submissiontext = new \stdClass();
$currentpath = $exportdata->get_subcontext();
$currentpath[] = get_string('privacy:path', 'assignsubmission_onlinetext');
$submissiontext->text = writer::with_context($context)->rewrite_pluginfile_urls($currentpath,
'assignsubmission_onlinetext', 'submissions_onlinetext', $submission->id, $editortext);
writer::with_context($context)
->export_area_files($currentpath, 'assignsubmission_onlinetext', 'submissions_onlinetext', $submission->id)
// Add the text to the exporter.
->export_data($currentpath, $submissiontext);
// Handle plagiarism data.
$coursecontext = $context->get_course_context();
$userid = $submission->userid;
\core_plagiarism\privacy\provider::export_plagiarism_user_data($userid, $context, $currentpath, [
'cmid' => $context->instanceid,
'course' => $coursecontext->instanceid,
'userid' => $userid,
'content' => $editortext,
'assignment' => $submission->assignment
]);
}
}
/**
* Any call to this method should delete all user data for the context defined in the deletion_criteria.
*
* @param assign_plugin_request_data $requestdata Data useful for deleting user data from this sub-plugin.
*/
public static function delete_submission_for_context(assign_plugin_request_data $requestdata) {
global $DB;
\core_plagiarism\privacy\provider::delete_plagiarism_for_context($requestdata->get_context());
// Delete related files.
$fs = get_file_storage();
$fs->delete_area_files($requestdata->get_context()->id, 'assignsubmission_onlinetext',
ASSIGNSUBMISSION_ONLINETEXT_FILEAREA);
// Delete the records in the table.
$DB->delete_records('assignsubmission_onlinetext', ['assignment' => $requestdata->get_assignid()]);
}
/**
* A call to this method should delete user data (where practicle) from the userid and context.
*
* @param assign_plugin_request_data $deletedata Details about the user and context to focus the deletion.
*/
public static function delete_submission_for_userid(assign_plugin_request_data $deletedata) {
global $DB;
\core_plagiarism\privacy\provider::delete_plagiarism_for_user($deletedata->get_user()->id, $deletedata->get_context());
$submissionid = $deletedata->get_pluginobject()->id;
// Delete related files.
$fs = get_file_storage();
$fs->delete_area_files($deletedata->get_context()->id, 'assignsubmission_onlinetext', ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
$submissionid);
// Delete the records in the table.
$DB->delete_records('assignsubmission_onlinetext', ['assignment' => $deletedata->get_assignid(),
'submission' => $submissionid]);
}
/**
* Deletes all submissions for the submission ids / userids provided in a context.
* assign_plugin_request_data contains:
* - context
* - assign object
* - submission ids (pluginids)
* - user ids
* @param assign_plugin_request_data $deletedata A class that contains the relevant information required for deletion.
*/
public static function delete_submissions(assign_plugin_request_data $deletedata) {
global $DB;
\core_plagiarism\privacy\provider::delete_plagiarism_for_users($deletedata->get_userids(), $deletedata->get_context());
if (empty($deletedata->get_submissionids())) {
return;
}
$fs = get_file_storage();
list($sql, $params) = $DB->get_in_or_equal($deletedata->get_submissionids(), SQL_PARAMS_NAMED);
$fs->delete_area_files_select($deletedata->get_context()->id,
'assignsubmission_onlinetext', ASSIGNSUBMISSION_ONLINETEXT_FILEAREA, $sql, $params);
$params['assignid'] = $deletedata->get_assignid();
$DB->delete_records_select('assignsubmission_onlinetext', "assignment = :assignid AND submission $sql", $params);
}
}
@@ -0,0 +1,29 @@
<?php
// 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/>.
/**
* Capability definitions for this module.
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
$capabilities = array(
);
@@ -0,0 +1,43 @@
<?php
// 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/>.
/**
* Post-install code for the submission_onlinetext module.
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Code run after the assignsubmission_onlinetext module database tables have been created.
* Moves the plugin to the top of the list (of 3)
* @return bool
*/
function xmldb_assignsubmission_onlinetext_install() {
global $CFG;
// Set the correct initial order for the plugins.
require_once($CFG->dirroot . '/mod/assign/adminlib.php');
$pluginmanager = new assign_plugin_manager('assignsubmission');
$pluginmanager->move_plugin('onlinetext', 'up');
$pluginmanager->move_plugin('onlinetext', 'up');
return true;
}
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="mod/assign/submission/onlinetext/db" VERSION="20120423" COMMENT="XMLDB file for Moodle mod/assign/submission/onlinetext"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../../../lib/xmldb/xmldb.xsd"
>
<TABLES>
<TABLE NAME="assignsubmission_onlinetext" COMMENT="Info about onlinetext submission">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="assignment" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
<FIELD NAME="submission" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
<FIELD NAME="onlinetext" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="The text for this online text submission."/>
<FIELD NAME="onlineformat" TYPE="int" LENGTH="4" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The format for this online text submission."/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id" COMMENT="The unique id for this onlinetext submission."/>
<KEY NAME="assignment" TYPE="foreign" FIELDS="assignment" REFTABLE="assign" REFFIELDS="id" COMMENT="The assignment instance this online text submission relates to."/>
<KEY NAME="submission" TYPE="foreign" FIELDS="submission" REFTABLE="assign_submission" REFFIELDS="id" COMMENT="The submission this online text submission relates to."/>
</KEYS>
</TABLE>
</TABLES>
</XMLDB>
@@ -0,0 +1,44 @@
<?php
// 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/>.
/**
* Upgrade code for install
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Stub for upgrade code
* @param int $oldversion
* @return bool
*/
function xmldb_assignsubmission_onlinetext_upgrade($oldversion) {
// Automatically generated Moodle v4.1.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.2.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.3.0 release upgrade line.
// Put any upgrade step following this.
// Automatically generated Moodle v4.4.0 release upgrade line.
// Put any upgrade step following this.
return true;
}
@@ -0,0 +1,48 @@
<?php
// 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/>.
/**
* Strings for component 'assignsubmission_onlinetext', language 'en'
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
$string['allowonlinetextsubmissions'] = 'Enabled';
$string['default'] = 'Enabled by default';
$string['default_help'] = 'If set, this submission method will be enabled by default for all new assignments.';
$string['enabled'] = 'Online text';
$string['enabled_help'] = 'If enabled, students are able to type rich text directly into an editor field for their submission.';
$string['eventassessableuploaded'] = 'An online text has been uploaded.';
$string['nosubmission'] = 'Nothing has been submitted for this assignment';
$string['onlinetext'] = 'Online text';
$string['onlinetextfilename'] = 'onlinetext.html';
$string['onlinetextsubmission'] = 'Allow online text submission';
$string['numwords'] = '({$a} words)';
$string['pluginname'] = 'Online text submissions';
$string['privacy:metadata:assignmentid'] = 'Assignment ID';
$string['privacy:metadata:filepurpose'] = 'Files that are embedded in the text submission.';
$string['privacy:metadata:submissionpurpose'] = 'The submission ID that links to submissions for the user.';
$string['privacy:metadata:tablepurpose'] = 'Stores the text submission for each attempt.';
$string['privacy:metadata:textpurpose'] = 'The actual text submitted for this attempt of the assignment.';
$string['privacy:path'] = 'Submission Text';
$string['wordlimit'] = 'Word limit';
$string['wordlimit_help'] = 'If online text submissions are enabled, this is the maximum number of words that each student will be allowed to submit.';
$string['wordlimitexceeded'] = 'The word limit for this assignment is {$a->limit} words and you are attempting to submit {$a->count} words. Please review your submission and try again.';
// Deprecated since Moodle 4.3.
$string['numwordsforlog'] = 'Submission word count: {$a} words';
@@ -0,0 +1 @@
numwordsforlog,assignsubmission_onlinetext
+89
View File
@@ -0,0 +1,89 @@
<?php
// 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/>.
/**
* This file contains the moodle hooks for the submission onlinetext plugin
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Serves assignment submissions and other files.
*
* @param mixed $course course or id of the course
* @param mixed $cm course module or id of the course module
* @param context $context
* @param string $filearea
* @param array $args
* @param bool $forcedownload
* @param array $options - List of options affecting file serving.
* @return bool false if file not found, does not return if found - just send the file
*/
function assignsubmission_onlinetext_pluginfile($course,
$cm,
context $context,
$filearea,
$args,
$forcedownload,
array $options=array()) {
global $DB, $CFG;
if ($context->contextlevel != CONTEXT_MODULE) {
return false;
}
require_login($course, false, $cm);
$itemid = (int)array_shift($args);
$record = $DB->get_record('assign_submission',
array('id'=>$itemid),
'userid, assignment, groupid',
MUST_EXIST);
$userid = $record->userid;
$groupid = $record->groupid;
require_once($CFG->dirroot . '/mod/assign/locallib.php');
$assign = new assign($context, $cm, $course);
if ($assign->get_instance()->id != $record->assignment) {
return false;
}
if ($assign->get_instance()->teamsubmission &&
!$assign->can_view_group_submission($groupid)) {
return false;
}
if (!$assign->get_instance()->teamsubmission &&
!$assign->can_view_submission($userid)) {
return false;
}
$relativepath = implode('/', $args);
$fullpath = "/{$context->id}/assignsubmission_onlinetext/$filearea/$itemid/$relativepath";
$fs = get_file_storage();
if (!($file = $fs->get_file_by_hash(sha1($fullpath))) || $file->is_directory()) {
return false;
}
// Download MUST be forced - security!
send_stored_file($file, 0, 0, true, $options);
}
@@ -0,0 +1,713 @@
<?php
// 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/>.
/**
* This file contains the definition for the library class for onlinetext submission plugin
*
* This class provides all the functionality for the new assign module.
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core_external\external_single_structure;
use core_external\external_value;
defined('MOODLE_INTERNAL') || die();
// File area for online text submission assignment.
define('ASSIGNSUBMISSION_ONLINETEXT_FILEAREA', 'submissions_onlinetext');
/**
* library class for onlinetext submission plugin extending submission plugin base class
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class assign_submission_onlinetext extends assign_submission_plugin {
/**
* Get the name of the online text submission plugin
* @return string
*/
public function get_name() {
return get_string('onlinetext', 'assignsubmission_onlinetext');
}
/**
* Get onlinetext submission information from the database
*
* @param int $submissionid
* @return mixed
*/
private function get_onlinetext_submission($submissionid) {
global $DB;
return $DB->get_record('assignsubmission_onlinetext', array('submission'=>$submissionid));
}
/**
* Remove a submission.
*
* @param stdClass $submission The submission
* @return boolean
*/
public function remove(stdClass $submission) {
global $DB;
$submissionid = $submission ? $submission->id : 0;
if ($submissionid) {
$DB->delete_records('assignsubmission_onlinetext', array('submission' => $submissionid));
}
return true;
}
/**
* Get the settings for onlinetext submission plugin
*
* @param MoodleQuickForm $mform The form to add elements to
* @return void
*/
public function get_settings(MoodleQuickForm $mform) {
global $CFG, $COURSE;
$defaultwordlimit = $this->get_config('wordlimit') == 0 ? '' : $this->get_config('wordlimit');
$defaultwordlimitenabled = $this->get_config('wordlimitenabled');
$options = array('size' => '6', 'maxlength' => '6');
$name = get_string('wordlimit', 'assignsubmission_onlinetext');
// Create a text box that can be enabled/disabled for onlinetext word limit.
$wordlimitgrp = array();
$wordlimitgrp[] = $mform->createElement('text', 'assignsubmission_onlinetext_wordlimit', '', $options);
$wordlimitgrp[] = $mform->createElement('checkbox', 'assignsubmission_onlinetext_wordlimit_enabled',
'', get_string('enable'));
$mform->addGroup($wordlimitgrp, 'assignsubmission_onlinetext_wordlimit_group', $name, ' ', false);
$mform->addHelpButton('assignsubmission_onlinetext_wordlimit_group',
'wordlimit',
'assignsubmission_onlinetext');
$mform->disabledIf('assignsubmission_onlinetext_wordlimit',
'assignsubmission_onlinetext_wordlimit_enabled',
'notchecked');
$mform->hideIf('assignsubmission_onlinetext_wordlimit',
'assignsubmission_onlinetext_enabled',
'notchecked');
// Add numeric rule to text field.
$wordlimitgrprules = array();
$wordlimitgrprules['assignsubmission_onlinetext_wordlimit'][] = array(null, 'numeric', null, 'client');
$mform->addGroupRule('assignsubmission_onlinetext_wordlimit_group', $wordlimitgrprules);
// Rest of group setup.
$mform->setDefault('assignsubmission_onlinetext_wordlimit', $defaultwordlimit);
$mform->setDefault('assignsubmission_onlinetext_wordlimit_enabled', $defaultwordlimitenabled);
$mform->setType('assignsubmission_onlinetext_wordlimit', PARAM_INT);
$mform->hideIf('assignsubmission_onlinetext_wordlimit_group',
'assignsubmission_onlinetext_enabled',
'notchecked');
}
/**
* Save the settings for onlinetext submission plugin
*
* @param stdClass $data
* @return bool
*/
public function save_settings(stdClass $data) {
if (empty($data->assignsubmission_onlinetext_wordlimit) || empty($data->assignsubmission_onlinetext_wordlimit_enabled)) {
$wordlimit = 0;
$wordlimitenabled = 0;
} else {
$wordlimit = $data->assignsubmission_onlinetext_wordlimit;
$wordlimitenabled = 1;
}
$this->set_config('wordlimit', $wordlimit);
$this->set_config('wordlimitenabled', $wordlimitenabled);
return true;
}
/**
* Add form elements for settings
*
* @param mixed $submission can be null
* @param MoodleQuickForm $mform
* @param stdClass $data
* @return true if elements were added to the form
*/
public function get_form_elements($submission, MoodleQuickForm $mform, stdClass $data) {
$elements = array();
$editoroptions = $this->get_edit_options();
$submissionid = $submission ? $submission->id : 0;
if (!isset($data->onlinetext)) {
$data->onlinetext = '';
}
if (!isset($data->onlinetextformat)) {
$data->onlinetextformat = editors_get_preferred_format();
}
if ($submission) {
$onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
if ($onlinetextsubmission) {
$data->onlinetext = $onlinetextsubmission->onlinetext;
$data->onlinetextformat = $onlinetextsubmission->onlineformat;
}
}
$data = file_prepare_standard_editor($data,
'onlinetext',
$editoroptions,
$this->assignment->get_context(),
'assignsubmission_onlinetext',
ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
$submissionid);
$mform->addElement('editor', 'onlinetext_editor', $this->get_name(), null, $editoroptions);
return true;
}
/**
* Editor format options
*
* @return array
*/
private function get_edit_options() {
$editoroptions = array(
'noclean' => false,
'maxfiles' => EDITOR_UNLIMITED_FILES,
'maxbytes' => $this->assignment->get_course()->maxbytes,
'context' => $this->assignment->get_context(),
'return_types' => (FILE_INTERNAL | FILE_EXTERNAL | FILE_CONTROLLED_LINK),
'removeorphaneddrafts' => true // Whether or not to remove any draft files which aren't referenced in the text.
);
return $editoroptions;
}
/**
* Save data to the database and trigger plagiarism plugin,
* if enabled, to scan the uploaded content via events trigger
*
* @param stdClass $submission
* @param stdClass $data
* @return bool
*/
public function save(stdClass $submission, stdClass $data) {
global $USER, $DB;
$editoroptions = $this->get_edit_options();
$data = file_postupdate_standard_editor($data,
'onlinetext',
$editoroptions,
$this->assignment->get_context(),
'assignsubmission_onlinetext',
ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
$submission->id);
$onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
$fs = get_file_storage();
$files = $fs->get_area_files($this->assignment->get_context()->id,
'assignsubmission_onlinetext',
ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
$submission->id,
'id',
false);
// Check word count before submitting anything.
$exceeded = $this->check_word_count(trim($data->onlinetext));
if ($exceeded) {
$this->set_error($exceeded);
return false;
}
$params = array(
'context' => context_module::instance($this->assignment->get_course_module()->id),
'courseid' => $this->assignment->get_course()->id,
'objectid' => $submission->id,
'other' => array(
'pathnamehashes' => array_keys($files),
'content' => trim($data->onlinetext),
'format' => $data->onlinetext_editor['format']
)
);
if (!empty($submission->userid) && ($submission->userid != $USER->id)) {
$params['relateduserid'] = $submission->userid;
}
if ($this->assignment->is_blind_marking()) {
$params['anonymous'] = 1;
}
$event = \assignsubmission_onlinetext\event\assessable_uploaded::create($params);
$event->trigger();
$groupname = null;
$groupid = 0;
// Get the group name as other fields are not transcribed in the logs and this information is important.
if (empty($submission->userid) && !empty($submission->groupid)) {
$groupname = $DB->get_field('groups', 'name', array('id' => $submission->groupid), MUST_EXIST);
$groupid = $submission->groupid;
} else {
$params['relateduserid'] = $submission->userid;
}
$count = count_words($data->onlinetext);
// Unset the objectid and other field from params for use in submission events.
unset($params['objectid']);
unset($params['other']);
$params['other'] = array(
'submissionid' => $submission->id,
'submissionattempt' => $submission->attemptnumber,
'submissionstatus' => $submission->status,
'onlinetextwordcount' => $count,
'groupid' => $groupid,
'groupname' => $groupname
);
if ($onlinetextsubmission) {
$onlinetextsubmission->onlinetext = $data->onlinetext;
$onlinetextsubmission->onlineformat = $data->onlinetext_editor['format'];
$params['objectid'] = $onlinetextsubmission->id;
$updatestatus = $DB->update_record('assignsubmission_onlinetext', $onlinetextsubmission);
$event = \assignsubmission_onlinetext\event\submission_updated::create($params);
$event->set_assign($this->assignment);
$event->trigger();
return $updatestatus;
} else {
$onlinetextsubmission = new stdClass();
$onlinetextsubmission->onlinetext = $data->onlinetext;
$onlinetextsubmission->onlineformat = $data->onlinetext_editor['format'];
$onlinetextsubmission->submission = $submission->id;
$onlinetextsubmission->assignment = $this->assignment->get_instance()->id;
$onlinetextsubmission->id = $DB->insert_record('assignsubmission_onlinetext', $onlinetextsubmission);
$params['objectid'] = $onlinetextsubmission->id;
$event = \assignsubmission_onlinetext\event\submission_created::create($params);
$event->set_assign($this->assignment);
$event->trigger();
return $onlinetextsubmission->id > 0;
}
}
/**
* Return a list of the text fields that can be imported/exported by this plugin
*
* @return array An array of field names and descriptions. (name=>description, ...)
*/
public function get_editor_fields() {
return array('onlinetext' => get_string('pluginname', 'assignsubmission_onlinetext'));
}
/**
* Get the saved text content from the editor
*
* @param string $name
* @param int $submissionid
* @return string
*/
public function get_editor_text($name, $submissionid) {
if ($name == 'onlinetext') {
$onlinetextsubmission = $this->get_onlinetext_submission($submissionid);
if ($onlinetextsubmission) {
return $onlinetextsubmission->onlinetext;
}
}
return '';
}
/**
* Get the content format for the editor
*
* @param string $name
* @param int $submissionid
* @return int
*/
public function get_editor_format($name, $submissionid) {
if ($name == 'onlinetext') {
$onlinetextsubmission = $this->get_onlinetext_submission($submissionid);
if ($onlinetextsubmission) {
return $onlinetextsubmission->onlineformat;
}
}
return 0;
}
/**
* Display onlinetext word count in the submission status table
*
* @param stdClass $submission
* @param bool $showviewlink - If the summary has been truncated set this to true
* @return string
*/
public function view_summary(stdClass $submission, & $showviewlink) {
global $CFG;
$onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
// Always show the view link.
$showviewlink = true;
if ($onlinetextsubmission) {
// This contains the shortened version of the text plus an optional 'Export to portfolio' button.
$text = $this->assignment->render_editor_content(ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
$onlinetextsubmission->submission,
$this->get_type(),
'onlinetext',
'assignsubmission_onlinetext', true);
// The actual submission text.
$onlinetext = trim($onlinetextsubmission->onlinetext);
// The shortened version of the submission text.
$shorttext = shorten_text($onlinetext, 140);
$plagiarismlinks = '';
if (!empty($CFG->enableplagiarism)) {
require_once($CFG->libdir . '/plagiarismlib.php');
$plagiarismlinks .= plagiarism_get_links(array('userid' => $submission->userid,
'content' => $onlinetext,
'cmid' => $this->assignment->get_course_module()->id,
'course' => $this->assignment->get_course()->id,
'assignment' => $submission->assignment));
}
// We compare the actual text submission and the shortened version. If they are not equal, we show the word count.
if ($onlinetext != $shorttext) {
$wordcount = get_string('numwords', 'assignsubmission_onlinetext', count_words($onlinetext));
return $plagiarismlinks . $wordcount . $text;
} else {
return $plagiarismlinks . $text;
}
}
return '';
}
/**
* Produce a list of files suitable for export that represent this submission.
*
* @param stdClass $submission - For this is the submission data
* @param stdClass $user - This is the user record for this submission
* @return array - return an array of files indexed by filename
*/
public function get_files(stdClass $submission, stdClass $user) {
global $DB;
$files = array();
$onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
// Note that this check is the same logic as the result from the is_empty function but we do
// not call it directly because we already have the submission record.
if ($onlinetextsubmission && !html_is_blank($onlinetextsubmission->onlinetext)) {
// Do not pass the text through format_text. The result may not be displayed in Moodle and
// may be passed to external services such as document conversion or portfolios.
$formattedtext = $this->assignment->download_rewrite_pluginfile_urls($onlinetextsubmission->onlinetext, $user, $this);
$head = '<head><meta charset="UTF-8"></head>';
$submissioncontent = '<!DOCTYPE html><html>' . $head . '<body>'. $formattedtext . '</body></html>';
$filename = get_string('onlinetextfilename', 'assignsubmission_onlinetext');
$files[$filename] = array($submissioncontent);
$fs = get_file_storage();
$fsfiles = $fs->get_area_files($this->assignment->get_context()->id,
'assignsubmission_onlinetext',
ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
$submission->id,
'timemodified',
false);
foreach ($fsfiles as $file) {
$files[$file->get_filename()] = $file;
}
}
return $files;
}
/**
* Display the saved text content from the editor in the view table
*
* @param stdClass $submission
* @return string
*/
public function view(stdClass $submission) {
global $CFG;
$result = '';
$plagiarismlinks = '';
$onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
if ($onlinetextsubmission) {
// Render for portfolio API.
$result .= $this->assignment->render_editor_content(ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
$onlinetextsubmission->submission,
$this->get_type(),
'onlinetext',
'assignsubmission_onlinetext');
if (!empty($CFG->enableplagiarism)) {
require_once($CFG->libdir . '/plagiarismlib.php');
$plagiarismlinks .= plagiarism_get_links(array('userid' => $submission->userid,
'content' => trim($onlinetextsubmission->onlinetext),
'cmid' => $this->assignment->get_course_module()->id,
'course' => $this->assignment->get_course()->id,
'assignment' => $submission->assignment));
}
}
return $plagiarismlinks . $result;
}
/**
* Return true if this plugin can upgrade an old Moodle 2.2 assignment of this type and version.
*
* @param string $type old assignment subtype
* @param int $version old assignment version
* @return bool True if upgrade is possible
*/
public function can_upgrade($type, $version) {
if ($type == 'online' && $version >= 2011112900) {
return true;
}
return false;
}
/**
* Upgrade the settings from the old assignment to the new plugin based one
*
* @param context $oldcontext - the database for the old assignment context
* @param stdClass $oldassignment - the database for the old assignment instance
* @param string $log record log events here
* @return bool Was it a success?
*/
public function upgrade_settings(context $oldcontext, stdClass $oldassignment, & $log) {
// No settings to upgrade.
return true;
}
/**
* Upgrade the submission from the old assignment to the new one
*
* @param context $oldcontext - the database for the old assignment context
* @param stdClass $oldassignment The data record for the old assignment
* @param stdClass $oldsubmission The data record for the old submission
* @param stdClass $submission The data record for the new submission
* @param string $log Record upgrade messages in the log
* @return bool true or false - false will trigger a rollback
*/
public function upgrade(context $oldcontext,
stdClass $oldassignment,
stdClass $oldsubmission,
stdClass $submission,
& $log) {
global $DB;
$onlinetextsubmission = new stdClass();
$onlinetextsubmission->onlinetext = $oldsubmission->data1;
$onlinetextsubmission->onlineformat = $oldsubmission->data2;
$onlinetextsubmission->submission = $submission->id;
$onlinetextsubmission->assignment = $this->assignment->get_instance()->id;
if ($onlinetextsubmission->onlinetext === null) {
$onlinetextsubmission->onlinetext = '';
}
if ($onlinetextsubmission->onlineformat === null) {
$onlinetextsubmission->onlineformat = editors_get_preferred_format();
}
if (!$DB->insert_record('assignsubmission_onlinetext', $onlinetextsubmission) > 0) {
$log .= get_string('couldnotconvertsubmission', 'mod_assign', $submission->userid);
return false;
}
// Now copy the area files.
$this->assignment->copy_area_files_for_upgrade($oldcontext->id,
'mod_assignment',
'submission',
$oldsubmission->id,
$this->assignment->get_context()->id,
'assignsubmission_onlinetext',
ASSIGNSUBMISSION_ONLINETEXT_FILEAREA,
$submission->id);
return true;
}
/**
* The assignment has been deleted - cleanup
*
* @return bool
*/
public function delete_instance() {
global $DB;
$DB->delete_records('assignsubmission_onlinetext',
array('assignment'=>$this->assignment->get_instance()->id));
return true;
}
/**
* No text is set for this plugin
*
* @param stdClass $submission
* @return bool
*/
public function is_empty(stdClass $submission) {
$onlinetextsubmission = $this->get_onlinetext_submission($submission->id);
$wordcount = 0;
$hasinsertedresources = false;
if (isset($onlinetextsubmission->onlinetext)) {
$wordcount = count_words(trim($onlinetextsubmission->onlinetext));
// Check if the online text submission contains video, audio or image elements
// that can be ignored and stripped by count_words().
$hasinsertedresources = preg_match('/<\s*((video|audio)[^>]*>(.*?)<\s*\/\s*(video|audio)>)|(img[^>]*>(.*?))/',
trim($onlinetextsubmission->onlinetext));
}
return $wordcount == 0 && !$hasinsertedresources;
}
/**
* Determine if a submission is empty
*
* This is distinct from is_empty in that it is intended to be used to
* determine if a submission made before saving is empty.
*
* @param stdClass $data The submission data
* @return bool
*/
public function submission_is_empty(stdClass $data) {
if (!isset($data->onlinetext_editor)) {
return true;
}
$wordcount = 0;
$hasinsertedresources = false;
if (isset($data->onlinetext_editor['text'])) {
$wordcount = count_words(trim((string)$data->onlinetext_editor['text']));
// Check if the online text submission contains video, audio or image elements
// that can be ignored and stripped by count_words().
$hasinsertedresources = preg_match('/<\s*((video|audio)[^>]*>(.*?)<\s*\/\s*(video|audio)>)|(img[^>]*>(.*?))/',
trim((string)$data->onlinetext_editor['text']));
}
return $wordcount == 0 && !$hasinsertedresources;
}
/**
* Get file areas returns a list of areas this plugin stores files
* @return array - An array of fileareas (keys) and descriptions (values)
*/
public function get_file_areas() {
return array(ASSIGNSUBMISSION_ONLINETEXT_FILEAREA=>$this->get_name());
}
/**
* Copy the student's submission from a previous submission. Used when a student opts to base their resubmission
* on the last submission.
* @param stdClass $sourcesubmission
* @param stdClass $destsubmission
*/
public function copy_submission(stdClass $sourcesubmission, stdClass $destsubmission) {
global $DB;
// Copy the files across (attached via the text editor).
$contextid = $this->assignment->get_context()->id;
$fs = get_file_storage();
$files = $fs->get_area_files($contextid, 'assignsubmission_onlinetext',
ASSIGNSUBMISSION_ONLINETEXT_FILEAREA, $sourcesubmission->id, 'id', false);
foreach ($files as $file) {
$fieldupdates = array('itemid' => $destsubmission->id);
$fs->create_file_from_storedfile($fieldupdates, $file);
}
// Copy the assignsubmission_onlinetext record.
$onlinetextsubmission = $this->get_onlinetext_submission($sourcesubmission->id);
if ($onlinetextsubmission) {
unset($onlinetextsubmission->id);
$onlinetextsubmission->submission = $destsubmission->id;
$DB->insert_record('assignsubmission_onlinetext', $onlinetextsubmission);
}
return true;
}
/**
* Return a description of external params suitable for uploading an onlinetext submission from a webservice.
*
* @return \core_external\external_description|null
*/
public function get_external_parameters() {
$editorparams = array('text' => new external_value(PARAM_RAW, 'The text for this submission.'),
'format' => new external_value(PARAM_INT, 'The format for this submission'),
'itemid' => new external_value(PARAM_INT, 'The draft area id for files attached to the submission'));
$editorstructure = new external_single_structure($editorparams, 'Editor structure', VALUE_OPTIONAL);
return array('onlinetext_editor' => $editorstructure);
}
/**
* Compare word count of onlinetext submission to word limit, and return result.
*
* @param string $submissiontext Onlinetext submission text from editor
* @return string Error message if limit is enabled and exceeded, otherwise null
*/
public function check_word_count($submissiontext) {
global $OUTPUT;
$wordlimitenabled = $this->get_config('wordlimitenabled');
$wordlimit = $this->get_config('wordlimit');
if ($wordlimitenabled == 0) {
return null;
}
// Count words and compare to limit.
$wordcount = count_words($submissiontext);
if ($wordcount <= $wordlimit) {
return null;
} else {
$errormsg = get_string('wordlimitexceeded', 'assignsubmission_onlinetext',
array('limit' => $wordlimit, 'count' => $wordcount));
return $OUTPUT->error_text($errormsg);
}
}
/**
* Return the plugin configs for external functions.
*
* @return array the list of settings
* @since Moodle 3.2
*/
public function get_config_for_external() {
return (array) $this->get_config();
}
}
@@ -0,0 +1,28 @@
<?php
// 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/>.
/**
* This file defines the admin settings for this plugin
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
$settings->add(new admin_setting_configcheckbox('assignsubmission_onlinetext/default',
new lang_string('default', 'assignsubmission_onlinetext'),
new lang_string('default_help', 'assignsubmission_onlinetext'), 0));
@@ -0,0 +1,165 @@
<?php
// 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/>.
/**
* Contains the event tests for the plugin.
*
* @package assignsubmission_onlinetext
* @copyright 2013 Frédéric Massart
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace assignsubmission_onlinetext\event;
use mod_assign_test_generator;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/mod/assign/tests/generator.php');
class events_test extends \advanced_testcase {
// Use the generator helper.
use mod_assign_test_generator;
/**
* Test that the assessable_uploaded event is fired when an online text submission is saved.
*/
public function test_assessable_uploaded(): void {
$this->resetAfterTest();
$course = $this->getDataGenerator()->create_course();
$student = $this->getDataGenerator()->create_and_enrol($course, 'student');
$assign = $this->create_instance($course);
$context = $assign->get_context();
$cm = $assign->get_course_module();
$this->setUser($student->id);
$submission = $assign->get_user_submission($student->id, true);
$data = (object) [
'onlinetext_editor' => [
'itemid' => file_get_unused_draft_itemid(),
'text' => 'Submission text',
'format' => FORMAT_PLAIN,
],
];
$sink = $this->redirectEvents();
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
$plugin->save($submission, $data);
$events = $sink->get_events();
$this->assertCount(2, $events);
$event = reset($events);
$this->assertInstanceOf('\assignsubmission_onlinetext\event\assessable_uploaded', $event);
$this->assertEquals($context->id, $event->contextid);
$this->assertEquals($submission->id, $event->objectid);
$this->assertEquals(array(), $event->other['pathnamehashes']);
$this->assertEquals(FORMAT_PLAIN, $event->other['format']);
$this->assertEquals('Submission text', $event->other['content']);
$expected = new \stdClass();
$expected->modulename = 'assign';
$expected->cmid = $cm->id;
$expected->itemid = $submission->id;
$expected->courseid = $course->id;
$expected->userid = $student->id;
$expected->content = 'Submission text';
$this->assertEventContextNotUsed($event);
}
/**
* Test that the submission_created event is fired when an onlinetext submission is saved.
*/
public function test_submission_created(): void {
$this->resetAfterTest();
$course = $this->getDataGenerator()->create_course();
$student = $this->getDataGenerator()->create_and_enrol($course, 'student');
$assign = $this->create_instance($course);
$context = $assign->get_context();
$this->setUser($student->id);
$submission = $assign->get_user_submission($student->id, true);
$data = (object) [
'onlinetext_editor' => [
'itemid' => file_get_unused_draft_itemid(),
'text' => 'Submission text',
'format' => FORMAT_PLAIN,
],
];
$sink = $this->redirectEvents();
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
$plugin->save($submission, $data);
$events = $sink->get_events();
$this->assertCount(2, $events);
$event = $events[1];
$this->assertInstanceOf('\assignsubmission_onlinetext\event\submission_created', $event);
$this->assertEquals($context->id, $event->contextid);
$this->assertEquals($course->id, $event->courseid);
$this->assertEquals($submission->id, $event->other['submissionid']);
$this->assertEquals($submission->attemptnumber, $event->other['submissionattempt']);
$this->assertEquals($submission->status, $event->other['submissionstatus']);
$this->assertEquals($submission->userid, $event->relateduserid);
}
/**
* Test that the submission_updated event is fired when an onlinetext
* submission is saved and an existing submission already exists.
*/
public function test_submission_updated(): void {
$this->resetAfterTest();
$course = $this->getDataGenerator()->create_course();
$student = $this->getDataGenerator()->create_and_enrol($course, 'student');
$assign = $this->create_instance($course);
$context = $assign->get_context();
$this->setUser($student->id);
$submission = $assign->get_user_submission($student->id, true);
$data = (object) [
'onlinetext_editor' => [
'itemid' => file_get_unused_draft_itemid(),
'text' => 'Submission text',
'format' => FORMAT_PLAIN,
],
];
$sink = $this->redirectEvents();
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
$plugin->save($submission, $data);
$sink->clear();
// Update a submission.
$plugin->save($submission, $data);
$events = $sink->get_events();
$this->assertCount(2, $events);
$event = $events[1];
$this->assertInstanceOf('\assignsubmission_onlinetext\event\submission_updated', $event);
$this->assertEquals($context->id, $event->contextid);
$this->assertEquals($course->id, $event->courseid);
$this->assertEquals($submission->id, $event->other['submissionid']);
$this->assertEquals($submission->attemptnumber, $event->other['submissionattempt']);
$this->assertEquals($submission->status, $event->other['submissionstatus']);
$this->assertEquals($submission->userid, $event->relateduserid);
}
}
@@ -0,0 +1,47 @@
<?php
// 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/>.
require_once("{$CFG->dirroot}/mod/assign/tests/generator/assignsubmission_subplugin_generator.php");
/**
* Online Text assignment submission subplugin data generator.
*
* @package assignsubmission_onlinetext
* @category test
* @copyright 2021 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class assignsubmission_onlinetext_generator extends assignsubmission_subplugin_generator {
/**
* Add submission data in the correct format for a call to `assign::save_submission()` from a table containing
* submission data for a single activity.
*
* Data should be added to the $submission object passed into the function.
*
* @param stdClass $submission The submission record to be modified
* @param assign $assign The assignment being submitted to
* @param array $data The data received
*/
public function add_submission_data(stdClass $submission, assign $assign, array $data): void {
if (array_key_exists('onlinetext', $data)) {
$submission->onlinetext_editor = [
'itemid' => file_get_unused_draft_itemid(),
'text' => $data['onlinetext'],
'format' => FORMAT_HTML,
];
}
}
}
@@ -0,0 +1,115 @@
<?php
// 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/>.
/**
* Tests for mod/assign/submission/onlinetext/locallib.php
*
* @package assignsubmission_onlinetext
* @copyright 2016 Cameron Ball
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace assignsubmission_onlinetext;
use mod_assign_test_generator;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/mod/assign/tests/generator.php');
/**
* Unit tests for mod/assign/submission/onlinetext/locallib.php
*
* @copyright 2016 Cameron Ball
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class locallib_test extends \advanced_testcase {
// Use the generator helper.
use mod_assign_test_generator;
/**
* Test submission_is_empty
*
* @dataProvider submission_is_empty_testcases
* @param string $submissiontext The online text submission text
* @param bool $expected The expected return value
*/
public function test_submission_is_empty($submissiontext, $expected): void {
$this->resetAfterTest();
$course = $this->getDataGenerator()->create_course();
$student = $this->getDataGenerator()->create_and_enrol($course, 'student');
$assign = $this->create_instance($course, [
'assignsubmission_onlinetext_enabled' => true,
]);
$this->setUser($student->id);
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
$result = $plugin->submission_is_empty((object) [
'onlinetext_editor' => [
'text' => $submissiontext,
],
]);
$this->assertTrue($result === $expected);
}
/**
* Test new_submission_empty
*
* @dataProvider submission_is_empty_testcases
* @param string $submissiontext The file submission data
* @param bool $expected The expected return value
*/
public function test_new_submission_empty($submissiontext, $expected): void {
$this->resetAfterTest();
$course = $this->getDataGenerator()->create_course();
$student = $this->getDataGenerator()->create_and_enrol($course, 'student');
$assign = $this->create_instance($course, [
'assignsubmission_onlinetext_enabled' => true,
]);
$this->setUser($student->id);
$result = $assign->new_submission_empty((object) [
'onlinetext_editor' => [
'text' => $submissiontext,
],
]);
$this->assertTrue($result === $expected);
}
/**
* Dataprovider for the test_submission_is_empty testcase
*
* @return array of testcases
*/
public function submission_is_empty_testcases() {
return [
'Empty submission string' => ['', true],
'Empty submission null' => [null, true],
'Value 0' => [0, false],
'String 0' => ['0', false],
'Text' => ['Ai! laurië lantar lassi súrinen, yéni únótimë ve rámar aldaron!', false],
'Image' => ['<img src="test.jpg" />', false],
'Video' => ['<video controls="true"><source src="test.mp4"></video>', false],
'Audio' => ['<audio controls="true"><source src="test.mp3"></audio>', false],
];
}
}
@@ -0,0 +1,217 @@
<?php
// 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/>.
/**
* Unit tests for assignsubmission_onlinetext.
*
* @package assignsubmission_onlinetext
* @copyright 2018 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace assignsubmission_onlinetext\privacy;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/mod/assign/tests/privacy/provider_test.php');
/**
* Unit tests for mod/assign/submission/onlinetext/classes/privacy/
*
* @copyright 2018 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class provider_test extends \mod_assign\privacy\provider_test {
/**
* Convenience function for creating feedback data.
*
* @param object $assign assign object
* @param stdClass $student user object
* @param string $text Submission text.
* @return array Submission plugin object and the submission object.
*/
protected function create_online_submission($assign, $student, $text) {
global $CFG;
$this->setUser($student->id);
$submission = $assign->get_user_submission($student->id, true);
$data = new \stdClass();
$data->onlinetext_editor = array(
'itemid' => file_get_unused_draft_itemid(),
'text' => $text,
'format' => FORMAT_PLAIN
);
$submission = $assign->get_user_submission($student->id, true);
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
$plugin->save($submission, $data);
return [$plugin, $submission];
}
/**
* Quick test to make sure that get_metadata returns something.
*/
public function test_get_metadata(): void {
$collection = new \core_privacy\local\metadata\collection('assignsubmission_onlinetext');
$collection = \assignsubmission_onlinetext\privacy\provider::get_metadata($collection);
$this->assertNotEmpty($collection);
}
/**
* Test that submission files and text are exported for a user.
*/
public function test_export_submission_user_data(): void {
$this->resetAfterTest();
// Create course, assignment, submission, and then a feedback comment.
$course = $this->getDataGenerator()->create_course();
// Student.
$user1 = $this->getDataGenerator()->create_user();
$this->getDataGenerator()->enrol_user($user1->id, $course->id, 'student');
$assign = $this->create_instance(['course' => $course]);
$context = $assign->get_context();
$submissiontext = 'Just some text';
list($plugin, $submission) = $this->create_online_submission($assign, $user1, $submissiontext);
$writer = \core_privacy\local\request\writer::with_context($context);
$this->assertFalse($writer->has_any_data());
// The student should have some text submitted.
$exportdata = new \mod_assign\privacy\assign_plugin_request_data($context, $assign, $submission, ['Attempt 1']);
\assignsubmission_onlinetext\privacy\provider::export_submission_user_data($exportdata);
$this->assertEquals($submissiontext, $writer->get_data(['Attempt 1',
get_string('privacy:path', 'assignsubmission_onlinetext')])->text);
}
/**
* Test that all submission files are deleted for this context.
*/
public function test_delete_submission_for_context(): void {
$this->resetAfterTest();
// Create course, assignment, submission, and then a feedback comment.
$course = $this->getDataGenerator()->create_course();
// Student.
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$this->getDataGenerator()->enrol_user($user1->id, $course->id, 'student');
$this->getDataGenerator()->enrol_user($user2->id, $course->id, 'student');
$assign = $this->create_instance(['course' => $course]);
$context = $assign->get_context();
$studenttext = 'Student one\'s text.';
list($plugin, $submission) = $this->create_online_submission($assign, $user1, $studenttext);
$studenttext2 = 'Student two\'s text.';
list($plugin2, $submission2) = $this->create_online_submission($assign, $user2, $studenttext2);
// Only need the context and assign object in this plugin for this operation.
$requestdata = new \mod_assign\privacy\assign_plugin_request_data($context, $assign);
\assignsubmission_onlinetext\privacy\provider::delete_submission_for_context($requestdata);
// This checks that there is no content for these submissions.
$this->assertTrue($plugin->is_empty($submission));
$this->assertTrue($plugin2->is_empty($submission2));
}
/**
* Test that the comments for a user are deleted.
*/
public function test_delete_submission_for_userid(): void {
$this->resetAfterTest();
// Create course, assignment, submission, and then a feedback comment.
$course = $this->getDataGenerator()->create_course();
// Student.
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$this->getDataGenerator()->enrol_user($user1->id, $course->id, 'student');
$this->getDataGenerator()->enrol_user($user2->id, $course->id, 'student');
$assign = $this->create_instance(['course' => $course]);
$context = $assign->get_context();
$studenttext = 'Student one\'s text.';
list($plugin, $submission) = $this->create_online_submission($assign, $user1, $studenttext);
$studenttext2 = 'Student two\'s text.';
list($plugin2, $submission2) = $this->create_online_submission($assign, $user2, $studenttext2);
// Need more data for this operation.
$requestdata = new \mod_assign\privacy\assign_plugin_request_data($context, $assign, $submission, [], $user1);
\assignsubmission_onlinetext\privacy\provider::delete_submission_for_userid($requestdata);
// This checks that there is no content for the first submission.
$this->assertTrue($plugin->is_empty($submission));
// But there is for the second submission.
$this->assertFalse($plugin2->is_empty($submission2));
}
public function test_delete_submissions(): void {
global $DB;
$this->resetAfterTest();
$course = $this->getDataGenerator()->create_course();
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$user3 = $this->getDataGenerator()->create_user();
// Only makes submissions in the second assignment.
$user4 = $this->getDataGenerator()->create_user();
$this->getDataGenerator()->enrol_user($user1->id, $course->id, 'student');
$this->getDataGenerator()->enrol_user($user2->id, $course->id, 'student');
$this->getDataGenerator()->enrol_user($user3->id, $course->id, 'student');
$this->getDataGenerator()->enrol_user($user4->id, $course->id, 'student');
$assign1 = $this->create_instance(['course' => $course]);
$assign2 = $this->create_instance(['course' => $course]);
$context1 = $assign1->get_context();
$context2 = $assign2->get_context();
$student1text = 'Student one\'s text.';
list($plugin1, $submission1) = $this->create_online_submission($assign1, $user1, $student1text);
$student2text = 'Student two\'s text.';
list($plugin2, $submission2) = $this->create_online_submission($assign1, $user2, $student2text);
$student3text = 'Student two\'s text.';
list($plugin3, $submission3) = $this->create_online_submission($assign1, $user3, $student3text);
// Now for submissions in assignment two.
$student3text2 = 'Student two\'s text for the second assignment.';
list($plugin4, $submission4) = $this->create_online_submission($assign2, $user3, $student3text2);
$student4text = 'Student four\'s text.';
list($plugin5, $submission5) = $this->create_online_submission($assign2, $user4, $student4text);
$data = $DB->get_records('assignsubmission_onlinetext', ['assignment' => $assign1->get_instance()->id]);
$this->assertCount(3, $data);
// Delete the submissions for user 1 and 3.
$requestdata = new \mod_assign\privacy\assign_plugin_request_data($context1, $assign1);
$requestdata->set_userids([$user1->id, $user2->id]);
$requestdata->populate_submissions_and_grades();
\assignsubmission_onlinetext\privacy\provider::delete_submissions($requestdata);
// There should only be one record left for assignment one.
$data = $DB->get_records('assignsubmission_onlinetext', ['assignment' => $assign1->get_instance()->id]);
$this->assertCount(1, $data);
// Check that the second assignment has not been touched.
$data = $DB->get_records('assignsubmission_onlinetext', ['assignment' => $assign2->get_instance()->id]);
$this->assertCount(2, $data);
}
}
@@ -0,0 +1,29 @@
<?php
// 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/>.
/**
* This file contains the version information for the onlinetext submission plugin
*
* @package assignsubmission_onlinetext
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2024042200;
$plugin->requires = 2024041600;
$plugin->component = 'assignsubmission_onlinetext';