imip-agent

Changeset

392:53bff024aaf2
2015-03-07 Paul Boddie raw files shortlog changelog graph Added initial support for the DURATION property. recurring-events
imip_manager.py (file) imiptools/data.py (file)
     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