From ff321e21c5fa94ef0cd6332fff7319deaa872f05 Mon Sep 17 00:00:00 2001 From: PMKuipers Date: Wed, 19 Jul 2023 14:50:05 +0200 Subject: [PATCH] Breaking database changes to support periods and studyplan pages. --- classes/badgeinfo.php | 4 +- classes/corecompletioninfo.php | 2 +- classes/courseinfo.php | 9 +- db/install.xml | 29 ++++-- db/upgrade.php | 159 +++++++++++++++++++++++++++++++-- version.php | 2 +- 6 files changed, 184 insertions(+), 21 deletions(-) diff --git a/classes/badgeinfo.php b/classes/badgeinfo.php index df91f29..fceccec 100644 --- a/classes/badgeinfo.php +++ b/classes/badgeinfo.php @@ -125,9 +125,9 @@ class badgeinfo { if($issued) { $issueinfo = $DB->get_record('badge_issued', array('badgeid' => $this->badge->id, 'userid' => $userid)); - $badge['dateissued'] = userdate($issueinfo->dateissued,"%e %b %G"); + $badge['dateissued'] = date("Y-m-d",$issueinfo->dateissued); if($issueinfo->expiredate){ - $badge['dateexpire'] = userdate($issueinfo->dateexpire,"%e %b %G"); + $badge['dateexpire'] = date("Y-m-d",$issueinfo->dateexpire); } $badge['uniquehash'] = $issueinfo->uniquehash; $badge['issuedlink'] = (new \moodle_url('/badges/badge.php', ['hash' => $issueinfo->uniquehash]))->out(false); diff --git a/classes/corecompletioninfo.php b/classes/corecompletioninfo.php index 5cf6095..138654c 100644 --- a/classes/corecompletioninfo.php +++ b/classes/corecompletioninfo.php @@ -179,7 +179,7 @@ class corecompletioninfo { $details = [ "type" => get_string('datepassed', 'completion'), "criteria" => get_string('remainingenroleduntildate', 'completion'), - "requirement" => userdate($criteria->timeend, '%d %B %Y'), + "requirement" => date("Y-m-d",$criteria->timeend), "status" => "", ]; } diff --git a/classes/courseinfo.php b/classes/courseinfo.php index 5855ac3..dce3b94 100644 --- a/classes/courseinfo.php +++ b/classes/courseinfo.php @@ -197,8 +197,8 @@ class courseinfo { 'context' => $contextinfo->model(), 'ctxid' => $this->coursecontext->id, 'timing' => $timing, - 'startdate' => userdate($this->course->startdate,"%e %b %G"), - 'enddate' => userdate($this->course->enddate, "%e %b %G"), + 'startdate' => date("Y-m-d",$this->course->startdate,), + 'enddate' => date("Y-m-d",$this->course->enddate), 'amteacher' => $this->amTeacher(), 'canselectgradables' => $this->iCanSelectGradables(), 'tag' => "Editormodel", @@ -250,12 +250,11 @@ class courseinfo { 'context' => $contextinfo->model(), 'ctxid' => $this->coursecontext->id, 'timing' => $timing, - 'startdate' => userdate($this->course->startdate,"%e %b %G"), - 'enddate' => userdate($this->course->enddate, "%e %b %G"), + 'startdate' => date("Y-m-d",$this->course->startdate), + 'enddate' => date("Y-m-d",$this->course->enddate), 'grades' => [], ]; - if(!$usecorecompletioninfo){ $gradables = gradeinfo::list_studyitem_gradables($this->studyitem); foreach($gradables as $gi) { diff --git a/db/install.xml b/db/install.xml index 1a3cba4..e736628 100644 --- a/db/install.xml +++ b/db/install.xml @@ -1,5 +1,5 @@ - @@ -65,6 +65,7 @@ + @@ -72,7 +73,7 @@ - + @@ -149,14 +150,30 @@
- - + + - - + + + + + + +
+ + + + + + + + + + + diff --git a/db/upgrade.php b/db/upgrade.php index 9012309..0301024 100644 --- a/db/upgrade.php +++ b/db/upgrade.php @@ -219,31 +219,178 @@ function xmldb_local_treestudyplan_upgrade($oldversion) { // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2023063002, 'local', 'treestudyplan'); } - if ($oldversion < 2023071801) { + if ($oldversion < 2023071900) { + + /****** + * Prepare the studyline table to hold links to pages insted of study plans + * And drop the foreign key constraint for the studyplan_id-id relation + */ + // Define field page_id to be added to local_treestudyplan_line. + $table = new xmldb_table('local_treestudyplan_line'); + $field = new xmldb_field('page_id', XMLDB_TYPE_INTEGER, '20', null, null, null, null, 'studyplan_id'); + + // Conditionally launch add field page_id. + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Define key studyplan_id-id (foreign) to be dropped form local_treestudyplan_line. + $table = new xmldb_table('local_treestudyplan_line'); + $key = new xmldb_key('studyplan_id-id', XMLDB_KEY_FOREIGN, ['studyplan_id'], 'local_treestudyplan', ['id']); + + // Launch drop key studyplan_id-id. + $dbman->drop_key($table, $key); + + + /****** + * Create the page table and copy data from treestudyplan there + * Also re-link the studylines to the newly created page instead of the studyplan + */ + // Define table local_treestudyplan_page to be created. + $table = new xmldb_table('local_treestudyplan_page'); + + // Adding fields to table local_treestudyplan_page. + $table->add_field('id', XMLDB_TYPE_INTEGER, '20', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); + $table->add_field('studyplan_id', XMLDB_TYPE_INTEGER, '20', null, XMLDB_NOTNULL, null, '0'); + $table->add_field('periods', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0'); + $table->add_field('fullname', XMLDB_TYPE_TEXT, null, null, null, null, null); + $table->add_field('shortname', XMLDB_TYPE_TEXT, null, null, null, null, null); + $table->add_field('description', XMLDB_TYPE_TEXT, null, null, null, null, null); + $table->add_field('startdate', XMLDB_TYPE_TEXT, null, null, null, null, null); + $table->add_field('enddate', XMLDB_TYPE_TEXT, null, null, null, null, null); + + // Adding keys to table local_treestudyplan_page. + $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); + + // Conditionally launch create table for local_treestudyplan_page. + if (!$dbman->table_exists($table)) { + $dbman->create_table($table); + + // Create a page 0 with it's data copied + $plans = $DB->get_recordset("local_treestudyplan"); + foreach($plans as $p){ + $o = [ "studyplan_id" => $p->id, + "periods" => $p->slots, + "fullname" => $p->name, + "shortname" => $p->shortname, + "description" => $p->description, + "startdate" => $p->startdate, + "enddate" => $p->enddate, + ]; + $pageid = $DB->insert_record("local_treestudyplan_page",$o); + + // Now find all studyline references to the studyplan + // And update their record to reference the page instead of the plan + $lines = $DB->get_recordset("local_treestudyplan_line",["studyplan_id" => $p->id]); + foreach($lines as $l){ + $lo = [ + "id" => $l->id, + "page_id"=> $pageid, + ]; + $DB->update_record("local_treestudyplan_line",$lo); + } + $lines->close(); + } + $plans->close(); + } + + /** + * Finalize studyline table to drop studyplan_id field and have page id be a non-nullable and foreign key + */ + + // Changing nullability of field page_id on table local_treestudyplan_line to not null. + $table = new xmldb_table('local_treestudyplan_line'); + $field = new xmldb_field('page_id', XMLDB_TYPE_INTEGER, '20', null, XMLDB_NOTNULL, null, null, 'studyplan_id'); + + // Launch change of nullability for field page_id. + $dbman->change_field_notnull($table, $field); + + // Define field studyplan_id to be dropped from local_treestudyplan_line. + $table = new xmldb_table('local_treestudyplan_line'); + $field = new xmldb_field('studyplan_id'); + + // Conditionally launch drop field studyplan_id. + if ($dbman->field_exists($table, $field)) { + $dbman->drop_field($table, $field); + } + + // Define key page_id-id (foreign) to be added to local_treestudyplan_line. + $table = new xmldb_table('local_treestudyplan_line'); + $key = new xmldb_key('page_id-id', XMLDB_KEY_FOREIGN, ['page_id'], 'local_treestudyplan_page', ['id']); + + // Launch add key page_id-id. + $dbman->add_key($table, $key); + + + /*** + * Create Period table and make a period record for all studyplan periods + */ // Define table local_treestudyplan_period to be created. $table = new xmldb_table('local_treestudyplan_period'); // Adding fields to table local_treestudyplan_period. - $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); - $table->add_field('studyplan_id', XMLDB_TYPE_INTEGER, '10', null, null, null, null); + $table->add_field('id', XMLDB_TYPE_INTEGER, '20', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); + $table->add_field('page_id', XMLDB_TYPE_INTEGER, '20', null, null, null, null); $table->add_field('period', XMLDB_TYPE_INTEGER, '10', null, null, null, null); - $table->add_field('starttime', XMLDB_TYPE_INTEGER, '20', null, null, null, null); - $table->add_field('endtime', XMLDB_TYPE_INTEGER, '20', null, null, null, null); + $table->add_field('startdate', XMLDB_TYPE_TEXT, null, null, null, null, null); + $table->add_field('enddate', XMLDB_TYPE_TEXT, null, null, null, null, null); $table->add_field('shortname', XMLDB_TYPE_TEXT, null, null, null, null, null); $table->add_field('fullname', XMLDB_TYPE_TEXT, null, null, null, null, null); // Adding keys to table local_treestudyplan_period. $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); + $table->add_key('page_id-id', XMLDB_KEY_FOREIGN, ['page_id'], 'local_treestudyplan_page', ['id']); + // Conditionally launch create table for local_treestudyplan_period. if (!$dbman->table_exists($table)) { $dbman->create_table($table); + + // Create a period page for all slots in the study + $recordset = $DB->get_recordset("local_treestudyplan_page"); + foreach($recordset as $r){ + + // Make a best guess for the periods based on the specified period for the plan and the + $pcount = $r->periods; + $ystart = strtotime($r->startdate)+0; + $yend = strtotime($r->enddate)+0; + if($yend < $ystart){ + // If no end time is given, assume a year duration for period calculations + $ydelta = (365*24*60*60)/$pcount; + } + + $ydelta = $yend - $ystart; + $ptime = $ydelta / $pcount; + + for($i=0; $i < $pcount; $i++){ + $pnum = $i+1; + $pstart = $ystart + ($i*$ptime); + $pend = $pstart + $ptime; + + $o = [ "page_id" => $r->id, + "period" => $pnum, + "fullname" => "Period {$pnum}", + "shortname" => "P{$pnum}", + "startdate" => date("Y-m-d",$pstart), + "enddate" => date("Y-m-d",$pend) + ]; + $DB->insert_record("local_treestudyplan_period",$o); + } + } + $recordset->close(); } + + + + + // Treestudyplan savepoint reached. - upgrade_plugin_savepoint(true, 2023071801, 'local', 'treestudyplan'); + upgrade_plugin_savepoint(true, 2023071900, 'local', 'treestudyplan'); } + + return true; } \ No newline at end of file diff --git a/version.php b/version.php index 5cebe15..cc18b1c 100644 --- a/version.php +++ b/version.php @@ -1,6 +1,6 @@ component = 'local_treestudyplan'; // Recommended since 2.0.2 (MDL-26035). Required since 3.0 (MDL-48494) -$plugin->version = 2023071801; // YYYYMMDDHH (year, month, day, iteration) +$plugin->version = 2023071900; // YYYYMMDDHH (year, month, day, iteration) $plugin->requires = 2021051700; // YYYYMMDDHH (This is the release version for Moodle 3.11) $plugin->dependencies = [