Ejemplo n.º 1
0
 /**
  * Test generate unique identifier function.
  */
 public function test_generateuniqueidentifier()
 {
     global $DB;
     $this->load_csv_data();
     // Test without passing an object.
     $idnumber = 'test - test';
     $newidnumber = generate_unique_identifier(pmclass::TABLE, 'idnumber', $idnumber, array('idnumber' => $idnumber));
     // We want to validate that the  unique idnumber is "test - test.3".
     $expectedvalue = 'test - test.3';
     $this->assertEquals($expectedvalue, $newidnumber);
     // Test with passing an object.
     $idnumber = 'test - test';
     $classobj = new stdClass();
     generate_unique_identifier(pmclass::TABLE, 'idnumber', $idnumber, array('idnumber' => $idnumber), 'pmclass', $classobj);
     // We want to validate that the  unique idnumber is "test - test.3".
     $expectedvalue = 'test - test.3';
     $this->assertEquals($expectedvalue, $classobj->idnumber);
     // Test that we also get a unique identifier with multiple values in the params array.
     $idnumber = 'test - test';
     $params = array('courseid' => '1', 'idnumber' => $idnumber);
     $newidnumber = generate_unique_identifier(pmclass::TABLE, 'idnumber', $idnumber, $params);
     // We want to validate that the  unique idnumber is "test - test.2".
     $expectedvalue = 'test - test.2';
     $this->assertEquals($expectedvalue, $newidnumber);
     // Test with passing an object and object parameters.
     $idnumber = 'test - test';
     $courseid = 1;
     $classobj = new stdClass();
     $params = array('courseid' => $courseid, 'idnumber' => $idnumber);
     $classparams = array('idnumber' => $idnumber);
     generate_unique_identifier(pmclass::TABLE, 'idnumber', $idnumber, $params, 'pmclass', $classobj, $classparams);
     // We want to validate that the  unique idnumber is "test - test.2".
     $expectedvalue = 'test - test.2';
     $this->assertEquals($expectedvalue, $classobj->idnumber);
 }
Ejemplo n.º 2
0
 /**
  * Clone a track
  * @param array $options options for cloning.  Valid options are:
  * - 'targetcurriculum': the curriculum id to associate the clones with
  *   (default: same as original track)
  * - 'classmap': a mapping of class IDs to use from the original track to
  *   the cloned track.  If a class from the original track is not mapped, a
  *   new class will be created
  * - 'moodlecourse': whether or not to clone Moodle courses (if they were
  *   autocreated).  Values can be (default: "copyalways"):
  *   - "copyalways": always copy course
  *   - "copyautocreated": only copy autocreated courses
  *   - "autocreatenew": autocreate new courses from course template
  *   - "link": link to existing course
  * @return array array of array of object IDs created.  Key in outer array
  * is type of object (plural).  Key in inner array is original object ID,
  * value is new object ID.  Outer array also has an entry called 'errors',
  * which is an array of any errors encountered when duplicating the
  * object.
  */
 function duplicate(array $options = array())
 {
     $objs = array('errors' => array());
     if (isset($options['targetcluster'])) {
         $userset = $options['targetcluster'];
         if (!is_object($userset) || !is_a($userset, 'userset')) {
             $options['targetcluster'] = $userset = new userset($userset);
         }
     }
     // Due to lazy loading, we need to pre-load this object
     $this->load();
     // clone main track object
     $clone = new track($this);
     unset($clone->id);
     if (isset($options['targetcurriculum'])) {
         $clone->curid = $options['targetcurriculum'];
     }
     $idnumber = $clone->idnumber;
     $name = $clone->name;
     if (isset($userset)) {
         $to_append = ' - ' . $userset->name;
         // if cluster specified, append cluster's name to course
         $idnumber = append_once($idnumber, $to_append, array('maxlength' => 95));
         $name = append_once($name, $to_append, array('maxlength' => 250));
     }
     //get a unique idnumber
     $clone->idnumber = generate_unique_identifier(track::TABLE, 'idnumber', $idnumber, array('idnumber' => $idnumber));
     if ($clone->idnumber != $idnumber) {
         //get the suffix appended and add it to the name
         $parts = explode('.', $clone->idnumber);
         $suffix = end($parts);
         $clone->name = $name . '.' . $suffix;
     } else {
         $clone->name = $name;
     }
     $clone->autocreate = false;
     // avoid warnings
     $clone->save();
     $objs['tracks'] = array($this->id => $clone->id);
     // associate with target cluster (if any)
     if (isset($userset)) {
         clustertrack::associate($userset->id, $clone->id);
     }
     // copy classes
     $clstrks = track_assignment_get_listing($this->id);
     if ($clstrks->valid() === true) {
         $objs['classes'] = array();
         if (!isset($options['classmap'])) {
             $options['classmap'] = array();
         }
         foreach ($clstrks as $clstrkdata) {
             $newclstrk = new trackassignment($clstrkdata);
             $newclstrk->trackid = $clone->id;
             unset($newclstrk->id);
             if (isset($options['classmap'][$clstrkdata->clsid])) {
                 // use existing duplicate class
                 $class = new pmclass($options['classmap'][$clstrkdata->clsid]);
             } else {
                 // no existing duplicate -> duplicate class
                 $class = new pmclass($clstrkdata->clsid);
                 $rv = $class->duplicate($options);
                 if (isset($rv['errors']) && !empty($rv['errors'])) {
                     $objs['errors'] = array_merge($objs['errors'], $rv['errors']);
                 }
                 if (isset($rv['classes'])) {
                     $objs['classes'] = $objs['classes'] + $rv['classes'];
                 }
             }
             $newclstrk->classid = $class->id;
             $newclstrk->courseid = $class->courseid;
             $newclstrk->save();
         }
     }
     unset($clstrks);
     return $objs;
 }
