File size: 6,779 Bytes
550665c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
from datetime import date, datetime
from tzlocal import get_localzone_name
from gcsa.event import Event
from .base_serializer import BaseSerializer
from .attachment_serializer import AttachmentSerializer
from .attendee_serializer import AttendeeSerializer
from .conference_serializer import ConferenceSolutionSerializer, ConferenceSolutionCreateRequestSerializer
from .person_serializer import PersonSerializer
from .reminder_serializer import ReminderSerializer
from ..conference import ConferenceSolution, ConferenceSolutionCreateRequest
class EventSerializer(BaseSerializer):
type_ = Event
def __init__(self, event):
super().__init__(event)
@classmethod
def _to_json(cls, event: Event):
data = {
'id': event.event_id,
'summary': event.summary,
'description': event.description,
'location': event.location,
'recurrence': event.recurrence,
'colorId': event.color_id,
'visibility': event.visibility,
'attendees': [AttendeeSerializer.to_json(a) for a in event.attendees],
'guestsCanInviteOthers': event.guests_can_invite_others,
'guestsCanModify': event.guests_can_modify,
'guestsCanSeeOtherGuests': event.guests_can_see_other_guests,
'transparency': event.transparency,
'attachments': [AttachmentSerializer.to_json(a) for a in event.attachments],
**event.other
}
if isinstance(event.start, datetime) and isinstance(event.end, datetime):
data['start'] = {
'dateTime': event.start.isoformat(),
'timeZone': event.timezone
}
data['end'] = {
'dateTime': event.end.isoformat(),
'timeZone': event.timezone
}
elif isinstance(event.start, date) and isinstance(event.end, date):
data['start'] = {'date': event.start.isoformat()}
data['end'] = {'date': event.end.isoformat()}
data['reminders'] = {
'useDefault': event.default_reminders
}
if event.reminders:
data['reminders']['overrides'] = [
ReminderSerializer.to_json(r.convert_to_relative(event.start))
for r in event.reminders
]
if event.conference_solution is not None:
if isinstance(event.conference_solution, ConferenceSolution):
data['conferenceData'] = ConferenceSolutionSerializer.to_json(event.conference_solution)
elif isinstance(event.conference_solution, ConferenceSolutionCreateRequest):
data['conferenceData'] = ConferenceSolutionCreateRequestSerializer.to_json(event.conference_solution)
data = EventSerializer._remove_empty_values(data)
return data
@staticmethod
def _to_object(json_event):
timezone = None
start = None
start_data = json_event.pop('start', None)
if start_data is not None:
if 'date' in start_data:
start = EventSerializer._get_datetime_from_string(start_data['date']).date()
else:
start = EventSerializer._get_datetime_from_string(start_data['dateTime'])
timezone = start_data.get('timeZone', get_localzone_name())
end = None
end_data = json_event.pop('end', None)
if end_data is not None:
if 'date' in end_data:
end = EventSerializer._get_datetime_from_string(end_data['date']).date()
else:
end = EventSerializer._get_datetime_from_string(end_data['dateTime'])
updated = json_event.pop('updated', None)
if updated:
updated = EventSerializer._get_datetime_from_string(updated)
created = json_event.pop('created', None)
if created:
created = EventSerializer._get_datetime_from_string(created)
attendees_json = json_event.pop('attendees', [])
attendees = [AttendeeSerializer.to_object(a) for a in attendees_json]
reminders_json = json_event.pop('reminders', {})
reminders = [ReminderSerializer.to_object(r) for r in reminders_json.get('overrides', [])]
attachments_json = json_event.pop('attachments', [])
attachments = [AttachmentSerializer.to_object(a) for a in attachments_json]
conference_data = json_event.pop('conferenceData', None)
if conference_data is not None:
create_request = conference_data.get('createRequest', {})
if create_request is None or create_request.get('status', {}).get('statusCode', None) in (None, 'success'):
conference_solution = ConferenceSolutionSerializer.to_object(conference_data)
else:
conference_solution = ConferenceSolutionCreateRequestSerializer.to_object(conference_data)
else:
conference_solution = None
creator_data = json_event.pop('creator', None)
if creator_data is not None:
creator = PersonSerializer.to_object(creator_data)
else:
creator = None
organizer_data = json_event.pop('organizer', None)
if organizer_data is not None:
organizer = PersonSerializer.to_object(organizer_data)
else:
organizer = None
return Event(
json_event.pop('summary', None),
start=start,
end=end,
timezone=timezone,
event_id=json_event.pop('id', None),
description=json_event.pop('description', None),
location=json_event.pop('location', None),
recurrence=json_event.pop('recurrence', None),
color_id=json_event.pop('colorId', None),
visibility=json_event.pop('visibility', None),
attendees=attendees,
attachments=attachments,
reminders=reminders,
conference_solution=conference_solution,
default_reminders=reminders_json.pop('useDefault', False),
guests_can_invite_others=json_event.pop('guestsCanInviteOthers', True),
guests_can_modify=json_event.pop('guestsCanModify', False),
guests_can_see_other_guests=json_event.pop('guestsCanSeeOtherGuests', True),
transparency=json_event.pop('transparency', None),
_creator=creator,
_organizer=organizer,
_created=created,
_updated=updated,
_recurring_event_id=json_event.pop('recurringEventId', None),
**json_event
)
|