mirror of
https://github.com/pretix/pretix.git
synced 2026-05-04 15:04:03 +00:00
Removed multi-dimensional item variations [backwards-incompatible]
This commit is contained in:
@@ -7,143 +7,9 @@ from django.utils.timezone import now
|
||||
|
||||
from pretix.base.models import (
|
||||
CachedFile, CartPosition, Event, Item, ItemCategory, ItemVariation, Order,
|
||||
OrderPosition, Organizer, Property, PropertyValue, Question, Quota, User,
|
||||
OrderPosition, Organizer, Question, Quota, User,
|
||||
)
|
||||
from pretix.base.services.orders import mark_order_paid
|
||||
from pretix.base.types import VariationDict
|
||||
|
||||
|
||||
class ItemVariationsTest(TestCase):
|
||||
"""
|
||||
This test case tests various methods around the properties /
|
||||
variations concept.
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
cls.event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(),
|
||||
)
|
||||
cls.p_size = Property.objects.create(event=cls.event, name='Size')
|
||||
cls.pv_size_s = PropertyValue.objects.create(prop=cls.p_size, value='S')
|
||||
cls.pv_size_m = PropertyValue.objects.create(prop=cls.p_size, value='M')
|
||||
PropertyValue.objects.create(prop=cls.p_size, value='L')
|
||||
cls.p_color = Property.objects.create(event=cls.event, name='Color')
|
||||
cls.pv_color_black = PropertyValue.objects.create(prop=cls.p_color, value='black')
|
||||
PropertyValue.objects.create(prop=cls.p_color, value='blue')
|
||||
|
||||
def test_variationdict(self):
|
||||
i = Item.objects.create(event=self.event, name='Dummy', default_price=0)
|
||||
self.p_size.item = i
|
||||
self.p_size.save()
|
||||
iv = ItemVariation.objects.create(item=i)
|
||||
iv.values.add(self.pv_size_s)
|
||||
|
||||
variations = i.get_all_variations()
|
||||
|
||||
for vd in variations:
|
||||
for i, v in vd.relevant_items():
|
||||
self.assertIs(type(v), PropertyValue)
|
||||
|
||||
for v in vd.relevant_values():
|
||||
self.assertIs(type(v), PropertyValue)
|
||||
|
||||
if vd[self.p_size.pk] == self.pv_size_s:
|
||||
vd1 = vd
|
||||
|
||||
vd2 = VariationDict()
|
||||
vd2[self.p_size.pk] = self.pv_size_s
|
||||
|
||||
self.assertEqual(vd2.identify(), vd1.identify())
|
||||
self.assertEqual(vd2, vd1)
|
||||
|
||||
vd2[self.p_size.pk] = self.pv_size_m
|
||||
|
||||
self.assertNotEqual(vd2.identify(), vd.identify())
|
||||
self.assertNotEqual(vd2, vd1)
|
||||
|
||||
vd3 = vd2.copy()
|
||||
self.assertEqual(vd3, vd2)
|
||||
|
||||
vd2[self.p_size.pk] = self.pv_size_s
|
||||
self.assertNotEqual(vd3, vd2)
|
||||
|
||||
vd4 = VariationDict()
|
||||
vd4[4] = 'b'
|
||||
vd4[2] = 'a'
|
||||
self.assertEqual(vd4.ordered_values(), ['a', 'b'])
|
||||
|
||||
def test_get_all_variations(self):
|
||||
i = Item.objects.create(event=self.event, name='Dummy', default_price=0)
|
||||
|
||||
# No properties available
|
||||
v = i.get_all_variations()
|
||||
self.assertEqual(len(v), 1)
|
||||
self.assertEqual(v[0], {})
|
||||
|
||||
# One property, no variations
|
||||
self.p_size.item = i
|
||||
self.p_size.save()
|
||||
v = i.get_all_variations()
|
||||
self.assertIs(type(v), list)
|
||||
self.assertEqual(len(v), 3)
|
||||
values = []
|
||||
for var in v:
|
||||
self.assertIs(type(var), VariationDict)
|
||||
self.assertIn(self.p_size.pk, var)
|
||||
self.assertIs(type(var[self.p_size.pk]), PropertyValue)
|
||||
values.append(var[self.p_size.pk].value)
|
||||
self.assertEqual(sorted([str(V) for V in values]), sorted(['S', 'M', 'L']))
|
||||
|
||||
# One property, one variation
|
||||
iv = ItemVariation.objects.create(item=i, default_price=0)
|
||||
iv.values.add(self.pv_size_s)
|
||||
v = i.get_all_variations()
|
||||
self.assertIs(type(v), list)
|
||||
self.assertEqual(len(v), 3)
|
||||
values = []
|
||||
num_variations = 0
|
||||
for var in v:
|
||||
self.assertIs(type(var), VariationDict)
|
||||
if 'variation' in var and type(var['variation']) is ItemVariation:
|
||||
self.assertEqual(iv.pk, var['variation'].pk)
|
||||
values.append(var['variation'].values.all()[0].value)
|
||||
num_variations += 1
|
||||
elif self.p_size.pk in var:
|
||||
self.assertIs(type(var[self.p_size.pk]), PropertyValue)
|
||||
values.append(var[self.p_size.pk].value)
|
||||
self.assertEqual(sorted([str(V) for V in values]), sorted(['S', 'M', 'L']))
|
||||
self.assertEqual(num_variations, 1)
|
||||
|
||||
# Two properties, one variation
|
||||
self.p_color.item = i
|
||||
self.p_color.save()
|
||||
iv.values.add(self.pv_color_black)
|
||||
v = i.get_all_variations()
|
||||
self.assertIs(type(v), list)
|
||||
self.assertEqual(len(v), 6)
|
||||
values = []
|
||||
num_variations = 0
|
||||
for var in v:
|
||||
self.assertIs(type(var), VariationDict)
|
||||
if 'variation' in var:
|
||||
self.assertEqual(iv.pk, var['variation'].pk)
|
||||
values.append(sorted([str(ivv.value) for ivv in iv.values.all()]))
|
||||
self.assertEqual(sorted([str(ivv.value) for ivv in iv.values.all()]), sorted(['S', 'black']))
|
||||
num_variations += 1
|
||||
else:
|
||||
values.append(sorted([str(pv.value) for pv in var.values()]))
|
||||
self.assertEqual(sorted(values), sorted([
|
||||
['S', 'black'],
|
||||
['S', 'blue'],
|
||||
['M', 'black'],
|
||||
['M', 'blue'],
|
||||
['L', 'black'],
|
||||
['L', 'blue'],
|
||||
]))
|
||||
self.assertEqual(num_variations, 1)
|
||||
|
||||
|
||||
class UserTestCase(TestCase):
|
||||
@@ -184,12 +50,7 @@ class BaseQuotaTestCase(TestCase):
|
||||
self.item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23,
|
||||
admission=True)
|
||||
self.item2 = Item.objects.create(event=self.event, name="T-Shirt", default_price=23)
|
||||
p = Property.objects.create(event=self.event, name='Size', item=self.item2)
|
||||
pv1 = PropertyValue.objects.create(prop=p, value='S')
|
||||
PropertyValue.objects.create(prop=p, value='M')
|
||||
PropertyValue.objects.create(prop=p, value='L')
|
||||
self.var1 = ItemVariation.objects.create(item=self.item2)
|
||||
self.var1.values.add(pv1)
|
||||
self.var1 = ItemVariation.objects.create(item=self.item2, value='S')
|
||||
|
||||
|
||||
class QuotaTestCase(BaseQuotaTestCase):
|
||||
|
||||
@@ -3,13 +3,12 @@ import os
|
||||
import time
|
||||
import unittest
|
||||
|
||||
from django.utils.timezone import now
|
||||
from selenium.webdriver.support.select import Select
|
||||
from tests.base import BrowserTest
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, EventPermission, Item, ItemCategory, Organizer, OrganizerPermission,
|
||||
Property, PropertyValue, Question, Quota, User,
|
||||
Event, EventPermission, Item, ItemCategory, ItemVariation, Organizer,
|
||||
OrganizerPermission, Question, Quota, User,
|
||||
)
|
||||
|
||||
|
||||
@@ -105,62 +104,6 @@ class CategoriesTest(ItemFormTest):
|
||||
assert not ItemCategory.objects.filter(id=c.id).exists()
|
||||
|
||||
|
||||
class PropertiesTest(ItemFormTest):
|
||||
"""
|
||||
Properties have moved from their original place, skip this for now
|
||||
"""
|
||||
|
||||
@unittest.skip
|
||||
def test_create(self):
|
||||
self.driver.get('%s/control/event/%s/%s/properties/add' % (
|
||||
self.live_server_url, self.orga1.slug, self.event1.slug
|
||||
))
|
||||
self.driver.find_element_by_css_selector("#id_name_0").send_keys('Size')
|
||||
self.driver.find_element_by_name("values-0-value_0").send_keys('S')
|
||||
self.driver.find_element_by_name("values-1-value_0").send_keys('M')
|
||||
self.scroll_and_click(self.driver.find_element_by_class_name("btn-save"))
|
||||
self.driver.find_element_by_class_name("alert-success")
|
||||
self.assertIn("Size", self.driver.find_element_by_css_selector("#page-wrapper table").text)
|
||||
self.driver.find_element_by_partial_link_text("Size").click()
|
||||
self.assertEqual("S", self.driver.find_element_by_name("values-0-value_0").get_attribute("value"))
|
||||
self.assertEqual("M", self.driver.find_element_by_name("values-1-value_0").get_attribute("value"))
|
||||
|
||||
@unittest.skip
|
||||
def test_update(self):
|
||||
c = Property.objects.create(event=self.event1, name="Size")
|
||||
p1 = PropertyValue.objects.create(prop=c, position=0, value="S")
|
||||
p2 = PropertyValue.objects.create(prop=c, position=1, value="M")
|
||||
self.driver.get('%s/control/event/%s/%s/properties/%s/' % (
|
||||
self.live_server_url, self.orga1.slug, self.event1.slug, c.id
|
||||
))
|
||||
self.driver.find_element_by_css_selector("#id_name_0").clear()
|
||||
self.driver.find_element_by_css_selector("#id_name_0").send_keys('Color')
|
||||
self.driver.find_elements_by_css_selector("div.form-group button.btn-danger")[0].click()
|
||||
self.scroll_into_view(self.driver.find_element_by_name("values-1-value_0"))
|
||||
self.driver.find_element_by_name("values-1-value_0").clear()
|
||||
self.driver.find_element_by_name("values-1-value_0").send_keys('red')
|
||||
self.driver.find_element_by_css_selector("button[data-formset-add]").click()
|
||||
self.driver.find_element_by_name("values-2-value_0").send_keys('blue')
|
||||
self.driver.find_element_by_class_name("btn-save").click()
|
||||
self.driver.find_element_by_class_name("alert-success")
|
||||
self.assertEqual("red", self.driver.find_element_by_name("values-0-value_0").get_attribute("value"))
|
||||
self.assertEqual("blue", self.driver.find_element_by_name("values-1-value_0").get_attribute("value"))
|
||||
assert str(Property.objects.get(id=c.id).name) == 'Color'
|
||||
assert str(PropertyValue.objects.get(id=p2.id).value) == 'red'
|
||||
assert not PropertyValue.objects.filter(id=p1.id).exists()
|
||||
|
||||
@unittest.skip
|
||||
def test_delete(self):
|
||||
c = Property.objects.create(event=self.event1, name="Size")
|
||||
self.driver.get('%s/control/event/%s/%s/properties/%s/delete' % (
|
||||
self.live_server_url, self.orga1.slug, self.event1.slug, c.id
|
||||
))
|
||||
self.driver.find_element_by_class_name("btn-danger").click()
|
||||
self.driver.find_element_by_class_name("alert-success")
|
||||
self.assertNotIn("Size", self.driver.find_element_by_css_selector("#page-wrapper table").text)
|
||||
assert not Property.objects.filter(id=c.id).exists()
|
||||
|
||||
|
||||
class QuestionsTest(ItemFormTest):
|
||||
|
||||
def test_create(self):
|
||||
@@ -215,9 +158,8 @@ class QuotaTest(ItemFormTest):
|
||||
c = Quota.objects.create(event=self.event1, name="Full house", size=500)
|
||||
item1 = Item.objects.create(event=self.event1, name="Standard", default_price=0)
|
||||
item2 = Item.objects.create(event=self.event1, name="Business", default_price=0)
|
||||
prop1 = Property.objects.create(event=self.event1, name="Level", item=item2)
|
||||
PropertyValue.objects.create(prop=prop1, value="Silver")
|
||||
PropertyValue.objects.create(prop=prop1, value="Gold")
|
||||
ItemVariation.objects.create(item=item2, value="Silver")
|
||||
ItemVariation.objects.create(item=item2, value="Gold")
|
||||
self.driver.get('%s/control/event/%s/%s/quotas/%s/' % (
|
||||
self.live_server_url, self.orga1.slug, self.event1.slug, c.id
|
||||
))
|
||||
|
||||
@@ -35,7 +35,6 @@ event_urls = [
|
||||
"items/add",
|
||||
"items/1/",
|
||||
"items/1/variations",
|
||||
"items/1/properties",
|
||||
"categories/",
|
||||
"categories/add",
|
||||
"categories/2/",
|
||||
|
||||
@@ -6,7 +6,7 @@ from django.utils.timezone import now
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, EventPermission, Item, ItemVariation, Order, OrderPosition,
|
||||
Organizer, Property, PropertyValue, User,
|
||||
Organizer, User,
|
||||
)
|
||||
|
||||
|
||||
@@ -20,13 +20,8 @@ def env():
|
||||
user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
EventPermission.objects.create(user=user, event=event)
|
||||
shirt = Item.objects.create(event=event, name='T-Shirt', default_price=12)
|
||||
prop1 = Property.objects.create(event=event, name="Color", item=shirt)
|
||||
val1 = PropertyValue.objects.create(prop=prop1, value="Red", position=0)
|
||||
val2 = PropertyValue.objects.create(prop=prop1, value="Black", position=1)
|
||||
shirt_red = ItemVariation.objects.create(item=shirt, default_price=14)
|
||||
shirt_red.values.add(val1)
|
||||
var2 = ItemVariation.objects.create(item=shirt)
|
||||
var2.values.add(val2)
|
||||
shirt_red = ItemVariation.objects.create(item=shirt, default_price=14, value="Red")
|
||||
ItemVariation.objects.create(item=shirt, value="Blue")
|
||||
ticket = Item.objects.create(event=event, name='Ticket', default_price=23)
|
||||
o1 = Order.objects.create(
|
||||
code='FOO', event=event, status=Order.STATUS_PENDING,
|
||||
|
||||
@@ -8,7 +8,7 @@ from django.utils.timezone import now
|
||||
|
||||
from pretix.base.models import (
|
||||
CartPosition, Event, Item, ItemCategory, ItemVariation, Organizer,
|
||||
Property, PropertyValue, Question, QuestionAnswer, Quota, User,
|
||||
Question, QuestionAnswer, Quota,
|
||||
)
|
||||
|
||||
|
||||
@@ -23,14 +23,9 @@ class CartTestMixin:
|
||||
self.category = ItemCategory.objects.create(event=self.event, name="Everything", position=0)
|
||||
self.quota_shirts = Quota.objects.create(event=self.event, name='Shirts', size=2)
|
||||
self.shirt = Item.objects.create(event=self.event, name='T-Shirt', category=self.category, default_price=12)
|
||||
prop1 = Property.objects.create(event=self.event, name="Color", item=self.shirt)
|
||||
val1 = PropertyValue.objects.create(prop=prop1, value="Red", position=0)
|
||||
val2 = PropertyValue.objects.create(prop=prop1, value="Black", position=1)
|
||||
self.quota_shirts.items.add(self.shirt)
|
||||
self.shirt_red = ItemVariation.objects.create(item=self.shirt, default_price=14)
|
||||
self.shirt_red.values.add(val1)
|
||||
var2 = ItemVariation.objects.create(item=self.shirt)
|
||||
var2.values.add(val2)
|
||||
self.shirt_red = ItemVariation.objects.create(item=self.shirt, default_price=14, value='Red')
|
||||
var2 = ItemVariation.objects.create(item=self.shirt, value='Blue')
|
||||
self.quota_shirts.variations.add(self.shirt_red)
|
||||
self.quota_shirts.variations.add(var2)
|
||||
self.quota_tickets = Quota.objects.create(event=self.event, name='Tickets', size=5)
|
||||
|
||||
@@ -6,8 +6,7 @@ from django.utils.timezone import now
|
||||
from tests.base import BrowserTest
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Item, ItemCategory, ItemVariation, Organizer, Property,
|
||||
PropertyValue, Quota, User,
|
||||
Event, Item, ItemCategory, ItemVariation, Organizer, Quota,
|
||||
)
|
||||
|
||||
|
||||
@@ -99,9 +98,7 @@ class ItemDisplayTest(EventTestMixin, BrowserTest):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
prop1 = Property.objects.create(event=self.event, name="Color", item=item)
|
||||
PropertyValue.objects.create(prop=prop1, value="Red")
|
||||
PropertyValue.objects.create(prop=prop1, value="Black")
|
||||
ItemVariation.objects.create(item=item, value='Blue')
|
||||
q.items.add(item)
|
||||
self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug))
|
||||
resp = self.client.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug))
|
||||
@@ -111,12 +108,9 @@ class ItemDisplayTest(EventTestMixin, BrowserTest):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
prop1 = Property.objects.create(event=self.event, name="Color", item=item)
|
||||
val1 = PropertyValue.objects.create(prop=prop1, value="Red")
|
||||
PropertyValue.objects.create(prop=prop1, value="Black")
|
||||
var1 = ItemVariation.objects.create(item=item, value='Red')
|
||||
ItemVariation.objects.create(item=item, value='Blue')
|
||||
q.items.add(item)
|
||||
var1 = ItemVariation.objects.create(item=item)
|
||||
var1.values.add(val1)
|
||||
q.variations.add(var1)
|
||||
self._assert_variation_found()
|
||||
|
||||
@@ -124,12 +118,9 @@ class ItemDisplayTest(EventTestMixin, BrowserTest):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=None)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
prop1 = Property.objects.create(event=self.event, name="Color", item=item)
|
||||
val1 = PropertyValue.objects.create(prop=prop1, value="Red")
|
||||
PropertyValue.objects.create(prop=prop1, value="Black")
|
||||
var1 = ItemVariation.objects.create(item=item, value='Red')
|
||||
ItemVariation.objects.create(item=item, value='Blue')
|
||||
q.items.add(item)
|
||||
var1 = ItemVariation.objects.create(item=item)
|
||||
var1.values.add(val1)
|
||||
q.variations.add(var1)
|
||||
self._assert_variation_found()
|
||||
|
||||
@@ -149,16 +140,11 @@ class ItemDisplayTest(EventTestMixin, BrowserTest):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=12)
|
||||
prop1 = Property.objects.create(event=self.event, name="Color", item=item)
|
||||
val1 = PropertyValue.objects.create(prop=prop1, value="Red", position=0)
|
||||
val2 = PropertyValue.objects.create(prop=prop1, value="Black", position=1)
|
||||
q.items.add(item)
|
||||
var1 = ItemVariation.objects.create(item=item, default_price=14)
|
||||
var1.values.add(val1)
|
||||
var2 = ItemVariation.objects.create(item=item)
|
||||
var2.values.add(val2)
|
||||
var1 = ItemVariation.objects.create(item=item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=item, value='Black', position=2)
|
||||
q.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
q.items.add(item)
|
||||
self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug))
|
||||
self.assertIn("Early-bird",
|
||||
self.driver.find_element_by_css_selector("section:nth-of-type(1) div:nth-of-type(1)").text)
|
||||
|
||||
@@ -7,7 +7,7 @@ from django.utils.timezone import now
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Item, ItemCategory, ItemVariation, Order, OrderPosition, Organizer,
|
||||
Property, PropertyValue, Question, Quota,
|
||||
Question, Quota,
|
||||
)
|
||||
|
||||
|
||||
@@ -26,15 +26,9 @@ class OrdersTest(TestCase):
|
||||
self.category = ItemCategory.objects.create(event=self.event, name="Everything", position=0)
|
||||
self.quota_shirts = Quota.objects.create(event=self.event, name='Shirts', size=2)
|
||||
self.shirt = Item.objects.create(event=self.event, name='T-Shirt', category=self.category, default_price=12)
|
||||
prop1 = Property.objects.create(event=self.event, name="Color", item=self.shirt)
|
||||
self.shirt.properties.add(prop1)
|
||||
val1 = PropertyValue.objects.create(prop=prop1, value="Red", position=0)
|
||||
val2 = PropertyValue.objects.create(prop=prop1, value="Black", position=1)
|
||||
self.quota_shirts.items.add(self.shirt)
|
||||
self.shirt_red = ItemVariation.objects.create(item=self.shirt, default_price=14)
|
||||
self.shirt_red.values.add(val1)
|
||||
var2 = ItemVariation.objects.create(item=self.shirt)
|
||||
var2.values.add(val2)
|
||||
self.shirt_red = ItemVariation.objects.create(item=self.shirt, default_price=14, value="Red")
|
||||
var2 = ItemVariation.objects.create(item=self.shirt, value="Blue")
|
||||
self.quota_shirts.variations.add(self.shirt_red)
|
||||
self.quota_shirts.variations.add(var2)
|
||||
self.quota_tickets = Quota.objects.create(event=self.event, name='Tickets', size=5)
|
||||
|
||||
Reference in New Issue
Block a user