Ejemplo n.º 3
0
 /**
  * Clone a curriculum.
  * @param array $options options for cloning.  Valid options are:
  * - 'tracks': whether or not to clone tracks (default: false)
  * - 'courses': whether or not to clone courses (default: false)
  * - 'classes': whether or not to clone classes (default: false)
  * - 'moodlecourses': whether or not to clone Moodle courses (if they were
  *   autocreated).  Values can be (default: "copyalways"):
  *   - "copyalways": always copy course
  *   - "copyautocreated": only copy autocreated courses
  *   - "autocreatenew": autocreate new courses from course template
  *   - "link": link to existing course
  * - 'targetcluster': the cluster id or cluster object (if any) to
  *   associate the clones with (default: none)
  * @return array array of array of object IDs created.  Key in outer array
  * is type of object (plural).  Key in inner array is original object ID,
  * value is new object ID.  Outer array also has an entry called 'errors',
  * which is an array of any errors encountered when duplicating the
  * object.
  */
 function duplicate(array $options = array())
 {
     require_once elispm::lib('data/track.class.php');
     $objs = array('errors' => array());
     if (isset($options['targetcluster'])) {
         $userset = $options['targetcluster'];
         if (!is_object($userset) || !is_a($userset, 'userset')) {
             $options['targetcluster'] = $userset = new userset($userset);
         }
     }
     // Due to lazy loading, we need to pre-load this object
     $this->load();
     // clone main curriculum object
     $clone = new curriculum($this);
     unset($clone->id);
     $idnumber = $clone->idnumber;
     $name = $clone->name;
     if (isset($userset)) {
         $to_append = ' - ' . $userset->name;
         // if cluster specified, append cluster's name to curriculum
         $idnumber = append_once($idnumber, $to_append, array('maxlength' => 95));
         $name = append_once($name, $to_append, array('maxlength' => 59));
     }
     //get a unique idnumber
     $clone->idnumber = generate_unique_identifier(curriculum::TABLE, 'idnumber', $idnumber, array('idnumber' => $idnumber));
     if ($clone->idnumber != $idnumber) {
         //get the suffix appended and add it to the name
         $parts = explode('.', $clone->idnumber);
         $suffix = end($parts);
         $clone->name = $name . '.' . $suffix;
     } else {
         $clone->name = $name;
     }
     $clone = new curriculum($clone);
     $clone->save();
     $objs['curricula'] = array($this->id => $clone->id);
     $options['targetcurriculum'] = $clone->id;
     // associate with target cluster (if any)
     if (isset($userset)) {
         clustercurriculum::associate($userset->id, $clone->id);
     }
     if (!empty($options['courses'])) {
         // copy courses
         $currcrs = curriculumcourse_get_list_by_curr($this->id);
         if ($currcrs->valid()) {
             $objs['courses'] = array();
             $objs['classes'] = array();
             foreach ($currcrs as $currcrsdata) {
                 $course = new course($currcrsdata->courseid);
                 $rv = $course->duplicate($options);
                 if (isset($rv['errors']) && !empty($rv['errors'])) {
                     $objs['errors'] = array_merge($objs['errors'], $rv['errors']);
                 }
                 if (isset($rv['courses'])) {
                     $objs['courses'] = $objs['courses'] + $rv['courses'];
                 }
                 if (isset($rv['classes'])) {
                     $objs['classes'] = $objs['classes'] + $rv['classes'];
                 }
                 // associate with curriculum
                 if (isset($rv['courses'][$course->id])) {
                     $curcrs = new curriculumcourse($currcrsdata);
                     unset($curcrs->id);
                     $curcrs->courseid = $rv['courses'][$course->id];
                     $curcrs->curriculumid = $clone->id;
                     $curcrs->save();
                 }
             }
         }
         unset($currcrs);
     }
     if (!empty($objs['errors'])) {
         return $objs;
     }
     if (!empty($options['tracks'])) {
         // copy tracks
         $tracks = track_get_listing('name', 'ASC', 0, 0, '', '', $this->id);
         if (isset($objs['courses'])) {
             $options['coursemap'] = $objs['courses'];
         }
         if (!empty($tracks)) {
             $objs['tracks'] = array();
             if (isset($objs['courses'])) {
                 $options['coursemap'] = $objs['courses'];
             }
             if (!isset($objs['classes'])) {
                 $objs['classes'] = array();
             }
             foreach ($tracks as $track) {
                 $track = new track($track);
                 $options['classmap'] = $objs['classes'];
                 $rv = $track->duplicate($options);
                 if (isset($rv['errors']) && !empty($rv['errors'])) {
                     $objs['errors'] = array_merge($objs['errors'], $rv['errors']);
                 }
                 if (isset($rv['tracks'])) {
                     $objs['tracks'] = $objs['tracks'] + $rv['tracks'];
                 }
                 if (isset($rv['classes'])) {
                     $objs['classes'] = $objs['classes'] + $rv['classes'];
                 }
             }
         }
     }
     return $objs;
 }
