1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - EventAggregatorSummary Action 4 5 @copyright: 2008, 2009 by Paul Boddie <paul@boddie.org.uk> 6 @copyright: 2000-2004 Juergen Hermann <jh@web.de>, 7 2005-2008 MoinMoin:ThomasWaldmann, 8 2007 MoinMoin:ReimarBauer. 9 @license: GNU GPL (v2 or later), see COPYING.txt for details. 10 """ 11 12 from MoinMoin.action import ActionBase 13 from MoinMoin import config 14 import EventAggregatorSupport 15 16 Dependencies = ['pages'] 17 18 # Action class and supporting functions. 19 20 class EventAggregatorSummary(ActionBase): 21 22 "A summary dialogue requesting various parameters." 23 24 def get_form_html(self, buttons_html): 25 _ = self._ 26 request = self.request 27 28 category_list = [] 29 30 for category_name, category_pagename in \ 31 EventAggregatorSupport.getCategoryMapping( 32 EventAggregatorSupport.getCategories(request), 33 request): 34 35 category_list.append('<option value="%s">%s</option>' % (category_pagename, category_name)) 36 37 d = { 38 "buttons_html" : buttons_html, 39 "category_label" : _("Categories"), 40 "category_list" : "\n".join(category_list), 41 "start_label" : _("Start year and month"), 42 "start_default" : "", 43 "end_label" : _("End year and month"), 44 "end_default" : "", 45 } 46 47 return ''' 48 <table> 49 <tr> 50 <td class="label"><label>%(category_label)s</label></td> 51 <td class="content"> 52 <select multiple="multiple" name="category"> 53 %(category_list)s 54 </select> 55 </td> 56 </tr> 57 <tr> 58 <td class="label"><label>%(start_label)s</label></td> 59 <td> 60 <input name="start" type="text" value="%(start_default)s" size="12" /> 61 </td> 62 </tr> 63 <tr> 64 <td class="label"><label>%(end_label)s</label></td> 65 <td> 66 <input name="end" type="text" value="%(end_default)s" size="12" /> 67 </td> 68 </tr> 69 <tr> 70 <td></td> 71 <td class="buttons"> 72 %(buttons_html)s 73 </td> 74 </tr> 75 </table> 76 ''' % d 77 78 def do_action(self): 79 80 "Write the iCalendar resource." 81 82 _ = self._ 83 84 # If no category names exist in the request, an error message is 85 # returned. 86 87 category_names = self.request.form.get("category", []) 88 89 if not category_names: 90 return 0, _("No categories specified.") 91 92 write_resource(self.request) 93 return 1, None 94 95 def render_success(self, msg, msgtype): 96 97 """ 98 Render neither 'msg' nor 'msgtype' since a resource has already been 99 produced. 100 """ 101 102 pass 103 104 def write_resource(request): 105 106 """ 107 For the given 'request', write an iCalendar summary of the event data found 108 in the categories specified via the "category" request parameter, using the 109 "start" and "end" parameters (if specified). Multiple "category" parameters 110 can be specified. 111 """ 112 113 category_names = request.form.get("category", []) 114 115 # Otherwise, produce an iCalendar resource. 116 117 calendar_start = EventAggregatorSupport.getFormMonth(request, None, "start") 118 calendar_end = EventAggregatorSupport.getFormMonth(request, None, "end") 119 120 events, shown_events, all_shown_events, earliest, latest = \ 121 EventAggregatorSupport.getEvents(request, category_names, calendar_start, calendar_end) 122 123 # Output iCalendar data... 124 125 request.emit_http_headers(["Content-Type: text/calendar; charset=%s" % config.charset]) 126 127 request.write("BEGIN:VCALENDAR\r\n") 128 request.write("PRODID:-//MoinMoin//EventAggregatorSummary\r\n") 129 request.write("VERSION:2.0\r\n") 130 131 for event_page, event_details in all_shown_events: 132 133 event_summary = EventAggregatorSupport.getEventSummary(event_page, event_details) 134 135 # Output the event details. 136 137 request.write("BEGIN:VEVENT\r\n") 138 request.write("SUMMARY:%s\r\n" % event_summary) 139 request.write("UID:%s\r\n" % request.getQualifiedURL(event_page.url(request))) 140 request.write("URL:%s\r\n" % request.getQualifiedURL(event_page.url(request))) 141 request.write("DTSTART;VALUE=DATE:%04d%02d%02d\r\n" % event_details["start"]) 142 request.write("DTEND;VALUE=DATE:%04d%02d%02d\r\n" % EventAggregatorSupport.nextdate(event_details["end"])) 143 if event_details.has_key("topics"): 144 request.write("CATEGORIES:%s\r\n" % ",".join(event_details["topics"])) 145 request.write("END:VEVENT\r\n") 146 147 request.write("END:VCALENDAR\r\n") 148 149 # Action function. 150 151 def execute(pagename, request): 152 EventAggregatorSummary(pagename, request).render() 153 154 # vim: tabstop=4 expandtab shiftwidth=4