Merge branch 'MDL-32895' of git://github.com/netspotau/moodle-mod_assign
authorDan Poltawski <dan@moodle.com>
Wed, 23 May 2012 03:13:03 +0000 (11:13 +0800)
committerDan Poltawski <dan@moodle.com>
Wed, 23 May 2012 03:13:03 +0000 (11:13 +0800)
1  2 
mod/assign/upgradelib.php

@@@ -29,6 -29,12 +29,12 @@@ require_once($CFG->dirroot.'/mod/assign
  /** Include accesslib.php */
  require_once($CFG->libdir.'/accesslib.php');
  
+ /**
+  * The maximum amount of time to spend upgrading a single assignment.
+  * This is intentionally generous (5 mins) as the effect of a timeout
+  * for a legitimate upgrade would be quite harsh (roll back code will not run)
+  */
+ define('ASSIGN_MAX_UPGRADE_TIME_SECS', 300);
  
  /**
   * Class to manage upgrades from mod_assignment to mod_assign
@@@ -48,9 -54,7 +54,7 @@@ class assign_upgrade_manager 
       * @return bool true or false
       */
      public function upgrade_assignment($oldassignmentid, & $log) {
-         global $DB, $CFG;
          // steps to upgrade an assignment
          global $DB, $CFG, $USER;
          // steps to upgrade an assignment
  
@@@ -59,6 -63,9 +63,9 @@@
                return false;
          }
  
+         // should we use a shutdown handler to rollback on timeout?
+         @set_time_limit(ASSIGN_MAX_UPGRADE_TIME_SECS);
  
          // get the module details
          $oldmodule = $DB->get_record('modules', array('name'=>'assignment'), '*', MUST_EXIST);
          $gradingdefinitions = null;
          $gradeidmap = array();
          $completiondone = false;
 +        $gradesdone = false;
  
          // from this point we want to rollback on failure
          $rollback = false;
              $newassignment->update_gradebook(false,$newcoursemodule->id);
  
              // copy the grades from the old assignment to the new one
 -            $this->copy_grades_for_upgrade($oldassignment, $newassignment);
 +            $DB->set_field('grade_items', 'itemmodule', 'assign', array('iteminstance'=>$oldassignment->id));
 +            $DB->set_field('grade_items', 'iteminstance', $newassignment->get_instance()->id, array('iteminstance'=>$oldassignment->id));
 +            $gradesdone = true;
  
          } catch (Exception $exception) {
              $rollback = true;
-             $log .= get_string('conversionexception', 'mod_assign', $exception->getMessage());
+             $log .= get_string('conversionexception', 'mod_assign', $exception->error);
          }
  
          if ($rollback) {
 +            // roll back the grades changes
 +            if ($gradesdone) {
 +                // copy the grades from the old assignment to the new one
 +                $DB->set_field('grade_items', 'itemmodule', 'assignment', array('iteminstance'=>$newassignment->get_instance()->id));
 +                $DB->set_field('grade_items', 'iteminstance', $oldassignment->id, array('iteminstance'=>$newassignment->get_instance()->id));
 +            }
              // roll back the completion changes
              if ($completiondone) {
                  $DB->set_field('course_modules_completion', 'coursemoduleid', $oldcoursemodule->id, array('coursemoduleid'=>$newcoursemodule->id));
          return true;
      }
  
 -    /**
 -     * This function copies the grades from the old assignment module to this one.
 -     *
 -     * @param stdClass $oldassignment old assignment data record
 -     * @param assign $newassignment the new assign class
 -     * @return bool true or false
 -     */
 -    public function copy_grades_for_upgrade($oldassignment, $newassignment) {
 -        global $CFG;
 -
 -        require_once($CFG->libdir.'/gradelib.php');
 -
 -        // get the old and new grade items
 -        $oldgradeitems = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>'assignment', 'iteminstance'=>$oldassignment->id));
 -        if (!$oldgradeitems) {
 -            return false;
 -        }
 -        $oldgradeitem = array_pop($oldgradeitems);
 -        if (!$oldgradeitem) {
 -            return false;
 -        }
 -        $newgradeitems = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>'assign', 'iteminstance'=>$newassignment->get_instance()->id));
 -        if (!$newgradeitems) {
 -            return false;
 -        }
 -        $newgradeitem = array_pop($newgradeitems);
 -        if (!$newgradeitem) {
 -            return false;
 -        }
 -
 -        $gradegrades = grade_grade::fetch_all(array('itemid'=>$oldgradeitem->id));
 -        if ($gradegrades) {
 -            foreach ($gradegrades as $gradeid=>$grade) {
 -                $grade->itemid = $newgradeitem->id;
 -                grade_update('mod/assign', $newassignment->get_course()->id, 'mod', 'assign', $newassignment->get_instance()->id, 0, $grade, NULL);
 -            }
 -        }
 -        return true;
 -    }
 -
  }