# HG changeset patch # User Paul Boddie # Date 1278620154 -7200 # Node ID 7904fcbc9dab2f260718df123773193ebb987df1 # Parent 0cdb1291501e45fee42802a99b2bf17623a02d04 Added pop-up elements to the download/subscription controls to show the output criteria of a downloaded file or a subscription. Added download/subscription links to the macro output that open the summary action form when followed. Added support for displaying input parameter values in the summary action form, thus supporting the new links produced by the macro. Moved various action methods into the ActionSupport class in the library. Added some convenience methods to the ActionSupport class that need to be shared by both actions. diff -r 0cdb1291501e -r 7904fcbc9dab EventAggregatorSupport.py --- a/EventAggregatorSupport.py Thu Jul 08 02:17:12 2010 +0200 +++ b/EventAggregatorSupport.py Thu Jul 08 22:15:54 2010 +0200 @@ -121,11 +121,87 @@ class ActionSupport: - "Work around disruptive MoinMoin changes in 1.9." + """ + Work around disruptive MoinMoin changes in 1.9, and also provide useful + convenience methods. + """ def get_form(self): return get_form(self.request) + def _get_selected(self, value, input_value): + + """ + Return the HTML attribute text indicating selection of an option (or + otherwise) if 'value' matches 'input_value'. + """ + + return input_value is not None and value == input_value and 'selected="selected"' or '' + + def _get_selected_for_list(self, value, input_values): + + """ + Return the HTML attribute text indicating selection of an option (or + otherwise) if 'value' matches one of the 'input_values'. + """ + + return value in input_values and 'selected="selected"' or '' + + def _get_input(self, form, name, default=None): + + """ + Return the input from 'form' having the given 'name', returning either + the input converted to an integer or the given 'default' (optional, None + if not specified). + """ + + value = form.get(name, [None])[0] + if not value: # true if 0 obtained + return default + else: + return int(value) + + def get_month_lists(self): + + """ + Return two lists of HTML element definitions corresponding to the start + and end month selection controls, with months selected according to any + values that have been specified via request parameters. + """ + + _ = self._ + form = self.get_form() + + # Initialise month lists. + + start_month_list = [] + end_month_list = [] + + start_month = self._get_input(form, "start-month", getCurrentMonth().month()) + end_month = self._get_input(form, "end-month", start_month) + + # Prepare month lists, selecting specified months. + + for month in range(1, 13): + month_label = _(getMonthLabel(month)) + selected = self._get_selected(month, start_month) + start_month_list.append('' % (month, selected, month_label)) + selected = self._get_selected(month, end_month) + end_month_list.append('' % (month, selected, month_label)) + + return start_month_list, end_month_list + + def get_year_defaults(self): + + "Return defaults for the start and end years." + + form = self.get_form() + + start_year_default = form.get("start-year", [""])[0] or getCurrentYear() + end_year_default = form.get("end-year", [""])[0] or start_year_default + + return start_year_default, end_year_default + def get_form(request): "Work around disruptive MoinMoin changes in 1.9." diff -r 0cdb1291501e -r 7904fcbc9dab actions/EventAggregatorNewEvent.py --- a/actions/EventAggregatorNewEvent.py Thu Jul 08 02:17:12 2010 +0200 +++ b/actions/EventAggregatorNewEvent.py Thu Jul 08 22:15:54 2010 +0200 @@ -28,19 +28,6 @@ "An event creation dialogue requesting various parameters." - def _get_selected(self, value, input_value): - return input_value is not None and value == input_value and 'selected="selected"' or '' - - def _get_selected_for_list(self, value, input_values): - return value in input_values and 'selected="selected"' or '' - - def _get_input(self, form, name, default=None): - value = form.get(name, [None])[0] - if not value: # true if 0 obtained - return default - else: - return int(value) - def get_form_html(self, buttons_html): _ = self._ request = self.request @@ -95,20 +82,8 @@ # Initialise month lists. - start_month_list = [] - end_month_list = [] - - start_month = self._get_input(form, "start-month", EventAggregatorSupport.getCurrentMonth().month()) - end_month = self._get_input(form, "end-month", start_month) - - # Prepare month lists, selecting specified months. - - for month in range(1, 13): - month_label = _(EventAggregatorSupport.getMonthLabel(month)) - selected = self._get_selected(month, start_month) - start_month_list.append('' % (month, selected, month_label)) - selected = self._get_selected(month, end_month) - end_month_list.append('' % (month, selected, month_label)) + start_month_list, end_month_list = self.get_month_lists() + start_year_default, end_year_default = self.get_year_defaults() # Initialise regime lists. @@ -151,7 +126,7 @@ "start_label" : _("Start date (day, month, year)"), "start_day_default" : form.get("start-day", [""])[0], - "start_year_default" : form.get("start-year", [""])[0] or EventAggregatorSupport.getCurrentYear(), + "start_year_default" : start_year_default, "start_time_label" : _("Start time (hour, minute, second)"), "start_hour_default" : form.get("start-hour", [""])[0], "start_minute_default" : form.get("start-minute", [""])[0], @@ -160,7 +135,7 @@ "end_label" : _("End date (day, month, year) - if different"), "end_day_default" : form.get("end-day", [""])[0] or form.get("start-day", [""])[0], - "end_year_default" : form.get("end-year", [""])[0] or form.get("start-year", [""])[0], + "end_year_default" : end_year_default, "end_time_label" : _("End time (hour, minute, second)"), "end_hour_default" : form.get("end-hour", [""])[0], "end_minute_default" : form.get("end-minute", [""])[0], diff -r 0cdb1291501e -r 7904fcbc9dab actions/EventAggregatorSummary.py --- a/actions/EventAggregatorSummary.py Thu Jul 08 02:17:12 2010 +0200 +++ b/actions/EventAggregatorSummary.py Thu Jul 08 22:15:54 2010 +0200 @@ -32,40 +32,50 @@ form = self.get_form() category_list = [] + category_pagenames = form.get("category", []) for category_name, category_pagename in \ EventAggregatorSupport.getCategoryMapping( EventAggregatorSupport.getCategories(request), request): - category_list.append('' % (category_pagename, category_name)) + selected = self._get_selected_for_list(category_pagename, category_pagenames) + + category_list.append('' % (category_pagename, selected, category_name)) + + # Initialise month lists. - month_list = [] - month_list.append('') + start_month_list, end_month_list = self.get_month_lists() + start_year_default, end_year_default = self.get_year_defaults() - for month in range(1, 13): - month_label = _(EventAggregatorSupport.getMonthLabel(month)) - month_list.append('' % (month, month_label)) + # Descriptions. + + descriptions = form.get("descriptions", [None])[0] descriptions_list = [ - '' % ("page", _("page")), - '' % ("comment", _("comment")) + '' % ("page", self._get_selected("page", descriptions), _("page")), + '' % ("comment", self._get_selected("comment", descriptions), _("comment")) ] + # Format. + + format = form.get("format", [None])[0] + format_list = [ - '' % ("iCalendar", _("iCalendar")), - '' % ("RSS", _("RSS 2.0")) + '' % ("iCalendar", self._get_selected("iCalendar", format), _("iCalendar")), + '' % ("RSS", self._get_selected("RSS", format), _("RSS 2.0")) ] d = { "buttons_html" : buttons_html, "category_label" : _("Categories"), "category_list" : "\n".join(category_list), - "month_list" : "\n".join(month_list), + "start_month_list" : "\n".join(start_month_list), "start_label" : _("Start year and month"), - "start_year_default" : "", + "start_year_default" : start_year_default, + "end_month_list" : "\n".join(end_month_list), "end_label" : _("End year and month"), - "end_year_default" : "", + "end_year_default" : end_year_default, "descriptions_label" : _("Use descriptions from..."), "descriptions_list" : "\n".join(descriptions_list), "format_label" : _("Summary format"), @@ -88,7 +98,7 @@ @@ -97,7 +107,7 @@ diff -r 0cdb1291501e -r 7904fcbc9dab css/event-aggregator.css --- a/css/event-aggregator.css Thu Jul 08 02:17:12 2010 +0200 +++ b/css/event-aggregator.css Thu Jul 08 22:15:54 2010 +0200 @@ -21,6 +21,22 @@ .event-download { padding-right: 2em; + position: relative; +} + +.event-download-popup { + display: none; +} + +.event-download:hover .event-download-popup { + display: block; + position: absolute; + top: 1.5em; + left: 0; + background-color: #fff; + color: #000; + padding: 0.5em; + border: 1px solid #000; } .event-view-controls { diff -r 0cdb1291501e -r 7904fcbc9dab macros/EventAggregator.py --- a/macros/EventAggregator.py Thu Jul 08 02:17:12 2010 +0200 +++ b/macros/EventAggregator.py Thu Jul 08 22:15:54 2010 +0200 @@ -93,13 +93,18 @@ # Generate the links. - download_all_link = "action=EventAggregatorSummary&doit=1&parent=%s&%s" % ( + download_dialogue_link = "action=EventAggregatorSummary&parent=%s&%s" % ( self.parent_name or "", self.category_name_parameters ) + download_all_link = download_dialogue_link + "&doit=1" download_link = download_all_link + ("&%s&%s" % ( self.getMonthQueryString("start", self.calendar_start, prefix=0), self.getMonthQueryString("end", self.calendar_end, prefix=0) )) + + # Subscription links just explicitly select the RSS format. + + subscribe_dialogue_link = download_dialogue_link + "&format=RSS" subscribe_all_link = download_all_link + "&format=RSS" subscribe_link = download_link + "&format=RSS" @@ -119,23 +124,54 @@ period_limits = "".join(period_limits) + download_dialogue_link += period_limits download_all_link += period_limits + subscribe_dialogue_link += period_limits subscribe_all_link += period_limits + # Pop-up descriptions of the downloadable calendars. + + calendar_period = "%s - %s" % (self.calendar_start, self.calendar_end) + raw_calendar_period = "%s - %s" % (self.raw_calendar_start, self.raw_calendar_end) + # Write the controls. output.append(fmt.div(on=1, css_class="event-download-controls")) output.append(fmt.span(on=1, css_class="event-download")) output.append(linkToPage(request, page, _("Download this view"), download_link)) + output.append(fmt.span(on=1, css_class="event-download-popup")) + output.append(fmt.text(calendar_period)) + output.append(fmt.span(on=0)) output.append(fmt.span(on=0)) output.append(fmt.span(on=1, css_class="event-download")) output.append(linkToPage(request, page, _("Download this calendar"), download_all_link)) + output.append(fmt.span(on=1, css_class="event-download-popup")) + output.append(fmt.text(raw_calendar_period)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=1, css_class="event-download")) + output.append(linkToPage(request, page, _("Download..."), download_dialogue_link)) + output.append(fmt.span(on=1, css_class="event-download-popup")) + output.append(fmt.text(_("Edit download options"))) + output.append(fmt.span(on=0)) output.append(fmt.span(on=0)) output.append(fmt.span(on=1, css_class="event-download")) output.append(linkToPage(request, page, _("Subscribe to this view"), subscribe_link)) + output.append(fmt.span(on=1, css_class="event-download-popup")) + output.append(fmt.text(calendar_period)) + output.append(fmt.span(on=0)) output.append(fmt.span(on=0)) output.append(fmt.span(on=1, css_class="event-download")) output.append(linkToPage(request, page, _("Subscribe to this calendar"), subscribe_all_link)) + output.append(fmt.span(on=1, css_class="event-download-popup")) + output.append(fmt.text(raw_calendar_period)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=1, css_class="event-download")) + output.append(linkToPage(request, page, _("Subscribe..."), subscribe_dialogue_link)) + output.append(fmt.span(on=1, css_class="event-download-popup")) + output.append(fmt.text(_("Edit subscription options"))) + output.append(fmt.span(on=0)) output.append(fmt.span(on=0)) output.append(fmt.div(on=0))