Wiki enhancement: edit locking (uses AJAX)

This commit is contained in:
sam_marshall 2006-09-25 17:42:32 +00:00
parent f775a510d6
commit 22e846cde2
10 changed files with 291 additions and 11 deletions

View file

@ -36,5 +36,21 @@ $mod_wiki_capabilities = array(
'coursecreator' => CAP_PREVENT,
'admin' => CAP_ALLOW
)
),
'mod/wiki:overridelock' => array(
'riskbitmask' => 0,
'captype' => 'write',
'contextlevel' => CONTEXT_MODULE,
'legacy' => array(
'guest' => CAP_PREVENT,
'student' => CAP_PREVENT,
'teacher' => CAP_ALLOW,
'editingteacher' => CAP_ALLOW,
'coursecreator' => CAP_ALLOW,
'admin' => CAP_ALLOW
)
)
);

View file

@ -48,7 +48,7 @@
<INDEX NAME="pagename" UNIQUE="false" FIELDS="pagename" PREVIOUS="userid"/>
</INDEXES>
</TABLE>
<TABLE NAME="wiki_pages" COMMENT="Holds the Wiki-Pages" PREVIOUS="wiki_entries">
<TABLE NAME="wiki_pages" COMMENT="Holds the Wiki-Pages" PREVIOUS="wiki_entries" NEXT="wiki_locks">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="true" ENUM="false" NEXT="pagename"/>
<FIELD NAME="pagename" TYPE="char" LENGTH="160" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="id" NEXT="version"/>
@ -66,11 +66,37 @@
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id" COMMENT="Primary key for wiki_pages" NEXT="wiki"/>
<!-- sam notes: if implemented, this foreign key will break, since the
field defaults to 0 not null and will therefore fail to find its
referent. -->
<KEY NAME="wiki" TYPE="foreign" FIELDS="wiki" REFTABLE="wiki" REFFIELDS="id" PREVIOUS="primary"/>
</KEYS>
<INDEXES>
<INDEX NAME="pagename-version-wiki" UNIQUE="true" FIELDS="pagename, version, wiki"/>
</INDEXES>
</TABLE>
<TABLE NAME="wiki_locks" COMMENT="Stores editing locks on Wiki pages" PREVIOUS="wiki_pages">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="true" ENUM="false" NEXT="wikiid"/>
<FIELD NAME="wikiid" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" ENUM="false" PREVIOUS="id" NEXT="pagename"/>
<FIELD NAME="pagename" TYPE="char" LENGTH="160" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="wikiid" NEXT="lockedby"/>
<!-- If the page is or was locked, this field holds the userid of the locker -->
<FIELD NAME="lockedby" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="pagename" NEXT='lockedsince'/>
<!-- Time (seconds since epoch) at which lock began -->
<FIELD NAME="lockedsince" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="lockedby" NEXT='lockedseen'/>
<!-- Time (seconds since epoch) at which lock was last reconfirmed (we ignore lock if this is >2 mins ago) -->
<FIELD NAME="lockedseen" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="lockedsince"/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id" COMMENT="Primary key for wiki_locks" NEXT="wikiid"/>
<KEY NAME="wikiid" TYPE="foreign" FIELDS="wikiid" REFTABLE="wiki" REFFIELDS="id" PREVIOUS="primary"/>
</KEYS>
<INDEXES>
<!-- Main index used for retrieving locks -->
<INDEX NAME="wikiid-pagename" UNIQUE="false" FIELDS="wikiid,pagename" NEXT="lockedseen"/>
<!-- Secondary index used only during cron for deleting expired locks -->
<INDEX NAME="lockedseen" UNIQUE="false" FIELDS="lockedseen" PREVIOUS="wikiid-pagename"/>
</INDEXES>
</TABLE>
</TABLES>
</XMLDB>

View file

@ -160,7 +160,21 @@ function wiki_upgrade($oldversion) {
execute_sql("UPDATE {$CFG->prefix}wiki SET initialcontent='' WHERE initialcontent IS NULL");
table_column('wiki','initialcontent','initialcontent','varchar','255','','','not null');
}
if ($oldversion < 2006092502) {
modify_database("","
CREATE TABLE prefix_wiki_locks
(
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
wikiid INT(10) UNSIGNED NOT NULL,
pagename VARCHAR(160) NOT NULL DEFAULT '',
lockedby INT(10) NOT NULL DEFAULT 0,
lockedsince INT(10) NOT NULL DEFAULT 0,
lockedseen INT(10) NOT NULL DEFAULT 0,
PRIMARY KEY(id),
UNIQUE KEY wiki_locks_uk(wikiid,pagename),
INDEX wiki_locks_ix(lockedseen)
);");
}
return true;
}

View file

@ -155,6 +155,21 @@ function wiki_upgrade($oldversion) {
modify_database('', 'ALTER TABLE prefix_wiki_pages
ALTER COLUMN refs DROP NOT NULL');
}
if ($oldversion < 2006092502) {
modify_database("","
CREATE TABLE prefix_wiki_locks
(
id SERIAL PRIMARY KEY,
wikiid INTEGER NOT NULL,
pagename VARCHAR(160) NOT NULL DEFAULT '',
lockedby INTEGER NOT NULL DEFAULT 0,
lockedsince INTEGER NOT NULL DEFAULT 0,
lockedseen INTEGER NOT NULL DEFAULT 0
);");
modify_database("","CREATE INDEX prefix_wikilock_loc_ix ON prefix_wiki_locks (lockedseen);");
modify_database("","CREATE UNIQUE INDEX prefix_wikilock_wikpag_uix ON prefix_wiki_locks (wikiid, pagename);");
}
return true;
}