forked from CGM_Public/pretix_original
New plugin signal order_valid_if_pending (#3337)
This commit is contained in:
@@ -21,7 +21,7 @@ Order events
|
|||||||
There are multiple signals that will be sent out in the ordering cycle:
|
There are multiple signals that will be sent out in the ordering cycle:
|
||||||
|
|
||||||
.. automodule:: pretix.base.signals
|
.. automodule:: pretix.base.signals
|
||||||
:members: validate_cart, validate_cart_addons, validate_order, order_fee_calculation, order_paid, order_placed, order_canceled, order_reactivated, order_expired, order_modified, order_changed, order_approved, order_denied, order_fee_type_name, allow_ticket_download, order_split, order_gracefully_delete, invoice_line_text
|
:members: validate_cart, validate_cart_addons, validate_order, order_valid_if_pending, order_fee_calculation, order_paid, order_placed, order_canceled, order_reactivated, order_expired, order_modified, order_changed, order_approved, order_denied, order_fee_type_name, allow_ticket_download, order_split, order_gracefully_delete, invoice_line_text
|
||||||
|
|
||||||
Check-ins
|
Check-ins
|
||||||
"""""""""
|
"""""""""
|
||||||
|
|||||||
@@ -95,7 +95,8 @@ from pretix.base.services.tasks import ProfiledEventTask, ProfiledTask
|
|||||||
from pretix.base.signals import (
|
from pretix.base.signals import (
|
||||||
allow_ticket_download, order_approved, order_canceled, order_changed,
|
allow_ticket_download, order_approved, order_canceled, order_changed,
|
||||||
order_denied, order_expired, order_fee_calculation, order_paid,
|
order_denied, order_expired, order_fee_calculation, order_paid,
|
||||||
order_placed, order_split, periodic_task, validate_order,
|
order_placed, order_split, order_valid_if_pending, periodic_task,
|
||||||
|
validate_order,
|
||||||
)
|
)
|
||||||
from pretix.celery_app import app
|
from pretix.celery_app import app
|
||||||
from pretix.helpers import OF_SELF
|
from pretix.helpers import OF_SELF
|
||||||
@@ -922,7 +923,7 @@ def _get_fees(positions: List[CartPosition], payment_requests: List[dict], addre
|
|||||||
def _create_order(event: Event, email: str, positions: List[CartPosition], now_dt: datetime,
|
def _create_order(event: Event, email: str, positions: List[CartPosition], now_dt: datetime,
|
||||||
payment_requests: List[dict], locale: str=None, address: InvoiceAddress=None,
|
payment_requests: List[dict], locale: str=None, address: InvoiceAddress=None,
|
||||||
meta_info: dict=None, sales_channel: str='web', shown_total=None,
|
meta_info: dict=None, sales_channel: str='web', shown_total=None,
|
||||||
customer=None):
|
customer=None, valid_if_pending=False):
|
||||||
payments = []
|
payments = []
|
||||||
sales_channel = get_all_sales_channels()[sales_channel]
|
sales_channel = get_all_sales_channels()[sales_channel]
|
||||||
|
|
||||||
@@ -950,6 +951,7 @@ def _create_order(event: Event, email: str, positions: List[CartPosition], now_d
|
|||||||
require_approval=require_approval,
|
require_approval=require_approval,
|
||||||
sales_channel=sales_channel.identifier,
|
sales_channel=sales_channel.identifier,
|
||||||
customer=customer,
|
customer=customer,
|
||||||
|
valid_if_pending=valid_if_pending,
|
||||||
)
|
)
|
||||||
if customer:
|
if customer:
|
||||||
order.email_known_to_work = customer.is_verified
|
order.email_known_to_work = customer.is_verified
|
||||||
@@ -1094,6 +1096,20 @@ def _perform_order(event: Event, payment_requests: List[dict], position_ids: Lis
|
|||||||
customer=customer,
|
customer=customer,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
valid_if_pending = False
|
||||||
|
for recv, result in order_valid_if_pending.send(
|
||||||
|
event,
|
||||||
|
payments=payment_requests,
|
||||||
|
email=email,
|
||||||
|
positions=positions,
|
||||||
|
locale=locale,
|
||||||
|
invoice_address=addr,
|
||||||
|
meta_info=meta_info,
|
||||||
|
customer=customer,
|
||||||
|
):
|
||||||
|
if result:
|
||||||
|
valid_if_pending = True
|
||||||
|
|
||||||
lockfn = NoLockManager
|
lockfn = NoLockManager
|
||||||
locked = False
|
locked = False
|
||||||
if positions.filter(Q(voucher__isnull=False) | Q(expires__lt=now() + timedelta(minutes=2)) | Q(seat__isnull=False)).exists():
|
if positions.filter(Q(voucher__isnull=False) | Q(expires__lt=now() + timedelta(minutes=2)) | Q(seat__isnull=False)).exists():
|
||||||
@@ -1117,7 +1133,7 @@ def _perform_order(event: Event, payment_requests: List[dict], position_ids: Lis
|
|||||||
_check_positions(event, now_dt, positions, address=addr, sales_channel=sales_channel, customer=customer)
|
_check_positions(event, now_dt, positions, address=addr, sales_channel=sales_channel, customer=customer)
|
||||||
order, payment_objs = _create_order(event, email, positions, now_dt, payment_requests,
|
order, payment_objs = _create_order(event, email, positions, now_dt, payment_requests,
|
||||||
locale=locale, address=addr, meta_info=meta_info, sales_channel=sales_channel,
|
locale=locale, address=addr, meta_info=meta_info, sales_channel=sales_channel,
|
||||||
shown_total=shown_total, customer=customer)
|
shown_total=shown_total, customer=customer, valid_if_pending=valid_if_pending)
|
||||||
try:
|
try:
|
||||||
for p in payment_objs:
|
for p in payment_objs:
|
||||||
if p.provider == 'free':
|
if p.provider == 'free':
|
||||||
|
|||||||
@@ -304,8 +304,7 @@ multiple events. Receivers should return a subclass of pretix.base.exporter.Base
|
|||||||
The ``sender`` keyword argument will contain an organizer.
|
The ``sender`` keyword argument will contain an organizer.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
validate_order = EventPluginSignal(
|
validate_order = EventPluginSignal()
|
||||||
)
|
|
||||||
"""
|
"""
|
||||||
Arguments: ``payments``, ``positions``, ``email``, ``locale``, ``invoice_address``,
|
Arguments: ``payments``, ``positions``, ``email``, ``locale``, ``invoice_address``,
|
||||||
``meta_info``, ``customer``
|
``meta_info``, ``customer``
|
||||||
@@ -321,6 +320,18 @@ As with all event-plugin signals, the ``sender`` keyword argument will contain t
|
|||||||
in the future, as the ``payments`` attribute gives more information.
|
in the future, as the ``payments`` attribute gives more information.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
order_valid_if_pending = EventPluginSignal()
|
||||||
|
"""
|
||||||
|
Arguments: ``payments``, ``positions``, ``email``, ``locale``, ``invoice_address``,
|
||||||
|
``meta_info``, ``customer``
|
||||||
|
|
||||||
|
This signal is sent out when the user tries to confirm the order, before we actually create
|
||||||
|
the order. It allows you to set the ``valid_if_pending`` of the order even before it is
|
||||||
|
created. Whenever any plugin returns ``True``, the order will be valid if pending.
|
||||||
|
|
||||||
|
As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
|
||||||
|
"""
|
||||||
|
|
||||||
validate_cart = EventPluginSignal()
|
validate_cart = EventPluginSignal()
|
||||||
"""
|
"""
|
||||||
Arguments: ``positions``
|
Arguments: ``positions``
|
||||||
|
|||||||
Reference in New Issue
Block a user