mirror of
https://github.com/pretix/pretix.git
synced 2026-05-09 15:54:03 +00:00
Merge branch 'master' into a11y-add-landmarks
This commit is contained in:
@@ -65,10 +65,20 @@ class MailForm(forms.Form):
|
|||||||
label=pgettext_lazy('subevent', 'Only send to customers of dates starting before'),
|
label=pgettext_lazy('subevent', 'Only send to customers of dates starting before'),
|
||||||
required=False,
|
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):
|
def clean(self):
|
||||||
d = super().clean()
|
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.'))
|
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')):
|
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.'))
|
raise ValidationError(pgettext_lazy('subevent', 'If you set a date range, please set both a start and an end.'))
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
{% block inner %}
|
{% block inner %}
|
||||||
<form class="form-horizontal" method="post" action="" enctype="multipart/form-data">
|
<form class="form-horizontal" method="post" action="" enctype="multipart/form-data">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
{% bootstrap_form_errors form %}
|
||||||
{% bootstrap_field form.recipients layout='horizontal' %}
|
{% bootstrap_field form.recipients layout='horizontal' %}
|
||||||
{% bootstrap_field form.sendto layout='horizontal' %}
|
{% bootstrap_field form.sendto layout='horizontal' %}
|
||||||
{% if form.subevent %}
|
{% if form.subevent %}
|
||||||
@@ -14,6 +15,8 @@
|
|||||||
{% bootstrap_field form.subevents_from layout='horizontal' %}
|
{% bootstrap_field form.subevents_from layout='horizontal' %}
|
||||||
{% bootstrap_field form.subevents_to layout='horizontal' %}
|
{% bootstrap_field form.subevents_to layout='horizontal' %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% bootstrap_field form.created_from layout='horizontal' %}
|
||||||
|
{% bootstrap_field form.created_to layout='horizontal' %}
|
||||||
{% bootstrap_field form.items layout='horizontal' %}
|
{% bootstrap_field form.items layout='horizontal' %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-9 col-md-offset-3">
|
<div class="col-md-9 col-md-offset-3">
|
||||||
|
|||||||
@@ -64,6 +64,10 @@ class SenderView(EventPermissionRequiredMixin, FormView):
|
|||||||
kwargs['initial']['subevents_from'] = dateutil.parser.parse(logentry.parsed_data['subevents_from'])
|
kwargs['initial']['subevents_from'] = dateutil.parser.parse(logentry.parsed_data['subevents_from'])
|
||||||
if logentry.parsed_data.get('subevents_to'):
|
if logentry.parsed_data.get('subevents_to'):
|
||||||
kwargs['initial']['subevents_to'] = dateutil.parser.parse(logentry.parsed_data['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'):
|
if logentry.parsed_data.get('subevent'):
|
||||||
try:
|
try:
|
||||||
kwargs['initial']['subevent'] = self.request.event.subevents.get(
|
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'))
|
opq = opq.filter(subevent__date_from__gte=form.cleaned_data.get('subevents_from'))
|
||||||
if form.cleaned_data.get('subevents_to'):
|
if form.cleaned_data.get('subevents_to'):
|
||||||
opq = opq.filter(subevent__date_from__lt=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()
|
orders = orders.annotate(match_pos=Exists(opq)).filter(match_pos=True).distinct()
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,44 @@
|
|||||||
from bootstrap3.renderers import FieldRenderer
|
from bootstrap3.renderers import FieldRenderer
|
||||||
|
from bootstrap3.text import text_value
|
||||||
from bootstrap3.utils import add_css_class
|
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('<i class="sr-only"> {}</i>'.format(pgettext('form', 'required'))) if not optional else ''
|
||||||
|
|
||||||
|
builder = '<{tag}{attrs}>{content}{opt}</{tag}>'
|
||||||
|
return format_html(
|
||||||
|
builder,
|
||||||
|
tag='label',
|
||||||
|
attrs=mark_safe(flatatt(attrs)) if attrs else '',
|
||||||
|
opt=opt,
|
||||||
|
content=text_value(content),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class CheckoutFieldRenderer(FieldRenderer):
|
class CheckoutFieldRenderer(FieldRenderer):
|
||||||
@@ -24,3 +63,28 @@ class CheckoutFieldRenderer(FieldRenderer):
|
|||||||
self.get_size_class(prefix='form-group')
|
self.get_size_class(prefix='form-group')
|
||||||
)
|
)
|
||||||
return form_group_class
|
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)),
|
||||||
|
)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
{% load rich_text %}
|
{% load rich_text %}
|
||||||
{% block inner %}
|
{% block inner %}
|
||||||
<p>{% trans "Before we continue, we need you to answer some questions." %}</p>
|
<p>{% trans "Before we continue, we need you to answer some questions." %}</p>
|
||||||
<p class="required-legend">
|
<p class="required-legend" aria-hidden="true">
|
||||||
{% blocktrans trimmed %}
|
{% blocktrans trimmed %}
|
||||||
You need to fill all fields that are marked with <span>*</span> to continue.
|
You need to fill all fields that are marked with <span>*</span> to continue.
|
||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
|
|||||||
Reference in New Issue
Block a user