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} + + +{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)} + +{/foreach} +
IdWhoWhenSummaryActions
{$r->id}{$submitter}{$r->creation_dtime|dateago}{$r->summary}{if $r->is_head == false}View - Delete - Restore{/if}
+{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}