Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
BooleanField('can_create_subfolders', field_uri='CanCreateSubfolders', default=False),
BooleanField('is_folder_owner', field_uri='IsFolderOwner', default=False),
BooleanField('is_folder_visible', field_uri='IsFolderVisible', default=False),
BooleanField('is_folder_contact', field_uri='IsFolderContact', default=False),
ChoiceField('edit_items', field_uri='EditItems', choices=PERMISSION_ENUM, default='None'),
ChoiceField('delete_items', field_uri='DeleteItems', choices=PERMISSION_ENUM, default='None'),
ChoiceField('read_items', field_uri='ReadItems', choices={
Choice('None'), Choice('FullDetails')
}, default='None'),
EWSElementField('user_id', field_uri='UserId', value_cls=UserId, is_required=True)
]
__slots__ = tuple(f.name for f in FIELDS)
class CalendarPermission(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/calendarpermission"""
ELEMENT_NAME = 'Permission'
PERMISSION_ENUM = {Choice('None'), Choice('Owned'), Choice('All')}
FIELDS = [
ChoiceField('calendar_permission_level', field_uri='CalendarPermissionLevel', choices={
Choice('None'), Choice('Owner'), Choice('PublishingEditor'), Choice('Editor'), Choice('PublishingAuthor'),
Choice('Author'), Choice('NoneditingAuthor'), Choice('Reviewer'), Choice('Contributor'),
Choice('FreeBusyTimeOnly'), Choice('FreeBusyTimeAndSubjectAndLocation'), Choice('Custom')
}, default='None'),
] + Permission.FIELDS[1:]
__slots__ = tuple(f.name for f in FIELDS)
class PermissionSet(EWSElement):
class CalendarEvent(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/calendarevent"""
ELEMENT_NAME = 'CalendarEvent'
FIELDS = [
DateTimeField('start', field_uri='StartTime'),
DateTimeField('end', field_uri='EndTime'),
FreeBusyStatusField('busy_type', field_uri='BusyType', is_required=True, default='Busy'),
EWSElementField('details', field_uri='CalendarEventDetails', value_cls=CalendarEventDetails),
]
__slots__ = tuple(f.name for f in FIELDS)
class WorkingPeriod(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/workingperiod"""
ELEMENT_NAME = 'WorkingPeriod'
FIELDS = [
EnumListField('weekdays', field_uri='DayOfWeek', enum=WEEKDAY_NAMES, is_required=True),
TimeField('start', field_uri='StartTimeInMinutes', is_required=True),
TimeField('end', field_uri='EndTimeInMinutes', is_required=True),
]
__slots__ = tuple(f.name for f in FIELDS)
class FreeBusyView(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/freebusyview"""
ELEMENT_NAME = 'FreeBusyView'
NAMESPACE = MNS
FIELDS = [
IdField('id', field_uri=ItemId.ID_ATTR, is_required=True),
IdField('changekey', field_uri=ItemId.CHANGEKEY_ATTR),
MailboxField('mailbox'),
]
__slots__ = ('mailbox',)
def clean(self, version=None):
from .folders import PublicFoldersRoot
super(DistinguishedFolderId, self).clean(version=version)
if self.id == PublicFoldersRoot.DISTINGUISHED_FOLDER_ID:
# Avoid "ErrorInvalidOperation: It is not valid to specify a mailbox with the public folder root" from EWS
self.mailbox = None
class TimeWindow(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/timewindow"""
ELEMENT_NAME = 'TimeWindow'
FIELDS = [
DateTimeField('start', field_uri='StartTime', is_required=True),
DateTimeField('end', field_uri='EndTime', is_required=True),
]
__slots__ = tuple(f.name for f in FIELDS)
class FreeBusyViewOptions(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/freebusyviewoptions"""
ELEMENT_NAME = 'FreeBusyViewOptions'
REQUESTED_VIEWS = {'MergedOnly', 'FreeBusy', 'FreeBusyMerged', 'Detailed', 'DetailedMerged'}
FIELDS = [
EWSElementField('time_window', value_cls=TimeWindow, is_required=True),
)
class MessageHeader(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/internetmessageheader"""
ELEMENT_NAME = 'InternetMessageHeader'
FIELDS = [
TextField('name', field_uri='HeaderName', is_attribute=True),
SubField('value'),
]
__slots__ = tuple(f.name for f in FIELDS)
class ItemId(EWSElement):
"""'id' and 'changekey' are UUIDs generated by Exchange
MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/itemid
"""
ELEMENT_NAME = 'ItemId'
ID_ATTR = 'Id'
CHANGEKEY_ATTR = 'ChangeKey'
FIELDS = [
IdField('id', field_uri=ID_ATTR, is_required=True),
IdField('changekey', field_uri=CHANGEKEY_ATTR, is_required=False),
]
__slots__ = tuple(f.name for f in FIELDS)
def __init__(self, *args, **kwargs):
def from_mailbox(cls, mailbox):
if not isinstance(mailbox, Mailbox):
raise ValueError("'mailbox' %r must be a Mailbox instance" % mailbox)
return cls(name=mailbox.name, email_address=mailbox.email_address, routing_type=mailbox.routing_type)
class Email(AvailabilityMailbox):
"""Like AvailabilityMailbox, but with a different tag name
MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/email-emailaddresstype
"""
ELEMENT_NAME = 'Email'
__slots__ = tuple()
class MailboxData(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/mailboxdata"""
ELEMENT_NAME = 'MailboxData'
ATTENDEE_TYPES = {'Optional', 'Organizer', 'Required', 'Resource', 'Room'}
FIELDS = [
EmailField('email'),
ChoiceField('attendee_type', field_uri='AttendeeType', choices={Choice(c) for c in ATTENDEE_TYPES}),
BooleanField('exclude_conflicts', field_uri='ExcludeConflicts'),
]
__slots__ = tuple(f.name for f in FIELDS)
def __hash__(self):
# Exchange may add 'name' on insert. We're satisfied if the email address matches.
return hash((self.email.email_address.lower(), self.attendee_type, self.exclude_conflicts))
class DelegateUser(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/delegateuser"""
ELEMENT_NAME = 'DelegateUser'
NAMESPACE = MNS
FIELDS = [
EWSElementField('user_id', field_uri='UserId', value_cls=UserId),
EWSElementField('delegate_permissions', field_uri='DelegatePermissions', value_cls=DelegatePermissions),
BooleanField('receive_copies_of_meeting_messages', field_uri='ReceiveCopiesOfMeetingMessages', default=False),
BooleanField('view_private_items', field_uri='ViewPrivateItems', default=False),
]
__slots__ = tuple(f.name for f in FIELDS)
class SearchableMailbox(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/searchablemailbox"""
ELEMENT_NAME = 'SearchableMailbox'
FIELDS = [
CharField('guid', field_uri='Guid'),
EmailAddressField('primary_smtp_address', field_uri='PrimarySmtpAddress'),
BooleanField('is_external', field_uri='IsExternalMailbox'),
EmailAddressField('external_email', field_uri='ExternalEmailAddress'),
CharField('display_name', field_uri='DisplayName'),
BooleanField('is_membership_group', field_uri='IsMembershipGroup'),
CharField('reference_id', field_uri='ReferenceId'),
]
__slots__ = tuple(f.name for f in FIELDS)
FIELDS = [
MailboxField('mailbox', is_required=True),
ChoiceField('response_type', field_uri='ResponseType', choices={Choice(c) for c in RESPONSE_TYPES},
default='Unknown'),
DateTimeField('last_response_time', field_uri='LastResponseTime'),
]
__slots__ = tuple(f.name for f in FIELDS)
def __hash__(self):
# TODO: maybe take 'response_type' and 'last_response_time' into account?
return hash(self.mailbox)
class TimeZoneTransition(EWSElement):
"""Base class for StandardTime and DaylightTime classes"""
FIELDS = [
IntegerField('bias', field_uri='Bias', is_required=True), # Offset from the default bias, in minutes
TimeField('time', field_uri='Time', is_required=True),
IntegerField('occurrence', field_uri='DayOrder', is_required=True), # n'th occurrence of weekday in iso_month
IntegerField('iso_month', field_uri='Month', is_required=True),
EnumField('weekday', field_uri='DayOfWeek', enum=WEEKDAY_NAMES, is_required=True),
# 'Year' is not implemented yet
]
__slots__ = tuple(f.name for f in FIELDS)
@classmethod
def from_xml(cls, elem, account):
res = super(TimeZoneTransition, cls).from_xml(elem, account)
# Some parts of EWS use '5' to mean 'last occurrence in month', others use '-1'. Let's settle on '5' because
FIELDS = [
IdField('id', field_uri=ItemId.ID_ATTR, is_required=True),
IdField('changekey', field_uri=ItemId.CHANGEKEY_ATTR),
MailboxField('mailbox'),
]
__slots__ = ('mailbox',)
def clean(self, version=None):
super(DistinguishedFolderId, self).clean(version=version)
if self.id == PublicFoldersRoot.DISTINGUISHED_FOLDER_ID:
# Avoid "ErrorInvalidOperation: It is not valid to specify a mailbox with the public folder root" from EWS
self.mailbox = None
class CalendarView(EWSElement):
"""
MSDN: https://msdn.microsoft.com/en-US/library/office/aa564515%28v=exchg.150%29.aspx
"""
ELEMENT_NAME = 'CalendarView'
NAMESPACE = MNS
FIELDS = [
DateTimeField('start', field_uri='StartDate', is_required=True, is_attribute=True),
DateTimeField('end', field_uri='EndDate', is_required=True, is_attribute=True),
IntegerField('max_items', field_uri='MaxEntriesReturned', min=1, is_attribute=True),
]
__slots__ = tuple(f.name for f in FIELDS)
def clean(self, version=None):
super(CalendarView, self).clean(version=version)
# Avoid "ErrorInvalidOperation: It is not valid to specify a mailbox with the public folder root" from EWS
self.mailbox = None
class TimeWindow(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/timewindow"""
ELEMENT_NAME = 'TimeWindow'
FIELDS = [
DateTimeField('start', field_uri='StartTime', is_required=True),
DateTimeField('end', field_uri='EndTime', is_required=True),
]
__slots__ = tuple(f.name for f in FIELDS)
class FreeBusyViewOptions(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/freebusyviewoptions"""
ELEMENT_NAME = 'FreeBusyViewOptions'
REQUESTED_VIEWS = {'MergedOnly', 'FreeBusy', 'FreeBusyMerged', 'Detailed', 'DetailedMerged'}
FIELDS = [
EWSElementField('time_window', value_cls=TimeWindow, is_required=True),
# Interval value is in minutes
IntegerField('merged_free_busy_interval', field_uri='MergedFreeBusyIntervalInMinutes', min=6, max=1440,
default=30, is_required=True),
ChoiceField('requested_view', field_uri='RequestedView', choices={Choice(c) for c in REQUESTED_VIEWS},
is_required=True), # Choice('None') is also valid, but only for responses
]
__slots__ = tuple(f.name for f in FIELDS)
class Attendee(EWSElement):
from .ewsdatetime import UTC_NOW
from .fields import DateTimeField, MessageField, ChoiceField, Choice
from .properties import EWSElement, OutOfOffice
from .util import create_element, set_xml_value
class OofSettings(EWSElement):
"""MSDN: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/oofsettings"""
ELEMENT_NAME = 'OofSettings'
REQUEST_ELEMENT_NAME = 'UserOofSettings'
ENABLED = 'Enabled'
SCHEDULED = 'Scheduled'
DISABLED = 'Disabled'
FIELDS = [
ChoiceField('state', field_uri='OofState', is_required=True,
choices={Choice(ENABLED), Choice(SCHEDULED), Choice(DISABLED)}),
ChoiceField('external_audience', field_uri='ExternalAudience',
choices={Choice('None'), Choice('Known'), Choice('All')}, default='All'),
DateTimeField('start', field_uri='StartTime'),
DateTimeField('end', field_uri='EndTime'),
MessageField('internal_reply', field_uri='InternalReply'),
MessageField('external_reply', field_uri='ExternalReply'),