Esempio n. 1
0
    def to_dict(self):
        data = dict()

        for p, getter in self.properties_map.iteritems():
            val = None
            if hasattr(self, getter):
                val = getattr(self, getter)()
            elif hasattr(self.event, getter):
                val = getattr(self.event, getter)()

            if isinstance(val, kolabformat.cDateTime):
                val = xmlutils.from_cdatetime(val, True)
            elif isinstance(val, kolabformat.vectordatetime):
                val = [xmlutils.from_cdatetime(x, True) for x in val]
            elif isinstance(val, kolabformat.vectors):
                val = [str(x) for x in val]
            elif isinstance(val, kolabformat.vectorcs):
                for x in val:
                    data[x.identifier] = x.value
                val = None
            elif isinstance(val, kolabformat.ContactReference):
                val = ContactReference(val).to_dict()
            elif isinstance(val, kolabformat.RecurrenceRule):
                val = RecurrenceRule(val).to_dict()
            elif isinstance(val, kolabformat.vectorattachment):
                val = [dict(fmttype=x.mimetype(), label=x.label(), uri=x.uri()) for x in val]
            elif isinstance(val, kolabformat.vectoralarm):
                val = [self._alarm_to_dict(x) for x in val]
            elif isinstance(val, list):
                val = [x.to_dict() for x in val if hasattr(x, 'to_dict')]

            if val is not None:
                data[p] = val

        return data
Esempio n. 2
0
    def _alarm_to_dict(self, alarm):
        ret = dict(
            action=self._translate_value(alarm.type(), self.alarm_type_map),
            summary=alarm.summary(),
            description=alarm.description(),
            trigger=None
        )

        start = alarm.start()
        if start and start.isValid():
            ret['trigger'] = xmlutils.from_cdatetime(start, True)
        else:
            ret['trigger'] = dict(related=self._translate_value(alarm.relativeTo(), self.related_map))
            duration = alarm.relativeStart()
            if duration and duration.isValid():
                prefix = '-' if duration.isNegative() else '+'
                value = prefix + "P%dW%dDT%dH%dM%dS" % (
                    duration.weeks(), duration.days(), duration.hours(), duration.minutes(), duration.seconds()
                )
                ret['trigger']['value'] = re.sub(r"T$", '', re.sub(r"0[WDHMS]", '', value))

        if alarm.type() == kolabformat.Alarm.EMailAlarm:
            ret['attendee'] = [ContactReference(a).to_dict() for a in alarm.attendees()]

        return ret
Esempio n. 3
0
    def to_dict(self, raw=False):
        if not self.isValid() or self.frequency(
        ) == kolabformat.RecurrenceRule.FreqNone:
            return None

        data = dict()

        for p, getter in self.properties_map.iteritems():
            val = None
            args = {}
            if hasattr(self, getter):
                if getter.startswith('get_'):
                    args = dict(translated=True)
            if hasattr(self, getter):
                val = getattr(self, getter)(**args)
            if isinstance(val, kolabformat.cDateTime):
                val = xmlutils.from_cdatetime(val, True)
            elif isinstance(val, kolabformat.vectori):
                val = [int(x) for x in val]
            elif isinstance(val, kolabformat.vectordaypos):
                val = [
                    "%s%s" %
                    (str(x.occurence()) if x.occurence() != 0 else '',
                     self._translate_value(x.weekday(), self.weekday_map))
                    for x in val
                ]

            if not raw and isinstance(val, list):
                val = ",".join(val)
            if val is not None:
                data[p] = val

        return data
Esempio n. 4
0
 def get_end(self):
     dt = xmlutils.from_cdatetime(self.event.end(), True)
     if not dt:
         duration = self.get_duration()
         if duration is not None:
             dt = self.get_start() + duration
     return dt
Esempio n. 5
0
    def to_dict(self):
        if not self.isValid():
            return None

        data = self._names2dict(self.nameComponents())

        for p, getter in self.properties_map.iteritems():
            val = None
            if hasattr(self, getter):
                val = getattr(self, getter)()
            if isinstance(val, kolabformat.cDateTime):
                val = xmlutils.from_cdatetime(val, True)
            elif isinstance(val, kolabformat.vectori):
                val = [int(x) for x in val]
            elif isinstance(val, kolabformat.vectors):
                val = [str(x) for x in val]
            elif isinstance(val, kolabformat.vectortelephone):
                val = [
                    self._struct2dict(x, 'number', self.phonetype_map)
                    for x in val
                ]
            elif isinstance(val, kolabformat.vectoremail):
                val = [
                    self._struct2dict(x, 'address', self.emailtype_map)
                    for x in val
                ]
            elif isinstance(val, kolabformat.vectorurl):
                val = [
                    self._struct2dict(x, 'url', self.urltype_map) for x in val
                ]
            elif isinstance(val, kolabformat.vectorkey):
                val = [
                    self._struct2dict(x, 'key', self.keytype_map) for x in val
                ]
            elif isinstance(val, kolabformat.vectoraddress):
                val = [self._address2dict(x) for x in val]
            elif isinstance(val, kolabformat.vectorgeo):
                val = [[x.latitude, x.longitude] for x in val]

            if val is not None:
                data[p] = val

        affiliations = self.affiliations()
        if len(affiliations) > 0:
            _affiliation = self._affiliation2dict(affiliations[0])
            if _affiliation.has_key('address'):
                data['address'].extend(_affiliation['address'])
                _affiliation.pop('address', None)
            data.update(_affiliation)

        data.update(self._relateds2dict(self.relateds()))

        if self.photoMimetype():
            data['photo'] = dict(mimetype=self.photoMimetype(),
                                 base64=base64.b64encode(self.photo()))
        elif self.photo():
            data['photo'] = dict(uri=self.photo())

        return data
