From 72b6ff0389b74873685e1426e3cac9e6cebbc099 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 12 Feb 2021 12:34:04 +0100 Subject: [PATCH 1/3] Sendmail form: Fix validation problems --- src/pretix/plugins/sendmail/forms.py | 2 +- .../sendmail/templates/pretixplugins/sendmail/send_form.html | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pretix/plugins/sendmail/forms.py b/src/pretix/plugins/sendmail/forms.py index 6212b72d77..b8f24e030f 100644 --- a/src/pretix/plugins/sendmail/forms.py +++ b/src/pretix/plugins/sendmail/forms.py @@ -68,7 +68,7 @@ class MailForm(forms.Form): def clean(self): d = super().clean() - if d.get('subevent') and d.get('subevents_from'): + if d.get('subevent') and (d.get('subevents_from') or d.get('subevents_to')): raise ValidationError(pgettext_lazy('subevent', 'Please either select a specific date or a date range, not both.')) if bool(d.get('subevents_from')) != bool(d.get('subevents_to')): raise ValidationError(pgettext_lazy('subevent', 'If you set a date range, please set both a start and an end.')) diff --git a/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html index a67794e1cc..505e71e46c 100644 --- a/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html +++ b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html @@ -7,6 +7,7 @@ {% block inner %}
{% csrf_token %} + {% bootstrap_form_errors form %} {% bootstrap_field form.recipients layout='horizontal' %} {% bootstrap_field form.sendto layout='horizontal' %} {% if form.subevent %} From c8d039b1968bb91dde8324c545a64e9f601ac45a Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 12 Feb 2021 12:41:45 +0100 Subject: [PATCH 2/3] Sendmail: Allow to filter by order date --- src/pretix/plugins/sendmail/forms.py | 10 ++++++++++ .../templates/pretixplugins/sendmail/send_form.html | 2 ++ src/pretix/plugins/sendmail/views.py | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/src/pretix/plugins/sendmail/forms.py b/src/pretix/plugins/sendmail/forms.py index b8f24e030f..28e550085f 100644 --- a/src/pretix/plugins/sendmail/forms.py +++ b/src/pretix/plugins/sendmail/forms.py @@ -65,6 +65,16 @@ class MailForm(forms.Form): label=pgettext_lazy('subevent', 'Only send to customers of dates starting before'), required=False, ) + created_from = forms.SplitDateTimeField( + widget=SplitDateTimePickerWidget(), + label=pgettext_lazy('subevent', 'Only send to customers with orders created after'), + required=False, + ) + created_to = forms.SplitDateTimeField( + widget=SplitDateTimePickerWidget(), + label=pgettext_lazy('subevent', 'Only send to customers with orders created before'), + required=False, + ) def clean(self): d = super().clean() diff --git a/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html index 505e71e46c..9aeae04b8f 100644 --- a/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html +++ b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html @@ -15,6 +15,8 @@ {% bootstrap_field form.subevents_from layout='horizontal' %} {% bootstrap_field form.subevents_to layout='horizontal' %} {% endif %} + {% bootstrap_field form.created_from layout='horizontal' %} + {% bootstrap_field form.created_to layout='horizontal' %} {% bootstrap_field form.items layout='horizontal' %}
diff --git a/src/pretix/plugins/sendmail/views.py b/src/pretix/plugins/sendmail/views.py index 6e9ef623ce..45394ad7f5 100644 --- a/src/pretix/plugins/sendmail/views.py +++ b/src/pretix/plugins/sendmail/views.py @@ -64,6 +64,10 @@ class SenderView(EventPermissionRequiredMixin, FormView): kwargs['initial']['subevents_from'] = dateutil.parser.parse(logentry.parsed_data['subevents_from']) if logentry.parsed_data.get('subevents_to'): kwargs['initial']['subevents_to'] = dateutil.parser.parse(logentry.parsed_data['subevents_to']) + if logentry.parsed_data.get('created_from'): + kwargs['initial']['created_from'] = dateutil.parser.parse(logentry.parsed_data['created_from']) + if logentry.parsed_data.get('created_to'): + kwargs['initial']['created_to'] = dateutil.parser.parse(logentry.parsed_data['created_to']) if logentry.parsed_data.get('subevent'): try: kwargs['initial']['subevent'] = self.request.event.subevents.get( @@ -117,6 +121,10 @@ class SenderView(EventPermissionRequiredMixin, FormView): opq = opq.filter(subevent__date_from__gte=form.cleaned_data.get('subevents_from')) if form.cleaned_data.get('subevents_to'): opq = opq.filter(subevent__date_from__lt=form.cleaned_data.get('subevents_to')) + if form.cleaned_data.get('created_from'): + opq = opq.filter(order__datetime__gte=form.cleaned_data.get('created_from')) + if form.cleaned_data.get('created_to'): + opq = opq.filter(order__datetime__lt=form.cleaned_data.get('created_to')) orders = orders.annotate(match_pos=Exists(opq)).filter(match_pos=True).distinct() From 825fd1820bb882585b416aab6db8e731dcd1f9a0 Mon Sep 17 00:00:00 2001 From: Richard Schreiber Date: Fri, 12 Feb 2021 14:05:30 +0100 Subject: [PATCH 3/3] [a11y] Add text "required" to label of required inputs (#1923) --- src/pretix/presale/forms/renderers.py | 64 +++++++++++++++++++ .../event/checkout_questions.html | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/pretix/presale/forms/renderers.py b/src/pretix/presale/forms/renderers.py index bd3a1e1af8..f0ff35e75f 100644 --- a/src/pretix/presale/forms/renderers.py +++ b/src/pretix/presale/forms/renderers.py @@ -1,5 +1,44 @@ from bootstrap3.renderers import FieldRenderer +from bootstrap3.text import text_value from bootstrap3.utils import add_css_class +from django.forms import CheckboxInput +from django.forms.utils import flatatt +from django.utils.html import escape, format_html, strip_tags +from django.utils.safestring import mark_safe +from django.utils.translation import pgettext + + +def render_label(content, label_for=None, label_class=None, label_title='', optional=False): + """ + Render a label with content + """ + attrs = {} + if label_for: + attrs['for'] = label_for + if label_class: + attrs['class'] = label_class + if label_title: + attrs['title'] = label_title + + if text_value(content) == ' ': + # Empty label, e.g. checkbox + attrs.setdefault('class', '') + attrs['class'] += ' label-empty' + # usually checkboxes have overall empty labels and special labels per checkbox + # => remove for-attribute as well as "required"-text appended to label + del(attrs['for']) + opt = "" + else: + opt = mark_safe(' {}'.format(pgettext('form', 'required'))) if not optional else '' + + builder = '<{tag}{attrs}>{content}{opt}' + return format_html( + builder, + tag='label', + attrs=mark_safe(flatatt(attrs)) if attrs else '', + opt=opt, + content=text_value(content), + ) class CheckoutFieldRenderer(FieldRenderer): @@ -24,3 +63,28 @@ class CheckoutFieldRenderer(FieldRenderer): self.get_size_class(prefix='form-group') ) return form_group_class + + def add_label(self, html): + label = self.get_label() + + if hasattr(self.field.field, '_required'): + # e.g. payment settings forms where a field is only required if the payment provider is active + required = self.field.field._required + else: + required = self.field.field.required + + html = render_label( + label, + label_for=self.field.id_for_label, + label_class=self.get_label_class(), + optional=not required and not isinstance(self.widget, CheckboxInput) + ) + html + return html + + def put_inside_label(self, html): + content = "{field} {label}".format(field=html, label=self.label) + return render_label( + content=mark_safe(content), + label_for=self.field.id_for_label, + label_title=escape(strip_tags(self.field_help)), + ) diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html b/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html index a949236e92..6288a1d0fc 100644 --- a/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html @@ -4,7 +4,7 @@ {% load rich_text %} {% block inner %}

{% trans "Before we continue, we need you to answer some questions." %}

-

+