// course module id $id = optional_param('id', 0, PARAM_INT); // submission id $edit = optional_param('edit', false, PARAM_BOOL); // open for editing? $assess = optional_param('assess', false, PARAM_BOOL); // instant assessment required $cm = get_coursemodule_from_id('workshop', $cmid, 0, false, MUST_EXIST); $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); require_login($course, false, $cm); if (isguestuser()) { print_error('guestsarenotallowed'); } $workshoprecord = $DB->get_record('workshop', array('id' => $cm->instance), '*', MUST_EXIST); $workshop = new workshop($workshoprecord, $cm, $course); $PAGE->set_url($workshop->submission_url(), array('cmid' => $cmid, 'id' => $id)); if ($edit) { $PAGE->url->param('edit', $edit); } if ($id) { // submission is specified $submission = $workshop->get_submission_by_id($id); $params = array('objectid' => $submission->id, 'context' => $workshop->context, 'courseid' => $workshop->course->id, 'relateduserid' => $submission->authorid, 'other' => array('workshopid' => $workshop->id)); $event = \mod_workshop\event\submission_viewed::create($params); $event->trigger(); } else { // no submission specified if (!($submission = $workshop->get_submission_by_author($USER->id))) { $submission = new stdclass(); $submission->id = null; $submission->authorid = $USER->id;
/** * Prepare an individual workshop plan for the given user. * * @param workshop $workshop instance * @param int $userid whom the plan is prepared for */ public function __construct(workshop $workshop, $userid) { global $DB; $this->workshop = $workshop; $this->userid = $userid; //--------------------------------------------------------- // * SETUP | submission | assessment | evaluation | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phasesetup', 'workshop'); $phase->tasks = array(); if (has_capability('moodle/course:manageactivities', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskintro', 'workshop'); $task->link = $workshop->updatemod_url(); $task->completed = !(trim($workshop->intro) == ''); $phase->tasks['intro'] = $task; } if (has_capability('moodle/course:manageactivities', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskinstructauthors', 'workshop'); $task->link = $workshop->updatemod_url(); $task->completed = !(trim($workshop->instructauthors) == ''); $phase->tasks['instructauthors'] = $task; } if (has_capability('mod/workshop:editdimensions', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('editassessmentform', 'workshop'); $task->link = $workshop->editform_url(); if ($workshop->grading_strategy_instance()->form_ready()) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_SETUP) { $task->completed = false; } $phase->tasks['editform'] = $task; } if ($workshop->useexamples and has_capability('mod/workshop:manageexamples', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('prepareexamples', 'workshop'); if ($DB->count_records('workshop_submissions', array('example' => 1, 'workshopid' => $workshop->id)) > 0) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_SETUP) { $task->completed = false; } $phase->tasks['prepareexamples'] = $task; } if (empty($phase->tasks) and $workshop->phase == workshop::PHASE_SETUP) { // if we are in the setup phase and there is no task (typical for students), let us // display some explanation what is going on $task = new stdclass(); $task->title = get_string('undersetup', 'workshop'); $task->completed = 'info'; $phase->tasks['setupinfo'] = $task; } $this->phases[workshop::PHASE_SETUP] = $phase; //--------------------------------------------------------- // setup | * SUBMISSION | assessment | evaluation | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phasesubmission', 'workshop'); $phase->tasks = array(); if (($workshop->usepeerassessment or $workshop->useselfassessment) and has_capability('moodle/course:manageactivities', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskinstructreviewers', 'workshop'); $task->link = $workshop->updatemod_url(); if (trim($workshop->instructreviewers)) { $task->completed = true; } elseif ($workshop->phase >= workshop::PHASE_ASSESSMENT) { $task->completed = false; } $phase->tasks['instructreviewers'] = $task; } if ($workshop->useexamples and $workshop->examplesmode == workshop::EXAMPLES_BEFORE_SUBMISSION and has_capability('mod/workshop:submit', $workshop->context, $userid, false) and !has_capability('mod/workshop:manageexamples', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('exampleassesstask', 'workshop'); $examples = $this->get_examples(); $a = new stdclass(); $a->expected = count($examples); $a->assessed = 0; foreach ($examples as $exampleid => $example) { if (!is_null($example->grade)) { $a->assessed++; } } $task->details = get_string('exampleassesstaskdetails', 'workshop', $a); if ($a->assessed == $a->expected) { $task->completed = true; } elseif ($workshop->phase >= workshop::PHASE_ASSESSMENT) { $task->completed = false; } $phase->tasks['examples'] = $task; } if (has_capability('mod/workshop:submit', $workshop->context, $userid, false)) { $task = new stdclass(); $task->title = get_string('tasksubmit', 'workshop'); $task->link = $workshop->submission_url(); if ($DB->record_exists('workshop_submissions', array('workshopid'=>$workshop->id, 'example'=>0, 'authorid'=>$userid))) { $task->completed = true; } elseif ($workshop->phase >= workshop::PHASE_ASSESSMENT) { $task->completed = false; } else { $task->completed = null; // still has a chance to submit } $phase->tasks['submit'] = $task; } if (has_capability('mod/workshop:allocate', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('allocate', 'workshop'); $task->link = $workshop->allocation_url(); $numofauthors = count(get_users_by_capability($workshop->context, 'mod/workshop:submit', 'u.id', '', '', '', '', '', false, true)); $numofsubmissions = $DB->count_records('workshop_submissions', array('workshopid'=>$workshop->id, 'example'=>0)); $sql = 'SELECT COUNT(s.id) AS nonallocated FROM {workshop_submissions} s LEFT JOIN {workshop_assessments} a ON (a.submissionid=s.id) WHERE s.workshopid = :workshopid AND s.example=0 AND a.submissionid IS NULL'; $params['workshopid'] = $workshop->id; $numnonallocated = $DB->count_records_sql($sql, $params); if ($numofsubmissions == 0) { $task->completed = null; } elseif ($numnonallocated == 0) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_SUBMISSION) { $task->completed = false; } else { $task->completed = null; // still has a chance to allocate } $a = new stdclass(); $a->expected = $numofauthors; $a->submitted = $numofsubmissions; $a->allocate = $numnonallocated; $task->details = get_string('allocatedetails', 'workshop', $a); unset($a); $phase->tasks['allocate'] = $task; if ($numofsubmissions < $numofauthors and $workshop->phase >= workshop::PHASE_SUBMISSION) { $task = new stdclass(); $task->title = get_string('someuserswosubmission', 'workshop'); $task->completed = 'info'; $phase->tasks['allocateinfo'] = $task; } } if ($workshop->submissionstart) { $task = new stdclass(); $task->title = get_string('submissionstartdatetime', 'workshop', workshop::timestamp_formats($workshop->submissionstart)); $task->completed = 'info'; $phase->tasks['submissionstartdatetime'] = $task; } if ($workshop->submissionend) { $task = new stdclass(); $task->title = get_string('submissionenddatetime', 'workshop', workshop::timestamp_formats($workshop->submissionend)); $task->completed = 'info'; $phase->tasks['submissionenddatetime'] = $task; } if (($workshop->submissionstart < time()) and $workshop->latesubmissions) { $task = new stdclass(); $task->title = get_string('latesubmissionsallowed', 'workshop'); $task->completed = 'info'; $phase->tasks['latesubmissionsallowed'] = $task; } $this->phases[workshop::PHASE_SUBMISSION] = $phase; //--------------------------------------------------------- // setup | submission | * ASSESSMENT | evaluation | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phaseassessment', 'workshop'); $phase->tasks = array(); $phase->isreviewer = has_capability('mod/workshop:peerassess', $workshop->context, $userid); if ($workshop->useexamples and $workshop->examplesmode == workshop::EXAMPLES_BEFORE_ASSESSMENT and $phase->isreviewer and !has_capability('mod/workshop:manageexamples', $workshop->context, $userid)) { $task = new stdclass(); $task->title = get_string('exampleassesstask', 'workshop'); $examples = $workshop->get_examples_for_reviewer($userid); $a = new stdclass(); $a->expected = count($examples); $a->assessed = 0; foreach ($examples as $exampleid => $example) { if (!is_null($example->grade)) { $a->assessed++; } } $task->details = get_string('exampleassesstaskdetails', 'workshop', $a); if ($a->assessed == $a->expected) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_ASSESSMENT) { $task->completed = false; } $phase->tasks['examples'] = $task; } if (empty($phase->tasks['examples']) or !empty($phase->tasks['examples']->completed)) { $phase->assessments = $workshop->get_assessments_by_reviewer($userid); $numofpeers = 0; // number of allocated peer-assessments $numofpeerstodo = 0; // number of peer-assessments to do $numofself = 0; // number of allocated self-assessments - should be 0 or 1 $numofselftodo = 0; // number of self-assessments to do - should be 0 or 1 foreach ($phase->assessments as $a) { if ($a->authorid == $userid) { $numofself++; if (is_null($a->grade)) { $numofselftodo++; } } else { $numofpeers++; if (is_null($a->grade)) { $numofpeerstodo++; } } } unset($a); if ($workshop->usepeerassessment and $numofpeers) { $task = new stdclass(); if ($numofpeerstodo == 0) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_ASSESSMENT) { $task->completed = false; } $a = new stdclass(); $a->total = $numofpeers; $a->todo = $numofpeerstodo; $task->title = get_string('taskassesspeers', 'workshop'); $task->details = get_string('taskassesspeersdetails', 'workshop', $a); unset($a); $phase->tasks['assesspeers'] = $task; } if ($workshop->useselfassessment and $numofself) { $task = new stdclass(); if ($numofselftodo == 0) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_ASSESSMENT) { $task->completed = false; } $task->title = get_string('taskassessself', 'workshop'); $phase->tasks['assessself'] = $task; } } if ($workshop->assessmentstart) { $task = new stdclass(); $task->title = get_string('assessmentstartdatetime', 'workshop', workshop::timestamp_formats($workshop->assessmentstart)); $task->completed = 'info'; $phase->tasks['assessmentstartdatetime'] = $task; } if ($workshop->assessmentend) { $task = new stdclass(); $task->title = get_string('assessmentenddatetime', 'workshop', workshop::timestamp_formats($workshop->assessmentend)); $task->completed = 'info'; $phase->tasks['assessmentenddatetime'] = $task; } $this->phases[workshop::PHASE_ASSESSMENT] = $phase; //--------------------------------------------------------- // setup | submission | assessment | * EVALUATION | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phaseevaluation', 'workshop'); $phase->tasks = array(); if (has_capability('mod/workshop:overridegrades', $workshop->context)) { $expected = count($workshop->get_potential_authors(false)); $calculated = $DB->count_records_select('workshop_submissions', 'workshopid = ? AND (grade IS NOT NULL OR gradeover IS NOT NULL)', array($workshop->id)); $task = new stdclass(); $task->title = get_string('calculatesubmissiongrades', 'workshop'); $a = new stdclass(); $a->expected = $expected; $a->calculated = $calculated; $task->details = get_string('calculatesubmissiongradesdetails', 'workshop', $a); if ($calculated >= $expected) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_EVALUATION) { $task->completed = false; } $phase->tasks['calculatesubmissiongrade'] = $task; $expected = count($workshop->get_potential_reviewers(false)); $calculated = $DB->count_records_select('workshop_aggregations', 'workshopid = ? AND gradinggrade IS NOT NULL', array($workshop->id)); $task = new stdclass(); $task->title = get_string('calculategradinggrades', 'workshop'); $a = new stdclass(); $a->expected = $expected; $a->calculated = $calculated; $task->details = get_string('calculategradinggradesdetails', 'workshop', $a); if ($calculated >= $expected) { $task->completed = true; } elseif ($workshop->phase > workshop::PHASE_EVALUATION) { $task->completed = false; } $phase->tasks['calculategradinggrade'] = $task; } elseif ($workshop->phase == workshop::PHASE_EVALUATION) { $task = new stdclass(); $task->title = get_string('evaluategradeswait', 'workshop'); $task->completed = 'info'; $phase->tasks['evaluateinfo'] = $task; } $this->phases[workshop::PHASE_EVALUATION] = $phase; //--------------------------------------------------------- // setup | submission | assessment | evaluation | * CLOSED //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phaseclosed', 'workshop'); $phase->tasks = array(); $this->phases[workshop::PHASE_CLOSED] = $phase; // Polish data, set default values if not done explicitly foreach ($this->phases as $phasecode => $phase) { $phase->title = isset($phase->title) ? $phase->title : ''; $phase->tasks = isset($phase->tasks) ? $phase->tasks : array(); if ($phasecode == $workshop->phase) { $phase->active = true; } else { $phase->active = false; } if (!isset($phase->actions)) { $phase->actions = array(); } foreach ($phase->tasks as $taskcode => $task) { $task->title = isset($task->title) ? $task->title : ''; $task->link = isset($task->link) ? $task->link : null; $task->details = isset($task->details) ? $task->details : ''; $task->completed = isset($task->completed) ? $task->completed : null; } } // Add phase switching actions if (has_capability('mod/workshop:switchphase', $workshop->context, $userid)) { foreach ($this->phases as $phasecode => $phase) { if (! $phase->active) { $action = new stdclass(); $action->type = 'switchphase'; $action->url = $workshop->switchphase_url($phasecode); $phase->actions[] = $action; } } } }
/** * Print a detailed representation of what a user has done with * a given particular instance of this module, for user activity reports. * * @return string HTML */ function workshop_user_complete($course, $user, $mod, $workshop) { global $CFG, $DB, $OUTPUT; require_once dirname(__FILE__) . '/locallib.php'; require_once $CFG->libdir . '/gradelib.php'; $workshop = new workshop($workshop, $mod, $course); $grades = grade_get_grades($course->id, 'mod', 'workshop', $workshop->id, $user->id); if (!empty($grades->items[0]->grades)) { $submissiongrade = reset($grades->items[0]->grades); $info = get_string('submissiongrade', 'workshop') . ': ' . $submissiongrade->str_long_grade; echo html_writer::tag('li', $info, array('class' => 'submissiongrade')); } if (!empty($grades->items[1]->grades)) { $assessmentgrade = reset($grades->items[1]->grades); $info = get_string('gradinggrade', 'workshop') . ': ' . $assessmentgrade->str_long_grade; echo html_writer::tag('li', $info, array('class' => 'gradinggrade')); } if (has_capability('mod/workshop:viewallsubmissions', $workshop->context)) { if ($submission = $workshop->get_submission_by_author($user->id)) { $title = format_string($submission->title); $url = $workshop->submission_url($submission->id); $link = html_writer::link($url, $title); $info = get_string('submission', 'workshop') . ': ' . $link; echo html_writer::tag('li', $info, array('class' => 'submission')); } } if (has_capability('mod/workshop:viewallassessments', $workshop->context)) { if ($assessments = $workshop->get_assessments_by_reviewer($user->id)) { foreach ($assessments as $assessment) { $a = new stdclass(); $a->submissionurl = $workshop->submission_url($assessment->submissionid)->out(); $a->assessmenturl = $workshop->assess_url($assessment->id)->out(); $a->submissiontitle = s($assessment->submissiontitle); echo html_writer::tag('li', get_string('assessmentofsubmission', 'workshop', $a)); } } } }
/** * Print a detailed representation of what a user has done with * a given particular instance of this module, for user activity reports. * * @return string HTML */ function workshop_user_complete($course, $user, $mod, $workshop) { global $CFG, $DB, $OUTPUT; require_once(dirname(__FILE__).'/locallib.php'); require_once($CFG->libdir.'/gradelib.php'); $workshop = new workshop($workshop, $mod, $course); $grades = grade_get_grades($course->id, 'mod', 'workshop', $workshop->id, $user->id); if (!empty($grades->items[0]->grades)) { $submissiongrade = reset($grades->items[0]->grades); $info = get_string('submissiongrade', 'workshop') . ': ' . $submissiongrade->str_long_grade; echo html_writer::tag('li', $info, array('class'=>'submissiongrade')); } if (!empty($grades->items[1]->grades)) { $assessmentgrade = reset($grades->items[1]->grades); $info = get_string('gradinggrade', 'workshop') . ': ' . $assessmentgrade->str_long_grade; echo html_writer::tag('li', $info, array('class'=>'gradinggrade')); } if (has_capability('mod/workshop:viewallsubmissions', $workshop->context)) { $canviewsubmission = true; if (groups_get_activity_groupmode($workshop->cm) == SEPARATEGROUPS) { // user must have accessallgroups or share at least one group with the submission author if (!has_capability('moodle/site:accessallgroups', $workshop->context)) { $usersgroups = groups_get_activity_allowed_groups($workshop->cm); $authorsgroups = groups_get_all_groups($workshop->course->id, $user->id, $workshop->cm->groupingid, 'g.id'); $sharedgroups = array_intersect_key($usersgroups, $authorsgroups); if (empty($sharedgroups)) { $canviewsubmission = false; } } } if ($canviewsubmission and $submission = $workshop->get_submission_by_author($user->id)) { $title = format_string($submission->title); $url = $workshop->submission_url($submission->id); $link = html_writer::link($url, $title); $info = get_string('submission', 'workshop').': '.$link; echo html_writer::tag('li', $info, array('class'=>'submission')); } } if (has_capability('mod/workshop:viewallassessments', $workshop->context)) { if ($assessments = $workshop->get_assessments_by_reviewer($user->id)) { foreach ($assessments as $assessment) { $a = new stdclass(); $a->submissionurl = $workshop->submission_url($assessment->submissionid)->out(); $a->assessmenturl = $workshop->assess_url($assessment->id)->out(); $a->submissiontitle = s($assessment->submissiontitle); echo html_writer::tag('li', get_string('assessmentofsubmission', 'workshop', $a)); } } } }
// course module id $id = optional_param('id', 0, PARAM_INT); // submission id $edit = optional_param('edit', false, PARAM_BOOL); // open for editing? $assess = optional_param('assess', false, PARAM_BOOL); // instant assessment required $cm = get_coursemodule_from_id('workshop', $cmid, 0, false, MUST_EXIST); $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); require_login($course, false, $cm); if (isguestuser()) { print_error('guestsarenotallowed'); } $workshop = $DB->get_record('workshop', array('id' => $cm->instance), '*', MUST_EXIST); $workshop = new workshop($workshop, $cm, $course); $PAGE->set_url($workshop->submission_url(), array('cmid' => $cmid, 'id' => $id, 'edit' => $edit)); if ($id) { // submission is specified $submission = $workshop->get_submission_by_id($id); $workshop->log('view submission', $workshop->submission_url($submission->id), $submission->id); } else { // no submission specified if (!($submission = $workshop->get_submission_by_author($USER->id))) { $submission = new stdclass(); $submission->id = null; $submission->authorid = $USER->id; $submission->example = 0; $submission->grade = null; $submission->gradeover = null; $submission->published = null; $submission->feedbackauthor = null;