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 month_list = [] 38 month_list.append('<option value=""></option>') 39 40 for month in range(1, 13): 41 month_label = _(EventAggregatorSupport.getMonthLabel(month)) 42 month_list.append('<option value="%02d">%s</option>' % (month, month_label)) 43 44 year_label = [] 45 46 d = { 47 "buttons_html" : buttons_html, 48 "category_label" : _("Categories"), 49 "category_list" : "\n".join(category_list), 50 "month_list" : "\n".join(month_list), 51 "start_label" : _("Start year and month"), 52 "start_year_default" : "", 53 "end_label" : _("End year and month"), 54 "end_year_default" : "", 55 } 56 57 return ''' 58 <table> 59 <tr> 60 <td class="label"><label>%(category_label)s</label></td> 61 <td class="content"> 62 <select multiple="multiple" name="category"> 63 %(category_list)s 64 </select> 65 </td> 66 </tr> 67 <tr> 68 <td class="label"><label>%(start_label)s</label></td> 69 <td> 70 <select name="start-month"> 71 %(month_list)s 72 </select> 73 <input name="start-year" type="text" value="%(start_year_default)s" size="4" /> 74 </td> 75 </tr> 76 <tr> 77 <td class="label"><label>%(end_label)s</label></td> 78 <td> 79 <select name="end-month"> 80 %(month_list)s 81 </select> 82 <input name="end-year" type="text" value="%(end_year_default)s" size="4" /> 83 </td> 84 </tr> 85 <tr> 86 <td></td> 87 <td class="buttons"> 88 %(buttons_html)s 89 </td> 90 </tr> 91 </table> 92 ''' % d 93 94 def do_action(self): 95 96 "Write the iCalendar resource." 97 98 _ = self._ 99 form = self.request.form 100 101 # If no category names exist in the request, an error message is 102 # returned. 103 104 category_names = form.get("category", []) 105 106 if not category_names: 107 return 0, _("No categories specified.") 108 109 write_resource(self.request) 110 return 1, None 111 112 def render_success(self, msg, msgtype): 113 114 """ 115 Render neither 'msg' nor 'msgtype' since a resource has already been 116 produced. 117 """ 118 119 pass 120 121 def write_resource(request): 122 123 """ 124 For the given 'request', write an iCalendar summary of the event data found 125 in the categories specified via the "category" request parameter, using the 126 "start" and "end" parameters (if specified). Multiple "category" parameters 127 can be specified. 128 """ 129 130 category_names = request.form.get("category", []) 131 132 # Otherwise, produce an iCalendar resource. 133 134 calendar_start = EventAggregatorSupport.getFormMonth(request, None, "start") 135 calendar_end = EventAggregatorSupport.getFormMonth(request, None, "end") 136 137 # Look for separate start and end years and months. 138 139 form = request.form 140 141 if calendar_start is None: 142 calendar_start = EventAggregatorSupport.getFormMonthPair(request, "start-year", "start-month") 143 144 if calendar_end is None: 145 calendar_end = EventAggregatorSupport.getFormMonthPair(request, "end-year", "end-month") 146 147 events, shown_events, all_shown_events, earliest, latest = \ 148 EventAggregatorSupport.getEvents(request, category_names, calendar_start, calendar_end) 149 150 # Output iCalendar data... 151 152 request.emit_http_headers(["Content-Type: text/calendar; charset=%s" % config.charset]) 153 154 request.write("BEGIN:VCALENDAR\r\n") 155 request.write("PRODID:-//MoinMoin//EventAggregatorSummary\r\n") 156 request.write("VERSION:2.0\r\n") 157 158 for event_page, event_details in all_shown_events: 159 160 event_summary = EventAggregatorSupport.getEventSummary(event_page, event_details) 161 162 # Output the event details. 163 164 request.write("BEGIN:VEVENT\r\n") 165 request.write("SUMMARY:%s\r\n" % event_summary) 166 request.write("UID:%s\r\n" % request.getQualifiedURL(event_page.url(request))) 167 request.write("URL:%s\r\n" % request.getQualifiedURL(event_page.url(request))) 168 request.write("DTSTART;VALUE=DATE:%04d%02d%02d\r\n" % event_details["start"]) 169 request.write("DTEND;VALUE=DATE:%04d%02d%02d\r\n" % EventAggregatorSupport.nextdate(event_details["end"])) 170 if event_details.has_key("topics"): 171 request.write("CATEGORIES:%s\r\n" % ",".join(event_details["topics"])) 172 request.write("END:VEVENT\r\n") 173 174 request.write("END:VCALENDAR\r\n") 175 176 # Action function. 177 178 def execute(pagename, request): 179 EventAggregatorSummary(pagename, request).render() 180 181 # vim: tabstop=4 expandtab shiftwidth=4