// 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('workshopplus', $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'); } $workshopplus = $DB->get_record('workshopplus', array('id' => $cm->instance), '*', MUST_EXIST); $workshopplus = new workshopplus($workshopplus, $cm, $course); $PAGE->set_url($workshopplus->submission_url(), array('cmid' => $cmid, 'id' => $id)); if ($edit) { $PAGE->url->param('edit', $edit); } if ($id) { // submission is specified $submission = $workshopplus->get_submission_by_id($id); $workshopplus->log('view submission', $workshopplus->submission_url($submission->id), $submission->id); } else { // no submission specified if (!($submission = $workshopplus->get_submission_by_author($USER->id))) { $submission = new stdclass(); $submission->id = null; $submission->authorid = $USER->id; $submission->example = 0; $submission->grade = null;
/** * 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 workshopplus_user_complete($course, $user, $mod, $workshopplus) { global $CFG, $DB, $OUTPUT; require_once dirname(__FILE__) . '/locallib.php'; require_once $CFG->libdir . '/gradelib.php'; $workshopplus = new workshopplus($workshopplus, $mod, $course); $grades = grade_get_grades($course->id, 'mod', 'workshopplus', $workshopplus->id, $user->id); if (!empty($grades->items[0]->grades)) { $submissiongrade = reset($grades->items[0]->grades); $info = get_string('submissiongrade', 'workshopplus') . ': ' . $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', 'workshopplus') . ': ' . $assessmentgrade->str_long_grade; echo html_writer::tag('li', $info, array('class' => 'gradinggrade')); } if (has_capability('mod/workshopplus:viewallsubmissions', $workshopplus->context)) { $canviewsubmission = true; if (groups_get_activity_groupmode($workshopplus->cm) == SEPARATEGROUPS) { // user must have accessallgroups or share at least one group with the submission author if (!has_capability('moodle/site:accessallgroups', $workshopplus->context)) { $usersgroups = groups_get_activity_allowed_groups($workshopplus->cm); $authorsgroups = groups_get_all_groups($workshopplus->course->id, $user->id, $workshopplus->cm->groupingid, 'g.id'); $sharedgroups = array_intersect_key($usersgroups, $authorsgroups); if (empty($sharedgroups)) { $canviewsubmission = false; } } } if ($canviewsubmission and $submission = $workshopplus->get_submission_by_author($user->id)) { $title = format_string($submission->title); $url = $workshopplus->submission_url($submission->id); $link = html_writer::link($url, $title); $info = get_string('submission', 'workshopplus') . ': ' . $link; echo html_writer::tag('li', $info, array('class' => 'submission')); } } if (has_capability('mod/workshopplus:viewallassessments', $workshopplus->context)) { if ($assessments = $workshopplus->get_assessments_by_reviewer($user->id)) { foreach ($assessments as $assessment) { $a = new stdclass(); $a->submissionurl = $workshopplus->submission_url($assessment->submissionid)->out(); $a->assessmenturl = $workshopplus->assess_url($assessment->id)->out(); $a->submissiontitle = s($assessment->submissiontitle); echo html_writer::tag('li', get_string('assessmentofsubmission', 'workshopplus', $a)); } } } }
/** * Prepare an individual workshopplus plan for the given user. * * @param workshopplus $workshopplus instance * @param int $userid whom the plan is prepared for */ public function __construct(workshopplus $workshopplus, $userid) { global $DB; $this->workshopplus = $workshopplus; $this->userid = $userid; //--------------------------------------------------------- // * SETUP | submission | assessment | evaluation | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phasesetup', 'workshopplus'); $phase->tasks = array(); if (has_capability('moodle/course:manageactivities', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskintro', 'workshopplus'); $task->link = $workshopplus->updatemod_url(); $task->completed = !(trim($workshopplus->intro) == ''); $phase->tasks['intro'] = $task; } if (has_capability('moodle/course:manageactivities', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskinstructauthors', 'workshopplus'); $task->link = $workshopplus->updatemod_url(); $task->completed = !(trim($workshopplus->instructauthors) == ''); $phase->tasks['instructauthors'] = $task; } if (has_capability('mod/workshopplus:editdimensions', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('editassessmentform', 'workshopplus'); $task->link = $workshopplus->editform_url(); if ($workshopplus->grading_strategy_instance()->form_ready()) { $task->completed = true; } elseif ($workshopplus->phase > workshopplus::PHASE_SETUP) { $task->completed = false; } $phase->tasks['editform'] = $task; } if ($workshopplus->useexamples and has_capability('mod/workshopplus:manageexamples', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('prepareexamples', 'workshopplus'); if ($DB->count_records('workshopplus_submissions', array('example' => 1, 'workshopplusid' => $workshopplus->id)) > 0) { $task->completed = true; } elseif ($workshopplus->phase > workshopplus::PHASE_SETUP) { $task->completed = false; } $phase->tasks['prepareexamples'] = $task; } if (empty($phase->tasks) and $workshopplus->phase == workshopplus::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', 'workshopplus'); $task->completed = 'info'; $phase->tasks['setupinfo'] = $task; } $this->phases[workshopplus::PHASE_SETUP] = $phase; //--------------------------------------------------------- // setup | * SUBMISSION | assessment | evaluation | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phasesubmission', 'workshopplus'); $phase->tasks = array(); if (has_capability('moodle/course:manageactivities', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskinstructreviewers', 'workshopplus'); $task->link = $workshopplus->updatemod_url(); if (trim($workshopplus->instructreviewers)) { $task->completed = true; } elseif ($workshopplus->phase >= workshopplus::PHASE_ASSESSMENT) { $task->completed = false; } $phase->tasks['instructreviewers'] = $task; } if ($workshopplus->useexamples and $workshopplus->examplesmode == workshopplus::EXAMPLES_BEFORE_SUBMISSION and has_capability('mod/workshopplus:submit', $workshopplus->context, $userid, false) and !has_capability('mod/workshopplus:manageexamples', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('exampleassesstask', 'workshopplus'); $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', 'workshopplus', $a); if ($a->assessed == $a->expected) { $task->completed = true; } elseif ($workshopplus->phase >= workshopplus::PHASE_ASSESSMENT) { $task->completed = false; } $phase->tasks['examples'] = $task; } if (has_capability('mod/workshopplus:submit', $workshopplus->context, $userid, false)) { $task = new stdclass(); $task->title = get_string('tasksubmit', 'workshopplus'); $task->link = $workshopplus->submission_url(); if ($DB->record_exists('workshopplus_submissions', array('workshopplusid' => $workshopplus->id, 'example' => 0, 'authorid' => $userid))) { $task->completed = true; } elseif ($workshopplus->phase >= workshopplus::PHASE_ASSESSMENT) { $task->completed = false; } else { $task->completed = null; // still has a chance to submit } $phase->tasks['submit'] = $task; } if (has_capability('mod/workshopplus:allocate', $workshopplus->context, $userid)) { if ($workshopplus->phaseswitchassessment) { $task = new stdClass(); $allocator = $DB->get_record('workshopplusallocation_scheduled', array('workshopplusid' => $workshopplus->id)); if (empty($allocator)) { $task->completed = false; } else { if ($allocator->enabled and is_null($allocator->resultstatus)) { $task->completed = true; } else { if ($workshopplus->submissionend > time()) { $task->completed = null; } else { $task->completed = false; } } } $task->title = get_string('setup', 'workshopplusallocation_scheduled'); $task->link = $workshopplus->allocation_url('scheduled'); $phase->tasks['allocatescheduled'] = $task; } $task = new stdclass(); $task->title = get_string('allocate', 'workshopplus'); $task->link = $workshopplus->allocation_url(); $numofauthors = $workshopplus->count_potential_authors(false); $numofsubmissions = $DB->count_records('workshopplus_submissions', array('workshopplusid' => $workshopplus->id, 'example' => 0)); $sql = 'SELECT COUNT(s.id) AS nonallocated FROM {workshopplus_submissions} s LEFT JOIN {workshopplus_assessments} a ON (a.submissionid=s.id) WHERE s.workshopplusid = :workshopplusid AND s.example=0 AND a.submissionid IS NULL'; $params['workshopplusid'] = $workshopplus->id; $numnonallocated = $DB->count_records_sql($sql, $params); if ($numofsubmissions == 0) { $task->completed = null; } elseif ($numnonallocated == 0) { $task->completed = true; } elseif ($workshopplus->phase > workshopplus::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', 'workshopplus', $a); unset($a); $phase->tasks['allocate'] = $task; if ($numofsubmissions < $numofauthors and $workshopplus->phase >= workshopplus::PHASE_SUBMISSION) { $task = new stdclass(); $task->title = get_string('someuserswosubmission', 'workshopplus'); $task->completed = 'info'; $phase->tasks['allocateinfo'] = $task; } } if ($workshopplus->submissionstart) { $task = new stdclass(); $task->title = get_string('submissionstartdatetime', 'workshopplus', workshopplus::timestamp_formats($workshopplus->submissionstart)); $task->completed = 'info'; $phase->tasks['submissionstartdatetime'] = $task; } if ($workshopplus->submissionend) { $task = new stdclass(); $task->title = get_string('submissionenddatetime', 'workshopplus', workshopplus::timestamp_formats($workshopplus->submissionend)); $task->completed = 'info'; $phase->tasks['submissionenddatetime'] = $task; } if ($workshopplus->submissionstart < time() and $workshopplus->latesubmissions) { $task = new stdclass(); $task->title = get_string('latesubmissionsallowed', 'workshopplus'); $task->completed = 'info'; $phase->tasks['latesubmissionsallowed'] = $task; } if (isset($phase->tasks['submissionstartdatetime']) or isset($phase->tasks['submissionenddatetime'])) { if (has_capability('mod/workshopplus:ignoredeadlines', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('deadlinesignored', 'workshopplus'); $task->completed = 'info'; $phase->tasks['deadlinesignored'] = $task; } } $this->phases[workshopplus::PHASE_SUBMISSION] = $phase; //--------------------------------------------------------- // setup | submission | * ASSESSMENT | evaluation | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phaseassessment', 'workshopplus'); $phase->tasks = array(); $phase->isreviewer = has_capability('mod/workshopplus:peerassess', $workshopplus->context, $userid); if ($workshopplus->phase == workshopplus::PHASE_SUBMISSION and $workshopplus->phaseswitchassessment and has_capability('mod/workshopplus:switchphase', $workshopplus->context, $userid)) { $task = new stdClass(); $task->title = get_string('switchphase30auto', 'mod_workshopplus', workshopplus::timestamp_formats($workshopplus->submissionend)); $task->completed = 'info'; $phase->tasks['autoswitchinfo'] = $task; } if ($workshopplus->useexamples and $workshopplus->examplesmode == workshopplus::EXAMPLES_BEFORE_ASSESSMENT and $phase->isreviewer and !has_capability('mod/workshopplus:manageexamples', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('exampleassesstask', 'workshopplus'); $examples = $workshopplus->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', 'workshopplus', $a); if ($a->assessed == $a->expected) { $task->completed = true; } elseif ($workshopplus->phase > workshopplus::PHASE_ASSESSMENT) { $task->completed = false; } $phase->tasks['examples'] = $task; } if (empty($phase->tasks['examples']) or !empty($phase->tasks['examples']->completed)) { $phase->assessments = $workshopplus->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 ($numofpeers) { $task = new stdclass(); if ($numofpeerstodo == 0) { $task->completed = true; } elseif ($workshopplus->phase > workshopplus::PHASE_ASSESSMENT) { $task->completed = false; } $a = new stdclass(); $a->total = $numofpeers; $a->todo = $numofpeerstodo; $task->title = get_string('taskassesspeers', 'workshopplus'); $task->details = get_string('taskassesspeersdetails', 'workshopplus', $a); unset($a); $phase->tasks['assesspeers'] = $task; } if ($workshopplus->useselfassessment and $numofself) { $task = new stdclass(); if ($numofselftodo == 0) { $task->completed = true; } elseif ($workshopplus->phase > workshopplus::PHASE_ASSESSMENT) { $task->completed = false; } $task->title = get_string('taskassessself', 'workshopplus'); $phase->tasks['assessself'] = $task; } } if ($workshopplus->assessmentstart) { $task = new stdclass(); $task->title = get_string('assessmentstartdatetime', 'workshopplus', workshopplus::timestamp_formats($workshopplus->assessmentstart)); $task->completed = 'info'; $phase->tasks['assessmentstartdatetime'] = $task; } if ($workshopplus->assessmentend) { $task = new stdclass(); $task->title = get_string('assessmentenddatetime', 'workshopplus', workshopplus::timestamp_formats($workshopplus->assessmentend)); $task->completed = 'info'; $phase->tasks['assessmentenddatetime'] = $task; } if (isset($phase->tasks['assessmentstartdatetime']) or isset($phase->tasks['assessmentenddatetime'])) { if (has_capability('mod/workshopplus:ignoredeadlines', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('deadlinesignored', 'workshopplus'); $task->completed = 'info'; $phase->tasks['deadlinesignored'] = $task; } } $this->phases[workshopplus::PHASE_ASSESSMENT] = $phase; //--------------------------------------------------------- // setup | submission | assessment | * EVALUATION | closed //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phaseevaluation', 'workshopplus'); $phase->tasks = array(); if (has_capability('mod/workshopplus:overridegrades', $workshopplus->context)) { $expected = $workshopplus->count_potential_authors(false); $calculated = $DB->count_records_select('workshopplus_submissions', 'workshopplusid = ? AND (grade IS NOT NULL OR gradeover IS NOT NULL)', array($workshopplus->id)); $task = new stdclass(); $task->title = get_string('calculatesubmissiongrades', 'workshopplus'); $a = new stdclass(); $a->expected = $expected; $a->calculated = $calculated; $task->details = get_string('calculatesubmissiongradesdetails', 'workshopplus', $a); if ($calculated >= $expected) { $task->completed = true; } elseif ($workshopplus->phase > workshopplus::PHASE_EVALUATION) { $task->completed = false; } $phase->tasks['calculatesubmissiongrade'] = $task; $expected = $workshopplus->count_potential_reviewers(false); $calculated = $DB->count_records_select('workshopplus_aggregations', 'workshopplusid = ? AND gradinggrade IS NOT NULL', array($workshopplus->id)); $task = new stdclass(); $task->title = get_string('calculategradinggrades', 'workshopplus'); $a = new stdclass(); $a->expected = $expected; $a->calculated = $calculated; $task->details = get_string('calculategradinggradesdetails', 'workshopplus', $a); if ($calculated >= $expected) { $task->completed = true; } elseif ($workshopplus->phase > workshopplus::PHASE_EVALUATION) { $task->completed = false; } $phase->tasks['calculategradinggrade'] = $task; } elseif ($workshopplus->phase == workshopplus::PHASE_EVALUATION) { $task = new stdclass(); $task->title = get_string('evaluategradeswait', 'workshopplus'); $task->completed = 'info'; $phase->tasks['evaluateinfo'] = $task; } if (has_capability('moodle/course:manageactivities', $workshopplus->context, $userid)) { $task = new stdclass(); $task->title = get_string('taskconclusion', 'workshopplus'); $task->link = $workshopplus->updatemod_url(); if (trim($workshopplus->conclusion)) { $task->completed = true; } elseif ($workshopplus->phase >= workshopplus::PHASE_EVALUATION) { $task->completed = false; } $phase->tasks['conclusion'] = $task; } $this->phases[workshopplus::PHASE_EVALUATION] = $phase; //--------------------------------------------------------- // setup | submission | assessment | evaluation | * CLOSED //--------------------------------------------------------- $phase = new stdclass(); $phase->title = get_string('phaseclosed', 'workshopplus'); $phase->tasks = array(); $this->phases[workshopplus::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 == $workshopplus->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/workshopplus:switchphase', $workshopplus->context, $userid)) { foreach ($this->phases as $phasecode => $phase) { if (!$phase->active) { $action = new stdclass(); $action->type = 'switchphase'; $action->url = $workshopplus->switchphase_url($phasecode); $phase->actions[] = $action; } } } }