Esempio n. 6
0
    def get_occurence_end_date(self, datetime):
        if not datetime:
            return None

        if not hasattr(self, 'eventcal'):
            return None

        end_cdatetime = self.eventcal.getOccurenceEndDate(xmlutils.to_cdatetime(datetime, True))
        return xmlutils.from_cdatetime(end_cdatetime, True) if end_cdatetime is not None else None
Esempio n. 7
0
    def get_lastmodified(self):
        try:
            _datetime = self.event.lastModified()
            if retval == None or retval == "":
                self.__str__()
        except:
            self.__str__()

        return xmlutils.from_cdatetime(self.event.lastModified(), True)
Esempio n. 8
0
    def get_lastmodified(self):
        try:
            _datetime = self.lastModified()
            if _datetime == None or not _datetime.isValid():
                self.__str__()
        except:
            return datetime.datetime.now(pytz.utc)

        return xmlutils.from_cdatetime(self.lastModified(), True)
Esempio n. 9
0
    def get_last_occurrence(self, force=False):
        if not hasattr(self, 'eventcal'):
            self.eventcal = self.to_event_cal()

        last = self.eventcal.getLastOccurrence()
        last_datetime = xmlutils.from_cdatetime(last, True) if last is not None else None

        # we're forced to return some date
        if last_datetime is None and force:
            last_datetime = self._recurrence_end()

        return last_datetime
Esempio n. 10
0
    def get_next_occurence(self, datetime):
        if not hasattr(self, 'eventcal'):
            self.eventcal = self.to_event_cal()

        next_cdatetime = self.eventcal.getNextOccurence(xmlutils.to_cdatetime(datetime, True))
        next_datetime  = xmlutils.from_cdatetime(next_cdatetime, True) if next_cdatetime is not None else None

        # cut infinite recurrence at a reasonable point
        if next_datetime and not self.get_last_occurrence() and next_datetime > self._recurrence_end():
            next_datetime = None

        return next_datetime
Esempio n. 11
0
    def _recurrence_end(self):
        """
            Determine a reasonable end date for infinitely recurring events
        """
        rrule = self.event.recurrenceRule()
        if rrule.isValid() and rrule.count() < 0 and not rrule.end().isValid():
            now = datetime.datetime.now()
            switch = {
                kolabformat.RecurrenceRule.Yearly: 100,
                kolabformat.RecurrenceRule.Monthly: 20
            }
            intvl = switch[rrule.frequency()] if rrule.frequency() in switch else 10
            return self.get_start().replace(year=now.year + intvl)

        return xmlutils.from_cdatetime(rrule.end(), True)
Esempio n. 12
0
    def to_dict(self):
        if not self.isValid():
            return None

        data = dict()

        for p, getter in self.properties_map.iteritems():
            val = None
            if hasattr(self, getter):
                val = getattr(self, getter)()
            if isinstance(val, kolabformat.cDateTime):
                val = xmlutils.from_cdatetime(val, True)
            elif isinstance(val, kolabformat.vectori):
                val = [int(x) for x in val]
            elif isinstance(val, kolabformat.vectors):
                val = [str(x) for x in val]

            if val is not None:
                data[p] = val

        return data
Esempio n. 13
0
    def to_dict(self):
        if not self.isValid() or self.frequency() == kolabformat.RecurrenceRule.FreqNone:
            return None

        data = dict()

        for p, getter in self.properties_map.iteritems():
            val = None
            args = {}
            if hasattr(self, getter):
                if getter.startswith('get_'):
                    args = dict(translated=True)
            if hasattr(self, getter):
                val = getattr(self, getter)(**args)
            if isinstance(val, kolabformat.cDateTime):
                val = xmlutils.from_cdatetime(val, True)
            elif isinstance(val, kolabformat.vectori):
                val = ",".join([int(v) for x in val])
            elif isinstance(val, kolabformat.vectordaypos):
                val = ",".join(["%s%s" % (str(x.occurence()) if x.occurence() != 0 else '', self._translate_value(x.weekday(), self.weekday_map)) for x in val])
            if val is not None:
                data[p] = val

        return data
Esempio n. 14
0
 def get_due(self):
     return xmlutils.from_cdatetime(self.event.due(), True)
Esempio n. 15
0
 def get_due(self):
     return xmlutils.from_cdatetime(self.event.due(), True)
Esempio n. 16
0
 def get_start(self):
     return xmlutils.from_cdatetime(self.event.start(), True)
Esempio n. 17
0
 def get_created(self):
     try:
         return xmlutils.from_cdatetime(self.created(), True)
     except ValueError:
         return datetime.datetime.now()
Esempio n. 18
0
 def get_exception_dates(self):
     return map(lambda _: xmlutils.from_cdatetime(_, True), self.event.exceptionDates())
Esempio n. 19
0
 def get_created(self):
     try:
         return xmlutils.from_cdatetime(self.event.created(), True)
     except ValueError:
         return datetime.datetime.now()