1.1 --- a/imipweb/calendar.py Tue Oct 20 20:00:32 2015 +0200
1.2 +++ b/imipweb/calendar.py Tue Oct 20 20:01:37 2015 +0200
1.3 @@ -24,7 +24,7 @@
1.4 from imiptools.dates import format_datetime, get_date, get_datetime, \
1.5 get_datetime_item, get_end_of_day, get_start_of_day, \
1.6 get_start_of_next_day, get_timestamp, ends_on_same_day, \
1.7 - to_timezone
1.8 + to_date, to_timezone
1.9 from imiptools.period import add_day_start_points, add_empty_days, add_slots, \
1.10 get_overlapping, \
1.11 get_scale, get_slots, get_spans, partition_by_day, \
1.12 @@ -202,6 +202,8 @@
1.13 "Show requests for the current user."
1.14
1.15 page = self.page
1.16 + view_period = self.get_view_period()
1.17 + duration = view_period and view_period.get_duration() or timedelta(1)
1.18
1.19 # NOTE: This list could be more informative, but it is envisaged that
1.20 # NOTE: the requests would be visited directly anyway.
1.21 @@ -218,9 +220,17 @@
1.22 for uid, recurrenceid, request_type in requests:
1.23 obj = self._get_object(uid, recurrenceid)
1.24 if obj:
1.25 - page.li()
1.26 - page.a(obj.get_value("SUMMARY"), href="#request-%s-%s" % (uid, recurrenceid or ""))
1.27 - page.li.close()
1.28 +
1.29 + # Provide a link showing the request in context.
1.30 +
1.31 + periods = self.get_periods(obj)
1.32 + if periods:
1.33 + start = to_date(periods[0].get_start())
1.34 + end = max(to_date(periods[0].get_end()), start + duration)
1.35 + d = {"start" : format_datetime(start), "end" : format_datetime(end)}
1.36 + page.li()
1.37 + page.a(obj.get_value("SUMMARY"), href="%s#request-%s-%s" % (self.link_to(args=d), uid, recurrenceid or ""))
1.38 + page.li.close()
1.39
1.40 page.ul.close()
1.41
1.42 @@ -279,23 +289,22 @@
1.43 page.input(name="reset", type="submit", value="Clear selections", id="reset")
1.44 page.p.close()
1.45
1.46 - def show_time_navigation(self, view_start, view_end, view_period=None):
1.47 + def show_time_navigation(self, view_period):
1.48
1.49 """
1.50 Show the calendar navigation links for the period defined by
1.51 - 'view_start' and 'view_end'.
1.52 + 'view_period'.
1.53 """
1.54
1.55 page = self.page
1.56 - view_period = view_period or timedelta(7)
1.57 + view_start = view_period.get_start()
1.58 + view_end = view_period.get_end()
1.59 + duration = view_period.get_duration()
1.60
1.61 page.p(id_="time-navigation")
1.62
1.63 if view_start:
1.64 - if view_end:
1.65 - earlier_start = view_start - (view_end - view_start)
1.66 - else:
1.67 - earlier_start = view_start - view_period
1.68 + earlier_start = view_start - duration
1.69 page.label("Show earlier events", for_="earlier", class_="earlier")
1.70 page.input(name="earlier", id_="earlier", type="submit")
1.71 page.input(name="earlier-start", type="hidden", value=format_datetime(earlier_start))
1.72 @@ -303,10 +312,7 @@
1.73 page.input(name="start", type="hidden", value=format_datetime(view_start))
1.74
1.75 if view_end:
1.76 - if view_start:
1.77 - later_end = view_end + (view_end - view_start)
1.78 - else:
1.79 - later_end = view_end + view_period
1.80 + later_end = view_end + duration
1.81 page.label("Show later events", for_="later", class_="later")
1.82 page.input(name="later", id_="later", type="submit")
1.83 page.input(name="later-start", type="hidden", value=format_datetime(view_end))
1.84 @@ -340,7 +346,9 @@
1.85
1.86 "Return a dictionary containing start and/or end navigation details."
1.87
1.88 - view_start, view_end = self.get_time_navigation()
1.89 + view_period = self.get_view_period()
1.90 + view_start = view_period.get_start()
1.91 + view_end = view_period.get_end()
1.92 link_args = {}
1.93 if view_start:
1.94 link_args["start"] = format_datetime(view_start)
1.95 @@ -348,6 +356,20 @@
1.96 link_args["end"] = format_datetime(view_end)
1.97 return link_args
1.98
1.99 + def get_view_period(self):
1.100 +
1.101 + "Return the current view period."
1.102 +
1.103 + view_start, view_end = self.get_time_navigation()
1.104 +
1.105 + # Without any explicit limits, impose a reasonable view period.
1.106 +
1.107 + if not (view_start or view_end):
1.108 + view_start = get_date()
1.109 + view_end = get_date(timedelta(7))
1.110 +
1.111 + return Period(view_start, view_end, self.get_tzid())
1.112 +
1.113 def get_period_group_details(self, freebusy, participants, view_period):
1.114
1.115 """
1.116 @@ -502,27 +524,19 @@
1.117 # Day view: start at the earliest known day and produce days until the
1.118 # latest known day, with expandable sections of empty days.
1.119
1.120 - view_start, view_end = self.get_time_navigation()
1.121 -
1.122 - # Without any explicit limits, impose a reasonable view period.
1.123 -
1.124 - if not (view_start or view_end):
1.125 - view_start = get_date()
1.126 - view_end = get_date(timedelta(8))
1.127 -
1.128 - view_period = (view_start or view_end) and Period(view_start, view_end, self.get_tzid())
1.129 + view_period = self.get_view_period()
1.130
1.131 (days, partitioned_groups, partitioned_group_types, partitioned_group_sources, group_columns) = \
1.132 self.get_period_group_details(freebusy, participants, view_period)
1.133
1.134 # Add empty days.
1.135
1.136 - add_empty_days(days, self.get_tzid(), view_start, view_end)
1.137 + add_empty_days(days, self.get_tzid(), view_period.get_start(), view_period.get_end())
1.138
1.139 # Show controls to change the calendar appearance.
1.140
1.141 self.show_calendar_controls()
1.142 - self.show_time_navigation(view_start, view_end)
1.143 + self.show_time_navigation(view_period)
1.144
1.145 # Show the calendar itself.
1.146