diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index 3a7c565e7e..53d62a3608 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -850,17 +850,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): addon_to=pos.addon_to, invoice_address=ia, ) - pbv = get_price( - item=pos.item, - variation=pos.variation, - voucher=None, - custom_price=None, - subevent=pos.subevent, - addon_to=pos.addon_to, - invoice_address=ia, - ) pos.price = price.gross - pos.price_before_voucher = pbv pos.tax_rate = price.rate pos.tax_value = price.tax pos.tax_rule = pos.item.tax_rule diff --git a/src/pretix/base/migrations/0142_auto_20191215_1522.py b/src/pretix/base/migrations/0142_auto_20191215_1522.py deleted file mode 100644 index fa7d764cc6..0000000000 --- a/src/pretix/base/migrations/0142_auto_20191215_1522.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 2.2.7 on 2019-12-15 15:22 - -from decimal import Decimal -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0141_seat_sorting_rank'), - ] - - operations = [ - migrations.AddField( - model_name='cartposition', - name='price_before_voucher', - field=models.DecimalField(decimal_places=2, max_digits=10, null=True), - ), - migrations.AddField( - model_name='orderposition', - name='price_before_voucher', - field=models.DecimalField(decimal_places=2, max_digits=10, null=True), - ), - migrations.AddField( - model_name='voucher', - name='budget', - field=models.DecimalField(decimal_places=2, max_digits=10, null=True), - ), - ] diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 2ffb2dc338..14252e3f7a 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -991,9 +991,6 @@ class AbstractPosition(models.Model): verbose_name=_("Variation"), on_delete=models.PROTECT ) - price_before_voucher = models.DecimalField( - decimal_places=2, max_digits=10, null=True, - ) price = models.DecimalField( decimal_places=2, max_digits=10, verbose_name=_("Price") diff --git a/src/pretix/base/models/vouchers.py b/src/pretix/base/models/vouchers.py index a84ac10f00..3bc82abb1f 100644 --- a/src/pretix/base/models/vouchers.py +++ b/src/pretix/base/models/vouchers.py @@ -4,7 +4,7 @@ from django.conf import settings from django.core.exceptions import ValidationError from django.core.validators import MinLengthValidator from django.db import models -from django.db.models import F, OuterRef, Q, Subquery, Sum +from django.db.models import Q from django.utils.crypto import get_random_string from django.utils.timezone import now from django.utils.translation import pgettext_lazy, ugettext_lazy as _ @@ -17,7 +17,7 @@ from ..decimal import round_decimal from .base import LoggedModel from .event import Event, SubEvent from .items import Item, ItemVariation, Quota -from .orders import CartPosition, Order, OrderPosition +from .orders import Order def _generate_random_code(prefix=None): @@ -114,13 +114,6 @@ class Voucher(LoggedModel): verbose_name=_("Redeemed"), default=0 ) - budget = models.DecimalField( - verbose_name=_("Maximum discount budget"), - help_text=_("This is the maximum monetary amount that will be discounted using this voucher. If this is reached, " - "the voucher becomes inactive."), - decimal_places=2, max_digits=10, - null=True, blank=True - ) valid_until = models.DateTimeField( blank=True, null=True, db_index=True, verbose_name=_("Valid until") @@ -477,38 +470,3 @@ class Voucher(LoggedModel): return self.item.seat_category_mappings.filter(**kwargs).exists() else: return bool(subevent.seating_plan) if subevent else self.event.seating_plan - - @classmethod - def annotate_budget_used_orders(cls, qs): - opq = OrderPosition.objects.filter( - voucher_id=OuterRef('pk'), - price_before_voucher__isnull=False, - order__status__in=[ - Order.STATUS_PAID, - Order.STATUS_PENDING - # TODO: reason about expired orders - ] - ).order_by().values('voucher_id').annotate(s=Sum(F('price_before_voucher') - F('price'))).values('s') - return qs.annotate(budget_used_orders=Subquery(opq, output_field=models.DecimalField(max_digits=10, decimal_places=2))) - - def budget_used(self, ignore_cartpos=None): - ops = OrderPosition.objects.filter( - voucher=self, - price_before_voucher__isnull=False, - order__status__in=[ - Order.STATUS_PAID, - Order.STATUS_PENDING - # TODO: reason about expired orders - ] - ).aggregate(s=Sum(F('price_before_voucher') - F('price')))['s'] or Decimal('0.00') - cpq = CartPosition.objects.filter( - voucher=self, - price_before_voucher__isnull=False, - expires__gt=now() - ) - if isinstance(ignore_cartpos, (tuple, list)): - cpq = cpq.exclude(pk__in=ignore_cartpos) - else: - cpq = cpq.exclude(pk=ignore_cartpos) - cps = cpq.aggregate(s=Sum(F('price_before_voucher') - F('price')))['s'] or Decimal('0.00') - return ops + cps diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index 0f571adddd..936c4352a9 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -108,12 +108,11 @@ error_messages = { class CartManager: AddOperation = namedtuple('AddOperation', ('count', 'item', 'variation', 'price', 'voucher', 'quotas', - 'addon_to', 'subevent', 'includes_tax', 'bundled', 'seat', - 'price_before_voucher')) + 'addon_to', 'subevent', 'includes_tax', 'bundled', 'seat')) RemoveOperation = namedtuple('RemoveOperation', ('position',)) VoucherOperation = namedtuple('VoucherOperation', ('position', 'voucher', 'price')) ExtendOperation = namedtuple('ExtendOperation', ('position', 'count', 'item', 'variation', 'price', 'voucher', - 'quotas', 'subevent', 'seat', 'price_before_voucher')) + 'quotas', 'subevent', 'seat')) order = { RemoveOperation: 10, VoucherOperation: 15, @@ -385,7 +384,6 @@ class CartManager: else: price = self._get_price(cp.item, cp.variation, cp.voucher, price, cp.subevent, force_custom_price=True) - pbv = TAXED_ZERO else: bundled_sum = Decimal('0.00') if not cp.addon_to_id: @@ -398,14 +396,9 @@ class CartManager: price = self._get_price(cp.item, cp.variation, cp.voucher, cp.price, cp.subevent, cp_is_net=True, bundled_sum=bundled_sum) price = TaxedPrice(net=price.net, gross=price.net, rate=0, tax=0, name='') - pbv = self._get_price(cp.item, cp.variation, None, cp.price, cp.subevent, - cp_is_net=True, bundled_sum=bundled_sum) - pbv = TaxedPrice(net=pbv.net, gross=pbv.net, rate=0, tax=0, name='') else: price = self._get_price(cp.item, cp.variation, cp.voucher, cp.price, cp.subevent, bundled_sum=bundled_sum) - pbv = self._get_price(cp.item, cp.variation, None, cp.price, cp.subevent, - bundled_sum=bundled_sum) quotas = list(cp.quotas) if not quotas: @@ -421,7 +414,7 @@ class CartManager: op = self.ExtendOperation( position=cp, item=cp.item, variation=cp.variation, voucher=cp.voucher, count=1, - price=price, quotas=quotas, subevent=cp.subevent, seat=cp.seat, price_before_voucher=pbv + price=price, quotas=quotas, subevent=cp.subevent, seat=cp.seat ) self._check_item_constraints(op) @@ -576,18 +569,16 @@ class CartManager: bop = self.AddOperation( count=bundle.count, item=bitem, variation=bvar, price=bprice, voucher=None, quotas=bundle_quotas, addon_to='FAKE', subevent=subevent, - includes_tax=bool(bprice.rate), bundled=[], seat=None, price_before_voucher=bprice, + includes_tax=bool(bprice.rate), bundled=[], seat=None ) self._check_item_constraints(bop) bundled.append(bop) price = self._get_price(item, variation, voucher, i.get('price'), subevent, bundled_sum=bundled_sum) - pbv = self._get_price(item, variation, None, i.get('price'), subevent, bundled_sum=bundled_sum) op = self.AddOperation( count=i['count'], item=item, variation=variation, price=price, voucher=voucher, quotas=quotas, - addon_to=False, subevent=subevent, includes_tax=bool(price.rate), bundled=bundled, seat=seat, - price_before_voucher=pbv + addon_to=False, subevent=subevent, includes_tax=bool(price.rate), bundled=bundled, seat=seat ) self._check_item_constraints(op) operations.append(op) @@ -907,8 +898,7 @@ class CartManager: event=self.event, item=op.item, variation=op.variation, price=op.price.gross, expires=self._expiry, cart_id=self.cart_id, voucher=op.voucher, addon_to=op.addon_to if op.addon_to else None, - subevent=op.subevent, includes_tax=op.includes_tax, seat=op.seat, - price_before_voucher=op.price_before_voucher.gross + subevent=op.subevent, includes_tax=op.includes_tax, seat=op.seat ) if self.event.settings.attendee_names_asked: scheme = PERSON_NAME_SCHEMES.get(self.event.settings.name_scheme) @@ -955,7 +945,6 @@ class CartManager: elif available_count == 1: op.position.expires = self._expiry op.position.price = op.price.gross - op.position.price_before_voucher = op.price_before_voucher.gross try: op.position.save(force_update=True) except DatabaseError: @@ -975,7 +964,6 @@ class CartManager: # be expected continue - op.position.price_before_voucher = op.position.price op.position.price = op.price.gross op.position.voucher = op.voucher op.position.save() diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 2902e4f825..86497c9352 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -530,8 +530,6 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio bprice = cp.price price = get_price(cp.item, cp.variation, cp.voucher, bprice, cp.subevent, custom_price_is_net=False, invoice_address=address, force_custom_price=True) - pbv = get_price(cp.item, cp.variation, None, bprice, cp.subevent, custom_price_is_net=False, - invoice_address=address, force_custom_price=True) changed_prices[cp.pk] = bprice else: bundled_sum = 0 @@ -542,8 +540,6 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio price = get_price(cp.item, cp.variation, cp.voucher, cp.price, cp.subevent, custom_price_is_net=False, addon_to=cp.addon_to, invoice_address=address, bundled_sum=bundled_sum) - pbv = get_price(cp.item, cp.variation, None, cp.price, cp.subevent, custom_price_is_net=False, - addon_to=cp.addon_to, invoice_address=address, bundled_sum=bundled_sum) if price is False or len(quotas) == 0: err = err or error_messages['unavailable'] @@ -556,8 +552,6 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio delete(cp) continue - cp.price_before_voucher = pbv.gross - if price.gross != cp.price and not (cp.item.free_price and cp.price > price.gross): cp.price = price.gross cp.includes_tax = bool(price.rate) diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index 83c93889c3..8d79910d90 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -38,7 +38,7 @@ class VoucherForm(I18nModelForm): localized_fields = '__all__' fields = [ 'code', 'valid_until', 'block_quota', 'allow_ignore_quota', 'value', 'tag', - 'comment', 'max_usages', 'price_mode', 'subevent', 'show_hidden_items', 'budget' + 'comment', 'max_usages', 'price_mode', 'subevent', 'show_hidden_items', ] field_classes = { 'valid_until': SplitDateTimeField, @@ -268,7 +268,7 @@ class VoucherBulkForm(VoucherForm): localized_fields = '__all__' fields = [ 'valid_until', 'block_quota', 'allow_ignore_quota', 'value', 'tag', 'comment', - 'max_usages', 'price_mode', 'subevent', 'show_hidden_items', 'budget' + 'max_usages', 'price_mode', 'subevent', 'show_hidden_items' ] field_classes = { 'valid_until': SplitDateTimeField, diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 2ca5501b91..6bf7fea6ce 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -272,9 +272,7 @@ {% endif %} {% if line.voucher %}
{% trans "Voucher code used:" %} - + {{ line.voucher.code }} {% endif %} diff --git a/src/pretix/control/templates/pretixcontrol/vouchers/bulk.html b/src/pretix/control/templates/pretixcontrol/vouchers/bulk.html index 7be73a1799..083c6b7d0f 100644 --- a/src/pretix/control/templates/pretixcontrol/vouchers/bulk.html +++ b/src/pretix/control/templates/pretixcontrol/vouchers/bulk.html @@ -73,7 +73,6 @@ {% trans "Advanced settings" %} {% bootstrap_field form.block_quota layout="control" %} {% bootstrap_field form.allow_ignore_quota layout="control" %} - {% bootstrap_field form.budget addon_after=request.event.currency layout="control" %} {% bootstrap_field form.tag layout="control" %} {% bootstrap_field form.comment layout="control" %} {% bootstrap_field form.show_hidden_items layout="control" %} diff --git a/src/pretix/control/templates/pretixcontrol/vouchers/detail.html b/src/pretix/control/templates/pretixcontrol/vouchers/detail.html index 8ff1267ff4..55e06388fe 100644 --- a/src/pretix/control/templates/pretixcontrol/vouchers/detail.html +++ b/src/pretix/control/templates/pretixcontrol/vouchers/detail.html @@ -75,7 +75,6 @@ {% trans "Advanced settings" %} {% bootstrap_field form.block_quota layout="control" %} {% bootstrap_field form.allow_ignore_quota layout="control" %} - {% bootstrap_field form.budget addon_after=request.event.currency layout="control" %} {% bootstrap_field form.tag layout="control" %} {% bootstrap_field form.comment layout="control" %} {% bootstrap_field form.show_hidden_items layout="control" %} diff --git a/src/pretix/control/templates/pretixcontrol/vouchers/index.html b/src/pretix/control/templates/pretixcontrol/vouchers/index.html index 280afef1f5..381e15d21c 100644 --- a/src/pretix/control/templates/pretixcontrol/vouchers/index.html +++ b/src/pretix/control/templates/pretixcontrol/vouchers/index.html @@ -2,7 +2,6 @@ {% load i18n %} {% load bootstrap3 %} {% load urlreplace %} -{% load money %} {% block title %}{% trans "Vouchers" %}{% endblock %} {% block content %}

{% trans "Vouchers" %}

@@ -144,15 +143,7 @@ {{ v.code }} {% if not v.is_active %}{% endif %} - - {{ v.redeemed }} / {{ v.max_usages }} - {% if v.budget|default_if_none:"NONE" != "NONE" %} -
- - {{ v.budget_used_orders|money:request.event.currency }} / {{ v.budget|money:request.event.currency }} - - {% endif %} - + {{ v.redeemed }} / {{ v.max_usages }} {{ v.valid_until|date }} {{ v.tag }} diff --git a/src/pretix/control/views/vouchers.py b/src/pretix/control/views/vouchers.py index 5b247f9019..3aa78524e1 100644 --- a/src/pretix/control/views/vouchers.py +++ b/src/pretix/control/views/vouchers.py @@ -37,11 +37,9 @@ class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView): permission = 'can_view_vouchers' def get_queryset(self): - qs = Voucher.annotate_budget_used_orders(self.request.event.vouchers.filter( - waitinglistentries__isnull=True - ).select_related( + qs = self.request.event.vouchers.filter(waitinglistentries__isnull=True).select_related( 'item', 'variation', 'seat' - )) + ) if self.filter_form.is_valid(): qs = self.filter_form.filter_qs(qs)