Example #1
0
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)
Example #2
0
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())
Example #3
0
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())
Example #4
0
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))
Example #5
0
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))
Example #6
0
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())
Example #7
0
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))