/**
 * Regular jobs to execute via cron
 *
 * @return boolean true on success, false otherwise
 */
function workshopplus_cron()
{
    global $CFG, $DB;
    $now = time();
    mtrace(' processing workshopplus subplugins ...');
    cron_execute_plugin_type('workshopplusallocation', 'workshopplus allocation methods');
    // now when the scheduled allocator had a chance to do its job, check if there
    // are some workshoppluss to switch into the assessment phase
    $workshoppluss = $DB->get_records_select("workshopplus", "phase = 20 AND phaseswitchassessment = 1 AND submissionend > 0 AND submissionend < ?", array($now));
    if (!empty($workshoppluss)) {
        mtrace('Processing automatic assessment phase switch in ' . count($workshoppluss) . ' workshopplus(s) ... ', '');
        require_once $CFG->dirroot . '/mod/workshopplus/locallib.php';
        foreach ($workshoppluss as $workshopplus) {
            $cm = get_coursemodule_from_instance('workshopplus', $workshopplus->id, $workshopplus->course, false, MUST_EXIST);
            $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
            $workshopplus = new workshopplus($workshopplus, $cm, $course);
            $workshopplus->switch_phase(workshopplus::PHASE_ASSESSMENT);
            $workshopplus->log('update switch phase', $workshopplus->view_url(), $workshopplus->phase);
            // disable the automatic switching now so that it is not executed again by accident
            // if the teacher changes the phase back to the submission one
            $DB->set_field('workshopplus', 'phaseswitchassessment', 0, array('id' => $workshopplus->id));
            // todo inform the teachers
        }
        mtrace('done');
    }
    return true;
}
$phase = required_param('phase', PARAM_INT);
// the code of the new phase
$confirm = optional_param('confirm', false, PARAM_BOOL);
// confirmation
$cm = get_coursemodule_from_id('workshopplus', $cmid, 0, false, MUST_EXIST);
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
$workshopplus = $DB->get_record('workshopplus', array('id' => $cm->instance), '*', MUST_EXIST);
$workshopplus = new workshopplus($workshopplus, $cm, $course);
$PAGE->set_url($workshopplus->switchphase_url($phase), array('cmid' => $cmid, 'phase' => $phase));
require_login($course, false, $cm);
require_capability('mod/workshopplus:switchphase', $PAGE->context);
if ($confirm) {
    if (!confirm_sesskey()) {
        throw new moodle_exception('confirmsesskeybad');
    }
    if (!$workshopplus->switch_phase($phase)) {
        print_error('errorswitchingphase', 'workshopplus', $workshopplus->view_url());
    }
    $workshopplus->log('update switch phase', $workshopplus->view_url(), $workshopplus->phase);
    redirect($workshopplus->view_url());
}
$PAGE->set_title($workshopplus->name);
$PAGE->set_heading($course->fullname);
$PAGE->navbar->add(get_string('switchingphase', 'workshopplus'));
//
// Output starts here
//
echo $OUTPUT->header();
echo $OUTPUT->heading(format_string($workshopplus->name));
echo $OUTPUT->confirm(get_string('switchphase' . $phase . 'info', 'workshopplus'), new moodle_url($PAGE->url, array('confirm' => 1)), $workshopplus->view_url());
echo $OUTPUT->footer();
//set edition field
if (!$canallocate and !$currentgroupid) {
    $edit = false;
}
////////////end by Morteza
if ($submission->id and ($ownsubmission or $canviewall or $isreviewer)) {
    // ok you can go
} elseif ($submission->id and $ispublished) {
    // ok you can go
    $seenaspublished = true;
} elseif (is_null($submission->id) and $cansubmit) {
    // ok you can go
} elseif ($grouphassubmitted and $groupsubmission->id == $id) {
    // ok you can go
} else {
    print_error('nopermissions', 'error', $workshopplus->view_url(), 'view or create submission');
}
if ($assess and $submission->id and !$isreviewer and $canallocate and $workshopplus->assessing_allowed($USER->id)) {
    require_sesskey();
    $assessmentid = $workshopplus->add_allocation($submission, $USER->id);
    redirect($workshopplus->assess_url($assessmentid));
}
if ($edit) {
    require_once dirname(__FILE__) . '/submission_form.php';
    $maxfiles = $workshopplus->nattachments;
    $maxbytes = $workshopplus->maxbytes;
    $contentopts = array('trusttext' => true, 'subdirs' => false, 'maxfiles' => $maxfiles, 'maxbytes' => $maxbytes, 'context' => $workshopplus->context, 'return_types' => FILE_INTERNAL | FILE_EXTERNAL);
    $attachmentopts = array('subdirs' => true, 'maxfiles' => $maxfiles, 'maxbytes' => $maxbytes, 'return_types' => FILE_INTERNAL);
    $submission = file_prepare_standard_editor($submission, 'content', $contentopts, $workshopplus->context, 'mod_workshopplus', 'submission_content', $submission->id);
    $submission = file_prepare_standard_filemanager($submission, 'attachment', $attachmentopts, $workshopplus->context, 'mod_workshopplus', 'submission_attachment', $submission->id);
    $mform = new workshopplus_submission_form($PAGE->url, array('current' => $submission, 'workshopplus' => $workshopplus, 'contentopts' => $contentopts, 'attachmentopts' => $attachmentopts));
 * @package    mod
 * @subpackage workshopplus
 * @copyright  2010 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__) . '/locallib.php';
