From 9a6a6c21f51fe5a85a7135b6da1f47fb59ef7a11 Mon Sep 17 00:00:00 2001
From: William MARTIN
Date: Mon, 5 Dec 2011 11:04:01 +0100
Subject: [PATCH] Enhancement of the history of a wiki page. - Add more
visibility to the delete revision function - Add a restore function
Don't send 404 when the user what to see a specific revision that is the current revision
---
src/IDF/Views/Wiki.php | 92 ++++++++++++++++++-
src/IDF/conf/urls.php | 10 ++
src/IDF/templates/idf/wiki/history.html | 38 ++++++++
src/IDF/templates/idf/wiki/view.html | 5 +-
.../idf/wiki/wiki-default-page.mdtext | 8 +-
5 files changed, 144 insertions(+), 9 deletions(-)
create mode 100644 src/IDF/templates/idf/wiki/history.html
diff --git a/src/IDF/Views/Wiki.php b/src/IDF/Views/Wiki.php
index 35c1ca8..e007b07 100644
--- a/src/IDF/Views/Wiki.php
+++ b/src/IDF/Views/Wiki.php
@@ -262,7 +262,13 @@ class IDF_Views_Wiki
if (isset($request->GET['rev']) and preg_match('/^[0-9]+$/', $request->GET['rev'])) {
$oldrev = Pluf_Shortcuts_GetObjectOr404('IDF_WikiRevision',
$request->GET['rev']);
- if ($oldrev->wikipage != $page->id or $oldrev->is_head == true) {
+ if ($oldrev->is_head == true) {
+ $url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',
+ array($prj->shortname, $page->title));
+ return new Pluf_HTTP_Response_Redirect($url);
+ }
+
+ if ($oldrev->wikipage != $page->id) {
return new Pluf_HTTP_Response_NotFound($request);
}
}
@@ -288,6 +294,39 @@ class IDF_Views_Wiki
$request);
}
+ /**
+ * See the revision list of a documentation page.
+ */
+ public $history_precond = array('IDF_Precondition::accessWiki');
+ public function history($request, $match)
+ {
+ $prj = $request->project;
+ // Find the page
+ $sql = new Pluf_SQL('project=%s AND title=%s',
+ array($prj->id, $match[2]));
+ $pages = Pluf::factory('IDF_WikiPage')->getList(array('filter'=>$sql->gen()));
+ if ($pages->count() != 1) {
+ return new Pluf_HTTP_Response_NotFound($request);
+ }
+ $page = $pages[0];
+ $ptags = self::getWikiTags($prj);
+ $dtag = array_pop($ptags); // The last tag is the deprecated tag.
+ $tags = $page->get_tags_list();
+ $dep = Pluf_Model_InArray($dtag, $tags);
+ $title = sprintf(__('History of the wiki page %s'), $page->title);
+ $revision = $page->get_current_revision();
+ $revs = $page->get_revisions_list(array('order' => 'creation_dtime DESC'));
+ return Pluf_Shortcuts_RenderToResponse('idf/wiki/history.html',
+ array(
+ 'page' => $page,
+ 'page_title' => $title,
+ 'rev' => $revision,
+ 'revs' => $revs,
+ 'tags' => $tags,
+ ),
+ $request);
+ }
+
/**
* Remove a revision of a page.
*/
@@ -327,6 +366,57 @@ class IDF_Views_Wiki
$request);
}
+ public $restoreRev_precond = array('IDF_Precondition::accessWiki',
+ 'IDF_Precondition::projectMemberOrOwner');
+ public function restoreRev($request, $match)
+ {
+ $prj = $request->project;
+ $oldrev = Pluf_Shortcuts_GetObjectOr404('IDF_WikiRevision', $match[2]);
+ $page = $oldrev->get_wikipage();
+ $prj->inOr404($page);
+
+ // Prevent restore the current version
+ if ($oldrev->is_head == true) {
+ $request->user->setMessage(__('This revision is already the current revision.'));
+ $url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',
+ array($prj->shortname, $page->title));
+ return new Pluf_HTTP_Response_Redirect($url);
+ }
+
+ $params = array(
+ 'project' => $prj,
+ 'user' => $request->user,
+ 'page' => $page,
+ );
+
+ $data = array(
+ 'title' => $page->title,
+ 'summary' => $page->summary,
+ 'content' => $oldrev->content,
+ 'comment' => sprintf(__('Restore old revision (%s)'), $oldrev->id),
+ );
+
+ $tags = $page->get_tags_list();
+ for ($i=1;$i<4;$i++) {
+ if (isset($tags[$i-1])) {
+ if ($tags[$i-1]->class != 'Other') {
+ $data['label'.$i] = (string) $tags[$i-1];
+ } else {
+ $data['label'.$i] = $tags[$i-1]->name;
+ }
+ } else {
+ $data['label'.$i] = '';
+ }
+ }
+
+ $form = new IDF_Form_WikiUpdate($data, $params);
+ $page = $form->save();
+
+ $url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',
+ array($prj->shortname, $page->title));
+ return new Pluf_HTTP_Response_Redirect($url);
+ }
+
/**
* View a documentation page.
*/
diff --git a/src/IDF/conf/urls.php b/src/IDF/conf/urls.php
index 9ac10e2..991b70a 100644
--- a/src/IDF/conf/urls.php
+++ b/src/IDF/conf/urls.php
@@ -292,11 +292,21 @@ $ctl[] = array('regex' => '#^/p/([\-\w]+)/doc/delrev/(\d+)/$#',
'model' => 'IDF_Views_Wiki',
'method' => 'deleteRev');
+$ctl[] = array('regex' => '#^/p/([\-\w]+)/doc/resrev/(\d+)/$#',
+ 'base' => $base,
+ 'model' => 'IDF_Views_Wiki',
+ 'method' => 'restoreRev');
+
$ctl[] = array('regex' => '#^/p/([\-\w]+)/doc/delete/(\d+)/$#',
'base' => $base,
'model' => 'IDF_Views_Wiki',
'method' => 'delete');
+$ctl[] = array('regex' => '#^/p/([\-\w]+)/doc/history/(.*)/$#',
+ 'base' => $base,
+ 'model' => 'IDF_Views_Wiki',
+ 'method' => 'history');
+
$ctl[] = array('regex' => '#^/p/([\-\w]+)/page/(.*)/$#',
'base' => $base,
'model' => 'IDF_Views_Wiki',
diff --git a/src/IDF/templates/idf/wiki/history.html b/src/IDF/templates/idf/wiki/history.html
new file mode 100644
index 0000000..59592e0
--- /dev/null
+++ b/src/IDF/templates/idf/wiki/history.html
@@ -0,0 +1,38 @@
+{extends "idf/wiki/base.html"}
+
+{block extraheader}
+
+{/block}
+
+{block docclass}yui-t3{assign $inView=true}{/block}
+
+{block body}
+
+Id | Who | When | Summary | Actions |
+{foreach $revs as $r}
+{ashowuser 'submitter', $rev.get_submitter(), $request}
+{aurl 'view_url', 'IDF_Views_Wiki::view', array($project.shortname, $page.title), array('rev' => $r->id)}
+{aurl 'delete_url', 'IDF_Views_Wiki::deleteRev', array($project.shortname, $r->id)}
+{aurl 'restore_url', 'IDF_Views_Wiki::restoreRev', array($project.shortname, $r->id)}
+{$r->id} | {$submitter} | {$r->creation_dtime|dateago} | {$r->summary} | {if $r->is_head == false}View - Delete - Restore{/if} |
+{/foreach}
+
+{aurl 'add_rev', 'IDF_Views_Wiki::update', array($project.shortname, $page.title)}
+ {trans 'Update This Page'}
+{/block}
+
+
+{block context}
+{ashowuser 'submitter', $page.get_submitter(), $request}
+{trans 'Created:'} {$page.creation_dtime|dateago}
{blocktrans}by {$submitter}{/blocktrans}
+{if $rev.creation_dtime != $page.creation_dtime}{ashowuser 'submitter', $rev.get_submitter(), $request}
+{trans 'Updated:'} {$rev.creation_dtime|dateago}
{blocktrans}by {$submitter}{/blocktrans}
{/if}
+{if $tags.count()}
+
+{trans 'Labels:'}
+{foreach $tags as $tag}
+{$tag.class}:{$tag.name}
+{/foreach}
+
{/if}
+{trans 'See current revision'}
+{/block}
diff --git a/src/IDF/templates/idf/wiki/view.html b/src/IDF/templates/idf/wiki/view.html
index bacb131..8063643 100644
--- a/src/IDF/templates/idf/wiki/view.html
+++ b/src/IDF/templates/idf/wiki/view.html
@@ -52,9 +52,6 @@ by {$submitter}.{/blocktrans}
{/foreach}
{/if}
{if $revs.count() > 0}
-{trans 'Old Revisions'}
-
+{trans 'See older revision'}
{/if}
{/block}
diff --git a/src/IDF/templates/idf/wiki/wiki-default-page.mdtext b/src/IDF/templates/idf/wiki/wiki-default-page.mdtext
index 48632a1..8667254 100644
--- a/src/IDF/templates/idf/wiki/wiki-default-page.mdtext
+++ b/src/IDF/templates/idf/wiki/wiki-default-page.mdtext
@@ -1,6 +1,7 @@
{aurl 'syntax_url', 'IDF_Views_Wiki::view', array($project.shortname, 'IndeferoMarkdownHelp')}
{aurl 'wiki_add', 'IDF_Views_Wiki::create', array($project.shortname)}
{aurl 'wiki_update', 'IDF_Views_Wiki::update', array($project.shortname, 'IndeferoSummaryDefault')}
+{aurl 'wiki_history', 'IDF_Views_Wiki::history', array($project.shortname, 'IndeferoSummaryDefault')}
{aurl 'wiki_admin', 'IDF_Views_Project::adminWiki', array($project.shortname)}
{blocktrans}
Welcome on the documentation section of the project {$project->name}.
@@ -10,8 +11,7 @@ All documentation page use the markdown syntax, you can find help about this syn
- You can update this page [here]({$wiki_update}).
- You can select an other default wiki page [here]({$wiki_admin}). You need to be admin.
-{*
-All modification on wiki pages are saved, and you can see this history on the detail part of each pages.
-The history of the current page can be see here.
-*}
+
+All modification on a wiki page are saved, and you can see this history for each pages.
+The history of the current page can be see [here]({$wiki_history}).
{/blocktrans}