Files
moodle/mod/forum/db/upgrade.php
T
Andrew Nicols 0f3bbfd4f8 MDL-55982 mod_forum: Add time-based discussion locking
This patch adds support for time-based locking of discussions.
Discussions are automatically locked after a user-definable period of
inactivity. After this time, only those with the the relevant capability
are able to add replies.

This has been designed to add support for other types of discussion locking
at a later date with relative ease.
2016-09-21 09:03:42 +08:00

197 lines
7.1 KiB
PHP

<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* This file keeps track of upgrades to
* the forum module
*
* Sometimes, changes between versions involve
* alterations to database structures and other
* major things that may break installations.
*
* The upgrade function in this file will attempt
* to perform all the necessary actions to upgrade
* your older installation to the current version.
*
* If there's something it cannot do itself, it
* will tell you what you need to do.
*
* The commands in here will all be database-neutral,
* using the methods of database_manager class
*
* Please do not forget to use upgrade_set_timeout()
* before any action that may take longer time to finish.
*
* @package mod_forum
* @copyright 2003 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
function xmldb_forum_upgrade($oldversion) {
global $CFG, $DB;
$dbman = $DB->get_manager(); // Loads ddl manager and xmldb classes.
if ($oldversion < 2014051201) {
// Incorrect values that need to be replaced.
$replacements = array(
11 => 20,
12 => 50,
13 => 100
);
// Run the replacements.
foreach ($replacements as $old => $new) {
$DB->set_field('forum', 'maxattachments', $new, array('maxattachments' => $old));
}
// Forum savepoint reached.
upgrade_mod_savepoint(true, 2014051201, 'forum');
}
if ($oldversion < 2014081500) {
// Define index course (not unique) to be added to forum_discussions.
$table = new xmldb_table('forum_discussions');
$index = new xmldb_index('course', XMLDB_INDEX_NOTUNIQUE, array('course'));
// Conditionally launch add index course.
if (!$dbman->index_exists($table, $index)) {
$dbman->add_index($table, $index);
}
// Forum savepoint reached.
upgrade_mod_savepoint(true, 2014081500, 'forum');
}
if ($oldversion < 2014081900) {
// Define table forum_discussion_subs to be created.
$table = new xmldb_table('forum_discussion_subs');
// Adding fields to table forum_discussion_subs.
$table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
$table->add_field('forum', 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('discussion', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('preference', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1');
// Adding keys to table forum_discussion_subs.
$table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
$table->add_key('forum', XMLDB_KEY_FOREIGN, array('forum'), 'forum', array('id'));
$table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
$table->add_key('discussion', XMLDB_KEY_FOREIGN, array('discussion'), 'forum_discussions', array('id'));
$table->add_key('user_discussions', XMLDB_KEY_UNIQUE, array('userid', 'discussion'));
// Conditionally launch create table for forum_discussion_subs.
if (!$dbman->table_exists($table)) {
$dbman->create_table($table);
}
// Forum savepoint reached.
upgrade_mod_savepoint(true, 2014081900, 'forum');
}
if ($oldversion < 2014103000) {
// Find records with multiple userid/postid combinations and find the lowest ID.
// Later we will remove all those which don't match this ID.
$sql = "
SELECT MIN(id) as lowid, userid, postid
FROM {forum_read}
GROUP BY userid, postid
HAVING COUNT(id) > 1";
if ($duplicatedrows = $DB->get_recordset_sql($sql)) {
foreach ($duplicatedrows as $row) {
$DB->delete_records_select('forum_read', 'userid = ? AND postid = ? AND id <> ?', array(
$row->userid,
$row->postid,
$row->lowid,
));
}
}
$duplicatedrows->close();
// Forum savepoint reached.
upgrade_mod_savepoint(true, 2014103000, 'forum');
}
if ($oldversion < 2014110300) {
// Changing precision of field preference on table forum_discussion_subs to (10).
$table = new xmldb_table('forum_discussion_subs');
$field = new xmldb_field('preference', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '1', 'discussion');
// Launch change of precision for field preference.
$dbman->change_field_precision($table, $field);
// Forum savepoint reached.
upgrade_mod_savepoint(true, 2014110300, 'forum');
}
// Moodle v2.8.0 release upgrade line.
// Put any upgrade step following this.
// Moodle v2.9.0 release upgrade line.
// Put any upgrade step following this.
if ($oldversion < 2015102900) {
// Groupid = 0 is never valid.
$DB->set_field('forum_discussions', 'groupid', -1, array('groupid' => 0));
// Forum savepoint reached.
upgrade_mod_savepoint(true, 2015102900, 'forum');
}
// Moodle v3.0.0 release upgrade line.
// Put any upgrade step following this.
if ($oldversion < 2015120800) {
// Add support for pinned discussions.
$table = new xmldb_table('forum_discussions');
$field = new xmldb_field('pinned', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'timeend');
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// Forum savepoint reached.
upgrade_mod_savepoint(true, 2015120800, 'forum');
}
// Moodle v3.1.0 release upgrade line.
// Put any upgrade step following this.
if ($oldversion < 2016091200) {
// Define field lockdiscussionafter to be added to forum.
$table = new xmldb_table('forum');
$field = new xmldb_field('lockdiscussionafter', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'displaywordcount');
// Conditionally launch add field lockdiscussionafter.
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// Forum savepoint reached.
upgrade_mod_savepoint(true, 2016091200, 'forum');
}
return true;
}