Allow to disable filter support for meta properties (#2901)

This commit is contained in:
Raphael Michel
2022-11-16 17:12:37 +01:00
committed by GitHub
parent 49097037da
commit a0e5717f7d
7 changed files with 37 additions and 6 deletions

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.2.16 on 2022-11-14 11:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0223_voucher_min_usages'),
]
operations = [
migrations.AddField(
model_name='eventmetaproperty',
name='filter_allowed',
field=models.BooleanField(default=True),
),
]

View File

@@ -1580,6 +1580,11 @@ class EventMetaProperty(LoggedModel):
verbose_name=_("Valid values"),
help_text=_("If you keep this empty, any value is allowed. Otherwise, enter one possible value per line.")
)
filter_allowed = models.BooleanField(
default=True, verbose_name=_("Can be used for filtering"),
help_text=_("This field will be shown to filter events or reports in the backend, and it can also be used "
"for hidden filter parameters in the frontend (e.g. using the widget).")
)
def full_clean(self, exclude=None, validate_unique=True):
super().full_clean(exclude, validate_unique)

View File

@@ -806,7 +806,8 @@ class OrderSearchFilterForm(OrderFilterForm):
# We ignore superuser permissions here. This is intentional we do not want to show super
# users a form with all meta properties ever assigned.
return EventMetaProperty.objects.filter(
organizer_id__in=self.request.user.teams.values_list('organizer', flat=True)
organizer_id__in=self.request.user.teams.values_list('organizer', flat=True),
filter_allowed=True,
)
@@ -1545,12 +1546,13 @@ class EventFilterForm(FilterForm):
@cached_property
def meta_properties(self):
if self.organizer:
return self.organizer.meta_properties.all()
return self.organizer.meta_properties.filter(filter_allowed=True)
else:
# We ignore superuser permissions here. This is intentional we do not want to show super
# users a form with all meta properties ever assigned.
return EventMetaProperty.objects.filter(
organizer_id__in=self.request.user.teams.values_list('organizer', flat=True)
organizer_id__in=self.request.user.teams.values_list('organizer', flat=True),
filter_allowed=True,
)

View File

@@ -182,7 +182,7 @@ class OrganizerUpdateForm(OrganizerForm):
class EventMetaPropertyForm(forms.ModelForm):
class Meta:
model = EventMetaProperty
fields = ['name', 'default', 'required', 'protected', 'allowed_values']
fields = ['name', 'default', 'required', 'protected', 'allowed_values', 'filter_allowed']
widgets = {
'default': forms.TextInput()
}

View File

@@ -205,7 +205,7 @@ class OrganizerDetail(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin
ctx = super().get_context_data(**kwargs)
ctx['filter_form'] = self.filter_form
ctx['meta_fields'] = [
self.filter_form['meta_{}'.format(p.name)] for p in self.organizer.meta_properties.all()
self.filter_form['meta_{}'.format(p.name)] for p in self.organizer.meta_properties.filter(filter_allowed=True)
]
return ctx

View File

@@ -92,7 +92,8 @@ def filter_qs_by_attr(qs, request):
props = {
p.name: p for p in request.organizer.meta_properties.filter(
name__in=attrs.keys()
name__in=attrs.keys(),
filter_allowed=True,
)
}

View File

@@ -73,6 +73,11 @@ def test_attributes_on_page(env, client):
r = client.get('/mrmcd/?attr[loc]=HH')
assert 'MRMCD2015' in r.rendered_content
prop.filter_allowed = False
prop.save()
r = client.get('/mrmcd/?attr[loc]=MA')
assert 'MRMCD2015' in r.rendered_content
@pytest.mark.django_db
def test_non_public_event_not_on_page(env, client):