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