mirror of
https://github.com/pretix/pretix.git
synced 2026-09-13 16:14:40 +00:00
Do not create duplicate memberships on order changes (Z#23163336) (#4408)
This commit is contained in:
@@ -3152,7 +3152,7 @@ def signal_listener_issue_memberships(sender: Event, order: Order, **kwargs):
|
|||||||
if order.status != Order.STATUS_PAID or not order.customer:
|
if order.status != Order.STATUS_PAID or not order.customer:
|
||||||
return
|
return
|
||||||
for p in order.positions.all():
|
for p in order.positions.all():
|
||||||
if p.item.grant_membership_type_id:
|
if p.item.grant_membership_type_id and not p.granted_memberships.exists():
|
||||||
create_membership(order.customer, p)
|
create_membership(order.customer, p)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -151,6 +151,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
{% bootstrap_field position.form.itemvar layout='inline' %}
|
{% bootstrap_field position.form.itemvar layout='inline' %}
|
||||||
|
{% if position.granted_memberships.all %}
|
||||||
|
<span class="text-muted">
|
||||||
|
<span class="fa fa-warning text-warning" aria-hidden="true"></span>
|
||||||
|
{% trans "The sale of this position created a membership. Changing the product here will not affect the membership. Memberships can be managed in the customer account." %}
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -254,6 +260,12 @@
|
|||||||
{% trans "–" %}
|
{% trans "–" %}
|
||||||
</div>
|
</div>
|
||||||
{% bootstrap_field position.form.valid_until layout='inline' %}
|
{% bootstrap_field position.form.valid_until layout='inline' %}
|
||||||
|
{% if position.granted_memberships.all %}
|
||||||
|
<span class="text-muted">
|
||||||
|
<span class="fa fa-warning text-warning" aria-hidden="true"></span>
|
||||||
|
{% trans "The sale of this position created a membership. Changing the validity of the ticket here will not affect the membership. Memberships can be managed in the customer account." %}
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1900,7 +1900,7 @@ class OrderChange(OrderView):
|
|||||||
positions = list(self.order.positions.select_related(
|
positions = list(self.order.positions.select_related(
|
||||||
'item', 'item__tax_rule', 'used_membership', 'used_membership__membership_type', 'tax_rule',
|
'item', 'item__tax_rule', 'used_membership', 'used_membership__membership_type', 'tax_rule',
|
||||||
'seat', 'subevent',
|
'seat', 'subevent',
|
||||||
))
|
).prefetch_related('granted_memberships'))
|
||||||
for p in positions:
|
for p in positions:
|
||||||
p.form = OrderPositionChangeForm(prefix='op-{}'.format(p.pk), instance=p, items=self.items,
|
p.form = OrderPositionChangeForm(prefix='op-{}'.format(p.pk), instance=p, items=self.items,
|
||||||
initial={'seat': p.seat.seat_guid if p.seat else None},
|
initial={'seat': p.seat.seat_guid if p.seat else None},
|
||||||
|
|||||||
@@ -1662,7 +1662,7 @@ class OrderChangeManagerTests(TestCase):
|
|||||||
mt = self.event.organizer.membership_types.create(name="foo")
|
mt = self.event.organizer.membership_types.create(name="foo")
|
||||||
customer = self.event.organizer.customers.create()
|
customer = self.event.organizer.customers.create()
|
||||||
self.order.customer = customer
|
self.order.customer = customer
|
||||||
self.o.save()
|
self.order.save()
|
||||||
m = customer.memberships.create(
|
m = customer.memberships.create(
|
||||||
membership_type=mt,
|
membership_type=mt,
|
||||||
date_start=now(),
|
date_start=now(),
|
||||||
@@ -1674,6 +1674,37 @@ class OrderChangeManagerTests(TestCase):
|
|||||||
m.refresh_from_db()
|
m.refresh_from_db()
|
||||||
assert m.canceled
|
assert m.canceled
|
||||||
|
|
||||||
|
@classscope(attr='o')
|
||||||
|
def test_create_membership_after_change(self):
|
||||||
|
mt = self.event.organizer.membership_types.create(name="foo")
|
||||||
|
customer = self.event.organizer.customers.create()
|
||||||
|
self.ticket.grant_membership_type = mt
|
||||||
|
self.ticket.save()
|
||||||
|
self.ticket2.grant_membership_type = mt
|
||||||
|
self.ticket2.save()
|
||||||
|
self.order.customer = customer
|
||||||
|
self.order.status = Order.STATUS_PAID
|
||||||
|
self.order.save()
|
||||||
|
assert customer.memberships.count() == 0
|
||||||
|
self.ocm.change_item(self.op1, item=self.ticket2, variation=None)
|
||||||
|
self.ocm.cancel(self.op2)
|
||||||
|
self.ocm.commit()
|
||||||
|
|
||||||
|
self.order.refresh_from_db()
|
||||||
|
self.op1.refresh_from_db()
|
||||||
|
customer.refresh_from_db()
|
||||||
|
assert self.op1.granted_memberships.count() == 1
|
||||||
|
assert customer.memberships.count() == 1
|
||||||
|
|
||||||
|
# But only once
|
||||||
|
self.ocm = OrderChangeManager(self.order, None)
|
||||||
|
self.ocm.change_item(self.op1, item=self.ticket, variation=None)
|
||||||
|
self.ocm.commit()
|
||||||
|
|
||||||
|
customer.refresh_from_db()
|
||||||
|
assert self.op1.granted_memberships.count() == 1
|
||||||
|
assert customer.memberships.count() == 1
|
||||||
|
|
||||||
@classscope(attr='o')
|
@classscope(attr='o')
|
||||||
def test_cancel_issued_giftcard_used(self):
|
def test_cancel_issued_giftcard_used(self):
|
||||||
gc = self.o.issued_gift_cards.create(currency="EUR", issued_in=self.op1)
|
gc = self.o.issued_gift_cards.create(currency="EUR", issued_in=self.op1)
|
||||||
|
|||||||
Reference in New Issue
Block a user