Skip to content

Commit

Permalink
Merge pull request #7 from txstate/master
Browse files Browse the repository at this point in the history
Addition of Folders and more...
  • Loading branch information
Rachel Sanders committed May 27, 2014
2 parents 8e9887f + b55789f commit d9d7e44
Show file tree
Hide file tree
Showing 13 changed files with 1,363 additions and 92 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,7 @@ nosetests.xml
.idea/

# damn you emacs
*~
*~

# vim
*.swp
18 changes: 15 additions & 3 deletions pyexchange/base/calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@

class BaseExchangeCalendarService(object):

def __init__(self, service):
def __init__(self, service, calendar_id):
self.service = service
self.calendar_id = calendar_id

def event(self, id, *args, **kwargs):
raise NotImplementedError
Expand All @@ -45,6 +46,7 @@ class BaseExchangeCalendarEvent(object):
_change_key = None # Exchange requires a second key when updating/deleting the event

service = None
calendar_id = None

subject = u''
start = None
Expand All @@ -54,6 +56,8 @@ class BaseExchangeCalendarEvent(object):
text_body = None
attachments = None
organizer = None
reminder_minutes_before_start = None
is_all_day = None

_attendees = {} # people attending
_resources = {} # conference rooms attending
Expand All @@ -62,10 +66,12 @@ class BaseExchangeCalendarEvent(object):
_dirty_attributes = set() # any attributes that have changed, and we need to update in Exchange

# these attributes can be pickled, or output as JSON
DATA_ATTRIBUTES = [u'_id', u'subject', u'start', u'end', u'location', u'html_body', u'text_body', u'organizer', u'_attendees', u'_resources']
DATA_ATTRIBUTES = [u'_id', u'subject', u'start', u'end', u'location', u'html_body', u'text_body', u'organizer',
u'_attendees', u'_resources', u'reminder_minutes_before_start', u'is_all_day']

def __init__(self, service, id=None, **kwargs):
def __init__(self, service, id=None, calendar_id=u'calendar', **kwargs):
self.service = service
self.calendar_id = calendar_id

if id is None:
self._update_properties(kwargs)
Expand Down Expand Up @@ -278,6 +284,12 @@ def validate(self):
if self.end < self.start:
raise ValueError("End date is after start date")

if self.reminder_minutes_before_start and not isinstance(self.reminder_minutes_before_start, int):
raise TypeError("reminder_minutes_before_start must be of type int")

if self.is_all_day and not isinstance(self.is_all_day, bool):
raise TypeError("is_all_day must be of type bool")

def create(self):
raise NotImplementedError

Expand Down
104 changes: 104 additions & 0 deletions pyexchange/base/folder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
class BaseExchangeFolderService(object):

def __init__(self, service):
self.service = service

def get_folder(self, id, *args, **kwargs):
raise NotImplementedError


class BaseExchangeFolder(object):

_id = None
_change_key = None
_parent_id = None
_parent_change_key = None
_folder_type = u'Folder'

_service = None

_display_name = u''
_child_folder_count = None
_total_count = None

_track_dirty_attributes = False
_dirty_attributes = set() # any attributes that have changed, and we need to update in Exchange

FOLDER_TYPES = (u'Folder', u'CalendarFolder', u'ContactsFolder', u'SearchFolder', u'TasksFolder')

def __init__(self, service, id=None, xml=None, **kwargs):
self.service = service

if xml is not None:
self._init_from_xml(xml)
elif id is None:
self._update_properties(kwargs)
else:
self._init_from_service(id)

def _init_from_xml(self, xml):
raise NotImplementedError

def _init_from_service(self, id):
raise NotImplementedError

def create(self):
raise NotImplementedError

def update(self):
raise NotImplementedError

def delete(self):
raise NotImplementedError

@property
def id(self):
""" **Read-only.** The internal id Exchange uses to refer to this folder. """
return self._id

@property
def change_key(self):
""" **Read-only.** When you change an folder, Exchange makes you pass a change key to prevent overwriting a previous version. """
return self._change_key

@property
def parent_id(self):
""" **Read-only.** The internal id Exchange uses to refer to the parent folder. """
return self._parent_id

@parent_id.setter
def parent_id(self, value):
self._parent_id = value

@property
def folder_type(self):
return self._folder_type

@folder_type.setter
def folder_type(self, value):
if value in self.FOLDER_TYPES:
self._folder_type = value

def _update_properties(self, properties):
self._track_dirty_attributes = False
for key in properties:
setattr(self, key, properties[key])
self._track_dirty_attributes = True

def __setattr__(self, key, value):
""" Magically track public attributes, so we can track what we need to flush to the Exchange store """
if self._track_dirty_attributes and not key.startswith(u"_"):
self._dirty_attributes.add(key)

object.__setattr__(self, key, value)

def _reset_dirty_attributes(self):
self._dirty_attributes = set()

def validate(self):
""" Validates that all required fields are present """
if not self.display_name:
raise ValueError("Folder has no display_name")

if not self.parent_id:
raise ValueError("Folder has no parent_id")
Loading

0 comments on commit d9d7e44

Please sign in to comment.