def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['category'].queryset = self.instance.event.categories.all() self.fields['tax_rule'].queryset = self.instance.event.tax_rules.all() self.fields['description'].widget.attrs['placeholder'] = _( 'e.g. This reduced price is available for full-time students, jobless and people ' 'over 65. This ticket includes access to all parts of the event, except the VIP ' 'area.') if self.event.tax_rules.exists(): self.fields['tax_rule'].required = True self.fields['description'].widget.attrs['rows'] = '4' self.fields['sales_channels'] = forms.MultipleChoiceField( label=_('Sales channels'), choices=((c.identifier, c.verbose_name) for c in get_all_sales_channels().values()), widget=forms.CheckboxSelectMultiple) change_decimal_field(self.fields['default_price'], self.event.currency) self.fields['hidden_if_available'].queryset = self.event.quotas.all() self.fields['hidden_if_available'].widget = Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.items.quotas.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': _('Quota') }) self.fields['hidden_if_available'].widget.choices = self.fields[ 'hidden_if_available'].choices self.fields['hidden_if_available'].required = False
def __init__(self, **kwargs): self.event = kwargs.pop('event') kwargs.pop('locales', None) super().__init__(**kwargs) self.fields['limit_products'].queryset = self.event.items.all() self.fields['auto_checkin_sales_channels'] = forms.MultipleChoiceField( label=self.fields['auto_checkin_sales_channels'].label, help_text=self.fields['auto_checkin_sales_channels'].help_text, required=self.fields['auto_checkin_sales_channels'].required, choices=((c.identifier, c.verbose_name) for c in get_all_sales_channels().values()), widget=forms.CheckboxSelectMultiple) if self.event.has_subevents: self.fields['subevent'].queryset = self.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'All dates') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices else: del self.fields['subevent']
def __init__(self, *args, **kwargs): self.event = kwargs.pop('event') super().__init__(*args, **kwargs) if self.event.has_subevents: self.fields['subevent'].queryset = self.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'All dates') } ) self.fields['subevent'].widget.choices = self.fields['subevent'].choices elif 'subevent': del self.fields['subevent'] choices = [('', _('All products'))] for i in self.event.items.prefetch_related('variations').all(): variations = list(i.variations.all()) if variations: choices.append((str(i.pk), _('{product} – Any variation').format(product=i.name))) for v in variations: choices.append(('%d-%d' % (i.pk, v.pk), '%s – %s' % (i.name, v.value))) else: choices.append((str(i.pk), i.name)) for q in self.event.quotas.all(): choices.append(('q-%d' % q.pk, _('Any product in quota "{quota}"').format(quota=q))) self.fields['itemvar'].choices = choices
def _fields(self): d = OrderedDict([ ('list', forms.ModelChoiceField( queryset=self.event.checkin_lists.all(), label=_('Check-in list'), widget=forms.RadioSelect(attrs={'class': 'scrolling-choice'}), )), ('items', forms.ModelMultipleChoiceField( queryset=self.event.items.all(), label=_('Limit to products'), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'}), initial=self.event.items.all())), ]) d['list'].queryset = self.event.checkin_lists.all() d['list'].widget = Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.orders.checkinlists.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': _('All check-in lists') }) d['list'].widget.choices = d['list'].choices d['list'].required = False return d
def __init__(self, *args, **kwargs): self.event = kwargs.pop('event') super().__init__(*args, **kwargs) self.fields['item'].queryset = self.event.items.all() self.fields['question'].queryset = self.event.questions.all() self.fields['provider'].choices += [ (k, v.verbose_name) for k, v in self.event.get_payment_providers().items() ] if self.event.has_subevents: self.fields['subevent'].queryset = self.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'All dates') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices elif 'subevent': del self.fields['subevent']
def __init__(self, *args, **kwargs): self.user = kwargs.pop('user') self.session = kwargs.pop('session') super().__init__(*args, **kwargs) qs = Organizer.objects.all() if not self.user.has_active_staff_session(self.session.session_key): qs = qs.filter( id__in=self.user.teams.filter(can_create_events=True).values_list('organizer', flat=True) ) self.fields['organizer'] = forms.ModelChoiceField( label=_("Organizer"), queryset=qs, widget=Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:organizers.select2') + '?can_create=1', 'data-placeholder': _('Organizer') } ), empty_label=None, required=True ) self.fields['organizer'].widget.choices = self.fields['organizer'].choices if len(self.fields['organizer'].choices) == 1: self.fields['organizer'].initial = self.fields['organizer'].queryset.first()
def __init__(self, *args, **kwargs): customers = kwargs.pop('customers') super().__init__(*args, **kwargs) if not self.instance.event.settings.order_phone_asked and not self.instance.phone: del self.fields['phone'] if customers: self.fields[ 'customer'].queryset = self.instance.event.organizer.customers.all( ) self.fields['customer'].widget = Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:organizer.customers.select2', kwargs={ 'organizer': self.instance.event.organizer.slug, }), 'data-placeholder': _('Customer') }) self.fields['customer'].widget.choices = self.fields[ 'customer'].choices self.fields['customer'].required = False else: del self.fields['customer']
def __init__(self, *args, **kwargs): self.event = kwargs.pop('event') super().__init__(*args, **kwargs) if self.event.has_subevents: self.fields['subevent'].queryset = self.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-inverse-dependency': '#id_all_subevents', 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'All dates') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices else: del self.fields['subevent'] del self.fields['all_subevents']
def _fields(self): name_scheme = PERSON_NAME_SCHEMES[self.event.settings.name_scheme] d = OrderedDict( [ ('list', forms.ModelChoiceField( queryset=self.event.checkin_lists.all(), label=_('Check-in list'), widget=forms.RadioSelect( attrs={'class': 'scrolling-choice'} ), initial=self.event.checkin_lists.first() )), ('secrets', forms.BooleanField( label=_('Include QR-code secret'), required=False )), ('sort', forms.ChoiceField( label=_('Sort by'), initial='name', choices=[ ('name', _('Attendee name')), ('code', _('Order code')), ] + ([ ('name:{}'.format(k), _('Attendee name: {part}').format(part=label)) for k, label, w in name_scheme['fields'] ] if settings.JSON_FIELD_AVAILABLE and len(name_scheme['fields']) > 1 else []), widget=forms.RadioSelect, required=False )), ('questions', forms.ModelMultipleChoiceField( queryset=self.event.questions.all(), label=_('Include questions'), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'} ), required=False )), ] ) d['list'].queryset = self.event.checkin_lists.all() d['list'].widget = Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.orders.checkinlists.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': _('Check-in list') } ) d['list'].widget.choices = d['list'].choices d['list'].required = True return d
def __init__(self, *args, **kwargs): event = kwargs.pop('event') super().__init__(*args, **kwargs) self.fields['subject'] = I18nFormField( label=_('Subject'), widget=I18nTextInput, required=True, locales=event.settings.get('locales'), help_text=_( "Available placeholders: {expire_date}, {event}, {code}, {date}, {url}, " "{invoice_name}, {invoice_company}"), validators=[ PlaceholderValidator([ '{expire_date}', '{event}', '{code}', '{date}', '{url}', '{invoice_name}', '{invoice_company}' ]) ]) self.fields['message'] = I18nFormField( label=_('Message'), widget=I18nTextarea, required=True, locales=event.settings.get('locales'), help_text=_( "Available placeholders: {expire_date}, {event}, {code}, {date}, {url}, " "{invoice_name}, {invoice_company}"), validators=[ PlaceholderValidator([ '{expire_date}', '{event}', '{code}', '{date}', '{url}', '{invoice_name}', '{invoice_company}' ]) ]) choices = list(Order.STATUS_CHOICE) if not event.settings.get('payment_term_expire_automatically', as_type=bool): choices.append(('overdue', _('pending with payment overdue'))) self.fields['sendto'] = forms.MultipleChoiceField( label=_("Send to customers with order status"), widget=forms.CheckboxSelectMultiple, choices=choices) self.fields['item'].queryset = event.items.all() if event.has_subevents: self.fields['subevent'].queryset = event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': event.slug, 'organizer': event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'Date') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices else: del self.fields['subevent']
def __init__(self, *args, **kwargs): instance = kwargs.get('instance') initial = kwargs.get('initial') if instance: self.initial_instance_data = copy.copy(instance) try: if instance.variation: initial['itemvar'] = '%d-%d' % (instance.item.pk, instance.variation.pk) elif instance.item: initial['itemvar'] = str(instance.item.pk) elif instance.quota: initial['itemvar'] = 'q-%d' % instance.quota.pk except Item.DoesNotExist: pass else: self.initial_instance_data = None super().__init__(*args, **kwargs) if instance.event.has_subevents: self.fields['subevent'].queryset = instance.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': instance.event.slug, 'organizer': instance.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'Date') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices self.fields['subevent'].required = False elif 'subevent': del self.fields['subevent'] choices = [] self.fields['itemvar'].choices = choices self.fields['itemvar'].widget = Select2ItemVarQuota( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.vouchers.itemselect2', kwargs={ 'event': instance.event.slug, 'organizer': instance.event.organizer.slug, }), 'data-placeholder': '' }) self.fields['itemvar'].widget.choices = self.fields['itemvar'].choices self.fields['itemvar'].required = True
def __init__(self, *args, **kwargs): instance = kwargs.pop('instance') items = kwargs.pop('items') initial = kwargs.get('initial', {}) initial['price'] = instance.price kwargs['initial'] = initial super().__init__(*args, **kwargs) if instance.order.event.has_subevents: self.fields[ 'subevent'].queryset = instance.order.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': instance.order.event.slug, 'organizer': instance.order.event.organizer.slug, }), 'data-placeholder': _('(Unchanged)') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices else: del self.fields['subevent'] self.fields['tax_rule'].queryset = instance.event.tax_rules.all() self.fields[ 'tax_rule'].label_from_instance = self.taxrule_label_from_instance if not instance.seat and not ( not instance.event.settings.seating_choice and instance.item.seat_category_mappings.filter( subevent=instance.subevent).exists()): del self.fields['seat'] choices = [('', _('(Unchanged)'))] for i in items: pname = str(i) if not i.is_available(): pname += ' ({})'.format(_('inactive')) variations = list(i.variations.all()) if variations: for v in variations: choices.append( ('%d-%d' % (i.pk, v.pk), '%s – %s' % (pname, v.value))) else: choices.append((str(i.pk), pname)) self.fields['itemvar'].choices = choices change_decimal_field(self.fields['price'], instance.order.event.currency)
def export_form_fields(self): d = OrderedDict( [ ('list', forms.ModelChoiceField( queryset=self.event.checkin_lists.all(), label=_('Check-in list'), widget=forms.RadioSelect( attrs={'class': 'scrolling-choice'} ), initial=self.event.checkin_lists.first() )), ('secrets', forms.BooleanField( label=_('Include QR-code secret'), required=False )), ('sort', forms.ChoiceField( label=_('Sort by'), initial='name', choices=( ('name', _('Attendee name')), ('code', _('Order code')), ), widget=forms.RadioSelect, required=False )), ('questions', forms.ModelMultipleChoiceField( queryset=self.event.questions.all(), label=_('Include questions'), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'} ), required=False )), ] ) d['list'].queryset = self.event.checkin_lists.all() d['list'].widget = Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.orders.checkinlists.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': _('Check-in list') } ) d['list'].widget.choices = d['list'].choices d['list'].required = True return d
def __init__(self, **kwargs): self.instance = kwargs.get('instance', None) self.event = kwargs.get('event') items = kwargs.pop( 'items', None) or self.event.items.prefetch_related('variations') self.original_instance = modelcopy( self.instance) if self.instance else None initial = kwargs.get('initial', {}) if self.instance and self.instance.pk: initial['itemvars'] = [ str(i.pk) for i in self.instance.items.all() ] + [ '{}-{}'.format(v.item_id, v.pk) for v in self.instance.variations.all() ] kwargs['initial'] = initial super().__init__(**kwargs) choices = [] for item in items: if len(item.variations.all()) > 0: for v in item.variations.all(): choices.append( ('{}-{}'.format(item.pk, v.pk), '{} – {}'.format(item, v.value))) else: choices.append(('{}'.format(item.pk), str(item))) self.fields['itemvars'] = forms.MultipleChoiceField( label=_('Products'), required=False, choices=choices, widget=forms.CheckboxSelectMultiple) if self.event.has_subevents: self.fields['subevent'].queryset = self.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'Date') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices self.fields['subevent'].required = True else: del self.fields['subevent']
def __init__(self, *args, **kwargs): self.items = kwargs.pop('items') order = kwargs.pop('order') super().__init__(*args, **kwargs) try: ia = order.invoice_address except InvoiceAddress.DoesNotExist: ia = None choices = [] for i in self.items: pname = str(i) if not i.is_available(): pname += ' ({})'.format(_('inactive')) variations = list(i.variations.all()) if i.tax_rule: # performance optimization i.tax_rule.event = order.event if variations: for v in variations: p = get_price(i, v, invoice_address=ia) choices.append(('%d-%d' % (i.pk, v.pk), '%s – %s (%s)' % (pname, v.value, p.print(order.event.currency)))) else: p = get_price(i, invoice_address=ia) choices.append((str(i.pk), '%s (%s)' % (pname, p.print(order.event.currency)))) self.fields['itemvar'].choices = choices if order.event.cache.get_or_set( 'has_addon_products', default=lambda: ItemAddOn.objects.filter(base_item__event=order.event).exists(), timeout=300 ): self.fields['addon_to'].queryset = order.positions.filter(addon_to__isnull=True).select_related( 'item', 'variation' ) else: del self.fields['addon_to'] if order.event.has_subevents: self.fields['subevent'].queryset = order.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': order.event.slug, 'organizer': order.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'Date') } ) self.fields['subevent'].widget.choices = self.fields['subevent'].choices self.fields['subevent'].required = True else: del self.fields['subevent'] change_decimal_field(self.fields['price'], order.event.currency)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['addon_category'].queryset = self.event.categories.all() self.fields['addon_category'].widget = Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.items.categories.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), } ) self.fields['addon_category'].widget.choices = self.fields['addon_category'].choices
def __init__(self, *args, **kwargs): instance = kwargs.pop('instance') initial = kwargs.get('initial', {}) if instance.item.tax_rule and not instance.item.tax_rule.price_includes_tax: initial['price'] = instance.price - instance.tax_value else: initial['price'] = instance.price kwargs['initial'] = initial super().__init__(*args, **kwargs) if instance.order.event.has_subevents: self.fields[ 'subevent'].queryset = instance.order.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': instance.order.event.slug, 'organizer': instance.order.event.organizer.slug, }), 'data-placeholder': _('(Unchanged)') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices else: del self.fields['subevent'] choices = [('', _('(Unchanged)'))] for i in instance.order.event.items.prefetch_related( 'variations').all(): pname = str(i) if not i.is_available(): pname += ' ({})'.format(_('inactive')) variations = list(i.variations.all()) if variations: for v in variations: choices.append( ('%d-%d' % (i.pk, v.pk), '%s – %s' % (pname, v.value))) else: choices.append((str(i.pk), pname)) self.fields['itemvar'].choices = choices change_decimal_field(self.fields['price'], instance.order.event.currency)
def __init__(self, **kwargs): self.event = kwargs.pop('event') super().__init__(**kwargs) self.fields['items'].queryset = self.event.items.all() self.fields['list'].queryset = self.event.checkin_lists.all() self.fields['list'].widget = Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.orders.checkinlists.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': _('Check-in list') } ) self.fields['list'].widget.choices = self.fields['list'].choices self.fields['list'].required = True
class OrderSearchFilterForm(OrderFilterForm): orders = { 'code': 'code', 'email': 'email', 'total': 'total', 'datetime': 'datetime', 'status': 'status', 'pcnt': 'pcnt', 'event': 'event' } organizer = forms.ModelChoiceField( label=_('Organizer'), queryset=Organizer.objects.none(), required=False, empty_label=_('All organizers'), widget=Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse_lazy('control:organizers.select2'), 'data-placeholder': _('All organizers') })) def __init__(self, *args, **kwargs): request = kwargs.pop('request') super().__init__(*args, **kwargs) if request.user.is_superuser: self.fields['organizer'].queryset = Organizer.objects.all() else: self.fields['organizer'].queryset = Organizer.objects.filter( pk__in=request.user.teams.values_list('organizer', flat=True)) self.fields['provider'].choices += get_all_payment_providers() def filter_qs(self, qs): fdata = self.cleaned_data qs = super().filter_qs(qs) if fdata.get('organizer'): qs = qs.filter(event__organizer=fdata.get('organizer')) return qs
def __init__(self, **kwargs): self.event = kwargs.pop('event') kwargs.pop('locales', None) super().__init__(**kwargs) self.fields['limit_products'].queryset = self.event.items.all() if self.event.has_subevents: self.fields['subevent'].queryset = self.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'Date') } ) self.fields['subevent'].widget.choices = self.fields['subevent'].choices self.fields['subevent'].required = True else: del self.fields['subevent']
def __init__(self, *args, **kwargs): kwargs.pop('organizer') kwargs.pop('locales') self.session = kwargs.pop('session') kwargs.pop('has_subevents') self.user = kwargs.pop('user') super().__init__(*args, **kwargs) self.fields['copy_from_event'] = EventChoiceField( label=_("Copy configuration from"), queryset=EventWizardCopyForm.copy_from_queryset(self.user, self.session), widget=Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:events.typeahead') + '?can_copy=1', 'data-placeholder': _('Do not copy') } ), empty_label=_('Do not copy'), required=False ) self.fields['copy_from_event'].widget.choices = self.fields['copy_from_event'].choices
def _fields(self): name_scheme = PERSON_NAME_SCHEMES[self.event.settings.name_scheme] d = OrderedDict([ ('list', forms.ModelChoiceField( queryset=self.event.checkin_lists.all(), label=_('Check-in list'), widget=forms.RadioSelect(attrs={'class': 'scrolling-choice'}), initial=self.event.checkin_lists.first())), ('questions', forms.ModelMultipleChoiceField( queryset=self.event.questions.all(), label=_('Include questions'), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'}), required=False)), ]) d['list'].queryset = self.event.checkin_lists.all() d['list'].widget = Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.orders.checkinlists.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': _('Check-in list') }) d['list'].widget.choices = d['list'].choices d['list'].required = True return d
def __init__(self, *args, **kwargs): event = kwargs.pop('event') super().__init__(*args, **kwargs) recp_choices = [('orders', _('Everyone who created a ticket order'))] if event.settings.attendee_emails_asked: recp_choices += [ ('attendees', _('Every attendee (falling back to the order contact when no attendee email address is ' 'given)')), ('both', _('Both (all order contact addresses and all attendee email addresses)' )) ] self.fields['recipients'].choices = recp_choices self.fields['subject'] = I18nFormField( label=_('Subject'), widget=I18nTextInput, required=True, locales=event.settings.get('locales'), help_text=_( "Available placeholders: {expire_date}, {event}, {code}, {date}, {url}, " "{invoice_name}, {invoice_company}"), validators=[ PlaceholderValidator([ '{expire_date}', '{event}', '{code}', '{date}', '{url}', '{invoice_name}', '{invoice_company}' ]) ]) self.fields['message'] = I18nFormField( label=_('Message'), widget=I18nTextarea, required=True, locales=event.settings.get('locales'), help_text=_( "Available placeholders: {expire_date}, {event}, {code}, {date}, {url}, " "{invoice_name}, {invoice_company}"), validators=[ PlaceholderValidator([ '{expire_date}', '{event}', '{code}', '{date}', '{url}', '{invoice_name}', '{invoice_company}' ]) ]) choices = list(Order.STATUS_CHOICE) if not event.settings.get('payment_term_expire_automatically', as_type=bool): choices.append(('overdue', _('pending with payment overdue'))) self.fields['sendto'] = forms.MultipleChoiceField( label=_("Send to customers with order status"), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'}), choices=choices) if not self.initial.get('sendto'): self.initial['sendto'] = ['p', 'n'] self.fields['items'].queryset = event.items.all() if not self.initial.get('items'): self.initial['items'] = event.items.all() if event.has_subevents: self.fields['subevent'].queryset = event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': event.slug, 'organizer': event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'Date') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices else: del self.fields['subevent']
class EventFilterForm(FilterForm): orders = { 'slug': 'slug', 'organizer': 'organizer__name', 'date_from': 'order_from', 'date_to': 'order_to', 'live': 'live', 'sum_tickets_paid': 'sum_tickets_paid' } status = forms.ChoiceField( label=_('Status'), choices=( ('', _('All events')), ('live', _('Shop live')), ('running', _('Shop live and presale running')), ('notlive', _('Shop not live')), ('future', _('Presale not started')), ('past', _('Presale over')), ('date_future', _('Single event running or in the future')), ('date_past', _('Single event in the past')), ('series', _('Event series')), ), required=False ) organizer = forms.ModelChoiceField( label=_('Organizer'), queryset=Organizer.objects.none(), required=False, empty_label=_('All organizers'), widget=Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse_lazy('control:organizers.select2'), 'data-placeholder': _('All organizers') } ) ) query = forms.CharField( label=_('Event name'), widget=forms.TextInput(attrs={ 'placeholder': _('Event name'), 'autofocus': 'autofocus' }), required=False ) def __init__(self, *args, **kwargs): self.request = kwargs.pop('request') self.organizer = kwargs.pop('organizer', None) super().__init__(*args, **kwargs) seen = set() for p in self.meta_properties.all(): if p.name in seen: continue seen.add(p.name) self.fields['meta_{}'.format(p.name)] = forms.CharField( label=p.name, required=False, widget=forms.TextInput( attrs={ 'data-typeahead-url': reverse('control:events.meta.typeahead') + '?' + urlencode({ 'property': p.name, 'organizer': self.organizer.slug if self.organizer else '' }) } ) ) if self.organizer: del self.fields['organizer'] else: if self.request.user.has_active_staff_session(self.request.session.session_key): self.fields['organizer'].queryset = Organizer.objects.all() else: self.fields['organizer'].queryset = Organizer.objects.filter( pk__in=self.request.user.teams.values_list('organizer', flat=True) ) def filter_qs(self, qs): fdata = self.cleaned_data if fdata.get('status') == 'live': qs = qs.filter(live=True) elif fdata.get('status') == 'running': qs = qs.filter( live=True ).annotate( p_end=Coalesce(F('presale_end'), F('date_to'), F('date_from')) ).filter( Q(presale_start__isnull=True) | Q(presale_start__lte=now()) ).filter( Q(p_end__gte=now()) ) elif fdata.get('status') == 'notlive': qs = qs.filter(live=False) elif fdata.get('status') == 'future': qs = qs.filter(presale_start__gte=now()) elif fdata.get('status') == 'past': qs = qs.filter(presale_end__lte=now()) elif fdata.get('status') == 'date_future': qs = qs.filter( Q(has_subevents=False) & Q( Q(Q(date_to__isnull=True) & Q(date_from__gte=now())) | Q(Q(date_to__isnull=False) & Q(date_to__gte=now())) ) ) elif fdata.get('status') == 'date_past': qs = qs.filter( Q(has_subevents=False) & Q( Q(Q(date_to__isnull=True) & Q(date_from__lt=now())) | Q(Q(date_to__isnull=False) & Q(date_to__lt=now())) ) ) elif fdata.get('status') == 'series': qs = qs.filter(has_subevents=True) if fdata.get('organizer'): qs = qs.filter(organizer=fdata.get('organizer')) if fdata.get('query'): query = fdata.get('query') qs = qs.filter( Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query) ) filters_by_property_name = {} for i, p in enumerate(self.meta_properties): d = fdata.get('meta_{}'.format(p.name)) if d: emv_with_value = EventMetaValue.objects.filter( event=OuterRef('pk'), property__pk=p.pk, value=d ) emv_with_any_value = EventMetaValue.objects.filter( event=OuterRef('pk'), property__pk=p.pk, ) qs = qs.annotate(**{'attr_{}'.format(i): Exists(emv_with_value)}) if p.name in filters_by_property_name: filters_by_property_name[p.name] |= Q(**{'attr_{}'.format(i): True}) else: filters_by_property_name[p.name] = Q(**{'attr_{}'.format(i): True}) if p.default == d: qs = qs.annotate(**{'attr_{}_any'.format(i): Exists(emv_with_any_value)}) filters_by_property_name[p.name] |= Q(**{'attr_{}_any'.format(i): False, 'organizer_id': p.organizer_id}) for f in filters_by_property_name.values(): qs = qs.filter(f) if fdata.get('ordering'): qs = qs.order_by(self.get_order_by()) return qs @cached_property def meta_properties(self): if self.organizer: return self.organizer.meta_properties.all() 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) )
class OrderSearchFilterForm(OrderFilterForm): orders = {'code': 'code', 'email': 'email', 'total': 'total', 'datetime': 'datetime', 'status': 'status', 'event': 'event'} organizer = forms.ModelChoiceField( label=_('Organizer'), queryset=Organizer.objects.none(), required=False, empty_label=_('All organizers'), widget=Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse_lazy('control:organizers.select2'), 'data-placeholder': _('All organizers') } ) ) def __init__(self, *args, **kwargs): self.request = kwargs.pop('request') super().__init__(*args, **kwargs) if self.request.user.has_active_staff_session(self.request.session.session_key): self.fields['organizer'].queryset = Organizer.objects.all() else: self.fields['organizer'].queryset = Organizer.objects.filter( pk__in=self.request.user.teams.values_list('organizer', flat=True) ) self.fields['provider'].choices += get_all_payment_providers() seen = set() for p in self.meta_properties.all(): if p.name in seen: continue seen.add(p.name) self.fields['meta_{}'.format(p.name)] = forms.CharField( label=p.name, required=False, widget=forms.TextInput( attrs={ 'data-typeahead-url': reverse('control:events.meta.typeahead') + '?' + urlencode({ 'property': p.name, 'organizer': '' }) } ) ) def filter_qs(self, qs): fdata = self.cleaned_data qs = super().filter_qs(qs) if fdata.get('organizer'): qs = qs.filter(event__organizer=fdata.get('organizer')) filters_by_property_name = {} for i, p in enumerate(self.meta_properties): d = fdata.get('meta_{}'.format(p.name)) if d: emv_with_value = EventMetaValue.objects.filter( event=OuterRef('event_id'), property__pk=p.pk, value=d ) emv_with_any_value = EventMetaValue.objects.filter( event=OuterRef('event_id'), property__pk=p.pk, ) qs = qs.annotate(**{'attr_{}'.format(i): Exists(emv_with_value)}) if p.name in filters_by_property_name: filters_by_property_name[p.name] |= Q(**{'attr_{}'.format(i): True}) else: filters_by_property_name[p.name] = Q(**{'attr_{}'.format(i): True}) if p.default == d: qs = qs.annotate(**{'attr_{}_any'.format(i): Exists(emv_with_any_value)}) filters_by_property_name[p.name] |= Q(**{ 'attr_{}_any'.format(i): False, 'event__organizer_id': p.organizer_id }) for f in filters_by_property_name.values(): qs = qs.filter(f) return qs @cached_property def meta_properties(self): # 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) )
def __init__(self, *args, **kwargs): instance = kwargs.get('instance') initial = kwargs.get('initial') if instance: self.initial_instance_data = modelcopy(instance) try: if instance.variation: initial['itemvar'] = '%d-%d' % (instance.item.pk, instance.variation.pk) elif instance.item: initial['itemvar'] = str(instance.item.pk) elif instance.quota: initial['itemvar'] = 'q-%d' % instance.quota.pk except Item.DoesNotExist: pass else: self.initial_instance_data = None super().__init__(*args, **kwargs) if instance.event.has_subevents: self.fields['subevent'].queryset = instance.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': instance.event.slug, 'organizer': instance.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'Date') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices self.fields['subevent'].required = False elif 'subevent': del self.fields['subevent'] choices = [] if 'itemvar' in initial or (self.data and 'itemvar' in self.data): iv = self.data.get('itemvar') or initial.get('itemvar', '') if iv.startswith('q-'): q = self.instance.event.quotas.get(pk=iv[2:]) choices.append( ('q-%d' % q.pk, _('Any product in quota "{quota}"').format(quota=q))) elif '-' in iv: itemid, varid = iv.split('-') i = self.instance.event.items.get(pk=itemid) v = i.variations.get(pk=varid) choices.append( ('%d-%d' % (i.pk, v.pk), '%s – %s' % (str(i), v.value))) elif iv: i = self.instance.event.items.get(pk=iv) if i.variations.exists(): choices.append( (str(i.pk), _('{product} – Any variation').format(product=i))) else: choices.append((str(i.pk), str(i))) self.fields['itemvar'].choices = choices self.fields['itemvar'].widget = Select2ItemVarQuota( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.vouchers.itemselect2', kwargs={ 'event': instance.event.slug, 'organizer': instance.event.organizer.slug, }), 'data-placeholder': '' }) self.fields['itemvar'].widget.choices = self.fields['itemvar'].choices self.fields['itemvar'].required = True
def __init__(self, *args, **kwargs): self.event = kwargs['event'] self.user = kwargs.pop('user') kwargs.setdefault('initial', {}) kwargs['initial'].setdefault('admission', True) super().__init__(*args, **kwargs) self.fields['category'].queryset = self.instance.event.categories.all() self.fields['category'].widget = Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.items.categories.select2', kwargs={ 'event': self.instance.event.slug, 'organizer': self.instance.event.organizer.slug, }), 'data-placeholder': _('No category'), } ) self.fields['category'].widget.choices = self.fields['category'].choices self.fields['tax_rule'].queryset = self.instance.event.tax_rules.all() change_decimal_field(self.fields['default_price'], self.instance.event.currency) self.fields['tax_rule'].empty_label = _('No taxation') self.fields['copy_from'] = forms.ModelChoiceField( label=_("Copy product information"), queryset=self.event.items.all(), widget=forms.Select, empty_label=_('Do not copy'), required=False ) if self.event.tax_rules.exists(): self.fields['tax_rule'].required = True if not self.event.has_subevents: choices = [ (self.NONE, _("Do not add to a quota now")), (self.EXISTING, _("Add product to an existing quota")), (self.NEW, _("Create a new quota for this product")) ] if not self.event.quotas.exists(): choices.remove(choices[1]) self.fields['quota_option'] = forms.ChoiceField( label=_("Quota options"), widget=forms.RadioSelect, choices=choices, initial=self.NONE, required=False ) self.fields['quota_add_existing'] = forms.ModelChoiceField( label=_("Add to existing quota"), widget=forms.Select(), queryset=self.instance.event.quotas.all(), required=False ) self.fields['quota_add_new_name'] = forms.CharField( label=_("Name"), max_length=200, widget=forms.TextInput(attrs={'placeholder': _("New quota name")}), required=False ) self.fields['quota_add_new_size'] = forms.IntegerField( min_value=0, label=_("Size"), widget=forms.TextInput(attrs={'placeholder': _("Number of tickets")}), help_text=_("Leave empty for an unlimited number of tickets."), required=False )
class EventFilterForm(FilterForm): orders = { 'slug': 'slug', 'organizer': 'organizer__name', 'date_from': 'order_from', 'date_to': 'order_to', 'live': 'live', 'sum_tickets_paid': 'sum_tickets_paid' } status = forms.ChoiceField( label=_('Status'), choices=( ('', _('All events')), ('live', _('Shop live')), ('running', _('Shop live and presale running')), ('notlive', _('Shop not live')), ('future', _('Presale not started')), ('past', _('Presale over')), ('date_future', _('Single event running or in the future')), ('date_past', _('Single event in the past')), ('series', _('Event series')), ), required=False) organizer = forms.ModelChoiceField( label=_('Organizer'), queryset=Organizer.objects.none(), required=False, empty_label=_('All organizers'), widget=Select2( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse_lazy('control:organizers.select2'), 'data-placeholder': _('All organizers') })) query = forms.CharField( label=_('Event name'), widget=forms.TextInput(attrs={ 'placeholder': _('Event name'), 'autofocus': 'autofocus' }), required=False) def __init__(self, *args, **kwargs): request = kwargs.pop('request') super().__init__(*args, **kwargs) if request.user.has_active_staff_session(request.session.session_key): self.fields['organizer'].queryset = Organizer.objects.all() else: self.fields['organizer'].queryset = Organizer.objects.filter( pk__in=request.user.teams.values_list('organizer', flat=True)) def filter_qs(self, qs): fdata = self.cleaned_data if fdata.get('status') == 'live': qs = qs.filter(live=True) elif fdata.get('status') == 'running': qs = qs.filter(live=True).filter( Q(presale_start__isnull=True) | Q(presale_start__lte=now())).filter( Q(presale_end__isnull=True) | Q(presale_end__gte=now())) elif fdata.get('status') == 'notlive': qs = qs.filter(live=False) elif fdata.get('status') == 'future': qs = qs.filter(presale_start__gte=now()) elif fdata.get('status') == 'past': qs = qs.filter(presale_end__lte=now()) elif fdata.get('status') == 'date_future': qs = qs.filter( Q(has_subevents=False) & Q( Q(Q(date_to__isnull=True) & Q(date_from__gte=now())) | Q(Q(date_to__isnull=False) & Q(date_to__gte=now())))) elif fdata.get('status') == 'date_past': qs = qs.filter( Q(has_subevents=False) & Q( Q(Q(date_to__isnull=True) & Q(date_from__lt=now())) | Q(Q(date_to__isnull=False) & Q(date_to__lt=now())))) elif fdata.get('status') == 'series': qs = qs.filter(has_subevents=True) if fdata.get('organizer'): qs = qs.filter(organizer=fdata.get('organizer')) if fdata.get('query'): query = fdata.get('query') qs = qs.filter( Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query)) if fdata.get('ordering'): qs = qs.order_by(self.get_order_by()) return qs
def __init__(self, *args, **kwargs): self.event = kwargs.pop('event') kwargs.setdefault('initial', {}) kwargs['initial']['gift_card_expires'] = self.event.organizer.default_gift_card_expiry super().__init__(*args, **kwargs) self.fields['send_subject'] = I18nFormField( label=_("Subject"), required=True, widget_kwargs={'attrs': {'data-display-dependency': '#id_send'}}, initial=_('Canceled: {event}'), widget=I18nTextInput, locales=self.event.settings.get('locales'), ) self.fields['send_message'] = I18nFormField( label=_('Message'), widget=I18nTextarea, required=True, widget_kwargs={'attrs': {'data-display-dependency': '#id_send'}}, locales=self.event.settings.get('locales'), initial=LazyI18nString.from_gettext(gettext_noop( 'Hello,\n\n' 'with this email, we regret to inform you that {event} has been canceled.\n\n' 'We will refund you {refund_amount} to your original payment method.\n\n' 'You can view the current state of your order here:\n\n{url}\n\nBest regards,\n\n' 'Your {event} team' )) ) self._set_field_placeholders('send_subject', ['event_or_subevent', 'refund_amount', 'position_or_address', 'order', 'event']) self._set_field_placeholders('send_message', ['event_or_subevent', 'refund_amount', 'position_or_address', 'order', 'event']) self.fields['send_waitinglist_subject'] = I18nFormField( label=_("Subject"), required=True, initial=_('Canceled: {event}'), widget=I18nTextInput, widget_kwargs={'attrs': {'data-display-dependency': '#id_send_waitinglist'}}, locales=self.event.settings.get('locales'), ) self.fields['send_waitinglist_message'] = I18nFormField( label=_('Message'), widget=I18nTextarea, required=True, locales=self.event.settings.get('locales'), widget_kwargs={'attrs': {'data-display-dependency': '#id_send_waitinglist'}}, initial=LazyI18nString.from_gettext(gettext_noop( 'Hello,\n\n' 'with this email, we regret to inform you that {event} has been canceled.\n\n' 'You will therefore not receive a ticket from the waiting list.\n\n' 'Best regards,\n\n' 'Your {event} team' )) ) self._set_field_placeholders('send_waitinglist_subject', ['event_or_subevent', 'event']) self._set_field_placeholders('send_waitinglist_message', ['event_or_subevent', 'event']) if self.event.has_subevents: self.fields['subevent'].queryset = self.event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-inverse-dependency': '#id_all_subevents', 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': self.event.slug, 'organizer': self.event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'All dates') } ) self.fields['subevent'].widget.choices = self.fields['subevent'].choices else: del self.fields['subevent'] del self.fields['all_subevents'] change_decimal_field(self.fields['keep_fee_fixed'], self.event.currency)
def __init__(self, *args, **kwargs): event = self.event = kwargs.pop('event') super().__init__(*args, **kwargs) recp_choices = [('orders', _('Everyone who created a ticket order'))] if event.settings.attendee_emails_asked: recp_choices += [ ('attendees', _('Every attendee (falling back to the order contact when no attendee email address is ' 'given)')), ('both', _('Both (all order contact addresses and all attendee email addresses)' )) ] self.fields['recipients'].choices = recp_choices self.fields['subject'] = I18nFormField( label=_('Subject'), widget=I18nTextInput, required=True, locales=event.settings.get('locales'), ) self.fields['message'] = I18nFormField( label=_('Message'), widget=I18nTextarea, required=True, locales=event.settings.get('locales'), ) self._set_field_placeholders('subject', ['event', 'order', 'position_or_address']) self._set_field_placeholders('message', ['event', 'order', 'position_or_address']) choices = [(e, l) for e, l in Order.STATUS_CHOICE if e != 'n'] choices.insert(0, ('na', _('payment pending (except unapproved)'))) choices.insert(0, ('pa', _('approval pending'))) if not event.settings.get('payment_term_expire_automatically', as_type=bool): choices.append(('overdue', _('pending with payment overdue'))) self.fields['sendto'] = forms.MultipleChoiceField( label=_("Send to customers with order status"), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'}), choices=choices) if not self.initial.get('sendto'): self.initial['sendto'] = ['p', 'na'] elif 'n' in self.initial['sendto']: self.initial['sendto'].append('pa') self.initial['sendto'].append('na') self.fields['items'].queryset = event.items.all() if not self.initial.get('items'): self.initial['items'] = event.items.all() self.fields['checkin_lists'].queryset = event.checkin_lists.all() self.fields['checkin_lists'].widget = Select2Multiple( attrs={ 'data-model-select2': 'generic', 'data-select2-url': reverse('control:event.orders.checkinlists.select2', kwargs={ 'event': event.slug, 'organizer': event.organizer.slug, }), 'data-placeholder': _('Send to customers checked in on list'), }) self.fields['checkin_lists'].widget.choices = self.fields[ 'checkin_lists'].choices self.fields['checkin_lists'].label = _( 'Send to customers checked in on list') if event.has_subevents: self.fields['subevent'].queryset = event.subevents.all() self.fields['subevent'].widget = Select2( attrs={ 'data-model-select2': 'event', 'data-select2-url': reverse('control:event.subevents.select2', kwargs={ 'event': event.slug, 'organizer': event.organizer.slug, }), 'data-placeholder': pgettext_lazy('subevent', 'Date') }) self.fields['subevent'].widget.choices = self.fields[ 'subevent'].choices else: del self.fields['subevent'] del self.fields['subevents_from'] del self.fields['subevents_to']