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