1.1 --- a/macros/EventAggregator.py Sat Oct 31 01:36:05 2009 +0100
1.2 +++ b/macros/EventAggregator.py Sat Nov 07 21:08:16 2009 +0100
1.3 @@ -27,15 +27,27 @@
1.4
1.5 "A view of the event calendar."
1.6
1.7 - def __init__(self, page, calendar_name, first, last):
1.8 + def __init__(self, page, calendar_name, calendar_start, calendar_end,
1.9 + first, last, category_names, template_name, parent_name, mode):
1.10
1.11 """
1.12 Initialise the view with the current 'page', a 'calendar_name' (which
1.13 - may be None), and the 'first' and 'last' months.
1.14 + may be None), the requested 'calendar_start' and 'calendar_end', and the
1.15 + 'first' and 'last' months of event coverage.
1.16 +
1.17 + The additional 'category_names', 'template_name', 'parent_name' and
1.18 + 'mode' parameters are used to configure the links employed by the view.
1.19 """
1.20
1.21 self.page = page
1.22 self.calendar_name = calendar_name
1.23 + self.calendar_start = calendar_start
1.24 + self.calendar_end = calendar_end
1.25 + self.template_name = template_name
1.26 + self.parent_name = parent_name
1.27 + self.mode = mode
1.28 +
1.29 + self.category_name_parameters = "&".join([("category=%s" % name) for name in category_names])
1.30
1.31 if self.calendar_name is not None:
1.32
1.33 @@ -54,12 +66,93 @@
1.34 self.previous_set_end = EventAggregatorSupport.monthupdate(last, -self.number_of_months)
1.35 self.next_set_end = EventAggregatorSupport.monthupdate(last, self.number_of_months)
1.36
1.37 - def getMonthQueryString(self, argname, month):
1.38 + def getMonthQueryString(self, argname, month, prefix=1):
1.39 if month is not None:
1.40 - return "%s-%s=%04d-%02d" % ((self.calendar_name, argname) + month)
1.41 + if prefix:
1.42 + return "%s-%s=%04d-%02d" % ((self.calendar_name, argname) + month)
1.43 + else:
1.44 + return "%s=%04d-%02d" % ((argname,) + month)
1.45 else:
1.46 return ""
1.47
1.48 + def getNavigationLink(self, start, end, mode=None):
1.49 + return "%s&%s&mode=%s" % (
1.50 + self.getMonthQueryString("start", start),
1.51 + self.getMonthQueryString("end", end),
1.52 + mode or self.mode
1.53 + )
1.54 +
1.55 + def writeDownloadControls(self):
1.56 + page = self.page
1.57 + request = page.request
1.58 + fmt = page.formatter
1.59 + _ = request.getText
1.60 +
1.61 + output = []
1.62 +
1.63 + # Generate the links.
1.64 +
1.65 + download_all_link = "action=EventAggregatorSummary&doit=1&%s" % self.category_name_parameters
1.66 + download_link = download_all_link + ("&%s&%s" % (
1.67 + self.getMonthQueryString("start", self.calendar_start, prefix=0),
1.68 + self.getMonthQueryString("end", self.calendar_end, prefix=0)
1.69 + ))
1.70 + subscribe_all_link = download_all_link + "&format=RSS"
1.71 + subscribe_link = download_link + "&format=RSS"
1.72 +
1.73 + # Write the controls.
1.74 +
1.75 + output.append(fmt.div(on=1, css_class="event-download-controls"))
1.76 + output.append(fmt.span(on=1, css_class="event-download"))
1.77 + output.append(linkToPage(request, page, _("Download this view"), download_link))
1.78 + output.append(fmt.span(on=0))
1.79 + output.append(fmt.span(on=1, css_class="event-download"))
1.80 + output.append(linkToPage(request, page, _("Download this calendar"), download_all_link))
1.81 + output.append(fmt.span(on=0))
1.82 + output.append(fmt.span(on=1, css_class="event-download"))
1.83 + output.append(linkToPage(request, page, _("Subscribe to this view"), subscribe_link))
1.84 + output.append(fmt.span(on=0))
1.85 + output.append(fmt.span(on=1, css_class="event-download"))
1.86 + output.append(linkToPage(request, page, _("Subscribe to this calendar"), subscribe_all_link))
1.87 + output.append(fmt.span(on=0))
1.88 + output.append(fmt.div(on=0))
1.89 +
1.90 + return "".join(output)
1.91 +
1.92 + def writeViewControls(self):
1.93 + page = self.page
1.94 + request = page.request
1.95 + fmt = page.formatter
1.96 + _ = request.getText
1.97 +
1.98 + output = []
1.99 +
1.100 + calendar_link = self.getNavigationLink(
1.101 + self.calendar_start, self.calendar_end, "calendar"
1.102 + )
1.103 + list_link = self.getNavigationLink(
1.104 + self.calendar_start, self.calendar_end, "list"
1.105 + )
1.106 + table_link = self.getNavigationLink(
1.107 + self.calendar_start, self.calendar_end, "table"
1.108 + )
1.109 +
1.110 + # Write the controls.
1.111 +
1.112 + output.append(fmt.div(on=1, css_class="event-view-controls"))
1.113 + output.append(fmt.span(on=1, css_class="event-view"))
1.114 + output.append(linkToPage(request, page, _("View as calendar"), calendar_link))
1.115 + output.append(fmt.span(on=0))
1.116 + output.append(fmt.span(on=1, css_class="event-view"))
1.117 + output.append(linkToPage(request, page, _("View as list"), list_link))
1.118 + output.append(fmt.span(on=0))
1.119 + output.append(fmt.span(on=1, css_class="event-view"))
1.120 + output.append(linkToPage(request, page, _("View as table"), table_link))
1.121 + output.append(fmt.span(on=0))
1.122 + output.append(fmt.div(on=0))
1.123 +
1.124 + return "".join(output)
1.125 +
1.126 def writeMonthHeading(self, year, month):
1.127 page = self.page
1.128 request = page.request
1.129 @@ -78,25 +171,21 @@
1.130 # Links to the previous set of months and to a calendar shifted
1.131 # back one month.
1.132
1.133 - previous_set_link = "%s&%s" % (
1.134 - self.getMonthQueryString("start", self.previous_set_start),
1.135 - self.getMonthQueryString("end", self.previous_set_end)
1.136 + previous_set_link = self.getNavigationLink(
1.137 + self.previous_set_start, self.previous_set_end
1.138 )
1.139 - previous_month_link = "%s&%s" % (
1.140 - self.getMonthQueryString("start", self.previous_month_start),
1.141 - self.getMonthQueryString("end", self.previous_month_end)
1.142 + previous_month_link = self.getNavigationLink(
1.143 + self.previous_month_start, self.previous_month_end
1.144 )
1.145
1.146 # Links to the next set of months and to a calendar shifted
1.147 # forward one month.
1.148
1.149 - next_set_link = "%s&%s" % (
1.150 - self.getMonthQueryString("start", self.next_set_start),
1.151 - self.getMonthQueryString("end", self.next_set_end)
1.152 + next_set_link = self.getNavigationLink(
1.153 + self.next_set_start, self.next_set_end
1.154 )
1.155 - next_month_link = "%s&%s" % (
1.156 - self.getMonthQueryString("start", self.next_month_start),
1.157 - self.getMonthQueryString("end", self.next_month_end)
1.158 + next_month_link = self.getNavigationLink(
1.159 + self.next_month_start, self.next_month_end
1.160 )
1.161
1.162 # A link leading to this month being at the top of the calendar.
1.163 @@ -104,9 +193,8 @@
1.164 full_month_label = "%s %s" % (month_label, year)
1.165 end_month = EventAggregatorSupport.monthupdate((year, month), self.number_of_months - 1)
1.166
1.167 - month_link = "%s&%s" % (
1.168 - self.getMonthQueryString("start", (year, month)),
1.169 - self.getMonthQueryString("end", end_month)
1.170 + month_link = self.getNavigationLink(
1.171 + (year, month), end_month
1.172 )
1.173
1.174 output.append(fmt.span(on=1, css_class="previous-month"))
1.175 @@ -134,6 +222,26 @@
1.176
1.177 return "".join(output)
1.178
1.179 + def writeDayNumberLinked(self, day, month, year):
1.180 + page = self.page
1.181 + request = page.request
1.182 + fmt = page.formatter
1.183 + _ = request.getText
1.184 +
1.185 + output = []
1.186 +
1.187 + new_event_link = "action=EventAggregatorNewEvent&start-day=%d&start-month=%d&start-year=%d" \
1.188 + "&%s&template=%s&parent=%s" % (
1.189 + day, month, year, self.category_name_parameters, self.template_name, self.parent_name or "")
1.190 +
1.191 + output.append(fmt.div(on=1))
1.192 + output.append(fmt.span(on=1, css_class="event-day-number"))
1.193 + output.append(linkToPage(request, page, unicode(day), new_event_link))
1.194 + output.append(fmt.span(on=0))
1.195 + output.append(fmt.div(on=0))
1.196 +
1.197 + return "".join(output)
1.198 +
1.199 # HTML-related functions.
1.200
1.201 def getColour(s):
1.202 @@ -152,12 +260,6 @@
1.203 else:
1.204 return (255, 255, 255)
1.205
1.206 -def getMonthActionQueryString(argname, month):
1.207 - if month is not None:
1.208 - return "%s=%04d-%02d" % ((argname,) + month)
1.209 - else:
1.210 - return ""
1.211 -
1.212 # Macro functions.
1.213
1.214 def execute(macro, args):
1.215 @@ -208,7 +310,7 @@
1.216 category_names = []
1.217 calendar_start = None
1.218 calendar_end = None
1.219 - mode = "calendar"
1.220 + mode = None
1.221 name_usage = "weekly"
1.222 calendar_name = None
1.223 template_name = getattr(request.cfg, "event_aggregator_new_event_template", "EventTemplate")
1.224 @@ -245,9 +347,7 @@
1.225 calendar_start = EventAggregatorSupport.getFormMonth(request, calendar_name, "start") or calendar_start
1.226 calendar_end = EventAggregatorSupport.getFormMonth(request, calendar_name, "end") or calendar_end
1.227
1.228 - # HTML link fragments.
1.229 -
1.230 - category_name_parameters = "&".join([("category=%s" % name) for name in category_names])
1.231 + mode = EventAggregatorSupport.getParameter(request, "mode", mode or "calendar")
1.232
1.233 # Get the events.
1.234
1.235 @@ -260,7 +360,7 @@
1.236
1.237 # Define a view of the calendar, retaining useful navigational information.
1.238
1.239 - view = View(page, calendar_name, first, last)
1.240 + view = View(page, calendar_name, calendar_start, calendar_end, first, last, category_names, template_name, parent_name, mode)
1.241
1.242 # Make a calendar.
1.243
1.244 @@ -268,27 +368,8 @@
1.245
1.246 # Output download controls.
1.247
1.248 - download_all_link = "action=EventAggregatorSummary&doit=1&%s" % category_name_parameters
1.249 - download_link = download_all_link + ("&%s&%s" % (
1.250 - getMonthActionQueryString("start", calendar_start),
1.251 - getMonthActionQueryString("end", calendar_end)
1.252 - ))
1.253 - subscribe_all_link = download_all_link + "&format=RSS"
1.254 - subscribe_link = download_link + "&format=RSS"
1.255 -
1.256 output.append(fmt.div(on=1, css_class="event-controls"))
1.257 - output.append(fmt.span(on=1, css_class="event-download"))
1.258 - output.append(linkToPage(request, page, _("Download this view"), download_link))
1.259 - output.append(fmt.span(on=0))
1.260 - output.append(fmt.span(on=1, css_class="event-download"))
1.261 - output.append(linkToPage(request, page, _("Download this calendar"), download_all_link))
1.262 - output.append(fmt.span(on=0))
1.263 - output.append(fmt.span(on=1, css_class="event-download"))
1.264 - output.append(linkToPage(request, page, _("Subscribe to this view"), subscribe_link))
1.265 - output.append(fmt.span(on=0))
1.266 - output.append(fmt.span(on=1, css_class="event-download"))
1.267 - output.append(linkToPage(request, page, _("Subscribe to this calendar"), subscribe_all_link))
1.268 - output.append(fmt.span(on=0))
1.269 + output.append(view.writeDownloadControls())
1.270 output.append(fmt.div(on=0))
1.271
1.272 # Output top-level information.
1.273 @@ -396,19 +477,10 @@
1.274 else:
1.275 output.append(fmt.table_cell(on=1, attrs={"class" : "event-day-heading event-day-empty", "colspan" : "3"}))
1.276
1.277 - # Make a link to a new event action.
1.278 -
1.279 - new_event_link = "action=EventAggregatorNewEvent&start-day=%d&start-month=%d&start-year=%d" \
1.280 - "&%s&template=%s&parent=%s" % (
1.281 - day, month, year, category_name_parameters, template_name, parent_name or "")
1.282 + # Output the day number, making a link to a new event
1.283 + # action.
1.284
1.285 - # Output the day number.
1.286 -
1.287 - output.append(fmt.div(on=1))
1.288 - output.append(fmt.span(on=1, css_class="event-day-number"))
1.289 - output.append(linkToPage(request, page, unicode(day), new_event_link))
1.290 - output.append(fmt.span(on=0))
1.291 - output.append(fmt.div(on=0))
1.292 + output.append(view.writeDayNumberLinked(day, month, year))
1.293
1.294 # End of day.
1.295
1.296 @@ -720,7 +792,7 @@
1.297 if event_details.has_key("topics") or event_details.has_key("categories"):
1.298 output.append(fmt.bullet_list(on=1, attr={"class" : "event-topics"}))
1.299
1.300 - for topic in event_details.get("topics") or event_details.get("categories"):
1.301 + for topic in event_details.get("topics") or event_details.get("categories") or []:
1.302 output.append(fmt.listitem(on=1))
1.303 output.append(fmt.text(topic))
1.304 output.append(fmt.listitem(on=0))
1.305 @@ -748,7 +820,7 @@
1.306
1.307 css_classes = ["event-table-details"]
1.308
1.309 - for topic in event_details.get("topics") or event_details.get("categories"):
1.310 + for topic in event_details.get("topics") or event_details.get("categories") or []:
1.311
1.312 # Filter the category text to avoid illegal characters.
1.313
1.314 @@ -802,6 +874,12 @@
1.315 elif mode == "table":
1.316 output.append(fmt.table(on=0))
1.317
1.318 + # Output view controls.
1.319 +
1.320 + output.append(fmt.div(on=1, css_class="event-controls"))
1.321 + output.append(view.writeViewControls())
1.322 + output.append(fmt.div(on=0))
1.323 +
1.324 return ''.join(output)
1.325
1.326 # vim: tabstop=4 expandtab shiftwidth=4