1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/actions/SharedUpdate.py Sun Jul 15 21:33:24 2012 +0200
1.3 @@ -0,0 +1,176 @@
1.4 +# -*- coding: iso-8859-1 -*-
1.5 +"""
1.6 + MoinMoin - SharedUpdate Action
1.7 +
1.8 + @copyright: 2012 by Paul Boddie <paul@boddie.org.uk>
1.9 + @license: GNU GPL (v2 or later), see COPYING.txt for details.
1.10 +"""
1.11 +
1.12 +from MoinMoin.action import ActionBase
1.13 +from MoinMoin import wikiutil
1.14 +from MoinShare import *
1.15 +
1.16 +Dependencies = ['pages']
1.17 +
1.18 +# Action class and supporting functions.
1.19 +
1.20 +class SharedUpdate(ActionBase, ActionSupport):
1.21 +
1.22 + "A summary dialogue requesting various parameters."
1.23 +
1.24 + def get_form_html(self, buttons_html):
1.25 + _ = self._
1.26 + request = self.request
1.27 + form = self.get_form()
1.28 + page = self.page
1.29 +
1.30 + pagename = form.get("pagename", [page.page_name])[0]
1.31 + fragment = form.get("fragment", [""])[0]
1.32 + mimetype = form.get("type", [""])[0]
1.33 +
1.34 + d = {
1.35 + "buttons_html" : buttons_html,
1.36 + "pagename_label" : escape(_("Page name for updates")),
1.37 + "pagename" : escattr(pagename),
1.38 + "fragment_label" : escape(_("Fragment to download")),
1.39 + "fragment" : escattr(fragment),
1.40 + "mimetype_label" : escape(_("Content/media type")),
1.41 + "mimetype" : escattr(mimetype),
1.42 + }
1.43 +
1.44 + return '''
1.45 +<table>
1.46 + <tr>
1.47 + <td class="label"><label>%(pagename_label)s</label></td>
1.48 + <td class="content">
1.49 + <input name="pagename" type="text" size="40" value="%(pagename)s" />
1.50 + </td>
1.51 + </tr>
1.52 + <tr>
1.53 + <td class="label"><label>%(fragment_label)s</label></td>
1.54 + <td class="content">
1.55 + <input name="fragment" type="text" size="40" value="%(fragment)s" />
1.56 + </td>
1.57 + </tr>
1.58 + <tr>
1.59 + <td class="label"><label>%(mimetype_label)s</label></td>
1.60 + <td class="content">
1.61 + <input name="type" type="text" size="40" value="%(mimetype)s" />
1.62 + </td>
1.63 + </tr>
1.64 + <tr>
1.65 + <td></td>
1.66 + <td class="buttons">
1.67 + %(buttons_html)s
1.68 + </td>
1.69 + </tr>
1.70 +</table>
1.71 +''' % d
1.72 +
1.73 + def do_action(self):
1.74 +
1.75 + "Write the syndication resource."
1.76 +
1.77 + _ = self._
1.78 + form = self.get_form()
1.79 +
1.80 + # If no fragment exists in the request, an error message is returned.
1.81 +
1.82 + fragment = form.get("fragment")
1.83 +
1.84 + if not fragment:
1.85 + return 0, _("No fragment to download specified.")
1.86 +
1.87 + write_resource(self.request)
1.88 + return 1, None
1.89 +
1.90 + def render_success(self, msg, msgtype=None):
1.91 +
1.92 + """
1.93 + Render neither 'msg' nor 'msgtype' since a resource has already been
1.94 + produced.
1.95 + NOTE: msgtype is optional because MoinMoin 1.5.x does not support it.
1.96 + """
1.97 +
1.98 + pass
1.99 +
1.100 +def write_resource(request):
1.101 +
1.102 + """
1.103 + For the given 'request', write the requested fragment with the specified
1.104 + content/media type (or use content negotiation to choose a media type).
1.105 + """
1.106 +
1.107 + form = get_form(request)
1.108 +
1.109 + pagename = form.get("pagename", [request.page.page_name])[0]
1.110 + fragment = form.get("fragment", [None])[0]
1.111 + mimetype = form.get("type", [None])[0]
1.112 +
1.113 + page = Page(request, pagename)
1.114 + metadata = getMetadata(page)
1.115 +
1.116 + # Set the default error status.
1.117 +
1.118 + status = "404 Not Found"
1.119 +
1.120 + # Get the fragment regions for the page, trying to find the requested
1.121 + # fragment.
1.122 +
1.123 + for n, (format, attributes, body) in enumerate(getFragments(page.get_raw_body())):
1.124 +
1.125 + # Produce a fragment identifier.
1.126 + # NOTE: Choose a more robust identifier where none is explicitly given.
1.127 +
1.128 + region_fragment = attributes.get("fragment", str(n))
1.129 +
1.130 + # Check the region's fragment identifier.
1.131 +
1.132 + if fragment != region_fragment:
1.133 + continue
1.134 +
1.135 + # Check the mimetype availability.
1.136 +
1.137 + mimetypes = getOutputTypes(request, format)
1.138 +
1.139 + # Perform content negotiation if no mimetype was specified.
1.140 +
1.141 + if mimetype is None:
1.142 + mimetype = getPreferredOutputTypes(request, mimetypes)[0]
1.143 +
1.144 + # Where no suitable mimetype is found, break out of the loop and return
1.145 + # an error.
1.146 +
1.147 + elif mimetype not in mimetypes:
1.148 + status = "406 Not Acceptable"
1.149 + break
1.150 +
1.151 + # Define headers.
1.152 +
1.153 + writeHeaders(request, mimetype, metadata)
1.154 + updated = getUpdatedTime(metadata)
1.155 +
1.156 + # Fragment output...
1.157 +
1.158 + parser_cls = getParserClass(request, format)
1.159 + parser = parser_cls(body, request)
1.160 +
1.161 + if hasattr(parser, "formatForOutputType"):
1.162 + parser.formatForOutputType(mimetype)
1.163 + else:
1.164 + fmt = request.html_formatter
1.165 + parser.format(fmt)
1.166 +
1.167 + return
1.168 +
1.169 + # Error output.
1.170 +
1.171 + writeHeaders(request, "text/plain", metadata, status)
1.172 + request.write("Sorry, but the specified fragment %s could not be provided as type %s." % (fragment, mimetype))
1.173 +
1.174 +# Action function.
1.175 +
1.176 +def execute(pagename, request):
1.177 + SharedUpdate(pagename, request).render()
1.178 +
1.179 +# vim: tabstop=4 expandtab shiftwidth=4