diff --git a/mod/workshop/db/install.xml b/mod/workshop/db/install.xml
new file mode 100644
index 00000000000..1600009e21e
--- /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 00000000000..860c0621968
--- /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 00000000000..42b12a37490
--- /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 00000000000..4aa732ddfc8
--- /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 00000000000..d9ffc4d3d17
Binary files /dev/null and b/mod/workshop/icon.gif differ
diff --git a/mod/workshop/index.php b/mod/workshop/index.php
new file mode 100644
index 00000000000..889a21b65cb
--- /dev/null
+++ b/mod/workshop/index.php
@@ -0,0 +1,106 @@
+.
+
+
+/**
+ * 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 00000000000..82312478cdf
--- /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 00000000000..9be5f0b531f
--- /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 00000000000..e4473e69958
--- /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 00000000000..e6672b35647
--- /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 00000000000..93ef9890794
--- /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 00000000000..d3c11ccbefc
--- /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 00000000000..7f7c79799f1
--- /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);