1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - EventAggregatorSummary Action 4 5 @copyright: 2008, 2009, 2010, 2011, 2012 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 2009 Cristian Rigamonti <rigamonti@fsfeurope.org> 11 @license: GNU GPL (v2 or later), see COPYING.txt for details. 12 """ 13 14 from MoinMoin.action import ActionBase 15 from MoinMoin import config 16 from MoinMoin.Page import Page 17 from MoinMoin import wikiutil 18 from EventAggregatorSupport import * 19 20 Dependencies = ['pages'] 21 22 # Action class and supporting functions. 23 24 class EventAggregatorSummary(ActionBase, ActionSupport): 25 26 "A summary dialogue requesting various parameters." 27 28 def get_form_html(self, buttons_html): 29 _ = self._ 30 request = self.request 31 form = self.get_form() 32 33 resolution = form.get("resolution", ["month"])[0] 34 35 category_list = [] 36 category_pagenames = form.get("category", []) 37 38 for category_name, category_pagename in getCategoryMapping(getCategories(request), request): 39 40 selected = self._get_selected_for_list(category_pagename, category_pagenames) 41 42 category_list.append('<option value="%s" %s>%s</option>' % ( 43 escattr(category_pagename), selected, escape(category_name))) 44 45 sources_list = [] 46 sources = form.get("source", []) 47 48 for source_name in (getAllEventSources(request) or {}).keys(): 49 50 selected = self._get_selected_for_list(source_name, sources) 51 52 sources_list.append('<option value="%s" %s>%s</option>' % ( 53 escattr(source_name), selected, escape(source_name))) 54 55 # Initialise month lists and defaults. 56 57 start_month_list, end_month_list = self.get_month_lists() 58 start_day_default, end_day_default = self.get_day_defaults() 59 start_year_default, end_year_default = self.get_year_defaults() 60 61 # Criteria instead of months and years. 62 63 start_criteria_default = form.get("start", [""])[0] 64 end_criteria_default = form.get("end", [""])[0] 65 66 if resolution == "date": 67 get_parameter = getParameterDate 68 get_label = getFullDateLabel 69 else: 70 get_parameter = getParameterMonth 71 get_label = getFullMonthLabel 72 73 start_criteria_evaluated = get_parameter(start_criteria_default) 74 end_criteria_evaluated = get_parameter(end_criteria_default) 75 76 start_criteria_evaluated = get_label(request, start_criteria_evaluated) 77 end_criteria_evaluated = get_label(request, end_criteria_evaluated) 78 79 # Descriptions. 80 81 descriptions = form.get("descriptions", [None])[0] 82 83 descriptions_list = [ 84 '<option value="%s" %s>%s</option>' % ("page", self._get_selected("page", descriptions), escape(_("page"))), 85 '<option value="%s" %s>%s</option>' % ("comment", self._get_selected("comment", descriptions), escape(_("comment"))) 86 ] 87 88 # Format. 89 90 format = form.get("format", [None])[0] 91 92 format_list = [ 93 '<option value="%s" %s>%s</option>' % ("iCalendar", self._get_selected("iCalendar", format), escape(_("iCalendar"))), 94 '<option value="%s" %s>%s</option>' % ("RSS", self._get_selected("RSS", format), escape(_("RSS 2.0"))) 95 ] 96 97 right_arrow = unicode('\xe2\x86\x92', "utf-8") 98 99 d = { 100 "buttons_html" : buttons_html, 101 "category_label" : escape(_("Categories")), 102 "category_list" : "\n".join(category_list), 103 "sources_label" : escape(_("Sources")), 104 "sources_list" : "\n".join(sources_list), 105 "start_month_list" : "\n".join(start_month_list), 106 "start_label" : escape(_("Start day (optional), month and year")), 107 "start_day_default" : escattr(start_day_default), 108 "start_year_default" : escattr(start_year_default), 109 "start_criteria_label" : escape(_("or special criteria")), 110 "start_criteria_default": escattr(start_criteria_default), 111 "start_eval_label" : escattr(right_arrow), 112 "start_criteria_eval" : escape(start_criteria_evaluated), 113 "end_month_list" : "\n".join(end_month_list), 114 "end_label" : escape(_("End day (optional), month and year")), 115 "end_day_default" : escattr(end_day_default), 116 "end_year_default" : escattr(end_year_default), 117 "end_criteria_label" : escape(_("or special criteria")), 118 "end_criteria_default" : escattr(end_criteria_default), 119 "end_eval_label" : escattr(right_arrow), 120 "end_criteria_eval" : escape(end_criteria_evaluated), 121 "descriptions_label" : escape(_("Use descriptions from...")), 122 "descriptions_list" : "\n".join(descriptions_list), 123 "format_label" : escape(_("Summary format")), 124 "format_list" : "\n".join(format_list), 125 "parent_label" : escape(_("Parent page")), 126 "parent_name" : escattr(form.get("parent", [""])[0]), 127 "resolution" : escattr(resolution), 128 } 129 130 return ''' 131 <input name="resolution" type="hidden" value="%(resolution)s" /> 132 <table> 133 <tr> 134 <td class="label"><label>%(category_label)s</label></td> 135 <td class="content"> 136 <select multiple="multiple" name="category"> 137 %(category_list)s 138 </select> 139 </td> 140 </tr> 141 <tr> 142 <td class="label"><label>%(sources_label)s</label></td> 143 <td class="content"> 144 <select multiple="multiple" name="source"> 145 %(sources_list)s 146 </select> 147 </td> 148 </tr> 149 <tr> 150 <td class="label"><label>%(start_label)s</label></td> 151 <td> 152 <input name="start-day" type="text" value="%(start_day_default)s" size="2" /> 153 <select name="start-month"> 154 %(start_month_list)s 155 </select> 156 <input name="start-year" type="text" value="%(start_year_default)s" size="4" /> 157 </td> 158 </tr> 159 <tr> 160 <td class="label"><label>%(start_criteria_label)s</label></td> 161 <td> 162 <input name="start" type="text" value="%(start_criteria_default)s" size="12" /> 163 <input name="start-eval" type="submit" value="%(start_eval_label)s" /> 164 %(start_criteria_eval)s 165 </td> 166 </tr> 167 <tr> 168 <td class="label"><label>%(end_label)s</label></td> 169 <td> 170 <input name="end-day" type="text" value="%(end_day_default)s" size="2" /> 171 <select name="end-month"> 172 %(end_month_list)s 173 </select> 174 <input name="end-year" type="text" value="%(end_year_default)s" size="4" /> 175 </td> 176 </tr> 177 <tr> 178 <td class="label"><label>%(end_criteria_label)s</label></td> 179 <td> 180 <input name="end" type="text" value="%(end_criteria_default)s" size="12" /> 181 <input name="end-eval" type="submit" value="%(end_eval_label)s" /> 182 %(end_criteria_eval)s 183 </td> 184 </tr> 185 <tr> 186 <td class="label"><label>%(descriptions_label)s</label></td> 187 <td class="content"> 188 <select name="descriptions"> 189 %(descriptions_list)s 190 </select> 191 </td> 192 </tr> 193 <tr> 194 <td class="label"><label>%(format_label)s</label></td> 195 <td class="content"> 196 <select name="format"> 197 %(format_list)s 198 </select> 199 </td> 200 </tr> 201 <tr> 202 <td class="label"><label>%(parent_label)s</label></td> 203 <td class="content"> 204 <input name="parent" type="text" size="40" value="%(parent_name)s" /> 205 </td> 206 </tr> 207 <tr> 208 <td></td> 209 <td class="buttons"> 210 %(buttons_html)s 211 </td> 212 </tr> 213 </table> 214 ''' % d 215 216 def do_action(self): 217 218 "Write the iCalendar resource." 219 220 _ = self._ 221 form = self.get_form() 222 223 # If no category names or sources exist in the request, an error message 224 # is returned. 225 226 category_names = form.get("category", []) 227 sources = form.get("source", []) 228 229 if not (category_names or sources): 230 return 0, _("No categories or sources specified.") 231 232 write_resource(self.request) 233 return 1, None 234 235 def render_success(self, msg, msgtype=None): 236 237 """ 238 Render neither 'msg' nor 'msgtype' since a resource has already been 239 produced. 240 NOTE: msgtype is optional because MoinMoin 1.5.x does not support it. 241 """ 242 243 pass 244 245 def write_resource(request): 246 247 """ 248 For the given 'request', write an iCalendar summary of the event data found 249 in the categories specified via the "category" request parameter, using the 250 "start" and "end" parameters (if specified). Multiple "category" parameters 251 can be specified. 252 """ 253 254 form = get_form(request) 255 256 category_names = form.get("category", []) 257 remote_sources = form.get("source", []) 258 format = form.get("format", ["iCalendar"])[0] 259 descriptions = form.get("descriptions", ["page"])[0] 260 parent = form.get("parent", [""])[0] 261 resolution = form.get("resolution", ["month"])[0] 262 263 # Look first for a single start and end parameter. If that fails to provide 264 # dates, look for separate start and end parameters, either for complete 265 # dates or for years and months. 266 267 if resolution == "date": 268 calendar_start = getFormDate(request, None, "start") 269 calendar_end = getFormDate(request, None, "end") 270 271 if calendar_start is None: 272 calendar_start = getFormDateTriple(request, "start-year", "start-month", "start-day") 273 if calendar_end is None: 274 calendar_end = getFormDateTriple(request, "end-year", "end-month", "end-day") 275 276 elif resolution == "month": 277 calendar_start = getFormMonth(request, None, "start") 278 calendar_end = getFormMonth(request, None, "end") 279 280 if calendar_start is None: 281 calendar_start = getFormMonthPair(request, "start-year", "start-month") 282 if calendar_end is None: 283 calendar_end = getFormMonthPair(request, "end-year", "end-month") 284 285 # Determine the period and get the events involved. 286 287 pages = getPagesFromResults(getAllCategoryPages(category_names, request), request) 288 events = getEventsFromResources(getEventPages(pages)) 289 events += getEventsFromResources(getEventResources(remote_sources, calendar_start, calendar_end, request)) 290 all_shown_events = getEventsInPeriod(events, getCalendarPeriod(calendar_start, calendar_end)) 291 latest_timestamp = setEventTimestamps(request, all_shown_events) 292 293 # Output summary data... 294 295 send_headers = get_send_headers(request) 296 297 # Define headers. 298 299 if format == "iCalendar": 300 headers = ["Content-Type: text/calendar; charset=%s" % config.charset] 301 elif format == "RSS": 302 headers = ["Content-Type: application/rss+xml; charset=%s" % config.charset] 303 304 # Define the last modified time. 305 306 if latest_timestamp is not None: 307 headers.append("Last-Modified: %s" % latest_timestamp.as_HTTP_datetime_string()) 308 309 send_headers(headers) 310 311 # iCalendar output... 312 313 if format == "iCalendar": 314 mimetype = "text/calendar" 315 316 # RSS output... 317 318 elif format == "RSS": 319 mimetype = "application/rss+xml" 320 321 # Catch-all... 322 323 else: 324 mimetype = None 325 326 formatEventsForOutputType(all_shown_events, request, mimetype, parent, descriptions, latest_timestamp) 327 328 # Action function. 329 330 def execute(pagename, request): 331 EventAggregatorSummary(pagename, request).render() 332 333 # vim: tabstop=4 expandtab shiftwidth=4