def daterange(self):
        now = utils.utcnow()

        since = now - timedelta(days=self.end)
        until = now - timedelta(days=self.start)

        return since, until
Esempio n. 2
0
def remove_reservation_from_session(session_id, token):
    """ Removes the reservation with the given session_id and token. """

    assert token and session_id

    query = reservations_by_session(session_id)
    query = query.filter(Reservation.token == token)

    reservation = query.one()
    Session.delete(reservation)

    # if we get here the token must be valid, we should then check if the
    # token is used in the reserved slots, because with autoapproval these
    # slots may be created straight away.

    slots = Session.query(ReservedSlot).filter(
        ReservedSlot.reservation_token == token
    )

    slots.delete('fetch')

    # we also update the timestamp of existing reservations within
    # the same session to ensure that we account for the user's activity
    # properly during the session expiration cronjob. Otherwise it is
    # possible that a user removes the latest reservations only to see
    # the rest of them vanish because his older reservations were
    # already old enough to be counted as expired.

    query = Session.query(Reservation)
    query = query.filter(Reservation.session_id == session_id)

    query.update({"modified": utils.utcnow()})
    def daterange(self):
        now = utils.utcnow()

        since = now - timedelta(days=self.end)
        until = now - timedelta(days=self.start)

        return since, until
def human_date(date):
    # timezones are currently naive and implicity the one used by
    # the users - we don't have international reservations yet
    now = utils.utcnow()

    this_morning = datetime(
        now.year, now.month, now.day
    ).replace(tzinfo=now.tzinfo)

    time = utils.localize_date(date, time_only=True)

    if date >= this_morning:
        return _(u'Today, at ${time}', mapping={'time': time})

    days = (now.date() - date.date()).days

    if days <= 1:
        return _(u'Yesterday, at ${time}', mapping={
            'time': time
        })
    else:
        return _(u'${days} days ago, at ${time}', mapping={
            'days': days,
            'time': time
        })
Esempio n. 5
0
    def test_session_removal_is_complete(self):
        sc = Scheduler(new_uuid())

        start, end = datetime(2013, 9, 27, 9, 0), datetime(2013, 9, 27, 10)
        sc.allocate(dates=(start, end))

        session_id = new_uuid()
        token = sc.reserve(
            reservation_email, (start, end), session_id=session_id
        )

        self.assertEqual(db.Session.query(db.Reservation).count(), 1)
        self.assertEqual(db.Session.query(db.Allocation).count(), 1)
        self.assertEqual(db.Session.query(db.ReservedSlot).count(), 0)

        sc.approve_reservation(token)

        self.assertEqual(db.Session.query(db.Reservation).count(), 1)
        self.assertEqual(db.Session.query(db.Allocation).count(), 1)
        self.assertEqual(db.Session.query(db.ReservedSlot).count(), 1)

        db.remove_expired_reservation_sessions(
            utils.utcnow() + timedelta(seconds=15*60)
        )

        self.assertEqual(db.Session.query(db.Reservation).count(), 0)
        self.assertEqual(db.Session.query(db.Allocation).count(), 1)
        self.assertEqual(db.Session.query(db.ReservedSlot).count(), 0)
    def daterange_label(self):
        since, until = self.daterange

        if until.date() == utils.utcnow().date():
            return ' - '.join((utils.localize_date(since, long_format=False),
                               self.translate(_(u'Today'))))
        return ' - '.join((utils.localize_date(since, long_format=False),
                           utils.localize_date(until, long_format=False)))
    def daterange_label(self):
        since, until = self.daterange

        if until.date() == utils.utcnow().date():
            return ' - '.join((
                utils.localize_date(since, long_format=False),
                self.translate(_(u'Today'))
            ))
        return ' - '.join((
            utils.localize_date(since, long_format=False),
            utils.localize_date(until, long_format=False)
        ))
