/**
  * Switch to a new workshop phase
  *
  * Modifies the underlying database record. You should terminate the script shortly after calling this.
  *
  * @param int $newphase new phase code
  * @return bool true if success, false otherwise
  */
 public function switch_phase($newphase)
 {
     global $DB;
     $known = $this->available_phases_list();
     if (!isset($known[$newphase])) {
         return false;
     }
     if (self::PHASE_CLOSED == $newphase) {
         // push the grades into the gradebook
         $workshop = new stdclass();
         foreach ($this as $property => $value) {
             $workshop->{$property} = $value;
         }
         $workshop->course = $this->course->id;
         $workshop->cmidnumber = $this->cm->id;
         $workshop->modname = 'workshop';
         workshop_update_grades($workshop);
     }
     $DB->set_field('workshop', 'phase', $newphase, array('id' => $this->id));
     $this->phase = $newphase;
     $eventdata = array('objectid' => $this->id, 'context' => $this->context, 'other' => array('workshopphase' => $this->phase));
     $event = \mod_workshop\event\phase_switched::create($eventdata);
     $event->trigger();
     return true;
 }
Esempio n. 2
0
/**
 * Regular jobs to execute via cron
 *
 * @return boolean true on success, false otherwise
 */
function workshop_cron() {
    global $CFG, $DB;

    $now = time();

    mtrace(' processing workshop subplugins ...');
    cron_execute_plugin_type('workshopallocation', 'workshop allocation methods');

    // now when the scheduled allocator had a chance to do its job, check if there
    // are some workshops to switch into the assessment phase
    $workshops = $DB->get_records_select("workshop",
        "phase = 20 AND phaseswitchassessment = 1 AND submissionend > 0 AND submissionend < ?", array($now));

    if (!empty($workshops)) {
        mtrace('Processing automatic assessment phase switch in '.count($workshops).' workshop(s) ... ', '');
        require_once($CFG->dirroot.'/mod/workshop/locallib.php');
        foreach ($workshops as $workshop) {
            $cm = get_coursemodule_from_instance('workshop', $workshop->id, $workshop->course, false, MUST_EXIST);
            $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
            $workshop = new workshop($workshop, $cm, $course);
            $workshop->switch_phase(workshop::PHASE_ASSESSMENT);

            $params = array(
                'objectid' => $workshop->id,
                'context' => $workshop->context,
                'courseid' => $workshop->course->id,
                'other' => array(
                    'workshopphase' => $workshop->phase
                )
            );
            $event = \mod_workshop\event\phase_switched::create($params);
            $event->trigger();

            // 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('workshop', 'phaseswitchassessment', 0, array('id' => $workshop->id));

            // todo inform the teachers
        }
        mtrace('done');
    }

    return true;
}