Example #1
0
/**
 * Migrate lesson images incorrectly placed into moddata folder,
 * the images were stored in random directories ignoring all coding rules.
 *
 * @return void
 */
function lesson_20_migrate_moddata_mixture($courseid, $path)
{
    global $CFG, $DB, $OUTPUT;
    $fullpathname = "{$CFG->dataroot}/{$courseid}" . $path;
    if (!file_exists($fullpathname)) {
        return;
    }
    $context = get_context_instance(CONTEXT_COURSE, $courseid);
    $items = new DirectoryIterator($fullpathname);
    $fs = get_file_storage();
    foreach ($items as $item) {
        if ($item->isDot()) {
            // skip
            continue;
        }
        if ($item->isFile()) {
            if (!$item->isReadable()) {
                echo $OUTPUT->notification(" File not readable, skipping: " . $courseid . $path . $item->getFilename());
                continue;
            }
            $filepath = clean_param($path, PARAM_PATH);
            $filename = clean_param($item->getFilename(), PARAM_FILE);
            if ($filename === '') {
                //unsupported chars, sorry
                continue;
            }
            if (!$fs->file_exists($context->id, 'course', 'legacy', '0', $filepath, $filename)) {
                $file_record = array('contextid' => $context->id, 'component' => 'course', 'filearea' => 'legacy', 'itemid' => 0, 'filepath' => $filepath, 'filename' => $filename, 'timecreated' => $item->getCTime(), 'timemodified' => $item->getMTime());
                $fs->create_file_from_pathname($file_record, $fullpathname . $item->getFilename());
                @unlink($fullpathname . $item->getFilename());
            }
        } else {
            //migrate recursively all subdirectories
            lesson_20_migrate_moddata_mixture($courseid, $path . $item->getFilename() . '/');
        }
    }
    unset($item);
    //release file handles
    unset($items);
    //release file handles
    // delete dir if empty
    @rmdir($fullpathname);
}
Example #2
0
/**
 *
 * @global stdClass $CFG
 * @global moodle_database $DB
 * @global core_renderer $OUTPUT
 * @param int $oldversion
 * @return bool 
 */
