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']) )