Adds functionality to increase the reservation duration
This commit is contained in:
parent
b323c0eb25
commit
d31d812001
2 changed files with 76 additions and 0 deletions
|
@ -124,6 +124,32 @@ class CartController(object):
|
||||||
self.cart.revision += 1
|
self.cart.revision += 1
|
||||||
self.cart.save()
|
self.cart.save()
|
||||||
|
|
||||||
|
def extend_reservation(self, timedelta):
|
||||||
|
''' Extends the reservation on this cart by the given timedelta.
|
||||||
|
This can only be done if the current state of the cart is valid (i.e
|
||||||
|
all items and discounts in the cart are still available.)
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
timedelta (timedelta): The amount of time to extend the cart by.
|
||||||
|
The resulting reservation_duration will be now() + timedelta,
|
||||||
|
unless the requested extension is *LESS* than the current
|
||||||
|
reservation deadline.
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
self.validate_cart()
|
||||||
|
cart = self.cart
|
||||||
|
cart.refresh_from_db()
|
||||||
|
|
||||||
|
elapsed = (timezone.now() - cart.time_last_updated)
|
||||||
|
|
||||||
|
if cart.reservation_duration - elapsed > timedelta:
|
||||||
|
return
|
||||||
|
|
||||||
|
cart.time_last_updated = timezone.now()
|
||||||
|
cart.reservation_duration = timedelta
|
||||||
|
cart.save()
|
||||||
|
|
||||||
@_modifies_cart
|
@_modifies_cart
|
||||||
def set_quantities(self, product_quantities):
|
def set_quantities(self, product_quantities):
|
||||||
''' Sets the quantities on each of the products on each of the
|
''' Sets the quantities on each of the products on each of the
|
||||||
|
|
|
@ -500,3 +500,53 @@ class BasicCartTests(RegistrationCartTestCase):
|
||||||
cart.add_to_cart(self.PROD_1, 1)
|
cart.add_to_cart(self.PROD_1, 1)
|
||||||
cart.cart.refresh_from_db()
|
cart.cart.refresh_from_db()
|
||||||
self.assertEqual(cart.cart.reservation_duration, self.RESERVATION)
|
self.assertEqual(cart.cart.reservation_duration, self.RESERVATION)
|
||||||
|
|
||||||
|
def test_reservation_extension_less_than_current(self):
|
||||||
|
''' Reservation extension should have no effect if it's too small
|
||||||
|
'''
|
||||||
|
|
||||||
|
self.set_time(datetime.datetime(2015, 1, 1, tzinfo=UTC))
|
||||||
|
cart = TestingCartController.for_user(self.USER_1)
|
||||||
|
|
||||||
|
cart.add_to_cart(self.PROD_1, 1)
|
||||||
|
cart.cart.refresh_from_db()
|
||||||
|
self.assertEqual(cart.cart.reservation_duration, self.RESERVATION)
|
||||||
|
|
||||||
|
cart.extend_reservation(datetime.timedelta(minutes=30))
|
||||||
|
|
||||||
|
cart.cart.refresh_from_db()
|
||||||
|
self.assertEqual(cart.cart.reservation_duration, self.RESERVATION)
|
||||||
|
|
||||||
|
def test_reservation_extension(self):
|
||||||
|
''' Test various reservation extension bits.
|
||||||
|
'''
|
||||||
|
|
||||||
|
self.set_time(datetime.datetime(2015, 1, 1, tzinfo=UTC))
|
||||||
|
cart = TestingCartController.for_user(self.USER_1)
|
||||||
|
|
||||||
|
cart.add_to_cart(self.PROD_1, 1)
|
||||||
|
cart.cart.refresh_from_db()
|
||||||
|
self.assertEqual(cart.cart.reservation_duration, self.RESERVATION)
|
||||||
|
|
||||||
|
hours = datetime.timedelta(hours=1)
|
||||||
|
cart.extend_reservation(24 * hours)
|
||||||
|
|
||||||
|
cart.cart.refresh_from_db()
|
||||||
|
self.assertEqual(cart.cart.reservation_duration, 24 * hours)
|
||||||
|
|
||||||
|
self.add_timedelta(1 * hours)
|
||||||
|
|
||||||
|
# PROD_1's reservation is less than what we've added to the cart
|
||||||
|
cart.add_to_cart(self.PROD_1, 1)
|
||||||
|
cart.cart.refresh_from_db()
|
||||||
|
self.assertEqual(cart.cart.reservation_duration, 23 * hours)
|
||||||
|
|
||||||
|
# Now the extension should only have 59 minutes remaining
|
||||||
|
# so the autoextend behaviour should kick in
|
||||||
|
self.add_timedelta(datetime.timedelta(hours=22, minutes=1))
|
||||||
|
cart.add_to_cart(self.PROD_1, 1)
|
||||||
|
cart.cart.refresh_from_db()
|
||||||
|
self.assertEqual(
|
||||||
|
cart.cart.reservation_duration,
|
||||||
|
self.PROD_1.reservation_duration,
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in a new issue