Changeset View
Changeset View
Standalone View
Standalone View
pykolab/xml/event.py
Show First 20 Lines • Show All 160 Lines • ▼ Show 20 Lines | def add_recurrence_date(self, _datetime): | ||||
if isinstance(_datetime, datetime.datetime): | if isinstance(_datetime, datetime.datetime): | ||||
# If no timezone information is passed on, make it UTC | # If no timezone information is passed on, make it UTC | ||||
if _datetime.tzinfo is None: | if _datetime.tzinfo is None: | ||||
_datetime = _datetime.replace(tzinfo=pytz.utc) | _datetime = _datetime.replace(tzinfo=pytz.utc) | ||||
valid_datetime = True | valid_datetime = True | ||||
if not valid_datetime: | if not valid_datetime: | ||||
raise InvalidEventDateError, _("Rdate needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime)) | raise InvalidEventDateError(_("Rdate needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime))) | ||||
self.event.addRecurrenceDate(xmlutils.to_cdatetime(_datetime, True)) | self.event.addRecurrenceDate(xmlutils.to_cdatetime(_datetime, True)) | ||||
def add_exception_date(self, _datetime): | def add_exception_date(self, _datetime): | ||||
valid_datetime = False | valid_datetime = False | ||||
if isinstance(_datetime, datetime.date): | if isinstance(_datetime, datetime.date): | ||||
valid_datetime = True | valid_datetime = True | ||||
if isinstance(_datetime, datetime.datetime): | if isinstance(_datetime, datetime.datetime): | ||||
# If no timezone information is passed on, make it UTC | # If no timezone information is passed on, make it UTC | ||||
if _datetime.tzinfo == None: | if _datetime.tzinfo == None: | ||||
_datetime = _datetime.replace(tzinfo=pytz.utc) | _datetime = _datetime.replace(tzinfo=pytz.utc) | ||||
valid_datetime = True | valid_datetime = True | ||||
if not valid_datetime: | if not valid_datetime: | ||||
raise InvalidEventDateError, _("Exdate needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime)) | raise InvalidEventDateError(_("Exdate needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime))) | ||||
self.event.addExceptionDate(xmlutils.to_cdatetime(_datetime, True)) | self.event.addExceptionDate(xmlutils.to_cdatetime(_datetime, True)) | ||||
def add_exception(self, exception): | def add_exception(self, exception): | ||||
recurrence_id = exception.get_recurrence_id() | recurrence_id = exception.get_recurrence_id() | ||||
if recurrence_id is None: | if recurrence_id is None: | ||||
raise EventIntegrityError, "Recurrence exceptions require a Recurrence-ID property" | raise EventIntegrityError("Recurrence exceptions require a Recurrence-ID property") | ||||
# check if an exception with the given recurrence-id already exists | # check if an exception with the given recurrence-id already exists | ||||
append = True | append = True | ||||
vexceptions = self.event.exceptions() | vexceptions = self.event.exceptions() | ||||
for i, ex in enumerate(self._exceptions): | for i, ex in enumerate(self._exceptions): | ||||
if ex.get_recurrence_id() == recurrence_id and ex.thisandfuture == exception.thisandfuture: | if ex.get_recurrence_id() == recurrence_id and ex.thisandfuture == exception.thisandfuture: | ||||
# update the existing exception | # update the existing exception | ||||
vexceptions[i] = exception.event | vexceptions[i] = exception.event | ||||
Show All 11 Lines | def add_exception(self, exception): | ||||
vexceptions.append(exception.event) | vexceptions.append(exception.event) | ||||
self._exceptions.append(exception) | self._exceptions.append(exception) | ||||
self.event.setExceptions(vexceptions) | self.event.setExceptions(vexceptions) | ||||
def del_exception(self, exception): | def del_exception(self, exception): | ||||
recurrence_id = exception.get_recurrence_id() | recurrence_id = exception.get_recurrence_id() | ||||
if recurrence_id is None: | if recurrence_id is None: | ||||
raise EventIntegrityError, "Recurrence exceptions require a Recurrence-ID property" | raise EventIntegrityError("Recurrence exceptions require a Recurrence-ID property") | ||||
updated = False | updated = False | ||||
vexceptions = self.event.exceptions() | vexceptions = self.event.exceptions() | ||||
for i, ex in enumerate(self._exceptions): | for i, ex in enumerate(self._exceptions): | ||||
if ex.get_recurrence_id() == recurrence_id and ex.thisandfuture == exception.thisandfuture: | if ex.get_recurrence_id() == recurrence_id and ex.thisandfuture == exception.thisandfuture: | ||||
del vexceptions[i] | del vexceptions[i] | ||||
del self._exceptions[i] | del self._exceptions[i] | ||||
updated = True | updated = True | ||||
▲ Show 20 Lines • Show All 167 Lines • ▼ Show 20 Lines | def get_attendee(self, attendee): | ||||
if isinstance(attendee, basestring): | if isinstance(attendee, basestring): | ||||
if attendee in [x.get_email() for x in self.get_attendees()]: | if attendee in [x.get_email() for x in self.get_attendees()]: | ||||
attendee = self.get_attendee_by_email(attendee) | attendee = self.get_attendee_by_email(attendee) | ||||
elif attendee in [x.get_name() for x in self.get_attendees()]: | elif attendee in [x.get_name() for x in self.get_attendees()]: | ||||
attendee = self.get_attendee_by_name(attendee) | attendee = self.get_attendee_by_name(attendee) | ||||
else: | else: | ||||
raise ValueError, _("No attendee with email or name %r") %(attendee) | raise ValueError(_("No attendee with email or name %r") %(attendee)) | ||||
return attendee | return attendee | ||||
elif isinstance(attendee, Attendee): | elif isinstance(attendee, Attendee): | ||||
return attendee | return attendee | ||||
else: | else: | ||||
raise ValueError, _("Invalid argument value attendee %r, must be basestring or Attendee") % (attendee) | raise ValueError(_("Invalid argument value attendee %r, must be basestring or Attendee") % (attendee)) | ||||
def find_attendee(self, attendee): | def find_attendee(self, attendee): | ||||
try: | try: | ||||
return self.get_attendee(attendee) | return self.get_attendee(attendee) | ||||
except: | except: | ||||
return None | return None | ||||
def get_attendee_by_email(self, email): | def get_attendee_by_email(self, email): | ||||
if email in [x.get_email() for x in self.get_attendees()]: | if email in [x.get_email() for x in self.get_attendees()]: | ||||
return [x for x in self.get_attendees() if x.get_email() == email][0] | return [x for x in self.get_attendees() if x.get_email() == email][0] | ||||
raise ValueError, _("No attendee with email %r") %(email) | raise ValueError(_("No attendee with email %r") %(email)) | ||||
def get_attendee_by_name(self, name): | def get_attendee_by_name(self, name): | ||||
if name in [x.get_name() for x in self.get_attendees()]: | if name in [x.get_name() for x in self.get_attendees()]: | ||||
return [x for x in self.get_attendees() if x.get_name() == name][0] | return [x for x in self.get_attendees() if x.get_name() == name][0] | ||||
raise ValueError, _("No attendee with name %r") %(name) | raise ValueError(_("No attendee with name %r") %(name)) | ||||
def get_attendees(self): | def get_attendees(self): | ||||
return self._attendees | return self._attendees | ||||
def get_categories(self): | def get_categories(self): | ||||
return [str(c) for c in self.event.categories()] | return [str(c) for c in self.event.categories()] | ||||
def get_classification(self): | def get_classification(self): | ||||
▲ Show 20 Lines • Show All 168 Lines • ▼ Show 20 Lines | class Event(object): | ||||
def get_ical_attendee_participant_status(self, attendee): | def get_ical_attendee_participant_status(self, attendee): | ||||
attendee = self.get_attendee(attendee) | attendee = self.get_attendee(attendee) | ||||
if attendee.get_participant_status() in attendee.participant_status_map.keys(): | if attendee.get_participant_status() in attendee.participant_status_map.keys(): | ||||
return attendee.get_participant_status() | return attendee.get_participant_status() | ||||
elif attendee.get_participant_status() in attendee.participant_status_map.values(): | elif attendee.get_participant_status() in attendee.participant_status_map.values(): | ||||
return [k for k, v in attendee.participant_status_map.iteritems() if v == attendee.get_participant_status()][0] | return [k for k, v in attendee.participant_status_map.iteritems() if v == attendee.get_participant_status()][0] | ||||
else: | else: | ||||
raise ValueError, _("Invalid participant status") | raise ValueError(_("Invalid participant status")) | ||||
def get_ical_created(self): | def get_ical_created(self): | ||||
return self.get_created() | return self.get_created() | ||||
def get_ical_dtend(self): | def get_ical_dtend(self): | ||||
dtend = self.get_end() | dtend = self.get_end() | ||||
# shift end by one day on all-day events | # shift end by one day on all-day events | ||||
if not hasattr(dtend, 'hour'): | if not hasattr(dtend, 'hour'): | ||||
▲ Show 20 Lines • Show All 189 Lines • ▼ Show 20 Lines | def merge_attendee_data(self, _attendees, append=True): | ||||
self.event.setAttendees(self._attendees) | self.event.setAttendees(self._attendees) | ||||
def set_classification(self, classification): | def set_classification(self, classification): | ||||
if classification in self.classification_map.keys(): | if classification in self.classification_map.keys(): | ||||
self.event.setClassification(self.classification_map[classification]) | self.event.setClassification(self.classification_map[classification]) | ||||
elif classification in self.classification_map.values(): | elif classification in self.classification_map.values(): | ||||
self.event.setClassification(classification) | self.event.setClassification(classification) | ||||
else: | else: | ||||
raise ValueError, _("Invalid classification %r") % (classification) | raise ValueError(_("Invalid classification %r") % (classification)) | ||||
def set_created(self, _datetime=None): | def set_created(self, _datetime=None): | ||||
if _datetime is None or isinstance(_datetime, datetime.time): | if _datetime is None or isinstance(_datetime, datetime.time): | ||||
_datetime = datetime.datetime.utcnow() | _datetime = datetime.datetime.utcnow() | ||||
self.event.setCreated(xmlutils.to_cdatetime(_datetime, False, True)) | self.event.setCreated(xmlutils.to_cdatetime(_datetime, False, True)) | ||||
def set_description(self, description): | def set_description(self, description): | ||||
Show All 14 Lines | def set_end(self, _datetime): | ||||
if isinstance(_datetime, datetime.datetime): | if isinstance(_datetime, datetime.datetime): | ||||
# If no timezone information is passed on, make it UTC | # If no timezone information is passed on, make it UTC | ||||
if _datetime.tzinfo == None: | if _datetime.tzinfo == None: | ||||
_datetime = _datetime.replace(tzinfo=pytz.utc) | _datetime = _datetime.replace(tzinfo=pytz.utc) | ||||
valid_datetime = True | valid_datetime = True | ||||
if not valid_datetime: | if not valid_datetime: | ||||
raise InvalidEventDateError, _("Event end needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime)) | raise InvalidEventDateError(_("Event end needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime))) | ||||
self.event.setEnd(xmlutils.to_cdatetime(_datetime, True)) | self.event.setEnd(xmlutils.to_cdatetime(_datetime, True)) | ||||
def set_exception_dates(self, _datetimes): | def set_exception_dates(self, _datetimes): | ||||
for _datetime in _datetimes: | for _datetime in _datetimes: | ||||
self.add_exception_date(_datetime) | self.add_exception_date(_datetime) | ||||
def set_recurrence_dates(self, _datetimes): | def set_recurrence_dates(self, _datetimes): | ||||
for _datetime in _datetimes: | for _datetime in _datetimes: | ||||
self.add_recurrence_date(_datetime) | self.add_recurrence_date(_datetime) | ||||
def add_custom_property(self, name, value): | def add_custom_property(self, name, value): | ||||
if not name.upper().startswith('X-'): | if not name.upper().startswith('X-'): | ||||
raise ValueError, _("Invalid custom property name %r") % (name) | raise ValueError(_("Invalid custom property name %r") % (name)) | ||||
props = self.event.customProperties() | props = self.event.customProperties() | ||||
props.append(kolabformat.CustomProperty(name.upper(), value)) | props.append(kolabformat.CustomProperty(name.upper(), value)) | ||||
self.event.setCustomProperties(props) | self.event.setCustomProperties(props) | ||||
def set_from_ical(self, attr, value): | def set_from_ical(self, attr, value): | ||||
attr = attr.replace('-', '') | attr = attr.replace('-', '') | ||||
ical_setter = 'set_ical_' + attr | ical_setter = 'set_ical_' + attr | ||||
▲ Show 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | def set_ical_rdate(self, rdate): | ||||
rdates.append(datetime) | rdates.append(datetime) | ||||
self.set_recurrence_dates(rdates) | self.set_recurrence_dates(rdates) | ||||
def set_ical_recurrenceid(self, value, params): | def set_ical_recurrenceid(self, value, params): | ||||
try: | try: | ||||
self.thisandfuture = params.get('RANGE', '') == 'THISANDFUTURE' | self.thisandfuture = params.get('RANGE', '') == 'THISANDFUTURE' | ||||
self.set_recurrence_id(value, self.thisandfuture) | self.set_recurrence_id(value, self.thisandfuture) | ||||
except InvalidEventDateError, e: | except InvalidEventDateError: | ||||
pass | pass | ||||
def set_lastmodified(self, _datetime=None): | def set_lastmodified(self, _datetime=None): | ||||
valid_datetime = False | valid_datetime = False | ||||
if isinstance(_datetime, datetime.date): | if isinstance(_datetime, datetime.date): | ||||
valid_datetime = True | valid_datetime = True | ||||
if isinstance(_datetime, datetime.datetime): | if isinstance(_datetime, datetime.datetime): | ||||
valid_datetime = True | valid_datetime = True | ||||
if _datetime is None or isinstance(_datetime, datetime.time): | if _datetime is None or isinstance(_datetime, datetime.time): | ||||
valid_datetime = True | valid_datetime = True | ||||
_datetime = datetime.datetime.utcnow() | _datetime = datetime.datetime.utcnow() | ||||
if not valid_datetime: | if not valid_datetime: | ||||
raise InvalidEventDateError, _("Event last-modified needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime)) | raise InvalidEventDateError(_("Event last-modified needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime))) | ||||
self.event.setLastModified(xmlutils.to_cdatetime(_datetime, False, True)) | self.event.setLastModified(xmlutils.to_cdatetime(_datetime, False, True)) | ||||
def set_location(self, location): | def set_location(self, location): | ||||
self.event.setLocation(ustr(location)) | self.event.setLocation(ustr(location)) | ||||
def set_organizer(self, email, name=None): | def set_organizer(self, email, name=None): | ||||
contactreference = ContactReference(email) | contactreference = ContactReference(email) | ||||
Show All 26 Lines | def set_start(self, _datetime): | ||||
if isinstance(_datetime, datetime.datetime): | if isinstance(_datetime, datetime.datetime): | ||||
# If no timezone information is passed on, make it UTC | # If no timezone information is passed on, make it UTC | ||||
if _datetime.tzinfo == None: | if _datetime.tzinfo == None: | ||||
_datetime = _datetime.replace(tzinfo=pytz.utc) | _datetime = _datetime.replace(tzinfo=pytz.utc) | ||||
valid_datetime = True | valid_datetime = True | ||||
if not valid_datetime: | if not valid_datetime: | ||||
raise InvalidEventDateError, _("Event start needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime)) | raise InvalidEventDateError(_("Event start needs datetime.date or datetime.datetime instance, got %r") % (type(_datetime))) | ||||
self.event.setStart(xmlutils.to_cdatetime(_datetime, True)) | self.event.setStart(xmlutils.to_cdatetime(_datetime, True)) | ||||
def set_status(self, status): | def set_status(self, status): | ||||
if status in self.status_map.keys(): | if status in self.status_map.keys(): | ||||
self.event.setStatus(self.status_map[status]) | self.event.setStatus(self.status_map[status]) | ||||
elif status in self.status_map.values(): | elif status in self.status_map.values(): | ||||
self.event.setStatus(status) | self.event.setStatus(status) | ||||
elif not status == kolabformat.StatusUndefined: | elif not status == kolabformat.StatusUndefined: | ||||
raise InvalidEventStatusError, _("Invalid status set: %r") % (status) | raise InvalidEventStatusError(_("Invalid status set: %r") % (status)) | ||||
def set_summary(self, summary): | def set_summary(self, summary): | ||||
self.event.setSummary(summary) | self.event.setSummary(summary) | ||||
def set_uid(self, uid): | def set_uid(self, uid): | ||||
self.uid = uid | self.uid = uid | ||||
self.event.setUid(str(uid)) | self.event.setUid(str(uid)) | ||||
def set_recurrence_id(self, _datetime, _thisandfuture=None): | def set_recurrence_id(self, _datetime, _thisandfuture=None): | ||||
valid_datetime = False | valid_datetime = False | ||||
if isinstance(_datetime, datetime.date): | if isinstance(_datetime, datetime.date): | ||||
valid_datetime = True | valid_datetime = True | ||||
if isinstance(_datetime, datetime.datetime): | if isinstance(_datetime, datetime.datetime): | ||||
# If no timezone information is passed on, use the one from event start | # If no timezone information is passed on, use the one from event start | ||||
if _datetime.tzinfo == None: | if _datetime.tzinfo == None: | ||||
_start = self.get_start() | _start = self.get_start() | ||||
_datetime = _datetime.replace(tzinfo=_start.tzinfo) | _datetime = _datetime.replace(tzinfo=_start.tzinfo) | ||||
valid_datetime = True | valid_datetime = True | ||||
if not valid_datetime: | if not valid_datetime: | ||||
raise InvalidEventDateError, _("Event recurrence-id needs datetime.datetime instance") | raise InvalidEventDateError(_("Event recurrence-id needs datetime.datetime instance")) | ||||
if _thisandfuture is None: | if _thisandfuture is None: | ||||
_thisandfuture = self.thisandfuture | _thisandfuture = self.thisandfuture | ||||
self.event.setRecurrenceID(xmlutils.to_cdatetime(_datetime), _thisandfuture) | self.event.setRecurrenceID(xmlutils.to_cdatetime(_datetime), _thisandfuture) | ||||
def set_transparency(self, transp): | def set_transparency(self, transp): | ||||
return self.event.setTransparency(transp) | return self.event.setTransparency(transp) | ||||
def __str__(self): | def __str__(self): | ||||
event_xml = kolabformat.writeEvent(self.event) | event_xml = kolabformat.writeEvent(self.event) | ||||
error = kolabformat.error() | error = kolabformat.error() | ||||
if error == None or not error: | if error == None or not error: | ||||
return event_xml | return event_xml | ||||
else: | else: | ||||
raise EventIntegrityError, kolabformat.errorMessage() | raise EventIntegrityError(kolabformat.errorMessage()) | ||||
def to_dict(self): | def to_dict(self): | ||||
data = dict() | data = dict() | ||||
for p, getter in self.properties_map.iteritems(): | for p, getter in self.properties_map.iteritems(): | ||||
val = None | val = None | ||||
if hasattr(self, getter): | if hasattr(self, getter): | ||||
val = getattr(self, getter)() | val = getattr(self, getter)() | ||||
▲ Show 20 Lines • Show All 389 Lines • Show Last 20 Lines |