From 4eab2e7fbbf652cadcd3a75a37e575053a16f480 Mon Sep 17 00:00:00 2001 From: David Mudrak Date: Mon, 4 Jan 2010 17:34:08 +0000 Subject: [PATCH] MDL-17827 workshop: initial check in of the files Exported from David's git repository --- mod/workshop/db/install.xml | 178 ++++++++ mod/workshop/editgradingform.php | 118 +++++ .../edit_accumulative_strategy_form.php | 93 ++++ mod/workshop/grading/edit_strategy_form.php | 154 +++++++ mod/workshop/icon.gif | Bin 0 -> 127 bytes mod/workshop/index.php | 106 +++++ mod/workshop/lang/en_utf8/workshop.php | 113 +++++ mod/workshop/lib.php | 423 ++++++++++++++++++ mod/workshop/mod_form.php | 233 ++++++++++ mod/workshop/settings.php | 49 ++ mod/workshop/simpletest/testlib.php | 52 +++ mod/workshop/version.php | 32 ++ mod/workshop/view.php | 88 ++++ 13 files changed, 1639 insertions(+) create mode 100644 mod/workshop/db/install.xml create mode 100644 mod/workshop/editgradingform.php create mode 100644 mod/workshop/grading/accumulative/edit_accumulative_strategy_form.php create mode 100644 mod/workshop/grading/edit_strategy_form.php create mode 100644 mod/workshop/icon.gif create mode 100644 mod/workshop/index.php create mode 100644 mod/workshop/lang/en_utf8/workshop.php create mode 100644 mod/workshop/lib.php create mode 100644 mod/workshop/mod_form.php create mode 100644 mod/workshop/settings.php create mode 100644 mod/workshop/simpletest/testlib.php create mode 100644 mod/workshop/version.php create mode 100644 mod/workshop/view.php diff --git a/mod/workshop/db/install.xml b/mod/workshop/db/install.xml new file mode 100644 index 0000000000..1600009e21 --- /dev/null +++ b/mod/workshop/db/install.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + +
+
+
diff --git a/mod/workshop/editgradingform.php b/mod/workshop/editgradingform.php new file mode 100644 index 0000000000..860c062196 --- /dev/null +++ b/mod/workshop/editgradingform.php @@ -0,0 +1,118 @@ +. + + +/** + * Edit grading form in for a particular instance of workshop + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once(dirname(dirname(dirname(__FILE__))).'/config.php'); +require_once(dirname(__FILE__).'/lib.php'); + +$id = optional_param('id', 0, PARAM_INT); // course_module ID, or +$a = optional_param('a', 0, PARAM_INT); // workshop instance ID + +if ($id) { + if (! $cm = get_coursemodule_from_id('workshop', $id)) { + error('Course Module ID was incorrect'); + } + + if (! $course = $DB->get_record('course', array('id' => $cm->course))) { + error('Course is misconfigured'); + } + + if (! $workshop = $DB->get_record('workshop', array('id' => $cm->instance))) { + error('Course module is incorrect'); + } + +} else if ($a) { + if (! $workshop = $DB->get_record('workshop', array('id' => $a))) { + error('Course module is incorrect'); + } + if (! $course = $DB->get_record('course', array('id' => $workshop->course))) { + error('Course is misconfigured'); + } + if (! $cm = get_coursemodule_from_instance('workshop', $workshop->id, $course->id)) { + error('Course Module ID was incorrect'); + } + +} else { + error('You must specify a course_module ID or an instance ID'); +} + +require_login($course, true, $cm); + +add_to_log($course->id, "workshop", "editgradingform", "editgradingform.php?id=$cm->id", "$workshop->id"); + +// where should the user be sent in case of error of canceling +$returnurl = "{$CFG->wwwroot}/mod/workshop/view.php?id={$cm->id}"; +$selfurl = "{$CFG->wwwroot}/mod/workshop/editgradingform.php?id={$cm->id}"; + +// todo +$dimensions = $DB->get_records('workshop_forms_accumulative', array('workshopid' => $workshop->id), 'sort'); + +// load the form to edit the grading strategy dimensions +$strategylib = dirname(__FILE__) . '/grading/' . $workshop->strategy . '/edit_' . $workshop->strategy . '_strategy_form.php'; +if (file_exists($strategylib)) { + require_once($strategylib); +} else { + print_error('errloadingstrategylib', 'workshop', $returnurl); +} +$classname = 'workshop_edit_' . $workshop->strategy . '_strategy_form'; +$mform = new $classname($selfurl, true, count($dimensions)); + +// initialize form data +$formdata = new stdClass; +$formdata->workshopid = $workshop->id; +$formdata->strategy = $workshop->strategy; +$formdata->dimensions = $dimensions; +$mform->set_data($formdata); + +if ($mform->is_cancelled()) { + redirect($returnurl); +} elseif ($data = $mform->get_data()) { + print_object($data); die(); +} + +// build the navigation and the header +$navlinks = array(); +$navlinks[] = array('name' => get_string('modulenameplural', 'workshop'), + 'link' => "index.php?id=$course->id", + 'type' => 'activity'); +$navlinks[] = array('name' => format_string($workshop->name), + 'link' => "view.php?id=$cm->id", + 'type' => 'activityinstance'); +$navlinks[] = array('name' => get_string('editinggradingform', 'workshop'), + 'link' => '', + 'type' => 'title'); +$navigation = build_navigation($navlinks); + +// OUTPUT STARTS HERE + +print_header_simple(format_string($workshop->name), '', $navigation, '', '', true, + update_module_button($cm->id, $course->id, get_string('modulename', 'workshop')), navmenu($course, $cm)); + +print_heading(get_string('strategy' . $workshop->strategy, 'workshop')); + +$mform->display(); + +/// Finish the page +print_footer($course); diff --git a/mod/workshop/grading/accumulative/edit_accumulative_strategy_form.php b/mod/workshop/grading/accumulative/edit_accumulative_strategy_form.php new file mode 100644 index 0000000000..42b12a3749 --- /dev/null +++ b/mod/workshop/grading/accumulative/edit_accumulative_strategy_form.php @@ -0,0 +1,93 @@ +. + + +/** + * This file defines an mform to edit accumulative grading strategy forms. + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +if (!defined('MOODLE_INTERNAL')) { + die('Direct access to this script is forbidden.'); // It must be included from a Moodle page +} + +require_once(dirname(dirname(__FILE__)).'/edit_strategy_form.php'); // parent class definition + + +/** + * Class for editing accumulative grading strategy forms. + * + * @uses moodleform + */ +class workshop_edit_accumulative_strategy_form extends workshop_edit_strategy_form { + + /** + * Define the elements to be displayed at the form + * + * Called by the parent::definition() + * + * @access protected + * @return void + */ + protected function definition_inner(&$mform) { + + $gradeoptions = array(20 => 20, 10 => 10, 5 => 5); + $weights = workshop_get_dimension_weights(); + + $repeated = array(); + $repeated[] =& $mform->createElement('hidden', 'dimensionid', 0); + $repeated[] =& $mform->createElement('header', 'dimension', get_string('dimension', 'workshop')); + $repeated[] =& $mform->createElement('textarea', 'description', + get_string('dimensiondescription', 'workshop'), array('cols'=>60)); + $repeated[] =& $mform->createElement('select', 'grade', get_string('grade'), $gradeoptions); + $repeated[] =& $mform->createElement('select', 'weight', get_string('dimensionweight', 'workshop'), $weights); + + $repeatedoptions = array(); + $repeatedoptions['description']['type'] = PARAM_CLEANHTML; + $repeatedoptions['description']['helpbutton'] = array('dimensiondescription', + get_string('dimensiondescription', 'workshop'), 'workshop'); + $repeatedoptions['grade']['default'] = 10; + $repeatedoptions['weight']['default'] = 1; + + $numofdimensionstoadd = 2; + $numofinitialdimensions = 3; + $numofdisplaydimensions = max($this->numofdimensions + $numofdimensionstoadd, $numofinitialdimensions); + $this->repeat_elements($repeated, $numofdisplaydimensions, $repeatedoptions, 'numofdimensions', 'adddimensions', $numofdimensionstoadd, get_string('addmoredimensionblanks', 'workshop', $numofdimensionstoadd)); + } + + + /** + * Return the mapping of the db fields to the form fields for every dimension of assessment + * + * @access protected + * @return array Array ['field_db_name' => 'field_form_name'] + */ + protected function get_dimension_fieldnames() { + return array( + 'id' => 'dimensionid', + 'description' => 'description', + 'descriptionformat' => 'descriptionformat', + 'grade' => 'grade', + 'weight' => 'weight', + ); + } + + +} diff --git a/mod/workshop/grading/edit_strategy_form.php b/mod/workshop/grading/edit_strategy_form.php new file mode 100644 index 0000000000..4aa732ddfc --- /dev/null +++ b/mod/workshop/grading/edit_strategy_form.php @@ -0,0 +1,154 @@ +. + + +/** + * This file defines a base class for all grading strategy editing forms. + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +if (!defined('MOODLE_INTERNAL')) { + die('Direct access to this script is forbidden.'); // It must be included from a Moodle page +} + +require_once($CFG->libdir . '/formslib.php'); // parent class definition + + +/** + * Base class for editing all the strategy grading forms. + * + * This defines the common fields that all strategy grading forms need. + * Strategies should define their own class that inherits from this one, and + * implements the definition_inner() method. + * + * @uses moodleform + */ +class workshop_edit_strategy_form extends moodleform { + + /** + * Number of dimensions that are populated from DB + * + * @var mixed + * @access protected + */ + protected $numofdimensions; + + /** + * Constructor + * + * @param str $actionurl URL to handle data + * @param bool $editable Should the form be editable? + * @param int $initialdimensions Number of assessment dimensions that are already filled + * @access public + * @return void + */ + public function __construct($actionurl, $editable=true, $initialdimensions=0) { + + $this->numofdimensions = $initialdimensions; + parent::moodleform($actionurl, null, 'post', '', array('class' => 'editstrategyform'), $editable); + } + + + /** + * Add the fields that are common for all grading strategies. + * + * If the strategy does not support all these fields, then you can override + * this method and remove the ones you don't want with + * $mform->removeElement(). + * Stretegy subclassess should define their own fields in definition_inner() + * + * @access public + * @return void + */ + public function definition() { + global $CFG; + + $mform = $this->_form; + + $mform->addElement('hidden', 'workshopid'); + $mform->setType('id', PARAM_INT); + + $mform->addElement('hidden', 'strategy'); + $mform->setType('id', PARAM_ALPHA); + + $this->definition_inner($mform); + + if (!empty($CFG->usetags)) { + $mform->addElement('header', 'tagsheader', get_string('tags')); + $mform->addElement('tags', 'tags', get_string('tags')); + } + + $buttonarray = array(); + $buttonarray[] = &$mform->createElement('submit', 'submitbutton', get_string('savechanges')); + $buttonarray[] = &$mform->createElement('cancel'); + $mform->addGroup($buttonarray, 'buttonar', '', array(' '), false); + $mform->closeHeaderBefore('buttonar'); + } + + + /** + * Add any strategy specific form fields. + * + * @param object $mform the form being built. + */ + protected function definition_inner(&$mform) { + // By default, do nothing. + } + + + /** + * Set the form data before it is displayed + * + * Strategy plugins should provide the list of fields to be mapped from + * DB record to the form fields in their get_dimension_fieldnames() method + * + * @param object $formdata Should contain the array $formdata->dimensions + * @access public + * @return void + */ + public function set_data($formdata) { + + if (is_array($formdata->dimensions) && !empty($formdata->dimensions)) { + // $formdata->dimensions must be array of dimension records loaded from database + $key = 0; + $default_values = array(); + foreach ($formdata->dimensions as $dimension) { + foreach ($this->get_dimension_fieldnames() as $fielddbname => $fieldformname) { + $default_values[$fieldformname . '[' . $key . ']'] = $dimension->$fielddbname; + } + $key++; + } + $formdata = (object)((array)$formdata + $default_values); + } + parent::set_data($formdata); + } + + + /** + * Return the mapping of the db fields to the form fields for every assessment dimension + * + * @access protected + * @return array Array ['field_db_name' => 'field_form_name'] + */ + protected function get_dimension_fieldnames() { + return array(); + } + +} diff --git a/mod/workshop/icon.gif b/mod/workshop/icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9ffc4d3d1785d9f9396d65aaf15ec5088c9a235 GIT binary patch literal 127 zcmZ?wbhEHb6krfwSj5V3W@Z`#1H=FS|IeHOGL3-@AQuP}f3h$#Ft9S{fH)wv49qSP zyJWuVcX+OBcI~^nYfI<~j@t{SE;VRccy;27WlSZ1D@*O3J2. + + +/** + * This is a one-line short description of the file + * + * You can have a rather longer description of the file as well, + * if you like, and it can span multiple lines. + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +/// Replace workshop with the name of your module and remove this line + +require_once(dirname(dirname(dirname(__FILE__))).'/config.php'); +require_once(dirname(__FILE__).'/lib.php'); + +$id = required_param('id', PARAM_INT); // course + +if (! $course = $DB->get_record('course', array('id' => $id))) { + error('Course ID is incorrect'); +} + +require_course_login($course); + +add_to_log($course->id, 'workshop', 'view all', "index.php?id=$course->id", ''); + + +/// Get all required stringsworkshop + +$strworkshops = get_string('modulenameplural', 'workshop'); +$strworkshop = get_string('modulename', 'workshop'); + + +/// Print the header + +$navlinks = array(); +$navlinks[] = array('name' => $strworkshops, 'link' => '', 'type' => 'activity'); +$navigation = build_navigation($navlinks); + +print_header_simple($strworkshops, '', $navigation, '', '', true, '', navmenu($course)); + +/// Get all the appropriate data + +if (! $workshops = get_all_instances_in_course('workshop', $course)) { + notice('There are no workshops', "../../course/view.php?id=$course->id"); + die; +} + +/// Print the list of instances (your module will probably extend this) + +$timenow = time(); +$strname = get_string('name'); +$strweek = get_string('week'); +$strtopic = get_string('topic'); + +if ($course->format == 'weeks') { + $table->head = array ($strweek, $strname); + $table->align = array ('center', 'left'); +} else if ($course->format == 'topics') { + $table->head = array ($strtopic, $strname); + $table->align = array ('center', 'left', 'left', 'left'); +} else { + $table->head = array ($strname); + $table->align = array ('left', 'left', 'left'); +} + +foreach ($workshops as $workshop) { + if (!$workshop->visible) { + //Show dimmed if the mod is hidden + $link = "coursemodule\">$workshop->name"; + } else { + //Show normal if the mod is visible + $link = "coursemodule\">$workshop->name"; + } + + if ($course->format == 'weeks' or $course->format == 'topics') { + $table->data[] = array ($workshop->section, $link); + } else { + $table->data[] = array ($link); + } +} + +print_heading($strworkshops); +print_table($table); + +/// Finish the page + +print_footer($course); diff --git a/mod/workshop/lang/en_utf8/workshop.php b/mod/workshop/lang/en_utf8/workshop.php new file mode 100644 index 0000000000..82312478cd --- /dev/null +++ b/mod/workshop/lang/en_utf8/workshop.php @@ -0,0 +1,113 @@ +. + + +/** + * English strings for Workshop module + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$string['accesscontrol'] = 'Access control'; +$string['addmoredimensionblanks'] = 'Blanks for $a more dimensions'; +$string['agreeassessments'] = 'Assessments must be agreed'; +$string['agreeassessmentsdesc'] = 'Authors may comment assessments of their work and agree/disagree with it'; +$string['anonymity'] = 'Anonymity mode'; +$string['anonymityauthors'] = 'Reviewers can\'t see authors\' names'; +$string['anonymityboth'] = 'Fully anonymous'; +$string['anonymitynone'] = 'Not anonymous'; +$string['anonymityreviewers'] = 'Authors can\'t see reviewers\' names'; +$string['assessallexamples'] = 'Assess all examples'; +$string['assessmentcomps'] = 'Required level of assessments similarity'; +$string['assessmentend'] = 'End of assessment phase'; +$string['assessmentsettings'] = 'Assessment settings'; +$string['assessmentstart'] = 'Start of assessment phase'; +$string['assesswosubmission'] = 'Assess without submission'; +$string['assesswosubmissiondesc'] = 'Users can assess peers even without their own submission'; +$string['comparisonhigh'] = 'High'; +$string['comparisonlow'] = 'Low'; +$string['comparisonnormal'] = 'Normal'; +$string['comparisonveryhigh'] = 'Very high'; +$string['comparisonverylow'] = 'Very low'; +$string['configanonymity'] = 'Default anonymity mode in workshops'; +$string['configassessmentcomps'] = 'Default value of the setting that influences the calculation of the grade for assessment.'; +$string['configexamplesmode'] = 'Default mode of examples assessment in workshops'; +$string['configgrade'] = 'Default maximum grade for submission in workshops'; +$string['configgradinggrade'] = 'Default maximum grade for assessment in workshops'; +$string['configmaxbytes'] = 'Default maximum submission file size for all workshops on the site (subject to course limits and other local settings)'; +$string['confignexassessments'] = 'Default number of examples to be reviewed by a user in the example assessment phase'; +$string['confignsassessments'] = 'Default number of allocated submissions to be reviewed by a user in the assessment phase'; +$string['configstrategy'] = 'Default grading strategy for workshops'; +$string['editgradingform'] = 'Edit grading form'; +$string['editinggradingform'] = 'Editing grading form'; +$string['dimensiondescription'] = 'Dimension description'; +$string['dimensionweight'] = 'Dimension weight'; +$string['dimension'] = 'Dimension of assessment'; +$string['examplesbeforeassessment'] = 'Examples are available after own submission and must be assessed before peer/self assessment phase'; +$string['examplesbeforesubmission'] = 'Examples must be assessed before own submission'; +$string['examplesmode'] = 'Mode of examples assessment'; +$string['examplesvoluntary'] = 'Assessment of example submission is voluntary'; +$string['gradeforassessment'] = 'Grade for assessment'; +$string['gradeforsubmission'] = 'Grade for submission'; +$string['gradingsettings'] = 'Grading settings'; +$string['hidegradesdesc'] = 'If assessments must be agreed, should the grades be hidden from the author? If grades are hidden, authors can see only comments'; +$string['hidegrades'] = 'Hide grades before agreement'; +$string['introduction'] = 'Introduction'; +$string['latesubmissionsdesc'] = 'Allow submitting the work after the deadline'; +$string['latesubmissions'] = 'Late submissions'; +$string['maxbytes'] = 'Maximum file size'; +$string['modulenameplural'] = 'Workshops'; +$string['modulename'] = 'Workshop'; +$string['nattachments'] = 'Number of required submission attachments'; +$string['nexassessments'] = 'Number of required assessments of examples'; +$string['nsassessments'] = 'Number of required assessments of other users\' work'; +$string['releasegrades'] = 'Push final grades into the gradebook'; +$string['requirepassword'] = 'Require password'; +$string['strategyaccumulative'] = 'Accumulative grading'; +$string['strategyerrorbanded'] = 'Error banded grading'; +$string['strategy'] = 'Grading strategy'; +$string['strategynograding'] = 'No grading'; +$string['strategyrubric'] = 'Rubric grading'; +$string['submissionend'] = 'End of submission phase'; +$string['submissionsettings'] = 'Submission settings'; +$string['submissionstart'] = 'Start of submission phase'; +$string['teacherweight'] = 'Weight of the teacher\'s assessments'; +$string['useexamplesdesc'] = 'Users practise evaluating on example submissions'; +$string['useexamples'] = 'Use examples'; +$string['usepeerassessmentdesc'] = 'Users perform peer assessment of others\' work'; +$string['usepeerassessment'] = 'Use peer assessment'; +$string['useselfassessmentdesc'] = 'Users perform self assessment of their own work'; +$string['useselfassessment'] = 'Use self assessment'; +$string['workshopfeatures'] = 'Workshop features'; +$string['workshopname'] = 'Workshop name'; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; +$string[''] = ''; diff --git a/mod/workshop/lib.php b/mod/workshop/lib.php new file mode 100644 index 0000000000..9be5f0b531 --- /dev/null +++ b/mod/workshop/lib.php @@ -0,0 +1,423 @@ +. + + +/** + * Library of interface functions and constants for module workshop + * + * All the core Moodle functions, neeeded to allow the module to work + * integrated in Moodle should be placed here. + * All the workshop specific functions, needed to implement all the module + * logic, should go to locallib.php. This will help to save some memory when + * Moodle is performing actions across all modules. + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + + +/** + * The internal codes of the anonymity levels + */ +define('WORKSHOP_ANONYMITY_NONE', 0); /* not anonymous */ +define('WORKSHOP_ANONYMITY_AUTHORS', 1); /* authors hidden from reviewers */ +define('WORKSHOP_ANONYMITY_REVIEWERS', 2); /* reviewers hidden from authors */ +define('WORKSHOP_ANONYMITY_BOTH', 3); /* fully anonymous */ + + +/** + * The internal codes of the example assessment modes + */ +define('WORKSHOP_EXAMPLES_VOLUNTARY', 0); +define('WORKSHOP_EXAMPLES_BEFORE_SUBMISSION', 1); +define('WORKSHOP_EXAMPLES_BEFORE_ASSESSMENT', 2); + + +/** + * The internal codes of the required level of assessment similarity + */ +define('WORKSHOP_COMPARISON_VERYLOW', 0); /* f = 1.00 */ +define('WORKSHOP_COMPARISON_LOW', 1); /* f = 1.67 */ +define('WORKSHOP_COMPARISON_NORMAL', 2); /* f = 2.50 */ +define('WORKSHOP_COMPARISON_HIGH', 3); /* f = 3.00 */ +define('WORKSHOP_COMPARISON_VERYHIGH', 4); /* f = 5.00 */ + + +/** + * Given an object containing all the necessary data, + * (defined by the form in mod_form.php) this function + * will create a new instance and return the id number + * of the new instance. + * + * @param object $workshop An object from the form in mod_form.php + * @return int The id of the newly inserted workshop record + */ +function workshop_add_instance($workshop) { + global $DB; + + $workshop->timecreated = time(); + $workshop->timemodified = $workshop->timecreated; + + return $DB->insert_record('workshop', $workshop); +} + + +/** + * Given an object containing all the necessary data, + * (defined by the form in mod_form.php) this function + * will update an existing instance with new data. + * + * @param object $workshop An object from the form in mod_form.php + * @return boolean Success/Fail + */ +function workshop_update_instance($workshop) { + global $DB; + + $workshop->timemodified = time(); + $workshop->id = $workshop->instance; + + return $DB->update_record('workshop', $workshop); +} + + +/** + * Given an ID of an instance of this module, + * this function will permanently delete the instance + * and any data that depends on it. + * + * @param int $id Id of the module instance + * @return boolean Success/Failure + */ +function workshop_delete_instance($id) { + global $DB; + + if (! $workshop = $DB->get_record('workshop', array('id' => $id))) { + return false; + } + + $result = true; + + # Delete any dependent records here # + + if (! $DB->delete_records('workshop', array('id' => $workshop->id))) { + $result = false; + } + + return $result; +} + + +/** + * Return a small object with summary information about what a + * user has done with a given particular instance of this module + * Used for user activity reports. + * $return->time = the time they did it + * $return->info = a short text description + * + * @return null + * @todo Finish documenting this function + */ +function workshop_user_outline($course, $user, $mod, $workshop) { + $return = new stdClass; + $return->time = 0; + $return->info = ''; + return $return; +} + + +/** + * Print a detailed representation of what a user has done with + * a given particular instance of this module, for user activity reports. + * + * @return boolean + * @todo Finish documenting this function + */ +function workshop_user_complete($course, $user, $mod, $workshop) { + return true; +} + + +/** + * Given a course and a time, this module should find recent activity + * that has occurred in workshop activities and print it out. + * Return true if there was output, or false is there was none. + * + * @return boolean + * @todo Finish documenting this function + */ +function workshop_print_recent_activity($course, $isteacher, $timestart) { + return false; // True if anything was printed, otherwise false +} + + +/** + * Function to be run periodically according to the moodle cron + * This function searches for things that need to be done, such + * as sending out mail, toggling flags etc ... + * + * @return boolean + * @todo Finish documenting this function + **/ +function workshop_cron () { + return true; +} + + +/** + * Must return an array of user records (all data) who are participants + * for a given instance of workshop. Must include every user involved + * in the instance, independient of his role (student, teacher, admin...) + * See other modules as example. + * + * @param int $workshopid ID of an instance of this module + * @return mixed boolean/array of students + */ +function workshop_get_participants($workshopid) { + return false; +} + + +/** + * This function returns if a scale is being used by one workshop + * if it has support for grading and scales. Commented code should be + * modified if necessary. See forum, glossary or journal modules + * as reference. + * + * @param int $workshopid ID of an instance of this module + * @return mixed + * @todo Finish documenting this function + */ +function workshop_scale_used($workshopid, $scaleid) { + $return = false; + + //$rec = get_record("workshop","id","$workshopid","scale","-$scaleid"); + // + //if (!empty($rec) && !empty($scaleid)) { + // $return = true; + //} + + return $return; +} + + +/** + * Checks if scale is being used by any instance of workshop. + * This function was added in 1.9 + * + * This is used to find out if scale used anywhere + * @param $scaleid int + * @return boolean True if the scale is used by any workshop + */ +function workshop_scale_used_anywhere($scaleid) { + if ($scaleid and record_exists('workshop', 'grade', -$scaleid)) { + return true; + } else { + return false; + } +} + + +/** + * Execute post-install custom actions for the module + * This function was added in 1.9 + * + * @return boolean true if success, false on error + */ +function workshop_install() { + return true; +} + + +/** + * Execute post-uninstall custom actions for the module + * This function was added in 1.9 + * + * @return boolean true if success, false on error + */ +function workshop_uninstall() { + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Other functions needed by Moodle core follows. They can't be put into // +// locallib.php because they are used by some core scripts (like modedit.php) // +// where locallib.php is not included. // +//////////////////////////////////////////////////////////////////////////////// + +/** + * Return an array of numeric values that can be used as maximum grades + * + * Used at several places where maximum grade for submission and grade for + * assessment are defined via a HTML select form element. By default it returns + * an array 0, 1, 2, ..., 98, 99, 100. + * + * @access public + * @return array Array of integers + */ +function workshop_get_maxgrades() { + + $grades = array(); + for ($i=100; $i>=0; $i--) { + $grades[$i] = $i; + } + return $grades; +} + + +/** + * Return an array of possible numbers of assessments to be done + * + * Should always contain numbers 1, 2, 3, ... 10 and possibly others up to a reasonable value + * + * @return array Array of integers + */ +function workshop_get_numbers_of_assessments() { + + $options = array(); + $options[30] = 30; + $options[20] = 20; + $options[15] = 15; + for ($i=10; $i>0; $i--) { + $options[$i] = $i; + } + return $options; +} + + +/** + * Return an array of possible values for weight of teacher assessment + * + * @return array Array of integers 0, 1, 2, ..., 10 + */ +function workshop_get_teacher_weights() { + + $weights = array(); + for ($i=10; $i>=0; $i--) { + $weights[$i] = $i; + } + return $weights; +} + + +/** + * Return an array of possible values of assessment dimension weight + * + * @return array Array of integers 0, 1, 2, ..., 16 + */ +function workshop_get_dimension_weights() { + + $weights = array(); + for ($i=16; $i>=0; $i--) { + $weights[$i] = $i; + } + return $weights; +} + + +/** + * Return an array of the localized grading strategy names + * + * @access public + * $return array Array ['string' => 'string'] + */ +function workshop_get_strategies() { + + $installed = get_list_of_plugins('mod/workshop/grading'); + $forms = array(); + foreach ($installed as $strategy) { + $forms[$strategy] = get_string('strategy' . $strategy, 'workshop'); + } + + return $forms; +} + + +/** + * Return an array of available anonymity modes + * + * @return array Array 'anonymity DB code'=>'anonymity mode name' + */ +function workshop_get_anonymity_modes() { + + $modes = array(); + $modes[WORKSHOP_ANONYMITY_NONE] = get_string('anonymitynone', 'workshop'); + $modes[WORKSHOP_ANONYMITY_AUTHORS] = get_string('anonymityauthors', 'workshop'); + $modes[WORKSHOP_ANONYMITY_REVIEWERS] = get_string('anonymityreviewers', 'workshop'); + $modes[WORKSHOP_ANONYMITY_BOTH] = get_string('anonymityboth', 'workshop'); + + return $modes; +} + + +/** + * Return an array of available example assessment modes + * + * @return array Array 'mode DB code'=>'mode name' + */ +function workshop_get_example_modes() { + + $modes = array(); + $modes[WORKSHOP_EXAMPLES_VOLUNTARY] = get_string('examplesvoluntary', 'workshop'); + $modes[WORKSHOP_EXAMPLES_BEFORE_SUBMISSION] = get_string('examplesbeforesubmission', 'workshop'); + $modes[WORKSHOP_EXAMPLES_BEFORE_ASSESSMENT] = get_string('examplesbeforeassessment', 'workshop'); + + return $modes; +} + + +/** + * Return array of assessment comparison levels + * + * The assessment comparison level influence how the grade for assessment is calculated. + * Each object in the returned array provides information about the name of the level + * and the value of the factor to be used in the calculation. + * The structure of the returned array is + * array[code int] of object ( + * ->name string, + * ->value number, + * ) + * where code if the integer code that is actually stored in the database. + * + * @return array Array of objects + */ +function workshop_get_comparison_levels() { + + $levels = array(); + + $levels[WORKSHOP_COMPARISON_VERYHIGH] = new stdClass; + $levels[WORKSHOP_COMPARISON_VERYHIGH]->name = get_string('comparisonveryhigh', 'workshop'); + $levels[WORKSHOP_COMPARISON_VERYHIGH]->value = 5.00; + + $levels[WORKSHOP_COMPARISON_HIGH] = new stdClass; + $levels[WORKSHOP_COMPARISON_HIGH]->name = get_string('comparisonhigh', 'workshop'); + $levels[WORKSHOP_COMPARISON_HIGH]->value = 3.00; + + $levels[WORKSHOP_COMPARISON_NORMAL] = new stdClass; + $levels[WORKSHOP_COMPARISON_NORMAL]->name = get_string('comparisonnormal', 'workshop'); + $levels[WORKSHOP_COMPARISON_NORMAL]->value = 2.50; + + $levels[WORKSHOP_COMPARISON_LOW] = new stdClass; + $levels[WORKSHOP_COMPARISON_LOW]->name = get_string('comparisonlow', 'workshop'); + $levels[WORKSHOP_COMPARISON_LOW]->value = 1.67; + + $levels[WORKSHOP_COMPARISON_VERYLOW] = new stdClass; + $levels[WORKSHOP_COMPARISON_VERYLOW]->name = get_string('comparisonverylow', 'workshop'); + $levels[WORKSHOP_COMPARISON_VERYLOW]->value = 1.00; + + return $levels; +} diff --git a/mod/workshop/mod_form.php b/mod/workshop/mod_form.php new file mode 100644 index 0000000000..e4473e6995 --- /dev/null +++ b/mod/workshop/mod_form.php @@ -0,0 +1,233 @@ +. + + +/** + * The main workshop configuration form + * + * The UI mockup has been proposed in MDL-18688 + * It uses the standard core Moodle formslib. For more info about them, please + * visit: http://docs.moodle.org/en/Development:lib/formslib.php + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once($CFG->dirroot.'/course/moodleform_mod.php'); + +class mod_workshop_mod_form extends moodleform_mod { + + function definition() { + + global $CFG, $COURSE; + $workshopconfig = get_config('workshop'); + $mform =& $this->_form; + +/// General -------------------------------------------------------------------- + $mform->addElement('header', 'general', get_string('general', 'form')); + + /// Workshop name + $label = get_string('workshopname', 'workshop'); + $mform->addElement('text', 'name', $label, array('size'=>'64')); + if (!empty($CFG->formatstringstriptags)) { + $mform->setType('name', PARAM_TEXT); + } else { + $mform->setType('name', PARAM_CLEAN); + } + $mform->addRule('name', null, 'required', null, 'client'); + $mform->addRule('name', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); + $mform->setHelpButton('name', array('workshopname', $label, 'workshop')); + + /// Introduction + $this->add_intro_editor(false, get_string('introduction', 'workshop')); + +/// Workshop features ---------------------------------------------------------- + $mform->addElement('header', 'workshopfeatures', get_string('workshopfeatures', 'workshop')); + + $label = get_string('useexamples', 'workshop'); + $text = get_string('useexamplesdesc', 'workshop'); + $mform->addElement('advcheckbox', 'useexamples', $label, $text); + $mform->setHelpButton('useexamples', array('useexamples', $label, 'workshop')); + + $label = get_string('usepeerassessment', 'workshop'); + $text = get_string('usepeerassessmentdesc', 'workshop'); + $mform->addElement('advcheckbox', 'usepeerassessment', $label, $text); + $mform->setHelpButton('usepeerassessment', array('usepeerassessment', $label, 'workshop')); + + $label = get_string('useselfassessment', 'workshop'); + $text = get_string('useselfassessmentdesc', 'workshop'); + $mform->addElement('advcheckbox', 'useselfassessment', $label, $text); + $mform->setHelpButton('useselfassessment', array('useselfassessment', $label, 'workshop')); + +/// Grading settings ----------------------------------------------------------- + $mform->addElement('header', 'gradingsettings', get_string('gradingsettings', 'workshop')); + + $grades = workshop_get_maxgrades(); + + $label = get_string('gradeforsubmission', 'workshop'); + $mform->addElement('select', 'grade', $label, $grades); + $mform->setDefault('grade', $workshopconfig->grade); + $mform->setHelpButton('grade', array('grade', $label, 'workshop')); + + $label = get_string('gradeforassessment', 'workshop'); + $mform->addElement('select', 'gradinggrade', $label , $grades); + $mform->setDefault('gradinggrade', $workshopconfig->gradinggrade); + $mform->setHelpButton('gradinggrade', array('gradinggrade', $label, 'workshop')); + + $label = get_string('strategy', 'workshop'); + $mform->addElement('select', 'strategy', $label, workshop_get_strategies()); + $mform->setDefault('strategy', $workshopconfig->strategy); + $mform->setHelpButton('strategy', array('strategy', $label, 'workshop')); + +/// Submission settings -------------------------------------------------------- + $mform->addElement('header', 'submissionsettings', get_string('submissionsettings', 'workshop')); + + $label = get_string('latesubmissions', 'workshop'); + $text = get_string('latesubmissionsdesc', 'workshop'); + $mform->addElement('advcheckbox', 'latesubmissions', $label, $text); + $mform->setHelpButton('latesubmissions', array('latesubmissions', $label, 'workshop')); + $mform->setAdvanced('latesubmissions'); + + $options = array(); + for ($i=7; $i>=0; $i--) { + $options[$i] = $i; + } + $label = get_string('nattachments', 'workshop'); + $mform->addElement('select', 'nattachments', $label, $options); + $mform->setDefault('nattachments', 1); + $mform->setHelpButton('nattachments', array('nattachments', $label, 'workshop')); + $mform->setAdvanced('nattachments'); + + $options = get_max_upload_sizes($CFG->maxbytes, $COURSE->maxbytes); + $options[0] = get_string('courseuploadlimit') . ' ('.display_size($COURSE->maxbytes).')'; + $mform->addElement('select', 'maxbytes', get_string('maximumsize', 'assignment'), $options); + $mform->setDefault('maxbytes', $workshopconfig->maxbytes); + $mform->setHelpButton('maxbytes', array('maxbytes', $label, 'workshop')); + $mform->setAdvanced('maxbytes'); + +/// Assessment settings + $mform->addElement('header', 'assessmentsettings', get_string('assessmentsettings', 'workshop')); + + $options = workshop_get_anonymity_modes(); + $label = get_string('anonymity', 'workshop'); + $mform->addElement('select', 'anonymity', $label, $options); + $mform->setDefault('anonymity', $workshopconfig->anonymity); + $mform->setHelpButton('anonymity', array('anonymity', $label, 'workshop')); + $mform->disabledIf('anonymity', 'usepeerassessment'); + + $label = get_string('nsassessments', 'workshop'); + $options = workshop_get_numbers_of_assessments(); + $mform->addElement('select', 'nsassessments', $label, $options); + $mform->setDefault('nsassessments', $workshopconfig->nsassessments); + $mform->setHelpButton('nsassessments', array('nsassessments', $label, 'workshop')); + + $label = get_string('nexassessments', 'workshop'); + $options = workshop_get_numbers_of_assessments(); + $options[0] = get_string('assessallexamples', 'workshop'); + $mform->addElement('select', 'nexassessments', $label, $options); + $mform->setDefault('nexassessments', $workshopconfig->nexassessments); + $mform->setHelpButton('nexassessments', array('nexassessments', $label, 'workshop')); + $mform->disabledIf('nexassessments', 'useexamples'); + + $label = get_string('assesswosubmission', 'workshop'); + $text = get_string('assesswosubmissiondesc', 'workshop'); + $mform->addElement('advcheckbox', 'assesswosubmission', $label, $text); + $mform->setHelpButton('assesswosubmission', array('assesswosubmission', $label, 'workshop')); + $mform->setAdvanced('assesswosubmission'); + + $label = get_string('examplesmode', 'workshop'); + $options = workshop_get_example_modes(); + $mform->addElement('select', 'examplesmode', $label, $options); + $mform->setDefault('examplesmode', $workshopconfig->examplesmode); + $mform->setHelpButton('examplesmode', array('examplesmode', $label, 'workshop')); + $mform->setAdvanced('examplesmode'); + + $label = get_string('teacherweight', 'workshop'); + $options = workshop_get_teacher_weights(); + $mform->addElement('select', 'teacherweight', $label, $options); + $mform->setDefault('teacherweight', 1); + $mform->setHelpButton('teacherweight', array('teacherweight', $label, 'workshop')); + $mform->setAdvanced('teacherweight'); + + $label = get_string('agreeassessments', 'workshop'); + $text = get_string('agreeassessmentsdesc', 'workshop'); + $mform->addElement('advcheckbox', 'agreeassessments', $label, $text); + $mform->setHelpButton('agreeassessments', array('agreeassessments', $label, 'workshop')); + $mform->setAdvanced('agreeassessments'); + + $label = get_string('hidegrades', 'workshop'); + $text = get_string('hidegradesdesc', 'workshop'); + $mform->addElement('advcheckbox', 'hidegrades', $label, $text); + $mform->setHelpButton('hidegrades', array('hidegrades', $label, 'workshop')); + $mform->setAdvanced('hidegrades'); + + $label = get_string('assessmentcomps', 'workshop'); + $levels = array(); + foreach (workshop_get_comparison_levels() as $code => $level) { + $levels[$code] = $level->name; + } + $mform->addElement('select', 'assessmentcomps', $label, $levels); + $mform->setDefault('assessmentcomps', $workshopconfig->assessmentcomps); + $mform->setHelpButton('assessmentcomps', array('assessmentcomps', $label, 'workshop')); + $mform->setAdvanced('assessmentcomps'); + +/// Access control + $mform->addElement('header', 'accesscontrol', get_string('accesscontrol', 'workshop')); + + $label = get_string('submissionstart', 'workshop'); + $mform->addElement('date_selector', 'submissionstart', $label, array('optional' => true)); + $mform->setHelpButton('submissionstart', array('submissionstart', $label, 'workshop')); + $mform->setAdvanced('submissionstart'); + + $label = get_string('submissionend', 'workshop'); + $mform->addElement('date_selector', 'submissionend', $label, array('optional' => true)); + $mform->setHelpButton('submissionend', array('submissionend', $label, 'workshop')); + $mform->setAdvanced('submissionend'); + + $label = get_string('assessmentstart', 'workshop'); + $mform->addElement('date_selector', 'assessmentstart', $label, array('optional' => true)); + $mform->setHelpButton('assessmentstart', array('assessmentstart', $label, 'workshop')); + $mform->setAdvanced('assessmentstart'); + + $label = get_string('assessmentend', 'workshop'); + $mform->addElement('date_selector', 'assessmentend', $label, array('optional' => true)); + $mform->setHelpButton('assessmentend', array('assessmentend', $label, 'workshop')); + $mform->setAdvanced('assessmentend'); + + $label = get_string('releasegrades', 'workshop'); + $mform->addElement('date_selector', 'releasegrades', $label, array('optional' => true)); + $mform->setHelpButton('releasegrades', array('releasegrades', $label, 'workshop')); + $mform->setAdvanced('releasegrades'); + + $label = get_string('requirepassword', 'workshop'); + $mform->addElement('passwordunmask', 'password', $label); + $mform->setType('quizpassword', PARAM_TEXT); + $mform->setHelpButton('password', array('requirepassword', $label, 'workshop')); + $mform->setAdvanced('password'); + + +/// Common module settinga, Restrict availability, Activity completion etc. ---- + // add standard elements, common to all modules + $this->standard_coursemodule_elements(); + +/// Save and close, Save, Cancel ----------------------------------------------- + // add standard buttons, common to all modules + $this->add_action_buttons(); + + } +} diff --git a/mod/workshop/settings.php b/mod/workshop/settings.php new file mode 100644 index 0000000000..e6672b3564 --- /dev/null +++ b/mod/workshop/settings.php @@ -0,0 +1,49 @@ +dirroot.'/mod/workshop/lib.php'); + +$grades = workshop_get_maxgrades(); + +$settings->add(new admin_setting_configselect('workshop/grade', get_string('gradeforsubmission', 'workshop'), + get_string('configgrade', 'workshop'), 80, $grades)); + +$settings->add(new admin_setting_configselect('workshop/gradinggrade', get_string('gradeforassessment', 'workshop'), + get_string('configgradinggrade', 'workshop'), 20, $grades)); + +$options = get_max_upload_sizes($CFG->maxbytes); +$options[0] = get_string('courseuploadlimit'); +$settings->add(new admin_setting_configselect('workshop/maxbytes', get_string('maxbytes', 'workshop'), + get_string('configmaxbytes', 'workshop'), 0, $options)); + +$settings->add(new admin_setting_configselect('workshop/strategy', get_string('strategy', 'workshop'), + get_string('configstrategy', 'workshop'), 'accumulative', workshop_get_strategies())); + +$options = workshop_get_anonymity_modes(); +$settings->add(new admin_setting_configselect('workshop/anonymity', get_string('anonymity', 'workshop'), + get_string('configanonymity', 'workshop'), WORKSHOP_ANONYMITY_NONE, $options)); + +$options = workshop_get_numbers_of_assessments(); +$settings->add(new admin_setting_configselect('workshop/nsassessments', get_string('nsassessments', 'workshop'), + get_string('confignsassessments', 'workshop'), 3, $options)); + +$options = workshop_get_numbers_of_assessments(); +$options[0] = get_string('assessallexamples', 'workshop'); +$settings->add(new admin_setting_configselect('workshop/nexassessments', get_string('nexassessments', 'workshop'), + get_string('confignexassessments', 'workshop'), 0, $options)); + +$options = workshop_get_example_modes(); +$settings->add(new admin_setting_configselect('workshop/examplesmode', get_string('examplesmode', 'workshop'), + get_string('configexamplesmode', 'workshop'), WORKSHOP_EXAMPLES_VOLUNTARY, $options)); + +$levels = array(); +foreach (workshop_get_comparison_levels() as $code => $level) { + $levels[$code] = $level->name; +} +$settings->add(new admin_setting_configselect('workshop/assessmentcomps', get_string('assessmentcomps', 'workshop'), + get_string('configassessmentcomps', 'workshop'), WORKSHOP_COMPARISON_NORMAL, $levels)); + +/* +$settings->add(new admin_setting_configcheckbox('assignment_showrecentsubmissions', get_string('showrecentsubmissions', 'assignment'), + get_string('configshowrecentsubmissions', 'assignment'), 1)); +*/ +?> diff --git a/mod/workshop/simpletest/testlib.php b/mod/workshop/simpletest/testlib.php new file mode 100644 index 0000000000..93ef989079 --- /dev/null +++ b/mod/workshop/simpletest/testlib.php @@ -0,0 +1,52 @@ +. + + +/** + * Unit tests for (some of) mod/workshop/lib.php + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +if (!defined('MOODLE_INTERNAL')) { + die('Direct access to this script is forbidden.'); // It must be included from a Moodle page +} + +// Make sure the code being tested is accessible. +require_once($CFG->dirroot . '/mod/workshop/lib.php'); // Include the code to test + +/** + * Test cases for the functions in lib.php + */ +class workshop_lib_test extends UnitTestCase { + + function test_workshop_get_maxgrades() { + $this->assertIsA(workshop_get_maxgrades(), 'Array'); + $this->assertTrue(workshop_get_maxgrades()); + $values_are_integers = True; + foreach(workshop_get_maxgrades() as $key => $val) { + if (!is_int($val)) { + $values_are_integers = false; + break; + } + } + $this->assertTrue($values_are_integers, 'Array values must be integers'); + } + +} diff --git a/mod/workshop/version.php b/mod/workshop/version.php new file mode 100644 index 0000000000..d3c11ccbef --- /dev/null +++ b/mod/workshop/version.php @@ -0,0 +1,32 @@ +. + + +/** + * Defines the version of workshop + * + * This code fragment is called by moodle_needs_upgrading() and + * /admin/index.php + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$module->version = 2009052100; +$module->requires = 2009050619; // Requires this Moodle version +$module->cron = 60; diff --git a/mod/workshop/view.php b/mod/workshop/view.php new file mode 100644 index 0000000000..7f7c79799f --- /dev/null +++ b/mod/workshop/view.php @@ -0,0 +1,88 @@ +. + + +/** + * Prints a particular instance of workshop + * + * You can have a rather longer description of the file as well, + * if you like, and it can span multiple lines. + * + * @package mod-workshop + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +/// (Replace workshop with the name of your module and remove this line) + +require_once(dirname(dirname(dirname(__FILE__))).'/config.php'); +require_once(dirname(__FILE__).'/lib.php'); + +$id = optional_param('id', 0, PARAM_INT); // course_module ID, or +$a = optional_param('a', 0, PARAM_INT); // workshop instance ID + +if ($id) { + if (! $cm = get_coursemodule_from_id('workshop', $id)) { + error('Course Module ID was incorrect'); + } + + if (! $course = $DB->get_record('course', array('id' => $cm->course))) { + error('Course is misconfigured'); + } + + if (! $workshop = $DB->get_record('workshop', array('id' => $cm->instance))) { + error('Course module is incorrect'); + } + +} else if ($a) { + if (! $workshop = $DB->get_record('workshop', array('id' => $a))) { + error('Course module is incorrect'); + } + if (! $course = $DB->get_record('course', array('id' => $workshop->course))) { + error('Course is misconfigured'); + } + if (! $cm = get_coursemodule_from_instance('workshop', $workshop->id, $course->id)) { + error('Course Module ID was incorrect'); + } + +} else { + error('You must specify a course_module ID or an instance ID'); +} + +require_login($course, true, $cm); + +add_to_log($course->id, "workshop", "view", "view.php?id=$cm->id", "$workshop->id"); + +/// Print the page header +$strworkshops = get_string('modulenameplural', 'workshop'); +$strworkshop = get_string('modulename', 'workshop'); + +$navlinks = array(); +$navlinks[] = array('name' => $strworkshops, 'link' => "index.php?id=$course->id", 'type' => 'activity'); +$navlinks[] = array('name' => format_string($workshop->name), 'link' => '', 'type' => 'activityinstance'); + +$navigation = build_navigation($navlinks); + +print_header_simple(format_string($workshop->name), '', $navigation, '', '', true, + update_module_button($cm->id, $course->id, $strworkshop), navmenu($course, $cm)); + +/// Print the main part of the page + +echo "id}\">Edit grading form"; + +/// Finish the page +print_footer($course); -- 2.39.5