From 588cc051d3431a8007b06a110fe62467cece13b1 Mon Sep 17 00:00:00 2001 From: rich Date: Mon, 11 Dec 2006 16:59:29 +0000 Subject: [PATCH] Added a Duplicate page function. --- MANIFEST | 3 + conf/cocanwiki.conf | 3 +- scripts/duplicate_page.ml | 111 +++++++++++++++++++++++++++++++++++++ scripts/duplicate_page_form.ml | 46 +++++++++++++++ templates/duplicate_page_form.html | 36 ++++++++++++ templates/page.html | 1 + 6 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 scripts/duplicate_page.ml create mode 100644 scripts/duplicate_page_form.ml create mode 100644 templates/duplicate_page_form.html diff --git a/MANIFEST b/MANIFEST index 7f262d5..6c6e8b2 100644 --- a/MANIFEST +++ b/MANIFEST @@ -109,6 +109,8 @@ scripts/delete_image_form.ml scripts/delete_user.ml scripts/delete_user_form.ml scripts/diff.ml +scripts/duplicate_page.ml +scripts/duplicate_page_form.ml scripts/edit.ml scripts/edit_contact.ml scripts/edit_contact_form.ml @@ -258,6 +260,7 @@ templates/delete_image_form.html templates/delete_macro_form.html templates/delete_user_form.html templates/diff.html +templates/duplicate_page_form.html templates/edit.html templates/edit_conflict.html templates/edit_contact_form.html diff --git a/conf/cocanwiki.conf b/conf/cocanwiki.conf index 290a2db..03b45e1 100644 --- a/conf/cocanwiki.conf +++ b/conf/cocanwiki.conf @@ -1,5 +1,5 @@ # Apache configuration for COCANWIKI. -# $Id: cocanwiki.conf,v 1.25 2006/12/06 09:46:54 rich Exp $ +# $Id: cocanwiki.conf,v 1.26 2006/12/11 16:59:29 rich Exp $ # Uncomment the following lines if necessary. You will probably need # to adjust the paths to reflect where cocanwiki is really installed. @@ -95,6 +95,7 @@ RewriteRule ^/([^_].*)/history.rss$ /_bin/history_rss.cmo?page=$1 [PT,L,QSA] RewriteRule ^/([^_].*)/index.rss$ /_bin/page_rss.cmo?page=$1 [PT,L,QSA] RewriteRule ^/([^_].*)/links$ /_bin/links.cmo?page=$1 [PT,L,QSA] RewriteRule ^/([^_].*)/rename$ /_bin/rename_page_form.cmo?page=$1 [PT,L,QSA] +RewriteRule ^/([^_].*)/duplicate$ /_bin/duplicate_page_form.cmo?page=$1 [PT,L,QSA] RewriteRule ^/([^_].*)/source$ /_bin/source.cmo?page=$1 [PT,L,QSA] RewriteRule ^/([^_].*)/stats$ /_bin/stats.cmo?page=$1 [PT,L,QSA] RewriteRule ^/([^_].*)/styles.css$ /_bin/pagestyle.cmo?page=$1 [PT,L,QSA] diff --git a/scripts/duplicate_page.ml b/scripts/duplicate_page.ml new file mode 100644 index 0000000..b845890 --- /dev/null +++ b/scripts/duplicate_page.ml @@ -0,0 +1,111 @@ +(* COCANWIKI - a wiki written in Objective CAML. + * Written by Richard W.M. Jones . + * Copyright (C) 2004 Merjis Ltd. + * $Id: duplicate_page.ml,v 1.1 2006/12/11 16:59:29 rich Exp $ + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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 this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + *) + +open Apache +open Registry +open Cgi +open Printf + +open Cocanwiki +open Cocanwiki_ok +open Cocanwiki_pages +open Cocanwiki_strings +open Cocanwiki_emailnotify + +let run r (q : cgi) dbh hostid {hostname = hostname} user = + let page = q#param "page" in + + (* Cancelled? *) + if q#param_true "cancel" then + q#redirect ("http://" ^ hostname ^ "/" ^ page); + + let new_title = trim (q#param "new_title") in + + (* New title mustn't be empty string. *) + if new_title = "" then ( + error ~back_button:true ~title:"Empty title not allowed" + r dbh hostid q "The new title cannot be empty."; + return () + ); + + (* Get the old title. *) + let old_title = List.hd ( + PGSQL (dbh) "select title from pages + where hostid = $hostid and url = $page" + ) in + + (* Generate URL for the new title. *) + let new_page = + if page = "index" then page + else + match Wikilib.generate_url_of_title r dbh hostid new_title with + | Wikilib.GenURL_OK url | Wikilib.GenURL_Duplicate url -> url + | Wikilib.GenURL_TooShort | Wikilib.GenURL_BadURL -> + error ~title:"Bad title" ~back_button:true + r dbh hostid q + ("The new title for the page isn't valid. " ^ + "It may be too short or it may not contain " ^ + "enough alphabet letters."); + return () in + + if page = new_page then ( + (* This is an error - the new page must have a new URL. *) + error ~back_button:true ~title:"Bad title" + r dbh hostid q "The new title must be different from the old title in a significant way (eg. not just a change of capitalisation)."; + return () + ); + + (* Create the new page from the old one. *) + let old_model = load_page dbh hostid ~url:page () in + let new_model = new_page_with_title new_title in + let new_model = { new_model with + description = old_model.description; + keywords = old_model.keywords; + noodp = old_model.noodp; + contents_ = old_model.contents_ } in + (try + ignore (save_page r dbh hostid ~user new_model) + with + SaveURLError -> + error ~title:"Page exists" + r dbh hostid q + "Another page with the same title exists."; + return () + ); + + (* Finish off. *) + PGOCaml.commit dbh; + + (* Email notification. *) + let subject = "Page " ^ page ^ " has been duplicated" in + + let body = fun () -> + "Old title: " ^ old_title ^ "\n" ^ + "New title: " ^ new_title in + + email_notify ~body ~subject ~user dbh hostid; + + let buttons = [ ok_button ("/" ^ new_page) ] in + ok ~title:"Page duplicated." ~buttons + r dbh hostid q "That page was duplicated." + +let () = + register_script ~restrict:[CanEdit] run diff --git a/scripts/duplicate_page_form.ml b/scripts/duplicate_page_form.ml new file mode 100644 index 0000000..f4e62f1 --- /dev/null +++ b/scripts/duplicate_page_form.ml @@ -0,0 +1,46 @@ +(* COCANWIKI - a wiki written in Objective CAML. + * Written by Richard W.M. Jones . + * Copyright (C) 2004 Merjis Ltd. + * $Id: duplicate_page_form.ml,v 1.1 2006/12/11 16:59:29 rich Exp $ + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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 this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + *) + +open Apache +open Registry +open Cgi +open Printf + +open Cocanwiki +open Cocanwiki_template + +let run r (q : cgi) dbh hostid _ _ = + let template = get_template r dbh hostid "duplicate_page_form.html" in + + let page = q#param "page" in + + let title = List.hd ( + PGSQL(dbh) "select title from pages + where hostid = $hostid and url = $page" + ) in + + template#set "page" page; + template#set "title" title; + + q#template template + +let () = + register_script ~restrict:[CanEdit] run diff --git a/templates/duplicate_page_form.html b/templates/duplicate_page_form.html new file mode 100644 index 0000000..14eae94 --- /dev/null +++ b/templates/duplicate_page_form.html @@ -0,0 +1,36 @@ + + + +Duplicate page + + + + + +

Duplicate page

+ +
+ + + + + + + + + + + + + + + +
Current title: ::title_html::
New title:
+ + +
+
+ +::include(footer.html):: + + \ No newline at end of file diff --git a/templates/page.html b/templates/page.html index 9304b75..c8adc55 100644 --- a/templates/page.html +++ b/templates/page.html @@ -44,6 +44,7 @@
  • What links here?
  • Edit stylesheet
  • Rename page
  • +
  • Duplicate page
  • New page
  • Images
  • Files
  • -- 1.8.3.1