def conference_room_emails(): start_date, end_date = _get_start_end_date() date_filter = db.and_( db.cast(Reservation.start_dt, db.Date) >= start_date, db.cast(Reservation.start_dt, db.Date) <= end_date) start_dt = as_utc(datetime.combine(start_date, time())) end_dt = as_utc(datetime.combine(end_date, time())) events_by_room = {} for room in CERNCronjobsPlugin.settings.get('rooms'): query = (Event.query.filter(~Event.is_deleted, Event.happens_between(start_dt, end_dt), Event.own_room_id == room.id).order_by( Event.start_dt)) events_by_room[room] = _group_by_date(query) res_events_by_room = {} for room in CERNCronjobsPlugin.settings.get('reservation_rooms'): res_events_by_room[room] = _group_by_date( _get_reservations_query(date_filter, room_id=room.id)) category_ids = [ int(category['id']) for category in CERNCronjobsPlugin.settings.get('categories') ] committees = _get_category_events_query(start_dt, end_dt, category_ids) template = get_plugin_template_module( 'conference_room_email.html', events_by_room=events_by_room, res_events_by_room=res_events_by_room, committees_by_date=_group_by_date(committees)) recipients = CERNCronjobsPlugin.settings.get('conf_room_recipients') if recipients: _send_email(recipients, template)
def get_room_events(room, start_dt, end_dt, repeat_frequency, repeat_interval): occurrences = ReservationOccurrence.create_series(start_dt, end_dt, (repeat_frequency, repeat_interval)) excluded_categories = rb_settings.get('excluded_categories') return (Event.query .filter(~Event.is_deleted, Event.own_room == room, db.or_(Event.happens_between(as_utc(occ.start_dt), as_utc(occ.end_dt)) for occ in occurrences), Event.timezone == config.DEFAULT_TIMEZONE, db.and_(Event.category_id != cat['id'] for cat in excluded_categories), Event.acl_entries.any(db.and_(EventPrincipal.type == PrincipalType.user, EventPrincipal.user_id == session.user.id, EventPrincipal.full_access))) .all())
def get_room_events(room, start_dt, end_dt, repeat_frequency, repeat_interval): occurrences = ReservationOccurrence.create_series( start_dt, end_dt, (repeat_frequency, repeat_interval)) excluded_categories = rb_settings.get('excluded_categories') return (Event.query.filter( ~Event.is_deleted, Event.own_room == room, db.or_( Event.happens_between(as_utc(occ.start_dt), as_utc(occ.end_dt)) for occ in occurrences), Event.timezone == config.DEFAULT_TIMEZONE, db.and_(Event.category_id != cat['id'] for cat in excluded_categories), Event.acl_entries.any( db.and_(EventPrincipal.type == PrincipalType.user, EventPrincipal.user_id == session.user.id, EventPrincipal.full_access))).all())
def _query_events(categ_ids, day_start, day_end): event = db.aliased(Event) dates_overlap = lambda t: (t.start_dt >= day_start) & (t.start_dt <= day_end) return (db.session.query(Event.id, TimetableEntry.start_dt).filter( Event.category_chain_overlaps(categ_ids), ~Event.is_deleted, ((Event.timetable_entries.any(dates_overlap(TimetableEntry))) | (Event.query.exists().where( Event.happens_between(day_start, day_end) & (Event.id == event.id))))).group_by( Event.id, TimetableEntry.start_dt).order_by( Event.id, TimetableEntry.start_dt).join( TimetableEntry, (TimetableEntry.event_id == Event.id) & (dates_overlap(TimetableEntry)), isouter=True))
def _query_events(categ_ids, day_start, day_end): event = db.aliased(Event) dates_overlap = lambda t: (t.start_dt >= day_start) & (t.start_dt <= day_end) return (db.session.query(Event.id, TimetableEntry.start_dt) .filter( Event.category_chain_overlaps(categ_ids), ~Event.is_deleted, ((Event.timetable_entries.any(dates_overlap(TimetableEntry))) | (Event.query.exists().where( Event.happens_between(day_start, day_end) & (Event.id == event.id))))) .group_by(Event.id, TimetableEntry.start_dt) .order_by(Event.id, TimetableEntry.start_dt) .join(TimetableEntry, (TimetableEntry.event_id == Event.id) & (dates_overlap(TimetableEntry)), isouter=True))
def get_matching_events(start_dt, end_dt, repeat_frequency, repeat_interval): """Get events suitable for booking linking. This finds events that overlap with an occurrence of a booking with the given dates where the user is a manager. """ occurrences = ReservationOccurrence.create_series(start_dt, end_dt, (repeat_frequency, repeat_interval)) excluded_categories = rb_settings.get('excluded_categories') return (Event.query .filter(~Event.is_deleted, ~Event.room_reservation_links.any(ReservationLink.reservation.has(Reservation.is_accepted)), db.or_(Event.happens_between(as_utc(occ.start_dt), as_utc(occ.end_dt)) for occ in occurrences), Event.timezone == config.DEFAULT_TIMEZONE, db.and_(Event.category_id != cat.id for cat in excluded_categories), Event.acl_entries.any(db.and_(EventPrincipal.type == PrincipalType.user, EventPrincipal.user_id == session.user.id, EventPrincipal.full_access))) .all())
def _get_category_events_query(start_dt, end_dt, category_ids): return (Event.query.filter(~Event.is_deleted, Event.category_chain_overlaps(category_ids), Event.happens_between( start_dt, end_dt)).order_by(Event.start_dt))