1.1 --- a/macros/EventAggregator.py Sat Apr 04 21:08:02 2009 +0200
1.2 +++ b/macros/EventAggregator.py Sat Apr 04 23:27:16 2009 +0200
1.3 @@ -21,6 +21,119 @@
1.4
1.5 Dependencies = ['pages']
1.6
1.7 +# Abstractions.
1.8 +
1.9 +class View:
1.10 +
1.11 + "A view of the event calendar."
1.12 +
1.13 + def __init__(self, page, calendar_name, first, last):
1.14 +
1.15 + """
1.16 + Initialise the view with the current 'page', a 'calendar_name' (which
1.17 + may be None), and the 'first' and 'last' months.
1.18 + """
1.19 +
1.20 + self.page = page
1.21 + self.calendar_name = calendar_name
1.22 +
1.23 + if self.calendar_name is not None:
1.24 +
1.25 + # Store the view parameters.
1.26 +
1.27 + span = EventAggregatorSupport.span(first, last)
1.28 + self.number_of_months = span[0] * 12 + span[1] + 1
1.29 +
1.30 + self.previous_month_start = EventAggregatorSupport.prevmonth(first)
1.31 + self.next_month_start = EventAggregatorSupport.nextmonth(first)
1.32 + self.previous_month_end = EventAggregatorSupport.prevmonth(last)
1.33 + self.next_month_end = EventAggregatorSupport.nextmonth(last)
1.34 +
1.35 + self.previous_set_start = EventAggregatorSupport.monthupdate(first, -self.number_of_months)
1.36 + self.next_set_start = EventAggregatorSupport.monthupdate(first, self.number_of_months)
1.37 + self.previous_set_end = EventAggregatorSupport.monthupdate(last, -self.number_of_months)
1.38 + self.next_set_end = EventAggregatorSupport.monthupdate(last, self.number_of_months)
1.39 +
1.40 + def getMonthQueryString(self, argname, month):
1.41 + if month is not None:
1.42 + return "%s-%s=%04d-%02d" % ((self.calendar_name, argname) + month)
1.43 + else:
1.44 + return ""
1.45 +
1.46 + def writeMonthHeading(self, year, month):
1.47 + page = self.page
1.48 + request = page.request
1.49 + fmt = page.formatter
1.50 + _ = request.getText
1.51 +
1.52 + output = []
1.53 +
1.54 + month_label = _(EventAggregatorSupport.getMonthLabel(month))
1.55 +
1.56 + # Prepare navigation links.
1.57 +
1.58 + if self.calendar_name is not None:
1.59 + calendar_name = self.calendar_name
1.60 +
1.61 + # Links to the previous set of months and to a calendar shifted
1.62 + # back one month.
1.63 +
1.64 + previous_set_link = "%s&%s" % (
1.65 + self.getMonthQueryString("start", self.previous_set_start),
1.66 + self.getMonthQueryString("end", self.previous_set_end)
1.67 + )
1.68 + previous_month_link = "%s&%s" % (
1.69 + self.getMonthQueryString("start", self.previous_month_start),
1.70 + self.getMonthQueryString("end", self.previous_month_end)
1.71 + )
1.72 +
1.73 + # Links to the next set of months and to a calendar shifted
1.74 + # forward one month.
1.75 +
1.76 + next_set_link = "%s&%s" % (
1.77 + self.getMonthQueryString("start", self.next_set_start),
1.78 + self.getMonthQueryString("end", self.next_set_end)
1.79 + )
1.80 + next_month_link = "%s&%s" % (
1.81 + self.getMonthQueryString("start", self.next_month_start),
1.82 + self.getMonthQueryString("end", self.next_month_end)
1.83 + )
1.84 +
1.85 + # A link leading to this month being at the top of the calendar.
1.86 +
1.87 + full_month_label = "%s %s" % (month_label, year)
1.88 + end_month = EventAggregatorSupport.monthupdate((year, month), self.number_of_months - 1)
1.89 +
1.90 + month_link = "%s&%s" % (
1.91 + self.getMonthQueryString("start", (year, month)),
1.92 + self.getMonthQueryString("end", end_month)
1.93 + )
1.94 +
1.95 + output.append(fmt.span(on=1, css_class="previous-month"))
1.96 + output.append(linkToPage(request, page, "<<", previous_set_link))
1.97 + output.append(fmt.text(" "))
1.98 + output.append(linkToPage(request, page, "<", previous_month_link))
1.99 + output.append(fmt.span(on=0))
1.100 +
1.101 + output.append(fmt.span(on=1, css_class="next-month"))
1.102 + output.append(linkToPage(request, page, ">", next_month_link))
1.103 + output.append(fmt.text(" "))
1.104 + output.append(linkToPage(request, page, ">>", next_set_link))
1.105 + output.append(fmt.span(on=0))
1.106 +
1.107 + output.append(linkToPage(request, page, full_month_label, month_link))
1.108 +
1.109 + else:
1.110 + output.append(fmt.span(on=1))
1.111 + output.append(fmt.text(month_label))
1.112 + output.append(fmt.span(on=0))
1.113 + output.append(fmt.text(" "))
1.114 + output.append(fmt.span(on=1))
1.115 + output.append(fmt.text(unicode(year)))
1.116 + output.append(fmt.span(on=0))
1.117 +
1.118 + return "".join(output)
1.119 +
1.120 # HTML-related functions.
1.121
1.122 def getColour(s):
1.123 @@ -45,12 +158,6 @@
1.124 else:
1.125 return ""
1.126
1.127 -def getMonthQueryString(calendar_name, argname, month):
1.128 - if month is not None:
1.129 - return "%s-%s=%04d-%02d" % ((calendar_name, argname) + month)
1.130 - else:
1.131 - return ""
1.132 -
1.133 # Macro functions.
1.134
1.135 def execute(macro, args):
1.136 @@ -133,21 +240,9 @@
1.137
1.138 first, last = EventAggregatorSupport.getConcretePeriod(calendar_start, calendar_end, earliest, latest)
1.139
1.140 - # Define some useful navigation months.
1.141 -
1.142 - if calendar_name is not None:
1.143 - span = EventAggregatorSupport.span(first, last)
1.144 - number_of_months = span[0] * 12 + span[1] + 1
1.145 + # Define a view of the calendar, retaining useful navigational information.
1.146
1.147 - previous_month_start = EventAggregatorSupport.prevmonth(first)
1.148 - next_month_start = EventAggregatorSupport.nextmonth(first)
1.149 - previous_month_end = EventAggregatorSupport.prevmonth(last)
1.150 - next_month_end = EventAggregatorSupport.nextmonth(last)
1.151 -
1.152 - previous_set_start = EventAggregatorSupport.monthupdate(first, -number_of_months)
1.153 - next_set_start = EventAggregatorSupport.monthupdate(first, number_of_months)
1.154 - previous_set_end = EventAggregatorSupport.monthupdate(last, -number_of_months)
1.155 - next_set_end = EventAggregatorSupport.monthupdate(last, number_of_months)
1.156 + view = View(page, calendar_name, first, last)
1.157
1.158 # Make a calendar.
1.159
1.160 @@ -200,68 +295,10 @@
1.161 output.append(fmt.table_row(on=1))
1.162 output.append(fmt.table_cell(on=1, attrs={"class" : "event-month-heading", "colspan" : "21"}))
1.163
1.164 - # Either write a month heading or produce a link for navigable
1.165 + # Either write a month heading or produce links for navigable
1.166 # calendars.
1.167
1.168 - month_label = _(EventAggregatorSupport.getMonthLabel(month))
1.169 -
1.170 - if calendar_name is not None:
1.171 -
1.172 - # Links to the previous set of months and to a calendar shifted
1.173 - # back one month.
1.174 -
1.175 - previous_set_link = "%s&%s" % (
1.176 - getMonthQueryString(calendar_name, "start", previous_set_start),
1.177 - getMonthQueryString(calendar_name, "end", previous_set_end)
1.178 - )
1.179 - previous_month_link = "%s&%s" % (
1.180 - getMonthQueryString(calendar_name, "start", previous_month_start),
1.181 - getMonthQueryString(calendar_name, "end", previous_month_end)
1.182 - )
1.183 -
1.184 - output.append(fmt.span(on=1, css_class="previous-month"))
1.185 - output.append(linkToPage(request, page, "<<", previous_set_link))
1.186 - output.append(fmt.text(" "))
1.187 - output.append(linkToPage(request, page, "<", previous_month_link))
1.188 - output.append(fmt.span(on=0))
1.189 -
1.190 - # Links to the next set of months and to a calendar shifted
1.191 - # forward one month.
1.192 -
1.193 - next_set_link = "%s&%s" % (
1.194 - getMonthQueryString(calendar_name, "start", next_set_start),
1.195 - getMonthQueryString(calendar_name, "end", next_set_end)
1.196 - )
1.197 - next_month_link = "%s&%s" % (
1.198 - getMonthQueryString(calendar_name, "start", next_month_start),
1.199 - getMonthQueryString(calendar_name, "end", next_month_end)
1.200 - )
1.201 -
1.202 - output.append(fmt.span(on=1, css_class="next-month"))
1.203 - output.append(linkToPage(request, page, ">", next_month_link))
1.204 - output.append(fmt.text(" "))
1.205 - output.append(linkToPage(request, page, ">>", next_set_link))
1.206 - output.append(fmt.span(on=0))
1.207 -
1.208 - # A link leading to this month being at the top of the calendar.
1.209 -
1.210 - full_month_label = "%s %s" % (month_label, year)
1.211 - end_month = EventAggregatorSupport.monthupdate((year, month), number_of_months - 1)
1.212 -
1.213 - month_link = "%s&%s" % (
1.214 - getMonthQueryString(calendar_name, "start", (year, month)),
1.215 - getMonthQueryString(calendar_name, "end", end_month)
1.216 - )
1.217 - output.append(linkToPage(request, page, full_month_label, month_link))
1.218 -
1.219 - else:
1.220 - output.append(fmt.span(on=1))
1.221 - output.append(fmt.text(month_label))
1.222 - output.append(fmt.span(on=0))
1.223 - output.append(fmt.text(" "))
1.224 - output.append(fmt.span(on=1))
1.225 - output.append(fmt.text(unicode(year)))
1.226 - output.append(fmt.span(on=0))
1.227 + output.append(view.writeMonthHeading(year, month))
1.228
1.229 output.append(fmt.table_cell(on=0))
1.230 output.append(fmt.table_row(on=0))
1.231 @@ -582,24 +619,23 @@
1.232
1.233 elif mode == "list":
1.234
1.235 - month_label = _(EventAggregatorSupport.getMonthLabel(month))
1.236 + # Output a list.
1.237
1.238 output.append(fmt.listitem(on=1, attr={"class" : "event-listings-month"}))
1.239 output.append(fmt.div(on=1, attr={"class" : "event-listings-month-heading"}))
1.240 - output.append(fmt.span(on=1))
1.241 - output.append(fmt.text(month_label))
1.242 - output.append(fmt.span(on=0))
1.243 - output.append(fmt.text(" "))
1.244 - output.append(fmt.span(on=1))
1.245 - output.append(fmt.text(unicode(year)))
1.246 - output.append(fmt.span(on=0))
1.247 +
1.248 + # Either write a month heading or produce links for navigable
1.249 + # calendars.
1.250 +
1.251 + output.append(view.writeMonthHeading(year, month))
1.252 +
1.253 output.append(fmt.div(on=0))
1.254
1.255 output.append(fmt.bullet_list(on=1, attr={"class" : "event-month-listings"}))
1.256
1.257 # Get the events in order.
1.258
1.259 - ordered_events = EventAggregatorSummary.getOrderedEvents(shown_events.get((year, month), []))
1.260 + ordered_events = EventAggregatorSupport.getOrderedEvents(shown_events.get((year, month), []))
1.261
1.262 # Show the events in order.
1.263