Uploaded image for project: 'Moodle'
  1. Moodle
  2. MDL-80253

add idnumber to method core_course_duplicate_course

XMLWordPrintable

    • MOODLE_401_STABLE

      Is it possible to add the idnumber also to the method 
      duplicate_course in externallib.
       
      Passing the param idnumber to the method core_course_duplicate_course should also be possible.
       
      The two methods for this could be:
       
      public static function duplicate_course_parameters()

      { return new external_function_parameters( array( 'courseid' => new external_value(PARAM_INT, 'course to duplicate id'), 'fullname' => new external_value(PARAM_TEXT, 'duplicated course full name'), 'shortname' => new external_value(PARAM_TEXT, 'duplicated course short name'), 'categoryid' => new external_value(PARAM_INT, 'duplicated course category parent'), 'visible' => new external_value(PARAM_INT, 'duplicated course visible, default to yes', VALUE_DEFAULT, 1), 'options' => new external_multiple_structure( new external_single_structure( array( 'name' => new external_value(PARAM_ALPHAEXT, 'The backup option name: "activities" (int) Include course activites (default to 1 that is equal to yes), "blocks" (int) Include course blocks (default to 1 that is equal to yes), "filters" (int) Include course filters (default to 1 that is equal to yes), "users" (int) Include users (default to 0 that is equal to no), "enrolments" (int) Include enrolment methods (default to 1 - restore only with users), "role_assignments" (int) Include role assignments (default to 0 that is equal to no), "comments" (int) Include user comments (default to 0 that is equal to no), "userscompletion" (int) Include user course completion information (default to 0 that is equal to no), "logs" (int) Include course logs (default to 0 that is equal to no), "grade_histories" (int) Include histories (default to 0 that is equal to no)' ), 'value' => new external_value(PARAM_RAW, 'the value for the option 1 (yes) or 0 (no)' ) ) ), 'Course duplication options', VALUE_DEFAULT, array() ), *'idnumber' => new external_value(PARAM_TEXT, 'idnumber for the course', VALUE_OPTIONAL),* ) ); }

      /**

      • Duplicate a course
        *
      • @param int $courseid
      • @param string $fullname Duplicated course fullname
      • @param string $shortname Duplicated course shortname
      • @param int $categoryid Duplicated course parent category id
      • @param int $visible Duplicated course availability
      • @param array $options List of backup options
      • @return array New course info
      • @since Moodle 2.3
        */
        public static function duplicate_course($courseid, $fullname, $shortname, $categoryid, $visible = 1, $options = array(), $idnumber = null) {
        global $CFG, $USER, $DB;
        require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
        require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');

      // Parameter validation.
      $params = self::validate_parameters(
      self::duplicate_course_parameters(),
      array(
      'courseid' => $courseid,
      'fullname' => $fullname,
      'shortname' => $shortname,
      'categoryid' => $categoryid,
      'visible' => $visible,
      'options' => $options,
      'idnumber' => $idnumber
      )
      );

      // Context validation.

      if (! ($course = $DB->get_record('course', array('id'=>$params['courseid']))))

      { throw new moodle_exception('invalidcourseid', 'error'); }

      // Category where duplicated course is going to be created.
      $categorycontext = context_coursecat::instance($params['categoryid']);
      self::validate_context($categorycontext);

      // Course to be duplicated.
      $coursecontext = context_course::instance($course->id);
      self::validate_context($coursecontext);

      $backupdefaults = array(
      'activities' => 1,
      'blocks' => 1,
      'filters' => 1,
      'users' => 0,
      'enrolments' => backup::ENROL_WITHUSERS,
      'role_assignments' => 0,
      'comments' => 0,
      'userscompletion' => 0,
      'logs' => 0,
      'grade_histories' => 0
      );

      $backupsettings = array();
      // Check for backup and restore options.
      if (!empty($params['options'])) {
      foreach ($params['options'] as $option) {

      // Strict check for a correct value (allways 1 or 0, true or false).
      $value = clean_param($option['value'], PARAM_INT);

      if ($value !== 0 and $value !== 1)

      { throw new moodle_exception('invalidextparam', 'webservice', '', $option['name']); }

      if (!isset($backupdefaults[$option['name']])) { throw new moodle_exception('invalidextparam', 'webservice', '', $option['name']); }

      $backupsettings[$option['name']] = $value;
      }
      }

      // Capability checking.

      // The backup controller check for this currently, this may be redundant.
      require_capability('moodle/course:create', $categorycontext);
      require_capability('moodle/restore:restorecourse', $categorycontext);
      require_capability('moodle/backup:backupcourse', $coursecontext);

      if (!empty($backupsettings['users']))

      { require_capability('moodle/backup:userinfo', $coursecontext); require_capability('moodle/restore:userinfo', $categorycontext); }

      // Check if the shortname is used.
      if ($foundcourses = $DB->get_records('course', array('shortname'=>$shortname))) {
      foreach ($foundcourses as $foundcourse)

      { $foundcoursenames[] = $foundcourse->fullname; }

      $foundcoursenamestring = implode(',', $foundcoursenames);
      throw new moodle_exception('shortnametaken', '', '', $foundcoursenamestring);
      }

      // Backup the course.

      $bc = new backup_controller(backup::TYPE_1COURSE, $course->id, backup::FORMAT_MOODLE,
      backup::INTERACTIVE_NO, backup::MODE_SAMESITE, $USER->id);

      foreach ($backupsettings as $name => $value) {
      if ($setting = $bc->get_plan()->get_setting($name))

      { $bc->get_plan()->get_setting($name)->set_value($value); }

      }

      $backupid = $bc->get_backupid();
      $backupbasepath = $bc->get_plan()->get_basepath();

      $bc->execute_plan();
      $results = $bc->get_results();
      $file = $results['backup_destination'];

      $bc->destroy();

      // Restore the backup immediately.

      // Check if we need to unzip the file because the backup temp dir does not contains backup files.
      if (!file_exists($backupbasepath . "/moodle_backup.xml"))

      { $file->extract_to_pathname(get_file_packer('application/vnd.moodle.backup'), $backupbasepath); }

      // Create new course.
      $newcourseid = restore_dbops::create_new_course($params['fullname'], $params['shortname'], $params['categoryid']);

      $rc = new restore_controller($backupid, $newcourseid,
      backup::INTERACTIVE_NO, backup::MODE_SAMESITE, $USER->id, backup::TARGET_NEW_COURSE);

      foreach ($backupsettings as $name => $value) {
      $setting = $rc->get_plan()->get_setting($name);
      if ($setting->get_status() == backup_setting::NOT_LOCKED)

      { $setting->set_value($value); }

      }

      if (!$rc->execute_precheck()) {
      $precheckresults = $rc->get_precheck_results();
      if (is_array($precheckresults) && !empty($precheckresults['errors'])) {
      if (empty($CFG->keeptempdirectoriesonbackup))

      { fulldelete($backupbasepath); }

      $errorinfo = '';

      foreach ($precheckresults['errors'] as $error) { $errorinfo .= $error; }

      if (array_key_exists('warnings', $precheckresults)) {
      foreach ($precheckresults['warnings'] as $warning) { $errorinfo .= $warning; }
      }

      throw new moodle_exception('backupprecheckerrors', 'webservice', '', $errorinfo);
      }
      }

      $rc->execute_plan();
      $rc->destroy();

      $course = $DB->get_record('course', array('id' => $newcourseid), '*', MUST_EXIST);
      $course->fullname = $params['fullname'];
      $course->shortname = $params['shortname'];
      $course->visible = $params['visible'];
      $course->idnumber = $params['idnumber'];

      // Set shortname and fullname back.
      $DB->update_record('course', $course);

      if (empty($CFG->keeptempdirectoriesonbackup)) { fulldelete($backupbasepath); }

      // Delete the course backup file created by this WebService. Originally located in the course backups area.
      $file->delete();

      return array('id' => $course->id, 'shortname' => $course->shortname);
      }

            Unassigned Unassigned
            timbr Tim Brouckaert
            Votes:
            0 Vote for this issue
            Watchers:
            12 Start watching this issue

              Created:
              Updated:
              Resolved:

                Error rendering 'clockify-timesheets-time-tracking-reports:timer-sidebar'. Please contact your Jira administrators.