1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/actions/ReadMessage.py Fri May 17 01:45:12 2013 +0200
1.3 @@ -0,0 +1,144 @@
1.4 +# -*- coding: iso-8859-1 -*-
1.5 +"""
1.6 + MoinMoin - ReadMessage Action
1.7 +
1.8 + @copyright: 2012, 2013 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 MoinSupport import *
1.14 +from email.parser import Parser
1.15 +
1.16 +try:
1.17 + from cStringIO import StringIO
1.18 +except ImportError:
1.19 + from StringIO import StringIO
1.20 +
1.21 +Dependencies = []
1.22 +
1.23 +class ReadMessage(ActionBase, ActionSupport):
1.24 +
1.25 + "An action that can read a stored message component."
1.26 +
1.27 + def __init__(self, pagename, request):
1.28 +
1.29 + """
1.30 + On the page with the given 'pagename', use the given 'request' to access
1.31 + message components.
1.32 + """
1.33 +
1.34 + ActionBase.__init__(self, pagename, request)
1.35 + self.store = ItemStore(self.page, "messages", "message-locks")
1.36 +
1.37 + def get_form_html(self, buttons_html):
1.38 +
1.39 + "Present an interface for accessing a message component."
1.40 +
1.41 + _ = self._
1.42 + request = self.request
1.43 + form = self.get_form()
1.44 +
1.45 + message = form.get("message", [""])[0]
1.46 + part = form.get("part", [""])[0]
1.47 +
1.48 + # Fill in the fields and labels.
1.49 +
1.50 + d = {
1.51 + "buttons_html" : buttons_html,
1.52 + "message_label" : _("Message number"),
1.53 + "message_default" : escattr(message),
1.54 + "part_label" : _("Part identifier"),
1.55 + "part_default" : escattr(part),
1.56 + }
1.57 +
1.58 + # Prepare the output HTML.
1.59 +
1.60 + html = '''
1.61 +<table>
1.62 + <tr>
1.63 + <td class="label"><label>%(message_label)s</label></td>
1.64 + <td>
1.65 + <input name="message" type="text" value="%(message_default)s" />
1.66 + </td>
1.67 + </tr>
1.68 + <tr>
1.69 + <td class="label"><label>%(part_label)s</label></td>
1.70 + <td>
1.71 + <input name="part" type="text" value="%(part_default)s" />
1.72 + </td>
1.73 + </tr>
1.74 + <tr>
1.75 + <td></td>
1.76 + <td class="buttons">
1.77 + %(buttons_html)s
1.78 + </td>
1.79 + </tr>
1.80 +</table>''' % d
1.81 +
1.82 + return html
1.83 +
1.84 + def do_action(self):
1.85 +
1.86 + "Attempt to send the message."
1.87 +
1.88 + _ = self._
1.89 + request = self.request
1.90 + form = self.get_form()
1.91 +
1.92 + message_number = form.get("message", [None])[0]
1.93 + part_identifier = form.get("part", [None])[0]
1.94 +
1.95 + if not message_number:
1.96 + return 0, _("A message number must be given.")
1.97 +
1.98 + if not part_identifier:
1.99 + return 0, _("A part identifier must be given.")
1.100 +
1.101 + # Obtain the message.
1.102 +
1.103 + try:
1.104 + message_text = self.store[int(message_number)]
1.105 + except (IndexError, ValueError):
1.106 + return 0, _("No such message is stored on this page.")
1.107 +
1.108 + # Visit the message parts, looking for the indicated component.
1.109 +
1.110 + message = Parser().parse(StringIO(message_text))
1.111 +
1.112 + if message.is_multipart():
1.113 + for part in message.get_payload():
1.114 +
1.115 + # For the selected component, return the content as a response
1.116 + # to the current request.
1.117 +
1.118 + if part.get("Content-ID") == part_identifier:
1.119 + charset = part.get_content_charset()
1.120 + headers = [
1.121 + "Content-Type: %s%s" % (
1.122 + part.get_content_type(),
1.123 + charset and ("; charset=%s" % charset) or ""
1.124 + )
1.125 + ]
1.126 + get_send_headers(request)(headers)
1.127 + request.write(part.get_payload(decode=True))
1.128 + return 1, None
1.129 +
1.130 + return 0, _("No such component in the indicated message.")
1.131 +
1.132 + def render_success(self, msg, msgtype=None):
1.133 +
1.134 + """
1.135 + Render neither 'msg' nor 'msgtype' since a resource has already been
1.136 + produced.
1.137 + NOTE: msgtype is optional because MoinMoin 1.5.x does not support it.
1.138 + """
1.139 +
1.140 + pass
1.141 +
1.142 +# Action function.
1.143 +
1.144 +def execute(pagename, request):
1.145 + ReadMessage(pagename, request).render()
1.146 +
1.147 +# vim: tabstop=4 expandtab shiftwidth=4