def get_upcoming_events(): """Get the global list of upcoming events""" from indico.modules.events import Event data = upcoming_events_settings.get_all() if not data['max_entries'] or not data['entries']: return tz = timezone(config.DEFAULT_TIMEZONE) now = now_utc(False).astimezone(tz) base_query = (Event.query .filter(Event.effective_protection_mode == ProtectionMode.public, ~Event.is_deleted, Event.end_dt.astimezone(tz) > now) .options(load_only('id', 'title', 'start_dt', 'end_dt'))) queries = [] cols = {'category': Event.category_id, 'event': Event.id} for entry in data['entries']: delta = timedelta(days=entry['days']) query = (base_query .filter(cols[entry['type']] == entry['id']) .filter(db.cast(Event.start_dt.astimezone(tz), db.Date) > (now - delta).date()) .with_entities(Event, db.literal(entry['weight']).label('weight'))) queries.append(query) query = (queries[0].union(*queries[1:]) .order_by(db.desc('weight'), Event.start_dt, Event.title) .limit(data['max_entries'])) for row in query: event = row[0] # we cache the result of the function and is_deleted is used in the repr # and having a broken repr on the cached objects would be ugly set_committed_value(event, 'is_deleted', False) yield event
def get_upcoming_events(): """Get the global list of upcoming events""" from indico.modules.events import Event data = upcoming_events_settings.get_all() if not data['max_entries'] or not data['entries']: return tz = timezone(config.DEFAULT_TIMEZONE) now = now_utc(False).astimezone(tz) base_query = (Event.query .filter(Event.effective_protection_mode == ProtectionMode.public, ~Event.is_deleted, Event.end_dt.astimezone(tz) > now) .options(load_only('id', 'title', 'start_dt', 'end_dt'))) queries = [] predicates = {'category': lambda id_: Event.category_id == id_, 'category_tree': lambda id_: Event.category_chain_overlaps(id_) & Event.is_visible_in(id_), 'event': lambda id_: Event.id == id_} for entry in data['entries']: delta = timedelta(days=entry['days']) query = (base_query .filter(predicates[entry['type']](entry['id'])) .filter(db.cast(Event.start_dt.astimezone(tz), db.Date) > (now - delta).date()) .with_entities(Event, db.literal(entry['weight']).label('weight'))) queries.append(query) query = (queries[0].union(*queries[1:]) .order_by(db.desc('weight'), Event.start_dt, Event.title) .limit(data['max_entries'])) for row in query: event = row[0] # we cache the result of the function and is_deleted is used in the repr # and having a broken repr on the cached objects would be ugly set_committed_value(event, 'is_deleted', False) yield event
def _iter_allowed_rooms(self): query = (db.session.query(VCRoom, func.count(VCRoomEventAssociation.id).label('event_count')) .filter(func.lower(VCRoom.name).contains(self.query.lower()), VCRoom.status != VCRoomStatus.deleted, VCRoom.type == self.plugin.service_name) .join(VCRoomEventAssociation) .group_by(VCRoom.id) .order_by(db.desc('event_count')) .limit(10)) return ((room, count) for room, count in query if room.plugin.can_manage_vc_room(session.avatar, room))
def _iter_allowed_rooms(self): query = (db.session.query(VCRoom, func.count(VCRoomEventAssociation.id).label('event_count')) .filter(func.lower(VCRoom.name).contains(self.query.lower()), VCRoom.status != VCRoomStatus.deleted, VCRoom.type == self.plugin.service_name) .join(VCRoomEventAssociation) # Plugins might add eager-loaded extensions to the table - since we cannot group by them # we need to make sure everything is lazy-loaded here. .options(lazyload(r) for r in inspect(VCRoom).relationships.keys()) .group_by(VCRoom.id) .order_by(db.desc('event_count')) .limit(10)) return ((room, count) for room, count in query if room.plugin.can_manage_vc_room(session.user, room))