1.1 --- a/EventAggregatorSupport.py Thu Jul 08 02:17:12 2010 +0200
1.2 +++ b/EventAggregatorSupport.py Thu Jul 08 22:15:54 2010 +0200
1.3 @@ -121,11 +121,87 @@
1.4
1.5 class ActionSupport:
1.6
1.7 - "Work around disruptive MoinMoin changes in 1.9."
1.8 + """
1.9 + Work around disruptive MoinMoin changes in 1.9, and also provide useful
1.10 + convenience methods.
1.11 + """
1.12
1.13 def get_form(self):
1.14 return get_form(self.request)
1.15
1.16 + def _get_selected(self, value, input_value):
1.17 +
1.18 + """
1.19 + Return the HTML attribute text indicating selection of an option (or
1.20 + otherwise) if 'value' matches 'input_value'.
1.21 + """
1.22 +
1.23 + return input_value is not None and value == input_value and 'selected="selected"' or ''
1.24 +
1.25 + def _get_selected_for_list(self, value, input_values):
1.26 +
1.27 + """
1.28 + Return the HTML attribute text indicating selection of an option (or
1.29 + otherwise) if 'value' matches one of the 'input_values'.
1.30 + """
1.31 +
1.32 + return value in input_values and 'selected="selected"' or ''
1.33 +
1.34 + def _get_input(self, form, name, default=None):
1.35 +
1.36 + """
1.37 + Return the input from 'form' having the given 'name', returning either
1.38 + the input converted to an integer or the given 'default' (optional, None
1.39 + if not specified).
1.40 + """
1.41 +
1.42 + value = form.get(name, [None])[0]
1.43 + if not value: # true if 0 obtained
1.44 + return default
1.45 + else:
1.46 + return int(value)
1.47 +
1.48 + def get_month_lists(self):
1.49 +
1.50 + """
1.51 + Return two lists of HTML element definitions corresponding to the start
1.52 + and end month selection controls, with months selected according to any
1.53 + values that have been specified via request parameters.
1.54 + """
1.55 +
1.56 + _ = self._
1.57 + form = self.get_form()
1.58 +
1.59 + # Initialise month lists.
1.60 +
1.61 + start_month_list = []
1.62 + end_month_list = []
1.63 +
1.64 + start_month = self._get_input(form, "start-month", getCurrentMonth().month())
1.65 + end_month = self._get_input(form, "end-month", start_month)
1.66 +
1.67 + # Prepare month lists, selecting specified months.
1.68 +
1.69 + for month in range(1, 13):
1.70 + month_label = _(getMonthLabel(month))
1.71 + selected = self._get_selected(month, start_month)
1.72 + start_month_list.append('<option value="%02d" %s>%s</option>' % (month, selected, month_label))
1.73 + selected = self._get_selected(month, end_month)
1.74 + end_month_list.append('<option value="%02d" %s>%s</option>' % (month, selected, month_label))
1.75 +
1.76 + return start_month_list, end_month_list
1.77 +
1.78 + def get_year_defaults(self):
1.79 +
1.80 + "Return defaults for the start and end years."
1.81 +
1.82 + form = self.get_form()
1.83 +
1.84 + start_year_default = form.get("start-year", [""])[0] or getCurrentYear()
1.85 + end_year_default = form.get("end-year", [""])[0] or start_year_default
1.86 +
1.87 + return start_year_default, end_year_default
1.88 +
1.89 def get_form(request):
1.90
1.91 "Work around disruptive MoinMoin changes in 1.9."
2.1 --- a/actions/EventAggregatorNewEvent.py Thu Jul 08 02:17:12 2010 +0200
2.2 +++ b/actions/EventAggregatorNewEvent.py Thu Jul 08 22:15:54 2010 +0200
2.3 @@ -28,19 +28,6 @@
2.4
2.5 "An event creation dialogue requesting various parameters."
2.6
2.7 - def _get_selected(self, value, input_value):
2.8 - return input_value is not None and value == input_value and 'selected="selected"' or ''
2.9 -
2.10 - def _get_selected_for_list(self, value, input_values):
2.11 - return value in input_values and 'selected="selected"' or ''
2.12 -
2.13 - def _get_input(self, form, name, default=None):
2.14 - value = form.get(name, [None])[0]
2.15 - if not value: # true if 0 obtained
2.16 - return default
2.17 - else:
2.18 - return int(value)
2.19 -
2.20 def get_form_html(self, buttons_html):
2.21 _ = self._
2.22 request = self.request
2.23 @@ -95,20 +82,8 @@
2.24
2.25 # Initialise month lists.
2.26
2.27 - start_month_list = []
2.28 - end_month_list = []
2.29 -
2.30 - start_month = self._get_input(form, "start-month", EventAggregatorSupport.getCurrentMonth().month())
2.31 - end_month = self._get_input(form, "end-month", start_month)
2.32 -
2.33 - # Prepare month lists, selecting specified months.
2.34 -
2.35 - for month in range(1, 13):
2.36 - month_label = _(EventAggregatorSupport.getMonthLabel(month))
2.37 - selected = self._get_selected(month, start_month)
2.38 - start_month_list.append('<option value="%02d" %s>%s</option>' % (month, selected, month_label))
2.39 - selected = self._get_selected(month, end_month)
2.40 - end_month_list.append('<option value="%02d" %s>%s</option>' % (month, selected, month_label))
2.41 + start_month_list, end_month_list = self.get_month_lists()
2.42 + start_year_default, end_year_default = self.get_year_defaults()
2.43
2.44 # Initialise regime lists.
2.45
2.46 @@ -151,7 +126,7 @@
2.47
2.48 "start_label" : _("Start date (day, month, year)"),
2.49 "start_day_default" : form.get("start-day", [""])[0],
2.50 - "start_year_default" : form.get("start-year", [""])[0] or EventAggregatorSupport.getCurrentYear(),
2.51 + "start_year_default" : start_year_default,
2.52 "start_time_label" : _("Start time (hour, minute, second)"),
2.53 "start_hour_default" : form.get("start-hour", [""])[0],
2.54 "start_minute_default" : form.get("start-minute", [""])[0],
2.55 @@ -160,7 +135,7 @@
2.56
2.57 "end_label" : _("End date (day, month, year) - if different"),
2.58 "end_day_default" : form.get("end-day", [""])[0] or form.get("start-day", [""])[0],
2.59 - "end_year_default" : form.get("end-year", [""])[0] or form.get("start-year", [""])[0],
2.60 + "end_year_default" : end_year_default,
2.61 "end_time_label" : _("End time (hour, minute, second)"),
2.62 "end_hour_default" : form.get("end-hour", [""])[0],
2.63 "end_minute_default" : form.get("end-minute", [""])[0],
3.1 --- a/actions/EventAggregatorSummary.py Thu Jul 08 02:17:12 2010 +0200
3.2 +++ b/actions/EventAggregatorSummary.py Thu Jul 08 22:15:54 2010 +0200
3.3 @@ -32,40 +32,50 @@
3.4 form = self.get_form()
3.5
3.6 category_list = []
3.7 + category_pagenames = form.get("category", [])
3.8
3.9 for category_name, category_pagename in \
3.10 EventAggregatorSupport.getCategoryMapping(
3.11 EventAggregatorSupport.getCategories(request),
3.12 request):
3.13
3.14 - category_list.append('<option value="%s">%s</option>' % (category_pagename, category_name))
3.15 + selected = self._get_selected_for_list(category_pagename, category_pagenames)
3.16 +
3.17 + category_list.append('<option value="%s" %s>%s</option>' % (category_pagename, selected, category_name))
3.18 +
3.19 + # Initialise month lists.
3.20
3.21 - month_list = []
3.22 - month_list.append('<option value=""></option>')
3.23 + start_month_list, end_month_list = self.get_month_lists()
3.24 + start_year_default, end_year_default = self.get_year_defaults()
3.25
3.26 - for month in range(1, 13):
3.27 - month_label = _(EventAggregatorSupport.getMonthLabel(month))
3.28 - month_list.append('<option value="%02d">%s</option>' % (month, month_label))
3.29 + # Descriptions.
3.30 +
3.31 + descriptions = form.get("descriptions", [None])[0]
3.32
3.33 descriptions_list = [
3.34 - '<option value="%s">%s</option>' % ("page", _("page")),
3.35 - '<option value="%s">%s</option>' % ("comment", _("comment"))
3.36 + '<option value="%s" %s>%s</option>' % ("page", self._get_selected("page", descriptions), _("page")),
3.37 + '<option value="%s" %s>%s</option>' % ("comment", self._get_selected("comment", descriptions), _("comment"))
3.38 ]
3.39
3.40 + # Format.
3.41 +
3.42 + format = form.get("format", [None])[0]
3.43 +
3.44 format_list = [
3.45 - '<option value="%s">%s</option>' % ("iCalendar", _("iCalendar")),
3.46 - '<option value="%s">%s</option>' % ("RSS", _("RSS 2.0"))
3.47 + '<option value="%s" %s>%s</option>' % ("iCalendar", self._get_selected("iCalendar", format), _("iCalendar")),
3.48 + '<option value="%s" %s>%s</option>' % ("RSS", self._get_selected("RSS", format), _("RSS 2.0"))
3.49 ]
3.50
3.51 d = {
3.52 "buttons_html" : buttons_html,
3.53 "category_label" : _("Categories"),
3.54 "category_list" : "\n".join(category_list),
3.55 - "month_list" : "\n".join(month_list),
3.56 + "start_month_list" : "\n".join(start_month_list),
3.57 "start_label" : _("Start year and month"),
3.58 - "start_year_default" : "",
3.59 + "start_year_default" : start_year_default,
3.60 + "end_month_list" : "\n".join(end_month_list),
3.61 "end_label" : _("End year and month"),
3.62 - "end_year_default" : "",
3.63 + "end_year_default" : end_year_default,
3.64 "descriptions_label" : _("Use descriptions from..."),
3.65 "descriptions_list" : "\n".join(descriptions_list),
3.66 "format_label" : _("Summary format"),
3.67 @@ -88,7 +98,7 @@
3.68 <td class="label"><label>%(start_label)s</label></td>
3.69 <td>
3.70 <select name="start-month">
3.71 - %(month_list)s
3.72 + %(start_month_list)s
3.73 </select>
3.74 <input name="start-year" type="text" value="%(start_year_default)s" size="4" />
3.75 </td>
3.76 @@ -97,7 +107,7 @@
3.77 <td class="label"><label>%(end_label)s</label></td>
3.78 <td>
3.79 <select name="end-month">
3.80 - %(month_list)s
3.81 + %(end_month_list)s
3.82 </select>
3.83 <input name="end-year" type="text" value="%(end_year_default)s" size="4" />
3.84 </td>
4.1 --- a/css/event-aggregator.css Thu Jul 08 02:17:12 2010 +0200
4.2 +++ b/css/event-aggregator.css Thu Jul 08 22:15:54 2010 +0200
4.3 @@ -21,6 +21,22 @@
4.4
4.5 .event-download {
4.6 padding-right: 2em;
4.7 + position: relative;
4.8 +}
4.9 +
4.10 +.event-download-popup {
4.11 + display: none;
4.12 +}
4.13 +
4.14 +.event-download:hover .event-download-popup {
4.15 + display: block;
4.16 + position: absolute;
4.17 + top: 1.5em;
4.18 + left: 0;
4.19 + background-color: #fff;
4.20 + color: #000;
4.21 + padding: 0.5em;
4.22 + border: 1px solid #000;
4.23 }
4.24
4.25 .event-view-controls {
5.1 --- a/macros/EventAggregator.py Thu Jul 08 02:17:12 2010 +0200
5.2 +++ b/macros/EventAggregator.py Thu Jul 08 22:15:54 2010 +0200
5.3 @@ -93,13 +93,18 @@
5.4
5.5 # Generate the links.
5.6
5.7 - download_all_link = "action=EventAggregatorSummary&doit=1&parent=%s&%s" % (
5.8 + download_dialogue_link = "action=EventAggregatorSummary&parent=%s&%s" % (
5.9 self.parent_name or "", self.category_name_parameters
5.10 )
5.11 + download_all_link = download_dialogue_link + "&doit=1"
5.12 download_link = download_all_link + ("&%s&%s" % (
5.13 self.getMonthQueryString("start", self.calendar_start, prefix=0),
5.14 self.getMonthQueryString("end", self.calendar_end, prefix=0)
5.15 ))
5.16 +
5.17 + # Subscription links just explicitly select the RSS format.
5.18 +
5.19 + subscribe_dialogue_link = download_dialogue_link + "&format=RSS"
5.20 subscribe_all_link = download_all_link + "&format=RSS"
5.21 subscribe_link = download_link + "&format=RSS"
5.22
5.23 @@ -119,23 +124,54 @@
5.24
5.25 period_limits = "".join(period_limits)
5.26
5.27 + download_dialogue_link += period_limits
5.28 download_all_link += period_limits
5.29 + subscribe_dialogue_link += period_limits
5.30 subscribe_all_link += period_limits
5.31
5.32 + # Pop-up descriptions of the downloadable calendars.
5.33 +
5.34 + calendar_period = "%s - %s" % (self.calendar_start, self.calendar_end)
5.35 + raw_calendar_period = "%s - %s" % (self.raw_calendar_start, self.raw_calendar_end)
5.36 +
5.37 # Write the controls.
5.38
5.39 output.append(fmt.div(on=1, css_class="event-download-controls"))
5.40 output.append(fmt.span(on=1, css_class="event-download"))
5.41 output.append(linkToPage(request, page, _("Download this view"), download_link))
5.42 + output.append(fmt.span(on=1, css_class="event-download-popup"))
5.43 + output.append(fmt.text(calendar_period))
5.44 + output.append(fmt.span(on=0))
5.45 output.append(fmt.span(on=0))
5.46 output.append(fmt.span(on=1, css_class="event-download"))
5.47 output.append(linkToPage(request, page, _("Download this calendar"), download_all_link))
5.48 + output.append(fmt.span(on=1, css_class="event-download-popup"))
5.49 + output.append(fmt.text(raw_calendar_period))
5.50 + output.append(fmt.span(on=0))
5.51 + output.append(fmt.span(on=0))
5.52 + output.append(fmt.span(on=1, css_class="event-download"))
5.53 + output.append(linkToPage(request, page, _("Download..."), download_dialogue_link))
5.54 + output.append(fmt.span(on=1, css_class="event-download-popup"))
5.55 + output.append(fmt.text(_("Edit download options")))
5.56 + output.append(fmt.span(on=0))
5.57 output.append(fmt.span(on=0))
5.58 output.append(fmt.span(on=1, css_class="event-download"))
5.59 output.append(linkToPage(request, page, _("Subscribe to this view"), subscribe_link))
5.60 + output.append(fmt.span(on=1, css_class="event-download-popup"))
5.61 + output.append(fmt.text(calendar_period))
5.62 + output.append(fmt.span(on=0))
5.63 output.append(fmt.span(on=0))
5.64 output.append(fmt.span(on=1, css_class="event-download"))
5.65 output.append(linkToPage(request, page, _("Subscribe to this calendar"), subscribe_all_link))
5.66 + output.append(fmt.span(on=1, css_class="event-download-popup"))
5.67 + output.append(fmt.text(raw_calendar_period))
5.68 + output.append(fmt.span(on=0))
5.69 + output.append(fmt.span(on=0))
5.70 + output.append(fmt.span(on=1, css_class="event-download"))
5.71 + output.append(linkToPage(request, page, _("Subscribe..."), subscribe_dialogue_link))
5.72 + output.append(fmt.span(on=1, css_class="event-download-popup"))
5.73 + output.append(fmt.text(_("Edit subscription options")))
5.74 + output.append(fmt.span(on=0))
5.75 output.append(fmt.span(on=0))
5.76 output.append(fmt.div(on=0))
5.77