mirror of
https://github.com/pretix/pretix.git
synced 2026-05-04 15:04:03 +00:00
Add public filters based on meta data (#3673)
* Add public filters based on meta data * Fix licenseheaders * ignore empty values * Fix tests * Full non-widget implementation * Widget support * Add a few tests * Allow to reorder properties * Fix isort * Allow to opt-out for specific events * Fix name clash between new and old field to make migration feasible
This commit is contained in:
@@ -198,6 +198,10 @@ def test_event_list_filter(token_client, organizer, event):
|
||||
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/?attr[type]='.format(organizer.slug))
|
||||
assert resp.status_code == 200
|
||||
assert resp.data['count'] == 1
|
||||
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/?attr[type]=Unknown'.format(organizer.slug))
|
||||
assert resp.status_code == 200
|
||||
assert resp.data['count'] == 0
|
||||
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/?date_from_after=2017-12-27T10:00:00Z'.format(organizer.slug))
|
||||
@@ -231,7 +235,10 @@ def test_event_get(token_client, organizer, event):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_create(team, token_client, organizer, event, meta_prop):
|
||||
meta_prop.allowed_values = "Conference\nWorkshop"
|
||||
meta_prop.choices = [
|
||||
{"key": "Conference", "label": {"en": "Conference"}},
|
||||
{"key": "Workshop", "label": {"en": "Workshop"}},
|
||||
]
|
||||
meta_prop.save()
|
||||
team.can_change_organizer_settings = False
|
||||
team.save()
|
||||
|
||||
@@ -256,7 +256,7 @@ def test_all_subevents_list_filter(token_client, organizer, event, subevent):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_subevent_create(team, token_client, organizer, event, subevent, meta_prop, item):
|
||||
meta_prop.allowed_values = "Conference\nWorkshop"
|
||||
meta_prop.choices = [{"key": "Conference", "label": {"en": "Conference"}}, {"key": "Workshop", "label": {"en": "Workshop"}}]
|
||||
meta_prop.save()
|
||||
team.can_change_organizer_settings = False
|
||||
team.save()
|
||||
|
||||
@@ -72,6 +72,21 @@ def test_attributes_on_page(env, client):
|
||||
r = client.get('/mrmcd/?attr[loc]=HH')
|
||||
assert 'MRMCD2015' in r.rendered_content
|
||||
|
||||
with scopes_disabled():
|
||||
series = env[0].events.create(
|
||||
name="Workshop Series",
|
||||
has_subevents=True,
|
||||
live=True,
|
||||
date_from=now() + timedelta(days=3)
|
||||
)
|
||||
se = series.subevents.create(name="Future", active=True, date_from=now() + timedelta(days=3))
|
||||
se.meta_values.create(property=prop, value="B")
|
||||
|
||||
r = client.get('/mrmcd/?attr[loc]=B')
|
||||
assert 'Workshop Series' in r.rendered_content
|
||||
r = client.get('/mrmcd/?attr[loc]=MA')
|
||||
assert 'Workshop Series' not in r.rendered_content
|
||||
|
||||
prop.filter_allowed = False
|
||||
prop.save()
|
||||
r = client.get('/mrmcd/?attr[loc]=MA')
|
||||
|
||||
@@ -605,6 +605,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
data = json.loads(response.content.decode())
|
||||
assert data == {
|
||||
'list_type': 'list',
|
||||
'meta_filter_fields': [],
|
||||
'name': '30C3',
|
||||
'frontpage_text': '',
|
||||
'poweredby': '<a href="https://pretix.eu" target="_blank" rel="noopener">ticketing powered by pretix</a>',
|
||||
@@ -633,6 +634,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
data = json.loads(response.content.decode())
|
||||
assert data == {
|
||||
'list_type': 'calendar',
|
||||
'meta_filter_fields': [],
|
||||
'date': '2019-01-01',
|
||||
'name': '30C3',
|
||||
'frontpage_text': '',
|
||||
@@ -708,6 +710,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
data = json.loads(response.content.decode())
|
||||
assert data == {
|
||||
'list_type': 'week',
|
||||
'meta_filter_fields': [],
|
||||
'name': '30C3',
|
||||
'frontpage_text': '',
|
||||
'week': [2019, 1],
|
||||
@@ -769,9 +772,72 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
'event_url': 'http://example.com/ccc/future/',
|
||||
'name': 'Future'}
|
||||
],
|
||||
'list_type': 'list'
|
||||
'list_type': 'list',
|
||||
'meta_filter_fields': [],
|
||||
}
|
||||
|
||||
def test_event_list_filtersets_from_allowed_values(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.settings.timezone = 'Europe/Berlin'
|
||||
self.event.save()
|
||||
with freeze_time("2019-01-01 10:00:00"):
|
||||
with scopes_disabled():
|
||||
self.orga.meta_properties.create(
|
||||
name="Language",
|
||||
default="EN",
|
||||
filter_public=True,
|
||||
choices=[
|
||||
{"key": "EN", "label": "English"},
|
||||
{"key": "DE", "label": "German"},
|
||||
]
|
||||
)
|
||||
|
||||
response = self.client.get('/%s/widget/product_list' % (self.orga.slug,))
|
||||
data = json.loads(response.content.decode())
|
||||
assert data["meta_filter_fields"] == [
|
||||
{
|
||||
"choices": [["", ""], ["EN", "English"], ["DE", "German"]],
|
||||
"key": "attr[Language]",
|
||||
"label": "Language"
|
||||
}
|
||||
]
|
||||
|
||||
def test_event_list_filtersets_from_existing_values(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.settings.timezone = 'Europe/Berlin'
|
||||
self.event.save()
|
||||
with freeze_time("2019-01-01 10:00:00"):
|
||||
with scopes_disabled():
|
||||
p = self.orga.meta_properties.create(
|
||||
name="Language",
|
||||
default="DE",
|
||||
filter_public=True,
|
||||
)
|
||||
e = self.orga.events.create(name="Future", live=True, is_public=True, slug='future', date_from=now() + datetime.timedelta(days=3))
|
||||
se = self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
|
||||
e.meta_values.create(property=p, value="EN")
|
||||
se.meta_values.create(property=p, value="DE")
|
||||
|
||||
response = self.client.get('/%s/widget/product_list' % (self.orga.slug,))
|
||||
data = json.loads(response.content.decode())
|
||||
assert data["meta_filter_fields"] == [
|
||||
{
|
||||
"choices": [["", ""], ["DE", "DE"], ["EN", "EN"]],
|
||||
"key": "attr[Language]",
|
||||
"label": "Language"
|
||||
}
|
||||
]
|
||||
|
||||
response = self.client.get('/%s/%s/widget/product_list' % (self.orga.slug, self.event.slug))
|
||||
data = json.loads(response.content.decode())
|
||||
assert data["meta_filter_fields"] == [
|
||||
{
|
||||
"choices": [["", ""], ["DE", "DE"]],
|
||||
"key": "attr[Language]",
|
||||
"label": "Language"
|
||||
}
|
||||
]
|
||||
|
||||
def test_event_calendar(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.settings.timezone = 'Europe/Berlin'
|
||||
@@ -794,6 +860,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
assert data == {
|
||||
'date': '2019-01-01',
|
||||
'list_type': 'calendar',
|
||||
'meta_filter_fields': [],
|
||||
'poweredby': '<a href="https://pretix.eu" target="_blank" rel="noopener">ticketing powered by pretix</a>',
|
||||
'weeks': [
|
||||
[None,
|
||||
|
||||
Reference in New Issue
Block a user