1.1 --- a/imiptools/client.py Sun Oct 15 23:22:28 2017 +0200
1.2 +++ b/imiptools/client.py Sun Oct 15 23:30:38 2017 +0200
1.3 @@ -22,8 +22,8 @@
1.4 from collections import OrderedDict
1.5 from datetime import datetime, timedelta
1.6 from imiptools.config import settings
1.7 -from imiptools.data import Object, check_delegation, get_address, get_uri, \
1.8 - get_main_period, get_recurrence_periods, \
1.9 +from imiptools.data import check_delegation, get_address, get_uri, \
1.10 + get_recurrence_periods, \
1.11 get_window_end, is_new_object, make_freebusy, \
1.12 make_uid, new_object, to_part, uri_dict, uri_item, \
1.13 uri_items, uri_parts, uri_values
1.14 @@ -124,14 +124,17 @@
1.15 "Return the period window start as a datetime."
1.16
1.17 prefs = self.get_preferences()
1.18 - start = prefs and get_datetime(prefs.get("window_start"), {"TZID" : self.get_tzid()})
1.19 - return isinstance(start, datetime) and start or start and to_datetime(start, self.get_tzid())
1.20 + tzid = self.get_tzid()
1.21 + start = prefs and get_datetime(prefs.get("window_start"), {"TZID" : tzid})
1.22 + return isinstance(start, datetime) and start or start and to_datetime(start, tzid)
1.23
1.24 def get_window_end(self, size=None, start=None):
1.25
1.26 "Return the period window end as a datetime."
1.27
1.28 - return get_window_end(self.get_tzid(), size or self.get_window_size(), start or self.get_window_start())
1.29 + tzid = self.get_tzid()
1.30 + return get_window_end(tzid, size or self.get_window_size(),
1.31 + start or self.get_window_start())
1.32
1.33 def is_participating(self):
1.34
1.35 @@ -248,8 +251,7 @@
1.36 def get_periods(self, obj, explicit_only=False, future_only=False):
1.37
1.38 """
1.39 - Return periods for the given 'obj'. Interpretation of periods can depend
1.40 - on the time zone, which is obtained for the current user.
1.41 + Return periods for the given 'obj'.
1.42
1.43 If 'explicit_only' is set to a true value, only explicit periods will be
1.44 returned, not rule-based periods.
1.45 @@ -258,7 +260,7 @@
1.46 returned, not all periods defined by an event starting in the past.
1.47 """
1.48
1.49 - return obj.get_periods(self.get_tzid(),
1.50 + return obj.get_periods(
1.51 start=(future_only and self.get_window_start() or None),
1.52 end=(not explicit_only and self.get_window_end() or None))
1.53
1.54 @@ -334,7 +336,7 @@
1.55
1.56 "Return the main period defined by 'obj'."
1.57
1.58 - return obj.get_main_period(self.get_tzid())
1.59 + return obj.get_main_period()
1.60
1.61 def get_recurrence_periods(self, obj):
1.62
1.63 @@ -353,9 +355,16 @@
1.64 """
1.65
1.66 if section == "counters":
1.67 - return self.store.get_counter(self.user, username, uid, recurrenceid)
1.68 + obj = self.store.get_counter(self.user, username, uid, recurrenceid)
1.69 else:
1.70 - return self.store.get_event(self.user, uid, recurrenceid, section)
1.71 + obj = self.store.get_event(self.user, uid, recurrenceid, section)
1.72 +
1.73 + # Set the fallback time zone.
1.74 +
1.75 + if obj:
1.76 + obj.set_tzid(self.get_tzid())
1.77 +
1.78 + return obj
1.79
1.80 # Free/busy operations.
1.81
1.82 @@ -492,11 +501,16 @@
1.83 self.sequence = obj and self.obj.get_value("SEQUENCE")
1.84 self.dtstamp = obj and self.obj.get_value("DTSTAMP")
1.85
1.86 + # Set the fallback time zone.
1.87 +
1.88 + if obj:
1.89 + self.obj.set_tzid(self.get_tzid())
1.90 +
1.91 def new_object(self, objtype):
1.92
1.93 "Initialise a new object for the client with the given 'objtype'."
1.94
1.95 - self.set_object(new_object(objtype, self.user, self.get_user_attributes()))
1.96 + self.set_object(new_object(objtype, self.user, self.get_user_attributes(), self.get_tzid()))
1.97 return self.obj
1.98
1.99 def load_object(self, uid, recurrenceid):
1.100 @@ -541,7 +555,7 @@
1.101 "Return whether the current object is a recurrence of its parent."
1.102
1.103 parent = self.get_parent_object()
1.104 - return parent and parent.has_recurrence(self.get_tzid(), self.obj.get_recurrenceid())
1.105 + return parent and parent.has_recurrence(self.obj.get_recurrenceid())
1.106
1.107 def get_recurrences(self, uid=None):
1.108
1.109 @@ -1262,7 +1276,7 @@
1.110
1.111 invalid = []
1.112
1.113 - for period in self.obj.get_periods(self.get_tzid()):
1.114 + for period in self.obj.get_periods():
1.115 errors = period.check_permitted(permitted_values)
1.116 if errors:
1.117 start_errors, end_errors = errors
1.118 @@ -1275,7 +1289,7 @@
1.119 "Correct the object according to any scheduling constraints."
1.120
1.121 permitted_values = self.get_permitted_values()
1.122 - return permitted_values and self.obj.correct_object(self.get_tzid(), permitted_values)
1.123 + return permitted_values and self.obj.correct_object(permitted_values)
1.124
1.125 def correct_period(self, period):
1.126
1.127 @@ -1323,7 +1337,7 @@
1.128
1.129 "Get 'recurrenceid' in a form suitable for matching free/busy entries."
1.130
1.131 - return self.obj.get_recurrence_start_point(recurrenceid, self.get_tzid())
1.132 + return self.obj.get_recurrence_start_point(recurrenceid)
1.133
1.134 def remove_from_freebusy(self, freebusy, participant=None):
1.135