mirror of
https://github.com/pretix/pretix.git
synced 2026-05-06 15:24:02 +00:00
Removed CleanerVersion layer [backwards-incompatible!]
This commit is contained in:
@@ -35,7 +35,7 @@ def _extend_existing(event: Event, cart_id: str, expiry: datetime) -> None:
|
||||
# Extend this user's cart session to 30 minutes from now to ensure all items in the
|
||||
# cart expire at the same time
|
||||
# We can extend the reservation of items which are not yet expired without risk
|
||||
CartPosition.objects.current.filter(
|
||||
CartPosition.objects.filter(
|
||||
Q(cart_id=cart_id) & Q(event=event) & Q(expires__gt=now())
|
||||
).update(expires=expiry)
|
||||
|
||||
@@ -44,7 +44,7 @@ def _re_add_expired_positions(items: List[CartPosition], event: Event, cart_id:
|
||||
positions = set()
|
||||
# For items that are already expired, we have to delete and re-add them, as they might
|
||||
# be no longer available or prices might have changed. Sorry!
|
||||
expired = CartPosition.objects.current.filter(
|
||||
expired = CartPosition.objects.filter(
|
||||
Q(cart_id=cart_id) & Q(event=event) & Q(expires__lte=now())
|
||||
)
|
||||
for cp in expired:
|
||||
@@ -55,7 +55,7 @@ def _re_add_expired_positions(items: List[CartPosition], event: Event, cart_id:
|
||||
|
||||
def _delete_expired(expired: List[CartPosition]) -> None:
|
||||
for cp in expired:
|
||||
if cp.version_end_date is None:
|
||||
if cp.expires <= now():
|
||||
cp.delete()
|
||||
|
||||
|
||||
@@ -66,19 +66,19 @@ def _check_date(event: Event) -> None:
|
||||
raise CartError(error_messages['ended'])
|
||||
|
||||
|
||||
def _add_new_items(event: Event, items: List[Tuple[str, Optional[str], int]],
|
||||
def _add_new_items(event: Event, items: List[Tuple[int, Optional[int], int]],
|
||||
cart_id: str, expiry: datetime) -> Optional[str]:
|
||||
err = None
|
||||
|
||||
# Fetch items from the database
|
||||
items_query = Item.objects.current.filter(event=event, identity__in=[i[0] for i in items]).prefetch_related(
|
||||
items_query = Item.objects.filter(event=event, id__in=[i[0] for i in items]).prefetch_related(
|
||||
"quotas")
|
||||
items_cache = {i.identity: i for i in items_query}
|
||||
variations_query = ItemVariation.objects.current.filter(
|
||||
items_cache = {i.id: i for i in items_query}
|
||||
variations_query = ItemVariation.objects.filter(
|
||||
item__event=event,
|
||||
identity__in=[i[1] for i in items if i[1] is not None]
|
||||
id__in=[i[1] for i in items if i[1] is not None]
|
||||
).select_related("item", "item__event").prefetch_related("quotas", "values", "values__prop")
|
||||
variations_cache = {v.identity: v for v in variations_query}
|
||||
variations_cache = {v.id: v for v in variations_query}
|
||||
|
||||
for i in items:
|
||||
# Check whether the specified items are part of what we just fetched from the database
|
||||
@@ -115,7 +115,7 @@ def _add_new_items(event: Event, items: List[Tuple[str, Optional[str], int]],
|
||||
for k in range(quota_ok):
|
||||
if len(i) > 3 and i[2] == 1:
|
||||
# Recreating
|
||||
cp = i[3].clone()
|
||||
cp = i[3]
|
||||
cp.expires = expiry
|
||||
cp.price = item.default_price if variation is None else (
|
||||
variation.default_price if variation.default_price is not None else item.default_price)
|
||||
@@ -131,10 +131,10 @@ def _add_new_items(event: Event, items: List[Tuple[str, Optional[str], int]],
|
||||
return err
|
||||
|
||||
|
||||
def _add_items_to_cart(event: Event, items: List[Tuple[str, Optional[str], int]], cart_id: str=None) -> None:
|
||||
def _add_items_to_cart(event: Event, items: List[Tuple[int, Optional[int], int]], cart_id: str=None) -> None:
|
||||
with event.lock():
|
||||
_check_date(event)
|
||||
existing = CartPosition.objects.current.filter(Q(cart_id=cart_id) & Q(event=event)).count()
|
||||
existing = CartPosition.objects.filter(Q(cart_id=cart_id) & Q(event=event)).count()
|
||||
if sum(i[2] for i in items) + existing > int(event.settings.max_items_per_order):
|
||||
# TODO: i18n plurals
|
||||
raise CartError(error_messages['max_items'] % event.settings.max_items_per_order)
|
||||
@@ -152,7 +152,7 @@ def _add_items_to_cart(event: Event, items: List[Tuple[str, Optional[str], int]]
|
||||
raise CartError(err)
|
||||
|
||||
|
||||
def add_items_to_cart(event: str, items: List[Tuple[str, Optional[str], int]], cart_id: str=None) -> None:
|
||||
def add_items_to_cart(event: int, items: List[Tuple[int, Optional[int], int]], cart_id: str=None) -> None:
|
||||
"""
|
||||
Adds a list of items to a user's cart.
|
||||
:param event: The event ID in question
|
||||
@@ -160,21 +160,21 @@ def add_items_to_cart(event: str, items: List[Tuple[str, Optional[str], int]], c
|
||||
:param session: Session ID of a guest
|
||||
:raises CartError: On any error that occured
|
||||
"""
|
||||
event = Event.objects.current.get(identity=event)
|
||||
event = Event.objects.get(id=event)
|
||||
try:
|
||||
_add_items_to_cart(event, items, cart_id)
|
||||
except EventLock.LockTimeoutException:
|
||||
raise CartError(error_messages['busy'])
|
||||
|
||||
|
||||
def remove_items_from_cart(event: str, items: List[Tuple[str, Optional[str], int]], cart_id: str=None) -> None:
|
||||
def remove_items_from_cart(event: int, items: List[Tuple[int, Optional[int], int]], cart_id: int=None) -> None:
|
||||
"""
|
||||
Removes a list of items from a user's cart.
|
||||
:param event: The event ID in question
|
||||
:param items: A list of tuple of the form (item id, variation id or None, number)
|
||||
:param session: Session ID of a guest
|
||||
"""
|
||||
event = Event.objects.current.get(identity=event)
|
||||
event = Event.objects.get(id=event)
|
||||
|
||||
for item, variation, cnt in items:
|
||||
cw = Q(cart_id=cart_id) & Q(item_id=item) & Q(event=event)
|
||||
@@ -182,7 +182,7 @@ def remove_items_from_cart(event: str, items: List[Tuple[str, Optional[str], int
|
||||
cw &= Q(variation_id=variation)
|
||||
else:
|
||||
cw &= Q(variation__isnull=True)
|
||||
for cp in CartPosition.objects.current.filter(cw).order_by("-price")[:cnt]:
|
||||
for cp in CartPosition.objects.filter(cw).order_by("-price")[:cnt]:
|
||||
cp.delete()
|
||||
|
||||
|
||||
@@ -190,8 +190,8 @@ if settings.HAS_CELERY:
|
||||
from pretix.celery import app
|
||||
|
||||
@app.task(bind=True, max_retries=5, default_retry_delay=2)
|
||||
def add_items_to_cart_task(self, event: str, items: List[Tuple[str, Optional[str], int]], cart_id: str):
|
||||
event = Event.objects.current.get(identity=event)
|
||||
def add_items_to_cart_task(self, event: int, items: List[Tuple[int, Optional[int], int]], cart_id: str):
|
||||
event = Event.objects.get(id=event)
|
||||
try:
|
||||
_add_items_to_cart(event, items, cart_id)
|
||||
except EventLock.LockTimeoutException:
|
||||
|
||||
@@ -7,7 +7,7 @@ from pretix.base.signals import register_data_exporters
|
||||
|
||||
|
||||
def export(event: str, fileid: str, provider: str, form_data: Dict[str, Any]) -> None:
|
||||
event = Event.objects.current.get(identity=event)
|
||||
event = Event.objects.get(id=event)
|
||||
file = CachedFile.objects.get(id=fileid)
|
||||
responses = register_data_exporters.send(event)
|
||||
for receiver, response in responses:
|
||||
|
||||
@@ -64,13 +64,13 @@ def lock_event_db(event):
|
||||
for i in range(retries):
|
||||
with transaction.atomic():
|
||||
dt = now()
|
||||
l, created = EventLock.objects.get_or_create(event=event.identity)
|
||||
l, created = EventLock.objects.get_or_create(event=event.id)
|
||||
if created:
|
||||
event._lock = l
|
||||
return True
|
||||
elif l.date < now() - timedelta(seconds=LOCK_TIMEOUT):
|
||||
newtoken = uuid.uuid4()
|
||||
updated = EventLock.objects.filter(event=event.identity, token=l.token).update(date=dt, token=newtoken)
|
||||
updated = EventLock.objects.filter(event=event.id, token=l.token).update(date=dt, token=newtoken)
|
||||
if updated:
|
||||
l.token = newtoken
|
||||
event._lock = l
|
||||
@@ -84,7 +84,7 @@ def release_event_db(event):
|
||||
if not hasattr(event, '_lock') or not event._lock:
|
||||
raise EventLock.LockReleaseException('Lock is not owned by this thread')
|
||||
try:
|
||||
lock = EventLock.objects.get(event=event.identity, token=event._lock.token)
|
||||
lock = EventLock.objects.get(event=event.id, token=event._lock.token)
|
||||
lock.delete()
|
||||
event._lock = None
|
||||
except EventLock.DoesNotExist:
|
||||
@@ -97,7 +97,7 @@ def redis_lock_from_event(event):
|
||||
|
||||
if not hasattr(event, '_lock') or not event._lock:
|
||||
rc = get_redis_connection("redis")
|
||||
event._lock = Lock(redis=rc, name='pretix_event_%s' % event.identity, timeout=LOCK_TIMEOUT)
|
||||
event._lock = Lock(redis=rc, name='pretix_event_%s' % event.id, timeout=LOCK_TIMEOUT)
|
||||
return event._lock
|
||||
|
||||
|
||||
|
||||
@@ -33,8 +33,8 @@ error_messages = {
|
||||
def mark_order_paid(order: Order, provider: str=None, info: str=None, date: datetime=None, manual: bool=None,
|
||||
force: bool=False) -> Order:
|
||||
"""
|
||||
Marks an order as paid. This clones the order object, sets the payment provider,
|
||||
info and date and returns the cloned order object.
|
||||
Marks an order as paid. This sets the payment provider, info and date and returns
|
||||
the order object.
|
||||
|
||||
:param provider: The payment provider that marked this as paid
|
||||
:type provider: str
|
||||
@@ -52,7 +52,6 @@ def mark_order_paid(order: Order, provider: str=None, info: str=None, date: date
|
||||
can_be_paid = order._can_be_paid()
|
||||
if not force and can_be_paid is not True:
|
||||
raise Quota.QuotaExceededException(can_be_paid)
|
||||
order = order.clone()
|
||||
order.payment_provider = provider or order.payment_provider
|
||||
order.payment_info = info or order.payment_info
|
||||
order.payment_date = date or now()
|
||||
@@ -110,7 +109,6 @@ def _check_positions(event: Event, dt: datetime, positions: List[CartPosition]):
|
||||
cp.delete()
|
||||
continue
|
||||
if price != cp.price:
|
||||
cp = cp.clone()
|
||||
positions[i] = cp
|
||||
cp.price = price
|
||||
cp.save()
|
||||
@@ -125,7 +123,6 @@ def _check_positions(event: Event, dt: datetime, positions: List[CartPosition]):
|
||||
quota_ok = False
|
||||
break
|
||||
if quota_ok:
|
||||
cp = cp.clone()
|
||||
positions[i] = cp
|
||||
cp.expires = now() + timedelta(
|
||||
minutes=event.settings.get('reservation_time', as_type=int))
|
||||
@@ -163,7 +160,7 @@ def _create_order(event: Event, email: str, positions: List[CartPosition], dt: d
|
||||
|
||||
def _perform_order(event: str, payment_provider: str, position_ids: List[str],
|
||||
email: str, locale: str):
|
||||
event = Event.objects.current.get(identity=event)
|
||||
event = Event.objects.get(id=event)
|
||||
responses = register_payment_providers.send(event)
|
||||
pprov = None
|
||||
for receiver, response in responses:
|
||||
@@ -175,8 +172,8 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
|
||||
|
||||
dt = now()
|
||||
with event.lock():
|
||||
positions = list(CartPosition.objects.current.filter(
|
||||
identity__in=position_ids).select_related('item', 'variation'))
|
||||
positions = list(CartPosition.objects.filter(
|
||||
id__in=position_ids).select_related('item', 'variation'))
|
||||
if len(position_ids) != len(positions):
|
||||
raise OrderError(error_messages['internal'])
|
||||
_check_positions(event, dt, positions)
|
||||
@@ -197,7 +194,7 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
|
||||
},
|
||||
event, locale=order.locale
|
||||
)
|
||||
return order.identity
|
||||
return order.id
|
||||
|
||||
|
||||
def perform_order(event: str, payment_provider: str, positions: List[str],
|
||||
|
||||
@@ -37,28 +37,28 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
|
||||
|
||||
num_total = {
|
||||
(p['item'], p['variation']): (p['cnt'], p['price'])
|
||||
for p in (OrderPosition.objects.current
|
||||
for p in (OrderPosition.objects
|
||||
.filter(order__event=event)
|
||||
.values('item', 'variation')
|
||||
.annotate(cnt=Count('id'), price=Sum('price')).order_by())
|
||||
}
|
||||
num_cancelled = {
|
||||
(p['item'], p['variation']): (p['cnt'], p['price'])
|
||||
for p in (OrderPosition.objects.current
|
||||
for p in (OrderPosition.objects
|
||||
.filter(order__event=event, order__status=Order.STATUS_CANCELLED)
|
||||
.values('item', 'variation')
|
||||
.annotate(cnt=Count('id'), price=Sum('price')).order_by())
|
||||
}
|
||||
num_refunded = {
|
||||
(p['item'], p['variation']): (p['cnt'], p['price'])
|
||||
for p in (OrderPosition.objects.current
|
||||
for p in (OrderPosition.objects
|
||||
.filter(order__event=event, order__status=Order.STATUS_REFUNDED)
|
||||
.values('item', 'variation')
|
||||
.annotate(cnt=Count('id'), price=Sum('price')).order_by())
|
||||
}
|
||||
num_pending = {
|
||||
(p['item'], p['variation']): (p['cnt'], p['price'])
|
||||
for p in (OrderPosition.objects.current
|
||||
for p in (OrderPosition.objects
|
||||
.filter(order__event=event,
|
||||
order__status__in=(Order.STATUS_PENDING, Order.STATUS_EXPIRED))
|
||||
.values('item', 'variation')
|
||||
@@ -66,7 +66,7 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
|
||||
}
|
||||
num_paid = {
|
||||
(p['item'], p['variation']): (p['cnt'], p['price'])
|
||||
for p in (OrderPosition.objects.current
|
||||
for p in (OrderPosition.objects
|
||||
.filter(order__event=event, order__status=Order.STATUS_PAID)
|
||||
.values('item', 'variation')
|
||||
.annotate(cnt=Count('id'), price=Sum('price')).order_by())
|
||||
@@ -76,12 +76,12 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
|
||||
item.all_variations = sorted(item.get_all_variations(),
|
||||
key=lambda vd: vd.ordered_values())
|
||||
for var in item.all_variations:
|
||||
variid = var['variation'].identity if 'variation' in var else None
|
||||
var.num_total = num_total.get((item.identity, variid), (0, 0))
|
||||
var.num_pending = num_pending.get((item.identity, variid), (0, 0))
|
||||
var.num_cancelled = num_cancelled.get((item.identity, variid), (0, 0))
|
||||
var.num_refunded = num_refunded.get((item.identity, variid), (0, 0))
|
||||
var.num_paid = num_paid.get((item.identity, variid), (0, 0))
|
||||
variid = var['variation'].id if 'variation' in var else None
|
||||
var.num_total = num_total.get((item.id, variid), (0, 0))
|
||||
var.num_pending = num_pending.get((item.id, variid), (0, 0))
|
||||
var.num_cancelled = num_cancelled.get((item.id, variid), (0, 0))
|
||||
var.num_refunded = num_refunded.get((item.id, variid), (0, 0))
|
||||
var.num_paid = num_paid.get((item.id, variid), (0, 0))
|
||||
item.has_variations = (len(item.all_variations) != 1
|
||||
or not item.all_variations[0].empty())
|
||||
item.num_total = tuplesum(var.num_total for var in item.all_variations)
|
||||
@@ -100,7 +100,8 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
|
||||
# insert categories into a set for uniqueness
|
||||
# a set is unsorted, so sort again by category
|
||||
],
|
||||
key=lambda group: (group[0].position, group[0].identity) if group[0] is not None else (0, "")
|
||||
key=lambda group: (group[0].position, group[0].id) if (
|
||||
group[0] is not None and group[0].id is not None) else (0, 0)
|
||||
)
|
||||
|
||||
for c in items_by_category:
|
||||
@@ -116,35 +117,35 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
|
||||
payment_items = []
|
||||
num_total = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in (Order.objects.current
|
||||
for o in (Order.objects
|
||||
.filter(event=event)
|
||||
.values('payment_provider')
|
||||
.annotate(cnt=Count('id'), payment_fee=Sum('payment_fee')).order_by())
|
||||
}
|
||||
num_cancelled = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in (Order.objects.current
|
||||
for o in (Order.objects
|
||||
.filter(event=event, status=Order.STATUS_CANCELLED)
|
||||
.values('payment_provider')
|
||||
.annotate(cnt=Count('id'), payment_fee=Sum('payment_fee')).order_by())
|
||||
}
|
||||
num_refunded = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in (Order.objects.current
|
||||
for o in (Order.objects
|
||||
.filter(event=event, status=Order.STATUS_REFUNDED)
|
||||
.values('payment_provider')
|
||||
.annotate(cnt=Count('id'), payment_fee=Sum('payment_fee')).order_by())
|
||||
}
|
||||
num_pending = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in (Order.objects.current
|
||||
for o in (Order.objects
|
||||
.filter(event=event, status__in=(Order.STATUS_PENDING, Order.STATUS_EXPIRED))
|
||||
.values('payment_provider')
|
||||
.annotate(cnt=Count('id'), payment_fee=Sum('payment_fee')).order_by())
|
||||
}
|
||||
num_paid = {
|
||||
o['payment_provider']: (o['cnt'], o['payment_fee'])
|
||||
for o in (Order.objects.current
|
||||
for o in (Order.objects
|
||||
.filter(event=event, status=Order.STATUS_PAID)
|
||||
.values('payment_provider')
|
||||
.annotate(cnt=Count('id'), payment_fee=Sum('payment_fee')).order_by())
|
||||
|
||||
@@ -9,7 +9,7 @@ from pretix.base.signals import register_ticket_outputs
|
||||
|
||||
|
||||
def generate(order: str, provider: str):
|
||||
order = Order.objects.current.select_related('event').get(identity=order)
|
||||
order = Order.objects.select_related('event').get(id=order)
|
||||
ct = CachedTicket.objects.get_or_create(order=order, provider=provider)[0]
|
||||
if not ct.cachedfile:
|
||||
cf = CachedFile()
|
||||
|
||||
Reference in New Issue
Block a user