File size: 2,942 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
from gcsa.free_busy import FreeBusy, TimeRange
from gcsa.serializers.base_serializer import BaseSerializer


class FreeBusySerializer(BaseSerializer):
    type_ = FreeBusy

    def __init__(self, free_busy):
        super().__init__(free_busy)

    @staticmethod
    def _to_json(free_busy: FreeBusy):
        """Isn't used as free busy data is read-only"""
        free_busy_json = {
            'calendars': {
                c: {
                    'busy': [
                        {
                            'start': start.isoformat(),
                            'end': end.isoformat(),
                        }
                        for start, end in free_busy.calendars.get(c, [])
                    ],
                    'errors': free_busy.calendars_errors.get(c, [])
                }
                for c in {**free_busy.calendars, **free_busy.calendars_errors}
            },
            'groups': {
                g: {
                    'calendars': free_busy.groups.get(g, []),
                    'errors': free_busy.groups_errors.get(g, [])
                }
                for g in {**free_busy.groups, **free_busy.groups_errors}
            },
            'timeMin': free_busy.time_min.isoformat(),
            'timeMax': free_busy.time_max.isoformat(),

        }
        return free_busy_json

    @staticmethod
    def _to_object(json_):
        time_min = FreeBusySerializer._get_datetime_from_string(json_['timeMin'])
        time_max = FreeBusySerializer._get_datetime_from_string(json_['timeMax'])
        groups_json = json_.get('groups')
        calendars_json = json_.get("calendars")

        if groups_json:
            groups = {gn: g['calendars'] for gn, g in groups_json.items() if g.get('calendars')}
            groups_errors = {gn: g['errors'] for gn, g in groups_json.items() if g.get('errors')}
        else:
            groups = {}
            groups_errors = {}

        if calendars_json:
            calendars = {
                cn: list(map(FreeBusySerializer._make_time_range, c['busy']))
                for cn, c in calendars_json.items() if c.get('busy') and not c.get('errors')
            }
            calendars_errors = {
                cn: c['errors']
                for cn, c in calendars_json.items() if c.get('errors')
            }
        else:
            calendars = {}
            calendars_errors = {}

        return FreeBusy(
            time_min=time_min,
            time_max=time_max,
            groups=groups,
            calendars=calendars,
            groups_errors=groups_errors,
            calendars_errors=calendars_errors
        )

    @staticmethod
    def _make_time_range(tp):
        return TimeRange(
            start=FreeBusySerializer._get_datetime_from_string(tp['start']),
            end=FreeBusySerializer._get_datetime_from_string(tp['end'])
        )