2.1 --- a/macros/EventAggregator.py Sat Oct 31 01:36:05 2009 +0100
2.2 +++ b/macros/EventAggregator.py Sat Nov 07 21:08:16 2009 +0100
2.3 @@ -27,15 +27,27 @@
2.4
2.5 "A view of the event calendar."
2.6
2.7 - def __init__(self, page, calendar_name, first, last):
2.8 + def __init__(self, page, calendar_name, calendar_start, calendar_end,
2.9 + first, last, category_names, template_name, parent_name, mode):
2.10
2.11 """
2.12 Initialise the view with the current 'page', a 'calendar_name' (which
2.13 - may be None), and the 'first' and 'last' months.
2.14 + may be None), the requested 'calendar_start' and 'calendar_end', and the
2.15 + 'first' and 'last' months of event coverage.
2.16 +
2.17 + The additional 'category_names', 'template_name', 'parent_name' and
2.18 + 'mode' parameters are used to configure the links employed by the view.
2.19 """
2.20
2.21 self.page = page
2.22 self.calendar_name = calendar_name
2.23 + self.calendar_start = calendar_start
2.24 + self.calendar_end = calendar_end
2.25 + self.template_name = template_name
2.26 + self.parent_name = parent_name
2.27 + self.mode = mode
2.28 +
2.29 + self.category_name_parameters = "&".join([("category=%s" % name) for name in category_names])
2.30
2.31 if self.calendar_name is not None:
2.32
2.33 @@ -54,12 +66,93 @@
2.34 self.previous_set_end = EventAggregatorSupport.monthupdate(last, -self.number_of_months)
2.35 self.next_set_end = EventAggregatorSupport.monthupdate(last, self.number_of_months)
2.36
2.37 - def getMonthQueryString(self, argname, month):
2.38 + def getMonthQueryString(self, argname, month, prefix=1):
2.39 if month is not None:
2.40 - return "%s-%s=%04d-%02d" % ((self.calendar_name, argname) + month)
2.41 + if prefix:
2.42 + return "%s-%s=%04d-%02d" % ((self.calendar_name, argname) + month)
2.43 + else:
2.44 + return "%s=%04d-%02d" % ((argname,) + month)
2.45 else:
2.46 return ""
2.47
2.48 + def getNavigationLink(self, start, end, mode=None):
2.49 + return "%s&%s&mode=%s" % (
2.50 + self.getMonthQueryString("start", start),
2.51 + self.getMonthQueryString("end", end),
2.52 + mode or self.mode
2.53 + )
2.54 +
2.55 + def writeDownloadControls(self):
2.56 + page = self.page
2.57 + request = page.request
2.58 + fmt = page.formatter
2.59 + _ = request.getText
2.60 +
2.61 + output = []
2.62 +
2.63 + # Generate the links.
2.64 +
2.65 + download_all_link = "action=EventAggregatorSummary&doit=1&%s" % self.category_name_parameters
2.66 + download_link = download_all_link + ("&%s&%s" % (
2.67 + self.getMonthQueryString("start", self.calendar_start, prefix=0),
2.68 + self.getMonthQueryString("end", self.calendar_end, prefix=0)
2.69 + ))
2.70 + subscribe_all_link = download_all_link + "&format=RSS"
2.71 + subscribe_link = download_link + "&format=RSS"
2.72 +
2.73 + # Write the controls.
2.74 +
2.75 + output.append(fmt.div(on=1, css_class="event-download-controls"))
2.76 + output.append(fmt.span(on=1, css_class="event-download"))
2.77 + output.append(linkToPage(request, page, _("Download this view"), download_link))
2.78 + output.append(fmt.span(on=0))
2.79 + output.append(fmt.span(on=1, css_class="event-download"))
2.80 + output.append(linkToPage(request, page, _("Download this calendar"), download_all_link))
2.81 + output.append(fmt.span(on=0))
2.82 + output.append(fmt.span(on=1, css_class="event-download"))
2.83 + output.append(linkToPage(request, page, _("Subscribe to this view"), subscribe_link))
2.84 + output.append(fmt.span(on=0))
2.85 + output.append(fmt.span(on=1, css_class="event-download"))
2.86 + output.append(linkToPage(request, page, _("Subscribe to this calendar"), subscribe_all_link))
2.87 + output.append(fmt.span(on=0))
2.88 + output.append(fmt.div(on=0))
2.89 +
2.90 + return "".join(output)
2.91 +
2.92 + def writeViewControls(self):
2.93 + page = self.page
2.94 + request = page.request
2.95 + fmt = page.formatter
2.96 + _ = request.getText
2.97 +
2.98 + output = []
2.99 +
2.100 + calendar_link = self.getNavigationLink(
2.101 + self.calendar_start, self.calendar_end, "calendar"
2.102 + )
2.103 + list_link = self.getNavigationLink(
2.104 + self.calendar_start, self.calendar_end, "list"
2.105 + )
2.106 + table_link = self.getNavigationLink(
2.107 + self.calendar_start, self.calendar_end, "table"
2.108 + )
2.109 +
2.110 + # Write the controls.
2.111 +
2.112 + output.append(fmt.div(on=1, css_class="event-view-controls"))
2.113 + output.append(fmt.span(on=1, css_class="event-view"))
2.114 + output.append(linkToPage(request, page, _("View as calendar"), calendar_link))
2.115 + output.append(fmt.span(on=0))
2.116 + output.append(fmt.span(on=1, css_class="event-view"))
2.117 + output.append(linkToPage(request, page, _("View as list"), list_link))
2.118 + output.append(fmt.span(on=0))
2.119 + output.append(fmt.span(on=1, css_class="event-view"))
2.120 + output.append(linkToPage(request, page, _("View as table"), table_link))
2.121 + output.append(fmt.span(on=0))
2.122 + output.append(fmt.div(on=0))
2.123 +
2.124 + return "".join(output)
2.125 +
2.126 def writeMonthHeading(self, year, month):
2.127 page = self.page
2.128 request = page.request
2.129 @@ -78,25 +171,21 @@
2.130 # Links to the previous set of months and to a calendar shifted
2.131 # back one month.
2.132
2.133 - previous_set_link = "%s&%s" % (
2.134 - self.getMonthQueryString("start", self.previous_set_start),
2.135 - self.getMonthQueryString("end", self.previous_set_end)
2.136 + previous_set_link = self.getNavigationLink(
2.137 + self.previous_set_start, self.previous_set_end
2.138 )
2.139 - previous_month_link = "%s&%s" % (
2.140 - self.getMonthQueryString("start", self.previous_month_start),
2.141 - self.getMonthQueryString("end", self.previous_month_end)
2.142 + previous_month_link = self.getNavigationLink(
2.143 + self.previous_month_start, self.previous_month_end
2.144 )
2.145
2.146 # Links to the next set of months and to a calendar shifted
2.147 # forward one month.
2.148
2.149 - next_set_link = "%s&%s" % (
2.150 - self.getMonthQueryString("start", self.next_set_start),
2.151 - self.getMonthQueryString("end", self.next_set_end)
2.152 + next_set_link = self.getNavigationLink(
2.153 + self.next_set_start, self.next_set_end
2.154 )
2.155 - next_month_link = "%s&%s" % (
2.156 - self.getMonthQueryString("start", self.next_month_start),
2.157 - self.getMonthQueryString("end", self.next_month_end)
2.158 + next_month_link = self.getNavigationLink(
2.159 + self.next_month_start, self.next_month_end
2.160 )
2.161
2.162 # A link leading to this month being at the top of the calendar.
2.163 @@ -104,9 +193,8 @@
2.164 full_month_label = "%s %s" % (month_label, year)
2.165 end_month = EventAggregatorSupport.monthupdate((year, month), self.number_of_months - 1)
2.166
2.167 - month_link = "%s&%s" % (
2.168 - self.getMonthQueryString("start", (year, month)),
2.169 - self.getMonthQueryString("end", end_month)
2.170 + month_link = self.getNavigationLink(
2.171 + (year, month), end_month
2.172 )
2.173
2.174 output.append(fmt.span(on=1, css_class="previous-month"))
2.175 @@ -134,6 +222,26 @@
2.176
2.177 return "".join(output)
2.178
2.179 + def writeDayNumberLinked(self, day, month, year):
2.180 + page = self.page
2.181 + request = page.request
2.182 + fmt = page.formatter
2.183 + _ = request.getText
2.184 +
2.185 + output = []
2.186 +
2.187 + new_event_link = "action=EventAggregatorNewEvent&start-day=%d&start-month=%d&start-year=%d" \
2.188 + "&%s&template=%s&parent=%s" % (
2.189 + day, month, year, self.category_name_parameters, self.template_name, self.parent_name or "")
2.190 +
2.191 + output.append(fmt.div(on=1))
2.192 + output.append(fmt.span(on=1, css_class="event-day-number"))
2.193 + output.append(linkToPage(request, page, unicode(day), new_event_link))
2.194 + output.append(fmt.span(on=0))
2.195 + output.append(fmt.div(on=0))
2.196 +
2.197 + return "".join(output)
2.198 +
2.199 # HTML-related functions.
2.200
2.201 def getColour(s):
2.202 @@ -152,12 +260,6 @@
2.203 else:
2.204 return (255, 255, 255)
2.205
2.206 -def getMonthActionQueryString(argname, month):
2.207 - if month is not None:
2.208 - return "%s=%04d-%02d" % ((argname,) + month)
2.209 - else:
2.210 - return ""
2.211 -
2.212 # Macro functions.
2.213
2.214 def execute(macro, args):
2.215 @@ -208,7 +310,7 @@
2.216 category_names = []
2.217 calendar_start = None
2.218 calendar_end = None
2.219 - mode = "calendar"
2.220 + mode = None
2.221 name_usage = "weekly"
2.222 calendar_name = None
2.223 template_name = getattr(request.cfg, "event_aggregator_new_event_template", "EventTemplate")
2.224 @@ -245,9 +347,7 @@
2.225 calendar_start = EventAggregatorSupport.getFormMonth(request, calendar_name, "start") or calendar_start
2.226 calendar_end = EventAggregatorSupport.getFormMonth(request, calendar_name, "end") or calendar_end
2.227
2.228 - # HTML link fragments.
2.229 -
2.230 - category_name_parameters = "&".join([("category=%s" % name) for name in category_names])
2.231 + mode = EventAggregatorSupport.getParameter(request, "mode", mode or "calendar")
2.232
2.233 # Get the events.
2.234
2.235 @@ -260,7 +360,7 @@
2.236
2.237 # Define a view of the calendar, retaining useful navigational information.
2.238
2.239 - view = View(page, calendar_name, first, last)
2.240 + view = View(page, calendar_name, calendar_start, calendar_end, first, last, category_names, template_name, parent_name, mode)
2.241
2.242 # Make a calendar.
2.243
2.244 @@ -268,27 +368,8 @@
2.245
2.246 # Output download controls.
2.247
2.248 - download_all_link = "action=EventAggregatorSummary&doit=1&%s" % category_name_parameters
2.249 - download_link = download_all_link + ("&%s&%s" % (
2.250 - getMonthActionQueryString("start", calendar_start),
2.251 - getMonthActionQueryString("end", calendar_end)
2.252 - ))
2.253 - subscribe_all_link = download_all_link + "&format=RSS"
2.254 - subscribe_link = download_link + "&format=RSS"
2.255 -
2.256 output.append(fmt.div(on=1, css_class="event-controls"))
2.257 - output.append(fmt.span(on=1, css_class="event-download"))
2.258 - output.append(linkToPage(request, page, _("Download this view"), download_link))
2.259 - output.append(fmt.span(on=0))
2.260 - output.append(fmt.span(on=1, css_class="event-download"))
2.261 - output.append(linkToPage(request, page, _("Download this calendar"), download_all_link))
2.262 - output.append(fmt.span(on=0))
2.263 - output.append(fmt.span(on=1, css_class="event-download"))
2.264 - output.append(linkToPage(request, page, _("Subscribe to this view"), subscribe_link))
2.265 - output.append(fmt.span(on=0))
2.266 - output.append(fmt.span(on=1, css_class="event-download"))
2.267 - output.append(linkToPage(request, page, _("Subscribe to this calendar"), subscribe_all_link))
2.268 - output.append(fmt.span(on=0))
2.269 + output.append(view.writeDownloadControls())
2.270 output.append(fmt.div(on=0))
2.271
2.272 # Output top-level information.
2.273 @@ -396,19 +477,10 @@
2.274 else:
2.275 output.append(fmt.table_cell(on=1, attrs={"class" : "event-day-heading event-day-empty", "colspan" : "3"}))
2.276
2.277 - # Make a link to a new event action.
2.278 -
2.279 - new_event_link = "action=EventAggregatorNewEvent&start-day=%d&start-month=%d&start-year=%d" \
2.280 - "&%s&template=%s&parent=%s" % (
2.281 - day, month, year, category_name_parameters, template_name, parent_name or "")
2.282 + # Output the day number, making a link to a new event
2.283 + # action.
2.284
2.285 - # Output the day number.
2.286 -
2.287 - output.append(fmt.div(on=1))
2.288 - output.append(fmt.span(on=1, css_class="event-day-number"))
2.289 - output.append(linkToPage(request, page, unicode(day), new_event_link))
2.290 - output.append(fmt.span(on=0))
2.291 - output.append(fmt.div(on=0))
2.292 + output.append(view.writeDayNumberLinked(day, month, year))
2.293
2.294 # End of day.
2.295
2.296 @@ -720,7 +792,7 @@
2.297 if event_details.has_key("topics") or event_details.has_key("categories"):
2.298 output.append(fmt.bullet_list(on=1, attr={"class" : "event-topics"}))
2.299
2.300 - for topic in event_details.get("topics") or event_details.get("categories"):
2.301 + for topic in event_details.get("topics") or event_details.get("categories") or []:
2.302 output.append(fmt.listitem(on=1))
2.303 output.append(fmt.text(topic))
2.304 output.append(fmt.listitem(on=0))
2.305 @@ -748,7 +820,7 @@
2.306
2.307 css_classes = ["event-table-details"]
2.308
2.309 - for topic in event_details.get("topics") or event_details.get("categories"):
2.310 + for topic in event_details.get("topics") or event_details.get("categories") or []:
2.311
2.312 # Filter the category text to avoid illegal characters.
2.313
2.314 @@ -802,6 +874,12 @@
2.315 elif mode == "table":
2.316 output.append(fmt.table(on=0))
2.317
2.318 + # Output view controls.
2.319 +
2.320 + output.append(fmt.div(on=1, css_class="event-controls"))
2.321 + output.append(view.writeViewControls())
2.322 + output.append(fmt.div(on=0))
2.323 +
2.324 return ''.join(output)
2.325
2.326 # vim: tabstop=4 expandtab shiftwidth=4