Ejemplo n.º 4
0
 /**
  * Clone a course.
  * @param array $options options for cloning.  Valid options are:
  * - 'classes': whether or not to clone classes (default: false)
  * - 'moodlecourses': whether or not to clone Moodle courses (if they were
  *   autocreated).  Values can be (default: "copyalways"):
  *   - "copyalways": always copy course
  *   - "copyautocreated": only copy autocreated courses
  *   - "autocreatenew": autocreate new courses from course template
  *   - "link": link to existing course
  * - 'targetcluster': the cluster id or cluster object (if any) to
  *   associate the clones with (default: none)
  * @return array array of array of object IDs created.  Key in outer array
  * is type of object (plural).  Key in inner array is original object ID,
  * value is new object ID.  Outer array also has an entry called 'errors',
  * which is an array of any errors encountered when duplicating the
  * object.
  */
 function duplicate(array $options)
 {
     require_once elispm::lib('data/pmclass.class.php');
     require_once elispm::lib('data/coursetemplate.class.php');
     $objs = array('errors' => array());
     if (isset($options['targetcluster'])) {
         $userset = $options['targetcluster'];
         if (!is_object($userset) || !is_a($userset, 'userset')) {
             $options['targetcluster'] = $userset = new userset($userset);
         }
     }
     // Due to lazy loading, we need to pre-load this object
     $this->load();
     // clone main course object
     $clone = new course($this);
     unset($clone->id);
     $idnumber = $clone->idnumber;
     $name = $clone->name;
     if (isset($userset)) {
         $to_append = ' - ' . $userset->name;
         // if cluster specified, append cluster's name to course
         $idnumber = append_once($idnumber, $to_append, array('maxlength' => 95));
         $name = append_once($name, $to_append, array('maxlength' => 250));
     }
     //get a unique idnumber
     $clone->idnumber = generate_unique_identifier(course::TABLE, 'idnumber', $idnumber, array('idnumber' => $idnumber));
     if ($clone->idnumber != $idnumber) {
         //get the suffix appended and add it to the name
         $parts = explode('.', $clone->idnumber);
         $suffix = end($parts);
         $clone->name = $name . '.' . $suffix;
     } else {
         $clone->name = $name;
     }
     $clone->save();
     $objs['courses'] = array($this->id => $clone->id);
     $options['targetcourse'] = $clone->id;
     // copy completion elements
     $compelems = $this->get_completion_elements();
     foreach ($compelems as $compelem) {
         unset($compelem->id);
         $clone->save_completion_element($compelem);
     }
     unset($compelems);
     // copy template
     $template = $this->_db->get_record(coursetemplate::TABLE, array('courseid' => $this->id));
     $template = new coursetemplate($template);
     unset($template->id);
     $template->courseid = $clone->id;
     $template->save();
     // copy the classes
     if (!empty($options['classes'])) {
         $classes = pmclass_get_record_by_courseid($this->id);
         if (!empty($classes)) {
             $objs['classes'] = array();
             foreach ($classes as $class) {
                 $class = new pmclass($class);
                 $rv = $class->duplicate($options);
                 if (isset($rv['errors']) && !empty($rv['errors'])) {
                     $objs['errors'] = array_merge($objs['errors'], $rv['errors']);
                 }
                 if (isset($rv['classes'])) {
                     $objs['classes'] = $objs['classes'] + $rv['classes'];
                 }
             }
         }
     }
     return $objs;
 }
