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
        )