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:
Raphael Michel
2023-11-10 12:10:01 +01:00
committed by GitHub
parent c0007a9566
commit d7aa94d6ae
34 changed files with 829 additions and 82 deletions

View File

@@ -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()

View File

@@ -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()

View File

@@ -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')

View File

@@ -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,