1.1 --- a/htdocs/styles.css Mon Sep 28 00:03:47 2015 +0200
1.2 +++ b/htdocs/styles.css Mon Sep 28 00:28:39 2015 +0200
1.3 @@ -117,6 +117,10 @@
1.4 vertical-align: top;
1.5 }
1.6
1.7 +table.counters tr.selected {
1.8 + background-color: #ee2;
1.9 +}
1.10 +
1.11 /* New event controls. */
1.12
1.13 .newevent-with-periods {
2.1 --- a/imipweb/calendar.py Mon Sep 28 00:03:47 2015 +0200
2.2 +++ b/imipweb/calendar.py Mon Sep 28 00:28:39 2015 +0200
2.3 @@ -746,6 +746,10 @@
2.4 # Link to requests and events (including ones for
2.5 # which counter-proposals exist).
2.6
2.7 + elif group_type == "request" and self._have_request(p.uid, p.recurrenceid, "COUNTER", True):
2.8 + page.a(p.summary, href=self.link_to(p.uid, p.recurrenceid,
2.9 + {"counter" : self._period_identifier(p)}))
2.10 +
2.11 else:
2.12 page.a(p.summary, href=self.link_to(p.uid, p.recurrenceid))
2.13
2.14 @@ -839,4 +843,7 @@
2.15 identifier = "slot-%s" % value
2.16 return value, identifier
2.17
2.18 + def _period_identifier(self, period):
2.19 + return "%s-%s" % (format_datetime(period.get_start()), format_datetime(period.get_end()))
2.20 +
2.21 # vim: tabstop=4 expandtab shiftwidth=4
3.1 --- a/imipweb/env.py Mon Sep 28 00:03:47 2015 +0200
3.2 +++ b/imipweb/env.py Mon Sep 28 00:28:39 2015 +0200
3.3 @@ -19,7 +19,7 @@
3.4 this program. If not, see <http://www.gnu.org/licenses/>.
3.5 """
3.6
3.7 -import cgi, os, sys
3.8 +import cgi, os, sys, urlparse
3.9
3.10 getenv = os.environ.get
3.11 setenv = os.environ.__setitem__
3.12 @@ -35,10 +35,13 @@
3.13 self.path = None
3.14 self.path_info = None
3.15 self.user = None
3.16 + self.query_string = None
3.17
3.18 def get_args(self):
3.19 if self.args is None:
3.20 if self.get_method() != "POST":
3.21 + if not self.query_string:
3.22 + self.query_string = getenv("QUERY_STRING")
3.23 setenv("QUERY_STRING", "")
3.24 args = cgi.parse(keep_blank_values=True)
3.25
3.26 @@ -51,6 +54,11 @@
3.27
3.28 return self.args
3.29
3.30 + def get_query(self):
3.31 + if not self.query_string:
3.32 + self.query_string = getenv("QUERY_STRING")
3.33 + return urlparse.parse_qs(self.query_string or "", keep_blank_values=True)
3.34 +
3.35 def get_method(self):
3.36 if self.method is None:
3.37 self.method = getenv("REQUEST_METHOD") or "GET"
4.1 --- a/imipweb/event.py Mon Sep 28 00:03:47 2015 +0200
4.2 +++ b/imipweb/event.py Mon Sep 28 00:28:39 2015 +0200
4.3 @@ -20,7 +20,7 @@
4.4 """
4.5
4.6 from imiptools.data import get_uri, uri_dict, uri_items, uri_values
4.7 -from imiptools.dates import to_timezone
4.8 +from imiptools.dates import format_datetime, to_timezone
4.9 from imiptools.mail import Messenger
4.10 from imiptools.period import have_conflict
4.11 from imipweb.data import EventPeriod, event_period_from_period, FormPeriod, PeriodError
4.12 @@ -483,6 +483,9 @@
4.13 "Show any counter-proposals for the current object."
4.14
4.15 page = self.page
4.16 + query = self.env.get_query()
4.17 + counter = query.get("counter", [None])[0]
4.18 +
4.19 attendees = self._get_counters(self.uid, self.recurrenceid)
4.20 tzid = self.get_tzid()
4.21
4.22 @@ -508,15 +511,17 @@
4.23 obj = self.get_stored_object(self.uid, self.recurrenceid, "counters", attendee)
4.24 periods = self.get_periods(obj)
4.25
4.26 - page.tr(rowspan=len(periods))
4.27 - page.td(attendee)
4.28 -
4.29 first = True
4.30 for p in periods:
4.31 - if not first:
4.32 - page.tr()
4.33 + identifier = "%s-%s" % (format_datetime(p.get_start_point()), format_datetime(p.get_end_point()))
4.34 + css = identifier == counter and "selected" or ""
4.35 +
4.36 + if first:
4.37 + page.tr(rowspan=len(periods), class_=css)
4.38 + page.td(attendee)
4.39 + first = False
4.40 else:
4.41 - first = False
4.42 + page.tr(class_=css)
4.43
4.44 start = self.format_datetime(to_timezone(p.get_start(), tzid), "long")
4.45 end = self.format_datetime(to_timezone(p.get_end(), tzid), "long")
5.1 --- a/imipweb/resource.py Mon Sep 28 00:03:47 2015 +0200
5.2 +++ b/imipweb/resource.py Mon Sep 28 00:28:39 2015 +0200
5.3 @@ -26,6 +26,7 @@
5.4 from imiptools.period import remove_period, remove_affected_period
5.5 from imipweb.data import event_period_from_period, form_period_from_period, FormDate
5.6 from imipweb.env import CGIEnvironment
5.7 +from urllib import urlencode
5.8 import babel.dates
5.9 import imip_store
5.10 import markup
5.11 @@ -81,17 +82,19 @@
5.12 self.new_page(title="Redirect")
5.13 self.page.p("Redirecting to: %s" % url)
5.14
5.15 - def link_to(self, uid, recurrenceid=None):
5.16 + def link_to(self, uid, recurrenceid=None, args=None):
5.17
5.18 """
5.19 Return a link to an object with the given 'uid' and 'recurrenceid'.
5.20 See get_identifiers for the decoding of such links.
5.21 +
5.22 + If 'args' is specified, the given dictionary is encoded and included.
5.23 """
5.24
5.25 path = [uid]
5.26 if recurrenceid:
5.27 path.append(recurrenceid)
5.28 - return self.env.new_url("/".join(path))
5.29 + return "%s%s" % (self.env.new_url("/".join(path)), args and ("?%s" % urlencode(args)) or "")
5.30
5.31 # Access to objects.
5.32