Widget: Allow to filter by attributes

This commit is contained in:
Raphael Michel
2019-07-08 23:27:23 +02:00
parent 285694955c
commit 55d423af18
3 changed files with 18 additions and 3 deletions

View File

@@ -143,6 +143,11 @@ You can see an example here:
</div> </div>
</noscript> </noscript>
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-widget event="https://pretix.eu/demo/series/" style="list" filter="attr[Promoted]=Yes"></pretix-widget>
pretix Button pretix Button
------------- -------------

View File

@@ -365,13 +365,17 @@ class WidgetAPIProductList(EventListMixin, View):
if hasattr(self.request, 'event'): if hasattr(self.request, 'event'):
add_subevents_for_days( 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, before, after, ebd, set(), self.request.event,
kwargs.get('cart_namespace') kwargs.get('cart_namespace')
) )
else: else:
timezones = set() 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( add_subevents_for_days(filter_qs_by_attr(SubEvent.annotated(SubEvent.objects.filter(
event__organizer=self.request.organizer, event__organizer=self.request.organizer,
event__is_public=True, event__is_public=True,
@@ -389,7 +393,7 @@ class WidgetAPIProductList(EventListMixin, View):
else: else:
if hasattr(self.request, 'event'): if hasattr(self.request, 'event'):
evs = self.request.event.subevents_sorted( 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) tz = pytz.timezone(request.event.settings.timezone)
data['events'] = [ data['events'] = [

View File

@@ -1040,6 +1040,9 @@ var shared_root_methods = {
} else { } else {
url = this.$root.target_url + 'widget/product_list?lang=' + lang; url = this.$root.target_url + 'widget/product_list?lang=' + lang;
} }
if (this.$root.filter) {
url += '&' + this.$root.filter;
}
var cart_id = getCookie(this.cookieName); var cart_id = getCookie(this.cookieName);
if (this.$root.voucher_code) { if (this.$root.voucher_code) {
url += '&voucher=' + escape(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 skip_ssl = element.attributes["skip-ssl-check"] ? true : false;
var disable_vouchers = element.attributes["disable-vouchers"] ? true : false; var disable_vouchers = element.attributes["disable-vouchers"] ? true : false;
var widget_data = JSON.parse(JSON.stringify(window.PretixWidget.widget_data)); 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++) { for (var i = 0; i < element.attributes.length; i++) {
var attrib = element.attributes[i]; var attrib = element.attributes[i];
if (attrib.name.match(/^data-.*$/)) { if (attrib.name.match(/^data-.*$/)) {
@@ -1234,6 +1238,7 @@ var create_widget = function (element) {
categories: null, categories: null,
currency: null, currency: null,
name: null, name: null,
filter: filter,
voucher_code: voucher, voucher_code: voucher,
display_net_prices: false, display_net_prices: false,
voucher_explanation_text: null, voucher_explanation_text: null,
@@ -1309,6 +1314,7 @@ var create_button = function (element) {
voucher_code: voucher, voucher_code: voucher,
items: items, items: items,
error: null, error: null,
filter: null,
widget_data: widget_data, widget_data: widget_data,
widget_id: 'pretix-widget-' + widget_id, widget_id: 'pretix-widget-' + widget_id,
button_text: button_text button_text: button_text