Add validate_cart hook

This commit is contained in:
Raphael Michel
2017-01-22 18:05:47 +01:00
parent 221526c979
commit 0665bd443b
3 changed files with 25 additions and 1 deletions

View File

@@ -12,6 +12,7 @@ from pretix.base.models import (
)
from pretix.base.services.async import ProfiledTask
from pretix.base.services.locking import LockTimeoutException
from pretix.base.signals import validate_cart
from pretix.celery_app import app
@@ -207,6 +208,11 @@ def _add_items_to_cart(event: Event, items: List[dict], cart_id: str=None) -> No
# TODO: i18n plurals
raise CartError(error_messages['max_items'], (event.settings.max_items_per_order,))
validate_cart.send(
sender=event, positions=CartPosition.objects.filter(Q(cart_id=cart_id) & Q(event=event)),
requested_add=items, requested_delete=[]
)
expiry = now_dt + timedelta(minutes=event.settings.get('reservation_time', as_type=int))
_extend_existing(event, cart_id, expiry, now_dt)
@@ -240,6 +246,11 @@ def add_items_to_cart(self, event: int, items: List[dict], cart_id: str=None) ->
def _remove_items_from_cart(event: Event, items: List[dict], cart_id: str) -> None:
with event.lock():
validate_cart.send(
sender=event, positions=CartPosition.objects.filter(Q(cart_id=cart_id) & Q(event=event)),
requested_add=[], requested_delete=items
)
for i in items:
cw = Q(cart_id=cart_id) & Q(item_id=i['item']) & Q(event=event)
if i['variation']:

View File

@@ -94,6 +94,19 @@ subclass of pretix.base.exporter.BaseExporter
As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
"""
validate_cart = EventPluginSignal(
providing_args=["positions", "requested_add", "requested_delete"]
)
"""
This signal is sent out every time a cart is about to be changed. It includes an iterable
with the current CartPosition objects as well as lists of dictionaries of the cart items
that the user wants to add. Those dictionaries can contain the keys ``item``, ``variation``,
``count``, ``price`` and ``voucher``. The response of receivers will be ignored, but you can
raise an OrderError with an appropriate exception message.
As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
"""
order_placed = EventPluginSignal(
providing_args=["order"]
)