1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - ApproveChanges 4 5 Permit the approval of an edited page queued by the page editor when an 6 unprivileged user attempted to save a page. Since queued changes are placed 7 in a subpage, this action just moves the queued page content into the 8 existing page when approving the changes. 9 10 @copyright: 2011 Paul Boddie <paul@boddie.org.uk> 11 @license: GNU GPL (v2 or later), see COPYING.txt for details. 12 """ 13 14 Dependencies = ['pages'] 15 16 from MoinMoin.action import ActionBase 17 from MoinMoin.Page import Page 18 from MoinMoin.PageEditor import PageEditor 19 from ApproveChangesSupport import * 20 21 # Action class and supporting functions. 22 23 class ApproveChanges(ActionBase): 24 25 "An action which approves a queued page version." 26 27 def __init__(self, pagename, request): 28 ActionBase.__init__(self, pagename, request) 29 _ = self._ 30 self.form_trigger = "approve" 31 self.form_trigger_label = _("Approve changes") 32 33 def get_form_html(self, buttons_html): 34 _ = self._ 35 request = self.request 36 fmt = request.formatter 37 form = get_form(request) 38 rev = form.get("rev") 39 40 d = { 41 "buttons_html" : buttons_html, 42 "prompt" : escape(_("Approve the displayed page version?")), 43 } 44 45 # Prepare the output HTML. 46 47 html = ''' 48 <table> 49 <tr> 50 <td>%(prompt)s</td> 51 </tr> 52 <tr> 53 <td class="buttons"> 54 %(buttons_html)s 55 </td> 56 </tr> 57 </table>''' % d 58 59 if rev: 60 html += ''' 61 <input name="rev" type="hidden" value="%(rev)s" />''' % {"rev" : escattr(rev[0])} 62 63 return html 64 65 def do_action(self): 66 67 "Approve the page and move it into place." 68 69 _ = self._ 70 request = self.request 71 72 # Make sure that only suitably privileged users can perform this action. 73 74 queued_changes_page = get_queued_changes_page(request) 75 76 if not is_reviewer(request): 77 return 0, _("Only page reviewers can perform this action.") 78 79 # Edit the target page, using this page's content. 80 # The current page must be a queued page version. 81 82 if not is_queued_changes_page(request, self.pagename): 83 return 0, _("This page is not queued for approval.") 84 85 target_page_name = get_target_page_name(self.pagename) 86 target_page = PageEditor(request, target_page_name) 87 88 # Save the target page, removing any protective ACL. 89 # First, the displayed revision must be retrieved. 90 91 form = get_form(request) 92 93 # Get the revision or None. 94 95 rev = form.get("rev") 96 if rev is None: 97 rev = self.page.current_rev() 98 else: 99 rev = int(rev[0]) 100 101 page = Page(request, self.page.page_name, rev=rev) 102 body = page.get_raw_body() 103 body = remove_access_control(request, body) 104 105 try: 106 target_page.saveText(body, 0, comment=_("Changes to page approved from queue revision %d.") % rev) 107 except PageEditor.Unchanged: 108 pass 109 110 # Delete the current page. 111 # NOTE: The page could be deleted completely or certain revisions 112 # NOTE: purged. 113 # NOTE: (to-do/proper-queued-page-deletion.txt) 114 115 current_page = PageEditor(request, self.pagename) 116 current_page.deletePage(_("Changes to page approved.")) 117 118 # Redirect to the target page. 119 120 request.http_redirect(target_page.url(request)) 121 return 1, None 122 123 def render_success(self, msg, msgtype): 124 125 """ 126 Render neither 'msg' nor 'msgtype' since redirection should occur 127 instead. 128 NOTE: msgtype is optional because MoinMoin 1.5.x does not support it. 129 """ 130 131 pass 132 133 # Action function. 134 135 def execute(pagename, request): 136 ApproveChanges(pagename, request).render() 137 138 # vim: tabstop=4 expandtab shiftwidth=4