diff --git a/doc/user/events/widget.rst b/doc/user/events/widget.rst index b58bb6f41f..8e5c435895 100644 --- a/doc/user/events/widget.rst +++ b/doc/user/events/widget.rst @@ -143,6 +143,11 @@ You can see an example here: +You can filter events by meta data attributes. You can create those attributes in your order profile and set their values in both event and series date +settings. For example, if you set up a meta data property called "Promoted" that you set to "Yes" on some events, you can pass a filter like this:: + + + pretix Button ------------- diff --git a/src/pretix/presale/views/widget.py b/src/pretix/presale/views/widget.py index 49786e0968..599b03afd8 100644 --- a/src/pretix/presale/views/widget.py +++ b/src/pretix/presale/views/widget.py @@ -365,13 +365,17 @@ class WidgetAPIProductList(EventListMixin, View): if hasattr(self.request, 'event'): add_subevents_for_days( - self.request.event.subevents_annotated('web'), + filter_qs_by_attr(self.request.event.subevents_annotated('web'), self.request), before, after, ebd, set(), self.request.event, kwargs.get('cart_namespace') ) else: timezones = set() - add_events_for_days(self.request, Event.annotated(self.request.organizer.events, 'web'), before, after, ebd, timezones) + add_events_for_days( + self.request, + filter_qs_by_attr(Event.annotated(self.request.organizer.events, 'web'), self.request), + before, after, ebd, timezones + ) add_subevents_for_days(filter_qs_by_attr(SubEvent.annotated(SubEvent.objects.filter( event__organizer=self.request.organizer, event__is_public=True, @@ -389,7 +393,7 @@ class WidgetAPIProductList(EventListMixin, View): else: if hasattr(self.request, 'event'): evs = self.request.event.subevents_sorted( - self.request.event.subevents_annotated(self.request.sales_channel) + filter_qs_by_attr(self.request.event.subevents_annotated(self.request.sales_channel), self.request) ) tz = pytz.timezone(request.event.settings.timezone) data['events'] = [ diff --git a/src/pretix/static/pretixpresale/js/widget/widget.js b/src/pretix/static/pretixpresale/js/widget/widget.js index f84a6e6803..bf89dcd2c1 100644 --- a/src/pretix/static/pretixpresale/js/widget/widget.js +++ b/src/pretix/static/pretixpresale/js/widget/widget.js @@ -1040,6 +1040,9 @@ var shared_root_methods = { } else { url = this.$root.target_url + 'widget/product_list?lang=' + lang; } + if (this.$root.filter) { + url += '&' + this.$root.filter; + } var cart_id = getCookie(this.cookieName); if (this.$root.voucher_code) { url += '&voucher=' + escape(this.$root.voucher_code); @@ -1212,6 +1215,7 @@ var create_widget = function (element) { var skip_ssl = element.attributes["skip-ssl-check"] ? true : false; var disable_vouchers = element.attributes["disable-vouchers"] ? true : false; var widget_data = JSON.parse(JSON.stringify(window.PretixWidget.widget_data)); + var filter = element.attributes.filter ? element.attributes.filter.value : null; for (var i = 0; i < element.attributes.length; i++) { var attrib = element.attributes[i]; if (attrib.name.match(/^data-.*$/)) { @@ -1234,6 +1238,7 @@ var create_widget = function (element) { categories: null, currency: null, name: null, + filter: filter, voucher_code: voucher, display_net_prices: false, voucher_explanation_text: null, @@ -1309,6 +1314,7 @@ var create_button = function (element) { voucher_code: voucher, items: items, error: null, + filter: null, widget_data: widget_data, widget_id: 'pretix-widget-' + widget_id, button_text: button_text