$id = required_param('id', PARAM_INT);
// course_module ID
$tool = required_param('tool', PARAM_ALPHA);
$cm = get_coursemodule_from_id('workshopplus', $id, 0, false, MUST_EXIST);
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
$workshopplus = $DB->get_record('workshopplus', array('id' => $cm->instance), '*', MUST_EXIST);
require_login($course, false, $cm);
$workshopplus = new workshopplus($workshopplus, $cm, $course);
require_sesskey();
switch ($tool) {
    case 'clearaggregatedgrades':
        require_capability('mod/workshopplus:overridegrades', $workshopplus->context);
        $workshopplus->log('update clear aggregated grades');
        $workshopplus->clear_submission_grades();
        $workshopplus->clear_grading_grades();
        break;
    case 'clearassessments':
        require_capability('mod/workshopplus:overridegrades', $workshopplus->context);
        $workshopplus->log('update clear assessments');
        $workshopplus->clear_assessments();
        break;
}
redirect($workshopplus->view_url());
    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, $submission->authorid, $workshopplus->cm->groupingid, 'g.id');
            $sharedgroups = array_intersect_key($usersgroups, $authorsgroups);
            if (empty($sharedgroups)) {
                $canviewallsubmissions = false;
            }
        }
    }
}
if ($isreviewer or $isauthor or $canviewallassessments and $canviewallsubmissions) {
    // such a user can continue
} else {
    print_error('nopermissions', 'error', $workshopplus->view_url(), 'view this assessment');
}
if ($isauthor and !$isreviewer and !$canviewallassessments and $workshopplus->phase != workshopplus::PHASE_CLOSED) {
    // authors can see assessments of their work at the end of workshopplus only
    print_error('nopermissions', 'error', $workshopplus->view_url(), 'view assessment of own work before workshopplus is closed');
}
// only the reviewer is allowed to modify the assessment
if ($isreviewer and $workshopplus->assessing_allowed($USER->id)) {
    $assessmenteditable = true;
} else {
    $assessmenteditable = false;
}
// check that all required examples have been assessed by the user
if ($assessmenteditable and $workshopplus->useexamples and $workshopplus->examplesmode == workshopplus::EXAMPLES_BEFORE_ASSESSMENT and !has_capability('mod/workshopplus:manageexamples', $workshopplus->context)) {
    // the reviewer must have submitted their own submission
    $reviewersubmission = $workshopplus->get_submission_by_author($assessment->reviewerid);
require_login($course, false, $cm);
if (isguestuser()) {
    print_error('guestsarenotallowed');
}
$workshopplus = new workshopplus($workshopplus, $cm, $course);
$PAGE->set_url($workshopplus->exassess_url($assessment->id));
$PAGE->set_title($workshopplus->name);
$PAGE->set_heading($course->fullname);
$PAGE->navbar->add(get_string('assessingexample', 'workshopplus'));
$currenttab = 'assessment';
$canmanage = has_capability('mod/workshopplus:manageexamples', $workshopplus->context);
$isreviewer = $USER->id == $assessment->reviewerid;
if ($isreviewer or $canmanage) {
    // such a user can continue
} else {
    print_error('nopermissions', 'error', $workshopplus->view_url(), 'assess example submission');
}
// only the reviewer is allowed to modify the assessment
if ($canmanage and $assessment->weight == 1 or $isreviewer and $workshopplus->assessing_examples_allowed()) {
    $assessmenteditable = true;
} else {
    $assessmenteditable = false;
}
// load the grading strategy logic
$strategy = $workshopplus->grading_strategy_instance();
// load the assessment form and process the submitted data eventually
$mform = $strategy->get_assessment_form($PAGE->url, 'assessment', $assessment, $assessmenteditable);
// Set data managed by the workshopplus core, subplugins set their own data themselves.
$currentdata = (object) array('feedbackauthor' => $assessment->feedbackauthor, 'feedbackauthorformat' => $assessment->feedbackauthorformat);
if ($assessmenteditable and $workshopplus->overallfeedbackmode) {
    $currentdata = file_prepare_standard_editor($currentdata, 'feedbackauthor', $workshopplus->overall_feedback_content_options(), $workshopplus->context, 'mod_workshopplus', 'overallfeedback_content', $assessment->id);
require_once dirname(dirname(dirname(__FILE__))) . '/config.php';
require_once dirname(__FILE__) . '/locallib.php';
$cmid = required_param('cmid', PARAM_INT);
// course module
$confirm = optional_param('confirm', false, PARAM_BOOL);
// confirmation
// the params to be re-passed to view.php
$page = optional_param('page', 0, PARAM_INT);
$sortby = optional_param('sortby', 'lastname', PARAM_ALPHA);
$sorthow = optional_param('sorthow', 'ASC', PARAM_ALPHA);
$cm = get_coursemodule_from_id('workshopplus', $cmid, 0, false, MUST_EXIST);
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
$workshopplus = $DB->get_record('workshopplus', array('id' => $cm->instance), '*', MUST_EXIST);
$workshopplus = new workshopplus($workshopplus, $cm, $course);
$PAGE->set_url($workshopplus->aggregate_url(), compact('confirm', 'page', 'sortby', 'sorthow'));
require_login($course, false, $cm);
require_capability('mod/workshopplus:overridegrades', $PAGE->context);
// load and init the grading evaluator
$evaluator = $workshopplus->grading_evaluation_instance();
$settingsform = $evaluator->get_settings_form($PAGE->url);
if ($settingsdata = $settingsform->get_data()) {
    $workshopplus->aggregate_submission_grades();
    // updates 'grade' in {workshopplus_submissions}
    $evaluator->update_grading_grades($settingsdata);
    // updates 'gradinggrade' in {workshopplus_assessments}
    $workshopplus->aggregate_grading_grades();
    // updates 'gradinggrade' in {workshopplus_aggregations}
    $workshopplus->log('update aggregate grades');
}
redirect(new moodle_url($workshopplus->view_url(), compact('page', 'sortby', 'sorthow')));
    $workshopplusrecord = $DB->get_record('workshopplus', array('id' => $w), '*', MUST_EXIST);
    $course = $DB->get_record('course', array('id' => $workshopplusrecord->course), '*', MUST_EXIST);
    $cm = get_coursemodule_from_instance('workshopplus', $workshopplusrecord->id, $course->id, false, MUST_EXIST);
}
require_login($course, true, $cm);
require_capability('mod/workshopplus:view', $PAGE->context);
$workshopplus = new workshopplus($workshopplusrecord, $cm, $course);
// Mark viewed
$completion = new completion_info($course);
$completion->set_module_viewed($cm);
$eventdata = array();
$eventdata['objectid'] = $workshopplus->id;
$eventdata['context'] = $workshopplus->context;
$eventdata['courseid'] = $course->id;
$eventdata['other']['content'] = $workshopplus->phase;
$PAGE->set_url($workshopplus->view_url());
$event = \mod_workshopplus\event\course_module_viewed::create($eventdata);
$event->add_record_snapshot('course', $course);
$event->add_record_snapshot('workshopplus', $workshopplusrecord);
$event->add_record_snapshot('course_modules', $cm);
$event->set_page_detail();
$event->trigger();
// If the phase is to be switched, do it asap. This just has to happen after triggering
// the event so that the scheduled allocator had a chance to allocate submissions.
if ($workshopplus->phase == workshopplus::PHASE_SUBMISSION and $workshopplus->phaseswitchassessment and $workshopplus->submissionend > 0 and $workshopplus->submissionend < time()) {
    $workshopplus->switch_phase(workshopplus::PHASE_ASSESSMENT);
    $workshopplus->log('update switch phase', $workshopplus->view_url(), $workshopplus->phase);
    // Disable the automatic switching now so that it is not executed again by accident
    // if the teacher changes the phase back to the submission one.
    $DB->set_field('workshopplus', 'phaseswitchassessment', 0, array('id' => $workshopplus->id));
    $workshopplus->phaseswitchassessment = 0;
    // no example specified - create new one
    require_capability('mod/workshopplus:manageexamples', $workshopplus->context);
    $example = new stdclass();
    $example->id = null;
    $example->authorid = $USER->id;
    $example->example = 1;
}
$canmanage = has_capability('mod/workshopplus:manageexamples', $workshopplus->context);
$canassess = has_capability('mod/workshopplus:peerassess', $workshopplus->context);
$refasid = $DB->get_field('workshopplus_assessments', 'id', array('submissionid' => $example->id, 'weight' => 1));
if ($example->id and ($canmanage or $workshopplus->assessing_examples_allowed() and $canassess)) {
    // ok you can go
} elseif (is_null($example->id) and $canmanage) {
    // ok you can go
} else {
    print_error('nopermissions', 'error', $workshopplus->view_url(), 'view or manage example submission');
}
if ($id and $delete and $confirm and $canmanage) {
    require_sesskey();
    $workshopplus->delete_submission($example);
    redirect($workshopplus->view_url());
}
if ($id and $assess and $canmanage) {
    // reference assessment of an example is the assessment with the weight = 1. There should be just one
    // such assessment
    require_sesskey();
    if (!$refasid) {
        $refasid = $workshopplus->add_allocation($example, $USER->id, 1);
    }
    redirect($workshopplus->exassess_url($refasid));
}
if ($assessment->submissionid != $example->id) {
    print_error('invalidarguments');
}
$mformassessment = $strategy->get_assessment_form($PAGE->url, 'assessment', $assessment, false);
if ($refasid = $DB->get_field('workshopplus_assessments', 'id', array('submissionid' => $example->id, 'weight' => 1))) {
    $reference = $workshopplus->get_assessment_by_id($refasid);
    $mformreference = $strategy->get_assessment_form($PAGE->url, 'assessment', $reference, false);
}
$canmanage = has_capability('mod/workshopplus:manageexamples', $workshopplus->context);
$isreviewer = $USER->id == $assessment->reviewerid;
if ($canmanage) {
    // ok you can go
} elseif ($isreviewer and $workshopplus->assessing_examples_allowed()) {
    // ok you can go
} else {
    print_error('nopermissions', 'error', $workshopplus->view_url(), 'compare example assessment');
}
$PAGE->set_title($workshopplus->name);
$PAGE->set_heading($course->fullname);
$PAGE->navbar->add(get_string('examplecomparing', 'workshopplus'));
// Output starts here
$output = $PAGE->get_renderer('mod_workshopplus');
echo $output->header();
echo $output->heading(format_string($workshopplus->name));
echo $output->heading(get_string('assessedexample', 'workshopplus'), 3);
echo $output->render($workshopplus->prepare_example_submission($example));
// if the reference assessment is available, display it
if (!empty($mformreference)) {
    $options = array('showreviewer' => false, 'showauthor' => false, 'showform' => true);
    $reference = $workshopplus->prepare_example_reference_assessment($reference, $mformreference, $options);
    $reference->title = get_string('assessmentreference', 'workshopplus');