forked from CGM_Public/pretix_original
Order change: Allow to keep price when changing items
This commit is contained in:
@@ -815,12 +815,17 @@ class OrderChangeManager:
|
|||||||
self.notify = notify
|
self.notify = notify
|
||||||
self._invoice_dirty = False
|
self._invoice_dirty = False
|
||||||
|
|
||||||
def change_item(self, position: OrderPosition, item: Item, variation: Optional[ItemVariation]):
|
def change_item(self, position: OrderPosition, item: Item, variation: Optional[ItemVariation], keep_price=False):
|
||||||
if (not variation and item.has_variations) or (variation and variation.item_id != item.pk):
|
if (not variation and item.has_variations) or (variation and variation.item_id != item.pk):
|
||||||
raise OrderError(self.error_messages['product_without_variation'])
|
raise OrderError(self.error_messages['product_without_variation'])
|
||||||
|
|
||||||
price = get_price(item, variation, voucher=position.voucher, subevent=position.subevent,
|
if keep_price:
|
||||||
invoice_address=self._invoice_address)
|
price = TaxedPrice(gross=position.price, net=position.price - position.tax_value,
|
||||||
|
tax=position.tax_value, rate=position.tax_rate,
|
||||||
|
name=position.tax_rule.name)
|
||||||
|
else:
|
||||||
|
price = get_price(item, variation, voucher=position.voucher, subevent=position.subevent,
|
||||||
|
invoice_address=self._invoice_address)
|
||||||
|
|
||||||
if price is None: # NOQA
|
if price is None: # NOQA
|
||||||
raise OrderError(self.error_messages['product_invalid'])
|
raise OrderError(self.error_messages['product_invalid'])
|
||||||
|
|||||||
@@ -286,6 +286,7 @@ class OrderPositionChangeForm(forms.Form):
|
|||||||
('secret', 'Regenerate secret'),
|
('secret', 'Regenerate secret'),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
change_product_keep_price = forms.BooleanField(required=False)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
instance = kwargs.pop('instance')
|
instance = kwargs.pop('instance')
|
||||||
|
|||||||
@@ -95,6 +95,10 @@
|
|||||||
{% trans "Change product to" %}
|
{% trans "Change product to" %}
|
||||||
{% bootstrap_field position.form.itemvar layout='inline' %}
|
{% bootstrap_field position.form.itemvar layout='inline' %}
|
||||||
</label>
|
</label>
|
||||||
|
<label class="checkbox">
|
||||||
|
{{ position.form.change_product_keep_price }}
|
||||||
|
{% trans "Keep price the same" %}
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
{% if request.event.has_subevents %}
|
{% if request.event.has_subevents %}
|
||||||
<div class="radio">
|
<div class="radio">
|
||||||
|
|||||||
@@ -1229,7 +1229,7 @@ class OrderChange(OrderView):
|
|||||||
variation = ItemVariation.objects.get(pk=varid, item=item)
|
variation = ItemVariation.objects.get(pk=varid, item=item)
|
||||||
else:
|
else:
|
||||||
variation = None
|
variation = None
|
||||||
ocm.change_item(p, item, variation)
|
ocm.change_item(p, item, variation, keep_price=p.form.cleaned_data['change_product_keep_price'])
|
||||||
elif p.form.cleaned_data['operation'] == 'price':
|
elif p.form.cleaned_data['operation'] == 'price':
|
||||||
ocm.change_price(p, p.form.cleaned_data['price'])
|
ocm.change_price(p, p.form.cleaned_data['price'])
|
||||||
elif p.form.cleaned_data['operation'] == 'subevent':
|
elif p.form.cleaned_data['operation'] == 'subevent':
|
||||||
|
|||||||
@@ -678,6 +678,17 @@ class OrderChangeManagerTests(TestCase):
|
|||||||
with self.assertRaises(OrderError):
|
with self.assertRaises(OrderError):
|
||||||
self.ocm.change_item(self.op1, self.shirt, None)
|
self.ocm.change_item(self.op1, self.shirt, None)
|
||||||
|
|
||||||
|
def test_change_item_keep_price(self):
|
||||||
|
p = self.op1.price
|
||||||
|
tv = self.op1.tax_value
|
||||||
|
self.ocm.change_item(self.op1, self.shirt, None, keep_price=True)
|
||||||
|
self.ocm.commit()
|
||||||
|
self.op1.refresh_from_db()
|
||||||
|
self.order.refresh_from_db()
|
||||||
|
assert self.op1.item == self.shirt
|
||||||
|
assert self.op1.price == p
|
||||||
|
assert self.op1.tax_value == tv
|
||||||
|
|
||||||
def test_change_item_success(self):
|
def test_change_item_success(self):
|
||||||
self.ocm.change_item(self.op1, self.shirt, None)
|
self.ocm.change_item(self.op1, self.shirt, None)
|
||||||
self.ocm.commit()
|
self.ocm.commit()
|
||||||
|
|||||||
Reference in New Issue
Block a user