コード例 #1
0
 def _process(self):
     form = RequestListFilterForm(request.args, csrf_enabled=False)
     results = None
     if form.validate_on_submit():
         reverse = form.direction.data == 'desc'
         from_dt = as_utc(get_day_start(
             form.start_date.data)) if form.start_date.data else None
         to_dt = as_utc(get_day_end(
             form.end_date.data)) if form.end_date.data else None
         results = find_requests(from_dt=from_dt, to_dt=to_dt)
         results = [(req, req.event, req.event.start_dt, contribs,
                     session_blocks)
                    for req, contribs, session_blocks in results]
         results = group_list(results,
                              lambda x: x[2].date(),
                              itemgetter(2),
                              sort_reverse=reverse)
         results = OrderedDict(
             sorted(results.items(), key=itemgetter(0), reverse=reverse))
     return WPVCAssistance.render_template(
         'request_list.html',
         form=form,
         results=results,
         action=url_for('.request_list'),
         vc_capable_rooms=get_vc_capable_rooms(),
         within_working_hours=start_time_within_working_hours)
コード例 #2
0
    def _process(self):
        form = RequestListFilterForm(request.args, csrf_enabled=False)
        results = None
        if request.args and form.validate():
            reverse = form.direction.data == 'desc'
            talks = form.granularity.data == 'talks'
            from_dt = as_utc(get_day_start(
                form.start_date.data)) if form.start_date.data else None
            to_dt = as_utc(get_day_end(
                form.end_date.data)) if form.end_date.data else None
            states = {form.state.data} if form.state.data is not None else None
            results = find_requests(talks=talks,
                                    from_dt=from_dt,
                                    to_dt=to_dt,
                                    states=states)
            if not talks:
                results = [(req, req.event, req.event.start_dt)
                           for req in results]
            results = group_list(results,
                                 lambda x: x[2].date(),
                                 itemgetter(2),
                                 sort_reverse=reverse)
            results = OrderedDict(
                sorted(results.items(), key=itemgetter(0), reverse=reverse))

        return WPAudiovisualManagers.render_template('request_list.html',
                                                     form=form,
                                                     results=results)
コード例 #3
0
def get_rooms_nonbookable_periods(rooms, start_dt, end_dt):
    room_ids = [room.id for room in rooms]
    query = (NonBookablePeriod.query
             .filter(NonBookablePeriod.room_id.in_(room_ids),
                     NonBookablePeriod.start_dt <= end_dt.replace(hour=23, minute=59),
                     NonBookablePeriod.end_dt >= start_dt.replace(hour=0, minute=0)))
    return group_list(query, key=attrgetter('room_id'), sort_by=attrgetter('room_id'))
コード例 #4
0
 def _process(self):
     form = VCRoomListFilterForm(request.args, csrf_enabled=False)
     results = None
     if request.args and form.validate():
         reverse = form.direction.data == 'desc'
         from_dt = as_utc(get_day_start(form.start_date.data)) if form.start_date.data else None
         to_dt = as_utc(get_day_end(form.end_date.data)) if form.end_date.data else None
         results = find_event_vc_rooms(from_dt=from_dt, to_dt=to_dt, distinct=True)
         results = group_list((r for r in results if r.event),
                              key=lambda r: r.event.start_dt.date(),
                              sort_by=lambda r: r.event.start_dt,
                              sort_reverse=reverse)
         results = dict(sorted(results.items(), key=itemgetter(0), reverse=reverse))
     return WPVCService.render_template('vc_room_list.html', form=form, results=results,
                                        action=url_for('.vc_room_list'))
コード例 #5
0
def get_rooms_unbookable_hours(rooms):
    room_ids = [room.id for room in rooms]
    query = BookableHours.query.filter(BookableHours.room_id.in_(room_ids))
    rooms_hours = group_list(query, key=attrgetter('room_id'), sort_by=attrgetter('room_id'))
    inverted_rooms_hours = {}
    for room_id, hours in rooms_hours.items():
        hours.sort(key=lambda x: x.start_time)
        inverted_hours = []
        first = BookableHours(start_time=datetime.strptime('00:00', '%H:%M').time(), end_time=hours[0].start_time)
        inverted_hours.append(first)
        for i in range(1, len(hours)):
            hour = BookableHours(start_time=hours[i - 1].end_time, end_time=hours[i].start_time)
            inverted_hours.append(hour)
        last = BookableHours(start_time=hours[-1].end_time,
                             end_time=datetime.strptime('23:59', '%H:%M').time())
        inverted_hours.append(last)
        inverted_rooms_hours[room_id] = inverted_hours
    return inverted_rooms_hours
コード例 #6
0
 def _process(self):
     form = RequestListFilterForm(request.args)
     results = None
     if form.validate_on_submit():
         reverse = form.direction.data == 'desc'
         from_dt = as_utc(get_day_start(
             form.start_date.data)) if form.start_date.data else None
         to_dt = as_utc(get_day_end(
             form.end_date.data)) if form.end_date.data else None
         results = _find_requests(from_dt=from_dt, to_dt=to_dt)
         results = group_list(
             results,
             lambda req: dateutil.parser.parse(req['requested_at']).date(),
             sort_reverse=reverse)
         results = dict(sorted(results.items(), reverse=reverse))
     return WPRoomAssistance.render_template('request_list.html',
                                             form=form,
                                             results=results,
                                             parse_dt=dateutil.parser.parse)