function xmldb_lesson_upgrade($oldversion) {
    global $CFG, $DB, $OUTPUT;

    $dbman = $DB->get_manager();

//===== 1.9.0 upgrade line ======//

    if ($oldversion < 2007072201) {

        $table = new xmldb_table('lesson');
        $field = new xmldb_field('usegrademax');
        $field2 = new xmldb_field('usemaxgrade');

    /// Rename lesson->usegrademax to lesson->usemaxgrade. Some old sites can have it incorrect. MDL-13177
        if ($dbman->field_exists($table, $field) && !$dbman->field_exists($table, $field2)) {
        /// Set field specs
            $field->set_attributes(XMLDB_TYPE_INTEGER, '3', null, XMLDB_NOTNULL, null, '0', 'ongoing');
        /// Launch rename field usegrademax to usemaxgrade
            $dbman->rename_field($table, $field, 'usemaxgrade');
        }

        upgrade_mod_savepoint(true, 2007072201, 'lesson');
    }

    if ($oldversion < 2008112601) {
        //NOTE: this is a hack, we can not call module lib.php in the middle of upgrade, the necessary db structures/data may not exist yet!
        require_once($CFG->dirroot.'/mod/lesson/lib.php');

        lesson_upgrade_grades();

        upgrade_mod_savepoint(true, 2008112601, 'lesson');
    }

    if ($oldversion < 2009111600) {
        /**
         * Change the grade field within lesson_answers to an unsigned int and increment
         * the length by one to ensure that no values are changed (reduced)
         */
        $table = new xmldb_table('lesson_answers');
        $field = new xmldb_field('grade');
        $field->set_attributes(XMLDB_TYPE_INTEGER, '4', false, XMLDB_NOTNULL, null, '0', 'jumpto');
        $dbman->change_field_type($table, $field);
        upgrade_mod_savepoint(true, 2009111600, 'lesson');
    }

    if ($oldversion < 2009120800) {
        /**
         * Drop the lesson_default table, as of Moodle 2.0 it is no longer used
         * the module now has a settings.php instead
         */
        $table = new xmldb_table('lesson_default');
        $dbman->drop_table($table);
        upgrade_mod_savepoint(true, 2009120800, 'lesson');
    }

    if ($oldversion < 2009120801) {

    /// Define field contentsformat to be added to lesson_pages
        $table = new xmldb_table('lesson_pages');
        $field = new xmldb_field('contentsformat', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, FORMAT_MOODLE, 'contents');

    /// Conditionally launch add field contentsformat
        if (!$dbman->field_exists($table, $field)) {
            $dbman->add_field($table, $field);
        }

        // conditionally migrate to html format in contents
        if ($CFG->texteditors !== 'textarea') {
            $rs = $DB->get_recordset('lesson_pages', array('contentsformat'=>FORMAT_MOODLE), '', 'id,contents,contentsformat');
            foreach ($rs as $lp) {
                $lp->contents       = text_to_html($lp->contents, false, false, true);
                $lp->contentsformat = FORMAT_HTML;
                $DB->update_record('lesson_pages', $lp);
                upgrade_set_timeout();
            }
            $rs->close();
        }
    /// lesson savepoint reached
        upgrade_mod_savepoint(true, 2009120801, 'lesson');
    }

    if ($oldversion < 2010072000) {
        // Define field answerformat to be added to lesson_answers
        $table = new xmldb_table('lesson_answers');
        $field = new xmldb_field('answerformat', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'answer');

        // Launch add field answerformat
        $dbman->add_field($table, $field);

        // lesson savepoint reached
        upgrade_mod_savepoint(true, 2010072000, 'lesson');
    }

    if ($oldversion < 2010072001) {
        // Define field responseformat to be added to lesson_answers
        $table = new xmldb_table('lesson_answers');
        $field = new xmldb_field('responseformat', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'response');

        // Launch add field responseformat
        $dbman->add_field($table, $field);

        // lesson savepoint reached
        upgrade_mod_savepoint(true, 2010072001, 'lesson');
    }

    if ($oldversion < 2010072003) {
        $rs = $DB->get_recordset('lesson_answers', array());
        foreach ($rs as $answer) {
            $flags = intval($answer->flags);
            $update = false;
            if ($flags & 1) {
                $answer->answer       = text_to_html($answer->answer, false, false, true);
                $answer->answerformat = FORMAT_HTML;
                $update = true;
            }
            if ($flags & 2) {
                $answer->response       = text_to_html($answer->response, false, false, true);
                $answer->responseformat = FORMAT_HTML;
                $update = true;
            }
            if ($update) {
                $DB->update_record('lesson_answers', $answer);
            }
        }
        $rs->close();
        upgrade_mod_savepoint(true, 2010072003, 'lesson');
    }


    if ($oldversion < 2010081200) {
        require_once("$CFG->dirroot/mod/lesson/db/upgradelib.php");

        $sqlfrom = "FROM {lesson} l
                    JOIN {modules} m ON m.name = 'lesson'
                    JOIN {course_modules} cm ON (cm.module = m.id AND cm.instance = l.id)";

        $count = $DB->count_records_sql("SELECT COUNT('x') $sqlfrom");

        if ($count > 0) {
            $rs = $DB->get_recordset_sql("SELECT l.id, l.mediafile, l.course, cm.id AS cmid $sqlfrom ORDER BY l.course, l.id");

            $pbar = new progress_bar('migratelessonfiles', 500, true);
            $fs = get_file_storage();

            $i = 0;
            foreach ($rs as $lesson) {
                $i++;
                upgrade_set_timeout(120); // set up timeout, may also abort execution
                $pbar->update($i, $count, "Migrating lesson files - $i/$count.");

                // fix images incorrectly placed in moddata subfolders,
                // this was a really bad decision done by the ppt import developer
                if (file_exists("$CFG->dataroot/$lesson->course/moddata/lesson/")) {
                    lesson_20_migrate_moddata_mixture($lesson->course, '/moddata/lesson/');
                    @rmdir("$CFG->dataroot/$lesson->course/moddata/lesson/"); // remove dir if empty
                    @rmdir("$CFG->dataroot/$lesson->course/moddata/"); // remove dir if empty
                }

                // migrate media file only if local course file selected - this is not nice at all,
                // it should better be a real block, not a lesson specific hack
                if (strpos($lesson->mediafile, '://') !== false) {
                    // some external URL

                } else if ($lesson->mediafile) {
                    $context = get_context_instance(CONTEXT_MODULE, $lesson->cmid);
                    $coursecontext = get_context_instance(CONTEXT_COURSE, $lesson->course);
                    $filepathname = clean_param('/'.$lesson->mediafile, PARAM_PATH);
                    $fullpath = "/$context->id/mod_lesson/mediafile/0$filepathname";

                    if ($file = $fs->get_file_by_hash(sha1($fullpath)) and !$file->is_directory()) {
                        // already converted, just update filename
                        $DB->set_field('lesson', 'mediafile', $filepathname, array('id'=>$lesson->id));
                    } else {
                        // let's copy file from current course legacy files if possible
                        $fullpath = "/$coursecontext->id/course/legacy/0$filepathname";
                        if ($file = $fs->get_file_by_hash(sha1($fullpath)) and !$file->is_directory()) {
                            $file_record = array('contextid'=>$context->id, 'component'=>'mod_lesson', 'filearea'=>'mediafile', 'itemid'=>0, 'filepath'=>$file->get_filepath(), 'filename'=>$file->get_filename(), 'sortorder'=>1);
                            $fs->create_file_from_storedfile($file_record, $file);
                            $DB->set_field('lesson', 'mediafile', $filepathname, array('id'=>$lesson->id));

                        } else {
                            // bad luck, no such file exists
                            $DB->set_field('lesson', 'mediafile', '', array('id'=>$lesson->id));
                        }
                    }
                }
            }
            $rs->close();
        }

        upgrade_mod_savepoint(true, 2010081200, 'lesson');
    }
    
    
    if ($oldversion < 2010121400) {
        // Fix matching question pages.
        // In Moodle 1.9 matching question pages stored the correct and incorrect
        // jumps on the third and forth answers, in Moodle 2.0 they are stored
        // in the first and second answers.
        // This upgrade block detects matching questions where this is the case
        // and fixed it by making firstjump = thirdjump && secondjump = forthjump.
        $pages = $DB->get_recordset('lesson_pages', array('qtype'=>'5'));
        foreach ($pages as $page) {
            $answers = $DB->get_records('lesson_answers', array('pageid'=>$page->id), 'id', 'id, jumpto', 0, 4);
            if (count($answers) < 4) {
                // If there are less then four answers the problem wont exist.
                // All Moodle 1.9 matching questions had a least 4 answers.
                continue;
            }
            $first  = array_shift($answers);
            $second = array_shift($answers);
            $third  = array_shift($answers);
            $forth  = array_shift($answers);
            if ($first->jumpto !== '0' || $second->jumpto !== '0') {
                // If either are set to something other than the next page then
                // there is no problem.
                continue;
            }
            if ($third->jumpto !== '0') {
                $first->jumpto = $third->jumpto;
                $DB->update_record('lesson_answers', $first);
                $third->jumpto = '0';
                $DB->update_record('lesson_answers', $third);
            }
            if ($forth->jumpto !== '0') {
                $second->jumpto = $forth->jumpto;
                $DB->update_record('lesson_answers', $second);
                $forth->jumpto = '0';
                $DB->update_record('lesson_answers', $forth);
            }
        }
        // Close the record set
        $pages->close();
        
        upgrade_mod_savepoint(true, 2010121400, 'lesson');
    }

    // Moodle v2.1.0 release upgrade line
    // Put any upgrade step following this

    // Moodle v2.2.0 release upgrade line
    // Put any upgrade step following this

    return true;
}