License * - http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * * @param $oldversion Number of the "old version" of iAssing (registered in {config_plugins}. */ require_once $CFG->dirroot . '/mod/iassign/locallib.php'; //DEBUG Since results in 'upgrade' is not presented (only the final situation), you //DEBUG can use the auxiliary function 'writeContent(.)' to register some information //DEBUG on the './mod/iassign/ilm_debug/upgrade_aaaa_mm_dd_hh_ss_mm.txt'. //DEBUG @param: $filetype1 to special indentification (e.g. "student", "log", "sendemail") //DEBUG @return 1 in case of success; -1 in case do not overwrite function writeContent ($filetype1, $pathbase, $outputFile, $msgToRegister) { global $CFG, $GROUP, $WRITEMSG, $OVERWRITE; $pathbase = $CFG->dirroot . "/mod/iassign/ilm_debug/"; // "/moodle/mod/iassign/ilm_debug/", $CFG->dirroot defined in "./lib/setup.php" $outputFile = $pathbase . $outputFile; if (!is_writable($pathbase)) { // TRUE se arquivo existe e pode ser escrito // Just ignore... You must change the write permission to 'www-data' on './mod/iassign/ilm_debug/' // print "Erro! Problema de acesso ao servidor! Por favor, avise ao administrador ($pathbase nao acessivel para escrita).
"; // . $file_debug . " // exit(0); } // To write: verify if the file does not exists or have permission to overwrite if (is_file($outputFile)) { // already exist this file } // if (is_file($outputFile)) if (1==1) { // write/overwrite the file $fpointer = fopen($outputFile, "w"); // write - if executed, it clear the previou content at this file if (!$fpointer) { // $file_debug .= "Erro: nao foi possivel abrir o arquivo (" . $outputFile . ")!
\n"; // it was not possible to open the file '$completfilepath" . $file_name . "'!
\n"; // print "
" . $file_debug . "
\n"; return 0; } fwrite($fpointer, $msgToRegister . "\n"); fclose($fpointer); } else { } // error return 1; } // function writeContent($outputFile, $msgToRegister) // @calledby ./admin/index.php : provides this call with $oldversion = {config_plugins}.value, it uses $CFG->libdir.'/upgradelib.php' // @calledby ./lib/upgradelib.php : // + function upgrade_mod_savepoint($result, $version, $modname, $allowabort=true): 298/2712 // Module upgrade savepoint, marks end of module upgrade blocks. It stores module version, resets upgrade timeout and abort upgrade if user cancels page loading. // + function upgrade_plugins($type, $startcallback, $endcallback, $verbose): 513/2712,' "$newupgrade_function='xmldb_'.$plugin->fullname.'_upgrade';" // + function upgrade_plugins_modules($startcallback, $endcallback, $verbose): 674/2712, Find and check all modules and load them up or upgrade them if necessary function xmldb_iassign_upgrade ($oldversion) { global $CFG, $DB, $USER; //DEBUG To be used to register in file ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt $msgD = "./mod/iassign/db/upgrade.php: oldversion=" . $oldversion . " upgrade in ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt\n"; //DEBUG $msgD .= " - Initial time: " . date('Y_m_d_H_i_s') . "\n"; //DEBUG $dbman = $DB->get_manager(); // Sequence of updates: // - 2020070613: structure // - 2020080300 // - 2020120500 // - 2020122900 // - 2021020700 // - 2021122300: new version iVProg "1.0.20211130" // - 2022011300: new version iVProg "1.0.20220113" // - 2023041000: new version iVProg "1.0.20230707", iHanoi "1.0.20230526" if ($oldversion < 2023041000) { // < 2020070613 $msgD .= "+ " . $oldversion . " < 2020070613: " . "\n" ; //DEBUG to ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt $msgD .= " * {iassign_allsubmissions}.previous_grade; insere iLM (iGeom 5.9.22; iHanoi 1.0.20230526; iVProg 1.0.20230504; iFractions 3.1.0)\n"; //DEBUG $table = new xmldb_table('iassign_submission'); $field = new xmldb_field('previous_grade', XMLDB_TYPE_FLOAT, null, null, null, null, null); if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); } $records = array( // iLM adjusted to iAssign 2020/08/03 array_combine( // iGeom 5.9.22 array('name', 'url', 'version', 'type', 'description', 'extension', 'file_jar', 'file_class', 'width', 'height', 'enable', 'timemodified', 'author', 'timecreated', 'evaluate', 'reevaluate'), array('iGeom', 'http://www.matematica.br/igeom', '5.9.22', 'Java', '{"en":"Interactive Geometry on the Internet","pt_br":"Geometria Interativa na Internet"}', 'geo', 'ilm/iGeom/5.9.22/iGeom.jar', 'IGeomApplet.class', 800, 600, 1, time(), $USER->id, time(), 1, 0)), array_combine( // iHanoi 1.0.20230526 array('name', 'url', 'version', 'type', 'description', 'extension', 'file_jar', 'file_class', 'width', 'height', 'enable', 'timemodified', 'author', 'timecreated', 'evaluate', 'reevaluate'), array('iHanoi', 'http://www.matematica.br/ihanoi', '1.0.20230526', 'HTML5', '{"en":"interactive Tower os Hanoi (by LInE)", "pt_br":"Torres de Hanói (do LInE)"}', 'ihn', 'ilm/iHanoi/1.0.20230526/ihanoi/', 'index.html', 1100, 500, 1, time(), $USER->id, time(), 1, 0)), array_combine( // iVProg 1.0.20230504/ - HTML5 - 2020 array('name', 'url', 'version', 'type', 'description', 'extension', 'file_jar', 'file_class', 'width', 'height', 'enable', 'timemodified', 'author', 'timecreated', 'evaluate', 'reevaluate'), array('iVProg', 'http://www.usp.br/line/ivprog/', '1.0.20230504', 'HTML5', '{"en":"Visual Interactive Programming on the Internet (HTML)","pt_br":"Programação visual interativa na Internet"}', 'ivph', 'ilm/iVProg/1.0.20230504/ivprog/', 'index.html', 900, 700, 1, time(), $USER->id, time(), 1, 1)), array_combine( // iFractions 3.1.0 - HTML5 array('name', 'url', 'version', 'type', 'description', 'extension', 'file_jar', 'file_class', 'width', 'height', 'enable', 'timemodified', 'author', 'timecreated', 'evaluate', 'reevaluate'), array('iFractions', 'http://www.matematica.br/ifractions', '3.1.0', 'HTML5', '{"en":"Interactive Fractions game","pt_br":"Jogo interativa de frações"}', 'frc', 'ilm/iFractions/3.1.0/ifractions/', 'index.html', 1000, 600, 1, time(), $USER->id, time(), 1, 0)) ); $iassign_ilm = $DB->get_records('iassign_ilm'); $strNot_installed = ''; foreach ($records as $record) { // this version 'iassign_ilm' does not has field 'reevaluate' $newentry = new stdClass(); $newentry->name = $record['name']; $newentry->version = $record['version']; $newentry->type = $record['type']; $newentry->url = $record['url']; $newentry->description = $record['description']; $newentry->extension = $record['extension']; $newentry->file_jar = $record['file_jar']; $newentry->file_class = $record['file_class']; $newentry->width = $record['width']; $newentry->height = $record['height']; $newentry->enable = $record['enable']; $newentry->timemodified = time(); $newentry->author = $USER->id; $newentry->timecreated = time(); $newentry->evaluate = $record['evaluate']; $exists = 0; if ($iassign_ilm) { // Search if there is any iLM of this with this version $record_type = strtolower($record['type']); foreach ($iassign_ilm as $iassign) { if ($iassign->name == $record['name'] && strtolower($iassign->type) == $record_type) { if ($iassign->version == $record['version']) { // or with the one with the same version $exists = 1; // iLM found - exit with the last one, same version $strNot_installed .= "\n" . '
  • ' . $record['name'] . ';' . $record['type'] . ';' . $record['version'] . '
  • ' . "\n"; break; } } } } if ($exists == 0) try { // iLM does not exists or it has old version $DB->insert_record("iassign_ilm", $newentry, false); $msgD .= " * insert_record('iassign_ilm', newentry...) : " . $record['name'] . ", version=" . $record['version'] . "\n"; //DEBUG } catch (Exception $e) { print 'Caught exception: ' . $e->getMessage() . "
    \n"; $msgD .= " * Caught exception: " . $e->getMessage() . "\n"; //DEBUG } } // foreach ($records as $record) if ($strNot_installed != '') { // ATTENTION: this implies that Moodle administrator updated this iLM, please verify if it is really the current one. // 'There already exists this iLM (with same type and version), then the current version on iAssign was not installed:' print '' . "\n"; } // Verify if each iLM previously installed is present in fresh new iAssign. This does not means problem, perhaps the admin installed a particular iLM. $strNot_found = ''; if ($iassign_ilm) { // exists iLM ($DB->get_records('iassign_ilm')) foreach ($iassign_ilm as $iassign) { $found = false; foreach ($records as $record) { if ($iassign->name == $record['name']) { $found = true; break; } } if (!$found) { $strNot_found .= '
  • ' . $iassign->name . ' - ' . $iassign->url . '
  • ' . "\n"; $updateentry = new stdClass(); $updateentry->id = $iassign->id; $updateentry->enable = 0; $updateentry->timemodified = time(); $DB->update_record("iassign_ilm", $updateentry); // insert new iLM $msgD .= " * update_record('iassign_ilm', updateentry): " . $iassign->id . ", " . $iassign->name . ", enable:=0\n"; //DEBUG } } // foreach ($iassign_ilm as $iassign) } // if ($iassign_ilm) if ($strNot_found != '') { // The iLM update was completed successfully. However, it was detected that some of your iLM previously installed are not (any more) available on the current distribution of iAssign: print '' . "\n"; } } // if ($oldversion < 2023041000) { // < 2020070613 if ($oldversion < 2020070613) { $msgD .= "+ " . $oldversion . " < 2020070613: " . "\n"; //DEBUG to ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt $msgD .= " * {iassign_ilm}.reevaluate\n"; //DEBUG $table = new xmldb_table('iassign_ilm'); $field = new xmldb_field('reevaluate'); $field->set_attributes(XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', null, null, null); if (!$dbman->field_exists($table, $field)) { // if 'iassign_ilm.reevaluate' does not exist, then create this field $dbman->add_field($table, $field); } $msgD .= " * {iassign_ilm}.id, {iassign_ilm}.version, {iassign_ilm}.name\n"; //DEBUG $iassign_ilm = $DB->get_records('iassign_ilm'); foreach ($iassign_ilm as $iassign) { // If already installed iVProg/JS or iHanoi/JS set it with re-evaluate feature $msgD .= " * " . $iassign->id . ", " . $iassign->version . ", " . $iassign->name . "\n"; //DEBUG if ($iassign->type == 'HTML5' && ($iassign->name == 'iVProg' || $iassign->name == 'iHanoi')) { $updateentry = new stdClass(); $updateentry->id = $iassign->id; $updateentry->reevaluate = 1; $updateentry->timemodified = time(); $answerbd = $DB->update_record("iassign_ilm", $updateentry); $msgD .= " - - update {iassign_ilm}.reevaluate := 1 -> answerbd=" . $answerbd . "\n"; //DEBUG break; } } } // if ($oldversion < 2020070613) if ($oldversion < 2020080300) { // new iHanoi $msgD .= "+ " . $oldversion . " < 2023052600: " . "\n"; //DEBUG to ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt $strNot_installed = ''; // iassign_submission . grade : from 'BIGINT(11)' to 'real' if ($dbman->field_exists('iassign', 'grade')) { $sql = 'ALTER TABLE {iassign} CHANGE grade grade FLOAT NOT NULL DEFAULT 0.0'; $msgD .= " * before execute " . $sql . "\n"; //DEBUG $DB->execute($sql); $msgD .= " * after OK \n"; //DEBUG } if ($dbman->field_exists('iassign_statement', 'grade')) { $sql = 'ALTER TABLE {iassign_statement} CHANGE grade grade FLOAT NOT NULL DEFAULT 0.0'; $msgD .= " * before execute " . $sql . "\n"; //DEBUG $DB->execute($sql); $msgD .= " * after OK \n"; //DEBUG } if ($dbman->field_exists('iassign_submission', 'grade')) { $sql = 'ALTER TABLE {iassign_submission} CHANGE grade grade FLOAT NOT NULL DEFAULT 0.0'; $msgD .= " * before execute " . $sql . "\n"; //DEBUG $DB->execute($sql); $msgD .= " * after OK \n"; //DEBUG } if ($dbman->field_exists('iassign_submission', 'previous_grade')) { // $sql = 'ALTER TABLE {iassign_submission} CHANGE previous_grade previous_grade REAL NOT NULL DEFAULT 0.0'; // Invalid use of NULL value $sql = 'ALTER TABLE {iassign_submission} CHANGE previous_grade previous_grade FLOAT DEFAULT 0.0'; $msgD .= " * before execute " . $sql . "\n"; //DEBUG $DB->execute($sql); $msgD .= " * after OK \n"; //DEBUG } // Update iHanoi - but the "if ($oldversion < 2020070613)" must had inserted it ("iHanoi 1.0.20230526") $records = array( array_combine( // iHanoi 1.0.20230526 array('name', 'url', 'version', 'type', 'description', 'extension', 'file_jar', 'file_class', 'width', 'height', 'enable', 'timemodified', 'evaluate', 'reevaluate', 'author', 'timecreated'), array('iHanoi', 'http://www.matematica.br/ihanoi', '1.0.20230526', 'HTML5', '{"en":"interactive Tower os Hanoi (by LInE)", "pt_br":"Torres de Hanói (do LInE)"}', 'ihn', 'ilm/iHanoi/1.0.20230526/ihanoi/', 'index.html', 1100, 500, 1, time(), 1, 1, $USER->id, time())) ); $iassign_ilm = $DB->get_records('iassign_ilm'); foreach ($records as $record) { // For each iLM in the current version of iAssign $newentry = new stdClass(); $newentry->name = $record['name']; $newentry->url = $record['url']; $newentry->version = $record['version']; $newentry->type = $record['type']; $newentry->description = $record['description']; $newentry->extension = $record['extension']; $newentry->file_jar = $record['file_jar']; $newentry->file_class = $record['file_class']; $newentry->width = $record['width']; $newentry->height = $record['height']; $newentry->enable = $record['enable']; $newentry->timemodified = time(); $newentry->evaluate = $record['evaluate']; $newentry->reevaluate = $record['reevaluate']; $newentry->author = $USER->id; $newentry->timecreated = time(); $exists = 0; $last_id = -1; if ($iassign_ilm) { // Search if there is any previous installed iLM that is also in the current version of iAssign $record_type = strtolower($record['type']); foreach ($iassign_ilm as $iassign) { if ($iassign->name == $record['name'] && strtolower($iassign->type) == $record_type) { if ($iassign->id > $last_id) $last_id = $iassign->id; // last ID => last version (hopefully) if ($iassign->version == $record['version']) { // or with the one with the same version $exists = 1; // iLM found - exit with the last one, same version $strNot_installed .= "\n" . '
  • ' . $record['name'] . ';' . $record['type'] . ';' . $record['version'] . '
  • ' . "\n"; break; } } } } if ($exists == 0) { // iLM does not exists or it has old version $newentry->parent = $record['parent']; try { $DB->insert_record("iassign_ilm", $newentry, false); $msgD .= " * insert_record iassign_ilm iHanoi 1.0.20230526 \n"; //DEBUG } catch (Exception $er) { $msgD .= " * Error insert_record iassign_ilm iHanoi 1.0.20230526 " . $er->getMessage() . "\n"; //DEBUG } } } // foreach ($records as $record) if ($strNot_installed != '') { print '' . "\n"; } // iassign_ilm: atualizou iHanoi existente, mas nao era isso! Deveria ter inserido novo! // id name version type ... parent file_jar file_class width height ... evaluate reevaluate // 53 iHanoi 2 HTML5 ... 0 ilm/iHanoi/2/ihanoi/ index.html 1100 700 ... 1 0 $iassign_ilm = $DB->get_records('iassign_ilm'); foreach ($iassign_ilm as $iassign) { // for iLM iHanoi update the new field 'reevaluate' as 1 if ($iassign->name == 'iHanoi' && $iassign->type == 'HTML5' && $iassign->reevaluate!=1) { $updateentry = new stdClass(); $updateentry->id = $iassign->id; $updateentry->reevaluate = 1; $updateentry->timemodified = time(); $DB->update_record("iassign_ilm", $updateentry); $msgD .= " * update_record('iassign_ilm'...) iHanoi reevaluate:=1\n"; //DEBUG break; } } // iAssign savepoint reached. upgrade_mod_savepoint(true, 2020080300, 'iassign'); } // if ($oldversion < 2020080300) // Considering ias as {iassign_statement}, create new ias.filesid (initially with ias.file) // Fix {files}.itemid := {iassign_statement}.id and {iassign_statement}.filesid := {files}.id // New update from 2023/04/06 (old one was first released in 2020/11/24 with a smaller differences) if ($oldversion < 2020120500) { $msgD .= "+ " . $oldversion . " < 2020120500: " . "\n"; //DEBUG to ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt // Adding field iassing_statement.filesid $table = new xmldb_table('iassign_statement'); $field_filesid = new xmldb_field('filesid', XMLDB_TYPE_CHAR, '255', null, null, null, null, null); if (!$dbman->field_exists($table, $field_filesid)) { $dbman->add_field($table, $field_filesid); // Updating all registers from {iassing_statement}.filesid // Current version (2020 on) is different: {files}.itemid={iassign_statement}.id and {iassign_statement}.filesid={file}.id $msgD .= " * execute('UPDATE {iassign_statement} SET filesid = file'\n"; //DEBUG $answerbd = $DB->execute("UPDATE {iassign_statement} SET filesid = file"); if (!$answerbd) $msgD .= " * ERROR execute('UPDATE {iassign_statement} SET filesid = file'\n"; //DEBUG } // Update file_jar field: allow 2 iLM with the same path... try { $sql = "ALTER TABLE {iassign_ilm} DROP INDEX {iaima_fil_uix}"; $answerbd = $DB->execute($sql); // remove "UNIQUE KEY *_iaima_fil_uix (file_jar)," $msgD .= " * execute " . $sql . "\n"; //DEBUG } catch (Exception $er) { $msgD .= " * ERROR execute " . $sql . ": " . $er->getMessage() . "\n"; //DEBUG } // In this point {{iassign_statement} already has field 'filesid': see above "UPDATE {iassign_statement} SET filesid = file" // Prepare to find all {files} associated to a single iAssign {iassign} using {modules}, {course_modules}, {context}, {files}, {iassign} // ATTENTION: it is very important to use {files}.id as the first column of this SELECT statement (since it must be a unique value) $sql_list = "{files}.id AS files_id, {course_modules}.course, {course_modules}.id, {context}.instanceid, {context}.id AS contextid, " . "{course_modules}.instance, {iassign}.id AS iaid, {files}.itemid, " . "{iassign_statement}.file, {iassign_statement}.filesid, {files}.author, {files}.timecreated, " . "{files}.filename, {iassign}.name AS ianame, {iassign_statement}.file AS iasfile, {iassign_statement}.id AS iasid, " . "{iassign_statement}.name AS iasname, {iassign_statement}.timecreated"; $sql_from = "{modules}, {course_modules}, {context}, {files}, {iassign}, {iassign_statement}"; $sql_where = "{modules}.name='iassign' AND {modules}.id={course_modules}.module AND {course_modules}.id = {context}.instanceid AND " . "{course_modules}.instance = {iassign}.id AND {context}.id={files}.contextid AND {files}.component='mod_iassign' AND " . "{iassign}.id={iassign_statement}.iassignid AND ({files}.itemid={iassign_statement}.file OR {files}.itemid={iassign_statement}.id)"; // "SELECT " . $dist . " " . $campos . " FROM " . $table . " WHERE " . $where . $compl //./lib/dml/moodle_database.php : public abstract function get_records_sql($sql, array $params=null, $limitfrom=0, $limitnum=0) // ATTENTION! The first column of this SELECT statement must be a unique value (usually the 'id' field), for this reason it necessary // $sql_list starts with {files}.id (that is the unique value from all returned) $iassign_files_contexts_list = $DB->get_records_sql("SELECT " . $sql_list . " FROM " . $sql_from . " WHERE " . $sql_where); // versao para 'upgrade.php' $msgD .= " * SELECT " . $sql_list . " FROM " . $sql_from . "\n WHERE " . $sql_where . "\n"; //DEBUG $msgD .= " * #iassign_files_contexts_list = " . count($iassign_files_contexts_list) . "\n"; //DEBUG $ii = 0; foreach ($iassign_files_contexts_list as $iassign_statement_activity_item) { // all {iassign_statement}/{files} if ($iassign_statement_activity_item->filename=='.') { // if second {files} - directory/path $one_files = $iassign_statement_activity_item; // just to produce a more readable code... if ($one_files->itemid != $iassign_statement_activity_item->iasid) { // {files}.itemid != {iassign_statement}.id => UPDATE {files} with itemid := {iassign_statement}.id $newentry = new stdClass(); $newentry->id = $one_files->files_id; // set {files}.id $newentry->itemid = $iassign_statement_activity_item->iasid; // update {files}.itemid := {iassign_statement}.id $DB->update_record("files", $newentry); // update {files} $msgD .= " * update " . $one_files->itemid . "={files}.itemid := {iassign_statement}.id = " . $iassign_statement_activity_item->iasid . " - {files}.id=" . $one_files->files_id . "\n"; //DEBUG } } else { $one_files = $iassign_statement_activity_item; // just to produce a more readable code... if ($iassign_statement_activity_item->filesid) $msgiasfilesid = $iassign_statement_activity_item->filesid; else $msgiasfilesid = "<>"; //DEBUG if (!$iassign_statement_activity_item->filesid || $iassign_statement_activity_item->filesid != $one_files->files_id) { // {iassign_statement}.filesid not defined // {iassign_statement}.filesid != {files}.id => UPDATE {iassign_statement}.filesid := {files}.id $newentry = new stdClass(); $newentry->id = $iassign_statement_activity_item->iasid; // set {iassign_statement}.id $newentry->filesid = $one_files->files_id; // update {iassign_statement}.filesid := {files}.id $DB->update_record("iassign_statement", $newentry); // update {iassign_statement} $msgD .= " * update " . $msgiasfilesid . "={iassign_statement}.filesid := {files}.id=" . $one_files->files_id . " - ias.id=" . $iassign_statement_activity_item->iasid . "\n"; //DEBUG } if ($one_files->itemid != $iassign_statement_activity_item->iasid) { // {files}.itemid != {iassign_statement}.id => UPDATE {files} with itemid := {iassign_statement}.id $newentry = new stdClass(); $newentry->id = $one_files->files_id; // set {files}.id $newentry->itemid = $iassign_statement_activity_item->iasid; // update {files}.itemid := {iassign_statement}.id $DB->update_record("files", $newentry); // update {files} $msgD .= " * update " . $one_files->itemid . "={files}.itemid := {iassign_statement}.id=" . $iassign_statement_activity_item->iasid . " - {files}.id=" . $one_files->files_id . "\n"; //DEBUG } } $ii++; // count... } // foreach ($ias_files as $iassign_statement_activity_item) } // if ($oldversion < 2020120500) /// @Igor - create the new table {iassign_allsubmissions} if ($oldversion < 2020122900) { // < 2020122900 $msgD .= "+ " . $oldversion . " < 2020122900: " . "\n"; //DEBUG to ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt // Define table iassign_allsubmissions to be created. $table = new xmldb_table('iassign_allsubmissions'); // Adding fields to table iassign_allsubmissions. $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); $table->add_field('iassign_statementid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null); $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null); $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '16', null, XMLDB_NOTNULL, null, null); $table->add_field('grade', XMLDB_TYPE_FLOAT, null, null, null, null, null, null); $table->add_field('answer', XMLDB_TYPE_TEXT, 'long', null, null, null, null, null); // Adding keys to table iassign_allsubmissions. $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); // Conditionally launch create table for iassign_allsubmissions. if (!$dbman->table_exists($table)) { $dbman->create_table($table); $msgD .= " * {iassign_allsubmissions}.{id, iassign_statementid, userid, timecreated, grade, answer}\n"; //DEBUG } // Adding fields to table iassign_ilm: $table = new xmldb_table('iassign_ilm'); $field_editingbehavior = new xmldb_field('editingbehavior', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', null); if (!$dbman->field_exists($table, $field_editingbehavior)) $dbman->add_field($table, $field_editingbehavior); $field_submissionbehavior = new xmldb_field('submissionbehavior', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', null); if (!$dbman->field_exists($table, $field_submissionbehavior)) $dbman->add_field($table, $field_submissionbehavior); $field_action_buttons = new xmldb_field('action_buttons', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '1', null); if (!$dbman->field_exists($table, $field_action_buttons)) $dbman->add_field($table, $field_action_buttons); $msgD .= " * {iassign_ilm}.{editingbehavior, submissionbehavior, action_buttons}\n"; //DEBUG // Adding field to table iassign_statement: $table = new xmldb_table('iassign_statement'); $field_store_all_submissions = new xmldb_field('store_all_submissions', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', null); if (!$dbman->field_exists($table, $field_store_all_submissions)) $dbman->add_field($table, $field_store_all_submissions); $msgD .= " * {iassign_statement}.store_all_submissions - change ias.editingbehavior,submissionbehavior de iHanoiJS, iGeomJava, iVProgJS, iFractions, Risko\n"; //DEBUG // Update new fields for previous installed iLM: $iassign_ilm = $DB->get_records('iassign_ilm'); foreach ($iassign_ilm as $iassign) { $updateentry = new stdClass(); $updateentry->id = $iassign->id; $change = 0; // any change to update? if (($iassign->name == 'iHanoi' && $iassign->type == 'HTML5')) { $change = 1; $updateentry->editingbehavior = 0; // editingbehavior=1 => iLM auto-evaluation remains working over a solution sent by the student (iGeom not; iVProg yes) $updateentry->submissionbehavior = 0; // 0 => 'After submission, this iLM remains on the same page'; 1 => 'this iLM changes the current page } else if (($iassign->name == 'iGeom' && $iassign->type == 'Java')) { $updateentry->editingbehavior = 0; $change = 1; $updateentry->submissionbehavior = 0; } else if (($iassign->name == 'iVProg' && $iassign->type == 'HTML5')) { $updateentry->editingbehavior = 1; $change = 1; $updateentry->submissionbehavior = 0; } else if (($iassign->name == 'iFractions' && $iassign->type == 'HTML5')) { $updateentry->editingbehavior = 0; $change = 1; $updateentry->submissionbehavior = 1; } else if (($iassign->name == 'Risko' && $iassign->type == 'Java')) { $updateentry->editingbehavior = 1; $change = 1; $updateentry->submissionbehavior = 0; } if ($change==1) { $updateentry->timemodified = time(); $DB->update_record("iassign_ilm", $updateentry); } } //x // Add iassign_allsubmissions table - not necessary, {iassign_allsubmissions}.{id, iassign_statementid, userid, timecreated, grade, answer} already created //x $table = new xmldb_table('iassign_allsubmissions'); //x if (!$dbman->table_exists($table)) { //x $field1 = new xmldb_field('id'); $field1->set_attributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null); //x $field2 = new xmldb_field('iassign_statementid'); $field2->set_attributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null); //x $field3 = new xmldb_field('userid'); $field3->set_attributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null); //x $field4 = new xmldb_field('timecreated'); $field4->set_attributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null); //x $field5 = new xmldb_field('grade'); $field5->set_attributes(XMLDB_TYPE_FLOAT, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null); //x $field6 = new xmldb_field('answer'); $field6->set_attributes(XMLDB_TYPE_TEXT, 'long', null, null, null, null, 'type'); //x $table->addIndex($field1); $table->addField($field2); $table->addField($field3); //x $table->addField($field4); $table->addField($field5); $table->addField($field6); //x $dbman->create_table($table); //x } // if (!$dbman->table_exists($table)) // Update file_jar field: allow 2 iLM with the same path... try { $DB->execute("ALTER TABLE {iassign_ilm} DROP INDEX {iassilm_fil_uix}"); $msgD .= " * ALTER TABLE {iassign_ilm} DROP INDEX {iassilm_fil_uix} \n"; //DEBUG } catch (Exception $er) { $msgD .= " * ERROR ALTER TABLE {iassign_ilm} DROP INDEX {iassilm_fil_uix}: " . $er->getMessage() . "\n"; //DEBUG } // Create temporary area in MoodleData: $CFG->dataroot/temp/iassign_files //TODO: not using... *** $tempfilespath = $CFG->dataroot . DIRECTORY_SEPARATOR . 'temp'; if (!file_exists($tempfilespath)) { mkdir($tempfilespath, 0777, true); $msgD .= " * mkdir " . $tempfilespath . "\n"; //DEBUG } $iassignfilespath = $tempfilespath . DIRECTORY_SEPARATOR . 'iassign_files'; if (!file_exists($iassignfilespath)) { mkdir($iassignfilespath, 0777, true); $msgD .= " * mkdir " . $iassignfilespath . "\n"; //DEBUG } } // if ($oldversion < 2020122900) if ($oldversion < 2021020700) { $msgD .= "+ " . $oldversion . " < 2021020700: " . "\n"; //DEBUG to ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt // Update SAW iVProg to inform reevalute is enabled: // SELECT id FROM s_iassign_ilm WHERE type='HTML5' AND name='iVProg' $ivprogs = $DB->get_records('iassign_ilm', array('name' => 'iVProg', 'type' => 'HTML5')); foreach ($ivprogs as $one_ivprog) { $ivprogid = $one_ivprog->id; $updateentry = new stdClass(); $updateentry->id = $ivprogid; // {iassign_ilm}.id such that {iassign_ilm}.name='iVProg' and {iassign_ilm}.type='HTML5' $updateentry->reevaluate = 1; $updateentry->timemodified = time(); $DB->update_record("iassign_ilm", $updateentry); // update {iassign_ilm}.id=57 with 'reevaluate = 1' $msgD .= " * update_record 'iassign_ilm' id=" . $ivprogid . ", reevaluate:=1\n"; //DEBUG } } // if ($oldversion < 2021020700) if ($oldversion < 2021122300) { // 2021/12/23 $msgD .= "+ " . $oldversion . " < 2021122300: " . "\n"; //DEBUG to ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt $strNot_installed = ''; // Update iVProg JS to the latest version (ilm/iVProg/1.0.20230504/ivprog/) $records = array( array_combine( // iVProg 1.0.20230504/ - HTML5 - 2021/12/30 array('name', 'url', 'version', 'type', 'description', 'extension', 'file_jar', 'file_class', 'width', 'height', 'enable', 'timemodified', 'author', 'timecreated', 'evaluate', 'reevaluate'), array('iVProg', 'http://www.usp.br/line/ivprog/', '1.0.20230504', 'HTML5', '{"en":"Visual Interactive Programming on the Internet (HTML)","pt_br":"Programação visual interativa na Internet"}', 'ivph', 'ilm/iVProg/1.0.20230504/ivprog/', 'index.html', 900, 700, 1, time(), $USER->id, time(), 1, 1)) ); $iassign_ilm = $DB->get_records('iassign_ilm'); foreach ($records as $record) { // For each iLM in the current version of iAssign $newentry = new stdClass(); $newentry->name = $record['name']; $newentry->url = $record['url']; $newentry->version = $record['version']; $newentry->type = $record['type']; $newentry->description = $record['description']; $newentry->extension = $record['extension']; $newentry->file_jar = $record['file_jar']; $newentry->file_class = $record['file_class']; $newentry->width = $record['width']; $newentry->height = $record['height']; $newentry->enable = $record['enable']; $newentry->timemodified = time(); $newentry->author = $USER->id; $newentry->timecreated = time(); $newentry->evaluate = $record['evaluate']; // 1 $newentry->reevaluate = $record['reevaluate']; // 1 $exists = -1; $last_id = -1; // to be used to get the last version of the same iLM (will be its 'parent') if ($iassign_ilm) { // Search if there is any previous installed iLM that is also in the current version of iAssign $record_type = strtolower($record['type']); foreach ($iassign_ilm as $iassign) { if ($iassign->name == $record['name'] && strtolower($iassign->type) == $record_type) { if ($iassign->id > $last_id) $last_id = $iassign->id; // last ID => last version (hopefully) if ($iassign->version == $record['version']) { // or with the one with the same version $exists = $iassign->id; // iLM found - exit with the last one, same version $strNot_installed .= "\n" . '
  • ' . $record['name'] . ';' . $record['type'] . ';' . $record['version'] . '
  • ' . "\n"; break; } } } $newentry->parent = $last_id; // parent is the last iLM found (corresponde to the smallest ID) } else $newentry->parent = -1; // first iLM of this one if ($exists == -1) { // iLM does not exists or it has old version // $newentry->parent = $record['parent']; $answerbd = $DB->insert_record("iassign_ilm", $newentry, false); if (!$answerbd) $msgD .= " * ERROR insert_record('iassign_ilm', newentry,...): " . $newentry->name . "\n"; //DEBUG else $msgD .= " * insert_record('iassign_ilm', newentry,...): " . $newentry->name . "\n"; //DEBUG } else $msgD .= " * 'iassign_ilm' " . $record['name'] . " already exists with id=" . $last_id . "!\n"; //DEBUG } // foreach ($records as $record) if ($strNot_installed != '') { print '' . "\n"; } // iassign_ilm: atualizou iHanoi existente, mas nao era isso! Deveria ter inserido novo! // iassign_ilm: update iHanoi from // id name version type ... parent file_jar file_class width height ... evaluate reevaluate // 53 iHanoi 2 HTML5 ... 0 ilm/iHanoi/1.0.20200803/ihanoi/ index.html 1100 700 ... 1 0 ou // 53 iHanoi 2 HTML5 ... 0 ilm/iHanoi/2/ihanoi/ index.html 1100 700 ... 1 0 $iassign_ilm = $DB->get_records('iassign_ilm'); foreach ($iassign_ilm as $iassign) { // for iLM iHanoi update the new field 'reevaluate' as 1 if ($iassign->name == 'iHanoi' && $iassign->type == 'HTML5' && $iassign->reevaluate!=1) { $updateentry = new stdClass(); $updateentry->id = $iassign->id; $updateentry->reevaluate = 1; // new iHanoi allow teacher to re-evaluate (all of them at once) $updateentry->timemodified = time(); $DB->update_record("iassign_ilm", $updateentry); $msgD .= " * update_record 'iassign_ilm'iHanoi HTML id=" . $iassign->id . "\n"; //DEBUG break; } } // iAssign savepoint reached. upgrade_mod_savepoint(true, 2021122300, 'iassign'); } // if ($oldversion < 2021122300) //DEBUG to ./mod/iassign/ilm_debug/upgrade_AAAA_MM_DD_hh_mm_ss.txt try { // register in ./mod/iassign/ilm_debug/ $timeWrite = date('Y_m_d_H_i_s'); // Year_Month_Day_Hour_Minutes_Seconds $msgD .= " - Final time: " . $timeWrite . "\n"; //DEBUG $filenamewrite = "upgrade_" . $timeWrite . ".txt"; $resp = writeContent("", "", $filenamewrite, $msgD); // ($filetype1, $pathbase, $outputFile, $msgToRegister) } catch (Exception $er) { // print 'Erro: upgrade ' . $er->getMessage() . "\n"; } // log event ----------------------------------------------------- if (class_exists('plugin_manager')) $pluginman = plugin_manager::instance(); else $pluginman = core_plugin_manager::instance(); $plugins = $pluginman->get_plugins(); iassign_log::add_log('upgrade', 'version: ' . $plugins['mod']['iassign']->versiondisk); // log event ----------------------------------------------------- return true; } // function xmldb_iassign_upgrade($oldversion)