__all__ = [
'MeetingRequest',
]
import datetime
import functools
import json
from typing import Optional
from ..constants import HEADER_FORMAT_TYPE, ps
from .meeting_related import MeetingRelated
from ..enums import BusyStatus, MeetingObjectChange, MeetingType, RecurCalendarType, RecurPatternType, ResponseStatus
class MeetingRequest(MeetingRelated):
"""
Class for handling Meeting Request and Meeting Update objects.
"""
def getJson(self) -> str:
meetingStatusString = {
ResponseStatus.NONE: None,
ResponseStatus.ORGANIZED: 'Meeting organizer',
ResponseStatus.TENTATIVE: 'Tentatively accepted',
ResponseStatus.ACCEPTED: 'Accepted',
ResponseStatus.DECLINED: 'Declined',
ResponseStatus.NOT_RESPONDED: 'Not yet responded',
}[self.responseStatus]
# Get the recurrence string.
recur = '(none)'
if self.appointmentRecur:
recur = {
RecurPatternType.DAY: 'Daily',
RecurPatternType.WEEK: 'Weekly',
RecurPatternType.MONTH: 'Monthly',
RecurPatternType.MONTH_NTH: 'Monthly',
RecurPatternType.MONTH_END: 'Monthly',
RecurPatternType.HJ_MONTH: 'Monthly',
RecurPatternType.HJ_MONTH_NTH: 'Monthly',
RecurPatternType.HJ_MONTH_END: 'Monthly',
}[self.appointmentRecur.patternType]
return json.dumps({
'recurrence': recur,
'recurrencePattern': self.recurrencePattern,
'body': self.body,
'meetingStatus': meetingStatusString,
'organizer': self.organizer,
'requiredAttendees': self.to,
'optionalAttendees': self.cc,
'resources': self.bcc,
'start': self.startDate.__format__(self.datetimeFormat) if self.endDate else None,
'end': self.endDate.__format__(self.datetimeFormat) if self.endDate else None,
})
@functools.cached_property
def appointmentMessageClass(self) -> Optional[str]:
"""
Indicates the value of the PidTagMessageClass property of the Meeting
object that is to be generated from the Meeting Request object. MUST
start with "IPM.Appointment".
"""
return self.getNamedProp('0024', ps.PSETID_MEETING)
@functools.cached_property
def calendarType(self) -> Optional[RecurCalendarType]:
"""
The value of the CalendarType field from the PidLidAppointmentRecur
property if the Meeting Request object represents a recurring series or
an exception.
"""
return self.getNamedAs('001C', ps.PSETID_MEETING, RecurCalendarType)
@functools.cached_property
def changeHighlight(self) -> Optional[MeetingObjectChange]:
"""
Soecifies a bit field that indicates how the Meeting object has been
changed.
Returns a union of the set flags.
"""
return self.getNamedAs('8204', ps.PSETID_APPOINTMENT, MeetingObjectChange)
@functools.cached_property
def forwardInstance(self) -> bool:
"""
Indicates that the Meeting Request object represents an exception to a
recurring series, and it was forwarded (even when forwarded by the
organizer) rather than being an invitation sent by the organizer.
"""
return bool(self.getNamedProp('820A', ps.PSETID_APPOINTMENT))
@property
def headerFormatProperties(self) -> HEADER_FORMAT_TYPE:
meetingStatusString = {
ResponseStatus.NONE: None,
ResponseStatus.ORGANIZED: 'Meeting organizer',
ResponseStatus.TENTATIVE: 'Tentatively accepted',
ResponseStatus.ACCEPTED: 'Accepted',
ResponseStatus.DECLINED: 'Declined',
ResponseStatus.NOT_RESPONDED: 'Not yet responded',
}[self.responseStatus]
# Get the recurrence string.
recur = '(none)'
if self.appointmentRecur:
recur = {
RecurPatternType.DAY: 'Daily',
RecurPatternType.WEEK: 'Weekly',
RecurPatternType.MONTH: 'Monthly',
RecurPatternType.MONTH_NTH: 'Monthly',
RecurPatternType.MONTH_END: 'Monthly',
RecurPatternType.HJ_MONTH: 'Monthly',
RecurPatternType.HJ_MONTH_NTH: 'Monthly',
RecurPatternType.HJ_MONTH_END: 'Monthly',
}[self.appointmentRecur.patternType]
showTime = None if self.appointmentNotAllowPropose else 'Tentative'
return {
'-main info-': {
'Subject': self.subject,
'Location': self.location,
},
'-date-': {
'Start': self.startDate.__format__(self.datetimeFormat) if self.startDate else None,
'End': self.endDate.__format__(self.datetimeFormat) if self.endDate else None,
'Show Time As': showTime,
},
'-recurrence-': {
'Recurrance': recur,
'Recurrence Pattern': self.recurrencePattern,
},
'-status-': {
'Meeting Status': meetingStatusString,
},
'-attendees-': {
'Organizer': self.organizer,
'Required Attendees': self.to,
'Optional Attendees': self.cc,
'Resources': self.bcc,
},
'-importance-': {
'Importance': self.importanceString,
},
}
@functools.cached_property
def intendedBusyStatus(self) -> Optional[BusyStatus]:
"""
The value of the busyStatus on the Meeting object in the organizer's
calendar at the time the Meeting Request object or Meeting Update object
was sent.
"""
return self.getNamedAs('8224', ps.PSETID_APPOINTMENT, BusyStatus)
@functools.cached_property
def meetingType(self) -> Optional[MeetingType]:
"""
The type of Meeting Request object or Meeting Update object.
"""
return self.getNamedAs('0026', ps.PSETID_MEETING, MeetingType)
@functools.cached_property
def oldLocation(self) -> Optional[str]:
"""
The original value of the location property before a meeting update.
"""
return self.getNamedProp('0028', ps.PSETID_MEETING)
@functools.cached_property
def oldWhenEndWhole(self) -> Optional[datetime.datetime]:
"""
The original value of the appointmentEndWhole property before a meeting
update.
"""
return self.getNamedProp('002A', ps.PSETID_MEETING)
@functools.cached_property
def oldWhenStartWhole(self) -> Optional[datetime.datetime]:
"""
The original value of the appointmentStartWhole property before a
meeting update.
"""
return self.getNamedProp('0029', ps.PSETID_MEETING)