mirror of
https://github.com/pretix/pretix.git
synced 2025-12-11 01:22:28 +00:00
Compare commits
10 Commits
dependabot
...
v2.7.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a9709c29d | ||
|
|
f78f8acfa9 | ||
|
|
c2a77752c6 | ||
|
|
a0bc2688b1 | ||
|
|
a059eb0de6 | ||
|
|
dba9a56a67 | ||
|
|
15f445cb3d | ||
|
|
c9f6c71c81 | ||
|
|
2032d36ad6 | ||
|
|
ffb4cf08d1 |
@@ -1 +1 @@
|
|||||||
__version__ = "2.7.0"
|
__version__ = "2.7.2"
|
||||||
|
|||||||
@@ -634,7 +634,7 @@ class CartManager:
|
|||||||
Q(voucher=voucher) & Q(event=self.event) &
|
Q(voucher=voucher) & Q(event=self.event) &
|
||||||
Q(expires__gte=self.now_dt)
|
Q(expires__gte=self.now_dt)
|
||||||
).exclude(pk__in=[
|
).exclude(pk__in=[
|
||||||
op.position.voucher_id for op in self._operations if isinstance(op, self.ExtendOperation)
|
op.position.id for op in self._operations if isinstance(op, self.ExtendOperation)
|
||||||
])
|
])
|
||||||
cart_count = redeemed_in_carts.count()
|
cart_count = redeemed_in_carts.count()
|
||||||
v_avail = voucher.max_usages - voucher.redeemed - cart_count
|
v_avail = voucher.max_usages - voucher.redeemed - cart_count
|
||||||
|
|||||||
@@ -531,7 +531,6 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
if price.gross != cp.price and not (cp.item.free_price and cp.price > price.gross):
|
if price.gross != cp.price and not (cp.item.free_price and cp.price > price.gross):
|
||||||
positions[i] = cp
|
|
||||||
cp.price = price.gross
|
cp.price = price.gross
|
||||||
cp.includes_tax = bool(price.rate)
|
cp.includes_tax = bool(price.rate)
|
||||||
cp.save()
|
cp.save()
|
||||||
@@ -555,7 +554,6 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio
|
|||||||
break
|
break
|
||||||
|
|
||||||
if quota_ok:
|
if quota_ok:
|
||||||
positions[i] = cp
|
|
||||||
cp.expires = now_dt + timedelta(
|
cp.expires = now_dt + timedelta(
|
||||||
minutes=event.settings.get('reservation_time', as_type=int))
|
minutes=event.settings.get('reservation_time', as_type=int))
|
||||||
cp.save()
|
cp.save()
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ class VoucherDelete(EventPermissionRequiredMixin, DeleteView):
|
|||||||
messages.error(request, _('A voucher can not be deleted if it already has been redeemed.'))
|
messages.error(request, _('A voucher can not be deleted if it already has been redeemed.'))
|
||||||
else:
|
else:
|
||||||
self.object.log_action('pretix.voucher.deleted', user=self.request.user)
|
self.object.log_action('pretix.voucher.deleted', user=self.request.user)
|
||||||
CartPosition.objects.filter(addon_to__voucher=False).delete()
|
CartPosition.objects.filter(addon_to__voucher=self.object).delete()
|
||||||
self.object.cartposition_set.all().delete()
|
self.object.cartposition_set.all().delete()
|
||||||
self.object.delete()
|
self.object.delete()
|
||||||
messages.success(request, _('The selected voucher has been deleted.'))
|
messages.success(request, _('The selected voucher has been deleted.'))
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.files.base import ContentFile
|
from django.core.files.base import ContentFile, File
|
||||||
from django.core.files.storage import default_storage
|
from django.core.files.storage import default_storage
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
@@ -35,4 +35,7 @@ class Command(BaseCommand):
|
|||||||
gs.settings.set('widget_file_{}'.format(lc), 'file://' + newname)
|
gs.settings.set('widget_file_{}'.format(lc), 'file://' + newname)
|
||||||
gs.settings.set('widget_checksum_{}'.format(lc), checksum)
|
gs.settings.set('widget_checksum_{}'.format(lc), checksum)
|
||||||
if fname:
|
if fname:
|
||||||
default_storage.delete(fname)
|
if isinstance(fname, File):
|
||||||
|
default_storage.delete(fname.name)
|
||||||
|
else:
|
||||||
|
default_storage.delete(fname)
|
||||||
|
|||||||
@@ -181,6 +181,12 @@ def get_grouped_items(event, subevent=None, voucher=None, channel='web'):
|
|||||||
|
|
||||||
display_add_to_cart = display_add_to_cart or var.order_max > 0
|
display_add_to_cart = display_add_to_cart or var.order_max > 0
|
||||||
|
|
||||||
|
item.original_price = (
|
||||||
|
item.tax(item.original_price, currency=event.currency, include_bundled=True,
|
||||||
|
base_price_is='net' if event.settings.display_net_prices else 'gross') # backwards-compat
|
||||||
|
if item.original_price else None
|
||||||
|
)
|
||||||
|
|
||||||
item.available_variations = [
|
item.available_variations = [
|
||||||
v for v in item.available_variations if v._subevent_quotas and (
|
v for v in item.available_variations if v._subevent_quotas and (
|
||||||
not voucher or not voucher.quota_id or v in restrict_vars
|
not voucher or not voucher.quota_id or v in restrict_vars
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ pre[lang=ck], input[lang=ck], textarea[lang=ck], div[lang=ck] { background-image
|
|||||||
pre[lang=cl], input[lang=cl], textarea[lang=cl], div[lang=cl] { background-image: url(static('pretixbase/img/flags/cl.png')); }
|
pre[lang=cl], input[lang=cl], textarea[lang=cl], div[lang=cl] { background-image: url(static('pretixbase/img/flags/cl.png')); }
|
||||||
pre[lang=cm], input[lang=cm], textarea[lang=cm], div[lang=cm] { background-image: url(static('pretixbase/img/flags/cm.png')); }
|
pre[lang=cm], input[lang=cm], textarea[lang=cm], div[lang=cm] { background-image: url(static('pretixbase/img/flags/cm.png')); }
|
||||||
pre[lang=cn], input[lang=cn], textarea[lang=cn], div[lang=cn] { background-image: url(static('pretixbase/img/flags/cn.png')); }
|
pre[lang=cn], input[lang=cn], textarea[lang=cn], div[lang=cn] { background-image: url(static('pretixbase/img/flags/cn.png')); }
|
||||||
|
pre[lang=zh-hans], input[lang=zh-hans], textarea[lang=zh-hans], div[lang=zh-hans] { background-image: url(static('pretixbase/img/flags/cn.png')); }
|
||||||
pre[lang=co], input[lang=co], textarea[lang=co], div[lang=co] { background-image: url(static('pretixbase/img/flags/co.png')); }
|
pre[lang=co], input[lang=co], textarea[lang=co], div[lang=co] { background-image: url(static('pretixbase/img/flags/co.png')); }
|
||||||
pre[lang=cr], input[lang=cr], textarea[lang=cr], div[lang=cr] { background-image: url(static('pretixbase/img/flags/cr.png')); }
|
pre[lang=cr], input[lang=cr], textarea[lang=cr], div[lang=cr] { background-image: url(static('pretixbase/img/flags/cr.png')); }
|
||||||
pre[lang=cs], input[lang=cs], textarea[lang=cs], div[lang=cs] { background-image: url(static('pretixbase/img/flags/cs.png')); }
|
pre[lang=cs], input[lang=cs], textarea[lang=cs], div[lang=cs] { background-image: url(static('pretixbase/img/flags/cs.png')); }
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ Vue.component('pricebox', {
|
|||||||
+ '<div v-if="free_price">'
|
+ '<div v-if="free_price">'
|
||||||
+ '{{ $root.currency }} '
|
+ '{{ $root.currency }} '
|
||||||
+ '<input type="number" class="pretix-widget-pricebox-price-input" placeholder="0" '
|
+ '<input type="number" class="pretix-widget-pricebox-price-input" placeholder="0" '
|
||||||
+ ' :min="display_price" :value="display_price" :name="field_name"'
|
+ ' :min="display_price_nonlocalized" :value="display_price_nonlocalized" :name="field_name"'
|
||||||
+ ' step="any">'
|
+ ' step="any">'
|
||||||
+ '</div>'
|
+ '</div>'
|
||||||
+ '<small class="pretix-widget-pricebox-tax" v-if="price.rate != \'0.00\' && price.gross != \'0.00\'">'
|
+ '<small class="pretix-widget-pricebox-tax" v-if="price.rate != \'0.00\' && price.gross != \'0.00\'">'
|
||||||
@@ -255,6 +255,13 @@ Vue.component('pricebox', {
|
|||||||
return floatformat(parseFloat(this.price.gross), 2);
|
return floatformat(parseFloat(this.price.gross), 2);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
display_price_nonlocalized: function () {
|
||||||
|
if (this.$root.display_net_prices) {
|
||||||
|
return parseFloat(this.price.net).toFixed(2);
|
||||||
|
} else {
|
||||||
|
return parseFloat(this.price.gross).toFixed(2);
|
||||||
|
}
|
||||||
|
},
|
||||||
original_line: function () {
|
original_line: function () {
|
||||||
return this.$root.currency + " " + floatformat(parseFloat(this.original_price), 2);
|
return this.$root.currency + " " + floatformat(parseFloat(this.original_price), 2);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2206,6 +2206,21 @@ class CheckoutBundleTest(BaseCheckoutTestCase, TestCase):
|
|||||||
assert a.tax_rate == Decimal('7.00')
|
assert a.tax_rate == Decimal('7.00')
|
||||||
assert a.tax_value == Decimal('0.10')
|
assert a.tax_value == Decimal('0.10')
|
||||||
|
|
||||||
|
def test_simple_bundle_with_voucher(self):
|
||||||
|
v = Voucher.objects.create(item=self.ticket, value=Decimal('12.00'), event=self.event, price_mode='none',
|
||||||
|
valid_until=now() + timedelta(days=2))
|
||||||
|
self.cp1.voucher = v
|
||||||
|
self.cp1.save()
|
||||||
|
oid = _perform_order(self.event.pk, 'manual', [self.cp1.pk, self.bundled1.pk], 'admin@example.org', 'en', None, {}, 'web')
|
||||||
|
o = Order.objects.get(pk=oid)
|
||||||
|
cp = o.positions.get(addon_to__isnull=True)
|
||||||
|
assert cp.item == self.ticket
|
||||||
|
assert cp.price == 23 - 1.5
|
||||||
|
assert cp.addons.count() == 1
|
||||||
|
a = cp.addons.get()
|
||||||
|
assert a.item == self.trans
|
||||||
|
assert a.price == 1.5
|
||||||
|
|
||||||
def test_expired_keep_price(self):
|
def test_expired_keep_price(self):
|
||||||
self.cp1.expires = now() - timedelta(minutes=10)
|
self.cp1.expires = now() - timedelta(minutes=10)
|
||||||
self.cp1.save()
|
self.cp1.save()
|
||||||
|
|||||||
Reference in New Issue
Block a user