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 2003-2008 MoinMoin:ThomasWaldmann, 8 2004-2006 MoinMoin:AlexanderSchremmer, 9 2007 MoinMoin:ReimarBauer. 10 @license: GNU GPL (v2 or later), see COPYING.txt for details. 11 """ 12 13 from MoinMoin.action import ActionBase 14 from MoinMoin import config 15 from MoinMoin.Page import Page 16 import MoinMoin.util # for MoinMoin 1.5.x 17 import EventAggregatorSupport 18 19 Dependencies = ['pages'] 20 21 # Action class and supporting functions. 22 23 class EventAggregatorSummary(ActionBase): 24 25 "A summary dialogue requesting various parameters." 26 27 def get_form_html(self, buttons_html): 28 _ = self._ 29 request = self.request 30 31 category_list = [] 32 33 for category_name, category_pagename in \ 34 EventAggregatorSupport.getCategoryMapping( 35 EventAggregatorSupport.getCategories(request), 36 request): 37 38 category_list.append('<option value="%s">%s</option>' % (category_pagename, category_name)) 39 40 month_list = [] 41 month_list.append('<option value=""></option>') 42 43 for month in range(1, 13): 44 month_label = _(EventAggregatorSupport.getMonthLabel(month)) 45 month_list.append('<option value="%02d">%s</option>' % (month, month_label)) 46 47 year_label = [] 48 49 d = { 50 "buttons_html" : buttons_html, 51 "category_label" : _("Categories"), 52 "category_list" : "\n".join(category_list), 53 "month_list" : "\n".join(month_list), 54 "start_label" : _("Start year and month"), 55 "start_year_default" : "", 56 "end_label" : _("End year and month"), 57 "end_year_default" : "", 58 } 59 60 return ''' 61 <table> 62 <tr> 63 <td class="label"><label>%(category_label)s</label></td> 64 <td class="content"> 65 <select multiple="multiple" name="category"> 66 %(category_list)s 67 </select> 68 </td> 69 </tr> 70 <tr> 71 <td class="label"><label>%(start_label)s</label></td> 72 <td> 73 <select name="start-month"> 74 %(month_list)s 75 </select> 76 <input name="start-year" type="text" value="%(start_year_default)s" size="4" /> 77 </td> 78 </tr> 79 <tr> 80 <td class="label"><label>%(end_label)s</label></td> 81 <td> 82 <select name="end-month"> 83 %(month_list)s 84 </select> 85 <input name="end-year" type="text" value="%(end_year_default)s" size="4" /> 86 </td> 87 </tr> 88 <tr> 89 <td></td> 90 <td class="buttons"> 91 %(buttons_html)s 92 </td> 93 </tr> 94 </table> 95 ''' % d 96 97 def do_action(self): 98 99 "Write the iCalendar resource." 100 101 _ = self._ 102 form = self.request.form 103 104 # If no category names exist in the request, an error message is 105 # returned. 106 107 category_names = form.get("category", []) 108 109 if not category_names: 110 return 0, _("No categories specified.") 111 112 write_resource(self.request) 113 return 1, None 114 115 def render_success(self, msg, msgtype=None): 116 117 """ 118 Render neither 'msg' nor 'msgtype' since a resource has already been 119 produced. 120 NOTE: msgtype is optional because MoinMoin 1.5.x does not support it. 121 """ 122 123 pass 124 125 def getQuotedText(text): 126 127 "Return the 'text' quoted for iCalendar purposes." 128 129 return text.replace(";", r"\;").replace(",", r"\,") 130 131 def write_resource(request): 132 133 """ 134 For the given 'request', write an iCalendar summary of the event data found 135 in the categories specified via the "category" request parameter, using the 136 "start" and "end" parameters (if specified). Multiple "category" parameters 137 can be specified. 138 """ 139 140 category_names = request.form.get("category", []) 141 142 # Otherwise, produce an iCalendar resource. 143 144 calendar_start = EventAggregatorSupport.getFormMonth(request, None, "start") 145 calendar_end = EventAggregatorSupport.getFormMonth(request, None, "end") 146 147 # Look for separate start and end years and months. 148 149 form = request.form 150 151 if calendar_start is None: 152 calendar_start = EventAggregatorSupport.getFormMonthPair(request, "start-year", "start-month") 153 154 if calendar_end is None: 155 calendar_end = EventAggregatorSupport.getFormMonthPair(request, "end-year", "end-month") 156 157 events, shown_events, all_shown_events, earliest, latest = \ 158 EventAggregatorSupport.getEvents(request, category_names, calendar_start, calendar_end) 159 160 # Output iCalendar data... 161 162 if EventAggregatorSupport.isMoin15(): 163 send_headers = request.http_headers 164 else: 165 send_headers = request.emit_http_headers 166 167 send_headers(["Content-Type: text/calendar; charset=%s" % config.charset]) 168 169 request.write("BEGIN:VCALENDAR\r\n") 170 request.write("PRODID:-//MoinMoin//EventAggregatorSummary\r\n") 171 request.write("VERSION:2.0\r\n") 172 173 for event_page, event_details in all_shown_events: 174 175 # Get the summary and timestamp details. 176 177 event_summary = EventAggregatorSupport.getEventSummary(event_page, event_details) 178 179 # Get the initial revision of the page. 180 181 revisions = event_page.getRevList() 182 event_page_initial = Page(request, event_page.page_name, rev=revisions[-1]) 183 184 # Get the created and last modified times. 185 186 created = EventAggregatorSupport.getPageDate(event_page_initial) 187 last_modified = EventAggregatorSupport.getPageDate(event_page) 188 sequence = len(revisions) - 1 189 190 # Output the event details. 191 192 request.write("BEGIN:VEVENT\r\n") 193 request.write("UID:%s\r\n" % request.getQualifiedURL(event_page.url(request))) 194 request.write("URL:%s\r\n" % request.getQualifiedURL(event_page.url(request))) 195 request.write("DTSTAMP:%04d%02d%02dT%02d%02d%02dZ\r\n" % created[:6]) 196 request.write("LAST-MODIFIED:%04d%02d%02dT%02d%02d%02dZ\r\n" % last_modified[:6]) 197 request.write("SEQUENCE:%d\r\n" % sequence) 198 request.write("DTSTART;VALUE=DATE:%04d%02d%02d\r\n" % event_details["start"]) 199 request.write("DTEND;VALUE=DATE:%04d%02d%02d\r\n" % EventAggregatorSupport.nextdate(event_details["end"])) 200 request.write("SUMMARY:%s\r\n" % getQuotedText(event_summary)) 201 202 # Optional details. 203 204 if event_details.has_key("topics") or event_details.has_key("categories"): 205 request.write("CATEGORIES:%s\r\n" % ",".join( 206 [getQuotedText(topic) for topic in event_details.get("topics") or event_details.get("categories")] 207 )) 208 if event_details.has_key("location"): 209 request.write("LOCATION:%s\r\n" % getQuotedText(event_details["location"])) 210 211 request.write("END:VEVENT\r\n") 212 213 request.write("END:VCALENDAR\r\n") 214 215 if EventAggregatorSupport.isMoin15(): 216 raise MoinMoin.util.MoinMoinNoFooter 217 218 # Action function. 219 220 def execute(pagename, request): 221 EventAggregatorSummary(pagename, request).render() 222 223 # vim: tabstop=4 expandtab shiftwidth=4