1.1 --- a/imipweb/calendar.py Sun Oct 18 23:24:37 2015 +0200
1.2 +++ b/imipweb/calendar.py Sun Oct 18 23:32:32 2015 +0200
1.3 @@ -19,7 +19,7 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 -from datetime import datetime
1.8 +from datetime import datetime, timedelta
1.9 from imiptools.data import get_address, get_uri, uri_parts
1.10 from imiptools.dates import format_datetime, get_datetime, \
1.11 get_datetime_item, get_end_of_day, get_start_of_day, \
1.12 @@ -250,6 +250,63 @@
1.13
1.14 return participants
1.15
1.16 + def show_time_navigation(self, view_start, view_end, view_period=None):
1.17 +
1.18 + """
1.19 + Show the calendar navigation links for the period defined by
1.20 + 'view_start' and 'view_end'.
1.21 + """
1.22 +
1.23 + page = self.page
1.24 + view_period = view_period or timedelta(7)
1.25 +
1.26 + page.p()
1.27 +
1.28 + if view_start:
1.29 + if view_end:
1.30 + earlier_start = view_start - (view_end - view_start)
1.31 + else:
1.32 + earlier_start = view_start - view_period
1.33 + page.label("Show earlier events", for_="earlier", class_="earlier")
1.34 + page.input(name="earlier", id_="earlier", type="submit")
1.35 + page.input(name="earlier-start", type="hidden", value=format_datetime(earlier_start))
1.36 + page.input(name="earlier-end", type="hidden", value=format_datetime(view_start))
1.37 + page.input(name="start", type="hidden", value=format_datetime(view_start))
1.38 +
1.39 + if view_end:
1.40 + if view_start:
1.41 + later_end = view_end + (view_end - view_start)
1.42 + else:
1.43 + later_end = view_end + view_period
1.44 + page.label("Show later events", for_="later", class_="later")
1.45 + page.input(name="later", id_="later", type="submit")
1.46 + page.input(name="later-start", type="hidden", value=format_datetime(view_end))
1.47 + page.input(name="later-end", type="hidden", value=format_datetime(later_end))
1.48 + page.input(name="end", type="hidden", value=format_datetime(view_end))
1.49 +
1.50 + page.p.close()
1.51 +
1.52 + def get_time_navigation(self):
1.53 +
1.54 + "Return the start and end dates for the calendar view."
1.55 +
1.56 + for args in [self.env.get_args(), self.env.get_query()]:
1.57 + if args.has_key("earlier"):
1.58 + start_name, end_name = "earlier-start", "earlier-end"
1.59 + break
1.60 + elif args.has_key("later"):
1.61 + start_name, end_name = "later-start", "later-end"
1.62 + break
1.63 + elif args.has_key("start") or args.has_key("end"):
1.64 + start_name, end_name = "start", "end"
1.65 + break
1.66 + else:
1.67 + return None, None
1.68 +
1.69 + view_start = self.get_date_arg(args, start_name)
1.70 + view_end = self.get_date_arg(args, end_name)
1.71 + return view_start, view_end
1.72 +
1.73 # Full page output methods.
1.74
1.75 def show(self):
1.76 @@ -282,11 +339,11 @@
1.77 # Day view: start at the earliest known day and produce days until the
1.78 # latest known day, with expandable sections of empty days.
1.79
1.80 - args = self.env.get_query()
1.81 - view_start = self.get_date_arg(args, "start")
1.82 - view_end = self.get_date_arg(args, "end")
1.83 + view_start, view_end = self.get_time_navigation()
1.84 view_period = (view_start or view_end) and Period(view_start, view_end, self.get_tzid())
1.85
1.86 + self.show_time_navigation(view_start, view_end)
1.87 +
1.88 # Requests are listed and linked to their tentative positions in the
1.89 # calendar. Other participants are also shown.
1.90
1.91 @@ -400,9 +457,7 @@
1.92
1.93 # Add empty days.
1.94
1.95 - add_empty_days(days, tzid)
1.96 -
1.97 - page.p("Select days or periods for a new event.")
1.98 + add_empty_days(days, tzid, view_start, view_end)
1.99
1.100 # Show controls for hiding empty days and busy slots.
1.101 # The positioning of the control, paragraph and table are important here.
1.102 @@ -411,12 +466,12 @@
1.103 page.input(name="hidebusy", type="checkbox", value="hide", id="hidebusy", accesskey="B")
1.104
1.105 page.p(class_="controls")
1.106 + page.span("Select days or periods for a new event.")
1.107 page.label("Hide busy time periods", for_="hidebusy", class_="hidebusy enable")
1.108 page.label("Show busy time periods", for_="hidebusy", class_="hidebusy disable")
1.109 page.label("Show empty days", for_="showdays", class_="showdays disable")
1.110 page.label("Hide empty days", for_="showdays", class_="showdays enable")
1.111 page.input(name="reset", type="submit", value="Clear selections", id="reset")
1.112 - page.label("Clear selections", for_="reset", class_="reset newevent-with-periods")
1.113 page.p.close()
1.114
1.115 # Show the calendar itself.
1.116 @@ -634,6 +689,10 @@
1.117 page.input(name="newevent-%d" % i, type="submit", value="New event", accesskey="N")
1.118 page.p.close()
1.119
1.120 + page.p(class_="newevent-with-periods")
1.121 + page.label("Clear selections", for_="reset", class_="reset")
1.122 + page.p.close()
1.123 +
1.124 page.div.close()
1.125
1.126 i += 1