1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - SharedUpdate Action 4 5 @copyright: 2012 by Paul Boddie <paul@boddie.org.uk> 6 @license: GNU GPL (v2 or later), see COPYING.txt for details. 7 """ 8 9 from MoinMoin.action import ActionBase 10 from MoinMoin import wikiutil 11 from MoinShare import * 12 13 Dependencies = ['pages'] 14 15 # Action class and supporting functions. 16 17 class SharedUpdate(ActionBase, ActionSupport): 18 19 "A summary dialogue requesting various parameters." 20 21 def get_form_html(self, buttons_html): 22 _ = self._ 23 request = self.request 24 form = self.get_form() 25 page = self.page 26 27 pagename = form.get("pagename", [page.page_name])[0] 28 fragment = form.get("fragment", [""])[0] 29 mimetype = form.get("type", [""])[0] 30 31 d = { 32 "buttons_html" : buttons_html, 33 "pagename_label" : escape(_("Page name for updates")), 34 "pagename" : escattr(pagename), 35 "fragment_label" : escape(_("Fragment to download")), 36 "fragment" : escattr(fragment), 37 "mimetype_label" : escape(_("Content/media type")), 38 "mimetype" : escattr(mimetype), 39 } 40 41 return ''' 42 <table> 43 <tr> 44 <td class="label"><label>%(pagename_label)s</label></td> 45 <td class="content"> 46 <input name="pagename" type="text" size="40" value="%(pagename)s" /> 47 </td> 48 </tr> 49 <tr> 50 <td class="label"><label>%(fragment_label)s</label></td> 51 <td class="content"> 52 <input name="fragment" type="text" size="40" value="%(fragment)s" /> 53 </td> 54 </tr> 55 <tr> 56 <td class="label"><label>%(mimetype_label)s</label></td> 57 <td class="content"> 58 <input name="type" type="text" size="40" value="%(mimetype)s" /> 59 </td> 60 </tr> 61 <tr> 62 <td></td> 63 <td class="buttons"> 64 %(buttons_html)s 65 </td> 66 </tr> 67 </table> 68 ''' % d 69 70 def do_action(self): 71 72 "Write the syndication resource." 73 74 _ = self._ 75 form = self.get_form() 76 77 # If no fragment exists in the request, an error message is returned. 78 79 fragment = form.get("fragment") 80 81 if not fragment: 82 return 0, _("No fragment to download specified.") 83 84 write_resource(self.request) 85 return 1, None 86 87 def render_success(self, msg, msgtype=None): 88 89 """ 90 Render neither 'msg' nor 'msgtype' since a resource has already been 91 produced. 92 NOTE: msgtype is optional because MoinMoin 1.5.x does not support it. 93 """ 94 95 pass 96 97 def write_resource(request): 98 99 """ 100 For the given 'request', write the requested fragment with the specified 101 content/media type (or use content negotiation to choose a media type). 102 """ 103 104 form = get_form(request) 105 106 pagename = form.get("pagename", [request.page.page_name])[0] 107 fragment = form.get("fragment", [None])[0] 108 mimetype = form.get("type", [None])[0] 109 110 page = Page(request, pagename) 111 metadata = getMetadata(page) 112 113 # Set the default error status. 114 115 status = "404 Not Found" 116 117 # Get the fragment regions for the page, trying to find the requested 118 # fragment. 119 120 for n, (format, attributes, body) in enumerate(getFragments(page.get_raw_body())): 121 122 # Produce a fragment identifier. 123 # NOTE: Choose a more robust identifier where none is explicitly given. 124 125 region_fragment = attributes.get("fragment", str(n)) 126 127 # Check the region's fragment identifier. 128 129 if fragment != region_fragment: 130 continue 131 132 # Check the mimetype availability. 133 134 mimetypes = getOutputTypes(request, format) 135 136 # Perform content negotiation if no mimetype was specified. 137 138 if mimetype is None: 139 mimetype = getPreferredOutputTypes(request, mimetypes)[0] 140 141 # Where no suitable mimetype is found, break out of the loop and return 142 # an error. 143 144 elif mimetype not in mimetypes: 145 status = "406 Not Acceptable" 146 break 147 148 # Define headers. 149 150 writeHeaders(request, mimetype, metadata) 151 updated = getUpdatedTime(metadata) 152 153 # Fragment output... 154 155 parser_cls = getParserClass(request, format) 156 parser = parser_cls(body, request) 157 158 if hasattr(parser, "formatForOutputType"): 159 parser.formatForOutputType(mimetype) 160 else: 161 fmt = request.html_formatter 162 parser.format(fmt) 163 164 return 165 166 # Error output. 167 168 writeHeaders(request, "text/plain", metadata, status) 169 request.write("Sorry, but the specified fragment %s could not be provided as type %s." % (fragment, mimetype)) 170 171 # Action function. 172 173 def execute(pagename, request): 174 SharedUpdate(pagename, request).render() 175 176 # vim: tabstop=4 expandtab shiftwidth=4