def _process(self, from_, include, limit): categories = get_related_categories(self.user) categories_events = [] if categories: category_ids = {c['categ'].id for c in categories.values()} categories_events = get_events_in_categories(category_ids, self.user, limit=limit) linked_events = get_linked_events( self.user, from_, limit=limit, load_also=('description', 'own_room_id', 'own_venue_id', 'own_room_name', 'own_venue_name')) all_events = set() if 'linked' in include: all_events |= set(linked_events) if 'categories' in include: all_events |= set(categories_events) all_events = sorted(all_events, key=lambda e: (e.start_dt, e.id))[:limit] response = { 'results': [ serialize_event_for_ical(event, 'events') for event in all_events ] } serializer = Serializer.create('ics') return send_file('event.ics', BytesIO(serializer(response)), 'text/calendar')
class RHExportDashboardICS(RHProtected): def _get_user(self): return session.user @use_kwargs({ 'from_': HumanizedDate(data_key='from', load_default=lambda: now_utc(False) - relativedelta(weeks=1)), 'include': fields.List(fields.Str(), load_default={'linked', 'categories'}), 'limit': fields.Integer(load_default=100, validate=lambda v: 0 < v <= 500) }, location='query') def _process(self, from_, include, limit): user = self._get_user() all_events = set() if 'linked' in include: all_events |= set(get_linked_events( user, from_, limit=limit, load_also=('description', 'own_room_id', 'own_venue_id', 'own_room_name', 'own_venue_name') )) if 'categories' in include and (categories := get_related_categories(user)): category_ids = {c['categ'].id for c in categories.values()} all_events |= set(get_events_in_categories(category_ids, user, limit=limit)) all_events = sorted(all_events, key=lambda e: (e.start_dt, e.id))[:limit] response = {'results': [serialize_event_for_ical(event) for event in all_events]} serializer = Serializer.create('ics') return send_file('event.ics', BytesIO(serializer(response)), 'text/calendar')
def _process(self): detail_level = request.args.get('detail', 'events') data = { 'results': serialize_event_for_ical(self.event_new, detail_level) } serializer = Serializer.create('ics') return send_file('event.ics', BytesIO(serializer(data)), 'text/calendar')
def _process(self): detail_level = request.args.get('detail', 'events') data = serialize_event_for_ical(self.event, detail_level) # check whether the plugins want to add/override any data for update in values_from_signal( signals.event.metadata_postprocess.send('ical-export', event=self.event, data=data), as_list=True): data.update(update) response = {'results': data} serializer = Serializer.create('ics') return send_file('event.ics', BytesIO(serializer(response)), 'text/calendar')
def getAllowedFormats(cls): return Serializer.getAllFormats()
class UserRelatedEventFetcher(IteratedDataFetcher): DETAIL_INTERFACES = { 'basic_events': IBasicConferenceMetadataFossil } def __init__(self, aw, hook, roles): super(UserRelatedEventFetcher, self).__init__(aw, hook) self._roles = roles def _postprocess(self, obj, fossil, iface): fossil['roles'] = list(self._roles[obj.getId()]) return fossil def events(self, eventIds): ch = ConferenceHolder() def _iterate_objs(objIds): for objId in objIds: obj = ch.getById(objId, True) if obj is not None: yield obj return self._process(_iterate_objs(eventIds)) Serializer.register('html', HTML4Serializer) Serializer.register('jsonp', JSONPSerializer) Serializer.register('ics', ICalSerializer) Serializer.register('atom', AtomSerializer)
if rel == 'abs': return tz.localize(value) if not value.tzinfo else value elif rel == 'ctx' and type(value) == timedelta: value = now_utc() + value # from here on, 'value' has to be a datetime if ctx == 'from': return tz.localize(value.combine(value.date(), time(0, 0, 0))) else: return tz.localize(value.combine(value.date(), time(23, 59, 59))) class IteratedDataFetcher(DataFetcher): def __init__(self, user, hook): super(IteratedDataFetcher, self).__init__(user, hook) self._tz = hook._tz self._offset = hook._offset self._limit = hook._limit self._detail = hook._detail self._orderBy = hook._orderBy self._descending = hook._descending self._fromDT = hook._fromDT self._toDT = hook._toDT Serializer.register('html', HTML4Serializer) Serializer.register('jsonp', JSONPSerializer) Serializer.register('ics', ICalSerializer) Serializer.register('atom', AtomSerializer)
def _process(self): detail_level = request.args.get('detail', 'events') data = {'results': serialize_event_for_ical(self.event, detail_level)} serializer = Serializer.create('ics') return send_file('event.ics', BytesIO(serializer(data)), 'text/calendar')
# Skip offset elements - http://docs.python.org/library/itertools.html#recipes next(itertools.islice(sortedIterator, offset, offset), None) return sortedIterator def _postprocess(self, obj, fossil, iface): return fossil def _makeFossil(self, obj, iface): return fossilize( obj, iface, tz=self._tz, naiveTZ=self._serverTZ, filters={"access": self._userAccessFilter}, mapClassType={"AcceptedContribution": "Contribution"}, ) def _process(self, iterator, filter=None, iface=None): if iface is None: iface = self.DETAIL_INTERFACES.get(self._detail) if iface is None: raise HTTPAPIError("Invalid detail level: %s" % self._detail, 400) for obj in self._iterateOver(iterator, self._offset, self._limit, self._orderBy, self._descending, filter): yield self._postprocess(obj, self._makeFossil(obj, iface), iface) Serializer.register("html", HTML4Serializer) Serializer.register("jsonp", JSONPSerializer) Serializer.register("ics", ICalSerializer) Serializer.register("atom", AtomSerializer)