コード例 #7
0
def get_existing_rooms_occurrences(rooms,
                                   start_dt,
                                   end_dt,
                                   repeat_frequency,
                                   repeat_interval,
                                   allow_overlapping=False,
                                   only_accepted=False,
                                   skip_booking_id=None):
    room_ids = [room.id for room in rooms]
    query = (ReservationOccurrence.query.filter(
        ReservationOccurrence.is_valid,
        Reservation.room_id.in_(room_ids)).join(
            ReservationOccurrence.reservation).options(
                ReservationOccurrence.NO_RESERVATION_USER_STRATEGY,
                contains_eager(ReservationOccurrence.reservation)))

    if allow_overlapping:
        query = query.filter(
            db_dates_overlap(ReservationOccurrence, 'start_dt', start_dt,
                             'end_dt', end_dt))
    else:
        query = query.filter(ReservationOccurrence.start_dt >= start_dt,
                             ReservationOccurrence.end_dt <= end_dt)
    if only_accepted:
        query = query.filter(Reservation.is_accepted)
    if repeat_frequency != RepeatFrequency.NEVER:
        candidates = ReservationOccurrence.create_series(
            start_dt, end_dt, (repeat_frequency, repeat_interval))
        dates = [candidate.start_dt for candidate in candidates]
        query = query.filter(
            db.cast(ReservationOccurrence.start_dt, db.Date).in_(dates))
    if skip_booking_id is not None:
        query = query.filter(
            ReservationOccurrence.reservation_id != skip_booking_id)

    return group_list(query,
                      key=lambda obj: obj.reservation.room_id,
                      sort_by=lambda obj:
                      (obj.reservation.room_id, obj.start_dt))
コード例 #8
0
def group_by_occurrence_date(occurrences, sort_by=None):
    key = lambda obj: obj.start_dt.date()
    if sort_by is None:
        sort_by = key
    return group_list(occurrences, key=key, sort_by=sort_by)
コード例 #9
0
def group_blocked_rooms(blocked_rooms):
    return group_list(blocked_rooms, key=attrgetter('room_id'), sort_by=attrgetter('room_id'))
コード例 #10
0
ファイル: conflicts.py プロジェクト: javfg/indico
def get_rooms_conflicts(rooms,
                        start_dt,
                        end_dt,
                        repeat_frequency,
                        repeat_interval,
                        blocked_rooms,
                        nonbookable_periods,
                        unbookable_hours,
                        skip_conflicts_with=None,
                        allow_admin=False,
                        skip_past_conflicts=False):
    rooms_conflicts = defaultdict(set)
    rooms_pre_conflicts = defaultdict(set)
    rooms_conflicting_candidates = defaultdict(set)
    skip_conflicts_with = skip_conflicts_with or []

    candidates = ReservationOccurrence.create_series(
        start_dt, end_dt, (repeat_frequency, repeat_interval))
    room_ids = [room.id for room in rooms]
    query = (ReservationOccurrence.query.filter(
        Reservation.room_id.in_(room_ids), ReservationOccurrence.is_valid,
        ReservationOccurrence.filter_overlap(candidates)).join(
            ReservationOccurrence.reservation).options(
                ReservationOccurrence.NO_RESERVATION_USER_STRATEGY,
                contains_eager(ReservationOccurrence.reservation)))

    if skip_conflicts_with:
        query = query.filter(~Reservation.id.in_(skip_conflicts_with))
    if skip_past_conflicts:
        query = query.filter(ReservationOccurrence.start_dt > datetime.now())

    overlapping_occurrences = group_list(
        query,
        key=lambda obj: obj.reservation.room.id,
        sort_by=lambda obj: obj.reservation.room.id)
    for room_id, occurrences in overlapping_occurrences.items():
        conflicts = get_room_bookings_conflicts(candidates, occurrences,
                                                skip_conflicts_with)
        rooms_conflicts[room_id], rooms_pre_conflicts[
            room_id], rooms_conflicting_candidates[room_id] = conflicts
    for room_id, occurrences in blocked_rooms.items():
        conflicts, conflicting_candidates = get_room_blockings_conflicts(
            room_id, candidates, occurrences, allow_admin=allow_admin)
        rooms_conflicts[room_id] |= conflicts
        rooms_conflicting_candidates[room_id] |= conflicting_candidates

    if not (allow_admin and rb_is_admin(session.user)):
        for room_id, occurrences in nonbookable_periods.items():
            room = Room.get_or_404(room_id)
            if not room.can_override(session.user, allow_admin=allow_admin):
                conflicts, conflicting_candidates = get_room_nonbookable_periods_conflicts(
                    candidates, occurrences)
                rooms_conflicts[room_id] |= conflicts
                rooms_conflicting_candidates[room_id] |= conflicting_candidates

        for room_id, occurrences in unbookable_hours.items():
            room = Room.get_or_404(room_id)
            if not room.can_override(session.user, allow_admin=allow_admin):
                conflicts, conflicting_candidates = get_room_unbookable_hours_conflicts(
                    candidates, occurrences)
                rooms_conflicts[room_id] |= conflicts
                rooms_conflicting_candidates[room_id] |= conflicting_candidates
    rooms_conflicting_candidates = defaultdict(
        list, ((k, list(v)) for k, v in rooms_conflicting_candidates.items()))
    return rooms_conflicts, rooms_pre_conflicts, rooms_conflicting_candidates