faori's picture
Upload folder using huggingface_hub
550665c verified
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
)