# HG changeset patch # User Paul Boddie # Date 1425683326 -3600 # Node ID 53bff024aaf220fc17237cc937c923267ba0793e # Parent 3f2e7175f5400fcc64b458320f35902ad8e2ac5f Added initial support for the DURATION property. diff -r 3f2e7175f540 -r 53bff024aaf2 imip_manager.py --- a/imip_manager.py Fri Mar 06 23:48:54 2015 +0100 +++ b/imip_manager.py Sat Mar 07 00:08:46 2015 +0100 @@ -867,7 +867,15 @@ new_attendees, new_attendee = self.handle_new_attendees(obj) else: dtstart, dtstart_attr = obj.get_datetime_item("DTSTART") - dtend, dtend_attr = obj.get_datetime_item("DTEND") + if obj.has_key("DTEND"): + dtend, dtend_attr = obj.get_datetime_item("DTEND") + elif obj.has_key("DURATION"): + duration = obj.get_duration("DURATION") + dtend = dtstart + duration + dtend_attr = dtstart_attr + else: + dtend, dtend_attr = dtstart, dtstart_attr + new_attendees = [] new_attendee = "" @@ -1081,8 +1089,14 @@ dtend, dtend_attr = None, {} elif dtend_control == "disable": dtend, dtend_attr = None, {} + elif obj.has_key("DTEND"): + dtend, dtend_attr = obj.get_datetime_item("DTEND") + elif obj.has_key("DURATION"): + duration = obj.get_duration("DURATION") + dtend = dtstart + duration + dtend_attr = dtstart_attr else: - dtend, dtend_attr = obj.get_datetime_item("DTEND") + dtend, dtend_attr = dtstart, dtstart_attr # Change end dates to refer to the actual dates, not the iCalendar # "next day" dates. @@ -1178,7 +1192,13 @@ tzid = self.get_tzid() dtstart = format_datetime(obj.get_utc_datetime("DTSTART")) - dtend = format_datetime(obj.get_utc_datetime("DTEND")) + if obj.has_key("DTEND"): + dtend = format_datetime(obj.get_utc_datetime("DTEND")) + elif obj.has_key("DURATION"): + duration = obj.get_duration("DURATION") + dtend = format_datetime(obj.get_utc_datetime("DTSTART") + duration) + else: + dtend = dtstart periods = obj.get_periods_for_freebusy(self.get_tzid(), self.get_window_end()) diff -r 3f2e7175f540 -r 53bff024aaf2 imiptools/data.py --- a/imiptools/data.py Fri Mar 06 23:48:54 2015 +0100 +++ b/imiptools/data.py Sat Mar 07 00:08:46 2015 +0100 @@ -21,8 +21,9 @@ from datetime import datetime, timedelta from email.mime.text import MIMEText -from imiptools.dates import format_datetime, get_datetime, get_freebusy_period, \ - get_period, to_timezone, to_utc_datetime +from imiptools.dates import format_datetime, get_datetime, get_duration, \ + get_freebusy_period, get_period, to_timezone, \ + to_utc_datetime from imiptools.period import period_overlaps from pytz import timezone from vCalendar import iterwrite, parse, ParseError, to_dict, to_node @@ -73,6 +74,9 @@ def get_datetime_item(self, name): return get_datetime_item(self.details, name) + def get_duration(self, name): + return get_duration(self.get_value(name)) + def to_node(self): return to_node({self.objtype : [(self.details, self.attr)]}) @@ -81,6 +85,9 @@ # Direct access to the structure. + def has_key(self, name): + return self.details.has_key(name) + def __getitem__(self, name): return self.details[name] @@ -361,13 +368,19 @@ # Use localised datetimes. - dtstart, start_attr = obj.get_datetime_item("DTSTART") - dtend, end_attr = obj.get_datetime_item("DTEND") - tzid = start_attr.get("TZID") or end_attr.get("TZID") or tzid + dtstart, dtstart_attr = obj.get_datetime_item("DTSTART") - # NOTE: Need also DURATION support. + if obj.has_key("DTEND"): + dtend, dtend_attr = obj.get_datetime_item("DTEND") + duration = dtend - dtstart + elif obj.has_key("DURATION"): + duration = obj.get_duration("DURATION") + dtend = dtstart + duration + dtend_attr = dtstart_attr + else: + dtend, dtend_attr = dtstart, dtstart_attr - duration = dtend - dtstart + tzid = dtstart_attr.get("TZID") or dtend_attr.get("TZID") or tzid if not rrule: periods = [(dtstart, dtend)] @@ -425,7 +438,13 @@ """ start, start_attr = obj.get_datetime_item("DTSTART") - end, end_attr = obj.get_datetime_item("DTEND") + if obj.has_key("DTEND"): + end, end_attr = obj.get_datetime_item("DTEND") + elif obj.has_key("DURATION"): + duration = obj.get_duration("DURATION") + end = start + duration + else: + end, end_attr = start, start_attr tzid = start_attr.get("TZID") or end_attr.get("TZID") or tzid