# HG changeset patch # User Paul Boddie # Date 1443392919 -7200 # Node ID f10ca2cdf57bb7c3a6ae1496f2661a4764c0c928 # Parent 9afbea3f377e291ff3c8153271f0c34b60cb0dc8 Added support for highlighting counter-proposal periods when selecting them in the calendar, passing period details in query strings within links to event pages. diff -r 9afbea3f377e -r f10ca2cdf57b htdocs/styles.css --- a/htdocs/styles.css Mon Sep 28 00:03:47 2015 +0200 +++ b/htdocs/styles.css Mon Sep 28 00:28:39 2015 +0200 @@ -117,6 +117,10 @@ vertical-align: top; } +table.counters tr.selected { + background-color: #ee2; +} + /* New event controls. */ .newevent-with-periods { diff -r 9afbea3f377e -r f10ca2cdf57b imipweb/calendar.py --- a/imipweb/calendar.py Mon Sep 28 00:03:47 2015 +0200 +++ b/imipweb/calendar.py Mon Sep 28 00:28:39 2015 +0200 @@ -746,6 +746,10 @@ # Link to requests and events (including ones for # which counter-proposals exist). + elif group_type == "request" and self._have_request(p.uid, p.recurrenceid, "COUNTER", True): + page.a(p.summary, href=self.link_to(p.uid, p.recurrenceid, + {"counter" : self._period_identifier(p)})) + else: page.a(p.summary, href=self.link_to(p.uid, p.recurrenceid)) @@ -839,4 +843,7 @@ identifier = "slot-%s" % value return value, identifier + def _period_identifier(self, period): + return "%s-%s" % (format_datetime(period.get_start()), format_datetime(period.get_end())) + # vim: tabstop=4 expandtab shiftwidth=4 diff -r 9afbea3f377e -r f10ca2cdf57b imipweb/env.py --- a/imipweb/env.py Mon Sep 28 00:03:47 2015 +0200 +++ b/imipweb/env.py Mon Sep 28 00:28:39 2015 +0200 @@ -19,7 +19,7 @@ this program. If not, see . """ -import cgi, os, sys +import cgi, os, sys, urlparse getenv = os.environ.get setenv = os.environ.__setitem__ @@ -35,10 +35,13 @@ self.path = None self.path_info = None self.user = None + self.query_string = None def get_args(self): if self.args is None: if self.get_method() != "POST": + if not self.query_string: + self.query_string = getenv("QUERY_STRING") setenv("QUERY_STRING", "") args = cgi.parse(keep_blank_values=True) @@ -51,6 +54,11 @@ return self.args + def get_query(self): + if not self.query_string: + self.query_string = getenv("QUERY_STRING") + return urlparse.parse_qs(self.query_string or "", keep_blank_values=True) + def get_method(self): if self.method is None: self.method = getenv("REQUEST_METHOD") or "GET" diff -r 9afbea3f377e -r f10ca2cdf57b imipweb/event.py --- a/imipweb/event.py Mon Sep 28 00:03:47 2015 +0200 +++ b/imipweb/event.py Mon Sep 28 00:28:39 2015 +0200 @@ -20,7 +20,7 @@ """ from imiptools.data import get_uri, uri_dict, uri_items, uri_values -from imiptools.dates import to_timezone +from imiptools.dates import format_datetime, to_timezone from imiptools.mail import Messenger from imiptools.period import have_conflict from imipweb.data import EventPeriod, event_period_from_period, FormPeriod, PeriodError @@ -483,6 +483,9 @@ "Show any counter-proposals for the current object." page = self.page + query = self.env.get_query() + counter = query.get("counter", [None])[0] + attendees = self._get_counters(self.uid, self.recurrenceid) tzid = self.get_tzid() @@ -508,15 +511,17 @@ obj = self.get_stored_object(self.uid, self.recurrenceid, "counters", attendee) periods = self.get_periods(obj) - page.tr(rowspan=len(periods)) - page.td(attendee) - first = True for p in periods: - if not first: - page.tr() + identifier = "%s-%s" % (format_datetime(p.get_start_point()), format_datetime(p.get_end_point())) + css = identifier == counter and "selected" or "" + + if first: + page.tr(rowspan=len(periods), class_=css) + page.td(attendee) + first = False else: - first = False + page.tr(class_=css) start = self.format_datetime(to_timezone(p.get_start(), tzid), "long") end = self.format_datetime(to_timezone(p.get_end(), tzid), "long") diff -r 9afbea3f377e -r f10ca2cdf57b imipweb/resource.py --- a/imipweb/resource.py Mon Sep 28 00:03:47 2015 +0200 +++ b/imipweb/resource.py Mon Sep 28 00:28:39 2015 +0200 @@ -26,6 +26,7 @@ from imiptools.period import remove_period, remove_affected_period from imipweb.data import event_period_from_period, form_period_from_period, FormDate from imipweb.env import CGIEnvironment +from urllib import urlencode import babel.dates import imip_store import markup @@ -81,17 +82,19 @@ self.new_page(title="Redirect") self.page.p("Redirecting to: %s" % url) - def link_to(self, uid, recurrenceid=None): + def link_to(self, uid, recurrenceid=None, args=None): """ Return a link to an object with the given 'uid' and 'recurrenceid'. See get_identifiers for the decoding of such links. + + If 'args' is specified, the given dictionary is encoded and included. """ path = [uid] if recurrenceid: path.append(recurrenceid) - return self.env.new_url("/".join(path)) + return "%s%s" % (self.env.new_url("/".join(path)), args and ("?%s" % urlencode(args)) or "") # Access to objects.