Ejemplo n.º 5
0
 /**
  * Clone a class
  * @param array $options options for cloning.  Valid options are:
  * - 'moodlecourses': whether or not to clone Moodle courses (if they were
  *   autocreated).  Values can be (default: "copyalways"):
  *   - "copyalways": always copy course
  *   - "copyautocreated": only copy autocreated courses
  *   - "autocreatenew": autocreate new courses from course template
  *   - "link": link to existing course
  * - 'targetcourse': the course id to associate the clones with (default:
  *   same as original class)
  * @return array array of array of object IDs created.  Key in outer array
  * is type of object (plural).  Key in inner array is original object ID,
  * value is new object ID.  Outer array also has an entry called 'errors',
  * which is an array of any errors encountered when duplicating the
  * object.
  */
 function duplicate(array $options = array())
 {
     //needed by the rollover lib
     global $CFG;
     require_once elis::lib('rollover/lib.php');
     $objs = array('errors' => array());
     if (isset($options['targetcluster'])) {
         $userset = $options['targetcluster'];
         if (!is_object($userset) || !is_a($userset, 'userset')) {
             $options['targetcluster'] = $userset = new userset($userset);
         }
     }
     // Due to lazy loading, we need to pre-load this object
     $this->load();
     // clone main class object
     $clone = new pmclass($this);
     unset($clone->id);
     if (isset($options['targetcourse'])) {
         $clone->courseid = $options['targetcourse'];
     }
     $idnumber = $clone->idnumber;
     if (isset($userset)) {
         $idnumber = append_once($idnumber, ' - ' . $userset->name, array('maxlength' => 95));
     }
     //get a unique idnumber
     $clone->idnumber = generate_unique_identifier(pmclass::TABLE, 'idnumber', $idnumber, array('idnumber' => $idnumber));
     $clone->autocreate = false;
     // avoid warnings
     $clone->save();
     $objs['classes'] = array($this->id => $clone->id);
     $cmc = $this->_db->get_record(classmoodlecourse::TABLE, array('classid' => $this->id));
     if ($cmc) {
         if ($cmc->autocreated == -1) {
             $cmc->autocreated = elis::$config->local_elisprogram->autocreated_unknown_is_yes;
         }
         if (empty($options['moodlecourses']) || $options['moodlecourses'] == 'copyalways' || $options['moodlecourses'] == 'copyautocreated' && $cmc->autocreated) {
             // create a new Moodle course based on the current class's Moodle course
             $moodlecourseid = course_rollover($cmc->moodlecourseid);
             //check that the course has rolled over successfully
             if (!$moodlecourseid) {
                 return false;
             }
             // Rename the fullname, shortname and idnumber of the restored course
             $restore = new stdClass();
             $restore->id = $moodlecourseid;
             // ELIS-2941: Don't prepend course name if already present ...
             if (strpos($clone->idnumber, $clone->course->name) !== 0) {
                 $restore->fullname = $clone->course->name . '_' . $clone->idnumber;
             } else {
                 $restore->fullname = $clone->idnumber;
             }
             $restore->shortname = $clone->idnumber;
             $this->_db->update_record('course', $restore);
             moodle_attach_class($clone->id, $moodlecourseid);
         } elseif ($options['moodlecourses'] == 'link' || $options['moodlecourses'] == 'copyautocreated' && !$cmc->autocreated) {
             // link to the current class's Moodle course
             moodle_attach_class($clone->id, $cmc->moodlecourseid);
         } else {
             // $options['moodlecourses'] == 'autocreatenew'
             // create a new course based on the course template
             moodle_attach_class($clone->id, 0, '', false, false, true);
         }
     }
     return $objs;
 }