From 852bc6c128c068c13d15e07c15bd3d3f6817983b Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 19 Dec 2016 23:13:14 +0100 Subject: [PATCH] Avoid duplicate order position secrets --- src/pretix/base/models/orders.py | 3 +++ src/tests/base/test_models.py | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 32df75113..9cfa9b026 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -495,6 +495,9 @@ class OrderPosition(AbstractPosition): def save(self, *args, **kwargs): if self.tax_rate is None: self._calculate_tax() + if self.pk is None: + while OrderPosition.objects.filter(secret=self.secret).exists(): + self.secret = generate_position_secret() return super().save(*args, **kwargs) diff --git a/src/tests/base/test_models.py b/src/tests/base/test_models.py index 0c9d5b5f5..ecf027673 100644 --- a/src/tests/base/test_models.py +++ b/src/tests/base/test_models.py @@ -577,6 +577,16 @@ class OrderTestCase(BaseQuotaTestCase): variation=None, price=23) assert self.order.can_user_cancel is False + def test_no_duplicate_position_secret(self): + item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23, + admission=True, allow_cancel=False) + p1 = OrderPosition.objects.create(order=self.order, item=item1, secret='ABC', + variation=None, price=23) + p2 = OrderPosition.objects.create(order=self.order, item=item1, secret='ABC', + variation=None, price=23) + assert p1.secret != p2.secret + assert self.order.can_user_cancel is False + class ItemCategoryTest(TestCase): """