Esempio n. 8
0
def find_expired_reservation_sessions(expiration_date):
    """ Goes through all reservations and returns the session ids of the
    unconfirmed ones which are older than the given expiration date.
    By default the expiration date is now - 15 minutes.

    Note that this method goes through ALL RESERVATIONS OF THE DATABASE. If
    this is not desired have a look at buildout/database.cfg.example to
    setup each site with its own database.

    """

    expiration_date = expiration_date or (
        utils.utcnow() - timedelta(minutes=15)
    )

    # first get the session ids which are expired
    query = Session.query(
        Reservation.session_id,
        func.max(Reservation.created),
        func.max(Reservation.modified)
    )

    query = query.group_by(Reservation.session_id)

    # != null() because != None is not allowed by PEP8
    query = query.filter(Reservation.session_id != null())

    # the idea is to remove all reservations belonging to sessions whose
    # latest update is expired - either delete the whole session or let
    # all of it be
    expired_sessions = []

    for session_id, created, modified in query.all():

        modified = modified or created
        assert created and modified

        if max(created, modified) < expiration_date:
            expired_sessions.append(session_id)

    return expired_sessions
Esempio n. 9
0
    def test_session_expiration(self):
        sc = Scheduler(new_uuid())

        session_id = new_uuid()

        start, end = datetime(2013, 5, 1, 13, 0), datetime(2013, 5, 1, 14)

        sc.allocate(dates=(start, end), approve_manually=True)

        sc.reserve(u'*****@*****.**', (start, end), session_id=session_id)

        created = utils.utcnow()
        db.Session.query(db.Reservation).filter(
            db.Reservation.session_id == session_id
        ).update({'created': created, 'modified': None})

        expired = db.find_expired_reservation_sessions(expiration_date=created)
        self.assertEqual(len(expired), 0)

        expired = db.find_expired_reservation_sessions(
            expiration_date=created + timedelta(microseconds=1)
        )
        self.assertEqual(len(expired), 1)

        db.Session.query(db.Reservation).filter(
            db.Reservation.session_id == session_id
        ).update({
            'created': created,
            'modified': created + timedelta(microseconds=1)
        })

        expired = db.find_expired_reservation_sessions(
            expiration_date=created + timedelta(microseconds=1)
        )
        self.assertEqual(len(expired), 0)

        expired = db.find_expired_reservation_sessions(
            expiration_date=created + timedelta(microseconds=2)
        )
        self.assertEqual(len(expired), 1)
def human_date(date):
    # timezones are currently naive and implicity the the one used by
    # the users - we don't have international reservations yet
    now = utils.utcnow()

    this_morning = datetime(now.year, now.month,
                            now.day).replace(tzinfo=now.tzinfo)

    time = date.strftime('%H:%M')

    if date >= this_morning:
        return _(u'Today, at ${time}', mapping={'time': time})

    days = (now.date() - date.date()).days

    if days <= 1:
        return _(u'Yesterday, at ${time}', mapping={'time': time})
    else:
        return _(u'${days} days ago, at ${time}',
                 mapping={
                     'days': days,
                     'time': time
                 })
def latest_reservations(resources, reservations='*', days=30):
    schedulers = {}

    for uuid in resources.keys():
        schedulers[uuid] = db.Scheduler(uuid)

    since = utils.utcnow() - timedelta(days=days)

    query = Session.query(Reservation)
    query = query.filter(Reservation.resource.in_(resources.keys()))
    query = query.filter(Reservation.created > since)
    query = query.order_by(desc(Reservation.created))

    if reservations != '*':
        query = query.filter(Reservation.token.in_(reservations))

    result = utils.OrderedDict()
    for reservation in query.all():
        if reservation.token in result:
            result.append(reservation)
        else:
            result[reservation.token] = [reservation]

    return result
def latest_reservations(resources, reservations='*', days=30):
    schedulers = {}

    for uuid in resources.keys():
        schedulers[uuid] = db.Scheduler(uuid)

    since = utils.utcnow() - timedelta(days=days)

    query = Session.query(Reservation)
    query = query.filter(Reservation.resource.in_(resources.keys()))
    query = query.filter(Reservation.created > since)
    query = query.order_by(desc(Reservation.created))

    if reservations != '*':
        query = query.filter(Reservation.token.in_(reservations))

    result = utils.OrderedDict()
    for reservation in query.all():
        if reservation.token in result:
            result.append(reservation)
        else:
            result[reservation.token] = [reservation]

    return result