Fix #2090 -- Test mode for memberships

This commit is contained in:
Raphael Michel
2021-05-27 11:47:07 +02:00
parent ab30129fc2
commit 49a9b71ea3
21 changed files with 195 additions and 16 deletions

View File

@@ -0,0 +1,26 @@
# Generated by Django 3.2.3 on 2021-05-25 13:11
from django.db import migrations, models
import pretix.base.models.event
import pretix.base.models.fields
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0188_delete_requiredaction'),
]
operations = [
migrations.AddField(
model_name='membership',
name='testmode',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='event',
name='sales_channels',
field=pretix.base.models.fields.MultiStringField(default=pretix.base.models.event.default_sales_channels),
),
]

View File

@@ -114,6 +114,10 @@ class MembershipQuerySetManager(ScopedManager(organizer='customer__organizer')._
class Membership(models.Model):
id = models.BigAutoField(primary_key=True)
testmode = models.BooleanField(
verbose_name=_('Test mode'),
default=False
)
customer = models.ForeignKey(
Customer,
related_name='memberships',
@@ -168,3 +172,6 @@ class Membership(models.Model):
dt = now()
return dt >= self.date_start and dt <= self.date_end
def allow_delete(self):
return self.testmode and not self.orderposition_set.exists()

View File

@@ -258,7 +258,7 @@ class Order(LockModel, LoggedModel):
return self.full_code
def gracefully_delete(self, user=None, auth=None):
from . import GiftCard, GiftCardTransaction, Voucher
from . import GiftCard, GiftCardTransaction, Membership, Voucher
if not self.testmode:
raise TypeError("Only test mode orders can be deleted.")
@@ -280,6 +280,7 @@ class Order(LockModel, LoggedModel):
GiftCardTransaction.objects.filter(refund__in=self.refunds.all()).update(refund=None)
GiftCardTransaction.objects.filter(order=self).update(order=None)
GiftCard.objects.filter(issued_in__in=self.positions.all()).update(issued_in=None)
Membership.objects.filter(granted_in__order=self, testmode=True).update(granted_in=None)
OrderPosition.all.filter(order=self, addon_to__isnull=False).delete()
OrderPosition.all.filter(order=self).delete()
OrderFee.all.filter(order=self).delete()
@@ -846,7 +847,7 @@ class Order(LockModel, LoggedModel):
try:
if check_memberships:
try:
validate_memberships_in_order(self.customer, positions, self.event, lock=False)
validate_memberships_in_order(self.customer, positions, self.event, lock=False, testmode=self.testmode)
except ValidationError as e:
raise Quota.QuotaExceededException(e.message)

View File

@@ -76,11 +76,12 @@ def create_membership(customer: Customer, position: OrderPosition):
granted_in=position,
date_start=date_start,
date_end=date_end,
attendee_name_parts=position.attendee_name_parts
attendee_name_parts=position.attendee_name_parts,
testmode=position.order.testmode,
)
def validate_memberships_in_order(customer: Customer, positions: List[AbstractPosition], event: Event, lock=False, ignored_order: Order = None):
def validate_memberships_in_order(customer: Customer, positions: List[AbstractPosition], event: Event, lock=False, ignored_order: Order = None, testmode=False):
"""
Validate that a set of cart or order positions. This currently does not validate
@@ -89,6 +90,7 @@ def validate_memberships_in_order(customer: Customer, positions: List[AbstractPo
:param event: Event this all is computed in
:param lock: Whether to place a SELECT FOR UPDATE lock on the selected memberships
:param ignored_order: An order that should be ignored for usage counting
:param testmode: If ``True``, only test mode memberships are allowed. If ``False``, test mode memberships are not allowed.
"""
tz = event.timezone
applicable_positions = [
@@ -139,6 +141,11 @@ def validate_memberships_in_order(customer: Customer, positions: List[AbstractPo
_('You selected a membership that is connected to a different customer account.')
)
if m.testmode != testmode:
raise ValidationError(
_('You can only use a test mode membership for test mode tickets.')
)
ev = p.subevent or event
if not m.is_valid(ev):

View File

@@ -817,7 +817,7 @@ def _create_order(event: Event, email: str, positions: List[CartPosition], now_d
raise OrderError(_("You cannot pay with gift cards when buying a gift card."))
try:
validate_memberships_in_order(customer, positions, event, lock=True)
validate_memberships_in_order(customer, positions, event, lock=True, testmode=event.testmode)
except ValidationError as e:
raise OrderError(e.message)
@@ -2063,7 +2063,7 @@ class OrderChangeManager:
)
fake_cart.append(cp)
try:
validate_memberships_in_order(self.order.customer, fake_cart, self.event, lock=True, ignored_order=self.order)
validate_memberships_in_order(self.order.customer, fake_cart, self.event, lock=True, ignored_order=self.order, testmode=self.order.testmode)
except ValidationError as e:
raise OrderError(e.message)