1.1 --- a/imip_manager.py Fri Mar 06 23:48:54 2015 +0100
1.2 +++ b/imip_manager.py Sat Mar 07 00:08:46 2015 +0100
1.3 @@ -867,7 +867,15 @@
1.4 new_attendees, new_attendee = self.handle_new_attendees(obj)
1.5 else:
1.6 dtstart, dtstart_attr = obj.get_datetime_item("DTSTART")
1.7 - dtend, dtend_attr = obj.get_datetime_item("DTEND")
1.8 + if obj.has_key("DTEND"):
1.9 + dtend, dtend_attr = obj.get_datetime_item("DTEND")
1.10 + elif obj.has_key("DURATION"):
1.11 + duration = obj.get_duration("DURATION")
1.12 + dtend = dtstart + duration
1.13 + dtend_attr = dtstart_attr
1.14 + else:
1.15 + dtend, dtend_attr = dtstart, dtstart_attr
1.16 +
1.17 new_attendees = []
1.18 new_attendee = ""
1.19
1.20 @@ -1081,8 +1089,14 @@
1.21 dtend, dtend_attr = None, {}
1.22 elif dtend_control == "disable":
1.23 dtend, dtend_attr = None, {}
1.24 + elif obj.has_key("DTEND"):
1.25 + dtend, dtend_attr = obj.get_datetime_item("DTEND")
1.26 + elif obj.has_key("DURATION"):
1.27 + duration = obj.get_duration("DURATION")
1.28 + dtend = dtstart + duration
1.29 + dtend_attr = dtstart_attr
1.30 else:
1.31 - dtend, dtend_attr = obj.get_datetime_item("DTEND")
1.32 + dtend, dtend_attr = dtstart, dtstart_attr
1.33
1.34 # Change end dates to refer to the actual dates, not the iCalendar
1.35 # "next day" dates.
1.36 @@ -1178,7 +1192,13 @@
1.37 tzid = self.get_tzid()
1.38
1.39 dtstart = format_datetime(obj.get_utc_datetime("DTSTART"))
1.40 - dtend = format_datetime(obj.get_utc_datetime("DTEND"))
1.41 + if obj.has_key("DTEND"):
1.42 + dtend = format_datetime(obj.get_utc_datetime("DTEND"))
1.43 + elif obj.has_key("DURATION"):
1.44 + duration = obj.get_duration("DURATION")
1.45 + dtend = format_datetime(obj.get_utc_datetime("DTSTART") + duration)
1.46 + else:
1.47 + dtend = dtstart
1.48
1.49 periods = obj.get_periods_for_freebusy(self.get_tzid(), self.get_window_end())
1.50
2.1 --- a/imiptools/data.py Fri Mar 06 23:48:54 2015 +0100
2.2 +++ b/imiptools/data.py Sat Mar 07 00:08:46 2015 +0100
2.3 @@ -21,8 +21,9 @@
2.4
2.5 from datetime import datetime, timedelta
2.6 from email.mime.text import MIMEText
2.7 -from imiptools.dates import format_datetime, get_datetime, get_freebusy_period, \
2.8 - get_period, to_timezone, to_utc_datetime
2.9 +from imiptools.dates import format_datetime, get_datetime, get_duration, \
2.10 + get_freebusy_period, get_period, to_timezone, \
2.11 + to_utc_datetime
2.12 from imiptools.period import period_overlaps
2.13 from pytz import timezone
2.14 from vCalendar import iterwrite, parse, ParseError, to_dict, to_node
2.15 @@ -73,6 +74,9 @@
2.16 def get_datetime_item(self, name):
2.17 return get_datetime_item(self.details, name)
2.18
2.19 + def get_duration(self, name):
2.20 + return get_duration(self.get_value(name))
2.21 +
2.22 def to_node(self):
2.23 return to_node({self.objtype : [(self.details, self.attr)]})
2.24
2.25 @@ -81,6 +85,9 @@
2.26
2.27 # Direct access to the structure.
2.28
2.29 + def has_key(self, name):
2.30 + return self.details.has_key(name)
2.31 +
2.32 def __getitem__(self, name):
2.33 return self.details[name]
2.34
2.35 @@ -361,13 +368,19 @@
2.36
2.37 # Use localised datetimes.
2.38
2.39 - dtstart, start_attr = obj.get_datetime_item("DTSTART")
2.40 - dtend, end_attr = obj.get_datetime_item("DTEND")
2.41 - tzid = start_attr.get("TZID") or end_attr.get("TZID") or tzid
2.42 + dtstart, dtstart_attr = obj.get_datetime_item("DTSTART")
2.43
2.44 - # NOTE: Need also DURATION support.
2.45 + if obj.has_key("DTEND"):
2.46 + dtend, dtend_attr = obj.get_datetime_item("DTEND")
2.47 + duration = dtend - dtstart
2.48 + elif obj.has_key("DURATION"):
2.49 + duration = obj.get_duration("DURATION")
2.50 + dtend = dtstart + duration
2.51 + dtend_attr = dtstart_attr
2.52 + else:
2.53 + dtend, dtend_attr = dtstart, dtstart_attr
2.54
2.55 - duration = dtend - dtstart
2.56 + tzid = dtstart_attr.get("TZID") or dtend_attr.get("TZID") or tzid
2.57
2.58 if not rrule:
2.59 periods = [(dtstart, dtend)]
2.60 @@ -425,7 +438,13 @@
2.61 """
2.62
2.63 start, start_attr = obj.get_datetime_item("DTSTART")
2.64 - end, end_attr = obj.get_datetime_item("DTEND")
2.65 + if obj.has_key("DTEND"):
2.66 + end, end_attr = obj.get_datetime_item("DTEND")
2.67 + elif obj.has_key("DURATION"):
2.68 + duration = obj.get_duration("DURATION")
2.69 + end = start + duration
2.70 + else:
2.71 + end, end_attr = start, start_attr
2.72
2.73 tzid = start_attr.get("TZID") or end_attr.get("TZID") or tzid
2.74