1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - ReadMessage 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 MoinSupport import * 11 from ItemSupport import ItemStore 12 from email.parser import Parser 13 14 Dependencies = [] 15 16 class ReadMessage(ActionBase, ActionSupport): 17 18 "An action that can read a stored message component." 19 20 def __init__(self, pagename, request): 21 22 """ 23 On the page with the given 'pagename', use the given 'request' to access 24 message components. 25 """ 26 27 ActionBase.__init__(self, pagename, request) 28 self.store = ItemStore(self.page, "messages", "message-locks") 29 30 def get_form_html(self, buttons_html): 31 32 "Present an interface for accessing a message component." 33 34 _ = self._ 35 request = self.request 36 form = self.get_form() 37 38 message = form.get("message", [""])[0] 39 part = form.get("part", [""])[0] 40 41 # Fill in the fields and labels. 42 43 d = { 44 "buttons_html" : buttons_html, 45 "message_label" : _("Message number"), 46 "message_default" : escattr(message), 47 "part_label" : _("Part identifier"), 48 "part_default" : escattr(part), 49 } 50 51 # Prepare the output HTML. 52 53 html = ''' 54 <table> 55 <tr> 56 <td class="label"><label>%(message_label)s</label></td> 57 <td> 58 <input name="message" type="text" value="%(message_default)s" /> 59 </td> 60 </tr> 61 <tr> 62 <td class="label"><label>%(part_label)s</label></td> 63 <td> 64 <input name="part" type="text" value="%(part_default)s" /> 65 </td> 66 </tr> 67 <tr> 68 <td></td> 69 <td class="buttons"> 70 %(buttons_html)s 71 </td> 72 </tr> 73 </table>''' % d 74 75 return html 76 77 def do_action(self): 78 79 "Attempt to send the message." 80 81 _ = self._ 82 request = self.request 83 form = self.get_form() 84 85 message_number = form.get("message", [None])[0] 86 part_identifier = form.get("part", [None])[0] 87 88 if not message_number: 89 return 0, _("A message number must be given.") 90 91 if not part_identifier: 92 return 0, _("A part identifier must be given.") 93 94 # Obtain the message. 95 96 try: 97 message_text = self.store[int(message_number)] 98 except (IndexError, ValueError): 99 return 0, _("No such message is stored on this page.") 100 101 # Visit the message parts, looking for the indicated component. 102 103 message = Parser().parsestr(message_text) 104 105 if message.is_multipart(): 106 for part in message.get_payload(): 107 108 # For the selected component, return the content as a response 109 # to the current request. 110 111 if part.get("Content-ID") == part_identifier: 112 charset = part.get_content_charset() 113 headers = [ 114 "Content-Type: %s%s" % ( 115 part.get_content_type(), 116 charset and ("; charset=%s" % charset) or "" 117 ) 118 ] 119 get_send_headers(request)(headers) 120 request.write(part.get_payload(decode=True)) 121 return 1, None 122 123 return 0, _("No such component in the indicated message.") 124 125 def render_success(self, msg, msgtype=None): 126 127 """ 128 Render neither 'msg' nor 'msgtype' since a resource has already been 129 produced. 130 NOTE: msgtype is optional because MoinMoin 1.5.x does not support it. 131 """ 132 133 pass 134 135 # Action function. 136 137 def execute(pagename, request): 138 ReadMessage(pagename, request).render() 139 140 # vim: tabstop=4 expandtab shiftwidth=4