mirror of
https://github.com/pretix/pretix.git
synced 2026-05-18 17:24:03 +00:00
add extend_cart_reservation task and CartExtendReservation view
This commit is contained in:
@@ -1649,6 +1649,30 @@ def clear_cart(self, event: Event, cart_id: str=None, locale='en', sales_channel
|
|||||||
raise CartError(error_messages['busy'])
|
raise CartError(error_messages['busy'])
|
||||||
|
|
||||||
|
|
||||||
|
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
||||||
|
def extend_cart_reservation(self, event: Event, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> None:
|
||||||
|
"""
|
||||||
|
Resets the expiry time of a cart to the configured reservation time of this event.
|
||||||
|
Limited to 11x the reservation time.
|
||||||
|
|
||||||
|
:param event: The event ID in question
|
||||||
|
:param cart_id: The cart ID of the cart to modify
|
||||||
|
"""
|
||||||
|
with language(locale), time_machine_now_assigned(override_now_dt):
|
||||||
|
try:
|
||||||
|
sales_channel = event.organizer.sales_channels.get(identifier=sales_channel)
|
||||||
|
except SalesChannel.DoesNotExist:
|
||||||
|
raise CartError("Invalid sales channel.")
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
cm = CartManager(event=event, cart_id=cart_id, sales_channel=sales_channel)
|
||||||
|
cm.commit()
|
||||||
|
except LockTimeoutException:
|
||||||
|
self.retry()
|
||||||
|
except (MaxRetriesExceededError, LockTimeoutException):
|
||||||
|
raise CartError(error_messages['busy'])
|
||||||
|
|
||||||
|
|
||||||
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
||||||
def set_cart_addons(self, event: Event, addons: List[dict], add_to_cart_items: List[dict], cart_id: str=None, locale='en',
|
def set_cart_addons(self, event: Event, addons: List[dict], add_to_cart_items: List[dict], cart_id: str=None, locale='en',
|
||||||
invoice_address: int=None, sales_channel='web', override_now_dt: datetime=None) -> None:
|
invoice_address: int=None, sales_channel='web', override_now_dt: datetime=None) -> None:
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ frame_wrapped_urls = [
|
|||||||
re_path(r'^cart/remove$', pretix.presale.views.cart.CartRemove.as_view(), name='event.cart.remove'),
|
re_path(r'^cart/remove$', pretix.presale.views.cart.CartRemove.as_view(), name='event.cart.remove'),
|
||||||
re_path(r'^cart/voucher$', pretix.presale.views.cart.CartApplyVoucher.as_view(), name='event.cart.voucher'),
|
re_path(r'^cart/voucher$', pretix.presale.views.cart.CartApplyVoucher.as_view(), name='event.cart.voucher'),
|
||||||
re_path(r'^cart/clear$', pretix.presale.views.cart.CartClear.as_view(), name='event.cart.clear'),
|
re_path(r'^cart/clear$', pretix.presale.views.cart.CartClear.as_view(), name='event.cart.clear'),
|
||||||
|
re_path(r'^cart/extend$', pretix.presale.views.cart.CartExtendReservation.as_view(), name='event.cart.extend'),
|
||||||
re_path(r'^cart/answer/(?P<answer>[^/]+)/$',
|
re_path(r'^cart/answer/(?P<answer>[^/]+)/$',
|
||||||
pretix.presale.views.cart.AnswerDownload.as_view(),
|
pretix.presale.views.cart.AnswerDownload.as_view(),
|
||||||
name='event.cart.download.answer'),
|
name='event.cart.download.answer'),
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ from pretix.base.models import (
|
|||||||
)
|
)
|
||||||
from pretix.base.services.cart import (
|
from pretix.base.services.cart import (
|
||||||
CartError, add_items_to_cart, apply_voucher, clear_cart, error_messages,
|
CartError, add_items_to_cart, apply_voucher, clear_cart, error_messages,
|
||||||
remove_cart_position,
|
extend_cart_reservation, remove_cart_position,
|
||||||
)
|
)
|
||||||
from pretix.base.timemachine import time_machine_now
|
from pretix.base.timemachine import time_machine_now
|
||||||
from pretix.base.views.tasks import AsyncAction
|
from pretix.base.views.tasks import AsyncAction
|
||||||
@@ -537,6 +537,19 @@ class CartClear(EventViewMixin, CartActionMixin, AsyncAction, View):
|
|||||||
request.sales_channel.identifier, time_machine_now(default=None))
|
request.sales_channel.identifier, time_machine_now(default=None))
|
||||||
|
|
||||||
|
|
||||||
|
@method_decorator(allow_frame_if_namespaced, 'dispatch')
|
||||||
|
class CartExtendReservation(EventViewMixin, CartActionMixin, AsyncAction, View):
|
||||||
|
task = extend_cart_reservation
|
||||||
|
known_errortypes = ['CartError']
|
||||||
|
|
||||||
|
def get_success_message(self, value):
|
||||||
|
return _('Your cart timeout was extended.')
|
||||||
|
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
return self.do(self.request.event.id, get_or_create_cart_id(self.request), translation.get_language(),
|
||||||
|
request.sales_channel.identifier, time_machine_now(default=None))
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(allow_cors_if_namespaced, 'dispatch')
|
@method_decorator(allow_cors_if_namespaced, 'dispatch')
|
||||||
@method_decorator(allow_frame_if_namespaced, 'dispatch')
|
@method_decorator(allow_frame_if_namespaced, 'dispatch')
|
||||||
@method_decorator(iframe_entry_view_wrapper, 'dispatch')
|
@method_decorator(iframe_entry_view_wrapper, 'dispatch')
|
||||||
|
|||||||
Reference in New Issue
Block a user