mirror of
https://github.com/pretix/pretix.git
synced 2026-05-20 17:44:02 +00:00
Compare commits
8 Commits
pajowu/wal
...
order-prin
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f792c52a3 | ||
|
|
412a5adf8f | ||
|
|
e4da2e5e03 | ||
|
|
9d7038b127 | ||
|
|
ce5af572cc | ||
|
|
6d293e544e | ||
|
|
28a8032adf | ||
|
|
d765a89139 |
@@ -43,7 +43,7 @@ dependencies = [
|
|||||||
"django-countries==8.2.*",
|
"django-countries==8.2.*",
|
||||||
"django-filter==25.1",
|
"django-filter==25.1",
|
||||||
"django-formset-js-improved==0.5.0.5",
|
"django-formset-js-improved==0.5.0.5",
|
||||||
"django-formtools==2.5.1",
|
"django-formtools==2.6.1",
|
||||||
"django-hierarkey==2.0.*,>=2.0.1",
|
"django-hierarkey==2.0.*,>=2.0.1",
|
||||||
"django-hijack==3.7.*",
|
"django-hijack==3.7.*",
|
||||||
"django-i18nfield==1.11.*",
|
"django-i18nfield==1.11.*",
|
||||||
@@ -56,7 +56,7 @@ dependencies = [
|
|||||||
"django-redis==6.0.*",
|
"django-redis==6.0.*",
|
||||||
"django-scopes==2.0.*",
|
"django-scopes==2.0.*",
|
||||||
"django-statici18n==2.7.*",
|
"django-statici18n==2.7.*",
|
||||||
"djangorestframework==3.16.*",
|
"djangorestframework==3.17.*",
|
||||||
"dnspython==2.8.*",
|
"dnspython==2.8.*",
|
||||||
"drf_ujson2==1.7.*",
|
"drf_ujson2==1.7.*",
|
||||||
"geoip2==5.*",
|
"geoip2==5.*",
|
||||||
@@ -91,9 +91,9 @@ dependencies = [
|
|||||||
"pyuca",
|
"pyuca",
|
||||||
"qrcode==8.2",
|
"qrcode==8.2",
|
||||||
"redis==7.4.*",
|
"redis==7.4.*",
|
||||||
"reportlab==4.4.*",
|
"reportlab==4.5.*",
|
||||||
"requests==2.32.*",
|
"requests==2.32.*",
|
||||||
"sentry-sdk==2.59.*",
|
"sentry-sdk==2.60.*",
|
||||||
"sepaxml==2.7.*",
|
"sepaxml==2.7.*",
|
||||||
"stripe==7.9.*",
|
"stripe==7.9.*",
|
||||||
"text-unidecode==1.*",
|
"text-unidecode==1.*",
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
import copy
|
import copy
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
@@ -47,9 +48,7 @@ from django.conf import settings
|
|||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||||
from django.core.validators import (
|
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||||
MaxValueValidator, MinValueValidator, RegexValidator,
|
|
||||||
)
|
|
||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
from django.forms import Select, widgets
|
from django.forms import Select, widgets
|
||||||
from django.forms.widgets import FILE_INPUT_CONTRADICTION
|
from django.forms.widgets import FILE_INPUT_CONTRADICTION
|
||||||
@@ -220,20 +219,6 @@ class NamePartsFormField(forms.MultiValueField):
|
|||||||
defaults = {
|
defaults = {
|
||||||
'widget': self.widget,
|
'widget': self.widget,
|
||||||
'max_length': kwargs.pop('max_length', None),
|
'max_length': kwargs.pop('max_length', None),
|
||||||
'validators': [
|
|
||||||
RegexValidator(
|
|
||||||
# The following characters should never appear in a name anywhere of
|
|
||||||
# the world. However, they commonly appear in inputs generated by spam
|
|
||||||
# bots.
|
|
||||||
r'^[^$€/%§{}<>~]*$',
|
|
||||||
message=_('Please do not use special characters in names.')
|
|
||||||
),
|
|
||||||
RegexValidator(
|
|
||||||
URL_RE,
|
|
||||||
inverse_match=True,
|
|
||||||
message=_('Please do not use special characters in names.')
|
|
||||||
)
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
self.max_length = defaults['max_length']
|
self.max_length = defaults['max_length']
|
||||||
self.scheme_name = kwargs.pop('scheme')
|
self.scheme_name = kwargs.pop('scheme')
|
||||||
@@ -255,7 +240,6 @@ class NamePartsFormField(forms.MultiValueField):
|
|||||||
if fname == 'title' and self.scheme_titles:
|
if fname == 'title' and self.scheme_titles:
|
||||||
d = dict(defaults)
|
d = dict(defaults)
|
||||||
d.pop('max_length', None)
|
d.pop('max_length', None)
|
||||||
d.pop('validators', None)
|
|
||||||
field = forms.ChoiceField(
|
field = forms.ChoiceField(
|
||||||
**d,
|
**d,
|
||||||
choices=[('', '')] + [(d, d) for d in self.scheme_titles[1]]
|
choices=[('', '')] + [(d, d) for d in self.scheme_titles[1]]
|
||||||
@@ -264,7 +248,6 @@ class NamePartsFormField(forms.MultiValueField):
|
|||||||
elif fname == 'salutation':
|
elif fname == 'salutation':
|
||||||
d = dict(defaults)
|
d = dict(defaults)
|
||||||
d.pop('max_length', None)
|
d.pop('max_length', None)
|
||||||
d.pop('validators', None)
|
|
||||||
field = forms.ChoiceField(
|
field = forms.ChoiceField(
|
||||||
**d,
|
**d,
|
||||||
choices=[
|
choices=[
|
||||||
@@ -296,6 +279,37 @@ class NamePartsFormField(forms.MultiValueField):
|
|||||||
if sum(len(v) for v in value.values() if v) > (self.max_length or 250):
|
if sum(len(v) for v in value.values() if v) > (self.max_length or 250):
|
||||||
raise forms.ValidationError(_('Please enter a shorter name.'), code='max_length')
|
raise forms.ValidationError(_('Please enter a shorter name.'), code='max_length')
|
||||||
|
|
||||||
|
for fname, label, size in self.scheme['fields']:
|
||||||
|
if fname == 'salutation' or (fname == 'title' and self.scheme_titles):
|
||||||
|
continue
|
||||||
|
v = value.get(fname)
|
||||||
|
if not v:
|
||||||
|
continue
|
||||||
|
special_chars = re.findall('[$€/%§{}<>~]', v)
|
||||||
|
if special_chars:
|
||||||
|
raise forms.ValidationError(
|
||||||
|
_('The field "%(label)s" may not contain special characters such as "%(chars)s".'),
|
||||||
|
code='name_special_chars',
|
||||||
|
params={
|
||||||
|
"label": label,
|
||||||
|
"chars": "".join(special_chars),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
# URL_RE checks for valid domain names, including one special TLD med, which can be part of a title
|
||||||
|
if ".med" in v:
|
||||||
|
v = v.replace(".med", ". med")
|
||||||
|
value[fname] = v
|
||||||
|
url_matched = URL_RE.search(v)
|
||||||
|
if url_matched:
|
||||||
|
raise forms.ValidationError(
|
||||||
|
_('The field "%(label)s" may not contain an URL (%(url)s).'),
|
||||||
|
code='url_in_title',
|
||||||
|
params={
|
||||||
|
"label": label,
|
||||||
|
"url": url_matched.group(0),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
if value.get("salutation") == "empty":
|
if value.get("salutation") == "empty":
|
||||||
value["salutation"] = ""
|
value["salutation"] = ""
|
||||||
|
|
||||||
|
|||||||
@@ -553,7 +553,7 @@
|
|||||||
<span class="fa fa-print"></span>
|
<span class="fa fa-print"></span>
|
||||||
{{ pl.datetime|date:"SHORT_DATETIME_FORMAT" }}
|
{{ pl.datetime|date:"SHORT_DATETIME_FORMAT" }}
|
||||||
{{ pl.get_type_display }}
|
{{ pl.get_type_display }}
|
||||||
({{ pl.source }}{% if pl.device %}, #{{ pl.device.device_id }}{% endif %})
|
({{ pl.source }}{% if pl.device %}, {{ pl.device.name }} - #{{ pl.device.device_id }}{% endif %})
|
||||||
{% if not pl.successful %}<span class="fa fa-warning fa-fw"></span>{% endif %}
|
{% if not pl.successful %}<span class="fa fa-warning fa-fw"></span>{% endif %}
|
||||||
<br>
|
<br>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
@@ -53,7 +53,17 @@ function async_task_on_success(data) {
|
|||||||
// hide waitingDialog when using browser's history back
|
// hide waitingDialog when using browser's history back
|
||||||
waitingDialog.hide();
|
waitingDialog.hide();
|
||||||
});
|
});
|
||||||
location.href = data.redirect;
|
if (async_task_is_download && window.self !== window.top) {
|
||||||
|
// if in an iframe, force to download an async_task_is_download
|
||||||
|
// e.g. pretix-reseller embeds order-page in iframe, which would cause ticket-PDFs to be displayed inline
|
||||||
|
var a = document.createElement("a");
|
||||||
|
a.href = data.redirect;
|
||||||
|
a.download = "";
|
||||||
|
a.target = "_blank";
|
||||||
|
a.click();
|
||||||
|
} else {
|
||||||
|
location.href = data.redirect;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$(this).trigger('pretix:async-task-success', data);
|
$(this).trigger('pretix:async-task-success', data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,4 +65,4 @@ if (itemsEl?.textContent) {
|
|||||||
|
|
||||||
export const productSelectURL = ref(document.querySelector('#product-select2')?.textContent)
|
export const productSelectURL = ref(document.querySelector('#product-select2')?.textContent)
|
||||||
export const variationSelectURL = ref(document.querySelector('#variations-select2')?.textContent)
|
export const variationSelectURL = ref(document.querySelector('#variations-select2')?.textContent)
|
||||||
export const gateSelectURL = ref(document.querySelector('#gate-select2')?.textContent)
|
export const gateSelectURL = ref(document.querySelector('#gates-select2')?.textContent)
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ RES_RULE = {
|
|||||||
"limit_products": [],
|
"limit_products": [],
|
||||||
"limit_variations": [],
|
"limit_variations": [],
|
||||||
"all_payment_methods": True,
|
"all_payment_methods": True,
|
||||||
"limit_payment_methods": set(),
|
"limit_payment_methods": [],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user