class Meta: model = Event localized_fields = '__all__' fields = [ 'name', 'slug', 'currency', 'date_from', 'date_to', 'date_admission', 'is_public', 'presale_start', 'presale_end', 'location', ] field_classes = { 'date_from': SplitDateTimeField, 'date_to': SplitDateTimeField, 'date_admission': SplitDateTimeField, 'presale_start': SplitDateTimeField, 'presale_end': SplitDateTimeField, } widgets = { 'date_from': SplitDateTimePickerWidget(), 'date_to': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_date_from_0'}), 'date_admission': SplitDateTimePickerWidget(attrs={'data-date-default': '#id_date_from_0'}), 'presale_start': SplitDateTimePickerWidget(), 'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}), }
class Meta: model = Event fields = [ 'name', 'slug', 'currency', 'date_from', 'date_to', 'presale_start', 'presale_end', 'location', ] field_classes = { 'date_from': forms.SplitDateTimeField, 'date_to': forms.SplitDateTimeField, 'presale_start': forms.SplitDateTimeField, 'presale_end': forms.SplitDateTimeField, } widgets = { 'date_from': SplitDateTimePickerWidget(), 'date_to': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_basics-date_from_0'}), 'presale_start': SplitDateTimePickerWidget(), 'presale_end': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_basics-presale_start_0'}), 'slug': SlugWidget, }
class Meta: model = SubEvent localized_fields = '__all__' fields = [ 'name', 'active', 'date_from', 'date_to', 'date_admission', 'presale_start', 'presale_end', 'location', 'frontpage_text' ] field_classes = { 'date_from': forms.SplitDateTimeField, 'date_to': forms.SplitDateTimeField, 'date_admission': forms.SplitDateTimeField, 'presale_start': forms.SplitDateTimeField, 'presale_end': forms.SplitDateTimeField, } widgets = { 'date_from': SplitDateTimePickerWidget(), 'date_to': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_date_from_0'}), 'date_admission': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_date_from_0'}), 'presale_start': SplitDateTimePickerWidget(), 'presale_end': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_presale_start_0'}), }
class Meta: model = Item localized_fields = '__all__' fields = [ 'category', 'name', 'internal_name', 'active', 'sales_channels', 'admission', 'description', 'picture', 'default_price', 'free_price', 'tax_rule', 'available_from', 'available_until', 'require_voucher', 'require_approval', 'hide_without_voucher', 'allow_cancel', 'max_per_order', 'min_per_order', 'checkin_attention', 'generate_tickets', 'original_price', 'require_bundling', 'show_quota_left' ] field_classes = { 'available_from': SplitDateTimeField, 'available_until': SplitDateTimeField, } widgets = { 'available_from': SplitDateTimePickerWidget(), 'available_until': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_available_from_0'}), 'generate_tickets': TicketNullBooleanSelect(), 'show_quota_left': ShowQuotaNullBooleanSelect() }
class Meta: model = ItemVariation localized_fields = '__all__' fields = [ 'value', 'active', 'default_price', 'original_price', 'description', 'require_membership', 'require_membership_types', 'available_from', 'available_until', 'sales_channels', 'hide_without_voucher', ] field_classes = { 'available_from': SplitDateTimeField, 'available_until': SplitDateTimeField, } widgets = { 'available_from': SplitDateTimePickerWidget(), 'available_until': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_available_from_0'}), 'require_membership_types': forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'}), }
class Meta: model = Item localized_fields = '__all__' fields = [ 'category', 'name', 'internal_name', 'active', 'admission', 'description', 'picture', 'default_price', 'free_price', 'tax_rule', 'available_from', 'available_until', 'require_voucher', 'require_approval', 'hide_without_voucher', 'allow_cancel', 'max_per_order', 'min_per_order', 'checkin_attention', 'original_price' ] field_classes = { 'available_from': forms.SplitDateTimeField, 'available_until': forms.SplitDateTimeField, } widgets = { 'available_from': SplitDateTimePickerWidget(), 'available_until': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_available_from_0'}), }
class Meta: model = Item localized_fields = '__all__' fields = [ 'category', 'name', 'internal_name', 'active', 'sales_channels', 'admission', 'description', 'picture', 'default_price', 'free_price', 'tax_rule', 'available_from', 'available_until', 'require_voucher', 'require_approval', 'hide_without_voucher', 'allow_cancel', 'allow_waitinglist', 'max_per_order', 'min_per_order', 'checkin_attention', 'generate_tickets', 'original_price', 'require_bundling', 'show_quota_left', 'hidden_if_available', 'issue_giftcard', 'require_membership', 'require_membership_types', 'require_membership_hidden', 'grant_membership_type', 'grant_membership_duration_like_event', 'grant_membership_duration_days', 'grant_membership_duration_months', ] field_classes = { 'available_from': SplitDateTimeField, 'available_until': SplitDateTimeField, 'hidden_if_available': SafeModelChoiceField, 'grant_membership_type': SafeModelChoiceField, 'require_membership_types': SafeModelMultipleChoiceField, } widgets = { 'available_from': SplitDateTimePickerWidget(), 'available_until': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_available_from_0'}), 'require_membership_types': forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'}), 'generate_tickets': TicketNullBooleanSelect(), 'show_quota_left': ShowQuotaNullBooleanSelect() }
class Meta: model = SubEventItemVariation fields = ['price', 'disabled', 'available_from', 'available_until'] widgets = { 'available_from': SplitDateTimePickerWidget(), 'available_until': SplitDateTimePickerWidget(), 'price': forms.TextInput } field_classes = { 'available_from': SplitDateTimeField, 'available_until': SplitDateTimeField, }
class Meta: model = SubEvent localized_fields = '__all__' fields = [ 'name', 'active', 'is_public', 'date_from', 'date_to', 'date_admission', 'presale_start', 'presale_end', 'location', 'frontpage_text', 'geo_lat', 'geo_lon', ] field_classes = { 'date_from': SplitDateTimeField, 'date_to': SplitDateTimeField, 'date_admission': SplitDateTimeField, 'presale_start': SplitDateTimeField, 'presale_end': SplitDateTimeField, } widgets = { 'date_from': SplitDateTimePickerWidget(), 'date_to': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_date_from_0'}), 'date_admission': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_date_from_0'}), 'presale_start': SplitDateTimePickerWidget(), 'presale_end': SplitDateTimePickerWidget( attrs={'data-date-after': '#id_presale_start_0'}), 'geo_lat': forms.NumberInput(attrs={ 'min': '-90', 'max': '90' }), 'geo_lon': forms.NumberInput(attrs={ 'min': '-180', 'max': '180' }), }
class Meta: model = Question localized_fields = '__all__' fields = [ 'question', 'help_text', 'type', 'required', 'ask_during_checkin', 'hidden', 'identifier', 'items', 'dependency_question', 'dependency_values', 'print_on_invoice', 'valid_number_min', 'valid_number_max', 'valid_datetime_min', 'valid_datetime_max', 'valid_date_min', 'valid_date_max', 'valid_file_portrait', ] widgets = { 'valid_datetime_min': SplitDateTimePickerWidget(), 'valid_datetime_max': SplitDateTimePickerWidget(), 'valid_date_min': DatePickerWidget(), 'valid_date_max': DatePickerWidget(), 'items': forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'}), 'dependency_values': forms.SelectMultiple, } field_classes = { 'valid_datetime_min': SplitDateTimeField, 'valid_datetime_max': SplitDateTimeField, 'items': ItemMultipleChoiceField, 'dependency_question': SafeModelChoiceField, }
class Meta: model = Voucher localized_fields = '__all__' fields = [ 'code', 'valid_until', 'block_quota', 'allow_ignore_quota', 'value', 'tag', 'comment', 'max_usages', 'price_mode', 'subevent' ] field_classes = { 'valid_until': forms.SplitDateTimeField, } widgets = { 'valid_until': SplitDateTimePickerWidget(), }
class Meta: model = Voucher localized_fields = '__all__' fields = [ 'valid_until', 'block_quota', 'allow_ignore_quota', 'value', 'tag', 'comment', 'max_usages', 'price_mode', 'subevent' ] field_classes = { 'valid_until': forms.SplitDateTimeField, } widgets = { 'valid_until': SplitDateTimePickerWidget(), } labels = {'max_usages': _('Maximum usages per voucher')} help_texts = { 'max_usages': _('Number of times times EACH of these vouchers can be redeemed.') }
def __init__(self, *args, **kwargs): """ Takes two additional keyword arguments: :param cartpos: The cart position the form should be for :param event: The event this belongs to """ cartpos = self.cartpos = kwargs.pop('cartpos', None) orderpos = self.orderpos = kwargs.pop('orderpos', None) pos = cartpos or orderpos item = pos.item questions = list(item.questions.all()) event = kwargs.pop('event') super().__init__(*args, **kwargs) if item.admission and event.settings.attendee_names_asked: self.fields['attendee_name'] = forms.CharField( max_length=255, required=event.settings.attendee_names_required, label=_('Attendee name'), initial=(cartpos.attendee_name if cartpos else orderpos.attendee_name), ) if item.admission and event.settings.attendee_emails_asked: self.fields['attendee_email'] = forms.EmailField( required=event.settings.attendee_emails_required, label=_('Attendee email'), initial=(cartpos.attendee_email if cartpos else orderpos.attendee_email) ) for q in questions: # Do we already have an answer? Provide it as the initial value answers = [ a for a in (cartpos.answers.all() if cartpos else orderpos.answers.all()) if a.question_id == q.id ] if answers: initial = answers[0] else: initial = None tz = pytz.timezone(event.settings.timezone) if q.type == Question.TYPE_BOOLEAN: if q.required: # For some reason, django-bootstrap3 does not set the required attribute # itself. widget = forms.CheckboxInput(attrs={'required': 'required'}) else: widget = forms.CheckboxInput() if initial: initialbool = (initial.answer == "True") else: initialbool = False field = forms.BooleanField( label=q.question, required=q.required, help_text=q.help_text, initial=initialbool, widget=widget, ) elif q.type == Question.TYPE_NUMBER: field = forms.DecimalField( label=q.question, required=q.required, help_text=q.help_text, initial=initial.answer if initial else None, min_value=Decimal('0.00'), ) elif q.type == Question.TYPE_STRING: field = forms.CharField( label=q.question, required=q.required, help_text=q.help_text, initial=initial.answer if initial else None, ) elif q.type == Question.TYPE_TEXT: field = forms.CharField( label=q.question, required=q.required, help_text=q.help_text, widget=forms.Textarea, initial=initial.answer if initial else None, ) elif q.type == Question.TYPE_CHOICE: field = forms.ModelChoiceField( queryset=q.options.all(), label=q.question, required=q.required, help_text=q.help_text, widget=forms.Select, empty_label='', initial=initial.options.first() if initial else None, ) elif q.type == Question.TYPE_CHOICE_MULTIPLE: field = forms.ModelMultipleChoiceField( queryset=q.options.all(), label=q.question, required=q.required, help_text=q.help_text, widget=forms.CheckboxSelectMultiple, initial=initial.options.all() if initial else None, ) elif q.type == Question.TYPE_FILE: field = forms.FileField( label=q.question, required=q.required, help_text=q.help_text, initial=initial.file if initial else None, widget=UploadedFileWidget(position=pos, event=event, answer=initial), ) elif q.type == Question.TYPE_DATE: field = forms.DateField( label=q.question, required=q.required, help_text=q.help_text, initial=dateutil.parser.parse(initial.answer).date() if initial and initial.answer else None, widget=DatePickerWidget(), ) elif q.type == Question.TYPE_TIME: field = forms.TimeField( label=q.question, required=q.required, help_text=q.help_text, initial=dateutil.parser.parse(initial.answer).astimezone(tz).time() if initial and initial.answer else None, widget=TimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')), ) elif q.type == Question.TYPE_DATETIME: field = forms.SplitDateTimeField( label=q.question, required=q.required, help_text=q.help_text, initial=dateutil.parser.parse(initial.answer).astimezone(tz) if initial and initial.answer else None, widget=SplitDateTimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')), ) field.question = q if answers: # Cache the answer object for later use field.answer = answers[0] self.fields['question_%s' % q.id] = field responses = question_form_fields.send(sender=event, position=pos) data = pos.meta_info_data for r, response in sorted(responses, key=lambda r: str(r[0])): for key, value in response.items(): # We need to be this explicit, since OrderedDict.update does not retain ordering self.fields[key] = value value.initial = data.get('question_form_data', {}).get(key)