mirror of
https://github.com/pretix/pretix.git
synced 2026-08-06 10:07:50 +00:00
Compare commits
130
Commits
escapejson
...
sbom
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
019551fc19 | ||
|
|
2ee49dfa14 | ||
|
|
65c774c1f6 | ||
|
|
a9de7a5b12 | ||
|
|
50c61b038c | ||
|
|
f26f9821ad | ||
|
|
9f697a296e | ||
|
|
ff6d2767b4 | ||
|
|
9d997f6509 | ||
|
|
f7a292debd | ||
|
|
6881ed47a2 | ||
|
|
541e7412e1 | ||
|
|
79dcf60ed2 | ||
|
|
8775ca09b4 | ||
|
|
c34cdf5ec6 | ||
|
|
8a000f9892 | ||
|
|
07bf0b3118 | ||
|
|
abe938795c | ||
|
|
f1cb5a9010 | ||
|
|
6e6ca0a7bc | ||
|
|
8800b15a33 | ||
|
|
85de097497 | ||
|
|
16040f70bb | ||
|
|
9b5ed06b2e | ||
|
|
f3ffce4e5b | ||
|
|
5c98dc16b7 | ||
|
|
d814b40fcd | ||
|
|
a696c493e2 | ||
|
|
e88b539375 | ||
|
|
163cf85c86 | ||
|
|
55b6887c5e | ||
|
|
2592d3cb8d | ||
|
|
47b632eabe | ||
|
|
7f2e957092 | ||
|
|
1ff9742a08 | ||
|
|
d9f8679647 | ||
|
|
1a7e36a144 | ||
|
|
9afc71c245 | ||
|
|
1087db9529 | ||
|
|
6d62284d87 | ||
|
|
db147280fd | ||
|
|
d1ce4566a7 | ||
|
|
c3cfd4ea91 | ||
|
|
92e7069a8e | ||
|
|
f471091d77 | ||
|
|
351d2055f8 | ||
|
|
ca03a2556d | ||
|
|
2381af4267 | ||
|
|
9fd570a53d | ||
|
|
072c17c91a | ||
|
|
003bfb707d | ||
|
|
faf8a6b1d2 | ||
|
|
a4d10d9550 | ||
|
|
baf3cf04ec | ||
|
|
fa2009ed03 | ||
|
|
cc082e2001 | ||
|
|
930e153db4 | ||
|
|
560a369e65 | ||
|
|
d47c435489 | ||
|
|
32e0e31b15 | ||
|
|
ea819530f9 | ||
|
|
09aef94376 | ||
|
|
39fbd25fbb | ||
|
|
214ea5fcd3 | ||
|
|
2de032c2be | ||
|
|
2574b31afd | ||
|
|
5f2264daeb | ||
|
|
4295b02406 | ||
|
|
49247062bc | ||
|
|
f3db461a2a | ||
|
|
83e607b88d | ||
|
|
9609722a98 | ||
|
|
4372aa6725 | ||
|
|
71488f0a02 | ||
|
|
52a4381277 | ||
|
|
bf066909a7 | ||
|
|
1399d37827 | ||
|
|
0c0842c9db | ||
|
|
6e647b41e4 | ||
|
|
7cff4321e0 | ||
|
|
fe5d095ae7 | ||
|
|
ebc31c901a | ||
|
|
2660dfe1bc | ||
|
|
08c376a459 | ||
|
|
6901ed8b26 | ||
|
|
62f1cbadaf | ||
|
|
1386b40e6f | ||
|
|
bbcd1b86b7 | ||
|
|
6894070239 | ||
|
|
7470a7198b | ||
|
|
ddda634ef3 | ||
|
|
3f7064f12b | ||
|
|
6386c99175 | ||
|
|
eb29101d09 | ||
|
|
d007fb9566 | ||
|
|
93cbbea193 | ||
|
|
eacce6d1f8 | ||
|
|
cdd7412fbb | ||
|
|
a6d462c14e | ||
|
|
d5d928cdce | ||
|
|
e0a8b81290 | ||
|
|
6b0419e488 | ||
|
|
48104e0c9f | ||
|
|
7eefb18b67 | ||
|
|
f9022e5a5e | ||
|
|
08c5963d7b | ||
|
|
e8274527cb | ||
|
|
f77aad0eeb | ||
|
|
d5b0059c34 | ||
|
|
47a170ab62 | ||
|
|
93aebffe2c | ||
|
|
7795c711be | ||
|
|
1eb685d4ee | ||
|
|
b8c523cfac | ||
|
|
fae9fff98e | ||
|
|
92cfbd54b9 | ||
|
|
18203e0804 | ||
|
|
52ed8eeb50 | ||
|
|
1e4888bad0 | ||
|
|
c3056a8aae | ||
|
|
4a4cff3c41 | ||
|
|
ffca102a8a | ||
|
|
78f8830f90 | ||
|
|
eb594266a7 | ||
|
|
76e6803eac | ||
|
|
e19908571c | ||
|
|
779ab360df | ||
|
|
723c63008d | ||
|
|
15c194c0a3 | ||
|
|
7f847c3dd2 |
@@ -0,0 +1,45 @@
|
|||||||
|
name: SBOM
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master, sbom ]
|
||||||
|
tags: [ 'v.*' ]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
|
||||||
|
env:
|
||||||
|
FORCE_COLOR: 1
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
name: Submission
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: "3.13"
|
||||||
|
- name: Use Node.js
|
||||||
|
uses: actions/setup-node@v7
|
||||||
|
with:
|
||||||
|
node-version: '24.x'
|
||||||
|
- uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ~/.cache/pip
|
||||||
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pip-
|
||||||
|
- name: Install system dependencies
|
||||||
|
run: sudo apt update && sudo apt install -y gettext unzip
|
||||||
|
- name: Install Python dependencies
|
||||||
|
run: pip3 install -U "prisma-sbom-submit[python]"
|
||||||
|
- name: Test
|
||||||
|
run: /opt/hostedtoolcache/node/24.18.0/x64/bin/npm install --global @cyclonedx/cyclonedx-npm
|
||||||
|
- name: Create SBOM
|
||||||
|
run: NPM=$(which npm) prisma-sbom-submit collect . sbom.json
|
||||||
|
- name: Submit SBOM
|
||||||
|
run: prisma-sbom-submit upload --server https://prisma.pretix.com sbom.json
|
||||||
|
env:
|
||||||
|
PRISMA_UPLOAD_TOKEN: ${{ secrets.PRISMA_UPLOAD_TOKEN }}
|
||||||
@@ -351,7 +351,8 @@ Endpoints
|
|||||||
|
|
||||||
:<json boolean error_reason: One of ``canceled``, ``invalid``, ``unpaid``, ``product``, ``rules``, ``revoked``,
|
:<json boolean error_reason: One of ``canceled``, ``invalid``, ``unpaid``, ``product``, ``rules``, ``revoked``,
|
||||||
``incomplete``, ``already_redeemed``, ``blocked``, ``invalid_time``, or ``error``. Required.
|
``incomplete``, ``already_redeemed``, ``blocked``, ``invalid_time``, or ``error``. Required.
|
||||||
:<json raw_barcode: The raw barcode you scanned. Required.
|
:<json raw_barcode: The raw barcode or identifier you scanned. Required.
|
||||||
|
:<json raw_source_type: The type of medium you scanned, defaults to ``barcode``. Optional.
|
||||||
:<json datetime: Date and time of the scan. Optional.
|
:<json datetime: Date and time of the scan. Optional.
|
||||||
:<json type: Type of scan, defaults to ``"entry"``.
|
:<json type: Type of scan, defaults to ``"entry"``.
|
||||||
:<json position: Internal ID of an order position you matched. Optional.
|
:<json position: Internal ID of an order position you matched. Optional.
|
||||||
|
|||||||
@@ -864,6 +864,9 @@ Generating new secrets
|
|||||||
|
|
||||||
Triggers generation of new ``secret`` and ``web_secret`` attributes for both the order and all order positions.
|
Triggers generation of new ``secret`` and ``web_secret`` attributes for both the order and all order positions.
|
||||||
|
|
||||||
|
Ticket secrets of order positions that have been used to issue a gift card can not
|
||||||
|
be changed. Only the link (``web_secret``) will be changed in this case.
|
||||||
|
|
||||||
**Example request**:
|
**Example request**:
|
||||||
|
|
||||||
.. sourcecode:: http
|
.. sourcecode:: http
|
||||||
@@ -895,6 +898,9 @@ Generating new secrets
|
|||||||
|
|
||||||
Triggers generation of a new ``secret`` and ``web_secret`` attribute for a single order position.
|
Triggers generation of a new ``secret`` and ``web_secret`` attribute for a single order position.
|
||||||
|
|
||||||
|
Ticket secrets of order positions that have been used to issue a gift card can not
|
||||||
|
be changed. Only the link (``web_secret``) will be changed in this case.
|
||||||
|
|
||||||
**Example request**:
|
**Example request**:
|
||||||
|
|
||||||
.. sourcecode:: http
|
.. sourcecode:: http
|
||||||
|
|||||||
Generated
+10
-10
@@ -2584,9 +2584,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/immutable": {
|
"node_modules/immutable": {
|
||||||
"version": "5.1.5",
|
"version": "5.1.9",
|
||||||
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
|
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
|
||||||
"integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
|
"integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
@@ -3176,9 +3176,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/nanoid": {
|
"node_modules/nanoid": {
|
||||||
"version": "3.3.12",
|
"version": "3.3.16",
|
||||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
|
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
|
||||||
"integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
|
"integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "github",
|
"type": "github",
|
||||||
@@ -3352,9 +3352,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.5.15",
|
"version": "8.5.23",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz",
|
||||||
"integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
|
"integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@@ -3371,7 +3371,7 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nanoid": "^3.3.12",
|
"nanoid": "^3.3.16",
|
||||||
"picocolors": "^1.1.1",
|
"picocolors": "^1.1.1",
|
||||||
"source-map-js": "^1.2.1"
|
"source-map-js": "^1.2.1"
|
||||||
},
|
},
|
||||||
|
|||||||
+9
-9
@@ -40,11 +40,11 @@ dependencies = [
|
|||||||
"Django[argon2]==5.2.*",
|
"Django[argon2]==5.2.*",
|
||||||
"django-bootstrap3==26.1",
|
"django-bootstrap3==26.1",
|
||||||
"django-compressor==4.6.0",
|
"django-compressor==4.6.0",
|
||||||
"django-countries==8.2.*",
|
"django-countries==9.0.*",
|
||||||
"django-filter==25.1",
|
"django-filter==26.1",
|
||||||
"django-formset-js-improved==0.5.0.5",
|
"django-formset-js-improved==0.5.0.5",
|
||||||
"django-formtools==2.6.1",
|
"django-formtools==2.7",
|
||||||
"django-hierarkey==2.0.*,>=2.0.1",
|
"django-hierarkey==2.0.*,>=2.0.2",
|
||||||
"django-hijack==3.7.*",
|
"django-hijack==3.7.*",
|
||||||
"django-i18nfield==1.11.*",
|
"django-i18nfield==1.11.*",
|
||||||
"django-libsass==0.9",
|
"django-libsass==0.9",
|
||||||
@@ -52,10 +52,10 @@ dependencies = [
|
|||||||
"django-markup",
|
"django-markup",
|
||||||
"django-oauth-toolkit==2.3.*",
|
"django-oauth-toolkit==2.3.*",
|
||||||
"django-otp==1.7.*",
|
"django-otp==1.7.*",
|
||||||
"django-phonenumber-field==8.4.*",
|
"django-phonenumber-field==8.5.*",
|
||||||
"django-querytagger==0.0.3",
|
"django-querytagger==0.0.3",
|
||||||
"django-redis==7.0.*",
|
"django-redis==7.0.*",
|
||||||
"django-scopes==2.0.*",
|
"django-scopes==2.1.*",
|
||||||
"django-statici18n==2.7.*",
|
"django-statici18n==2.7.*",
|
||||||
"djangorestframework==3.17.*",
|
"djangorestframework==3.17.*",
|
||||||
"dnspython==2.8.*",
|
"dnspython==2.8.*",
|
||||||
@@ -94,11 +94,11 @@ dependencies = [
|
|||||||
"redis==7.4.*",
|
"redis==7.4.*",
|
||||||
"reportlab==5.0.*",
|
"reportlab==5.0.*",
|
||||||
"requests==2.34.*",
|
"requests==2.34.*",
|
||||||
"sentry-sdk==2.64.*",
|
"sentry-sdk==2.66.*",
|
||||||
"sepaxml==2.7.*",
|
"sepaxml==2.7.*",
|
||||||
"stripe==7.9.*",
|
"stripe==7.9.*",
|
||||||
"text-unidecode==1.*",
|
"text-unidecode==1.*",
|
||||||
"tlds>=2026041800",
|
"tlds>=2026072401",
|
||||||
"tqdm==4.*",
|
"tqdm==4.*",
|
||||||
"ua-parser==1.0.*",
|
"ua-parser==1.0.*",
|
||||||
"vobject==0.9.*",
|
"vobject==0.9.*",
|
||||||
@@ -112,7 +112,7 @@ dev = [
|
|||||||
"aiohttp==3.14.*",
|
"aiohttp==3.14.*",
|
||||||
"coverage",
|
"coverage",
|
||||||
"coveralls",
|
"coveralls",
|
||||||
"fakeredis==2.36.*",
|
"fakeredis==2.37.*",
|
||||||
"flake8==7.3.*",
|
"flake8==7.3.*",
|
||||||
"freezegun",
|
"freezegun",
|
||||||
"isort==8.0.*",
|
"isort==8.0.*",
|
||||||
|
|||||||
@@ -19,4 +19,4 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
__version__ = "2026.7.0.dev0"
|
__version__ = "2026.8.0.dev0"
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import logging
|
import logging
|
||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
@@ -52,10 +51,18 @@ class BaseSecurityProfile:
|
|||||||
"""
|
"""
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def priority(self) -> int:
|
||||||
|
"""
|
||||||
|
Priority for ordering, higher will come first.
|
||||||
|
"""
|
||||||
|
return 100
|
||||||
|
|
||||||
|
|
||||||
class FullAccessSecurityProfile(BaseSecurityProfile):
|
class FullAccessSecurityProfile(BaseSecurityProfile):
|
||||||
identifier = 'full'
|
identifier = 'full'
|
||||||
verbose_name = _('Full device access (reading and changing orders and gift cards, reading of products and settings)')
|
verbose_name = _('Full device access (reading and changing orders and gift cards, reading of products and settings)')
|
||||||
|
priority = 1000
|
||||||
|
|
||||||
def is_allowed(self, request):
|
def is_allowed(self, request):
|
||||||
return True
|
return True
|
||||||
@@ -108,6 +115,7 @@ class PretixScanSecurityProfile(AllowListSecurityProfile):
|
|||||||
('GET', 'api-v1:event.settings'),
|
('GET', 'api-v1:event.settings'),
|
||||||
('POST', 'api-v1:upload'),
|
('POST', 'api-v1:upload'),
|
||||||
('POST', 'api-v1:checkinrpc.redeem'),
|
('POST', 'api-v1:checkinrpc.redeem'),
|
||||||
|
('POST', 'api-v1:checkinrpc.annull'),
|
||||||
('GET', 'api-v1:checkinrpc.search'),
|
('GET', 'api-v1:checkinrpc.search'),
|
||||||
('GET', 'api-v1:reusablemedium-list'),
|
('GET', 'api-v1:reusablemedium-list'),
|
||||||
('POST', 'api-v1:reusablemedium-lookup'),
|
('POST', 'api-v1:reusablemedium-lookup'),
|
||||||
@@ -146,6 +154,7 @@ class PretixScanNoSyncNoSearchSecurityProfile(AllowListSecurityProfile):
|
|||||||
('GET', 'api-v1:event.settings'),
|
('GET', 'api-v1:event.settings'),
|
||||||
('POST', 'api-v1:upload'),
|
('POST', 'api-v1:upload'),
|
||||||
('POST', 'api-v1:checkinrpc.redeem'),
|
('POST', 'api-v1:checkinrpc.redeem'),
|
||||||
|
('POST', 'api-v1:checkinrpc.annull'),
|
||||||
('GET', 'api-v1:checkinrpc.search'),
|
('GET', 'api-v1:checkinrpc.search'),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -182,6 +191,7 @@ class PretixScanNoSyncSecurityProfile(AllowListSecurityProfile):
|
|||||||
('GET', 'api-v1:event.settings'),
|
('GET', 'api-v1:event.settings'),
|
||||||
('POST', 'api-v1:upload'),
|
('POST', 'api-v1:upload'),
|
||||||
('POST', 'api-v1:checkinrpc.redeem'),
|
('POST', 'api-v1:checkinrpc.redeem'),
|
||||||
|
('POST', 'api-v1:checkinrpc.annull'),
|
||||||
('GET', 'api-v1:checkinrpc.search'),
|
('GET', 'api-v1:checkinrpc.search'),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -192,13 +202,15 @@ def get_all_security_profiles():
|
|||||||
if _ALL_PROFILES:
|
if _ALL_PROFILES:
|
||||||
return _ALL_PROFILES
|
return _ALL_PROFILES
|
||||||
|
|
||||||
types = OrderedDict()
|
types = []
|
||||||
for recv, ret in register_device_security_profile.send(None):
|
for recv, ret in register_device_security_profile.send(None):
|
||||||
if isinstance(ret, (list, tuple)):
|
if isinstance(ret, (list, tuple)):
|
||||||
for r in ret:
|
for r in ret:
|
||||||
types[r.identifier] = r
|
types.append(r)
|
||||||
else:
|
else:
|
||||||
types[ret.identifier] = ret
|
types.append(ret)
|
||||||
|
types.sort(key=lambda el: el.priority, reverse=True)
|
||||||
|
types = {r.identifier: r for r in types}
|
||||||
_ALL_PROFILES = types
|
_ALL_PROFILES = types
|
||||||
return types
|
return types
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import json
|
import json
|
||||||
|
import re
|
||||||
|
|
||||||
from django.db.models import prefetch_related_objects
|
from django.db.models import prefetch_related_objects
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
@@ -135,3 +136,30 @@ class SalesChannelMigrationMixin:
|
|||||||
else:
|
else:
|
||||||
value["sales_channels"] = value["limit_sales_channels"]
|
value["sales_channels"] = value["limit_sales_channels"]
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
class CompatDecimalField(serializers.DecimalField):
|
||||||
|
"""
|
||||||
|
Historically, pretix recorded tax rates as decimals with two places. Today, pretix supports tax rates with up to
|
||||||
|
four places. Since our API outputs decimals with the stored precision, this would have changed the API output from
|
||||||
|
"19.00" to "19.0000" without warning. While this is semantically the same thing, we need to assume some pretix API
|
||||||
|
users might run into trouble, either because they treat the value as a string and then map something
|
||||||
|
(e.g. ``if tax_rate == "19.00"``) or process it with a language where this is a significant difference. For example,
|
||||||
|
while in Python ``Decimal("19.00") == Decimal("19.0000")`` is true, in Java
|
||||||
|
``(new BigDecimal("19.00")).equals(new BigDecimal("19.0000"))`` is false and only
|
||||||
|
``(new BigDecimal("19.00")).compareTo(new BigDecimal("19.0000")) == 0`` is true.
|
||||||
|
|
||||||
|
Therefore, we stay backwards compatible by outputting two decimal places *as long as the trailing digits are zero-valued.
|
||||||
|
"""
|
||||||
|
|
||||||
|
regex = re.compile(r"^([0-9]+\.[0-9]{2})0+$")
|
||||||
|
|
||||||
|
def to_representation(self, value):
|
||||||
|
if self.localize:
|
||||||
|
raise ValueError("localization not supported")
|
||||||
|
value = super().to_representation(value)
|
||||||
|
if value and "." not in value:
|
||||||
|
return f"{value}.00"
|
||||||
|
if m := self.regex.match(value):
|
||||||
|
return m.group(1)
|
||||||
|
return value
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ from rest_framework.fields import ChoiceField, Field
|
|||||||
from rest_framework.relations import SlugRelatedField
|
from rest_framework.relations import SlugRelatedField
|
||||||
|
|
||||||
from pretix.api.serializers import (
|
from pretix.api.serializers import (
|
||||||
CompatibleJSONField, SalesChannelMigrationMixin,
|
CompatDecimalField, CompatibleJSONField, SalesChannelMigrationMixin,
|
||||||
)
|
)
|
||||||
from pretix.api.serializers.fields import PluginsField
|
from pretix.api.serializers.fields import PluginsField
|
||||||
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
||||||
@@ -681,6 +681,7 @@ class TaxRuleSerializer(CountryFieldMixin, I18nAwareModelSerializer):
|
|||||||
required=False,
|
required=False,
|
||||||
allow_null=True,
|
allow_null=True,
|
||||||
)
|
)
|
||||||
|
rate = CompatDecimalField(max_digits=7, decimal_places=4)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TaxRule
|
model = TaxRule
|
||||||
|
|||||||
@@ -42,7 +42,9 @@ from django.utils.functional import cached_property, lazy
|
|||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from pretix.api.serializers import SalesChannelMigrationMixin
|
from pretix.api.serializers import (
|
||||||
|
CompatDecimalField, SalesChannelMigrationMixin,
|
||||||
|
)
|
||||||
from pretix.api.serializers.event import MetaDataField
|
from pretix.api.serializers.event import MetaDataField
|
||||||
from pretix.api.serializers.fields import UploadedFileField
|
from pretix.api.serializers.fields import UploadedFileField
|
||||||
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
||||||
@@ -276,10 +278,10 @@ class ItemAddOnSerializer(serializers.ModelSerializer):
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
class ItemTaxRateField(serializers.Field):
|
class ItemTaxRateField(CompatDecimalField):
|
||||||
def to_representation(self, i):
|
def to_representation(self, i):
|
||||||
if i.tax_rule:
|
if i.tax_rule:
|
||||||
return str(Decimal(i.tax_rule.rate))
|
return super().to_representation(Decimal(i.tax_rule.rate))
|
||||||
else:
|
else:
|
||||||
return str(Decimal('0.00'))
|
return str(Decimal('0.00'))
|
||||||
|
|
||||||
@@ -289,7 +291,7 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
|||||||
bundles = InlineItemBundleSerializer(many=True, required=False)
|
bundles = InlineItemBundleSerializer(many=True, required=False)
|
||||||
variations = InlineItemVariationSerializer(many=True, required=False)
|
variations = InlineItemVariationSerializer(many=True, required=False)
|
||||||
program_times = InlineItemProgramTimeSerializer(many=True, required=False)
|
program_times = InlineItemProgramTimeSerializer(many=True, required=False)
|
||||||
tax_rate = ItemTaxRateField(source='*', read_only=True)
|
tax_rate = ItemTaxRateField(source='*', read_only=True, max_digits=7, decimal_places=4)
|
||||||
meta_data = MetaDataField(required=False, source='*')
|
meta_data = MetaDataField(required=False, source='*')
|
||||||
picture = UploadedFileField(required=False, allow_null=True, allowed_types=(
|
picture = UploadedFileField(required=False, allow_null=True, allowed_types=(
|
||||||
'image/png', 'image/jpeg', 'image/gif'
|
'image/png', 'image/jpeg', 'image/gif'
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ from rest_framework.exceptions import ValidationError
|
|||||||
from rest_framework.relations import SlugRelatedField
|
from rest_framework.relations import SlugRelatedField
|
||||||
from rest_framework.reverse import reverse
|
from rest_framework.reverse import reverse
|
||||||
|
|
||||||
from pretix.api.serializers import CompatibleJSONField
|
from pretix.api.serializers import CompatDecimalField, CompatibleJSONField
|
||||||
from pretix.api.serializers.event import SubEventSerializer
|
from pretix.api.serializers.event import SubEventSerializer
|
||||||
from pretix.api.serializers.forms import form_field_to_serializer_field
|
from pretix.api.serializers.forms import form_field_to_serializer_field
|
||||||
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
||||||
@@ -52,6 +52,7 @@ from pretix.api.signals import order_api_details, orderposition_api_details
|
|||||||
from pretix.base.decimal import round_decimal
|
from pretix.base.decimal import round_decimal
|
||||||
from pretix.base.i18n import language
|
from pretix.base.i18n import language
|
||||||
from pretix.base.invoicing.transmission import get_transmission_types
|
from pretix.base.invoicing.transmission import get_transmission_types
|
||||||
|
from pretix.base.media import MEDIA_TYPES
|
||||||
from pretix.base.models import (
|
from pretix.base.models import (
|
||||||
CachedFile, Checkin, Customer, Device, GiftCard, Invoice, InvoiceAddress,
|
CachedFile, Checkin, Customer, Device, GiftCard, Invoice, InvoiceAddress,
|
||||||
InvoiceLine, Item, ItemVariation, Order, OrderPosition, Question,
|
InvoiceLine, Item, ItemVariation, Order, OrderPosition, Question,
|
||||||
@@ -381,6 +382,7 @@ class PrintLogSerializer(serializers.ModelSerializer):
|
|||||||
class FailedCheckinSerializer(I18nAwareModelSerializer):
|
class FailedCheckinSerializer(I18nAwareModelSerializer):
|
||||||
error_reason = serializers.ChoiceField(choices=Checkin.REASONS, required=True, allow_null=False)
|
error_reason = serializers.ChoiceField(choices=Checkin.REASONS, required=True, allow_null=False)
|
||||||
raw_barcode = serializers.CharField(required=True, allow_null=False)
|
raw_barcode = serializers.CharField(required=True, allow_null=False)
|
||||||
|
raw_source_type = serializers.ChoiceField(choices=[(k, v) for k, v in MEDIA_TYPES.items()], default='barcode')
|
||||||
position = serializers.PrimaryKeyRelatedField(queryset=OrderPosition.all.none(), required=False, allow_null=True)
|
position = serializers.PrimaryKeyRelatedField(queryset=OrderPosition.all.none(), required=False, allow_null=True)
|
||||||
raw_item = serializers.PrimaryKeyRelatedField(queryset=Item.objects.none(), required=False, allow_null=True)
|
raw_item = serializers.PrimaryKeyRelatedField(queryset=Item.objects.none(), required=False, allow_null=True)
|
||||||
raw_variation = serializers.PrimaryKeyRelatedField(queryset=ItemVariation.objects.none(), required=False, allow_null=True)
|
raw_variation = serializers.PrimaryKeyRelatedField(queryset=ItemVariation.objects.none(), required=False, allow_null=True)
|
||||||
@@ -390,7 +392,7 @@ class FailedCheckinSerializer(I18nAwareModelSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = Checkin
|
model = Checkin
|
||||||
fields = ('error_reason', 'error_explanation', 'raw_barcode', 'raw_item', 'raw_variation',
|
fields = ('error_reason', 'error_explanation', 'raw_barcode', 'raw_item', 'raw_variation',
|
||||||
'raw_subevent', 'nonce', 'datetime', 'type', 'position')
|
'raw_subevent', 'raw_source_type', 'nonce', 'datetime', 'type', 'position')
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -591,6 +593,7 @@ class OrderPositionSerializer(I18nAwareModelSerializer):
|
|||||||
country = CompatibleCountryField(source='*')
|
country = CompatibleCountryField(source='*')
|
||||||
attendee_name = serializers.CharField(required=False)
|
attendee_name = serializers.CharField(required=False)
|
||||||
plugin_data = OrderPositionPluginDataField(source='*', allow_null=True, read_only=True)
|
plugin_data = OrderPositionPluginDataField(source='*', allow_null=True, read_only=True)
|
||||||
|
tax_rate = CompatDecimalField(max_digits=7, decimal_places=4)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
list_serializer_class = OrderPositionListSerializer
|
list_serializer_class = OrderPositionListSerializer
|
||||||
@@ -747,6 +750,8 @@ class OrderPaymentDateField(serializers.DateField):
|
|||||||
|
|
||||||
|
|
||||||
class OrderFeeSerializer(I18nAwareModelSerializer):
|
class OrderFeeSerializer(I18nAwareModelSerializer):
|
||||||
|
tax_rate = CompatDecimalField(max_digits=7, decimal_places=4)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = OrderFee
|
model = OrderFee
|
||||||
fields = ('id', 'fee_type', 'value', 'description', 'internal_type', 'tax_rate', 'tax_value', 'tax_rule',
|
fields = ('id', 'fee_type', 'value', 'description', 'internal_type', 'tax_rate', 'tax_value', 'tax_rule',
|
||||||
@@ -1911,6 +1916,7 @@ class InlineInvoiceLineSerializer(I18nAwareModelSerializer):
|
|||||||
position = LinePositionField(read_only=True)
|
position = LinePositionField(read_only=True)
|
||||||
event_date_from = serializers.DateTimeField(read_only=True, source="period_start")
|
event_date_from = serializers.DateTimeField(read_only=True, source="period_start")
|
||||||
event_date_to = serializers.DateTimeField(read_only=True, source="period_end")
|
event_date_to = serializers.DateTimeField(read_only=True, source="period_end")
|
||||||
|
tax_rate = CompatDecimalField(max_digits=7, decimal_places=4)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = InvoiceLine
|
model = InvoiceLine
|
||||||
@@ -1994,6 +2000,7 @@ class BlockedTicketSecretSerializer(I18nAwareModelSerializer):
|
|||||||
|
|
||||||
class TransactionSerializer(I18nAwareModelSerializer):
|
class TransactionSerializer(I18nAwareModelSerializer):
|
||||||
order = serializers.SlugRelatedField(slug_field="code", read_only=True)
|
order = serializers.SlugRelatedField(slug_field="code", read_only=True)
|
||||||
|
tax_rate = CompatDecimalField(max_digits=7, decimal_places=4)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Transaction
|
model = Transaction
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ from rest_framework.exceptions import (
|
|||||||
NotFound, PermissionDenied, ValidationError,
|
NotFound, PermissionDenied, ValidationError,
|
||||||
)
|
)
|
||||||
from rest_framework.generics import get_object_or_404
|
from rest_framework.generics import get_object_or_404
|
||||||
|
from rest_framework.mixins import UpdateModelMixin
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from pretix.api.auth.permission import EventCRUDPermission
|
from pretix.api.auth.permission import EventCRUDPermission
|
||||||
@@ -711,7 +712,7 @@ class SeatFilter(FilterSet):
|
|||||||
fields = ('zone_name', 'row_name', 'row_label', 'seat_number', 'seat_label', 'seat_guid', 'blocked',)
|
fields = ('zone_name', 'row_name', 'row_label', 'seat_number', 'seat_label', 'seat_guid', 'blocked',)
|
||||||
|
|
||||||
|
|
||||||
class SeatViewSet(ConditionalListView, viewsets.ModelViewSet):
|
class SeatViewSet(ConditionalListView, UpdateModelMixin, viewsets.ReadOnlyModelViewSet):
|
||||||
serializer_class = SeatSerializer
|
serializer_class = SeatSerializer
|
||||||
queryset = Seat.objects.none()
|
queryset = Seat.objects.none()
|
||||||
write_permission = 'event.settings.general:write'
|
write_permission = 'event.settings.general:write'
|
||||||
|
|||||||
@@ -1658,6 +1658,7 @@ class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
|
|||||||
count_waitinglist=False,
|
count_waitinglist=False,
|
||||||
force=request.data.get('force', False),
|
force=request.data.get('force', False),
|
||||||
send_mail=send_mail,
|
send_mail=send_mail,
|
||||||
|
ignore_date=request.data.get('force', False),
|
||||||
)
|
)
|
||||||
except Quota.QuotaExceededException:
|
except Quota.QuotaExceededException:
|
||||||
pass
|
pass
|
||||||
@@ -1693,7 +1694,8 @@ class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
|
|||||||
auth=self.request.auth,
|
auth=self.request.auth,
|
||||||
count_waitinglist=False,
|
count_waitinglist=False,
|
||||||
send_mail=send_mail,
|
send_mail=send_mail,
|
||||||
force=force)
|
force=force,
|
||||||
|
ignore_date=force)
|
||||||
except Quota.QuotaExceededException as e:
|
except Quota.QuotaExceededException as e:
|
||||||
return Response({'detail': str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({'detail': str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
except PaymentException as e:
|
except PaymentException as e:
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import sys
|
|||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
from django.utils.html import escape, format_html
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.utils.translation import gettext
|
from django.utils.translation import gettext
|
||||||
|
|
||||||
@@ -35,21 +36,23 @@ def get_powered_by(request, safelink=True):
|
|||||||
d = gs.settings.license_check_input
|
d = gs.settings.license_check_input
|
||||||
if d.get('poweredby_name'):
|
if d.get('poweredby_name'):
|
||||||
if d.get('poweredby_url'):
|
if d.get('poweredby_url'):
|
||||||
msg = gettext('<a {a_name_attr}>powered by {name}</a> <a {a_attr}>based on pretix</a>').format(
|
msg = format_html(
|
||||||
|
gettext('<a {a_name_attr}>powered by {name}</a> <a {a_attr}>based on pretix</a>'),
|
||||||
name=d['poweredby_name'],
|
name=d['poweredby_name'],
|
||||||
a_name_attr='href="{}" target="_blank" rel="noopener"'.format(
|
a_name_attr=mark_safe('href="{}" target="_blank" rel="noopener"'.format(
|
||||||
sl(d['poweredby_url']) if safelink else d['poweredby_url'],
|
escape(sl(d['poweredby_url'])) if safelink else escape(d['poweredby_url']),
|
||||||
),
|
)),
|
||||||
a_attr='href="{}" target="_blank" rel="noopener"'.format(
|
a_attr=mark_safe('href="{}" target="_blank" rel="noopener"'.format(
|
||||||
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
|
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
|
||||||
)
|
))
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
msg = gettext('<a {a_attr}>powered by {name} based on pretix</a>').format(
|
msg = format_html(
|
||||||
|
gettext('<a {a_attr}>powered by {name} based on pretix</a>'),
|
||||||
name=d['poweredby_name'],
|
name=d['poweredby_name'],
|
||||||
a_attr='href="{}" target="_blank" rel="noopener"'.format(
|
a_attr=mark_safe('href="{}" target="_blank" rel="noopener"'.format(
|
||||||
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
|
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
|
||||||
)
|
))
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
msg = gettext('<a %(a_attr)s>ticketing powered by pretix</a>') % {
|
msg = gettext('<a %(a_attr)s>ticketing powered by pretix</a>') % {
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import ipaddress
|
|
||||||
import logging
|
import logging
|
||||||
import smtplib
|
import smtplib
|
||||||
import socket
|
import socket
|
||||||
@@ -43,6 +42,7 @@ from pretix.base.templatetags.rich_text import (
|
|||||||
markdown_compile_email, truelink_callback,
|
markdown_compile_email, truelink_callback,
|
||||||
)
|
)
|
||||||
from pretix.helpers.format import FormattedString, SafeFormatter, format_map
|
from pretix.helpers.format import FormattedString, SafeFormatter, format_map
|
||||||
|
from pretix.helpers.ssrf import should_block_access
|
||||||
|
|
||||||
from pretix.base.services.placeholders import ( # noqa
|
from pretix.base.services.placeholders import ( # noqa
|
||||||
get_available_placeholders, PlaceholderContext
|
get_available_placeholders, PlaceholderContext
|
||||||
@@ -57,8 +57,6 @@ logger = logging.getLogger('pretix.base.email')
|
|||||||
|
|
||||||
T = TypeVar("T", bound=EmailBackend)
|
T = TypeVar("T", bound=EmailBackend)
|
||||||
|
|
||||||
_cgnat_net = ipaddress.ip_network('100.64.0.0/10')
|
|
||||||
|
|
||||||
|
|
||||||
def test_custom_smtp_backend(backend: T, from_addr: str) -> None:
|
def test_custom_smtp_backend(backend: T, from_addr: str) -> None:
|
||||||
try:
|
try:
|
||||||
@@ -254,16 +252,9 @@ def create_connection(address, timeout=socket.getdefaulttimeout(),
|
|||||||
af, socktype, proto, canonname, sa = res
|
af, socktype, proto, canonname, sa = res
|
||||||
|
|
||||||
if not getattr(settings, "MAIL_CUSTOM_SMTP_ALLOW_PRIVATE_NETWORKS", False):
|
if not getattr(settings, "MAIL_CUSTOM_SMTP_ALLOW_PRIVATE_NETWORKS", False):
|
||||||
ip_addr = ipaddress.ip_address(sa[0])
|
is_private, msg = should_block_access(sa)
|
||||||
check_ip4 = ip_addr.ipv4_mapped if getattr(ip_addr, "ipv4_mapped", None) else ip_addr
|
if is_private:
|
||||||
if ip_addr.is_multicast:
|
raise socket.error(msg)
|
||||||
raise socket.error(f"Request to multicast address {sa[0]} blocked")
|
|
||||||
if ip_addr.is_loopback or ip_addr.is_link_local:
|
|
||||||
raise socket.error(f"Request to local address {sa[0]} blocked")
|
|
||||||
if ip_addr.is_private:
|
|
||||||
raise socket.error(f"Request to private address {sa[0]} blocked")
|
|
||||||
if check_ip4 in _cgnat_net:
|
|
||||||
raise socket.error(f"Request to RFC 6598 address {sa[0]} blocked")
|
|
||||||
|
|
||||||
sock = None
|
sock = None
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -40,11 +40,12 @@ from django.utils.translation import gettext as _, gettext_lazy, pgettext_lazy
|
|||||||
|
|
||||||
from pretix.base.settings import PERSON_NAME_SCHEMES
|
from pretix.base.settings import PERSON_NAME_SCHEMES
|
||||||
|
|
||||||
from ..exporter import ListExporter, OrganizerLevelExportMixin
|
from ..exporter import MultiSheetListExporter, OrganizerLevelExportMixin
|
||||||
|
from ..models import Membership
|
||||||
from ..signals import register_multievent_data_exporters
|
from ..signals import register_multievent_data_exporters
|
||||||
|
|
||||||
|
|
||||||
class CustomerListExporter(OrganizerLevelExportMixin, ListExporter):
|
class CustomerListExporter(OrganizerLevelExportMixin, MultiSheetListExporter):
|
||||||
identifier = 'customerlist'
|
identifier = 'customerlist'
|
||||||
verbose_name = gettext_lazy('Customer accounts')
|
verbose_name = gettext_lazy('Customer accounts')
|
||||||
category = pgettext_lazy('export_category', 'Customer accounts')
|
category = pgettext_lazy('export_category', 'Customer accounts')
|
||||||
@@ -54,13 +55,20 @@ class CustomerListExporter(OrganizerLevelExportMixin, ListExporter):
|
|||||||
def get_required_organizer_permission(cls) -> str:
|
def get_required_organizer_permission(cls) -> str:
|
||||||
return 'organizer.customers:write'
|
return 'organizer.customers:write'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def sheets(self):
|
||||||
|
return (
|
||||||
|
('customers', _('Customers')),
|
||||||
|
('memberships', _('Memberships')),
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def additional_form_fields(self):
|
def additional_form_fields(self):
|
||||||
return OrderedDict(
|
return OrderedDict(
|
||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
|
|
||||||
def iterate_list(self, form_data):
|
def iterate_customers(self, form_data):
|
||||||
qs = self.organizer.customers.prefetch_related('provider')
|
qs = self.organizer.customers.prefetch_related('provider')
|
||||||
|
|
||||||
headers = [
|
headers = [
|
||||||
@@ -109,6 +117,52 @@ class CustomerListExporter(OrganizerLevelExportMixin, ListExporter):
|
|||||||
]
|
]
|
||||||
yield row
|
yield row
|
||||||
|
|
||||||
|
def iterate_memberships(self, form_data):
|
||||||
|
qs = Membership.objects.filter(
|
||||||
|
customer__organizer=self.organizer
|
||||||
|
).prefetch_related('membership_type').select_related('customer', 'granted_in', 'granted_in__order')
|
||||||
|
|
||||||
|
headers = [
|
||||||
|
_('Customer ID'),
|
||||||
|
_('External identifier'),
|
||||||
|
_('Email'),
|
||||||
|
_('Test mode'),
|
||||||
|
_('Canceled'),
|
||||||
|
_('Membership type'),
|
||||||
|
_('Purchase ticket'),
|
||||||
|
_('Start date'),
|
||||||
|
_('Start time'),
|
||||||
|
_('End date'),
|
||||||
|
_('End time'),
|
||||||
|
_('Name'),
|
||||||
|
]
|
||||||
|
name_scheme = PERSON_NAME_SCHEMES[self.organizer.settings.name_scheme]
|
||||||
|
if name_scheme and len(name_scheme['fields']) > 1:
|
||||||
|
for k, label, w in name_scheme['fields']:
|
||||||
|
headers.append(_('Name') + ': ' + str(label))
|
||||||
|
yield headers
|
||||||
|
|
||||||
|
tz = get_current_timezone()
|
||||||
|
for obj in qs:
|
||||||
|
row = [
|
||||||
|
obj.customer.identifier,
|
||||||
|
obj.customer.external_identifier,
|
||||||
|
obj.customer.email or '',
|
||||||
|
_('Yes') if obj.testmode else _('No'),
|
||||||
|
_('Yes') if obj.canceled else _('No'),
|
||||||
|
str(obj.membership_type.name),
|
||||||
|
f'{obj.granted_in.order.code}-{obj.granted_in.positionid}' if obj.granted_in else None,
|
||||||
|
obj.date_start.astimezone(tz).strftime('%Y-%m-%d'),
|
||||||
|
obj.date_start.astimezone(tz).strftime('%H:%M'),
|
||||||
|
obj.date_end.astimezone(tz).strftime('%Y-%m-%d'),
|
||||||
|
obj.date_end.astimezone(tz).strftime('%H:%M'),
|
||||||
|
obj.attendee_name or '',
|
||||||
|
]
|
||||||
|
if name_scheme and len(name_scheme['fields']) > 1:
|
||||||
|
for k, label, w in name_scheme['fields']:
|
||||||
|
row.append(obj.attendee_name_parts.get(k, ''))
|
||||||
|
yield row
|
||||||
|
|
||||||
def get_filename(self):
|
def get_filename(self):
|
||||||
return '{}_customers'.format(self.organizer.slug)
|
return '{}_customers'.format(self.organizer.slug)
|
||||||
|
|
||||||
|
|||||||
@@ -33,8 +33,6 @@
|
|||||||
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
# License for the specific language governing permissions and limitations under the License.
|
# License for the specific language governing permissions and limitations under the License.
|
||||||
|
|
||||||
import hashlib
|
|
||||||
import ipaddress
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
@@ -42,13 +40,12 @@ from django.conf import settings
|
|||||||
from django.contrib.auth.password_validation import (
|
from django.contrib.auth.password_validation import (
|
||||||
password_validators_help_texts, validate_password,
|
password_validators_help_texts, validate_password,
|
||||||
)
|
)
|
||||||
from django.utils.functional import cached_property
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from pretix.base.metrics import pretix_failed_logins
|
from pretix.base.metrics import pretix_failed_logins
|
||||||
from pretix.base.models import User
|
from pretix.base.models import User
|
||||||
from pretix.helpers.dicts import move_to_end
|
from pretix.helpers.dicts import move_to_end
|
||||||
from pretix.helpers.http import get_client_ip
|
from pretix.helpers.ratelimit import rate_limit
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -85,40 +82,20 @@ class LoginForm(forms.Form):
|
|||||||
else:
|
else:
|
||||||
move_to_end(self.fields, 'keep_logged_in')
|
move_to_end(self.fields, 'keep_logged_in')
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def ratelimit_key(self):
|
|
||||||
if not settings.HAS_REDIS:
|
|
||||||
return None
|
|
||||||
client_ip = get_client_ip(self.request)
|
|
||||||
if not client_ip:
|
|
||||||
return None
|
|
||||||
try:
|
|
||||||
client_ip = ipaddress.ip_address(client_ip)
|
|
||||||
except ValueError:
|
|
||||||
# Web server not set up correctly
|
|
||||||
return None
|
|
||||||
if client_ip.is_private:
|
|
||||||
# This is the private IP of the server, web server not set up correctly
|
|
||||||
return None
|
|
||||||
return 'pretix_login_{}'.format(hashlib.sha1(str(client_ip).encode()).hexdigest())
|
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
if all(k in self.cleaned_data for k, f in self.fields.items() if f.required):
|
if all(k in self.cleaned_data for k, f in self.fields.items() if f.required):
|
||||||
if self.ratelimit_key:
|
rate_limit_kwargs = dict(include_ip_from_request=self.request, max_num=10, expire_time=300)
|
||||||
from django_redis import get_redis_connection
|
if rate_limit("login", **rate_limit_kwargs, increase=False):
|
||||||
rc = get_redis_connection("redis")
|
# Check rate limit without counting up, we increase below only on failed logins
|
||||||
cnt = rc.get(self.ratelimit_key)
|
pretix_failed_logins.inc(1, reason="ratelimit")
|
||||||
if cnt and int(cnt) > 10:
|
logger.info("Backend login rejected due to rate limit.")
|
||||||
pretix_failed_logins.inc(1, reason="ratelimit")
|
raise forms.ValidationError(self.error_messages['rate_limit'], code='rate_limit')
|
||||||
logger.info("Backend login rejected due to rate limit.")
|
|
||||||
raise forms.ValidationError(self.error_messages['rate_limit'], code='rate_limit')
|
|
||||||
self.user_cache = self.backend.form_authenticate(self.request, self.cleaned_data)
|
self.user_cache = self.backend.form_authenticate(self.request, self.cleaned_data)
|
||||||
if self.user_cache is None:
|
if self.user_cache is None:
|
||||||
if self.ratelimit_key:
|
|
||||||
rc.incr(self.ratelimit_key)
|
|
||||||
rc.expire(self.ratelimit_key, 300)
|
|
||||||
logger.info("Backend login invalid.")
|
logger.info("Backend login invalid.")
|
||||||
pretix_failed_logins.inc(1, reason="invalid")
|
pretix_failed_logins.inc(1, reason="invalid")
|
||||||
|
# Count towards rate limit (result is ignored, we are checking above)
|
||||||
|
rate_limit("login", **rate_limit_kwargs)
|
||||||
raise forms.ValidationError(
|
raise forms.ValidationError(
|
||||||
self.error_messages['invalid_login'],
|
self.error_messages['invalid_login'],
|
||||||
code='invalid_login'
|
code='invalid_login'
|
||||||
|
|||||||
@@ -959,7 +959,7 @@ class BaseQuestionsForm(forms.Form):
|
|||||||
label=label, required=required,
|
label=label, required=required,
|
||||||
help_text=help_text,
|
help_text=help_text,
|
||||||
initial=_initial,
|
initial=_initial,
|
||||||
widget=TimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')),
|
widget=TimePickerWidget(without_seconds=True),
|
||||||
)
|
)
|
||||||
elif q.type == Question.TYPE_DATETIME:
|
elif q.type == Question.TYPE_DATETIME:
|
||||||
if not help_text:
|
if not help_text:
|
||||||
@@ -1116,6 +1116,13 @@ class BaseQuestionsForm(forms.Form):
|
|||||||
if q.dependency_question_id and not question_is_visible(q.dependency_question_id, q.dependency_values) and answer is not None:
|
if q.dependency_question_id and not question_is_visible(q.dependency_question_id, q.dependency_values) and answer is not None:
|
||||||
d['question_%d' % q.pk] = None
|
d['question_%d' % q.pk] = None
|
||||||
|
|
||||||
|
# Strip False answers to required yes/no questions even if all_optional is set, as our data model assumes that
|
||||||
|
# required yes/no questions can only be answered with yes
|
||||||
|
for q in question_cache.values():
|
||||||
|
if q.required and q.type == Question.TYPE_BOOLEAN:
|
||||||
|
if 'question_%d' % q.pk in d and d['question_%d' % q.pk] is False:
|
||||||
|
d['question_%d' % q.pk] = None
|
||||||
|
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
# License for the specific language governing permissions and limitations under the License.
|
# License for the specific language governing permissions and limitations under the License.
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.conf import settings
|
|
||||||
from django.contrib.auth.hashers import check_password
|
from django.contrib.auth.hashers import check_password
|
||||||
from django.contrib.auth.password_validation import (
|
from django.contrib.auth.password_validation import (
|
||||||
password_validators_help_texts, validate_password,
|
password_validators_help_texts, validate_password,
|
||||||
@@ -46,6 +45,7 @@ from pytz import common_timezones
|
|||||||
from pretix.base.models import User
|
from pretix.base.models import User
|
||||||
from pretix.control.forms import SingleLanguageWidget
|
from pretix.control.forms import SingleLanguageWidget
|
||||||
from pretix.helpers.format import format_map
|
from pretix.helpers.format import format_map
|
||||||
|
from pretix.helpers.ratelimit import rate_limit
|
||||||
|
|
||||||
|
|
||||||
class UserSettingsForm(forms.ModelForm):
|
class UserSettingsForm(forms.ModelForm):
|
||||||
@@ -128,16 +128,11 @@ class UserPasswordChangeForm(forms.Form):
|
|||||||
def clean_old_pw(self):
|
def clean_old_pw(self):
|
||||||
old_pw = self.cleaned_data.get('old_pw')
|
old_pw = self.cleaned_data.get('old_pw')
|
||||||
|
|
||||||
if settings.HAS_REDIS:
|
if rate_limit("pwchange", self.user.pk, max_num=10, expire_time=300):
|
||||||
from django_redis import get_redis_connection
|
raise forms.ValidationError(
|
||||||
rc = get_redis_connection("redis")
|
self.error_messages['rate_limit'],
|
||||||
cnt = rc.incr('pretix_pwchange_%s' % self.user.pk)
|
code='rate_limit',
|
||||||
rc.expire('pretix_pwchange_%s' % self.user.pk, 300)
|
)
|
||||||
if cnt > 10:
|
|
||||||
raise forms.ValidationError(
|
|
||||||
self.error_messages['rate_limit'],
|
|
||||||
code='rate_limit',
|
|
||||||
)
|
|
||||||
|
|
||||||
if not check_password(old_pw, self.user.password):
|
if not check_password(old_pw, self.user.password):
|
||||||
raise forms.ValidationError(
|
raise forms.ValidationError(
|
||||||
@@ -175,19 +170,35 @@ class UserEmailChangeForm(forms.Form):
|
|||||||
error_messages = {
|
error_messages = {
|
||||||
'duplicate_identifier': _("There already is an account associated with this email address. "
|
'duplicate_identifier': _("There already is an account associated with this email address. "
|
||||||
"Please choose a different one."),
|
"Please choose a different one."),
|
||||||
|
'rate_limit': _("For security reasons, please wait 5 minutes before you try again."),
|
||||||
}
|
}
|
||||||
old_email = forms.EmailField(label=_('Old email address'), disabled=True)
|
old_email = forms.EmailField(label=_('Old email address'), disabled=True)
|
||||||
new_email = forms.EmailField(label=_('New email address'))
|
new_email = forms.EmailField(label=_('New email address'))
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.user = kwargs.pop('user')
|
self.user = kwargs.pop('user')
|
||||||
|
self.request = kwargs.pop('request')
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
def clean_new_email(self):
|
def clean_new_email(self):
|
||||||
email = self.cleaned_data['new_email']
|
email = self.cleaned_data['new_email']
|
||||||
|
|
||||||
|
if rate_limit("emailchange_attempt", include_ip_from_request=self.request, max_num=5, expire_time=300):
|
||||||
|
# Rate limit lookup for conflicting email addresses to make enumeration harder
|
||||||
|
raise forms.ValidationError(
|
||||||
|
self.error_messages['rate_limit'],
|
||||||
|
code='rate_limit',
|
||||||
|
)
|
||||||
|
|
||||||
if User.objects.filter(Q(email__iexact=email) & ~Q(pk=self.user.pk)).exists():
|
if User.objects.filter(Q(email__iexact=email) & ~Q(pk=self.user.pk)).exists():
|
||||||
raise forms.ValidationError(
|
raise forms.ValidationError(
|
||||||
self.error_messages['duplicate_identifier'],
|
self.error_messages['duplicate_identifier'],
|
||||||
code='duplicate_identifier',
|
code='duplicate_identifier',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if rate_limit("emailchange", self.user.pk, max_num=2, expire_time=300):
|
||||||
|
raise forms.ValidationError(
|
||||||
|
self.error_messages['rate_limit'],
|
||||||
|
code='rate_limit',
|
||||||
|
)
|
||||||
return email
|
return email
|
||||||
|
|||||||
@@ -43,6 +43,10 @@ from django.utils.timezone import get_current_timezone, now
|
|||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from pretix.helpers.format import PlainHtmlAlternativeString
|
from pretix.helpers.format import PlainHtmlAlternativeString
|
||||||
|
from pretix.helpers.i18n import (
|
||||||
|
get_format_without_seconds, get_javascript_format,
|
||||||
|
get_javascript_format_without_seconds,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def replace_arabic_numbers(inp):
|
def replace_arabic_numbers(inp):
|
||||||
@@ -108,7 +112,7 @@ class DatePickerWidget(forms.DateInput):
|
|||||||
|
|
||||||
|
|
||||||
class TimePickerWidget(forms.TimeInput):
|
class TimePickerWidget(forms.TimeInput):
|
||||||
def __init__(self, attrs=None, time_format=None):
|
def __init__(self, attrs=None, time_format=None, without_seconds=False):
|
||||||
attrs = attrs or {}
|
attrs = attrs or {}
|
||||||
if 'placeholder' in attrs:
|
if 'placeholder' in attrs:
|
||||||
del attrs['placeholder']
|
del attrs['placeholder']
|
||||||
@@ -117,8 +121,27 @@ class TimePickerWidget(forms.TimeInput):
|
|||||||
time_attrs['class'] += ' timepickerfield'
|
time_attrs['class'] += ' timepickerfield'
|
||||||
time_attrs['autocomplete'] = 'off'
|
time_attrs['autocomplete'] = 'off'
|
||||||
|
|
||||||
|
if time_format or without_seconds:
|
||||||
|
# Explicitly set data-format attributes for the JS layer instead of relying on the body-wide config
|
||||||
|
def time_format_attr():
|
||||||
|
if without_seconds:
|
||||||
|
return get_javascript_format_without_seconds(time_format or "TIME_INPUT_FORMATS")
|
||||||
|
return get_javascript_format(time_format or "TIME_INPUT_FORMATS")
|
||||||
|
|
||||||
|
time_attrs['data-format'] = lazy(time_format_attr, str)
|
||||||
|
|
||||||
|
def time_format_attr():
|
||||||
|
if without_seconds:
|
||||||
|
return get_javascript_format_without_seconds(time_format or "TIME_INPUT_FORMATS")
|
||||||
|
return get_javascript_format(time_format or "TIME_INPUT_FORMATS")
|
||||||
|
|
||||||
|
time_attrs['data-format'] = lazy(time_format_attr, str)
|
||||||
|
|
||||||
def placeholder():
|
def placeholder():
|
||||||
tf = time_format or get_format('TIME_INPUT_FORMATS')[0]
|
if without_seconds:
|
||||||
|
tf = time_format or get_format_without_seconds('TIME_INPUT_FORMATS')
|
||||||
|
else:
|
||||||
|
tf = time_format or get_format('TIME_INPUT_FORMATS')[0]
|
||||||
return now().replace(
|
return now().replace(
|
||||||
year=2000, month=1, day=1, hour=0, minute=0, second=0, microsecond=0
|
year=2000, month=1, day=1, hour=0, minute=0, second=0, microsecond=0
|
||||||
).strftime(tf)
|
).strftime(tf)
|
||||||
@@ -182,7 +205,7 @@ class UploadedFileWidget(forms.ClearableFileInput):
|
|||||||
class SplitDateTimePickerWidget(forms.SplitDateTimeWidget):
|
class SplitDateTimePickerWidget(forms.SplitDateTimeWidget):
|
||||||
template_name = 'pretixbase/forms/widgets/splitdatetime.html'
|
template_name = 'pretixbase/forms/widgets/splitdatetime.html'
|
||||||
|
|
||||||
def __init__(self, attrs=None, date_format=None, time_format=None, min_date=None, max_date=None):
|
def __init__(self, attrs=None, date_format=None, time_format=None, min_date=None, max_date=None, without_seconds=False):
|
||||||
attrs = attrs or {}
|
attrs = attrs or {}
|
||||||
if 'placeholder' in attrs:
|
if 'placeholder' in attrs:
|
||||||
del attrs['placeholder']
|
del attrs['placeholder']
|
||||||
@@ -205,14 +228,36 @@ class SplitDateTimePickerWidget(forms.SplitDateTimeWidget):
|
|||||||
max_date if not isinstance(max_date, datetime) else max_date.astimezone(get_current_timezone()).date()
|
max_date if not isinstance(max_date, datetime) else max_date.astimezone(get_current_timezone()).date()
|
||||||
).isoformat()
|
).isoformat()
|
||||||
|
|
||||||
|
if date_format or time_format or without_seconds:
|
||||||
|
# Explicitly set data-format attributes for the JS layer instead of relying on the body-wide config
|
||||||
|
def date_format_attr():
|
||||||
|
if without_seconds:
|
||||||
|
return get_javascript_format_without_seconds(date_format or "DATE_INPUT_FORMATS")
|
||||||
|
return get_javascript_format(date_format or "DATE_INPUT_FORMATS")
|
||||||
|
|
||||||
|
date_attrs['data-format'] = lazy(date_format_attr, str)
|
||||||
|
|
||||||
|
def time_format_attr():
|
||||||
|
if without_seconds:
|
||||||
|
return get_javascript_format_without_seconds(time_format or "TIME_INPUT_FORMATS")
|
||||||
|
return get_javascript_format(time_format or "TIME_INPUT_FORMATS")
|
||||||
|
|
||||||
|
time_attrs['data-format'] = lazy(time_format_attr, str)
|
||||||
|
|
||||||
def date_placeholder():
|
def date_placeholder():
|
||||||
df = date_format or get_format('DATE_INPUT_FORMATS')[0]
|
if without_seconds:
|
||||||
|
df = date_format or get_format_without_seconds('DATE_INPUT_FORMATS')
|
||||||
|
else:
|
||||||
|
df = date_format or get_format('DATE_INPUT_FORMATS')[0]
|
||||||
return now().replace(
|
return now().replace(
|
||||||
year=2000, month=12, day=31, hour=18, minute=0, second=0, microsecond=0
|
year=2000, month=12, day=31, hour=18, minute=0, second=0, microsecond=0
|
||||||
).strftime(df)
|
).strftime(df)
|
||||||
|
|
||||||
def time_placeholder():
|
def time_placeholder():
|
||||||
tf = time_format or get_format('TIME_INPUT_FORMATS')[0]
|
if without_seconds:
|
||||||
|
tf = time_format or get_format_without_seconds('TIME_INPUT_FORMATS')
|
||||||
|
else:
|
||||||
|
tf = time_format or get_format('TIME_INPUT_FORMATS')[0]
|
||||||
return now().replace(
|
return now().replace(
|
||||||
year=2000, month=1, day=1, hour=0, minute=0, second=0, microsecond=0
|
year=2000, month=1, day=1, hour=0, minute=0, second=0, microsecond=0
|
||||||
).strftime(tf)
|
).strftime(tf)
|
||||||
|
|||||||
+122
-17
@@ -19,6 +19,8 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
import base64
|
||||||
|
import hashlib
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
@@ -69,11 +71,44 @@ def get_supported_language(requested_language, allowed_languages, default_langua
|
|||||||
return language
|
return language
|
||||||
|
|
||||||
|
|
||||||
class LocaleMiddleware(MiddlewareMixin):
|
class BaseLocaleMiddleware(MiddlewareMixin):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
This middleware sets the correct locale and timezone
|
This is a reduced LocaleMiddleware that uses only information contained in the WSGI request data
|
||||||
for a request.
|
to figure out the language (cookie and browser settings). We need it to have a consistent language
|
||||||
|
for error pages that are generated from the middleware stack before we know e.g. which user is logged
|
||||||
|
in or which event is selected.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def process_request(self, request: HttpRequest):
|
||||||
|
language = get_language_from_early_request(request)
|
||||||
|
translation.activate(language)
|
||||||
|
set_region(None)
|
||||||
|
request.LANGUAGE_CODE = language
|
||||||
|
timezone.deactivate()
|
||||||
|
|
||||||
|
def process_response(self, request: HttpRequest, response: HttpResponse):
|
||||||
|
language = translation.get_language()
|
||||||
|
patch_vary_headers(response, ('Accept-Language',))
|
||||||
|
if 'Content-Language' not in response:
|
||||||
|
response['Content-Language'] = language
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
class LocaleMiddleware(MiddlewareMixin):
|
||||||
|
"""
|
||||||
|
This is the full LocaleMiddleware that uses all available information to figure out the correct
|
||||||
|
language for the request using all available sources, in this order of priority:
|
||||||
|
|
||||||
|
- Backend: User settings
|
||||||
|
- Language cookie
|
||||||
|
- Frontend: Customer account settings
|
||||||
|
- Browser settings
|
||||||
|
- Frontend: Event/Organizer settings
|
||||||
|
- System default
|
||||||
|
|
||||||
|
It needs to run late in the middleware stack to have all information available for these steps.
|
||||||
|
For some cases, it is even ran a second time since the event is sometimes only figured out after the
|
||||||
|
middleware stack (can happen for plugin views).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def process_request(self, request: HttpRequest):
|
def process_request(self, request: HttpRequest):
|
||||||
@@ -188,6 +223,24 @@ def get_default_language():
|
|||||||
return settings.LANGUAGE_CODE
|
return settings.LANGUAGE_CODE
|
||||||
|
|
||||||
|
|
||||||
|
def get_language_from_early_request(request: HttpRequest) -> str:
|
||||||
|
"""
|
||||||
|
Analyzes the request to find what language the user wants the system to
|
||||||
|
show using only WSGI-available information. Only languages listed in
|
||||||
|
settings.LANGUAGES are taken into account. If the user requests a sublanguage
|
||||||
|
where we have a main language, we send out the main language.
|
||||||
|
"""
|
||||||
|
global _supported
|
||||||
|
if _supported is None:
|
||||||
|
_supported = OrderedDict(settings.LANGUAGES)
|
||||||
|
|
||||||
|
return (
|
||||||
|
get_language_from_cookie(request)
|
||||||
|
or get_language_from_browser(request)
|
||||||
|
or get_default_language()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_language_from_request(request: HttpRequest) -> str:
|
def get_language_from_request(request: HttpRequest) -> str:
|
||||||
"""
|
"""
|
||||||
Analyzes the request to find what language the user wants the system to
|
Analyzes the request to find what language the user wants the system to
|
||||||
@@ -202,7 +255,6 @@ def get_language_from_request(request: HttpRequest) -> str:
|
|||||||
if request.path.startswith(get_script_prefix() + 'control'):
|
if request.path.startswith(get_script_prefix() + 'control'):
|
||||||
return (
|
return (
|
||||||
get_language_from_user_settings(request)
|
get_language_from_user_settings(request)
|
||||||
or get_language_from_customer_settings(request)
|
|
||||||
or get_language_from_cookie(request)
|
or get_language_from_cookie(request)
|
||||||
or get_language_from_browser(request)
|
or get_language_from_browser(request)
|
||||||
or get_language_from_event(request)
|
or get_language_from_event(request)
|
||||||
@@ -262,10 +314,50 @@ def _merge_csp(a, b):
|
|||||||
for k, v in a.items():
|
for k, v in a.items():
|
||||||
if "'unsafe-inline'" in v:
|
if "'unsafe-inline'" in v:
|
||||||
# If we need unsafe-inline, drop any hashes or nonce as they will be ignored otherwise
|
# If we need unsafe-inline, drop any hashes or nonce as they will be ignored otherwise
|
||||||
a[k] = [i for i in v if not i.startswith("'nonce-") and not i.startswith("'sha-")]
|
a[k] = [i for i in v if not i.startswith("'nonce-") and not i.startswith("'sha256-")]
|
||||||
|
|
||||||
|
|
||||||
|
def add_to_response_csp(response, csp_to_merge):
|
||||||
|
if "Content-Security-Policy" in response:
|
||||||
|
csp = _parse_csp(response["Content-Security-Policy"])
|
||||||
|
else:
|
||||||
|
csp = {}
|
||||||
|
|
||||||
|
_merge_csp(csp, csp_to_merge)
|
||||||
|
|
||||||
|
if csp:
|
||||||
|
response["Content-Security-Policy"] = _render_csp(csp)
|
||||||
|
|
||||||
|
|
||||||
|
def add_to_response_csp_via_request(request, csp_to_merge):
|
||||||
|
_merge_csp(request._csp_to_merge, csp_to_merge)
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_csp_hash(data):
|
||||||
|
hash_str = base64.b64encode(hashlib.sha256(data.encode("utf-8")).digest()).decode("ascii")
|
||||||
|
return f"'sha256-{hash_str}'"
|
||||||
|
|
||||||
|
|
||||||
class SecurityMiddleware(MiddlewareMixin):
|
class SecurityMiddleware(MiddlewareMixin):
|
||||||
|
SAFE_TYPES = (
|
||||||
|
# CSP policies are only used for:
|
||||||
|
# - HTML and SVG in top-level contexts
|
||||||
|
# - SVG or JS Workers delivered in embedded contexts
|
||||||
|
# See: https://www.w3.org/TR/CSP2/#which-policy-applies
|
||||||
|
# Therefore, we can save bandwidth on not including our (sometimes huge) policy
|
||||||
|
# on API responses or CSS. We do however include it with other types as a precaution
|
||||||
|
# (whitelist instead of blacklist) and we also do not whitelist JavaScript in
|
||||||
|
# we ever add service workers to not break the protection of this feature:
|
||||||
|
# https://www.w3.org/TR/CSP2/#sandboxing-and-workers
|
||||||
|
'application/json',
|
||||||
|
'text/css',
|
||||||
|
# We used to skip CSP for PDF since it was necessary for inline previews in Safari,
|
||||||
|
# but at the moment it does not seem to be an issue to just send it.
|
||||||
|
)
|
||||||
|
|
||||||
|
def process_request(self, request):
|
||||||
|
request._csp_to_merge = {}
|
||||||
|
|
||||||
def process_response(self, request, resp):
|
def process_response(self, request, resp):
|
||||||
if settings.DEBUG and resp.status_code >= 400:
|
if settings.DEBUG and resp.status_code >= 400:
|
||||||
# Don't use CSP on debug error page as it breaks of Django's fancy error
|
# Don't use CSP on debug error page as it breaks of Django's fancy error
|
||||||
@@ -277,13 +369,22 @@ class SecurityMiddleware(MiddlewareMixin):
|
|||||||
# https://github.com/pretix/pretix/issues/765
|
# https://github.com/pretix/pretix/issues/765
|
||||||
resp['P3P'] = 'CP=\"ALL DSP COR CUR ADM TAI OUR IND COM NAV INT\"'
|
resp['P3P'] = 'CP=\"ALL DSP COR CUR ADM TAI OUR IND COM NAV INT\"'
|
||||||
|
|
||||||
if not getattr(resp, '_csp_ignore', False):
|
if self._needs_csp(request, resp):
|
||||||
resp['Content-Security-Policy'] = _render_csp(self._build_csp(request, resp))
|
resp['Content-Security-Policy'] = _render_csp(self._build_csp(request, resp))
|
||||||
elif 'Content-Security-Policy' in resp:
|
elif 'Content-Security-Policy' in resp:
|
||||||
del resp['Content-Security-Policy']
|
del resp['Content-Security-Policy']
|
||||||
|
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
def _needs_csp(self, request, resp):
|
||||||
|
if "Content-Type" in resp and resp["Content-Type"].split(";")[0] in self.SAFE_TYPES:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if getattr(resp, '_csp_ignore', False):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def _build_csp(self, request, resp):
|
def _build_csp(self, request, resp):
|
||||||
url = resolve(request.path_info)
|
url = resolve(request.path_info)
|
||||||
|
|
||||||
@@ -293,7 +394,7 @@ class SecurityMiddleware(MiddlewareMixin):
|
|||||||
'object-src': ["'none'"],
|
'object-src': ["'none'"],
|
||||||
'frame-src': ['{static}'],
|
'frame-src': ['{static}'],
|
||||||
'style-src': ["{static}", "{media}"],
|
'style-src': ["{static}", "{media}"],
|
||||||
'connect-src': ["{dynamic}", "{media}"],
|
'connect-src': ["{static}", "{dynamic}", "{media}"],
|
||||||
'img-src': ["{static}", "{media}", "data:"],
|
'img-src': ["{static}", "{media}", "data:"],
|
||||||
'font-src': ["{static}"],
|
'font-src': ["{static}"],
|
||||||
'media-src': ["{static}", "data:"],
|
'media-src': ["{static}", "data:"],
|
||||||
@@ -316,13 +417,6 @@ class SecurityMiddleware(MiddlewareMixin):
|
|||||||
h['style-src'] += ["'unsafe-inline'"]
|
h['style-src'] += ["'unsafe-inline'"]
|
||||||
h['connect-src'] += ["http://localhost:5173", "ws://localhost:5173"]
|
h['connect-src'] += ["http://localhost:5173", "ws://localhost:5173"]
|
||||||
|
|
||||||
if hasattr(request, 'csp_nonce'):
|
|
||||||
nonce = f"'nonce-{request.csp_nonce}'"
|
|
||||||
h['script-src'].append(nonce)
|
|
||||||
if not settings.VITE_DEV_MODE:
|
|
||||||
# can't have 'unsafe-inline' and nonce at the same time
|
|
||||||
h['style-src'].append(nonce)
|
|
||||||
|
|
||||||
# Only include pay.google.com for wallet detection purposes on the Payment selection page
|
# Only include pay.google.com for wallet detection purposes on the Payment selection page
|
||||||
if (
|
if (
|
||||||
url.url_name == "event.order.pay.change" or
|
url.url_name == "event.order.pay.change" or
|
||||||
@@ -335,6 +429,9 @@ class SecurityMiddleware(MiddlewareMixin):
|
|||||||
if settings.LOG_CSP:
|
if settings.LOG_CSP:
|
||||||
h['report-uri'] = ["/csp_report/"]
|
h['report-uri'] = ["/csp_report/"]
|
||||||
|
|
||||||
|
if request._csp_to_merge:
|
||||||
|
_merge_csp(h, request._csp_to_merge)
|
||||||
|
|
||||||
if 'Content-Security-Policy' in resp:
|
if 'Content-Security-Policy' in resp:
|
||||||
_merge_csp(h, _parse_csp(resp['Content-Security-Policy']))
|
_merge_csp(h, _parse_csp(resp['Content-Security-Policy']))
|
||||||
|
|
||||||
@@ -400,8 +497,16 @@ class RejectInvalidInputMiddleware(MiddlewareMixin):
|
|||||||
if "\x00" in request.META['QUERY_STRING'] or "%00" in request.META['QUERY_STRING']:
|
if "\x00" in request.META['QUERY_STRING'] or "%00" in request.META['QUERY_STRING']:
|
||||||
raise BadRequest("Invalid characters in input.")
|
raise BadRequest("Invalid characters in input.")
|
||||||
if request.method in ('POST', 'PUT', 'PATCH') and request.content_type == "application/x-www-form-urlencoded":
|
if request.method in ('POST', 'PUT', 'PATCH') and request.content_type == "application/x-www-form-urlencoded":
|
||||||
if any("\x00" in value for key, value_list in request.POST.lists() for value in value_list):
|
try:
|
||||||
raise BadRequest("Invalid characters in input.")
|
post_data = request.POST.lists()
|
||||||
|
except BadRequest:
|
||||||
|
# Reading request.POST wasn't possible, probably an invalid charset. Django will crash once we actually
|
||||||
|
# use request.POST, but if we don't, let's not crash it (required for some weird payment provider
|
||||||
|
# webhooks, e.g. computop).
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if any("\x00" in value for key, value_list in post_data for value in value_list):
|
||||||
|
raise BadRequest("Invalid characters in input.")
|
||||||
|
|
||||||
|
|
||||||
class CustomCommonMiddleware(CommonMiddleware):
|
class CustomCommonMiddleware(CommonMiddleware):
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# Generated by Django 5.2.12 on 2026-04-15 20:10
|
||||||
|
|
||||||
|
from decimal import Decimal
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
import pretix.helpers.models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('pretixbase', '0303_alter_order_organizer_alter_orderposition_organizer'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='cartposition',
|
||||||
|
name='tax_rate',
|
||||||
|
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, default=Decimal('0'), max_digits=7),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='invoiceline',
|
||||||
|
name='tax_rate',
|
||||||
|
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, default=Decimal('0'), max_digits=7),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='orderfee',
|
||||||
|
name='tax_rate',
|
||||||
|
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, max_digits=7),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='orderposition',
|
||||||
|
name='tax_rate',
|
||||||
|
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, max_digits=7),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='transaction',
|
||||||
|
name='tax_rate',
|
||||||
|
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, max_digits=7),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='taxrule',
|
||||||
|
name='rate',
|
||||||
|
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, max_digits=7),
|
||||||
|
),
|
||||||
|
|
||||||
|
]
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
# Generated by Django 5.2.12 on 2026-04-28 11:34
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from django.db import IntegrityError, migrations, transaction
|
||||||
|
from django.db.models import Count, F
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def fix_cross_organizer_eventmetavalues(apps, schema_editor):
|
||||||
|
EventMetaProperty = apps.get_model("pretixbase", "EventMetaProperty")
|
||||||
|
EventMetaValue = apps.get_model("pretixbase", "EventMetaValue")
|
||||||
|
|
||||||
|
cross_org_values = EventMetaValue.objects.filter(
|
||||||
|
event__organizer__pk__ne=F('property__organizer__pk')
|
||||||
|
).order_by('event__organizer__slug', 'event__slug')
|
||||||
|
for emv in cross_org_values:
|
||||||
|
logger.warning("%s", f"Fixing cross-organizer EventMetaValue: {emv.event.organizer.slug}/{emv.event.slug}")
|
||||||
|
logger.warning(" %s", f"{emv.property.name}({emv.property.id}@{emv.property.organizer.slug}) = {repr(emv.value)}")
|
||||||
|
try:
|
||||||
|
emv.property = emv.event.organizer.meta_properties.get(name=emv.property.name)
|
||||||
|
if EventMetaValue.objects.filter(event=emv.event, property=emv.property).exists():
|
||||||
|
correct = EventMetaValue.objects.get(event=emv.event, property=emv.property)
|
||||||
|
if correct.value != emv.value:
|
||||||
|
logger.warning(" %s", f"WARN: conflicting EventMetaValue with property in correct organizer already exists, deleting the cross-organizer one")
|
||||||
|
else:
|
||||||
|
logger.warning(" %s", f"OK: same-value EventMetaValue with property in correct organizer already exists, deleting the cross-organizer one")
|
||||||
|
logger.warning(" %s", f"keeping: {correct.property.name}({correct.property.id}@{correct.property.organizer.slug}) = {repr(correct.value)}")
|
||||||
|
emv.delete()
|
||||||
|
else:
|
||||||
|
logger.warning(" %s", f"OK: found existing EventMetaProperty in {emv.event.organizer.slug}, updating reference")
|
||||||
|
logger.warning(" %s", f"after: {emv.property.name}({emv.property.id}@{emv.property.organizer.slug}) = {repr(emv.value)}")
|
||||||
|
emv.save(update_fields=["property"])
|
||||||
|
except EventMetaProperty.DoesNotExist:
|
||||||
|
meta_prop = emv.property
|
||||||
|
meta_prop.pk = None
|
||||||
|
meta_prop.organizer = emv.event.organizer
|
||||||
|
meta_prop.filter_public = False
|
||||||
|
meta_prop.save(force_insert=True)
|
||||||
|
logger.warning(" %s", f"WARN: found no matching EventMetaProperty, creating")
|
||||||
|
logger.warning(" %s", f"after: {emv.property.name}({emv.property.id}@{emv.property.organizer.slug}) = {repr(emv.value)}")
|
||||||
|
emv.save(update_fields=["property"])
|
||||||
|
|
||||||
|
|
||||||
|
def make_eventmetaproperties_unique(apps, schema_editor):
|
||||||
|
EventMetaProperty = apps.get_model("pretixbase", "EventMetaProperty")
|
||||||
|
EventMetaValue = apps.get_model("pretixbase", "EventMetaValue")
|
||||||
|
|
||||||
|
duplicates = EventMetaProperty.objects.values('organizer', 'organizer__slug', 'name').annotate(count=Count('id')).filter(count__gt=1)
|
||||||
|
for dup in duplicates:
|
||||||
|
logger.warning("%s", f"Fixup duplicate property {dup['organizer__slug']} {dup['name']}")
|
||||||
|
props = list(EventMetaProperty.objects.filter(organizer=dup['organizer'], name=dup['name']))
|
||||||
|
|
||||||
|
target = props[0]
|
||||||
|
invalid = props[1:]
|
||||||
|
|
||||||
|
try:
|
||||||
|
with transaction.atomic():
|
||||||
|
affected = EventMetaValue.objects.filter(
|
||||||
|
event__organizer=dup['organizer'], property__in=invalid
|
||||||
|
).update(
|
||||||
|
property=target
|
||||||
|
)
|
||||||
|
logger.warning("%s", f" Switching {affected} value(s) over to {target.name}({target.id}@{target.organizer.slug})")
|
||||||
|
|
||||||
|
except IntegrityError as e:
|
||||||
|
logger.warning("%s", f" Failed to switch all value(s) over to {target.name}({target.id}@{target.organizer.slug})")
|
||||||
|
logger.warning("%s", f" {e}")
|
||||||
|
for prop in invalid:
|
||||||
|
newname = f'{prop.name}_DUPLICATE_{prop.id}'
|
||||||
|
logger.warning("%s", f" Renaming {prop.name}({prop.id}@{prop.organizer.slug}) to {newname}({prop.id}@{prop.organizer.slug})")
|
||||||
|
prop.name = newname
|
||||||
|
prop.filter_public = False
|
||||||
|
prop.save()
|
||||||
|
|
||||||
|
else:
|
||||||
|
for prop in invalid:
|
||||||
|
logger.warning("%s", f" Deleting {prop.name}({prop.id}@{prop.organizer.slug})")
|
||||||
|
prop.delete()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("pretixbase", "0304_tax_rate_decimals"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RunPython(fix_cross_organizer_eventmetavalues, migrations.RunPython.noop),
|
||||||
|
migrations.RunPython(make_eventmetaproperties_unique, migrations.RunPython.noop),
|
||||||
|
]
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 5.2.12 on 2026-04-28 11:34
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("pretixbase", "0305_fixup_eventmetaproperties"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name="eventmetaproperty",
|
||||||
|
unique_together={("organizer", "name")},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -179,6 +179,12 @@ class EventMixin:
|
|||||||
self.date_to.astimezone(tz), ("D" if short else "l")
|
self.date_to.astimezone(tz), ("D" if short else "l")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def is_same_day(self):
|
||||||
|
if not self.date_to:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return self.date_from.astimezone(self.timezone).date() == self.date_to.astimezone(self.timezone).date()
|
||||||
|
|
||||||
def get_date_range_display(self, tz=None, force_show_end=False, as_html=False, try_to_show_times=False) -> str:
|
def get_date_range_display(self, tz=None, force_show_end=False, as_html=False, try_to_show_times=False) -> str:
|
||||||
"""
|
"""
|
||||||
Returns a formatted string containing the start date and the end date
|
Returns a formatted string containing the start date and the end date
|
||||||
@@ -232,6 +238,9 @@ class EventMixin:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def timezone(self):
|
def timezone(self):
|
||||||
|
# If we get rid of the shim, verify that
|
||||||
|
# https://github.com/py-vobject/vobject/issues/117#issuecomment-5045645314
|
||||||
|
# has been released and included
|
||||||
return pytz_deprecation_shim.timezone(self.settings.timezone)
|
return pytz_deprecation_shim.timezone(self.settings.timezone)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -649,7 +658,7 @@ class Event(EventMixin, LoggedModel):
|
|||||||
is_remote = models.BooleanField(
|
is_remote = models.BooleanField(
|
||||||
default=False,
|
default=False,
|
||||||
verbose_name=_("This event is remote or partially remote."),
|
verbose_name=_("This event is remote or partially remote."),
|
||||||
help_text=_("This will be used to let users know if the event is in a different timezone and let’s us calculate users’ local times."),
|
help_text=_("This will be used to let users know if the event is in a different timezone, and to let us calculate the local time of a user."),
|
||||||
)
|
)
|
||||||
geo_lat = models.FloatField(
|
geo_lat = models.FloatField(
|
||||||
verbose_name=_("Latitude"),
|
verbose_name=_("Latitude"),
|
||||||
@@ -1851,6 +1860,7 @@ class EventMetaProperty(LoggedModel):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ("position", "name",)
|
ordering = ("position", "name",)
|
||||||
|
unique_together = ('organizer', 'name')
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def choice_keys(self):
|
def choice_keys(self):
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ from django_scopes import ScopedManager
|
|||||||
|
|
||||||
from pretix.base.settings import COUNTRIES_WITH_STATE_IN_ADDRESS
|
from pretix.base.settings import COUNTRIES_WITH_STATE_IN_ADDRESS
|
||||||
from pretix.helpers.countries import FastCountryField
|
from pretix.helpers.countries import FastCountryField
|
||||||
|
from pretix.helpers.models import NormalizedDecimalField
|
||||||
|
|
||||||
|
|
||||||
def invoice_filename(instance, filename: str) -> str:
|
def invoice_filename(instance, filename: str) -> str:
|
||||||
@@ -450,7 +451,7 @@ class InvoiceLine(models.Model):
|
|||||||
description = models.TextField()
|
description = models.TextField()
|
||||||
gross_value = models.DecimalField(max_digits=13, decimal_places=2)
|
gross_value = models.DecimalField(max_digits=13, decimal_places=2)
|
||||||
tax_value = models.DecimalField(max_digits=13, decimal_places=2, default=Decimal('0.00'))
|
tax_value = models.DecimalField(max_digits=13, decimal_places=2, default=Decimal('0.00'))
|
||||||
tax_rate = models.DecimalField(max_digits=7, decimal_places=2, default=Decimal('0.00'))
|
tax_rate = NormalizedDecimalField(max_digits=7, decimal_places=4, default=Decimal('0'))
|
||||||
tax_name = models.CharField(max_length=190)
|
tax_name = models.CharField(max_length=190)
|
||||||
tax_code = models.CharField(max_length=190, null=True, blank=True)
|
tax_code = models.CharField(max_length=190, null=True, blank=True)
|
||||||
subevent = models.ForeignKey('SubEvent', null=True, blank=True, on_delete=models.PROTECT)
|
subevent = models.ForeignKey('SubEvent', null=True, blank=True, on_delete=models.PROTECT)
|
||||||
|
|||||||
@@ -885,26 +885,6 @@ class Item(LoggedModel):
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def unavailability_reason(self, now_dt: datetime=None, has_voucher=False, subevent=None) -> Optional[str]:
|
|
||||||
now_dt = now_dt or time_machine_now()
|
|
||||||
subevent_item = subevent and subevent.item_overrides.get(self.pk)
|
|
||||||
if not self.active:
|
|
||||||
return 'active'
|
|
||||||
elif self.available_from and self.available_from > now_dt:
|
|
||||||
return 'available_from'
|
|
||||||
elif self.available_until and self.available_until < now_dt:
|
|
||||||
return 'available_until'
|
|
||||||
elif (self.require_voucher or self.hide_without_voucher) and not has_voucher:
|
|
||||||
return 'require_voucher'
|
|
||||||
elif subevent_item and subevent_item.available_from and subevent_item.available_from > now_dt:
|
|
||||||
return 'available_from'
|
|
||||||
elif subevent_item and subevent_item.available_until and subevent_item.available_until < now_dt:
|
|
||||||
return 'available_until'
|
|
||||||
elif self.hidden_if_item_available and self._dependency_available:
|
|
||||||
return 'hidden_if_item_available'
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def _get_quotas(self, ignored_quotas=None, subevent=None):
|
def _get_quotas(self, ignored_quotas=None, subevent=None):
|
||||||
check_quotas = set(getattr(
|
check_quotas = set(getattr(
|
||||||
self, '_subevent_quotas', # Utilize cache in product list
|
self, '_subevent_quotas', # Utilize cache in product list
|
||||||
@@ -1413,22 +1393,6 @@ class ItemVariation(models.Model):
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def unavailability_reason(self, now_dt: datetime=None, has_voucher=False, subevent=None) -> Optional[str]:
|
|
||||||
now_dt = now_dt or time_machine_now()
|
|
||||||
subevent_var = subevent and subevent.var_overrides.get(self.pk)
|
|
||||||
if not self.active:
|
|
||||||
return 'active'
|
|
||||||
elif self.available_from and self.available_from > now_dt:
|
|
||||||
return 'available_from'
|
|
||||||
elif self.available_until and self.available_until < now_dt:
|
|
||||||
return 'available_until'
|
|
||||||
elif subevent_var and subevent_var.available_from and subevent_var.available_from > now_dt:
|
|
||||||
return 'available_from'
|
|
||||||
elif subevent_var and subevent_var.available_until and subevent_var.available_until < now_dt:
|
|
||||||
return 'available_until'
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def meta_data(self):
|
def meta_data(self):
|
||||||
data = self.item.meta_data
|
data = self.item.meta_data
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ from pretix.base.timemachine import time_machine_now
|
|||||||
|
|
||||||
from ...helpers import OF_SELF
|
from ...helpers import OF_SELF
|
||||||
from ...helpers.countries import CachedCountries, FastCountryField
|
from ...helpers.countries import CachedCountries, FastCountryField
|
||||||
|
from ...helpers.models import NormalizedDecimalField
|
||||||
from ...helpers.names import build_name
|
from ...helpers.names import build_name
|
||||||
from ...testutils.middleware import debugflags_var
|
from ...testutils.middleware import debugflags_var
|
||||||
from ._transactions import (
|
from ._transactions import (
|
||||||
@@ -507,20 +508,20 @@ class Order(LockModel, LoggedModel):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def annotate_overpayments(cls, qs, results=True, refunds=True, sums=False):
|
def annotate_overpayments(cls, qs, results=True, refunds=True, sums=False):
|
||||||
payment_sum = OrderPayment.objects.filter(
|
payment_sum = OrderPayment.objects.with_scopes_disabled().filter(
|
||||||
state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED),
|
state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED),
|
||||||
order=OuterRef('pk')
|
order=OuterRef('pk')
|
||||||
).order_by().values('order').annotate(s=Sum('amount')).values('s')
|
).order_by().values('order').annotate(s=Sum('amount')).values('s')
|
||||||
refund_sum = OrderRefund.objects.filter(
|
refund_sum = OrderRefund.objects.with_scopes_disabled().filter(
|
||||||
state__in=(OrderRefund.REFUND_STATE_DONE, OrderRefund.REFUND_STATE_TRANSIT,
|
state__in=(OrderRefund.REFUND_STATE_DONE, OrderRefund.REFUND_STATE_TRANSIT,
|
||||||
OrderRefund.REFUND_STATE_CREATED),
|
OrderRefund.REFUND_STATE_CREATED),
|
||||||
order=OuterRef('pk')
|
order=OuterRef('pk')
|
||||||
).order_by().values('order').annotate(s=Sum('amount')).values('s')
|
).order_by().values('order').annotate(s=Sum('amount')).values('s')
|
||||||
external_refund = OrderRefund.objects.filter(
|
external_refund = OrderRefund.objects.with_scopes_disabled().filter(
|
||||||
state=OrderRefund.REFUND_STATE_EXTERNAL,
|
state=OrderRefund.REFUND_STATE_EXTERNAL,
|
||||||
order=OuterRef('pk')
|
order=OuterRef('pk')
|
||||||
)
|
)
|
||||||
pending_refund = OrderRefund.objects.filter(
|
pending_refund = OrderRefund.objects.with_scopes_disabled().filter(
|
||||||
state__in=(OrderRefund.REFUND_STATE_CREATED, OrderRefund.REFUND_STATE_TRANSIT),
|
state__in=(OrderRefund.REFUND_STATE_CREATED, OrderRefund.REFUND_STATE_TRANSIT),
|
||||||
order=OuterRef('pk')
|
order=OuterRef('pk')
|
||||||
)
|
)
|
||||||
@@ -2071,6 +2072,17 @@ class OrderPayment(models.Model):
|
|||||||
"""
|
"""
|
||||||
return '{}-P-{}'.format(self.order.code, self.local_id)
|
return '{}-P-{}'.format(self.order.code, self.local_id)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def global_id(self):
|
||||||
|
"""
|
||||||
|
The global ID of this payment, constructed by the organizer slug, event slug, and the full id.
|
||||||
|
"""
|
||||||
|
return "{organizer}-{event}-{full_id}".format(
|
||||||
|
organizer=self.order.organizer.slug.upper(),
|
||||||
|
event=self.order.event.slug.upper(),
|
||||||
|
full_id=self.full_id,
|
||||||
|
)
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if not self.local_id:
|
if not self.local_id:
|
||||||
self.local_id = (self.order.payments.aggregate(m=Max('local_id'))['m'] or 0) + 1
|
self.local_id = (self.order.payments.aggregate(m=Max('local_id'))['m'] or 0) + 1
|
||||||
@@ -2271,6 +2283,17 @@ class OrderRefund(models.Model):
|
|||||||
"""
|
"""
|
||||||
return '{}-R-{}'.format(self.order.code, self.local_id)
|
return '{}-R-{}'.format(self.order.code, self.local_id)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def global_id(self):
|
||||||
|
"""
|
||||||
|
The global ID of this refund, constructed by the organizer slug, event slug, and the full id.
|
||||||
|
"""
|
||||||
|
return "{organizer}-{event}-{full_id}".format(
|
||||||
|
organizer=self.order.organizer.slug.upper(),
|
||||||
|
event=self.order.event.slug.upper(),
|
||||||
|
full_id=self.full_id,
|
||||||
|
)
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if not self.local_id:
|
if not self.local_id:
|
||||||
self.local_id = (self.order.refunds.aggregate(m=Max('local_id'))['m'] or 0) + 1
|
self.local_id = (self.order.refunds.aggregate(m=Max('local_id'))['m'] or 0) + 1
|
||||||
@@ -2285,9 +2308,12 @@ class OrderRefund(models.Model):
|
|||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class ActivePositionManager(ScopedManager(organizer='order__event__organizer').__class__):
|
def ActivePositionManager(**scope):
|
||||||
def get_queryset(self):
|
class InnerClass(ScopedManager(**scope).__class__):
|
||||||
return super().get_queryset().filter(canceled=False)
|
def get_queryset(self):
|
||||||
|
return super().get_queryset().filter(canceled=False)
|
||||||
|
|
||||||
|
return InnerClass()
|
||||||
|
|
||||||
|
|
||||||
class OrderFee(RoundingCorrectionMixin, models.Model):
|
class OrderFee(RoundingCorrectionMixin, models.Model):
|
||||||
@@ -2354,8 +2380,8 @@ class OrderFee(RoundingCorrectionMixin, models.Model):
|
|||||||
)
|
)
|
||||||
description = models.CharField(max_length=190, blank=True)
|
description = models.CharField(max_length=190, blank=True)
|
||||||
internal_type = models.CharField(max_length=255, blank=True)
|
internal_type = models.CharField(max_length=255, blank=True)
|
||||||
tax_rate = models.DecimalField(
|
tax_rate = NormalizedDecimalField(
|
||||||
max_digits=7, decimal_places=2,
|
max_digits=7, decimal_places=4,
|
||||||
verbose_name=_('Tax rate')
|
verbose_name=_('Tax rate')
|
||||||
)
|
)
|
||||||
tax_rule = models.ForeignKey(
|
tax_rule = models.ForeignKey(
|
||||||
@@ -2377,7 +2403,7 @@ class OrderFee(RoundingCorrectionMixin, models.Model):
|
|||||||
canceled = models.BooleanField(default=False)
|
canceled = models.BooleanField(default=False)
|
||||||
|
|
||||||
all = ScopedManager(organizer='order__event__organizer')
|
all = ScopedManager(organizer='order__event__organizer')
|
||||||
objects = ActivePositionManager()
|
objects = ActivePositionManager(organizer='order__event__organizer')
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def net_value(self):
|
def net_value(self):
|
||||||
@@ -2551,8 +2577,8 @@ class OrderPosition(AbstractPosition):
|
|||||||
max_digits=13, decimal_places=2, null=True, blank=True,
|
max_digits=13, decimal_places=2, null=True, blank=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
tax_rate = models.DecimalField(
|
tax_rate = NormalizedDecimalField(
|
||||||
max_digits=7, decimal_places=2,
|
max_digits=7, decimal_places=4,
|
||||||
verbose_name=_('Tax rate')
|
verbose_name=_('Tax rate')
|
||||||
)
|
)
|
||||||
tax_rule = models.ForeignKey(
|
tax_rule = models.ForeignKey(
|
||||||
@@ -2596,7 +2622,7 @@ class OrderPosition(AbstractPosition):
|
|||||||
)
|
)
|
||||||
|
|
||||||
all = ScopedManager(organizer='organizer')
|
all = ScopedManager(organizer='organizer')
|
||||||
objects = ActivePositionManager()
|
objects = ActivePositionManager(organizer='organizer')
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -3070,8 +3096,8 @@ class Transaction(models.Model):
|
|||||||
price_includes_rounding_correction = models.DecimalField(
|
price_includes_rounding_correction = models.DecimalField(
|
||||||
max_digits=13, decimal_places=2, default=Decimal("0.00")
|
max_digits=13, decimal_places=2, default=Decimal("0.00")
|
||||||
)
|
)
|
||||||
tax_rate = models.DecimalField(
|
tax_rate = NormalizedDecimalField(
|
||||||
max_digits=7, decimal_places=2,
|
max_digits=7, decimal_places=4,
|
||||||
verbose_name=_('Tax rate')
|
verbose_name=_('Tax rate')
|
||||||
)
|
)
|
||||||
tax_rule = models.ForeignKey(
|
tax_rule = models.ForeignKey(
|
||||||
@@ -3186,8 +3212,8 @@ class CartPosition(AbstractPosition):
|
|||||||
verbose_name=_("Limit for extending expiration date"),
|
verbose_name=_("Limit for extending expiration date"),
|
||||||
null=True
|
null=True
|
||||||
)
|
)
|
||||||
tax_rate = models.DecimalField(
|
tax_rate = NormalizedDecimalField(
|
||||||
max_digits=7, decimal_places=2, default=Decimal('0.00'),
|
max_digits=7, decimal_places=4, default=Decimal('0'),
|
||||||
verbose_name=_('Tax rate')
|
verbose_name=_('Tax rate')
|
||||||
)
|
)
|
||||||
tax_code = models.CharField(
|
tax_code = models.CharField(
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ from pretix.base.decimal import round_decimal
|
|||||||
from pretix.base.models.base import LoggedModel
|
from pretix.base.models.base import LoggedModel
|
||||||
from pretix.base.templatetags.money import money_filter
|
from pretix.base.templatetags.money import money_filter
|
||||||
from pretix.helpers.countries import FastCountryField
|
from pretix.helpers.countries import FastCountryField
|
||||||
|
from pretix.helpers.models import NormalizedDecimalField
|
||||||
|
|
||||||
|
|
||||||
class TaxedPrice:
|
class TaxedPrice:
|
||||||
@@ -335,9 +336,9 @@ class TaxRule(LoggedModel):
|
|||||||
max_length=190,
|
max_length=190,
|
||||||
choices=TAX_CODE_LISTS,
|
choices=TAX_CODE_LISTS,
|
||||||
)
|
)
|
||||||
rate = models.DecimalField(
|
rate = NormalizedDecimalField(
|
||||||
max_digits=10,
|
max_digits=7,
|
||||||
decimal_places=2,
|
decimal_places=4,
|
||||||
validators=[
|
validators=[
|
||||||
MaxValueValidator(
|
MaxValueValidator(
|
||||||
limit_value=Decimal("100.00"),
|
limit_value=Decimal("100.00"),
|
||||||
|
|||||||
@@ -936,7 +936,7 @@ class BasePaymentProvider:
|
|||||||
"""
|
"""
|
||||||
Will be called if the *event administrator* views the details of a payment.
|
Will be called if the *event administrator* views the details of a payment.
|
||||||
|
|
||||||
It should return HTML code containing information regarding the current payment
|
It should return a SafeString containing HTML code, with information regarding the current payment
|
||||||
status and, if applicable, next steps.
|
status and, if applicable, next steps.
|
||||||
|
|
||||||
The default implementation returns an empty string.
|
The default implementation returns an empty string.
|
||||||
@@ -961,7 +961,7 @@ class BasePaymentProvider:
|
|||||||
"""
|
"""
|
||||||
Will be called if the *event administrator* views the details of a refund.
|
Will be called if the *event administrator* views the details of a refund.
|
||||||
|
|
||||||
It should return HTML code containing information regarding the current refund
|
It should return a SafeString containing HTML code, with information regarding the current refund
|
||||||
status and, if applicable, next steps.
|
status and, if applicable, next steps.
|
||||||
|
|
||||||
The default implementation returns an empty string.
|
The default implementation returns an empty string.
|
||||||
@@ -1706,6 +1706,58 @@ class GiftCardPayment(BasePaymentProvider):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BaseHistoricalPaymentProvider(BasePaymentProvider):
|
||||||
|
"""
|
||||||
|
Base class for payment providers that no longer exist but can't be deleted to make sure historical
|
||||||
|
payments are shown correctly.
|
||||||
|
|
||||||
|
Subclasses are recommended to only implement:
|
||||||
|
- identifier
|
||||||
|
- verbose_name
|
||||||
|
- public_name
|
||||||
|
- payment_control_render
|
||||||
|
- payment_control_render_short
|
||||||
|
- refund_control_render
|
||||||
|
- refund_control_render_short
|
||||||
|
- render_invoice_text
|
||||||
|
- render_invoice_stamp
|
||||||
|
- api_payment_details
|
||||||
|
- api_refund_details
|
||||||
|
- shred_payment_info
|
||||||
|
- matching_id
|
||||||
|
- refund_matching_id
|
||||||
|
"""
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_enabled(self) -> bool:
|
||||||
|
return False
|
||||||
|
|
||||||
|
@property
|
||||||
|
def settings_form_fields(self) -> dict:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def payment_is_valid_session(self, request: HttpRequest, payment: OrderPayment):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def order_change_allowed(self, order: Order, request: HttpRequest=None) -> bool:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def payment_refund_supported(self, payment: OrderPayment) -> bool:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def payment_partial_refund_supported(self, payment: OrderPayment) -> bool:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def execute_payment(self, request: HttpRequest, payment: OrderPayment):
|
||||||
|
raise PaymentException(_("This payment provider exists for historical purposes only and is no longer usable."))
|
||||||
|
|
||||||
|
def execute_refund(self, refund: OrderRefund):
|
||||||
|
raise PaymentException(_("This payment provider exists for historical purposes only and is no longer usable."))
|
||||||
|
|
||||||
|
|
||||||
@receiver(register_payment_providers, dispatch_uid="payment_free")
|
@receiver(register_payment_providers, dispatch_uid="payment_free")
|
||||||
def register_payment_provider(sender, **kwargs):
|
def register_payment_provider(sender, **kwargs):
|
||||||
return [FreeOrderProvider, BoxOfficeProvider, OffsettingProvider, ManualPayment, GiftCardPayment]
|
return [FreeOrderProvider, BoxOfficeProvider, OffsettingProvider, ManualPayment, GiftCardPayment]
|
||||||
|
|||||||
@@ -245,6 +245,9 @@ def recv_classic(sender, **kwargs):
|
|||||||
|
|
||||||
|
|
||||||
def assign_ticket_secret(event, position, force_invalidate_if_revokation_list_used=False, force_invalidate=False, save=True):
|
def assign_ticket_secret(event, position, force_invalidate_if_revokation_list_used=False, force_invalidate=False, save=True):
|
||||||
|
if position.pk and position.issued_gift_cards.exists():
|
||||||
|
return
|
||||||
|
|
||||||
gen = event.ticket_secret_generator
|
gen = event.ticket_secret_generator
|
||||||
if gen.use_revocation_list and force_invalidate_if_revokation_list_used:
|
if gen.use_revocation_list and force_invalidate_if_revokation_list_used:
|
||||||
force_invalidate = True
|
force_invalidate = True
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ from typing import List
|
|||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
|
|
||||||
from pretix.base.models import CartPosition, ItemCategory, SalesChannel
|
from pretix.base.models import CartPosition, ItemCategory, SalesChannel
|
||||||
from pretix.presale.views.event import get_grouped_items
|
from pretix.presale.productlist import prepare_item_list_for_shop
|
||||||
|
|
||||||
|
|
||||||
class DummyCategory:
|
class DummyCategory:
|
||||||
@@ -162,7 +162,7 @@ class CrossSellingService:
|
|||||||
]
|
]
|
||||||
|
|
||||||
def _prepare_items(self, subevent, items_qs, discount_info):
|
def _prepare_items(self, subevent, items_qs, discount_info):
|
||||||
items, _btn = get_grouped_items(
|
items, _btn = prepare_item_list_for_shop(
|
||||||
self.event,
|
self.event,
|
||||||
subevent=subevent,
|
subevent=subevent,
|
||||||
voucher=None,
|
voucher=None,
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ from typing import List, Optional
|
|||||||
|
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.db import transaction
|
||||||
from django.utils.formats import date_format
|
from django.utils.formats import date_format
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
@@ -96,6 +97,8 @@ def validate_memberships_in_order(customer: Customer, positions: List[AbstractPo
|
|||||||
:param valid_from_not_chosen: Set to ``True`` to indicate that the customer is in an early step of the checkout flow
|
:param valid_from_not_chosen: Set to ``True`` to indicate that the customer is in an early step of the checkout flow
|
||||||
where the valid_from date is not selected yet. In this case, the valid_from date is not checked.
|
where the valid_from date is not selected yet. In this case, the valid_from date is not checked.
|
||||||
"""
|
"""
|
||||||
|
if lock and not transaction.get_connection().in_atomic_block:
|
||||||
|
raise Exception('validate_memberships_in_order(lock=True) should only be called in atomic transaction!')
|
||||||
tz = event.timezone
|
tz = event.timezone
|
||||||
applicable_positions = [
|
applicable_positions = [
|
||||||
p for p in positions
|
p for p in positions
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ from pretix.celery_app import app
|
|||||||
from pretix.helpers import OF_SELF
|
from pretix.helpers import OF_SELF
|
||||||
from pretix.helpers.models import modelcopy
|
from pretix.helpers.models import modelcopy
|
||||||
from pretix.helpers.periodic import minimum_interval
|
from pretix.helpers.periodic import minimum_interval
|
||||||
|
from pretix.presale.productlist import prepare_item_list_for_shop
|
||||||
from pretix.testutils.middleware import debugflags_var
|
from pretix.testutils.middleware import debugflags_var
|
||||||
|
|
||||||
|
|
||||||
@@ -790,6 +791,12 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti
|
|||||||
[op.seat for op in sorted_positions if op.seat],
|
[op.seat for op in sorted_positions if op.seat],
|
||||||
shared_lock_objects=[event]
|
shared_lock_objects=[event]
|
||||||
)
|
)
|
||||||
|
elif any(cp.voucher and cp.voucher.budget for cp in sorted_positions):
|
||||||
|
# Voucher budgets are not guaranteed by the cart manager
|
||||||
|
lock_objects(
|
||||||
|
[op.voucher for op in sorted_positions if op.voucher and op.voucher.budget],
|
||||||
|
shared_lock_objects=[event]
|
||||||
|
)
|
||||||
|
|
||||||
q_avail = Counter()
|
q_avail = Counter()
|
||||||
v_avail = Counter()
|
v_avail = Counter()
|
||||||
@@ -1599,6 +1606,7 @@ class OrderChangeManager:
|
|||||||
'seat_forbidden': gettext_lazy('The selected product does not allow to select a seat.'),
|
'seat_forbidden': gettext_lazy('The selected product does not allow to select a seat.'),
|
||||||
'tax_rule_country_blocked': gettext_lazy('The selected country is blocked by your tax rule.'),
|
'tax_rule_country_blocked': gettext_lazy('The selected country is blocked by your tax rule.'),
|
||||||
'gift_card_change': gettext_lazy('You cannot change the price of a position that has been used to issue a gift card.'),
|
'gift_card_change': gettext_lazy('You cannot change the price of a position that has been used to issue a gift card.'),
|
||||||
|
'gift_card_secret': gettext_lazy('You cannot change the ticket secret of a position that has been used to issue a gift card.'),
|
||||||
'max_items_per_product': ngettext_lazy(
|
'max_items_per_product': ngettext_lazy(
|
||||||
"You cannot select more than %(max)s item of the product %(product)s.",
|
"You cannot select more than %(max)s item of the product %(product)s.",
|
||||||
"You cannot select more than %(max)s items of the product %(product)s.",
|
"You cannot select more than %(max)s items of the product %(product)s.",
|
||||||
@@ -1756,6 +1764,9 @@ class OrderChangeManager:
|
|||||||
self._operations.append(self.RegenerateSecretOperation(position))
|
self._operations.append(self.RegenerateSecretOperation(position))
|
||||||
|
|
||||||
def change_ticket_secret(self, position: OrderPosition, new_secret: str):
|
def change_ticket_secret(self, position: OrderPosition, new_secret: str):
|
||||||
|
if position.issued_gift_cards.exists():
|
||||||
|
raise OrderError(self.error_messages['gift_card_secret'])
|
||||||
|
|
||||||
self._operations.append(self.ChangeSecretOperation(position, new_secret))
|
self._operations.append(self.ChangeSecretOperation(position, new_secret))
|
||||||
|
|
||||||
def change_valid_from(self, position: OrderPosition, new_value: datetime):
|
def change_valid_from(self, position: OrderPosition, new_value: datetime):
|
||||||
@@ -1943,13 +1954,18 @@ class OrderChangeManager:
|
|||||||
|
|
||||||
:param addons: A list of dictionaries with the keys ``"addon_to"``, ``"item"``, ``"variation"`` (all ID values),
|
:param addons: A list of dictionaries with the keys ``"addon_to"``, ``"item"``, ``"variation"`` (all ID values),
|
||||||
``"count"``, and ``"price"``.
|
``"count"``, and ``"price"``.
|
||||||
:param limit_main_positions: By default, the method works on all methods of the order. If you set this to a
|
:param limit_main_positions: By default, the method works on all positions of the order. If you set this to a
|
||||||
queryset or a list of positions, all other positions and their add-ons will be kept
|
queryset or a list of positions, all other positions and their add-ons will be kept
|
||||||
untouched.
|
untouched.
|
||||||
"""
|
"""
|
||||||
if self._operations:
|
if self._operations:
|
||||||
raise ValueError("Setting addons should be the first/only operation")
|
raise ValueError("Setting addons should be the first/only operation")
|
||||||
|
|
||||||
|
def _allowed_on_order_sales_channel(item_or_var, order):
|
||||||
|
return item_or_var.all_sales_channels or (
|
||||||
|
order.sales_channel.identifier in (s.identifier for s in item_or_var.limit_sales_channels.all())
|
||||||
|
)
|
||||||
|
|
||||||
# Prepare containers for min/max check of products
|
# Prepare containers for min/max check of products
|
||||||
item_counts = Counter()
|
item_counts = Counter()
|
||||||
for p in self.order.positions.all():
|
for p in self.order.positions.all():
|
||||||
@@ -2043,13 +2059,11 @@ class OrderChangeManager:
|
|||||||
if not item.is_available() or (variation and not variation.is_available()):
|
if not item.is_available() or (variation and not variation.is_available()):
|
||||||
raise OrderError(error_messages['unavailable'])
|
raise OrderError(error_messages['unavailable'])
|
||||||
|
|
||||||
if not item.all_sales_channels:
|
if not _allowed_on_order_sales_channel(item, self.order):
|
||||||
if self.order.sales_channel.identifier not in (s.identifier for s in item.limit_sales_channels.all()):
|
raise OrderError(error_messages['unavailable'])
|
||||||
raise OrderError(error_messages['unavailable'])
|
|
||||||
|
|
||||||
if variation and not variation.all_sales_channels:
|
if variation and not _allowed_on_order_sales_channel(variation, self.order):
|
||||||
if self.order.sales_channel.identifier not in (s.identifier for s in variation.limit_sales_channels.all()):
|
raise OrderError(error_messages['unavailable'])
|
||||||
raise OrderError(error_messages['unavailable'])
|
|
||||||
|
|
||||||
if subevent and item.pk in subevent.item_overrides and not subevent.item_overrides[item.pk].is_available():
|
if subevent and item.pk in subevent.item_overrides and not subevent.item_overrides[item.pk].is_available():
|
||||||
raise OrderError(error_messages['not_for_sale'])
|
raise OrderError(error_messages['not_for_sale'])
|
||||||
@@ -2097,6 +2111,36 @@ class OrderChangeManager:
|
|||||||
)
|
)
|
||||||
item_counts[item] += 1
|
item_counts[item] += 1
|
||||||
|
|
||||||
|
def _addon_is_available(a):
|
||||||
|
# If an item is no longer available due to time, it should usually also be no longer
|
||||||
|
# user-removable, because e.g. the stock has already been ordered.
|
||||||
|
# We always set voucher=None because that's what's done when generating the form in
|
||||||
|
# OrderChangeMixin (vouchers for addons are not supported).
|
||||||
|
# This also prevents accidental removal through the UI because a hidden product will no longer
|
||||||
|
# be part of the input.
|
||||||
|
if not _allowed_on_order_sales_channel(a.item, self.order) or (
|
||||||
|
a.variation and not _allowed_on_order_sales_channel(a.variation, self.order)
|
||||||
|
):
|
||||||
|
return False
|
||||||
|
|
||||||
|
items, _ = prepare_item_list_for_shop(
|
||||||
|
self.order.event,
|
||||||
|
channel=self.order.sales_channel,
|
||||||
|
subevent=a.subevent,
|
||||||
|
voucher=None,
|
||||||
|
base_qs=Item.objects.filter(pk=a.item.pk),
|
||||||
|
allow_addons=True
|
||||||
|
)
|
||||||
|
if (not items) or items[0].current_unavailability_reason:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if a.variation:
|
||||||
|
variations = [var for var in items[0].available_variations if var.pk == a.variation.pk]
|
||||||
|
if (not variations) or variations[0].current_unavailability_reason:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
# Detect removed add-ons and create RemoveOperations
|
# Detect removed add-ons and create RemoveOperations
|
||||||
for cp, al in list(current_addons.items()):
|
for cp, al in list(current_addons.items()):
|
||||||
for k, v in al.items():
|
for k, v in al.items():
|
||||||
@@ -2106,22 +2150,7 @@ class OrderChangeManager:
|
|||||||
for a in current_addons[cp][k][:current_num - input_num]:
|
for a in current_addons[cp][k][:current_num - input_num]:
|
||||||
if a.canceled:
|
if a.canceled:
|
||||||
continue
|
continue
|
||||||
is_unavailable = (
|
if not _addon_is_available(a):
|
||||||
# If an item is no longer available due to time, it should usually also be no longer
|
|
||||||
# user-removable, because e.g. the stock has already been ordered.
|
|
||||||
# We always pass has_voucher=True because if a product now requires a voucher, it usually does
|
|
||||||
# not mean it should be unremovable for others.
|
|
||||||
# This also prevents accidental removal through the UI because a hidden product will no longer
|
|
||||||
# be part of the input.
|
|
||||||
(a.variation and a.variation.unavailability_reason(has_voucher=True, subevent=a.subevent))
|
|
||||||
or (a.variation and not a.variation.all_sales_channels and not a.variation.limit_sales_channels.contains(self.order.sales_channel))
|
|
||||||
or a.item.unavailability_reason(has_voucher=True, subevent=a.subevent)
|
|
||||||
or (
|
|
||||||
not a.item.all_sales_channels and
|
|
||||||
not a.item.limit_sales_channels.contains(self.order.sales_channel)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if is_unavailable:
|
|
||||||
# "Re-select" add-on
|
# "Re-select" add-on
|
||||||
selected_addons[cp.id, a.item.category_id][a.item_id, a.variation_id] += 1
|
selected_addons[cp.id, a.item.category_id][a.item_id, a.variation_id] += 1
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ from babel.numbers import format_currency
|
|||||||
from django import template
|
from django import template
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.template.defaultfilters import floatformat
|
from django.template.defaultfilters import floatformat
|
||||||
|
from django.utils import formats
|
||||||
|
from django.utils.safestring import mark_safe
|
||||||
|
|
||||||
from pretix.base.i18n import get_babel_locale
|
from pretix.base.i18n import get_babel_locale
|
||||||
|
|
||||||
@@ -82,3 +84,19 @@ def money_numberfield_filter(value: Decimal, arg=''):
|
|||||||
|
|
||||||
places = settings.CURRENCY_PLACES.get(arg, 2)
|
places = settings.CURRENCY_PLACES.get(arg, 2)
|
||||||
return str(value.quantize(Decimal('1') / 10 ** places, ROUND_HALF_UP))
|
return str(value.quantize(Decimal('1') / 10 ** places, ROUND_HALF_UP))
|
||||||
|
|
||||||
|
|
||||||
|
@register.filter(is_safe=True)
|
||||||
|
def tax_rate_format(number):
|
||||||
|
"""
|
||||||
|
Display a Decimal to its significant decimal places, used for tax rates.
|
||||||
|
"""
|
||||||
|
assert isinstance(number, Decimal)
|
||||||
|
return mark_safe(
|
||||||
|
formats.number_format(
|
||||||
|
number.normalize(),
|
||||||
|
-number.as_tuple().exponent,
|
||||||
|
use_l10n=True,
|
||||||
|
force_grouping=False,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|||||||
@@ -19,12 +19,10 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import pathlib
|
import pathlib
|
||||||
import re
|
import re
|
||||||
import secrets
|
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
from urllib.request import urlopen
|
from urllib.request import urlopen
|
||||||
|
|
||||||
@@ -33,6 +31,10 @@ from django import template
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
|
||||||
|
from pretix.base.middleware import (
|
||||||
|
add_to_response_csp_via_request, calculate_csp_hash,
|
||||||
|
)
|
||||||
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
LOGGER = logging.getLogger(__name__)
|
LOGGER = logging.getLogger(__name__)
|
||||||
_MANIFEST = {}
|
_MANIFEST = {}
|
||||||
@@ -234,10 +236,16 @@ def vite_importmap(context):
|
|||||||
if not imports:
|
if not imports:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
# Generate a nonce and store it on the request so the CSP middleware can allow it
|
json_string = json.dumps({"imports": imports})
|
||||||
nonce = secrets.token_urlsafe(16)
|
|
||||||
|
# Calculate hash and add it to the CSP info in the request, so that will be merged into the
|
||||||
|
# response header later on by the middleware
|
||||||
request = context.get('request')
|
request = context.get('request')
|
||||||
if request:
|
if request:
|
||||||
request.csp_nonce = nonce
|
csp_hash = calculate_csp_hash(json_string)
|
||||||
|
add_to_response_csp_via_request(request, {
|
||||||
|
'style-src': [csp_hash],
|
||||||
|
'script-src': [csp_hash],
|
||||||
|
})
|
||||||
|
|
||||||
return f'<script type="importmap" nonce="{nonce}">{json.dumps({"imports": imports})}</script>'
|
return f'<script type="importmap">{json_string}</script>'
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ from django.template import TemplateDoesNotExist, loader
|
|||||||
from django.template.loader import get_template
|
from django.template.loader import get_template
|
||||||
from django.utils.functional import Promise
|
from django.utils.functional import Promise
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
from django.views.decorators.csrf import requires_csrf_token
|
|
||||||
from sentry_sdk import last_event_id
|
from sentry_sdk import last_event_id
|
||||||
|
|
||||||
from pretix.base.i18n import language
|
from pretix.base.i18n import language
|
||||||
from pretix.base.middleware import get_language_from_request
|
from pretix.base.middleware import get_language_from_request
|
||||||
|
from pretix.multidomain.middlewares import requires_csrf_token
|
||||||
|
|
||||||
|
|
||||||
def csrf_failure(request, reason=""):
|
def csrf_failure(request, reason=""):
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ def on_task_prerun(sender, task_id, task, **kwargs):
|
|||||||
from pretix.helpers.logs import local
|
from pretix.helpers.logs import local
|
||||||
|
|
||||||
local.request_id = task_id
|
local.request_id = task_id
|
||||||
if "X-Pretix-Trace" in task.request.headers:
|
if task.request.headers and "X-Pretix-Trace" in task.request.headers:
|
||||||
local.trace = task.request.headers["X-Pretix-Trace"].split(" ")
|
local.trace = task.request.headers["X-Pretix-Trace"].split(" ")
|
||||||
else:
|
else:
|
||||||
local.trace = []
|
local.trace = []
|
||||||
|
|||||||
@@ -197,10 +197,10 @@ class EventWizardBasicsForm(I18nModelForm):
|
|||||||
'presale_end': SplitDateTimeField,
|
'presale_end': SplitDateTimeField,
|
||||||
}
|
}
|
||||||
widgets = {
|
widgets = {
|
||||||
'date_from': SplitDateTimePickerWidget(),
|
'date_from': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
'date_to': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_basics-date_from_0'}),
|
'date_to': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_basics-date_from_0'}, without_seconds=True),
|
||||||
'presale_start': SplitDateTimePickerWidget(),
|
'presale_start': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_basics-presale_start_0'}),
|
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_basics-presale_start_0'}, without_seconds=True),
|
||||||
'slug': SlugWidget,
|
'slug': SlugWidget,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,11 +521,11 @@ class EventUpdateForm(I18nModelForm):
|
|||||||
'limit_sales_channels': SafeModelMultipleChoiceField,
|
'limit_sales_channels': SafeModelMultipleChoiceField,
|
||||||
}
|
}
|
||||||
widgets = {
|
widgets = {
|
||||||
'date_from': SplitDateTimePickerWidget(),
|
'date_from': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
'date_to': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_date_from_0'}),
|
'date_to': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_date_from_0'}, without_seconds=True),
|
||||||
'date_admission': SplitDateTimePickerWidget(attrs={'data-date-default': '#id_date_from_0'}),
|
'date_admission': SplitDateTimePickerWidget(attrs={'data-date-default': '#id_date_from_0'}, without_seconds=True),
|
||||||
'presale_start': SplitDateTimePickerWidget(),
|
'presale_start': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}),
|
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}, without_seconds=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ from urllib.parse import urlencode
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.db.models import (
|
from django.db.models import (
|
||||||
Count, Exists, F, Max, Model, OrderBy, OuterRef, Q, QuerySet,
|
Count, Exists, F, Max, Model, OrderBy, OuterRef, Q, QuerySet,
|
||||||
)
|
)
|
||||||
@@ -59,7 +60,7 @@ from pretix.base.models import (
|
|||||||
Gate, Invoice, InvoiceAddress, Item, Order, OrderPayment, OrderPosition,
|
Gate, Invoice, InvoiceAddress, Item, Order, OrderPayment, OrderPosition,
|
||||||
OrderRefund, Organizer, OutgoingMail, Question, QuestionAnswer, Quota,
|
OrderRefund, Organizer, OutgoingMail, Question, QuestionAnswer, Quota,
|
||||||
SalesChannel, SubEvent, SubEventMetaValue, Team, TeamAPIToken, TeamInvite,
|
SalesChannel, SubEvent, SubEventMetaValue, Team, TeamAPIToken, TeamInvite,
|
||||||
Voucher,
|
User, Voucher,
|
||||||
)
|
)
|
||||||
from pretix.base.signals import register_payment_providers
|
from pretix.base.signals import register_payment_providers
|
||||||
from pretix.base.timeframes import (
|
from pretix.base.timeframes import (
|
||||||
@@ -770,7 +771,7 @@ class EventOrderExpertFilterForm(EventOrderFilterForm):
|
|||||||
)
|
)
|
||||||
elif q.type == Question.TYPE_TIME:
|
elif q.type == Question.TYPE_TIME:
|
||||||
self.fields[fname] = forms.TimeField(
|
self.fields[fname] = forms.TimeField(
|
||||||
widget=TimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')),
|
widget=TimePickerWidget(without_seconds=True),
|
||||||
help_text=_('Exact matches only'),
|
help_text=_('Exact matches only'),
|
||||||
**kwargs,
|
**kwargs,
|
||||||
)
|
)
|
||||||
@@ -3007,3 +3008,91 @@ class OutgoingMailFilterForm(FilterForm):
|
|||||||
qs = qs.order_by("-created", "-pk")
|
qs = qs.order_by("-created", "-pk")
|
||||||
|
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
|
|
||||||
|
class LogFilterForm(FilterForm):
|
||||||
|
source = forms.ChoiceField(
|
||||||
|
label=_('Source'),
|
||||||
|
choices=[
|
||||||
|
('', _('All sources')),
|
||||||
|
('team', _('Team actions')),
|
||||||
|
('customer', _('Customer actions')),
|
||||||
|
('device', _('Device actions')),
|
||||||
|
],
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
device = SafeModelChoiceField(
|
||||||
|
label=_('Device'),
|
||||||
|
empty_label=_('All devices'),
|
||||||
|
queryset=Device.objects.none(),
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
user_email = forms.EmailField(
|
||||||
|
label=_('User email'),
|
||||||
|
widget=forms.EmailInput(
|
||||||
|
attrs={"placeholder": _('All users')}
|
||||||
|
),
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
action_type = forms.CharField(
|
||||||
|
widget=forms.HiddenInput,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
content_type = forms.ModelChoiceField(
|
||||||
|
queryset=ContentType.objects.all(),
|
||||||
|
widget=forms.HiddenInput,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
object = forms.IntegerField(
|
||||||
|
widget=forms.HiddenInput,
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.organizer = kwargs.pop('organizer')
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
self.fields['device'].queryset = self.organizer.devices.all().order_by('device_id')
|
||||||
|
self.fields['device'].widget = Select2(
|
||||||
|
attrs={
|
||||||
|
'data-model-select2': 'generic',
|
||||||
|
'data-select2-url': reverse('control:organizer.devices.select2', kwargs={
|
||||||
|
'organizer': self.organizer.slug,
|
||||||
|
}),
|
||||||
|
'data-placeholder': _('All devices'),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.fields['device'].widget.choices = self.fields['device'].choices
|
||||||
|
self.fields['device'].label = _('Device')
|
||||||
|
|
||||||
|
def filter_qs(self, qs):
|
||||||
|
fdata = self.cleaned_data
|
||||||
|
if fdata.get('source') == 'team':
|
||||||
|
qs = qs.filter(user__isnull=False)
|
||||||
|
elif fdata.get('source') == 'device':
|
||||||
|
qs = qs.filter(device__isnull=False)
|
||||||
|
elif fdata.get('source') == 'customer':
|
||||||
|
qs = qs.filter(user__isnull=True, device__isnull=True)
|
||||||
|
|
||||||
|
if fdata.get('device'):
|
||||||
|
qs = qs.filter(device_id=fdata['device'].pk)
|
||||||
|
|
||||||
|
if fdata.get('action_type'):
|
||||||
|
qs = qs.filter(action_type__in=fdata['action_type'].split(','))
|
||||||
|
|
||||||
|
if fdata.get('user_email'):
|
||||||
|
try:
|
||||||
|
user = User.objects.get(email=fdata['user_email'].lower())
|
||||||
|
qs = qs.filter(user=user)
|
||||||
|
except User.DoesNotExist:
|
||||||
|
# Do not actively leak info that this user does not exist. Yes, this will likely have a
|
||||||
|
# timing attack possibility, but with the magic that database query planners do,
|
||||||
|
# it's probably impossible to avoid that.
|
||||||
|
qs = qs.none()
|
||||||
|
|
||||||
|
if fdata.get('content_type'):
|
||||||
|
qs = qs.filter(content_type=fdata.get('content_type'))
|
||||||
|
|
||||||
|
if fdata.get('object'):
|
||||||
|
qs = qs.filter(object_id=fdata.get('object'))
|
||||||
|
return qs
|
||||||
|
|||||||
@@ -246,8 +246,8 @@ class QuestionForm(I18nModelForm):
|
|||||||
'valid_string_length_max',
|
'valid_string_length_max',
|
||||||
]
|
]
|
||||||
widgets = {
|
widgets = {
|
||||||
'valid_datetime_min': SplitDateTimePickerWidget(),
|
'valid_datetime_min': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
'valid_datetime_max': SplitDateTimePickerWidget(),
|
'valid_datetime_max': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
'valid_date_min': DatePickerWidget(),
|
'valid_date_min': DatePickerWidget(),
|
||||||
'valid_date_max': DatePickerWidget(),
|
'valid_date_max': DatePickerWidget(),
|
||||||
'items': forms.CheckboxSelectMultiple(
|
'items': forms.CheckboxSelectMultiple(
|
||||||
@@ -1427,6 +1427,6 @@ class ItemProgramTimeForm(I18nModelForm):
|
|||||||
'end': forms.SplitDateTimeField,
|
'end': forms.SplitDateTimeField,
|
||||||
}
|
}
|
||||||
widgets = {
|
widgets = {
|
||||||
'start': SplitDateTimePickerWidget(),
|
'start': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
'end': SplitDateTimePickerWidget(),
|
'end': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -562,9 +562,7 @@ class OrderPositionChangeForm(forms.Form):
|
|||||||
if instance.addon_to_id:
|
if instance.addon_to_id:
|
||||||
del self.fields['operation_split']
|
del self.fields['operation_split']
|
||||||
|
|
||||||
if not instance.seat and not (
|
if not instance.seat and not instance._seat_allowed:
|
||||||
instance.item.seat_category_mappings.filter(subevent=instance.subevent).exists()
|
|
||||||
):
|
|
||||||
del self.fields['seat']
|
del self.fields['seat']
|
||||||
|
|
||||||
choices = [
|
choices = [
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ from pretix.base.reldate import RelativeDateTimeField, RelativeDateWrapper
|
|||||||
from pretix.base.templatetags.money import money_filter
|
from pretix.base.templatetags.money import money_filter
|
||||||
from pretix.control.forms import SplitDateTimeField, SplitDateTimePickerWidget
|
from pretix.control.forms import SplitDateTimeField, SplitDateTimePickerWidget
|
||||||
from pretix.control.forms.rrule import RRuleForm
|
from pretix.control.forms.rrule import RRuleForm
|
||||||
|
from pretix.helpers.i18n import get_javascript_format_without_seconds
|
||||||
from pretix.helpers.money import change_decimal_field
|
from pretix.helpers.money import change_decimal_field
|
||||||
|
|
||||||
|
|
||||||
@@ -80,11 +81,11 @@ class SubEventForm(I18nModelForm):
|
|||||||
'presale_end': SplitDateTimeField,
|
'presale_end': SplitDateTimeField,
|
||||||
}
|
}
|
||||||
widgets = {
|
widgets = {
|
||||||
'date_from': SplitDateTimePickerWidget(),
|
'date_from': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
'date_to': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_date_from_0'}),
|
'date_to': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_date_from_0'}, without_seconds=True),
|
||||||
'date_admission': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_date_from_0'}),
|
'date_admission': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_date_from_0'}, without_seconds=True),
|
||||||
'presale_start': SplitDateTimePickerWidget(),
|
'presale_start': SplitDateTimePickerWidget(without_seconds=True),
|
||||||
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}),
|
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}, without_seconds=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -162,7 +163,7 @@ class SubEventBulkEditForm(I18nModelForm):
|
|||||||
self.fields[k + '_time'] = forms.TimeField(
|
self.fields[k + '_time'] = forms.TimeField(
|
||||||
label=self._meta.model._meta.get_field(k).verbose_name,
|
label=self._meta.model._meta.get_field(k).verbose_name,
|
||||||
help_text=self._meta.model._meta.get_field(k).help_text,
|
help_text=self._meta.model._meta.get_field(k).help_text,
|
||||||
widget=TimePickerWidget(),
|
widget=TimePickerWidget(without_seconds=True),
|
||||||
required=False,
|
required=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -506,6 +507,12 @@ class TimeForm(forms.Form):
|
|||||||
required=False
|
required=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.fields['time_from'].widget.attrs['data-format'] = get_javascript_format_without_seconds("TIME_INPUT_FORMATS")
|
||||||
|
self.fields['time_to'].widget.attrs['data-format'] = get_javascript_format_without_seconds("TIME_INPUT_FORMATS")
|
||||||
|
self.fields['time_admission'].widget.attrs['data-format'] = get_javascript_format_without_seconds("TIME_INPUT_FORMATS")
|
||||||
|
|
||||||
|
|
||||||
TimeFormSet = formset_factory(
|
TimeFormSet = formset_factory(
|
||||||
TimeForm,
|
TimeForm,
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
# License for the specific language governing permissions and limitations under the License.
|
# License for the specific language governing permissions and limitations under the License.
|
||||||
|
|
||||||
|
import functools
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
@@ -69,6 +70,15 @@ OVERVIEW_BANLIST = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@functools.lru_cache(maxsize=32)
|
||||||
|
def object_id_to_string(model_class, **kwargs):
|
||||||
|
# The cache is thread-local and persists requests, but it's small enough that we can accept that
|
||||||
|
try:
|
||||||
|
return str(model_class.objects.get(**kwargs))
|
||||||
|
except model_class.DoesNotExist:
|
||||||
|
return "?"
|
||||||
|
|
||||||
|
|
||||||
class OrderChangeLogEntryType(OrderLogEntryType):
|
class OrderChangeLogEntryType(OrderLogEntryType):
|
||||||
prefix = _('The order has been changed:')
|
prefix = _('The order has been changed:')
|
||||||
|
|
||||||
@@ -93,10 +103,10 @@ class OrderItemChanged(OrderChangeLogEntryType):
|
|||||||
def display_prefixed(self, event: Event, logentry: LogEntry, data):
|
def display_prefixed(self, event: Event, logentry: LogEntry, data):
|
||||||
old_item = str(event.items.get(pk=data['old_item']))
|
old_item = str(event.items.get(pk=data['old_item']))
|
||||||
if data['old_variation']:
|
if data['old_variation']:
|
||||||
old_item += ' - ' + str(ItemVariation.objects.get(item__event=event, pk=data['old_variation']))
|
old_item += ' - ' + str(object_id_to_string(ItemVariation, item__event_id=event.pk, pk=data['old_variation']))
|
||||||
new_item = str(event.items.get(pk=data['new_item']))
|
new_item = str(event.items.get(pk=data['new_item']))
|
||||||
if data['new_variation']:
|
if data['new_variation']:
|
||||||
new_item += ' - ' + str(ItemVariation.objects.get(item__event=event, pk=data['new_variation']))
|
new_item += ' - ' + str(object_id_to_string(ItemVariation, item__event_id=event.pk, pk=data['new_variation']))
|
||||||
return _('Position #{posid}: {old_item} ({old_price}) changed to {new_item} ({new_price}).').format(
|
return _('Position #{posid}: {old_item} ({old_price}) changed to {new_item} ({new_price}).').format(
|
||||||
posid=data.get('positionid', '?'),
|
posid=data.get('positionid', '?'),
|
||||||
old_item=old_item, new_item=new_item,
|
old_item=old_item, new_item=new_item,
|
||||||
@@ -153,14 +163,14 @@ class OrderTaxRuleChanged(OrderChangeLogEntryType):
|
|||||||
if 'positionid' in data:
|
if 'positionid' in data:
|
||||||
return _('Tax rule of position #{posid} changed from {old_rule} to {new_rule}.').format(
|
return _('Tax rule of position #{posid} changed from {old_rule} to {new_rule}.').format(
|
||||||
posid=data.get('positionid', '?'),
|
posid=data.get('positionid', '?'),
|
||||||
old_rule=TaxRule.objects.get(pk=data['old_taxrule']) if data['old_taxrule'] else '–',
|
old_rule=object_id_to_string(TaxRule, pk=data['old_taxrule']) if data['old_taxrule'] else '–',
|
||||||
new_rule=TaxRule.objects.get(pk=data['new_taxrule']),
|
new_rule=object_id_to_string(TaxRule, pk=data['new_taxrule']),
|
||||||
)
|
)
|
||||||
elif 'fee' in data:
|
elif 'fee' in data:
|
||||||
return _('Tax rule of fee #{fee} changed from {old_rule} to {new_rule}.').format(
|
return _('Tax rule of fee #{fee} changed from {old_rule} to {new_rule}.').format(
|
||||||
fee=data.get('fee', '?'),
|
fee=data.get('fee', '?'),
|
||||||
old_rule=TaxRule.objects.get(pk=data['old_taxrule']) if data['old_taxrule'] else '–',
|
old_rule=object_id_to_string(TaxRule, pk=data['old_taxrule']) if data['old_taxrule'] else '–',
|
||||||
new_rule=TaxRule.objects.get(pk=data['new_taxrule']),
|
new_rule=object_id_to_string(TaxRule, pk=data['new_taxrule']),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -204,7 +214,7 @@ class OrderCanceled(OrderChangeLogEntryType):
|
|||||||
def display_prefixed(self, event: Event, logentry: LogEntry, data):
|
def display_prefixed(self, event: Event, logentry: LogEntry, data):
|
||||||
old_item = str(event.items.get(pk=data['old_item']))
|
old_item = str(event.items.get(pk=data['old_item']))
|
||||||
if data['old_variation']:
|
if data['old_variation']:
|
||||||
old_item += ' - ' + str(ItemVariation.objects.get(pk=data['old_variation']))
|
old_item += ' - ' + object_id_to_string(ItemVariation, pk=data['old_variation'])
|
||||||
return _('Position #{posid} ({old_item}, {old_price}) canceled.').format(
|
return _('Position #{posid} ({old_item}, {old_price}) canceled.').format(
|
||||||
posid=data.get('positionid', '?'),
|
posid=data.get('positionid', '?'),
|
||||||
old_item=old_item,
|
old_item=old_item,
|
||||||
@@ -219,7 +229,7 @@ class OrderPositionAdded(OrderChangeLogEntryType):
|
|||||||
def display_prefixed(self, event: Event, logentry: LogEntry, data):
|
def display_prefixed(self, event: Event, logentry: LogEntry, data):
|
||||||
item = str(event.items.get(pk=data['item']))
|
item = str(event.items.get(pk=data['item']))
|
||||||
if data['variation']:
|
if data['variation']:
|
||||||
item += ' - ' + str(ItemVariation.objects.get(item__event=event, pk=data['variation']))
|
item += ' - ' + object_id_to_string(ItemVariation, item__event_id=event.pk, pk=data['variation'])
|
||||||
if data['addon_to']:
|
if data['addon_to']:
|
||||||
addon_to = OrderPosition.objects.get(order__event=event, pk=data['addon_to'])
|
addon_to = OrderPosition.objects.get(order__event=event, pk=data['addon_to'])
|
||||||
return _('Position #{posid} created: {item} ({price}) as an add-on to position #{addon_to}.').format(
|
return _('Position #{posid} created: {item} ({price}) as an add-on to position #{addon_to}.').format(
|
||||||
@@ -283,7 +293,7 @@ class OrderChangedSplit(OrderChangeLogEntryType):
|
|||||||
def display_prefixed(self, event: Event, logentry: LogEntry, data):
|
def display_prefixed(self, event: Event, logentry: LogEntry, data):
|
||||||
old_item = str(event.items.get(pk=data['old_item']))
|
old_item = str(event.items.get(pk=data['old_item']))
|
||||||
if data['old_variation']:
|
if data['old_variation']:
|
||||||
old_item += ' - ' + str(ItemVariation.objects.get(pk=data['old_variation']))
|
old_item += ' - ' + object_id_to_string(ItemVariation, pk=data['old_variation'])
|
||||||
url = reverse('control:event.order', kwargs={
|
url = reverse('control:event.order', kwargs={
|
||||||
'event': event.slug,
|
'event': event.slug,
|
||||||
'organizer': event.organizer.slug,
|
'organizer': event.organizer.slug,
|
||||||
@@ -339,6 +349,7 @@ class OrderChangedSplitFrom(OrderLogEntryType):
|
|||||||
'pretix.event.checkin.reverted': _('The check-in of position #{posid} on list "{list}" has been reverted.'),
|
'pretix.event.checkin.reverted': _('The check-in of position #{posid} on list "{list}" has been reverted.'),
|
||||||
})
|
})
|
||||||
class CheckinErrorLogEntryType(OrderLogEntryType):
|
class CheckinErrorLogEntryType(OrderLogEntryType):
|
||||||
|
|
||||||
def display(self, logentry: LogEntry, data):
|
def display(self, logentry: LogEntry, data):
|
||||||
return self.display_plain(self.plain, logentry, data)
|
return self.display_plain(self.plain, logentry, data)
|
||||||
|
|
||||||
@@ -353,10 +364,7 @@ class CheckinErrorLogEntryType(OrderLogEntryType):
|
|||||||
event = logentry.event
|
event = logentry.event
|
||||||
|
|
||||||
if 'list' in data and event:
|
if 'list' in data and event:
|
||||||
try:
|
data['list'] = object_id_to_string(CheckinList, event_id=event.id, pk=data['list'])
|
||||||
data['list'] = event.checkin_lists.get(pk=data.get('list')).name
|
|
||||||
except CheckinList.DoesNotExist:
|
|
||||||
data['list'] = _("(unknown)")
|
|
||||||
else:
|
else:
|
||||||
data['list'] = _("(unknown)")
|
data['list'] = _("(unknown)")
|
||||||
|
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ event_dashboard_widgets = EventPluginSignal()
|
|||||||
This signal is sent out to include widgets in the event dashboard. Receivers
|
This signal is sent out to include widgets in the event dashboard. Receivers
|
||||||
should return a list of dictionaries, where each dictionary can have the keys:
|
should return a list of dictionaries, where each dictionary can have the keys:
|
||||||
|
|
||||||
* content (str, containing HTML)
|
* content (SafeString, containing HTML)
|
||||||
* display_size (str, one of "full" (whole row), "big" (half a row) or "small"
|
* display_size (str, one of "full" (whole row), "big" (half a row) or "small"
|
||||||
(quarter of a row). May be ignored on small displays, default is "small")
|
(quarter of a row). May be ignored on small displays, default is "small")
|
||||||
* priority (int, used for ordering, higher comes first, default is 1)
|
* priority (int, used for ordering, higher comes first, default is 1)
|
||||||
@@ -158,7 +158,7 @@ Arguments: 'user'
|
|||||||
This signal is sent out to include widgets in the personal user dashboard. Receivers
|
This signal is sent out to include widgets in the personal user dashboard. Receivers
|
||||||
should return a list of dictionaries, where each dictionary can have the keys:
|
should return a list of dictionaries, where each dictionary can have the keys:
|
||||||
|
|
||||||
* content (str, containing HTML)
|
* content (SafeString, containing HTML)
|
||||||
* display_size (str, one of "full" (whole row), "big" (half a row) or "small"
|
* display_size (str, one of "full" (whole row), "big" (half a row) or "small"
|
||||||
(quarter of a row). May be ignored on small displays, default is "small")
|
(quarter of a row). May be ignored on small displays, default is "small")
|
||||||
* priority (int, used for ordering, higher comes first, default is 1)
|
* priority (int, used for ordering, higher comes first, default is 1)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load compress %}
|
{% load compress %}
|
||||||
|
{% load escapejson %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<form class="form-signin" action="" method="post" id="webauthn-form">
|
<form class="form-signin" action="" method="post" id="webauthn-form">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
@@ -30,8 +31,7 @@
|
|||||||
</form>
|
</form>
|
||||||
{% if jsondata %}
|
{% if jsondata %}
|
||||||
<script type="text/json" id="webauthn-login">
|
<script type="text/json" id="webauthn-login">
|
||||||
{{ jsondata|safe }}
|
{{ jsondata|escapejson }}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% compress js %}
|
{% compress js %}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
{% if w.lazy %}
|
{% if w.lazy %}
|
||||||
<span class="fa fa-cog fa-4x"></span>
|
<span class="fa fa-cog fa-4x"></span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ w.content|safe }}
|
{{ w.content }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
{% if w.lazy %}
|
{% if w.lazy %}
|
||||||
<span class="fa fa-cog fa-4x"></span>
|
<span class="fa fa-cog fa-4x"></span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ w.content|safe }}
|
{{ w.content }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
{% if w.lazy %}
|
{% if w.lazy %}
|
||||||
<span class="fa fa-cog fa-4x"></span>
|
<span class="fa fa-cog fa-4x"></span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ w.content|safe }}
|
{{ w.content }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
{% if w.lazy %}
|
{% if w.lazy %}
|
||||||
<span class="fa fa-cog fa-4x"></span>
|
<span class="fa fa-cog fa-4x"></span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ w.content|safe }}
|
{{ w.content }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -102,7 +102,7 @@
|
|||||||
{% if w.lazy %}
|
{% if w.lazy %}
|
||||||
<span class="fa fa-cog fa-4x"></span>
|
<span class="fa fa-cog fa-4x"></span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ w.content|safe }}
|
{{ w.content }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -50,6 +50,46 @@
|
|||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if dkim_warning %}
|
||||||
|
<div class="alert alert-danger">
|
||||||
|
<p>
|
||||||
|
{{ dkim_warning }}
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
{% trans "Your new DKIM record should be set up as a CNAME record like this:" %}
|
||||||
|
</p>
|
||||||
|
<pre><code>{{ dkim_hostname }} CNAME {{ dkim_cname }}</code></pre>
|
||||||
|
<p>
|
||||||
|
{% trans "Please keep in mind that updates to DNS might require multiple hours to take effect." %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% elif dkim_cname %}
|
||||||
|
<div class="alert alert-success">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
We found a DKIM record on your domain for this system. Great!
|
||||||
|
{% endblocktrans %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if dmarc_warning %}
|
||||||
|
<div class="alert alert-danger">
|
||||||
|
<p>
|
||||||
|
{{ dmarc_warning }}
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
{% trans "Your new DMARC record could look like this:" %}
|
||||||
|
</p>
|
||||||
|
<pre><code>_dmarc.{{ hostname }} TXT "v=DMARC1; p=quarantine; sp=none; adkim=r; aspf=r;"</code></pre>
|
||||||
|
<p>
|
||||||
|
{% trans "Please keep in mind that updates to DNS might require multiple hours to take effect." %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% elif dkim_cname %}
|
||||||
|
<div class="alert alert-success">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
We found a DMARC record on your domain for this system. Great!
|
||||||
|
{% endblocktrans %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
{% if verification %}
|
{% if verification %}
|
||||||
<h3>{% trans "Verification" %}</h3>
|
<h3>{% trans "Verification" %}</h3>
|
||||||
<p>
|
<p>
|
||||||
@@ -70,7 +110,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if spf_warning %}
|
{% if spf_warning or dkim_warning or dmarc_warning %}
|
||||||
<div class="form-group submit-group">
|
<div class="form-group submit-group">
|
||||||
<a href="" class="btn btn-default btn-save">
|
<a href="" class="btn btn-default btn-save">
|
||||||
{% trans "Cancel" %}
|
{% trans "Cancel" %}
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
{% if has_overpaid_orders %}
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
This event contains <strong>overpaid orders</strong>, for example due to duplicate payment attempts.
|
||||||
|
You should review the cases and consider refunding the overpaid amount to the user.
|
||||||
|
{% endblocktrans %}
|
||||||
|
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status=overpaid"
|
||||||
|
class="btn btn-primary">{% trans "Show overpaid orders" %}</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if has_pending_refunds %}
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
This event contains <strong>pending refunds</strong> that you should take care of.
|
||||||
|
{% endblocktrans %}
|
||||||
|
<a href="{% url "control:event.orders.refunds" event=request.event.slug organizer=request.event.organizer.slug %}"
|
||||||
|
class="btn btn-primary">{% trans "Show pending refunds" %}</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if has_cancellation_requests %}
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
This event contains <strong>requested cancellations</strong> that you should take care of.
|
||||||
|
{% endblocktrans %}
|
||||||
|
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status=rc"
|
||||||
|
class="btn btn-primary">{% trans "Show orders requesting cancellation" %}</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if has_pending_approvals %}
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
This event contains <strong>pending approvals</strong> that you should take care of.
|
||||||
|
{% endblocktrans %}
|
||||||
|
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status=pa"
|
||||||
|
class="btn btn-primary">{% trans "Show orders pending approval" %}</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if has_pending_orders_with_full_payment %}
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
This event contains <strong>fully paid orders</strong> that are not marked as paid, probably
|
||||||
|
because no quota was left at the time their payment arrived. You should review the cases and consider
|
||||||
|
either refunding the customer or creating more space.
|
||||||
|
{% endblocktrans %}
|
||||||
|
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status=pendingpaid"
|
||||||
|
class="btn btn-primary">{% trans "Show affected orders" %}</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if has_sync_problems %}
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
Orders in this event could not be <strong>synced to an external system</strong> as configured.
|
||||||
|
{% endblocktrans %}
|
||||||
|
<a href="{% url "control:event.datasync.failedjobs" event=request.event.slug organizer=request.event.organizer.slug %}"
|
||||||
|
class="btn btn-primary">{% trans "Show sync problems" %}</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
{{ request.event.get_date_range_display }}
|
{{ request.event.get_date_range_display }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<span id="warnings_loading" class="fa fa-cog fa-spin"></span>
|
||||||
</small>
|
</small>
|
||||||
</h1>
|
</h1>
|
||||||
<div class="helper-space-below">
|
<div class="helper-space-below">
|
||||||
@@ -31,63 +32,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
</div>
|
</div>
|
||||||
{% if has_overpaid_orders %}
|
<div id="warnings_target"></div>
|
||||||
<div class="alert alert-warning">
|
|
||||||
{% blocktrans trimmed %}
|
|
||||||
This event contains <strong>overpaid orders</strong>, for example due to duplicate payment attempts.
|
|
||||||
You should review the cases and consider refunding the overpaid amount to the user.
|
|
||||||
{% endblocktrans %}
|
|
||||||
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status=overpaid"
|
|
||||||
class="btn btn-primary">{% trans "Show overpaid orders" %}</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if has_pending_refunds %}
|
|
||||||
<div class="alert alert-warning">
|
|
||||||
{% blocktrans trimmed %}
|
|
||||||
This event contains <strong>pending refunds</strong> that you should take care of.
|
|
||||||
{% endblocktrans %}
|
|
||||||
<a href="{% url "control:event.orders.refunds" event=request.event.slug organizer=request.event.organizer.slug %}"
|
|
||||||
class="btn btn-primary">{% trans "Show pending refunds" %}</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if has_cancellation_requests %}
|
|
||||||
<div class="alert alert-warning">
|
|
||||||
{% blocktrans trimmed %}
|
|
||||||
This event contains <strong>requested cancellations</strong> that you should take care of.
|
|
||||||
{% endblocktrans %}
|
|
||||||
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status=rc"
|
|
||||||
class="btn btn-primary">{% trans "Show orders requesting cancellation" %}</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if has_pending_approvals %}
|
|
||||||
<div class="alert alert-warning">
|
|
||||||
{% blocktrans trimmed %}
|
|
||||||
This event contains <strong>pending approvals</strong> that you should take care of.
|
|
||||||
{% endblocktrans %}
|
|
||||||
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status=pa"
|
|
||||||
class="btn btn-primary">{% trans "Show orders pending approval" %}</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if has_pending_orders_with_full_payment %}
|
|
||||||
<div class="alert alert-warning">
|
|
||||||
{% blocktrans trimmed %}
|
|
||||||
This event contains <strong>fully paid orders</strong> that are not marked as paid, probably
|
|
||||||
because no quota was left at the time their payment arrived. You should review the cases and consider
|
|
||||||
either refunding the customer or creating more space.
|
|
||||||
{% endblocktrans %}
|
|
||||||
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status=pendingpaid"
|
|
||||||
class="btn btn-primary">{% trans "Show affected orders" %}</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if has_sync_problems %}
|
|
||||||
<div class="alert alert-warning">
|
|
||||||
{% blocktrans trimmed %}
|
|
||||||
Orders in this event could not be <strong>synced to an external system</strong> as configured.
|
|
||||||
{% endblocktrans %}
|
|
||||||
<a href="{% url "control:event.datasync.failedjobs" event=request.event.slug organizer=request.event.organizer.slug %}"
|
|
||||||
class="btn btn-primary">{% trans "Show sync problems" %}</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% eventsignal request.event "pretix.control.signals.event_dashboard_top" request=request %}
|
{% eventsignal request.event "pretix.control.signals.event_dashboard_top" request=request %}
|
||||||
|
|
||||||
{% if request.event.has_subevents %}
|
{% if request.event.has_subevents %}
|
||||||
@@ -106,7 +51,7 @@
|
|||||||
{% if w.lazy %}
|
{% if w.lazy %}
|
||||||
<span class="fa fa-cog fa-4x"></span>
|
<span class="fa fa-cog fa-4x"></span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ w.content|safe }}
|
{{ w.content }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</a>
|
</a>
|
||||||
{% elif w.link %}
|
{% elif w.link %}
|
||||||
@@ -114,7 +59,7 @@
|
|||||||
{% if w.lazy %}
|
{% if w.lazy %}
|
||||||
<span class="fa fa-cog fa-4x´"></span>
|
<span class="fa fa-cog fa-4x´"></span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ w.content|safe }}
|
{{ w.content }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -122,7 +67,7 @@
|
|||||||
{% if w.lazy %}
|
{% if w.lazy %}
|
||||||
<span class="fa fa-cog fa-4x"></span>
|
<span class="fa fa-cog fa-4x"></span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ w.content|safe }}
|
{{ w.content }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -1,41 +1,12 @@
|
|||||||
{% extends "pretixcontrol/items/base.html" %}
|
{% extends "pretixcontrol/items/base.html" %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% load icon %}
|
||||||
{% block title %}{% trans "Event logs" %}{% endblock %}
|
{% block title %}{% trans "Event logs" %}{% endblock %}
|
||||||
{% block inside %}
|
{% block inside %}
|
||||||
<h1>{% trans "Event logs" %}</h1>
|
<h1>{% trans "Event logs" %}</h1>
|
||||||
<form class="form-inline helper-display-inline" action="" method="get">
|
{% include "pretixcontrol/fragment_log_filter_form.html" %}
|
||||||
<input type="hidden" name="content_type" value="{{ request.GET.content_type }}">
|
|
||||||
<input type="hidden" name="object" value="{{ request.GET.object }}">
|
|
||||||
<p>
|
|
||||||
<select name="user" class="form-control">
|
|
||||||
<option value="">{% trans "All actions" %}</option>
|
|
||||||
<option value="yes" {% if request.GET.user == "yes" %}selected="selected"{% endif %}>
|
|
||||||
{% trans "Team actions" %}
|
|
||||||
</option>
|
|
||||||
<option value="no" {% if request.GET.user == "no" %}selected="selected"{% endif %}>
|
|
||||||
{% trans "Customer actions" %}
|
|
||||||
</option>
|
|
||||||
{% for up in userlist %}
|
|
||||||
{% if up.user__id %}
|
|
||||||
<option value="{{ up.user__id }}"
|
|
||||||
{% if request.GET.user == up.user__id %}selected="selected"{% endif %}>
|
|
||||||
{{ up.user__email }}
|
|
||||||
</option>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% for d in devicelist %}
|
|
||||||
{% if d.device__id %}
|
|
||||||
<option value="d-{{ d.device__id }}"
|
|
||||||
{% if "d-" in request.GET.user and request.GET.user|slice:"2:" == d.device__id|slugify %}selected="selected"{% endif %}>
|
|
||||||
{{ d.device__name }}
|
|
||||||
</option>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
<button class="btn btn-primary" type="submit">{% trans "Filter" %}</button>
|
|
||||||
</p>
|
|
||||||
</form>
|
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
{% for log in logs %}
|
{% for log in logs %}
|
||||||
<li class="list-group-item logentry">
|
<li class="list-group-item logentry">
|
||||||
@@ -95,5 +66,5 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{% include "pretixcontrol/pagination.html" %}
|
{% include "pretixcontrol/pagination_huge.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<table class="table table-payment-providers">
|
<table class="table table-payment-providers">
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for provider in providers %}
|
{% for provider in providers %}
|
||||||
<tr>
|
<tr{% if provider.highlight %} class="success-left"{% endif %}>
|
||||||
<td>
|
<td>
|
||||||
<strong>{{ provider.verbose_name }}</strong>
|
<strong>{{ provider.verbose_name }}</strong>
|
||||||
</td>
|
</td>
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
<td colspan="4">
|
<td colspan="4">
|
||||||
<br>
|
<br>
|
||||||
{% url "control:event.settings.plugins" event=request.event.slug organizer=request.organizer.slug as plugin_settings_url %}
|
{% url "control:event.settings.plugins" event=request.event.slug organizer=request.organizer.slug as plugin_settings_url %}
|
||||||
<a href="{{ plugin_settings_url }}#tab-0-1-open" class="btn btn-default">
|
<a href="{{ plugin_settings_url }}?go=payment#tab-0-1-open" class="btn btn-default">
|
||||||
<i class="fa fa-plus"></i> {% trans "Enable additional payment plugins" %}
|
<i class="fa fa-plus"></i> {% trans "Enable additional payment plugins" %}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<form action="" method="post" class="form-horizontal form-plugins">
|
<form action="" method="post" class="form-horizontal form-plugins">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="go" value="{{ request.GET.go }}">
|
||||||
<div id="plugin_search_results" class="panel panel-default collapse">
|
<div id="plugin_search_results" class="panel panel-default collapse">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<button type="button" class="close" aria-label="Close"><span aria-hidden="true">×</span></button>
|
<button type="button" class="close" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% load icon %}
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h3 class="panel-title">
|
||||||
|
{% trans "Filter" %}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<form class="panel-body filter-form" action="" method="get">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 col-xs-6">
|
||||||
|
{% bootstrap_field filter_form.source %}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 col-xs-6">
|
||||||
|
{% bootstrap_field filter_form.device %}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 col-xs-6">
|
||||||
|
{% bootstrap_field filter_form.user_email %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ filter_form.action_type }}
|
||||||
|
{{ filter_form.content_type }}
|
||||||
|
{{ filter_form.object }}
|
||||||
|
{% if filter_form.is_valid and filter_form.cleaned_data.action_type %}
|
||||||
|
{% icon "filter" %} <code>{{ filter_form.cleaned_data.action_type }}</code>
|
||||||
|
{% endif %}
|
||||||
|
{% if filter_form.is_valid and filter_form.cleaned_data.content_type and filter_form.cleaned_data.object %}
|
||||||
|
{% icon "filter" %} {% trans "Specific object selected" %}
|
||||||
|
{% endif %}
|
||||||
|
<div class="text-right flip">
|
||||||
|
<button class="btn btn-primary btn-lg" type="submit">
|
||||||
|
<span class="fa fa-filter"></span>
|
||||||
|
{% trans "Filter" %}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
@@ -156,11 +156,11 @@
|
|||||||
<br/>
|
<br/>
|
||||||
<small class="text-muted">
|
<small class="text-muted">
|
||||||
{% if not i.tax_rule.price_includes_tax %}
|
{% if not i.tax_rule.price_includes_tax %}
|
||||||
{% blocktrans trimmed with rate=i.tax_rule.rate|floatformat:-2 taxname=i.tax_rule.name %}
|
{% blocktrans trimmed with rate=i.tax_rule.rate|tax_rate_format taxname=i.tax_rule.name %}
|
||||||
<strong>plus</strong> {{ rate }}% {{ taxname }}
|
<strong>plus</strong> {{ rate }}% {{ taxname }}
|
||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% blocktrans trimmed with rate=i.tax_rule.rate|floatformat:-2 taxname=i.tax_rule.name|default:s_taxes %}
|
{% blocktrans trimmed with rate=i.tax_rule.rate|tax_rate_format taxname=i.tax_rule.name|default:s_taxes %}
|
||||||
incl. {{ rate }}% {{ taxname }}
|
incl. {{ rate }}% {{ taxname }}
|
||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
{% load money %}
|
{% load money %}
|
||||||
|
{% load wrap_in %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans "Cancel order" %}
|
{% trans "Cancel order" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -26,7 +27,7 @@
|
|||||||
{% if form.cancellation_fee %}
|
{% if form.cancellation_fee %}
|
||||||
{% if fee %}
|
{% if fee %}
|
||||||
{% with fee|money:request.event.currency as f %}
|
{% with fee|money:request.event.currency as f %}
|
||||||
<p>{% blocktrans trimmed with fee="<strong>"|add:f|add:"</strong>"|safe %}
|
<p>{% blocktrans trimmed with fee=f|wrap_in:"strong" %}
|
||||||
The configured cancellation fee for a self-service cancellation would be {{ fee }} for this
|
The configured cancellation fee for a self-service cancellation would be {{ fee }} for this
|
||||||
order, but for a cancellation performed by you, you need to set the cancellation fee here:
|
order, but for a cancellation performed by you, you need to set the cancellation fee here:
|
||||||
{% endblocktrans %}</p>
|
{% endblocktrans %}</p>
|
||||||
|
|||||||
@@ -284,6 +284,14 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
{% bootstrap_field position.form.operation_secret layout='inline' %}
|
{% bootstrap_field position.form.operation_secret layout='inline' %}
|
||||||
|
{% if position.issued_gift_cards.exists %}
|
||||||
|
<div class="alert alert-info">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
Ticket secrets of order positions that have been used to issue a gift card can not
|
||||||
|
be changed. Only the link will be changed in this case.
|
||||||
|
{% endblocktrans %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -705,7 +705,7 @@
|
|||||||
{% if line.tax_rate %}
|
{% if line.tax_rate %}
|
||||||
<br/>
|
<br/>
|
||||||
<small>
|
<small>
|
||||||
{% blocktrans trimmed with rate=line.tax_rate|floatformat:-2 taxname=line.tax_rule.name|default:s_taxes %}
|
{% blocktrans trimmed with rate=line.tax_rate|tax_rate_format taxname=line.tax_rule.name|default:s_taxes %}
|
||||||
<strong>plus</strong> {{ rate }}% {{ taxname }}
|
<strong>plus</strong> {{ rate }}% {{ taxname }}
|
||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
</small>
|
</small>
|
||||||
@@ -715,7 +715,7 @@
|
|||||||
{% if line.tax_rate and line.price %}
|
{% if line.tax_rate and line.price %}
|
||||||
<br/>
|
<br/>
|
||||||
<small>
|
<small>
|
||||||
{% blocktrans trimmed with rate=line.tax_rate|floatformat:-2 taxname=line.tax_rule.name|default:s_taxes %}
|
{% blocktrans trimmed with rate=line.tax_rate|tax_rate_format taxname=line.tax_rule.name|default:s_taxes %}
|
||||||
incl. {{ rate }}% {{ taxname }}
|
incl. {{ rate }}% {{ taxname }}
|
||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
</small>
|
</small>
|
||||||
@@ -755,7 +755,7 @@
|
|||||||
{% if fee.tax_rate %}
|
{% if fee.tax_rate %}
|
||||||
<br/>
|
<br/>
|
||||||
<small>
|
<small>
|
||||||
{% blocktrans trimmed with rate=fee.tax_rate|floatformat:-2 taxname=fee.tax_rule.name|default:s_taxes %}
|
{% blocktrans trimmed with rate=fee.tax_rate|tax_rate_format taxname=fee.tax_rule.name|default:s_taxes %}
|
||||||
<strong>plus</strong> {{ rate }}% {{ taxname }}
|
<strong>plus</strong> {{ rate }}% {{ taxname }}
|
||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
</small>
|
</small>
|
||||||
@@ -765,7 +765,7 @@
|
|||||||
{% if fee.tax_rate %}
|
{% if fee.tax_rate %}
|
||||||
<br/>
|
<br/>
|
||||||
<small>
|
<small>
|
||||||
{% blocktrans trimmed with rate=fee.tax_rate|floatformat:-2 taxname=fee.tax_rule.name|default:s_taxes %}
|
{% blocktrans trimmed with rate=fee.tax_rate|tax_rate_format taxname=fee.tax_rule.name|default:s_taxes %}
|
||||||
incl. {{ rate }}% {{ taxname }}
|
incl. {{ rate }}% {{ taxname }}
|
||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
</small>
|
</small>
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
<strong>{% trans "Pending total" %}</strong>
|
<strong>{% trans "Pending total" %}</strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 col-xs-6 col-md-offset-5 price">
|
<div class="col-md-3 col-xs-6 col-md-offset-5 price">
|
||||||
<strong>{{ order.pending_sum|money:event.currency }}</strong>
|
<strong>{{ pending_sum|money:event.currency }}</strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -903,7 +903,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td colspan="1"></td>
|
<td colspan="1"></td>
|
||||||
<td colspan="5">
|
<td colspan="5">
|
||||||
{{ p.html_info|safe }}
|
{{ p.html_info }}
|
||||||
{% if staff_session %}
|
{% if staff_session %}
|
||||||
<p>
|
<p>
|
||||||
<a href="" class="btn btn-default btn-xs admin-only" data-expandpayment data-id="{{ p.pk }}">
|
<a href="" class="btn btn-default btn-xs admin-only" data-expandpayment data-id="{{ p.pk }}">
|
||||||
@@ -1018,7 +1018,7 @@
|
|||||||
</dl>
|
</dl>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if r.html_info %}
|
{% if r.html_info %}
|
||||||
{{ r.html_info|safe }}
|
{{ r.html_info }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if staff_session %}
|
{% if staff_session %}
|
||||||
<p>
|
<p>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
|
{% load escapejson %}
|
||||||
{% block inner %}
|
{% block inner %}
|
||||||
<h1>{% trans "Connect to device:" %} {{ device.name }}</h1>
|
<h1>{% trans "Connect to device:" %} {{ device.name }}</h1>
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@
|
|||||||
{% trans "Open the app that you want to connect and optionally reset it to the original state." %}
|
{% trans "Open the app that you want to connect and optionally reset it to the original state." %}
|
||||||
</li>
|
</li>
|
||||||
<li>{% trans "Scan the following configuration code:" %}<br><br>
|
<li>{% trans "Scan the following configuration code:" %}<br><br>
|
||||||
<script type="text/json" data-replace-with-qr>{{ qrdata|safe }}</script><br>
|
<script type="application/json" data-replace-with-qr>{{ qrdata|escapejson_dumps }}</script><br>
|
||||||
{% trans "If your app/device does not support scanning a QR code, you can also enter the following information:" %}
|
{% trans "If your app/device does not support scanning a QR code, you can also enter the following information:" %}
|
||||||
<br>
|
<br>
|
||||||
<strong>{% trans "System URL:" %}</strong> <code id="system_url">{{ settings.SITE_URL }}</code>
|
<strong>{% trans "System URL:" %}</strong> <code id="system_url">{{ settings.SITE_URL }}</code>
|
||||||
|
|||||||
@@ -137,6 +137,15 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ d.software_brand|default_if_none:"" }} {{ d.software_version|default_if_none:"" }}
|
{{ d.software_brand|default_if_none:"" }} {{ d.software_version|default_if_none:"" }}
|
||||||
|
{% if staff_session %}
|
||||||
|
<details class="admin-only">
|
||||||
|
<summary>
|
||||||
|
<i class="fa fa-angle-down collapse-indicator"></i>
|
||||||
|
{% trans "Details" %}
|
||||||
|
</summary>
|
||||||
|
<pre class="admin-only">{{ d.info|pprint }}</pre>
|
||||||
|
</details>
|
||||||
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{% if d.initialized %}
|
{% if d.initialized %}
|
||||||
|
|||||||
@@ -4,24 +4,7 @@
|
|||||||
{% block title %}{% trans "Organizer logs" %}{% endblock %}
|
{% block title %}{% trans "Organizer logs" %}{% endblock %}
|
||||||
{% block inside %}
|
{% block inside %}
|
||||||
<h1>{% trans "Organizer logs" %}</h1>
|
<h1>{% trans "Organizer logs" %}</h1>
|
||||||
<form class="form-inline helper-display-inline" action="" method="get">
|
{% include "pretixcontrol/fragment_log_filter_form.html" %}
|
||||||
<input type="hidden" name="content_type" value="{{ request.GET.content_type }}">
|
|
||||||
<input type="hidden" name="object" value="{{ request.GET.object }}">
|
|
||||||
<p>
|
|
||||||
<select name="user" class="form-control">
|
|
||||||
<option value="">{% trans "All actions" %}</option>
|
|
||||||
{% for up in userlist %}
|
|
||||||
{% if up.user__id %}
|
|
||||||
<option value="{{ up.user__id }}"
|
|
||||||
{% if request.GET.user == up.user__id %}selected="selected"{% endif %}>
|
|
||||||
{{ up.user__email }}
|
|
||||||
</option>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
<button class="btn btn-primary" type="submit">{% trans "Filter" %}</button>
|
|
||||||
</p>
|
|
||||||
</form>
|
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
{% for log in logs %}
|
{% for log in logs %}
|
||||||
<li class="list-group-item logentry">
|
<li class="list-group-item logentry">
|
||||||
@@ -81,5 +64,5 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{% include "pretixcontrol/pagination.html" %}
|
{% include "pretixcontrol/pagination_huge.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -560,11 +560,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/plain" id="schema-url">{% static "schema/pdf-layout.schema.json" %}</script>
|
|
||||||
<script type="text/javascript" src="{% static "pdfjs/pdf.js" %}"></script>
|
<script type="text/javascript" src="{% static "pdfjs/pdf.js" %}"></script>
|
||||||
<script type="text/javascript" src="{% static "ajv/ajv2020.bundle.min.js" %}"></script>
|
|
||||||
<script type="text/javascript" src="{% static "fabric/fabric.min.js" %}"></script>
|
<script type="text/javascript" src="{% static "fabric/fabric.min.js" %}"></script>
|
||||||
<script type="text/javascript" src="{% static "pretixcontrol/js/ui/editor.js" %}"></script>
|
<script type="text/javascript" src="{% static "pretixcontrol/js/ui/editor.js" %}"></script>
|
||||||
|
<script type="text/javascript" src="{% static "schema/pdf-layout.validate.js" %}"></script>
|
||||||
<img src="{% static 'pretixpresale/pdf/powered_by_pretix_dark.png' %}" id="poweredby-dark" class="sr-only">
|
<img src="{% static 'pretixpresale/pdf/powered_by_pretix_dark.png' %}" id="poweredby-dark" class="sr-only">
|
||||||
<img src="{% static 'pretixpresale/pdf/powered_by_pretix_white.png' %}" id="poweredby-white" class="sr-only">
|
<img src="{% static 'pretixpresale/pdf/powered_by_pretix_white.png' %}" id="poweredby-white" class="sr-only">
|
||||||
{% for family, styles in fonts.items %}
|
{% for family, styles in fonts.items %}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{% extends "pretixcontrol/base.html" %}
|
{% extends "pretixcontrol/base.html" %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
|
{% load escapejson %}
|
||||||
{% block title %}{% trans "Add a two-factor authentication device" %}{% endblock %}
|
{% block title %}{% trans "Add a two-factor authentication device" %}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>{% trans "Add a two-factor authentication device" %}</h1>
|
<h1>{% trans "Add a two-factor authentication device" %}</h1>
|
||||||
@@ -32,7 +33,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
{% trans "Add a new account to the app by scanning the following barcode:" %}
|
{% trans "Add a new account to the app by scanning the following barcode:" %}
|
||||||
<div class="qrcode-canvas" data-qrdata="#qrdata"></div>
|
<script type="application/json" data-replace-with-qr>{{ qrdata|escapejson_dumps }}</script>
|
||||||
<p>
|
<p>
|
||||||
<a data-toggle="collapse" href="#no_scan">
|
<a data-toggle="collapse" href="#no_scan">
|
||||||
{% trans "Can't scan the barcode?" %}
|
{% trans "Can't scan the barcode?" %}
|
||||||
@@ -81,9 +82,4 @@
|
|||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<script type="text/json" id="qrdata">
|
|
||||||
{{ qrdata|safe }}
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load compress %}
|
{% load compress %}
|
||||||
|
{% load escapejson %}
|
||||||
{% block title %}{% trans "Add a two-factor authentication device" %}{% endblock %}
|
{% block title %}{% trans "Add a two-factor authentication device" %}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>{% trans "Add a two-factor authentication device" %}</h1>
|
<h1>{% trans "Add a two-factor authentication device" %}</h1>
|
||||||
@@ -26,9 +27,7 @@
|
|||||||
{% trans "Device registration failed." %}
|
{% trans "Device registration failed." %}
|
||||||
</div>
|
</div>
|
||||||
<script type="text/json" id="webauthn-enroll">
|
<script type="text/json" id="webauthn-enroll">
|
||||||
{{ jsondata|safe }}
|
{{ jsondata|escapejson }}
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
{% compress js %}
|
{% compress js %}
|
||||||
<script type="text/javascript" src="{% static "pretixcontrol/js/base64js.js" %}"></script>
|
<script type="text/javascript" src="{% static "pretixcontrol/js/base64js.js" %}"></script>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
{% load compress %}
|
{% load compress %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% load escapejson %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<form class="form-signin" id="webauthn-form" action="" method="post">
|
<form class="form-signin" id="webauthn-form" action="" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
@@ -43,7 +44,7 @@
|
|||||||
|
|
||||||
{% if jsondata %}
|
{% if jsondata %}
|
||||||
<script type="text/json" id="webauthn-login">
|
<script type="text/json" id="webauthn-login">
|
||||||
{{ jsondata|safe }}
|
{{ jsondata|escapejson }}
|
||||||
</script>
|
</script>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% compress js %}
|
{% compress js %}
|
||||||
|
|||||||
@@ -115,34 +115,34 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<th>
|
<th>
|
||||||
{% trans "Voucher code" %}
|
{% trans "Voucher code" %}
|
||||||
<a href="?{% url_replace request 'ordering' '-code' %}"><i class="fa fa-caret-down"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' '-code' %}"><i class="fa fa-caret-down"></i></a>
|
||||||
<a href="?{% url_replace request 'ordering' 'code' %}"><i class="fa fa-caret-up"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' 'code' %}"><i class="fa fa-caret-up"></i></a>
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
{% trans "Redemptions" %}
|
{% trans "Redemptions" %}
|
||||||
<a href="?{% url_replace request 'ordering' '-redeemed' %}"><i class="fa fa-caret-down"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' '-redeemed' %}"><i class="fa fa-caret-down"></i></a>
|
||||||
<a href="?{% url_replace request 'ordering' 'redeemed' %}"><i class="fa fa-caret-up"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' 'redeemed' %}"><i class="fa fa-caret-up"></i></a>
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
{% trans "Expiry" %}
|
{% trans "Expiry" %}
|
||||||
<a href="?{% url_replace request 'ordering' '-valid_until' %}"><i class="fa fa-caret-down"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' '-valid_until' %}"><i class="fa fa-caret-down"></i></a>
|
||||||
<a href="?{% url_replace request 'ordering' 'valid_until' %}"><i class="fa fa-caret-up"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' 'valid_until' %}"><i class="fa fa-caret-up"></i></a>
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
{% trans "Tag" %}
|
{% trans "Tag" %}
|
||||||
<a href="?{% url_replace request 'ordering' '-tag' %}"><i class="fa fa-caret-down"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' '-tag' %}"><i class="fa fa-caret-down"></i></a>
|
||||||
<a href="?{% url_replace request 'ordering' 'tag' %}"><i class="fa fa-caret-up"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' 'tag' %}"><i class="fa fa-caret-up"></i></a>
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
{% trans "Product" %}
|
{% trans "Product" %}
|
||||||
<a href="?{% url_replace request 'ordering' '-item' %}"><i class="fa fa-caret-down"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' '-item' %}"><i class="fa fa-caret-down"></i></a>
|
||||||
<a href="?{% url_replace request 'ordering' 'item' %}"><i class="fa fa-caret-up"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' 'item' %}"><i class="fa fa-caret-up"></i></a>
|
||||||
</th>
|
</th>
|
||||||
{% if request.event.has_subevents %}
|
{% if request.event.has_subevents %}
|
||||||
<th>
|
<th>
|
||||||
{% trans "Date" context "subevent" %}
|
{% trans "Date" context "subevent" %}
|
||||||
<a href="?{% url_replace request 'ordering' '-subevent' %}"><i class="fa fa-caret-down"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' '-subevent' %}"><i class="fa fa-caret-down"></i></a>
|
||||||
<a href="?{% url_replace request 'ordering' 'subevent' %}"><i class="fa fa-caret-up"></i></a>
|
<a href="?{% url_replace request 'filter-ordering' 'subevent' %}"><i class="fa fa-caret-up"></i></a>
|
||||||
</th>
|
</th>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<th></th>
|
<th></th>
|
||||||
|
|||||||
@@ -251,7 +251,7 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{% if e.voucher %}
|
{% if e.voucher %}
|
||||||
<a href="{% url "control:event.voucher" organizer=request.event.organizer.slug event=request.event.slug voucher=e.voucher.pk %}">
|
<a href="{% url "control:event.voucher" organizer=request.event.organizer.slug event=request.event.slug voucher=e.voucher.pk %}?next={{ request.get_full_path|urlencode }}">
|
||||||
{{ e.voucher }}
|
{{ e.voucher }}
|
||||||
</a>
|
</a>
|
||||||
{% elif not e.voucher and e.availability.0 == 100 and e.availability.1|default_if_none:"none" != "none" %}
|
{% elif not e.voucher and e.availability.0 == 100 and e.availability.1|default_if_none:"none" != "none" %}
|
||||||
|
|||||||
@@ -273,7 +273,8 @@ urlpatterns = [
|
|||||||
re_path(r'^$', dashboards.event_index, name='event.index'),
|
re_path(r'^$', dashboards.event_index, name='event.index'),
|
||||||
re_path(r'^qrcode.(?P<filetype>(png|jpeg|gif|svg))$', event.EventQRCode.as_view(), name='event.qrcode'),
|
re_path(r'^qrcode.(?P<filetype>(png|jpeg|gif|svg))$', event.EventQRCode.as_view(), name='event.qrcode'),
|
||||||
re_path(r'^widgets.json$', dashboards.event_index_widgets_lazy, name='event.index.widgets'),
|
re_path(r'^widgets.json$', dashboards.event_index_widgets_lazy, name='event.index.widgets'),
|
||||||
re_path(r'^logs/embed$', dashboards.event_index_log_lazy, name='event.index.logs'),
|
re_path(r'^dashboard/partials/logs$', dashboards.event_index_log_lazy, name='event.index.logs'),
|
||||||
|
re_path(r'^dashboard/partials/warnings$', dashboards.event_index_warnings_lazy, name='event.index.warnings'),
|
||||||
re_path(r'^live/$', event.EventLive.as_view(), name='event.live'),
|
re_path(r'^live/$', event.EventLive.as_view(), name='event.live'),
|
||||||
re_path(r'^transfer_session/$', event.EventTransferSession.as_view(), name='event.transfer_session'),
|
re_path(r'^transfer_session/$', event.EventTransferSession.as_view(), name='event.transfer_session'),
|
||||||
re_path(r'^logs/$', event.EventLog.as_view(), name='event.log'),
|
re_path(r'^logs/$', event.EventLog.as_view(), name='event.log'),
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ from pretix.base.forms.auth import (
|
|||||||
from pretix.base.metrics import pretix_failed_logins, pretix_successful_logins
|
from pretix.base.metrics import pretix_failed_logins, pretix_successful_logins
|
||||||
from pretix.base.models import TeamInvite, U2FDevice, User, WebAuthnDevice
|
from pretix.base.models import TeamInvite, U2FDevice, User, WebAuthnDevice
|
||||||
from pretix.helpers.http import get_client_ip, redirect_to_url
|
from pretix.helpers.http import get_client_ip, redirect_to_url
|
||||||
|
from pretix.helpers.ratelimit import rate_limit, rate_limit_reset
|
||||||
from pretix.helpers.security import handle_login_source, session_login
|
from pretix.helpers.security import handle_login_source, session_login
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -243,7 +244,8 @@ def invite(request, token):
|
|||||||
if request.user.is_authenticated:
|
if request.user.is_authenticated:
|
||||||
if inv.team.members.filter(pk=request.user.pk).exists():
|
if inv.team.members.filter(pk=request.user.pk).exists():
|
||||||
messages.error(request, _('You cannot accept the invitation for "{}" as you already are part of '
|
messages.error(request, _('You cannot accept the invitation for "{}" as you already are part of '
|
||||||
'this team.').format(inv.team.name))
|
'this team. If you want to add a different user or create a new account, '
|
||||||
|
'log out and click the invitation link again.').format(inv.team.name))
|
||||||
return redirect('control:index')
|
return redirect('control:index')
|
||||||
else:
|
else:
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
@@ -318,19 +320,12 @@ class Forgot(TemplateView):
|
|||||||
if self.form.is_valid():
|
if self.form.is_valid():
|
||||||
email = self.form.cleaned_data['email']
|
email = self.form.cleaned_data['email']
|
||||||
|
|
||||||
has_redis = settings.HAS_REDIS
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
user = User.objects.get(is_active=True, auth_backend='native', email__iexact=email)
|
user = User.objects.get(is_active=True, auth_backend='native', email__iexact=email)
|
||||||
|
|
||||||
if has_redis:
|
if rate_limit("pwreset", user.pk, max_num=1, expire_time=3600 * 24):
|
||||||
from django_redis import get_redis_connection
|
user.log_action('pretix.control.auth.user.forgot_password.denied.repeated')
|
||||||
rc = get_redis_connection("redis")
|
raise RepeatedResetDenied()
|
||||||
if rc.exists('pretix_pwreset_%s' % (user.id)):
|
|
||||||
user.log_action('pretix.control.auth.user.forgot_password.denied.repeated')
|
|
||||||
raise RepeatedResetDenied()
|
|
||||||
else:
|
|
||||||
rc.setex('pretix_pwreset_%s' % (user.id), 3600 * 24, '1')
|
|
||||||
|
|
||||||
except User.DoesNotExist:
|
except User.DoesNotExist:
|
||||||
logger.warning('Backend password reset for unregistered e-mail \"' + email + '\" requested.')
|
logger.warning('Backend password reset for unregistered e-mail \"' + email + '\" requested.')
|
||||||
@@ -343,6 +338,7 @@ class Forgot(TemplateView):
|
|||||||
user.log_action('pretix.control.auth.user.forgot_password.mail_sent')
|
user.log_action('pretix.control.auth.user.forgot_password.mail_sent')
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
|
has_redis = settings.HAS_REDIS
|
||||||
if has_redis:
|
if has_redis:
|
||||||
messages.info(request, _('If the address is registered to valid account, then we have sent you an email containing further instructions. '
|
messages.info(request, _('If the address is registered to valid account, then we have sent you an email containing further instructions. '
|
||||||
'Please note that we will send at most one email every 24 hours.'))
|
'Please note that we will send at most one email every 24 hours.'))
|
||||||
@@ -411,11 +407,7 @@ class Recover(TemplateView):
|
|||||||
messages.success(request, _('You can now login using your new password.'))
|
messages.success(request, _('You can now login using your new password.'))
|
||||||
user.log_action('pretix.control.auth.user.forgot_password.recovered')
|
user.log_action('pretix.control.auth.user.forgot_password.recovered')
|
||||||
|
|
||||||
has_redis = settings.HAS_REDIS
|
rate_limit_reset("pwreset", user.pk)
|
||||||
if has_redis:
|
|
||||||
from django_redis import get_redis_connection
|
|
||||||
rc = get_redis_connection("redis")
|
|
||||||
rc.delete('pretix_pwreset_%s' % user.id)
|
|
||||||
return redirect('control:auth.login')
|
return redirect('control:auth.login')
|
||||||
else:
|
else:
|
||||||
return self.get(request, *args, **kwargs)
|
return self.get(request, *args, **kwargs)
|
||||||
|
|||||||
@@ -484,10 +484,17 @@ class CheckinListView(EventPermissionRequiredMixin, PaginationMixin, ListView):
|
|||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = Checkin.all.filter(
|
qs = Checkin.all.filter(
|
||||||
list__event=self.request.event,
|
list_id__in=self.request.event.checkin_lists.values_list('id', flat=True),
|
||||||
).select_related(
|
|
||||||
'position', 'position__order', 'position__item', 'position__variation', 'position__subevent'
|
|
||||||
).prefetch_related(
|
).prefetch_related(
|
||||||
|
# For events with huge numbers of check-ins, prefetch_related is a lot more efficient than
|
||||||
|
# select_related, since it just needs to query one page size of positions instead of joining
|
||||||
|
# multiple huge tables during result computation
|
||||||
|
Prefetch(
|
||||||
|
'position',
|
||||||
|
queryset=OrderPosition.all.select_related(
|
||||||
|
'order', 'item', 'variation', 'subevent',
|
||||||
|
)
|
||||||
|
),
|
||||||
'list', 'gate', 'device'
|
'list', 'gate', 'device'
|
||||||
)
|
)
|
||||||
if self.filter_form.is_valid():
|
if self.filter_form.is_valid():
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ from django.shortcuts import render
|
|||||||
from django.template.loader import get_template
|
from django.template.loader import get_template
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.formats import date_format
|
from django.utils.formats import date_format
|
||||||
from django.utils.html import escape
|
from django.utils.html import conditional_escape, escape, format_html
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
from django.utils.translation import gettext_lazy as _, ngettext, pgettext
|
from django.utils.translation import gettext_lazy as _, ngettext, pgettext
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ def base_widgets(sender, subevent=None, lazy=False, **kwargs):
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
'content': None if lazy else NUM_WIDGET.format(num=intcomma(tickc), text=_('Attendees (ordered)')),
|
'content': None if lazy else format_html(NUM_WIDGET, num=intcomma(tickc), text=_('Attendees (ordered)')),
|
||||||
'lazy': 'attendees-ordered',
|
'lazy': 'attendees-ordered',
|
||||||
'display_size': 'small',
|
'display_size': 'small',
|
||||||
'priority': 100,
|
'priority': 100,
|
||||||
@@ -122,7 +122,7 @@ def base_widgets(sender, subevent=None, lazy=False, **kwargs):
|
|||||||
}) + ('?subevent={}'.format(subevent.pk) if subevent else '')
|
}) + ('?subevent={}'.format(subevent.pk) if subevent else '')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'content': None if lazy else NUM_WIDGET.format(num=intcomma(paidc), text=_('Attendees (paid)')),
|
'content': None if lazy else format_html(NUM_WIDGET, num=intcomma(paidc), text=_('Attendees (paid)')),
|
||||||
'lazy': 'attendees-paid',
|
'lazy': 'attendees-paid',
|
||||||
'display_size': 'small',
|
'display_size': 'small',
|
||||||
'priority': 100,
|
'priority': 100,
|
||||||
@@ -132,7 +132,8 @@ def base_widgets(sender, subevent=None, lazy=False, **kwargs):
|
|||||||
}) + ('?subevent={}'.format(subevent.pk) if subevent else '')
|
}) + ('?subevent={}'.format(subevent.pk) if subevent else '')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'content': None if lazy else NUM_WIDGET.format(
|
'content': None if lazy else format_html(
|
||||||
|
NUM_WIDGET,
|
||||||
num=money_filter(round_decimal(rev, sender.currency), sender.currency, hide_currency=True),
|
num=money_filter(round_decimal(rev, sender.currency), sender.currency, hide_currency=True),
|
||||||
text=_('Total revenue ({currency})').format(currency=sender.currency)
|
text=_('Total revenue ({currency})').format(currency=sender.currency)
|
||||||
),
|
),
|
||||||
@@ -145,7 +146,7 @@ def base_widgets(sender, subevent=None, lazy=False, **kwargs):
|
|||||||
}) + ('?subevent={}'.format(subevent.pk) if subevent else '')
|
}) + ('?subevent={}'.format(subevent.pk) if subevent else '')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'content': None if lazy else NUM_WIDGET.format(num=prodc, text=_('Active products')),
|
'content': None if lazy else format_html(NUM_WIDGET, num=prodc, text=_('Active products')),
|
||||||
'lazy': 'active-products',
|
'lazy': 'active-products',
|
||||||
'display_size': 'small',
|
'display_size': 'small',
|
||||||
'priority': 100,
|
'priority': 100,
|
||||||
@@ -209,8 +210,8 @@ def waitinglist_widgets(sender, subevent=None, lazy=False, **kwargs):
|
|||||||
quota_cache[q.pk] = (quota_cache[q.pk][0], quota_cache[q.pk][1] - min(wlt['cnt'], row[1]))
|
quota_cache[q.pk] = (quota_cache[q.pk][0], quota_cache[q.pk][1] - min(wlt['cnt'], row[1]))
|
||||||
|
|
||||||
widgets.append({
|
widgets.append({
|
||||||
'content': None if lazy else NUM_WIDGET.format(
|
'content': None if lazy else format_html(
|
||||||
num=intcomma(happy), text=_('available to give to people on waiting list')
|
NUM_WIDGET, num=intcomma(happy), text=_('available to give to people on waiting list')
|
||||||
),
|
),
|
||||||
'lazy': 'waitinglist-avail',
|
'lazy': 'waitinglist-avail',
|
||||||
'priority': 50,
|
'priority': 50,
|
||||||
@@ -220,7 +221,9 @@ def waitinglist_widgets(sender, subevent=None, lazy=False, **kwargs):
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
widgets.append({
|
widgets.append({
|
||||||
'content': None if lazy else NUM_WIDGET.format(num=intcomma(wles.count()), text=_('total waiting list length')),
|
'content': None if lazy else format_html(
|
||||||
|
NUM_WIDGET, num=intcomma(wles.count()), text=_('total waiting list length')
|
||||||
|
),
|
||||||
'lazy': 'waitinglist-length',
|
'lazy': 'waitinglist-length',
|
||||||
'display_size': 'small',
|
'display_size': 'small',
|
||||||
'priority': 50,
|
'priority': 50,
|
||||||
@@ -247,9 +250,10 @@ def quota_widgets(sender, subevent=None, lazy=False, **kwargs):
|
|||||||
if not lazy:
|
if not lazy:
|
||||||
status, left = qa.results[q] if q in qa.results else q.availability(allow_cache=True)
|
status, left = qa.results[q] if q in qa.results else q.availability(allow_cache=True)
|
||||||
widgets.append({
|
widgets.append({
|
||||||
'content': None if lazy else NUM_WIDGET.format(
|
'content': None if lazy else format_html(
|
||||||
|
NUM_WIDGET,
|
||||||
num='{}/{}'.format(intcomma(left), intcomma(q.size)) if q.size is not None else '\u221e',
|
num='{}/{}'.format(intcomma(left), intcomma(q.size)) if q.size is not None else '\u221e',
|
||||||
text=_('{quota} left').format(quota=escape(q.name))
|
text=format_html(_('{quota} left'), quota=q.name)
|
||||||
),
|
),
|
||||||
'lazy': 'quota-{}'.format(q.pk),
|
'lazy': 'quota-{}'.format(q.pk),
|
||||||
'display_size': 'small',
|
'display_size': 'small',
|
||||||
@@ -268,7 +272,8 @@ def shop_state_widget(sender, **kwargs):
|
|||||||
return [{
|
return [{
|
||||||
'display_size': 'small',
|
'display_size': 'small',
|
||||||
'priority': 1000,
|
'priority': 1000,
|
||||||
'content': '<div class="shopstate">{t1}<br><span class="{cls}"><span class="fa {icon}"></span> {state}</span>{t2}</div>'.format(
|
'content': format_html(
|
||||||
|
'<div class="shopstate">{t1}<br><span class="{cls}"><span class="fa {icon}"></span> {state}</span>{t2}</div>',
|
||||||
t1=_('Your ticket shop is'), t2=_('Click here to change'),
|
t1=_('Your ticket shop is'), t2=_('Click here to change'),
|
||||||
state=_('live') if sender.live and not sender.testmode else (
|
state=_('live') if sender.live and not sender.testmode else (
|
||||||
_('live and in test mode') if sender.live else (
|
_('live and in test mode') if sender.live else (
|
||||||
@@ -299,9 +304,10 @@ def checkin_widget(sender, subevent=None, lazy=False, **kwargs):
|
|||||||
qs = sender.checkin_lists.filter(subevent=subevent)
|
qs = sender.checkin_lists.filter(subevent=subevent)
|
||||||
for cl in qs:
|
for cl in qs:
|
||||||
widgets.append({
|
widgets.append({
|
||||||
'content': None if lazy else NUM_WIDGET.format(
|
'content': None if lazy else format_html(
|
||||||
|
NUM_WIDGET,
|
||||||
num='{}/{}'.format(intcomma(cl.inside_count), intcomma(cl.position_count)),
|
num='{}/{}'.format(intcomma(cl.inside_count), intcomma(cl.position_count)),
|
||||||
text=_('Present – {list}').format(list=escape(cl.name))
|
text=format_html(_('Present – {list}'), list=cl.name)
|
||||||
),
|
),
|
||||||
'lazy': 'checkin-{}'.format(cl.pk),
|
'lazy': 'checkin-{}'.format(cl.pk),
|
||||||
'display_size': 'small',
|
'display_size': 'small',
|
||||||
@@ -340,6 +346,12 @@ def welcome_wizard_widget(sender, **kwargs):
|
|||||||
}]
|
}]
|
||||||
|
|
||||||
|
|
||||||
|
def build_json_response(widgets):
|
||||||
|
for widget in widgets:
|
||||||
|
widget['content'] = conditional_escape(widget['content'])
|
||||||
|
return JsonResponse({'widgets': widgets})
|
||||||
|
|
||||||
|
|
||||||
def event_index(request, organizer, event):
|
def event_index(request, organizer, event):
|
||||||
from pretix.control.forms.event import CommentForm
|
from pretix.control.forms.event import CommentForm
|
||||||
|
|
||||||
@@ -367,6 +379,42 @@ def event_index(request, organizer, event):
|
|||||||
'comment_form': CommentForm(initial={'comment': request.event.comment}, readonly=not can_change_event_settings),
|
'comment_form': CommentForm(initial={'comment': request.event.comment}, readonly=not can_change_event_settings),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx['timeline'] = [
|
||||||
|
{
|
||||||
|
'date': t.datetime.astimezone(request.event.timezone).date(),
|
||||||
|
'entry': t,
|
||||||
|
'time': t.datetime.astimezone(request.event.timezone)
|
||||||
|
}
|
||||||
|
for t in timeline_for_event(request.event, subevent)
|
||||||
|
]
|
||||||
|
ctx['today'] = now().astimezone(request.event.timezone).date()
|
||||||
|
ctx['nearly_now'] = now().astimezone(request.event.timezone) - timedelta(seconds=20)
|
||||||
|
resp = render(request, 'pretixcontrol/event/index.html', ctx)
|
||||||
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
def event_index_widgets_lazy(request, organizer, event):
|
||||||
|
subevent = None
|
||||||
|
if request.GET.get("subevent", "") != "" and request.event.has_subevents:
|
||||||
|
i = request.GET.get("subevent", "")
|
||||||
|
try:
|
||||||
|
subevent = request.event.subevents.get(pk=i)
|
||||||
|
except SubEvent.DoesNotExist:
|
||||||
|
pass
|
||||||
|
|
||||||
|
widgets = []
|
||||||
|
for r, result in event_dashboard_widgets.send(sender=request.event, subevent=subevent, lazy=False):
|
||||||
|
widgets.extend(result)
|
||||||
|
|
||||||
|
return build_json_response(widgets)
|
||||||
|
|
||||||
|
|
||||||
|
def event_index_warnings_lazy(request, organizer, event):
|
||||||
|
can_view_orders = request.user.has_event_permission(request.organizer, request.event, 'event.orders:read',
|
||||||
|
request=request)
|
||||||
|
can_change_event_settings = request.user.has_event_permission(request.organizer, request.event,
|
||||||
|
'event.settings.general:write', request=request)
|
||||||
|
ctx = {}
|
||||||
ctx['has_overpaid_orders'] = can_view_orders and Order.annotate_overpayments(request.event.orders).filter(
|
ctx['has_overpaid_orders'] = can_view_orders and Order.annotate_overpayments(request.event.orders).filter(
|
||||||
Q(~Q(status=Order.STATUS_CANCELED) & Q(pending_sum_t__lt=0))
|
Q(~Q(status=Order.STATUS_CANCELED) & Q(pending_sum_t__lt=0))
|
||||||
| Q(Q(status=Order.STATUS_CANCELED) & Q(pending_sum_rc__lt=0))
|
| Q(Q(status=Order.STATUS_CANCELED) & Q(pending_sum_rc__lt=0))
|
||||||
@@ -390,35 +438,11 @@ def event_index(request, organizer, event):
|
|||||||
| Q(failed_attempts__gt=0)
|
| Q(failed_attempts__gt=0)
|
||||||
).exists()
|
).exists()
|
||||||
|
|
||||||
ctx['timeline'] = [
|
return render(
|
||||||
{
|
request,
|
||||||
'date': t.datetime.astimezone(request.event.timezone).date(),
|
'pretixcontrol/event/dashboard_partial_warnings.html',
|
||||||
'entry': t,
|
ctx
|
||||||
'time': t.datetime.astimezone(request.event.timezone)
|
)
|
||||||
}
|
|
||||||
for t in timeline_for_event(request.event, subevent)
|
|
||||||
]
|
|
||||||
ctx['today'] = now().astimezone(request.event.timezone).date()
|
|
||||||
ctx['nearly_now'] = now().astimezone(request.event.timezone) - timedelta(seconds=20)
|
|
||||||
resp = render(request, 'pretixcontrol/event/index.html', ctx)
|
|
||||||
# resp['Content-Security-Policy'] = "style-src 'unsafe-inline'"
|
|
||||||
return resp
|
|
||||||
|
|
||||||
|
|
||||||
def event_index_widgets_lazy(request, organizer, event):
|
|
||||||
subevent = None
|
|
||||||
if request.GET.get("subevent", "") != "" and request.event.has_subevents:
|
|
||||||
i = request.GET.get("subevent", "")
|
|
||||||
try:
|
|
||||||
subevent = request.event.subevents.get(pk=i)
|
|
||||||
except SubEvent.DoesNotExist:
|
|
||||||
pass
|
|
||||||
|
|
||||||
widgets = []
|
|
||||||
for r, result in event_dashboard_widgets.send(sender=request.event, subevent=subevent, lazy=False):
|
|
||||||
widgets.extend(result)
|
|
||||||
|
|
||||||
return JsonResponse({'widgets': widgets})
|
|
||||||
|
|
||||||
|
|
||||||
def event_index_log_lazy(request, organizer, event):
|
def event_index_log_lazy(request, organizer, event):
|
||||||
@@ -453,7 +477,7 @@ def event_index_log_lazy(request, organizer, event):
|
|||||||
|
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
'pretixcontrol/event/logs_embed.html',
|
'pretixcontrol/event/dashboard_partial_logs.html',
|
||||||
{
|
{
|
||||||
'logs': qs[:5]
|
'logs': qs[:5]
|
||||||
}
|
}
|
||||||
@@ -505,7 +529,7 @@ def widgets_for_event_qs(request, qs, user, nmax, lazy=False):
|
|||||||
<a href="{url}" class="event">
|
<a href="{url}" class="event">
|
||||||
<div class="name">{event}</div>
|
<div class="name">{event}</div>
|
||||||
<div class="daterange">{daterange}</div>
|
<div class="daterange">{daterange}</div>
|
||||||
<div class="times">{times}</div>
|
<div class="times">{times}{timezone}</div>
|
||||||
</a>
|
</a>
|
||||||
<div class="bottomrow">
|
<div class="bottomrow">
|
||||||
{orders}
|
{orders}
|
||||||
@@ -549,14 +573,16 @@ def widgets_for_event_qs(request, qs, user, nmax, lazy=False):
|
|||||||
status = ('success', _('On sale'))
|
status = ('success', _('On sale'))
|
||||||
|
|
||||||
widgets.append({
|
widgets.append({
|
||||||
'content': tpl.format(
|
'content': format_html(
|
||||||
|
tpl,
|
||||||
event=escape(event.name),
|
event=escape(event.name),
|
||||||
times=_('Event series') if event.has_subevents else (
|
times=_('Event series') if event.has_subevents else (
|
||||||
((date_format(event.date_admission.astimezone(tz), 'TIME_FORMAT') + ' / ')
|
((date_format(event.date_admission.astimezone(tz), 'TIME_FORMAT') + ' / ')
|
||||||
if event.date_admission and event.date_admission != event.date_from else '')
|
if event.date_admission and event.date_admission != event.date_from else '')
|
||||||
+ (date_format(event.date_from.astimezone(tz), 'TIME_FORMAT') if event.date_from else '')
|
+ (date_format(event.date_from.astimezone(tz), 'TIME_FORMAT') if event.date_from else '')
|
||||||
) + (
|
),
|
||||||
' <span class="fa fa-globe text-muted" data-toggle="tooltip" title="{}"></span>'.format(tzname)
|
timezone=(
|
||||||
|
format_html(' <span class="fa fa-globe text-muted" data-toggle="tooltip" title="{}"></span>', tzname)
|
||||||
if tzname != request.timezone and not event.has_subevents else ''
|
if tzname != request.timezone and not event.has_subevents else ''
|
||||||
),
|
),
|
||||||
url=reverse('control:event.index', kwargs={
|
url=reverse('control:event.index', kwargs={
|
||||||
@@ -564,7 +590,8 @@ def widgets_for_event_qs(request, qs, user, nmax, lazy=False):
|
|||||||
'organizer': event.organizer.slug
|
'organizer': event.organizer.slug
|
||||||
}),
|
}),
|
||||||
orders=(
|
orders=(
|
||||||
'<a href="{orders_url}" class="orders">{orders_text}</a>'.format(
|
format_html(
|
||||||
|
'<a href="{orders_url}" class="orders">{orders_text}</a>',
|
||||||
orders_url=reverse('control:event.orders', kwargs={
|
orders_url=reverse('control:event.orders', kwargs={
|
||||||
'event': event.slug,
|
'event': event.slug,
|
||||||
'organizer': event.organizer.slug
|
'organizer': event.organizer.slug
|
||||||
@@ -631,7 +658,7 @@ def user_index_widgets_lazy(request):
|
|||||||
request.user,
|
request.user,
|
||||||
8
|
8
|
||||||
)
|
)
|
||||||
return JsonResponse({'widgets': widgets})
|
return build_json_response(widgets)
|
||||||
|
|
||||||
|
|
||||||
def user_index(request):
|
def user_index(request):
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ from collections import OrderedDict, defaultdict
|
|||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from itertools import groupby
|
from itertools import groupby
|
||||||
from urllib.parse import urlsplit
|
from urllib.parse import quote, urlsplit
|
||||||
from zoneinfo import ZoneInfo
|
from zoneinfo import ZoneInfo
|
||||||
|
|
||||||
import bleach
|
import bleach
|
||||||
@@ -60,7 +60,7 @@ from django.http import (
|
|||||||
Http404, HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed,
|
Http404, HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed,
|
||||||
JsonResponse,
|
JsonResponse,
|
||||||
)
|
)
|
||||||
from django.shortcuts import get_object_or_404, redirect
|
from django.shortcuts import redirect
|
||||||
from django.urls import NoReverseMatch, reverse
|
from django.urls import NoReverseMatch, reverse
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.html import conditional_escape, format_html
|
from django.utils.html import conditional_escape, format_html
|
||||||
@@ -82,7 +82,7 @@ from pretix.base.models import Event, LogEntry, Order, TaxRule, Voucher
|
|||||||
from pretix.base.models.event import EventMetaValue
|
from pretix.base.models.event import EventMetaValue
|
||||||
from pretix.base.services import tickets
|
from pretix.base.services import tickets
|
||||||
from pretix.base.services.invoices import build_preview_invoice_pdf
|
from pretix.base.services.invoices import build_preview_invoice_pdf
|
||||||
from pretix.base.signals import register_ticket_outputs
|
from pretix.base.signals import get_defining_app, register_ticket_outputs
|
||||||
from pretix.base.templatetags.rich_text import markdown_compile_email
|
from pretix.base.templatetags.rich_text import markdown_compile_email
|
||||||
from pretix.control.forms.event import (
|
from pretix.control.forms.event import (
|
||||||
CancelSettingsForm, CommentForm, ConfirmTextFormset, EventDeleteForm,
|
CancelSettingsForm, CommentForm, ConfirmTextFormset, EventDeleteForm,
|
||||||
@@ -119,8 +119,9 @@ from ...helpers.compat import CompatDeleteView
|
|||||||
from ...helpers.format import (
|
from ...helpers.format import (
|
||||||
PlainHtmlAlternativeString, SafeFormatter, format_map,
|
PlainHtmlAlternativeString, SafeFormatter, format_map,
|
||||||
)
|
)
|
||||||
|
from ..forms.filter import LogFilterForm
|
||||||
from ..logdisplay import OVERVIEW_BANLIST
|
from ..logdisplay import OVERVIEW_BANLIST
|
||||||
from . import CreateView, PaginationMixin, UpdateView
|
from . import CreateView, LargeResultSetPaginator, PaginationMixin, UpdateView
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -441,6 +442,7 @@ class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, Templat
|
|||||||
plugins_available = {
|
plugins_available = {
|
||||||
p.module: p for p in self.available_plugins(self.object)
|
p.module: p for p in self.available_plugins(self.object)
|
||||||
}
|
}
|
||||||
|
plugin_enabled = None
|
||||||
|
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
save_organizer = False
|
save_organizer = False
|
||||||
@@ -490,6 +492,7 @@ class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, Templat
|
|||||||
format_html(_('The plugin {} is now active.'),
|
format_html(_('The plugin {} is now active.'),
|
||||||
format_html("<strong>{}</strong>", pluginmeta.name)),
|
format_html("<strong>{}</strong>", pluginmeta.name)),
|
||||||
]
|
]
|
||||||
|
plugin_enabled = module
|
||||||
messages.success(self.request, mark_safe("".join(info)))
|
messages.success(self.request, mark_safe("".join(info)))
|
||||||
else:
|
else:
|
||||||
self.request.event.log_action('pretix.event.plugins.disabled', user=self.request.user,
|
self.request.event.log_action('pretix.event.plugins.disabled', user=self.request.user,
|
||||||
@@ -499,13 +502,19 @@ class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, Templat
|
|||||||
self.object.save()
|
self.object.save()
|
||||||
if save_organizer:
|
if save_organizer:
|
||||||
self.object.organizer.save()
|
self.object.organizer.save()
|
||||||
return redirect(self.get_success_url())
|
return redirect(self.get_success_url(plugin_enabled))
|
||||||
|
|
||||||
def get_success_url(self) -> str:
|
def get_success_url(self, plugin_enabled) -> str:
|
||||||
return reverse('control:event.settings.plugins', kwargs={
|
if plugin_enabled and self.request.POST.get('go') == 'payment':
|
||||||
'organizer': self.request.organizer.slug,
|
return reverse('control:event.settings.payment', kwargs={
|
||||||
'event': self.request.event.slug,
|
'organizer': self.request.organizer.slug,
|
||||||
})
|
'event': self.request.event.slug,
|
||||||
|
}) + '?highlight=' + quote(plugin_enabled) + '#'
|
||||||
|
else:
|
||||||
|
return reverse('control:event.settings.plugins', kwargs={
|
||||||
|
'organizer': self.request.organizer.slug,
|
||||||
|
'event': self.request.event.slug,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
class PaymentProviderSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, TemplateView, SingleObjectMixin):
|
class PaymentProviderSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, TemplateView, SingleObjectMixin):
|
||||||
@@ -671,6 +680,8 @@ class PaymentSettings(WritePermissionMixin, EventSettingsViewMixin, EventSetting
|
|||||||
p.sales_channels = [sales_channels[channel] for channel in p.settings.get('_restrict_to_sales_channels', as_type=list, default=['web'])]
|
p.sales_channels = [sales_channels[channel] for channel in p.settings.get('_restrict_to_sales_channels', as_type=list, default=['web'])]
|
||||||
if p.is_meta:
|
if p.is_meta:
|
||||||
p.show_enabled = p.settings._enabled in (True, 'True')
|
p.show_enabled = p.settings._enabled in (True, 'True')
|
||||||
|
if self.request.GET.get('highlight') and getattr(get_defining_app(p), 'name', None) == self.request.GET.get('highlight'):
|
||||||
|
p.highlight = True
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
@@ -952,7 +963,12 @@ class MailSettingsRendererPreview(MailSettingsPreview):
|
|||||||
context=context,
|
context=context,
|
||||||
)
|
)
|
||||||
r = HttpResponse(v, content_type='text/html')
|
r = HttpResponse(v, content_type='text/html')
|
||||||
r._csp_ignore = True
|
r['Content-Security-Policy'] = (
|
||||||
|
# Plugin-provided email templates will contain inline styles or remote images
|
||||||
|
# but emails should not contain JS
|
||||||
|
"style-src 'unsafe-inline'; "
|
||||||
|
"img-src https: data:"
|
||||||
|
)
|
||||||
return r
|
return r
|
||||||
else:
|
else:
|
||||||
raise Http404(_('Unknown email renderer.'))
|
raise Http404(_('Unknown email renderer.'))
|
||||||
@@ -1238,6 +1254,7 @@ class EventDelete(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixi
|
|||||||
class EventLog(EventPermissionRequiredMixin, PaginationMixin, ListView):
|
class EventLog(EventPermissionRequiredMixin, PaginationMixin, ListView):
|
||||||
template_name = 'pretixcontrol/event/logs.html'
|
template_name = 'pretixcontrol/event/logs.html'
|
||||||
model = LogEntry
|
model = LogEntry
|
||||||
|
paginator_class = LargeResultSetPaginator
|
||||||
context_object_name = 'logs'
|
context_object_name = 'logs'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
@@ -1267,32 +1284,20 @@ class EventLog(EventPermissionRequiredMixin, PaginationMixin, ListView):
|
|||||||
]
|
]
|
||||||
qs = qs.filter(content_type__in=allowed_types)
|
qs = qs.filter(content_type__in=allowed_types)
|
||||||
|
|
||||||
if self.request.GET.get('user') == 'yes':
|
if self.filter_form.is_valid():
|
||||||
qs = qs.filter(user__isnull=False)
|
qs = self.filter_form.filter_qs(qs)
|
||||||
elif self.request.GET.get('user') == 'no':
|
|
||||||
qs = qs.filter(user__isnull=True)
|
|
||||||
elif self.request.GET.get('user', '').startswith('d-'):
|
|
||||||
qs = qs.filter(device_id=self.request.GET.get('user')[2:])
|
|
||||||
elif self.request.GET.get('user'):
|
|
||||||
qs = qs.filter(user_id=self.request.GET.get('user'))
|
|
||||||
|
|
||||||
if self.request.GET.get('action_type'):
|
|
||||||
qs = qs.filter(action_type=self.request.GET['action_type'])
|
|
||||||
|
|
||||||
if self.request.GET.get('content_type'):
|
|
||||||
qs = qs.filter(content_type=get_object_or_404(ContentType, pk=self.request.GET.get('content_type')))
|
|
||||||
|
|
||||||
if self.request.GET.get('object'):
|
|
||||||
qs = qs.filter(object_id=self.request.GET.get('object'))
|
|
||||||
|
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
ctx = super().get_context_data()
|
ctx = super().get_context_data()
|
||||||
ctx['userlist'] = self.request.event.logentry_set.order_by().distinct().values('user__id', 'user__email')
|
ctx['filter_form'] = self.filter_form
|
||||||
ctx['devicelist'] = self.request.event.logentry_set.order_by('device__name').distinct().values('device__id', 'device__name')
|
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def filter_form(self):
|
||||||
|
return LogFilterForm(data=self.request.GET, organizer=self.request.organizer)
|
||||||
|
|
||||||
|
|
||||||
class EventComment(EventPermissionRequiredMixin, View):
|
class EventComment(EventPermissionRequiredMixin, View):
|
||||||
permission = 'event.settings.general:write'
|
permission = 'event.settings.general:write'
|
||||||
@@ -1563,7 +1568,7 @@ class WidgetSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, FormV
|
|||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
|
||||||
class QuickSetupView(FormView):
|
class QuickSetupView(EventPermissionRequiredMixin, FormView):
|
||||||
template_name = 'pretixcontrol/event/quick_setup.html'
|
template_name = 'pretixcontrol/event/quick_setup.html'
|
||||||
permission = 'event.settings.general:write'
|
permission = 'event.settings.general:write'
|
||||||
form_class = QuickSetupForm
|
form_class = QuickSetupForm
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ from django.utils.translation import ngettext
|
|||||||
from django.views import View
|
from django.views import View
|
||||||
from django.views.generic import DetailView, ListView
|
from django.views.generic import DetailView, ListView
|
||||||
|
|
||||||
from pretix.base.middleware import _merge_csp, _parse_csp, _render_csp
|
from pretix.base.middleware import add_to_response_csp
|
||||||
from pretix.base.models import OutgoingMail
|
from pretix.base.models import OutgoingMail
|
||||||
from pretix.base.services.mail import mail_send_task
|
from pretix.base.services.mail import mail_send_task
|
||||||
from pretix.control.forms.filter import OutgoingMailFilterForm
|
from pretix.control.forms.filter import OutgoingMailFilterForm
|
||||||
@@ -108,18 +108,12 @@ class OutgoingMailDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequir
|
|||||||
|
|
||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
response = super().dispatch(request, *args, **kwargs)
|
response = super().dispatch(request, *args, **kwargs)
|
||||||
if 'Content-Security-Policy' in response:
|
add_to_response_csp(response, {
|
||||||
h = _parse_csp(response['Content-Security-Policy'])
|
|
||||||
else:
|
|
||||||
h = {}
|
|
||||||
csps = {
|
|
||||||
'frame-src': ['data:'],
|
'frame-src': ['data:'],
|
||||||
# Unfortuantely, we can't avoid unsafe-inline for style here.
|
# Unfortuantely, we can't avoid unsafe-inline for style here.
|
||||||
# See outgoingmail.js for the protection measures we take.
|
# See outgoingmail.js for the protection measures we take.
|
||||||
'style-src': ["'unsafe-inline'"],
|
'style-src': ["'unsafe-inline'"],
|
||||||
}
|
})
|
||||||
_merge_csp(h, csps)
|
|
||||||
response['Content-Security-Policy'] = _render_csp(h)
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
|
|||||||
@@ -41,6 +41,30 @@ from pretix.control.forms.mailsetup import SimpleMailForm, SMTPMailForm
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def get_cname_record(hostname):
|
||||||
|
try:
|
||||||
|
r = dns.resolver.Resolver()
|
||||||
|
answers = r.resolve(hostname, 'CNAME')
|
||||||
|
answers = list(answers)
|
||||||
|
if len(answers) != 1:
|
||||||
|
logger.exception('Found multiple CNAME records for {}'.format(hostname))
|
||||||
|
return
|
||||||
|
return str(answers[0].target).lower()
|
||||||
|
except:
|
||||||
|
logger.exception('Could not fetch CNAME record for {}'.format(hostname))
|
||||||
|
|
||||||
|
|
||||||
|
def get_dmarc_record(hostname):
|
||||||
|
try:
|
||||||
|
r = dns.resolver.Resolver()
|
||||||
|
for resp in r.resolve("_dmarc." + hostname, 'TXT'):
|
||||||
|
data = b''.join(resp.strings).decode()
|
||||||
|
if 'DMARC1' in data.strip():
|
||||||
|
return data
|
||||||
|
except:
|
||||||
|
logger.exception("Could not fetch DMARC record for {}".format(hostname))
|
||||||
|
|
||||||
|
|
||||||
def get_spf_record(hostname):
|
def get_spf_record(hostname):
|
||||||
try:
|
try:
|
||||||
r = dns.resolver.Resolver()
|
r = dns.resolver.Resolver()
|
||||||
@@ -49,7 +73,7 @@ def get_spf_record(hostname):
|
|||||||
if data.lower().strip().startswith('v=spf1 '): # RFC7208, section 4.5
|
if data.lower().strip().startswith('v=spf1 '): # RFC7208, section 4.5
|
||||||
return data
|
return data
|
||||||
except:
|
except:
|
||||||
logger.exception("Could not fetch SPF record")
|
logger.exception("Could not fetch SPF record for {}".format(hostname))
|
||||||
|
|
||||||
|
|
||||||
def _check_spf_record(not_found_lookup_parts, spf_record, depth):
|
def _check_spf_record(not_found_lookup_parts, spf_record, depth):
|
||||||
@@ -168,10 +192,15 @@ class MailSettingsSetupView(TemplateView):
|
|||||||
return super().get(request, *args, **kwargs)
|
return super().get(request, *args, **kwargs)
|
||||||
|
|
||||||
session_key = f'sender_mail_verification_code_{self.request.path}_{self.simple_form.cleaned_data.get("mail_from")}'
|
session_key = f'sender_mail_verification_code_{self.request.path}_{self.simple_form.cleaned_data.get("mail_from")}'
|
||||||
|
verify_dns = (
|
||||||
|
settings.MAIL_CUSTOM_SENDER_SPF_STRING or
|
||||||
|
(settings.MAIL_CUSTOM_SENDER_DKIM_CNAME and settings.MAIL_CUSTOM_SENDER_DKIM_SELECTOR) or
|
||||||
|
settings.MAIL_CUSTOM_SENDER_DMARC_REQUIRED
|
||||||
|
)
|
||||||
allow_save = (
|
allow_save = (
|
||||||
(not settings.MAIL_CUSTOM_SENDER_VERIFICATION_REQUIRED or
|
(not settings.MAIL_CUSTOM_SENDER_VERIFICATION_REQUIRED or
|
||||||
('verification' in self.request.POST and self.request.POST.get('verification', '') == self.request.session.get(session_key, None))) and
|
('verification' in self.request.POST and self.request.POST.get('verification', '') == self.request.session.get(session_key, None))) and
|
||||||
(not settings.MAIL_CUSTOM_SENDER_SPF_STRING or self.request.POST.get('state') == 'save')
|
(not verify_dns or self.request.POST.get('state') == 'save')
|
||||||
)
|
)
|
||||||
|
|
||||||
if allow_save:
|
if allow_save:
|
||||||
@@ -192,8 +221,8 @@ class MailSettingsSetupView(TemplateView):
|
|||||||
|
|
||||||
spf_warning = None
|
spf_warning = None
|
||||||
spf_record = None
|
spf_record = None
|
||||||
|
hostname = self.simple_form.cleaned_data['mail_from'].split('@')[-1]
|
||||||
if settings.MAIL_CUSTOM_SENDER_SPF_STRING:
|
if settings.MAIL_CUSTOM_SENDER_SPF_STRING:
|
||||||
hostname = self.simple_form.cleaned_data['mail_from'].split('@')[-1]
|
|
||||||
spf_record = get_spf_record(hostname)
|
spf_record = get_spf_record(hostname)
|
||||||
if not spf_record:
|
if not spf_record:
|
||||||
spf_warning = _(
|
spf_warning = _(
|
||||||
@@ -210,7 +239,43 @@ class MailSettingsSetupView(TemplateView):
|
|||||||
'this system in the SPF record.'
|
'this system in the SPF record.'
|
||||||
)
|
)
|
||||||
|
|
||||||
verification = settings.MAIL_CUSTOM_SENDER_VERIFICATION_REQUIRED and not spf_warning
|
dkim_warning = None
|
||||||
|
dkim_hostname = None
|
||||||
|
dkim_cname = None
|
||||||
|
if settings.MAIL_CUSTOM_SENDER_DKIM_CNAME and settings.MAIL_CUSTOM_SENDER_DKIM_SELECTOR:
|
||||||
|
dkim_hostname = settings.MAIL_CUSTOM_SENDER_DKIM_SELECTOR + '._domainkey.' + hostname
|
||||||
|
cname_target = get_cname_record(dkim_hostname)
|
||||||
|
dkim_cname = settings.MAIL_CUSTOM_SENDER_DKIM_CNAME
|
||||||
|
if not dkim_cname.endswith("."):
|
||||||
|
dkim_cname += "."
|
||||||
|
if "%s" in dkim_cname:
|
||||||
|
dkim_cname = dkim_cname.replace("%s", hostname.replace(".", "-").lower())
|
||||||
|
if not cname_target:
|
||||||
|
dkim_warning = _(
|
||||||
|
'We could not find a CNAME record pointing to our DKIM key for domain you are trying to use. '
|
||||||
|
'This means that there is a very high change most of the emails will be rejected or marked as '
|
||||||
|
'spam. We strongly recommend setting up DKIM through a CNAME record. You can do so through the '
|
||||||
|
'DNS settings at the provider you registered your domain with.'
|
||||||
|
)
|
||||||
|
elif cname_target != dkim_cname:
|
||||||
|
dkim_warning = _(
|
||||||
|
'We found a CNAME record for a DKIM key, but it is not pointing to the right location. '
|
||||||
|
'This means that there is a very high chance most of the emails will be rejected or marked as '
|
||||||
|
'spam. You should update the DNS settings of your domain.'
|
||||||
|
)
|
||||||
|
|
||||||
|
dmarc_warning = None
|
||||||
|
dmarc_record = None
|
||||||
|
if settings.MAIL_CUSTOM_SENDER_DMARC_REQUIRED:
|
||||||
|
dmarc_record = get_dmarc_record(hostname)
|
||||||
|
if not dmarc_record:
|
||||||
|
spf_warning = _(
|
||||||
|
'We did not find DMARC record for your domain. This means that there is a very high chance '
|
||||||
|
'most of the emails will be rejected or marked as spam. You should update the DNS settings '
|
||||||
|
'of your domain.'
|
||||||
|
)
|
||||||
|
|
||||||
|
verification = settings.MAIL_CUSTOM_SENDER_VERIFICATION_REQUIRED and not spf_warning and not dkim_warning and not dmarc_warning
|
||||||
if verification:
|
if verification:
|
||||||
if 'verification' in self.request.POST:
|
if 'verification' in self.request.POST:
|
||||||
messages.error(request, _('The verification code was incorrect, please try again.'))
|
messages.error(request, _('The verification code was incorrect, please try again.'))
|
||||||
@@ -241,6 +306,12 @@ class MailSettingsSetupView(TemplateView):
|
|||||||
'spf_warning': spf_warning,
|
'spf_warning': spf_warning,
|
||||||
'spf_record': spf_record,
|
'spf_record': spf_record,
|
||||||
'spf_key': settings.MAIL_CUSTOM_SENDER_SPF_STRING,
|
'spf_key': settings.MAIL_CUSTOM_SENDER_SPF_STRING,
|
||||||
|
'dkim_warning': dkim_warning,
|
||||||
|
'dkim_hostname': dkim_hostname,
|
||||||
|
'dkim_cname': dkim_cname,
|
||||||
|
'dmarc_warning': dmarc_warning,
|
||||||
|
'dmarc_record': dmarc_record,
|
||||||
|
'hostname': hostname,
|
||||||
'recp': self.simple_form.cleaned_data.get('mail_from')
|
'recp': self.simple_form.cleaned_data.get('mail_from')
|
||||||
},
|
},
|
||||||
using=self.template_engine,
|
using=self.template_engine,
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ from django.urls import reverse
|
|||||||
from django.utils import formats
|
from django.utils import formats
|
||||||
from django.utils.formats import date_format, get_format
|
from django.utils.formats import date_format, get_format
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.html import conditional_escape, escape
|
from django.utils.html import conditional_escape, escape, format_html
|
||||||
from django.utils.http import url_has_allowed_host_and_scheme
|
from django.utils.http import url_has_allowed_host_and_scheme
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.utils.timezone import make_aware, now
|
from django.utils.timezone import make_aware, now
|
||||||
@@ -79,9 +79,9 @@ from pretix.base.email import get_email_context
|
|||||||
from pretix.base.exporter import MultiSheetListExporter
|
from pretix.base.exporter import MultiSheetListExporter
|
||||||
from pretix.base.i18n import language
|
from pretix.base.i18n import language
|
||||||
from pretix.base.models import (
|
from pretix.base.models import (
|
||||||
CachedFile, CachedTicket, Checkin, Invoice, InvoiceAddress, Item,
|
CachedFile, CachedTicket, Checkin, GiftCard, Invoice, InvoiceAddress, Item,
|
||||||
ItemVariation, LogEntry, Order, QuestionAnswer, Quota,
|
ItemVariation, LogEntry, Order, QuestionAnswer, Quota,
|
||||||
ScheduledEventExport, generate_secret,
|
ScheduledEventExport, SeatCategoryMapping, generate_secret,
|
||||||
)
|
)
|
||||||
from pretix.base.models.orders import (
|
from pretix.base.models.orders import (
|
||||||
CancellationRequest, OrderFee, OrderPayment, OrderPosition, OrderRefund,
|
CancellationRequest, OrderFee, OrderPayment, OrderPosition, OrderRefund,
|
||||||
@@ -551,10 +551,10 @@ class OrderDetail(OrderView):
|
|||||||
ctx['refunds'] = self.order.refunds.select_related('payment').order_by('-created')
|
ctx['refunds'] = self.order.refunds.select_related('payment').order_by('-created')
|
||||||
for p in ctx['payments']:
|
for p in ctx['payments']:
|
||||||
if p.payment_provider:
|
if p.payment_provider:
|
||||||
p.html_info = (p.payment_provider.payment_control_render(self.request, p) or "").strip()
|
p.html_info = p.payment_provider.payment_control_render(self.request, p) or ""
|
||||||
for r in ctx['refunds']:
|
for r in ctx['refunds']:
|
||||||
if r.payment_provider:
|
if r.payment_provider:
|
||||||
r.html_info = (r.payment_provider.refund_control_render(self.request, r) or "").strip()
|
r.html_info = r.payment_provider.refund_control_render(self.request, r) or ""
|
||||||
ctx['invoices'] = list(self.order.invoices.all().select_related('event'))
|
ctx['invoices'] = list(self.order.invoices.all().select_related('event'))
|
||||||
ctx['comment_form'] = CommentForm(initial={
|
ctx['comment_form'] = CommentForm(initial={
|
||||||
'comment': self.order.comment,
|
'comment': self.order.comment,
|
||||||
@@ -564,10 +564,11 @@ class OrderDetail(OrderView):
|
|||||||
})
|
})
|
||||||
ctx['display_locale'] = dict(settings.LANGUAGES)[self.object.locale or self.request.event.settings.locale]
|
ctx['display_locale'] = dict(settings.LANGUAGES)[self.object.locale or self.request.event.settings.locale]
|
||||||
|
|
||||||
ctx['overpaid'] = self.order.pending_sum * -1
|
pending_sum = self.order.pending_sum
|
||||||
|
ctx['overpaid'] = pending_sum * -1
|
||||||
ctx['download_buttons'] = self.download_buttons
|
ctx['download_buttons'] = self.download_buttons
|
||||||
ctx['payment_refund_sum'] = self.order.payment_refund_sum
|
ctx['payment_refund_sum'] = self.order.payment_refund_sum
|
||||||
ctx['pending_sum'] = self.order.pending_sum
|
ctx['pending_sum'] = pending_sum
|
||||||
ctx['uncancelled_invoice'] = self.order.invoices.exclude(
|
ctx['uncancelled_invoice'] = self.order.invoices.exclude(
|
||||||
Exists(self.order.invoices.filter(refers=OuterRef('pk'), is_cancellation=True))
|
Exists(self.order.invoices.filter(refers=OuterRef('pk'), is_cancellation=True))
|
||||||
).exclude(is_cancellation=True).first()
|
).exclude(is_cancellation=True).first()
|
||||||
@@ -601,8 +602,9 @@ class OrderDetail(OrderView):
|
|||||||
).prefetch_related(
|
).prefetch_related(
|
||||||
'item__questions', 'issued_gift_cards', 'owned_gift_cards', 'linked_media',
|
'item__questions', 'issued_gift_cards', 'owned_gift_cards', 'linked_media',
|
||||||
Prefetch('answers', queryset=QuestionAnswer.objects.prefetch_related('options').select_related('question')),
|
Prefetch('answers', queryset=QuestionAnswer.objects.prefetch_related('options').select_related('question')),
|
||||||
Prefetch('all_checkins', queryset=Checkin.all.select_related('list').order_by('datetime')),
|
Prefetch('all_checkins', queryset=Checkin.all.select_related('list', 'gate').order_by('datetime')),
|
||||||
Prefetch('print_logs', queryset=PrintLog.objects.select_related('device').order_by('datetime')),
|
Prefetch('print_logs', queryset=PrintLog.objects.select_related('device').order_by('datetime')),
|
||||||
|
Prefetch('subevent', queryset=self.request.event.subevents.all()),
|
||||||
).order_by('positionid')
|
).order_by('positionid')
|
||||||
|
|
||||||
positions = []
|
positions = []
|
||||||
@@ -1985,20 +1987,37 @@ class OrderChange(OrderView):
|
|||||||
def fees(self):
|
def fees(self):
|
||||||
fees = list(self.order.fees.all())
|
fees = list(self.order.fees.all())
|
||||||
for f in fees:
|
for f in fees:
|
||||||
f.form = OrderFeeChangeForm(prefix='of-{}'.format(f.pk), instance=f,
|
f.form = OrderFeeChangeForm(
|
||||||
data=self.request.POST if self.request.method == "POST" else None)
|
prefix='of-{}'.format(f.pk),
|
||||||
|
instance=f,
|
||||||
|
data=self.request.POST if self.request.method == "POST" else None
|
||||||
|
)
|
||||||
return fees
|
return fees
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def positions(self):
|
def positions(self):
|
||||||
positions = list(self.order.positions.select_related(
|
positions = list(self.order.positions.select_related(
|
||||||
'item', 'item__tax_rule', 'used_membership', 'used_membership__membership_type', 'tax_rule',
|
'item', 'item__tax_rule', 'used_membership', 'used_membership__membership_type', 'tax_rule',
|
||||||
'seat', 'subevent',
|
'seat',
|
||||||
).prefetch_related('granted_memberships'))
|
).prefetch_related(
|
||||||
|
Prefetch(
|
||||||
|
'subevent',
|
||||||
|
queryset=self.request.event.subevents.all(),
|
||||||
|
),
|
||||||
|
'granted_memberships',
|
||||||
|
'issued_gift_cards',
|
||||||
|
'addons',
|
||||||
|
).annotate(
|
||||||
|
_seat_allowed=Exists(SeatCategoryMapping.objects.filter(subevent=OuterRef("subevent"), product=OuterRef("item")))
|
||||||
|
))
|
||||||
for p in positions:
|
for p in positions:
|
||||||
p.form = OrderPositionChangeForm(prefix='op-{}'.format(p.pk), instance=p, items=self.items,
|
p.form = OrderPositionChangeForm(
|
||||||
initial={'seat': p.seat.seat_guid if p.seat else None},
|
prefix='op-{}'.format(p.pk),
|
||||||
data=self.request.POST if self.request.method == "POST" else None)
|
instance=p,
|
||||||
|
items=self.items,
|
||||||
|
initial={'seat': p.seat.seat_guid if p.seat else None},
|
||||||
|
data=self.request.POST if self.request.method == "POST" else None
|
||||||
|
)
|
||||||
return positions
|
return positions
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
@@ -2261,6 +2280,12 @@ class OrderContactChange(OrderView):
|
|||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
ctx = super().get_context_data()
|
ctx = super().get_context_data()
|
||||||
ctx['form'] = self.form
|
ctx['form'] = self.form
|
||||||
|
if self.order.all_positions.filter(Exists(GiftCard.objects.filter(issued_in=OuterRef('pk')))).exists():
|
||||||
|
self.form.fields['regenerate_secrets'].help_text = format_html(
|
||||||
|
'{}<br><br><strong><span class="fa fa-warning"></span> {}</strong>',
|
||||||
|
self.form.fields['regenerate_secrets'].help_text,
|
||||||
|
_("Ticket secrets of order positions that have been used to issue a gift card can not be changed. Only the link will be changed in this case."),
|
||||||
|
)
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
|
|||||||
@@ -113,7 +113,8 @@ from pretix.base.views.tasks import AsyncAction
|
|||||||
from pretix.control.forms.exports import ScheduledOrganizerExportForm
|
from pretix.control.forms.exports import ScheduledOrganizerExportForm
|
||||||
from pretix.control.forms.filter import (
|
from pretix.control.forms.filter import (
|
||||||
CustomerFilterForm, DeviceFilterForm, EventFilterForm, GiftCardFilterForm,
|
CustomerFilterForm, DeviceFilterForm, EventFilterForm, GiftCardFilterForm,
|
||||||
OrganizerFilterForm, ReusableMediaFilterForm, TeamFilterForm,
|
LogFilterForm, OrganizerFilterForm, ReusableMediaFilterForm,
|
||||||
|
TeamFilterForm,
|
||||||
)
|
)
|
||||||
from pretix.control.forms.orders import ExporterForm
|
from pretix.control.forms.orders import ExporterForm
|
||||||
from pretix.control.forms.organizer import (
|
from pretix.control.forms.organizer import (
|
||||||
@@ -133,7 +134,7 @@ from pretix.control.permissions import (
|
|||||||
organizer_permission_required,
|
organizer_permission_required,
|
||||||
)
|
)
|
||||||
from pretix.control.signals import nav_organizer
|
from pretix.control.signals import nav_organizer
|
||||||
from pretix.control.views import PaginationMixin
|
from pretix.control.views import LargeResultSetPaginator, PaginationMixin
|
||||||
from pretix.control.views.mailsetup import MailSettingsSetupView
|
from pretix.control.views.mailsetup import MailSettingsSetupView
|
||||||
from pretix.helpers import OF_SELF, GroupConcat
|
from pretix.helpers import OF_SELF, GroupConcat
|
||||||
from pretix.helpers.compat import CompatDeleteView
|
from pretix.helpers.compat import CompatDeleteView
|
||||||
@@ -2663,6 +2664,7 @@ class LogView(OrganizerPermissionRequiredMixin, PaginationMixin, ListView):
|
|||||||
template_name = 'pretixcontrol/organizers/logs.html'
|
template_name = 'pretixcontrol/organizers/logs.html'
|
||||||
permission = 'organizer.settings.general:write'
|
permission = 'organizer.settings.general:write'
|
||||||
model = LogEntry
|
model = LogEntry
|
||||||
|
paginator_class = LargeResultSetPaginator
|
||||||
context_object_name = 'logs'
|
context_object_name = 'logs'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
@@ -2672,16 +2674,21 @@ class LogView(OrganizerPermissionRequiredMixin, PaginationMixin, ListView):
|
|||||||
'user', 'content_type', 'api_token', 'oauth_application', 'device'
|
'user', 'content_type', 'api_token', 'oauth_application', 'device'
|
||||||
).order_by('-datetime')
|
).order_by('-datetime')
|
||||||
qs = qs.exclude(action_type__in=OVERVIEW_BANLIST)
|
qs = qs.exclude(action_type__in=OVERVIEW_BANLIST)
|
||||||
if self.request.GET.get('action_type'):
|
|
||||||
qs = qs.filter(action_type=self.request.GET['action_type'])
|
if self.filter_form.is_valid():
|
||||||
if self.request.GET.get('user'):
|
qs = self.filter_form.filter_qs(qs)
|
||||||
qs = qs.filter(user_id=self.request.GET.get('user'))
|
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
ctx = super().get_context_data()
|
ctx = super().get_context_data()
|
||||||
|
ctx['filter_form'] = self.filter_form
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def filter_form(self):
|
||||||
|
return LogFilterForm(data=self.request.GET, organizer=self.request.organizer)
|
||||||
|
|
||||||
|
|
||||||
class MembershipTypeListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
|
class MembershipTypeListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
|
||||||
model = MembershipType
|
model = MembershipType
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
|
|||||||
if 'placeholders' in request.GET:
|
if 'placeholders' in request.GET:
|
||||||
return self.get_placeholders_help(request)
|
return self.get_placeholders_help(request)
|
||||||
resp = super().get(request, *args, **kwargs)
|
resp = super().get(request, *args, **kwargs)
|
||||||
resp._csp_ignore = True
|
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
def get_placeholders_help(self, request):
|
def get_placeholders_help(self, request):
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ from pretix.control.views import PaginationMixin
|
|||||||
from pretix.control.views.event import MetaDataEditorMixin
|
from pretix.control.views.event import MetaDataEditorMixin
|
||||||
from pretix.helpers import GroupConcat
|
from pretix.helpers import GroupConcat
|
||||||
from pretix.helpers.compat import CompatDeleteView
|
from pretix.helpers.compat import CompatDeleteView
|
||||||
|
from pretix.helpers.i18n import get_format_without_seconds
|
||||||
from pretix.helpers.models import modelcopy
|
from pretix.helpers.models import modelcopy
|
||||||
|
|
||||||
|
|
||||||
@@ -878,7 +879,7 @@ class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, Asyn
|
|||||||
ctx['rrule_formset'] = self.rrule_formset
|
ctx['rrule_formset'] = self.rrule_formset
|
||||||
ctx['time_formset'] = self.time_formset
|
ctx['time_formset'] = self.time_formset
|
||||||
|
|
||||||
tf = get_format('TIME_INPUT_FORMATS')[0]
|
tf = get_format_without_seconds('TIME_INPUT_FORMATS')
|
||||||
ctx['time_admission_sample'] = time(8, 30, 0).strftime(tf)
|
ctx['time_admission_sample'] = time(8, 30, 0).strftime(tf)
|
||||||
ctx['time_begin_sample'] = time(9, 0, 0).strftime(tf)
|
ctx['time_begin_sample'] = time(9, 0, 0).strftime(tf)
|
||||||
ctx['time_end_sample'] = time(18, 0, 0).strftime(tf)
|
ctx['time_end_sample'] = time(18, 0, 0).strftime(tf)
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ from django.contrib.auth import update_session_auth_hash
|
|||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.core.exceptions import BadRequest, PermissionDenied
|
from django.core.exceptions import BadRequest, PermissionDenied
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
from django.http import HttpResponse
|
||||||
from django.shortcuts import get_object_or_404, redirect
|
from django.shortcuts import get_object_or_404, redirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.crypto import get_random_string
|
from django.utils.crypto import get_random_string
|
||||||
@@ -80,6 +81,7 @@ from pretix.control.permissions import (
|
|||||||
)
|
)
|
||||||
from pretix.control.views.auth import get_u2f_appid, get_webauthn_rp_id
|
from pretix.control.views.auth import get_u2f_appid, get_webauthn_rp_id
|
||||||
from pretix.helpers.http import redirect_to_url
|
from pretix.helpers.http import redirect_to_url
|
||||||
|
from pretix.helpers.ratelimit import rate_limit, rate_limit_reset
|
||||||
from pretix.helpers.security import session_reauth
|
from pretix.helpers.security import session_reauth
|
||||||
from pretix.helpers.u2f import websafe_encode
|
from pretix.helpers.u2f import websafe_encode
|
||||||
|
|
||||||
@@ -94,6 +96,20 @@ class RecentAuthenticationRequiredMixin:
|
|||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
tdelta = time.time() - request.session.get('pretix_auth_login_time', 0)
|
tdelta = time.time() - request.session.get('pretix_auth_login_time', 0)
|
||||||
if tdelta > self.max_time:
|
if tdelta > self.max_time:
|
||||||
|
|
||||||
|
if request.headers.get("X-Requested-With") == "XMLHttpRequest":
|
||||||
|
# It's not useful to return a 302 redirect on a XMLHttpRequest request, because
|
||||||
|
# the XMLHttpRequest is unable to detect redirects.
|
||||||
|
return HttpResponse(
|
||||||
|
"Authentication required",
|
||||||
|
status=401,
|
||||||
|
headers={
|
||||||
|
# Appending ?next= is handled by client, because it should be the top-level context url,
|
||||||
|
# not the URL called in the background
|
||||||
|
"X-Login-Url": reverse('control:user.reauth')
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
return redirect(reverse('control:user.reauth') + '?next=' + quote(request.get_full_path()))
|
return redirect(reverse('control:user.reauth') + '?next=' + quote(request.get_full_path()))
|
||||||
return super().dispatch(request, *args, **kwargs)
|
return super().dispatch(request, *args, **kwargs)
|
||||||
|
|
||||||
@@ -849,6 +865,7 @@ class UserPasswordChangeView(FormView):
|
|||||||
msgs = []
|
msgs = []
|
||||||
msgs.append(_('Your password has been changed.'))
|
msgs.append(_('Your password has been changed.'))
|
||||||
self.request.user.send_security_notice(msgs)
|
self.request.user.send_security_notice(msgs)
|
||||||
|
rate_limit_reset("pwreset", self.request.user.pk)
|
||||||
|
|
||||||
self.request.user.log_action('pretix.user.settings.changed', user=self.request.user, data={'new_pw': True})
|
self.request.user.log_action('pretix.user.settings.changed', user=self.request.user, data={'new_pw': True})
|
||||||
|
|
||||||
@@ -879,6 +896,7 @@ class UserEmailChangeView(RecentAuthenticationRequiredMixin, FormView):
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
**super().get_form_kwargs(),
|
**super().get_form_kwargs(),
|
||||||
|
"request": self.request,
|
||||||
"user": self.request.user,
|
"user": self.request.user,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -908,6 +926,10 @@ class UserEmailVerifyView(View):
|
|||||||
messages.success(self.request, _('Your email address was already verified.'))
|
messages.success(self.request, _('Your email address was already verified.'))
|
||||||
return redirect(reverse('control:user.settings', kwargs={}))
|
return redirect(reverse('control:user.settings', kwargs={}))
|
||||||
|
|
||||||
|
if rate_limit("emailverify", self.request.user.pk, max_num=2, expire_time=300):
|
||||||
|
messages.error(self.request, _("For security reasons, please wait 5 minutes before you try again."))
|
||||||
|
return redirect(reverse('control:user.settings', kwargs={}))
|
||||||
|
|
||||||
self.request.user.send_confirmation_code(
|
self.request.user.send_confirmation_code(
|
||||||
session=self.request.session,
|
session=self.request.session,
|
||||||
reason='email_verify',
|
reason='email_verify',
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ from django.shortcuts import redirect, render
|
|||||||
from django.urls import resolve, reverse
|
from django.urls import resolve, reverse
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.html import format_html
|
from django.utils.html import format_html
|
||||||
|
from django.utils.http import url_has_allowed_host_and_scheme
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
@@ -350,6 +351,8 @@ class VoucherUpdate(EventPermissionRequiredMixin, UpdateView):
|
|||||||
return super().post(request, *args, **kwargs)
|
return super().post(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_success_url(self) -> str:
|
def get_success_url(self) -> str:
|
||||||
|
if "next" in self.request.GET and url_has_allowed_host_and_scheme(self.request.GET.get("next"), allowed_hosts=None):
|
||||||
|
return self.request.GET.get("next")
|
||||||
return reverse('control:event.vouchers', kwargs={
|
return reverse('control:event.vouchers', kwargs={
|
||||||
'organizer': self.request.event.organizer.slug,
|
'organizer': self.request.event.organizer.slug,
|
||||||
'event': self.request.event.slug,
|
'event': self.request.event.slug,
|
||||||
|
|||||||
@@ -19,7 +19,9 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
import itertools
|
||||||
import re
|
import re
|
||||||
|
from http.cookies import Morsel
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
@@ -48,6 +50,41 @@ def set_cookie_without_samesite(request, response, key, *args, **kwargs):
|
|||||||
response.cookies[key]['Partitioned'] = True
|
response.cookies[key]['Partitioned'] = True
|
||||||
|
|
||||||
|
|
||||||
|
def thoroughly_delete_cookie(response, cookie_name, **kwargs):
|
||||||
|
""" Deletes different possible versions of a cookie (SameSite, Partitioned) """
|
||||||
|
properties = {"SameSite": ["", 'None'], "Partitioned": ["", True]}
|
||||||
|
for i, values in enumerate(itertools.product(*properties.values())):
|
||||||
|
m = Morsel()
|
||||||
|
m.set(cookie_name, '', '')
|
||||||
|
m.update(kwargs)
|
||||||
|
m.update(zip(properties.keys(), values))
|
||||||
|
m['expires'] = "Thu, 01 Jan 1970 00:00:00 GMT"
|
||||||
|
|
||||||
|
response.cookies[f'___DELETECOOKIE__{i}___{cookie_name}'] = m
|
||||||
|
|
||||||
|
# Make sure settings a cookie afterwards will add a new item in the dictionary, placing
|
||||||
|
# it below our deletion headers.
|
||||||
|
response.cookies.pop(cookie_name, None)
|
||||||
|
|
||||||
|
|
||||||
|
def get_all_values_of_cookie(cookie_header, cookie_name):
|
||||||
|
# like django.http.cookie.parse_cookie, but returns all values of duplicated cookies instead of only the last
|
||||||
|
values = list()
|
||||||
|
if not cookie_header:
|
||||||
|
return values
|
||||||
|
for chunk in cookie_header.split(";"):
|
||||||
|
if "=" in chunk:
|
||||||
|
key, val = chunk.split("=", 1)
|
||||||
|
else:
|
||||||
|
# Assume an empty name per
|
||||||
|
# https://bugzilla.mozilla.org/show_bug.cgi?id=169091
|
||||||
|
key, val = "", chunk
|
||||||
|
key, val = key.strip(), val.strip()
|
||||||
|
if key == cookie_name:
|
||||||
|
values.append(val)
|
||||||
|
return values
|
||||||
|
|
||||||
|
|
||||||
# Based on https://www.chromium.org/updates/same-site/incompatible-clients
|
# Based on https://www.chromium.org/updates/same-site/incompatible-clients
|
||||||
# Copyright 2019 Google LLC.
|
# Copyright 2019 Google LLC.
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|||||||
@@ -47,5 +47,5 @@ def escapejson(value):
|
|||||||
|
|
||||||
@keep_lazy(str, SafeText)
|
@keep_lazy(str, SafeText)
|
||||||
def escapejson_attr(value):
|
def escapejson_attr(value):
|
||||||
"""Hex encodes characters for use in a html attributw script."""
|
"""Hex encodes characters for use in a html attribute."""
|
||||||
return mark_safe(force_str(value).translate(_json_escapes_attr))
|
return mark_safe(force_str(value).translate(_json_escapes_attr))
|
||||||
|
|||||||
@@ -20,9 +20,11 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import copy
|
import copy
|
||||||
|
from decimal import Decimal
|
||||||
|
|
||||||
from django.core.files import File
|
from django.core.files import File
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models.fields import DecimalField
|
||||||
|
|
||||||
|
|
||||||
class Thumbnail(models.Model):
|
class Thumbnail(models.Model):
|
||||||
@@ -54,3 +56,33 @@ def flatten_choices(choices):
|
|||||||
yield from label_or_nested
|
yield from label_or_nested
|
||||||
else:
|
else:
|
||||||
yield value_or_group, label_or_nested
|
yield value_or_group, label_or_nested
|
||||||
|
|
||||||
|
|
||||||
|
def _normalize_decimal(d: Decimal) -> Decimal:
|
||||||
|
"""
|
||||||
|
Strips trailing zeros, e.g.
|
||||||
|
|
||||||
|
20.000 → 20
|
||||||
|
20.010 → 20.01
|
||||||
|
20.100 → 20.1
|
||||||
|
|
||||||
|
But unlike of Decimal.normalize(), 20.000 will not become 2e+1. Very small decimals might still be represented
|
||||||
|
in scientific notation when printed.
|
||||||
|
"""
|
||||||
|
normalized = d.normalize()
|
||||||
|
sign, digit, exponent = normalized.as_tuple()
|
||||||
|
if exponent > 0:
|
||||||
|
return normalized.quantize(1)
|
||||||
|
return normalized
|
||||||
|
|
||||||
|
|
||||||
|
class NormalizedDecimalField(DecimalField):
|
||||||
|
"""
|
||||||
|
Variant of DecimalField that never outputs the trailing zeros, so we always have normalized decimals internally.
|
||||||
|
Use this only for fields where the trailing zeros are pointless (e.g. percentages), not for monetary amounts.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def from_db_value(self, value, expression, connection):
|
||||||
|
if value is not None:
|
||||||
|
value = _normalize_decimal(value)
|
||||||
|
return value
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import ipaddress
|
|
||||||
import socket
|
import socket
|
||||||
import sys
|
import sys
|
||||||
import types
|
import types
|
||||||
@@ -42,8 +41,7 @@ from urllib3.util.connection import (
|
|||||||
from urllib3.util.timeout import _DEFAULT_TIMEOUT
|
from urllib3.util.timeout import _DEFAULT_TIMEOUT
|
||||||
|
|
||||||
from pretix.helpers.reportlab import ThumbnailingImageReader
|
from pretix.helpers.reportlab import ThumbnailingImageReader
|
||||||
|
from pretix.helpers.ssrf import should_block_access
|
||||||
_cgnat_net = ipaddress.ip_network('100.64.0.0/10')
|
|
||||||
|
|
||||||
|
|
||||||
def monkeypatch_vobject_performance():
|
def monkeypatch_vobject_performance():
|
||||||
@@ -150,16 +148,9 @@ def monkeypatch_urllib3_ssrf_protection():
|
|||||||
af, socktype, proto, canonname, sa = res
|
af, socktype, proto, canonname, sa = res
|
||||||
|
|
||||||
if not getattr(settings, "ALLOW_HTTP_TO_PRIVATE_NETWORKS", False):
|
if not getattr(settings, "ALLOW_HTTP_TO_PRIVATE_NETWORKS", False):
|
||||||
ip_addr = ipaddress.ip_address(sa[0])
|
is_private, msg = should_block_access(sa)
|
||||||
check_ip4 = ip_addr.ipv4_mapped if getattr(ip_addr, "ipv4_mapped", None) else ip_addr
|
if is_private:
|
||||||
if ip_addr.is_multicast:
|
raise HTTPError(msg)
|
||||||
raise HTTPError(f"Request to multicast address {sa[0]} blocked")
|
|
||||||
if ip_addr.is_loopback or ip_addr.is_link_local:
|
|
||||||
raise HTTPError(f"Request to local address {sa[0]} blocked")
|
|
||||||
if ip_addr.is_private:
|
|
||||||
raise HTTPError(f"Request to private address {sa[0]} blocked")
|
|
||||||
if check_ip4 in _cgnat_net:
|
|
||||||
raise HTTPError(f"Request to RFC 6598 address {sa[0]} blocked")
|
|
||||||
|
|
||||||
sock = None
|
sock = None
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
#
|
||||||
|
# This file is part of pretix (Community Edition).
|
||||||
|
#
|
||||||
|
# Copyright (C) 2014-2020 Raphael Michel and contributors
|
||||||
|
# Copyright (C) 2020-today pretix GmbH and contributors
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
|
||||||
|
# Public License as published by the Free Software Foundation in version 3 of the License.
|
||||||
|
#
|
||||||
|
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
|
||||||
|
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
|
||||||
|
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
|
||||||
|
# this file, see <https://pretix.eu/about/en/license>.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||||
|
# details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
|
# <https://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
import hashlib
|
||||||
|
import ipaddress
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.http import HttpRequest
|
||||||
|
|
||||||
|
from pretix.helpers.http import get_client_ip
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_key(key, parameters):
|
||||||
|
return f'pretix:ratelimit:{key}:' + hashlib.sha256(','.join(str(p) for p in parameters).encode()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def _get_ip(request):
|
||||||
|
client_ip = get_client_ip(request)
|
||||||
|
if not client_ip:
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
client_ip = ipaddress.ip_address(client_ip)
|
||||||
|
except ValueError:
|
||||||
|
# Web server not set up correctly
|
||||||
|
return None
|
||||||
|
if client_ip.is_private and not settings.DEBUG:
|
||||||
|
# This is the private IP of the server, web server not set up correctly
|
||||||
|
return None
|
||||||
|
return str(client_ip)
|
||||||
|
|
||||||
|
|
||||||
|
def rate_limit(key: str, *parameters, include_ip_from_request: HttpRequest=None, max_num: int, expire_time: int, increase: bool = True):
|
||||||
|
"""
|
||||||
|
This is a shared utility to implement simple rate limiting in operations like
|
||||||
|
password resets.
|
||||||
|
|
||||||
|
:param key: The key referring to the feature like "pwreset"
|
||||||
|
:param parameters: Any number of things to be hashed as the bucket key
|
||||||
|
:param include_ip_from_request: Add IP address from request to the bucket key. If IP address cannot be determined,
|
||||||
|
rate limit is not applied.
|
||||||
|
:param max_num: The maximum number of actions to performed within expire_time of the first action
|
||||||
|
:param expire_time: The length of the time window in seconds
|
||||||
|
:param increase: Whether to count the call as an event counted towards the rate, or just check
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
if not settings.HAS_REDIS:
|
||||||
|
# No rate limiting
|
||||||
|
return False
|
||||||
|
|
||||||
|
from django_redis import get_redis_connection
|
||||||
|
rc = get_redis_connection("redis")
|
||||||
|
|
||||||
|
if include_ip_from_request:
|
||||||
|
ip = _get_ip(include_ip_from_request)
|
||||||
|
if not ip:
|
||||||
|
# IP not discovered, can't rate limit
|
||||||
|
return False
|
||||||
|
parameters = (*parameters, ip)
|
||||||
|
|
||||||
|
redis_key = _get_key(key, parameters)
|
||||||
|
|
||||||
|
if increase:
|
||||||
|
p = rc.pipeline()
|
||||||
|
p.set(redis_key, 0, nx=True, ex=expire_time) # Start a rate limit window if none is running
|
||||||
|
p.incr(redis_key)
|
||||||
|
new_counter = p.execute()[1]
|
||||||
|
else:
|
||||||
|
new_counter = int(rc.get(redis_key) or 0)
|
||||||
|
|
||||||
|
if new_counter > max_num:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def rate_limit_reset(key: str, *parameters, include_ip_from_request: HttpRequest=None):
|
||||||
|
"""
|
||||||
|
Reset a rate limit bucket.
|
||||||
|
"""
|
||||||
|
if not settings.HAS_REDIS:
|
||||||
|
# No rate limiting
|
||||||
|
return
|
||||||
|
|
||||||
|
from django_redis import get_redis_connection
|
||||||
|
rc = get_redis_connection("redis")
|
||||||
|
|
||||||
|
if include_ip_from_request:
|
||||||
|
ip = _get_ip(include_ip_from_request)
|
||||||
|
if not ip:
|
||||||
|
# IP not discovered, can't rate limit
|
||||||
|
return False
|
||||||
|
parameters = (*parameters, ip)
|
||||||
|
|
||||||
|
redis_key = _get_key(key, parameters)
|
||||||
|
rc.delete(redis_key)
|
||||||
@@ -28,7 +28,7 @@ from django.contrib.auth import login as auth_login
|
|||||||
from django.contrib.gis import geoip2
|
from django.contrib.gis import geoip2
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.utils.formats import date_format
|
from django.utils.formats import date_format
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import localtime, now, override
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django_countries.fields import Country
|
from django_countries.fields import Country
|
||||||
from geoip2.errors import AddressNotFoundError
|
from geoip2.errors import AddressNotFoundError
|
||||||
@@ -167,13 +167,13 @@ def handle_login_source(user, request):
|
|||||||
})
|
})
|
||||||
if user.known_login_sources.count() > 1:
|
if user.known_login_sources.count() > 1:
|
||||||
# Do not send on first login or first login after introduction of this feature:
|
# Do not send on first login or first login after introduction of this feature:
|
||||||
with language(user.locale):
|
with language(user.locale), override(user.timezone):
|
||||||
mail(
|
mail(
|
||||||
user.email,
|
user.email,
|
||||||
_('New sign-in to your account'),
|
_('New sign-in to your account'),
|
||||||
'pretixcontrol/email/login_notice.txt',
|
'pretixcontrol/email/login_notice.txt',
|
||||||
{
|
{
|
||||||
'when': date_format(src.last_seen, 'DATETIME_FORMAT'),
|
'when': date_format(localtime(src.last_seen), 'DATETIME_FORMAT'),
|
||||||
'agent': src.agent_type,
|
'agent': src.agent_type,
|
||||||
'os': src.os_type,
|
'os': src.os_type,
|
||||||
# ua-parser returns "Other" for unidentified desktop devices.
|
# ua-parser returns "Other" for unidentified desktop devices.
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#
|
||||||
|
# This file is part of pretix (Community Edition).
|
||||||
|
#
|
||||||
|
# Copyright (C) 2014-2020 Raphael Michel and contributors
|
||||||
|
# Copyright (C) 2020-today pretix GmbH and contributors
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
|
||||||
|
# Public License as published by the Free Software Foundation in version 3 of the License.
|
||||||
|
#
|
||||||
|
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
|
||||||
|
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
|
||||||
|
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
|
||||||
|
# this file, see <https://pretix.eu/about/en/license>.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||||
|
# details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
|
# <https://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
import ipaddress
|
||||||
|
|
||||||
|
_cgnat_net = ipaddress.ip_network('100.64.0.0/10')
|
||||||
|
|
||||||
|
|
||||||
|
def should_block_access(sa):
|
||||||
|
ip_addr = ipaddress.ip_address(sa[0])
|
||||||
|
check_ip4 = ip_addr.ipv4_mapped if getattr(ip_addr, "ipv4_mapped", None) else ip_addr
|
||||||
|
if ip_addr.is_multicast:
|
||||||
|
return True, f"Request to multicast address {sa[0]} blocked"
|
||||||
|
if ip_addr.is_loopback or ip_addr.is_link_local:
|
||||||
|
return True, f"Request to local address {sa[0]} blocked"
|
||||||
|
if ip_addr.is_private:
|
||||||
|
return True, f"Request to private address {sa[0]} blocked"
|
||||||
|
if check_ip4 in _cgnat_net:
|
||||||
|
return True, f"Request to RFC 6598 address {sa[0]} blocked"
|
||||||
|
|
||||||
|
return False, None
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
|
"POT-Creation-Date: 2026-07-30 13:52+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: Automatically generated\n"
|
"Last-Translator: Automatically generated\n"
|
||||||
"Language-Team: none\n"
|
"Language-Team: none\n"
|
||||||
@@ -17,38 +17,6 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "Shop disabled"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale over"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale not started"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "On sale"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/_base_settings.py
|
#: pretix/_base_settings.py
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1199,6 +1167,19 @@ msgstr ""
|
|||||||
msgid "Download a spreadsheet of all currently registered customer accounts."
|
msgid "Download a spreadsheet of all currently registered customer accounts."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/permissions.py
|
||||||
|
#: pretix/control/navigation.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
msgid "Customers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
#: pretix/presale/views/customer.py
|
||||||
|
msgid "Memberships"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
@@ -1331,6 +1312,66 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/live.html
|
||||||
|
msgid "Test mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
|
#: pretix/plugins/reports/exporters.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
msgid "Canceled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
msgid "Membership type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
msgid "Purchase ticket"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/forms/questions.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/rrule.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "Start date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
msgid "Start time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "End date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
msgid "End time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
||||||
msgctxt "export_category"
|
msgctxt "export_category"
|
||||||
msgid "Invoices"
|
msgid "Invoices"
|
||||||
@@ -2158,30 +2199,6 @@ msgstr ""
|
|||||||
msgid "Position ID"
|
msgid "Position ID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/forms/questions.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/rrule.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "Start date"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "End date"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
||||||
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
||||||
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
||||||
@@ -2573,12 +2590,6 @@ msgstr ""
|
|||||||
msgid "Gift card code"
|
msgid "Gift card code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/live.html
|
|
||||||
msgid "Test mode"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
||||||
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup.html
|
#: pretix/control/templates/pretixcontrol/email_setup.html
|
||||||
@@ -2692,7 +2703,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/plugins/reports/exporters.py
|
#: pretix/plugins/reports/exporters.py pretix/plugins/sendmail/forms.py
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
||||||
msgid "Expired"
|
msgid "Expired"
|
||||||
@@ -2858,7 +2869,7 @@ msgid "This combination of credentials is not known to our system."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
||||||
#: pretix/presale/forms/customer.py
|
#: pretix/control/views/user.py pretix/presale/forms/customer.py
|
||||||
msgid "For security reasons, please wait 5 minutes before you try again."
|
msgid "For security reasons, please wait 5 minutes before you try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -3781,6 +3792,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/views/vouchers.py
|
#: pretix/control/views/vouchers.py
|
||||||
msgid "Price effect"
|
msgid "Price effect"
|
||||||
@@ -4398,8 +4410,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/base/models/event.py
|
#: pretix/base/models/event.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"This will be used to let users know if the event is in a different timezone "
|
"This will be used to let users know if the event is in a different timezone, "
|
||||||
"and let’s us calculate users’ local times."
|
"and to let us calculate the local time of a user."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
||||||
@@ -5694,23 +5706,6 @@ msgstr ""
|
|||||||
msgid "Number of times this membership can be used in a purchase."
|
msgid "Number of times this membership can be used in a purchase."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
|
||||||
#: pretix/plugins/reports/exporters.py
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
msgid "Canceled"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
msgid "Membership type"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/models/orders.py
|
#: pretix/base/models/orders.py
|
||||||
msgid "pending"
|
msgid "pending"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -6489,7 +6484,7 @@ msgstr ""
|
|||||||
msgid "It is currently not possible to create vouchers for add-on products."
|
msgid "It is currently not possible to create vouchers for add-on products."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"You need to select a specific product or quota if this voucher should "
|
"You need to select a specific product or quota if this voucher should "
|
||||||
"reserve tickets."
|
"reserve tickets."
|
||||||
@@ -6508,7 +6503,7 @@ msgid ""
|
|||||||
"usages."
|
"usages."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you want this voucher to block quota, you need to select a specific date."
|
"If you want this voucher to block quota, you need to select a specific date."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -6977,6 +6972,12 @@ msgstr ""
|
|||||||
msgid "This gift card was used in the meantime. Please try again."
|
msgid "This gift card was used in the meantime. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/payment.py
|
||||||
|
msgid ""
|
||||||
|
"This payment provider exists for historical purposes only and is no longer "
|
||||||
|
"usable."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/pdf.py
|
#: pretix/base/pdf.py
|
||||||
msgid "Ticket code (barcode content)"
|
msgid "Ticket code (barcode content)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7533,11 +7534,6 @@ msgid ""
|
|||||||
"permissions."
|
"permissions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
|
||||||
msgid "Customers"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
#: pretix/base/permissions.py pretix/control/navigation.py
|
||||||
msgid "Devices"
|
msgid "Devices"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -8663,6 +8659,12 @@ msgid ""
|
|||||||
"card."
|
"card."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/services/orders.py
|
||||||
|
msgid ""
|
||||||
|
"You cannot change the ticket secret of a position that has been used to "
|
||||||
|
"issue a gift card."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/services/orders.py
|
#: pretix/base/services/orders.py
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -10195,11 +10197,11 @@ msgstr ""
|
|||||||
msgid "We'll show this publicly to allow attendees to contact you."
|
msgid "We'll show this publicly to allow attendees to contact you."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
msgid "Contact URL"
|
msgid "Contact URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you set this, the footer contact link will point here instead of using "
|
"If you set this, the footer contact link will point here instead of using "
|
||||||
"the email address above. Please note that you still need to add a contact "
|
"the email address above. Please note that you still need to add a contact "
|
||||||
@@ -11680,6 +11682,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
@@ -12875,7 +12878,7 @@ msgstr ""
|
|||||||
msgid "Valid orders"
|
msgid "Valid orders"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
msgid "Paid (or canceled with paid fee)"
|
msgid "Paid (or canceled with paid fee)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -12899,7 +12902,7 @@ msgstr ""
|
|||||||
msgid "Cancellations"
|
msgid "Cancellations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
msgid "Canceled (fully)"
|
msgid "Canceled (fully)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -13074,6 +13077,22 @@ msgstr ""
|
|||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale not started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale over"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
||||||
msgid "Date from"
|
msgid "Date from"
|
||||||
@@ -13111,13 +13130,6 @@ msgstr ""
|
|||||||
msgid "not yet activated"
|
msgid "not yet activated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
#: pretix/presale/views/customer.py
|
|
||||||
msgid "Memberships"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
msgid "Has no memberships"
|
msgid "Has no memberships"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -13345,6 +13357,36 @@ msgstr ""
|
|||||||
msgid "Search email address or subject"
|
msgid "Search email address or subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
msgid "Source"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "All sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Team actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Customer actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Device actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "User email"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py pretix/control/navigation.py
|
||||||
|
msgid "All users"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/global_settings.py
|
#: pretix/control/forms/global_settings.py
|
||||||
msgid "Additional footer text"
|
msgid "Additional footer text"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -14522,6 +14564,7 @@ msgstr ""
|
|||||||
#: pretix/control/forms/renderers.py
|
#: pretix/control/forms/renderers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
msgctxt "form_bulk"
|
msgctxt "form_bulk"
|
||||||
msgid "change"
|
msgid "change"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -14635,6 +14678,53 @@ msgid ""
|
|||||||
"should show them."
|
"should show them."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"You cannot reduce the maximum number of redemptions to %(max_usages)s, "
|
||||||
|
"because at least one of the selected vouchers has already been redeemed "
|
||||||
|
"%(max_redeemed)s times."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"You cannot create a voucher that allows selection of a quota but has no date "
|
||||||
|
"selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid "The selected quota does not match the selected subevent."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid "There is no sufficient quota available to perform this change."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the maximum number of usages in bulk is not supported if any of the "
|
||||||
|
"selected vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgctxt "subevent"
|
||||||
|
msgid ""
|
||||||
|
"Changing the date in bulk is not supported if any of the selected vouchers "
|
||||||
|
"is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the product to a quota is not supported if any of the selected "
|
||||||
|
"vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"This change cannot be completed because not all assigned seats of the "
|
||||||
|
"vouchers are still available"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/vouchers.py
|
#: pretix/control/forms/vouchers.py
|
||||||
msgid "Codes"
|
msgid "Codes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -16340,10 +16430,6 @@ msgstr ""
|
|||||||
msgid "Account history"
|
msgid "Account history"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
|
||||||
msgid "All users"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
#: pretix/control/navigation.py
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
msgid "Admin sessions"
|
msgid "Admin sessions"
|
||||||
@@ -16612,6 +16698,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/users/create.html
|
#: pretix/control/templates/pretixcontrol/users/create.html
|
||||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
||||||
@@ -17029,8 +17116,8 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/question.html
|
#: pretix/control/templates/pretixcontrol/items/question.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/orders/index.html
|
#: pretix/control/templates/pretixcontrol/orders/index.html
|
||||||
@@ -17041,7 +17128,6 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
||||||
@@ -17176,6 +17262,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
||||||
msgid "Select all results on other pages as well"
|
msgid "Select all results on other pages as well"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -17731,6 +17818,22 @@ msgstr ""
|
|||||||
msgid "We found an SPF record on your domain that includes this system. Great!"
|
msgid "We found an SPF record on your domain that includes this system. Great!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "Your new DKIM record should be set up as a CNAME record like this:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "We found a DKIM record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "Your new DMARC record could look like this:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "We found a DMARC record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
msgid "Verification"
|
msgid "Verification"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -17891,6 +17994,94 @@ msgid ""
|
|||||||
"undeletable data, such as orders not performed in test mode."
|
"undeletable data, such as orders not performed in test mode."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "Personal data was cleared from this log entry."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "This change was performed by a pretix administrator."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
msgid "Inspect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>overpaid orders</strong>, for example due to "
|
||||||
|
"duplicate payment attempts. You should review the cases and consider "
|
||||||
|
"refunding the overpaid amount to the user."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show overpaid orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending refunds</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show pending refunds"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>requested cancellations</strong> that you should "
|
||||||
|
"take care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders requesting cancellation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending approvals</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders pending approval"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>fully paid orders</strong> that are not marked "
|
||||||
|
"as paid, probably because no quota was left at the time their payment "
|
||||||
|
"arrived. You should review the cases and consider either refunding the "
|
||||||
|
"customer or creating more space."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show affected orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"Orders in this event could not be <strong>synced to an external system</"
|
||||||
|
"strong> as configured."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show sync problems"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/delete.html
|
#: pretix/control/templates/pretixcontrol/event/delete.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"This operation will destroy your event including all configuration, "
|
"This operation will destroy your event including all configuration, "
|
||||||
@@ -18005,69 +18196,6 @@ msgstr ""
|
|||||||
msgid "Create QR code"
|
msgid "Create QR code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>overpaid orders</strong>, for example due to "
|
|
||||||
"duplicate payment attempts. You should review the cases and consider "
|
|
||||||
"refunding the overpaid amount to the user."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show overpaid orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending refunds</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show pending refunds"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>requested cancellations</strong> that you should "
|
|
||||||
"take care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders requesting cancellation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending approvals</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders pending approval"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>fully paid orders</strong> that are not marked "
|
|
||||||
"as paid, probably because no quota was left at the time their payment "
|
|
||||||
"arrived. You should review the cases and consider either refunding the "
|
|
||||||
"customer or creating more space."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show affected orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"Orders in this event could not be <strong>synced to an external system</"
|
|
||||||
"strong> as configured."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show sync problems"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
#: pretix/control/templates/pretixcontrol/event/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Update comment"
|
msgid "Update comment"
|
||||||
@@ -18242,44 +18370,6 @@ msgstr ""
|
|||||||
msgid "Enable test mode"
|
msgid "Enable test mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "All actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Team actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Customer actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "Personal data was cleared from this log entry."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "This change was performed by a pretix administrator."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
msgid "Inspect"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
@@ -19178,6 +19268,20 @@ msgstr ""
|
|||||||
msgid "More quotas"
|
msgid "More quotas"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "Shop disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "On sale"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
msgid "Open event dashboard"
|
msgid "Open event dashboard"
|
||||||
@@ -19188,6 +19292,10 @@ msgctxt "typography"
|
|||||||
msgid "The quick brown fox jumps over the lazy dog."
|
msgid "The quick brown fox jumps over the lazy dog."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
|
msgid "Specific object selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
||||||
msgid "Quota:"
|
msgid "Quota:"
|
||||||
@@ -20202,6 +20310,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%(number)s selected"
|
msgid "%(number)s selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -20288,6 +20397,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
msgid "Edit selected"
|
msgid "Edit selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -20584,6 +20694,13 @@ msgid ""
|
|||||||
"the customer account."
|
"the customer account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
|
#: pretix/control/views/orders.py
|
||||||
|
msgid ""
|
||||||
|
"Ticket secrets of order positions that have been used to issue a gift card "
|
||||||
|
"can not be changed. Only the link will be changed in this case."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"Removing or splitting this position will also remove or split all add-ons to "
|
"Removing or splitting this position will also remove or split all add-ons to "
|
||||||
@@ -20996,11 +21113,6 @@ msgstr ""
|
|||||||
msgid "Create a refund"
|
msgid "Create a refund"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
msgid "Source"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Cancel transfer"
|
msgid "Cancel transfer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -22077,6 +22189,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -24233,11 +24346,13 @@ msgid "Copy codes"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Voucher details"
|
msgid "Voucher details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you choose \"any product\" for a specific quota and choose to reserve "
|
"If you choose \"any product\" for a specific quota and choose to reserve "
|
||||||
@@ -24245,6 +24360,10 @@ msgid ""
|
|||||||
"voucher holder if another quota associated with the product is sold out!"
|
"voucher holder if another quota associated with the product is sold out!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
|
msgid "Change multiple vouchers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Delete voucher"
|
msgid "Delete voucher"
|
||||||
@@ -24584,7 +24703,8 @@ msgstr ""
|
|||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
||||||
"team."
|
"team. If you want to add a different user or create a new account, log out "
|
||||||
|
"and click the invitation link again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/auth.py
|
#: pretix/control/views/auth.py
|
||||||
@@ -25187,6 +25307,30 @@ msgid ""
|
|||||||
"record."
|
"record."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We could not find a CNAME record pointing to our DKIM key for domain you are "
|
||||||
|
"trying to use. This means that there is a very high change most of the "
|
||||||
|
"emails will be rejected or marked as spam. We strongly recommend setting up "
|
||||||
|
"DKIM through a CNAME record. You can do so through the DNS settings at the "
|
||||||
|
"provider you registered your domain with."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We found a CNAME record for a DKIM key, but it is not pointing to the right "
|
||||||
|
"location. This means that there is a very high chance most of the emails "
|
||||||
|
"will be rejected or marked as spam. You should update the DNS settings of "
|
||||||
|
"your domain."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We did not find DMARC record for your domain. This means that there is a "
|
||||||
|
"very high chance most of the emails will be rejected or marked as spam. You "
|
||||||
|
"should update the DNS settings of your domain."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/mailsetup.py
|
#: pretix/control/views/mailsetup.py
|
||||||
msgid "The verification code was incorrect, please try again."
|
msgid "The verification code was incorrect, please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -26244,6 +26388,7 @@ msgid "Macao"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/helpers/daterange.py
|
#: pretix/helpers/daterange.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_list.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
||||||
@@ -27431,11 +27576,6 @@ msgstr ""
|
|||||||
msgid "PayPal account"
|
msgid "PayPal account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
|
||||||
#, python-brace-format
|
|
||||||
msgid "<a target=\"_blank\" rel=\"noopener\" href=\"{docs_url}\">{text}</a>"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -28070,8 +28210,13 @@ msgstr ""
|
|||||||
#: pretix/plugins/returnurl/views.py
|
#: pretix/plugins/returnurl/views.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"Redirection will only be allowed to URLs that start with one of these "
|
"Redirection will only be allowed to URLs that start with one of these "
|
||||||
"prefixes. Enter one or more allowed URL prefix per line. URL prefixes must "
|
"prefixes. Enter one allowed URL prefix per line. URL prefixes must include a "
|
||||||
"include a slash after the hostname."
|
"slash after the hostname."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/plugins/returnurl/views.py
|
||||||
|
msgid ""
|
||||||
|
"All values must be URLs that include at last one slash after the hostname."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/sendmail/apps.py
|
#: pretix/plugins/sendmail/apps.py
|
||||||
|
|||||||
+5072
-6852
File diff suppressed because it is too large
Load Diff
@@ -8,8 +8,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
|
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
|
||||||
"PO-Revision-Date: 2021-09-15 11:22+0000\n"
|
"PO-Revision-Date: 2026-07-13 11:28+0000\n"
|
||||||
"Last-Translator: Mohamed Tawfiq <mtawfiq@wafyapp.com>\n"
|
"Last-Translator: ahmed badr <ahmedbadr@oma.com.eg>\n"
|
||||||
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
"ar/>\n"
|
"ar/>\n"
|
||||||
"Language: ar\n"
|
"Language: ar\n"
|
||||||
@@ -18,7 +18,7 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||||
"X-Generator: Weblate 4.8\n"
|
"X-Generator: Weblate 2026.7.1\n"
|
||||||
|
|
||||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js
|
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js
|
||||||
msgid "Marked as paid"
|
msgid "Marked as paid"
|
||||||
@@ -30,112 +30,110 @@ msgstr "تعليق:"
|
|||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "PayPal"
|
msgid "PayPal"
|
||||||
msgstr ""
|
msgstr "باي بال"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Venmo"
|
msgid "Venmo"
|
||||||
msgstr ""
|
msgstr "Venmo"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
#: pretix/static/pretixpresale/js/walletdetection.js
|
#: pretix/static/pretixpresale/js/walletdetection.js
|
||||||
msgid "Apple Pay"
|
msgid "Apple Pay"
|
||||||
msgstr ""
|
msgstr "Apple Pay"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Itaú"
|
msgid "Itaú"
|
||||||
msgstr ""
|
msgstr "إيتاو"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "PayPal Credit"
|
msgid "PayPal Credit"
|
||||||
msgstr ""
|
msgstr "الائتمان من PayPal"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Credit Card"
|
msgid "Credit Card"
|
||||||
msgstr ""
|
msgstr "بطاقة الائتمان"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "PayPal Pay Later"
|
msgid "PayPal Pay Later"
|
||||||
msgstr ""
|
msgstr "الدفع لاحقًا عبر PayPal"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "iDEAL | Wero"
|
msgid "iDEAL | Wero"
|
||||||
msgstr ""
|
msgstr "iDEAL | التحدي"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "SEPA Direct Debit"
|
msgid "SEPA Direct Debit"
|
||||||
msgstr ""
|
msgstr "الخصم المباشر في منطقة الدفع الموحدة (SEPA)"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Bancontact"
|
msgid "Bancontact"
|
||||||
msgstr ""
|
msgstr "بانكونتاكت"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "giropay"
|
msgid "giropay"
|
||||||
msgstr ""
|
msgstr "giropay"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "SOFORT"
|
msgid "SOFORT"
|
||||||
msgstr ""
|
msgstr "فوراً"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Yes"
|
|
||||||
msgid "eps"
|
msgid "eps"
|
||||||
msgstr "نعم"
|
msgstr "نقاط إضافية"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "MyBank"
|
msgid "MyBank"
|
||||||
msgstr ""
|
msgstr "بنكي"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Przelewy24"
|
msgid "Przelewy24"
|
||||||
msgstr ""
|
msgstr "Przelewy24"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Verkkopankki"
|
msgid "Verkkopankki"
|
||||||
msgstr ""
|
msgstr "الخدمات المصرفية عبر الإنترنت"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "PayU"
|
msgid "PayU"
|
||||||
msgstr ""
|
msgstr "الدفع لك"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "BLIK"
|
msgid "BLIK"
|
||||||
msgstr ""
|
msgstr "BLIK"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Trustly"
|
msgid "Trustly"
|
||||||
msgstr ""
|
msgstr "Trustly"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Zimpler"
|
msgid "Zimpler"
|
||||||
msgstr ""
|
msgstr "Zimpler"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Maxima"
|
msgid "Maxima"
|
||||||
msgstr ""
|
msgstr "الأعظم"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "OXXO"
|
msgid "OXXO"
|
||||||
msgstr ""
|
msgstr "OXXO"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Boleto"
|
msgid "Boleto"
|
||||||
msgstr ""
|
msgstr "تذكرة"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "WeChat Pay"
|
msgid "WeChat Pay"
|
||||||
msgstr ""
|
msgstr "WeChat Pay"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Mercado Pago"
|
msgid "Mercado Pago"
|
||||||
msgstr ""
|
msgstr "Mercado Pago"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||||
msgid "Continue"
|
msgid "Continue"
|
||||||
msgstr "المتابعة"
|
msgstr "تابع"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js
|
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js
|
||||||
@@ -144,7 +142,7 @@ msgstr "جاري تأكيد الدفع الخاص بك …"
|
|||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||||
msgid "Payment method unavailable"
|
msgid "Payment method unavailable"
|
||||||
msgstr ""
|
msgstr "طريقة الدفع غير متاحة"
|
||||||
|
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
||||||
msgid "Placed orders"
|
msgid "Placed orders"
|
||||||
@@ -156,11 +154,11 @@ msgstr "الطلبات المدفوعة"
|
|||||||
|
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
||||||
msgid "Attendees (ordered)"
|
msgid "Attendees (ordered)"
|
||||||
msgstr ""
|
msgstr "الحاضرون (حسب الترتيب)"
|
||||||
|
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
||||||
msgid "Attendees (paid)"
|
msgid "Attendees (paid)"
|
||||||
msgstr ""
|
msgstr "الحاضرون (الذين دفعوا رسوم الاشتراك)"
|
||||||
|
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
||||||
msgid "Total revenue"
|
msgid "Total revenue"
|
||||||
@@ -192,7 +190,7 @@ msgstr "تبديل قائمة الدخول"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Search results"
|
msgid "Search results"
|
||||||
msgstr "البحث في النتائج"
|
msgstr "نتائج البحث"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "No tickets found"
|
msgid "No tickets found"
|
||||||
@@ -236,15 +234,15 @@ msgstr "غير مدفوع"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Canceled"
|
msgid "Canceled"
|
||||||
msgstr "ملغاة"
|
msgstr "تم إلغاؤه"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Confirmed"
|
msgid "Confirmed"
|
||||||
msgstr ""
|
msgstr "تم التأكيد"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Approval pending"
|
msgid "Approval pending"
|
||||||
msgstr ""
|
msgstr "في انتظار الموافقة"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Redeemed"
|
msgid "Redeemed"
|
||||||
@@ -252,11 +250,11 @@ msgstr "مستخدم"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "قم بالإلغاء"
|
msgstr "إلغاء"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Ticket not paid"
|
msgid "Ticket not paid"
|
||||||
msgstr "لم يتم دفع قيمة التذكرة"
|
msgstr "التذكرة لم يتم دفع ثمنها"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "This ticket is not yet paid. Do you want to continue anyways?"
|
msgid "This ticket is not yet paid. Do you want to continue anyways?"
|
||||||
@@ -276,23 +274,19 @@ msgstr "تم تسجيل الخروج"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Ticket already used"
|
msgid "Ticket already used"
|
||||||
msgstr "تم استخدام التذكرة مسبقا"
|
msgstr "تم استخدام التذكرة بالفعل"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Information required"
|
msgid "Information required"
|
||||||
msgstr "معلومات مطلوبة"
|
msgstr "المعلومات المطلوبة"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Unknown error."
|
|
||||||
msgid "Unknown ticket"
|
msgid "Unknown ticket"
|
||||||
msgstr "خطأ غير معروف."
|
msgstr "تذكرة غير معروفة"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Entry not allowed"
|
|
||||||
msgid "Ticket type not allowed here"
|
msgid "Ticket type not allowed here"
|
||||||
msgstr "إدخال غير مسموح"
|
msgstr "نوع تذكرة الدخول غير مسموح به هنا"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Entry not allowed"
|
msgid "Entry not allowed"
|
||||||
@@ -300,17 +294,13 @@ msgstr "إدخال غير مسموح"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Ticket code revoked/changed"
|
msgid "Ticket code revoked/changed"
|
||||||
msgstr "تم إلغاء رمز التذكرة أو تبديله"
|
msgstr "تم إلغاء/تغيير رمز التذكرة"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Ticket not paid"
|
|
||||||
msgid "Ticket blocked"
|
msgid "Ticket blocked"
|
||||||
msgstr "لم يتم دفع قيمة التذكرة"
|
msgstr "التذكرة غير محجوبة"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Ticket not paid"
|
|
||||||
msgid "Ticket not valid at this time"
|
msgid "Ticket not valid at this time"
|
||||||
msgstr "لم يتم دفع قيمة التذكرة"
|
msgstr "لم يتم دفع قيمة التذكرة"
|
||||||
|
|
||||||
@@ -320,11 +310,11 @@ msgstr "تم إلغاء الطلب"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Ticket code is ambiguous on list"
|
msgid "Ticket code is ambiguous on list"
|
||||||
msgstr ""
|
msgstr "رمز التذكرة غير واضح في القائمة"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Order not approved"
|
msgid "Order not approved"
|
||||||
msgstr ""
|
msgstr "لم تتم الموافقة على الطلب"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||||
msgid "Checked-in Tickets"
|
msgid "Checked-in Tickets"
|
||||||
@@ -348,12 +338,9 @@ msgstr "نعم"
|
|||||||
#: pretix/static/pretixcontrol/js/ui/question.js
|
#: pretix/static/pretixcontrol/js/ui/question.js
|
||||||
#: pretix/static/pretixpresale/js/ui/questions.js
|
#: pretix/static/pretixpresale/js/ui/questions.js
|
||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "لا"
|
msgstr "من"
|
||||||
|
|
||||||
#: pretix/static/lightbox/js/lightbox.js
|
#: pretix/static/lightbox/js/lightbox.js
|
||||||
#, fuzzy
|
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "Close"
|
|
||||||
msgid "close"
|
msgid "close"
|
||||||
msgstr "إغلاق"
|
msgstr "إغلاق"
|
||||||
|
|
||||||
@@ -408,7 +395,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js
|
#: pretix/static/pretixbase/js/asynctask.js
|
||||||
msgid "We are processing your request …"
|
msgid "We are processing your request …"
|
||||||
msgstr "جاري معالجة طلبك …"
|
msgstr "نحن نقوم بمعالجة طلبك …"
|
||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js
|
#: pretix/static/pretixbase/js/asynctask.js
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -421,7 +408,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js
|
#: pretix/static/pretixbase/js/asynctask.js
|
||||||
msgid "If this takes longer than a few minutes, please contact us."
|
msgid "If this takes longer than a few minutes, please contact us."
|
||||||
msgstr ""
|
msgstr "إذا استغرق ذلك أكثر من بضع دقائق، يرجى الاتصال بنا."
|
||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js
|
#: pretix/static/pretixbase/js/asynctask.js
|
||||||
msgid "Close message"
|
msgid "Close message"
|
||||||
@@ -437,11 +424,11 @@ msgstr "للنسخ اضغط Ctrl + C!"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr ""
|
msgstr "تحرير"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
||||||
msgid "Visualize"
|
msgid "Visualize"
|
||||||
msgstr ""
|
msgstr "تصور"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -449,10 +436,13 @@ msgid ""
|
|||||||
"or variations are not contained in any of your rule parts so people with "
|
"or variations are not contained in any of your rule parts so people with "
|
||||||
"these tickets will not get in:"
|
"these tickets will not get in:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"تقوم القاعدة الخاصة بك دائمًا بالتصفية حسب المنتج أو النوع، لكن المنتجات أو "
|
||||||
|
"الأنواع التالية غير مدرجة في أي من أجزاء القاعدة الخاصة بك، لذا لن يتم قبول "
|
||||||
|
"الأشخاص الذين يحملون هذه التذاكر:"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
||||||
msgid "Please double-check if this was intentional."
|
msgid "Please double-check if this was intentional."
|
||||||
msgstr ""
|
msgstr "يرجى التأكد مرة أخرى مما إذا كان ذلك مقصودًا أم لا."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "All of the conditions below (AND)"
|
msgid "All of the conditions below (AND)"
|
||||||
@@ -492,21 +482,21 @@ msgstr "أضف شرطا"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "minutes"
|
msgid "minutes"
|
||||||
msgstr "الدقائق"
|
msgstr "دقائق"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Duplicate"
|
msgid "Duplicate"
|
||||||
msgstr ""
|
msgstr "مكرر"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgctxt "entry_status"
|
msgctxt "entry_status"
|
||||||
msgid "present"
|
msgid "present"
|
||||||
msgstr ""
|
msgstr "حاضر"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgctxt "entry_status"
|
msgctxt "entry_status"
|
||||||
msgid "absent"
|
msgid "absent"
|
||||||
msgstr ""
|
msgstr "غائب"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "is one of"
|
msgid "is one of"
|
||||||
@@ -522,11 +512,11 @@ msgstr "بعد"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "="
|
msgid "="
|
||||||
msgstr ""
|
msgstr "="
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Product"
|
msgid "Product"
|
||||||
msgstr "منتج"
|
msgstr "المنتج"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Product variation"
|
msgid "Product variation"
|
||||||
@@ -534,7 +524,7 @@ msgstr "نوع المنتج"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Gate"
|
msgid "Gate"
|
||||||
msgstr ""
|
msgstr "الشارع"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Current date and time"
|
msgid "Current date and time"
|
||||||
@@ -542,11 +532,11 @@ msgstr "التاريخ والوقت الحالي"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
|
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
|
||||||
msgstr ""
|
msgstr "اليوم الحالي من الأسبوع (1 = الاثنين، 7 = الأحد)"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Current entry status"
|
msgid "Current entry status"
|
||||||
msgstr ""
|
msgstr "الحالة الحالية للطلب"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Number of previous entries"
|
msgid "Number of previous entries"
|
||||||
@@ -557,48 +547,40 @@ msgid "Number of previous entries since midnight"
|
|||||||
msgstr "عدد المدخلات السابقة قبل منتصف الليل"
|
msgstr "عدد المدخلات السابقة قبل منتصف الليل"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Number of previous entries"
|
|
||||||
msgid "Number of previous entries since"
|
msgid "Number of previous entries since"
|
||||||
msgstr "عدد المدخلات السابقة"
|
msgstr "عدد الإدخالات السابقة منذ"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Number of previous entries"
|
|
||||||
msgid "Number of previous entries before"
|
msgid "Number of previous entries before"
|
||||||
msgstr "عدد المدخلات السابقة"
|
msgstr "عدد الإدخالات السابقة قبل"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Number of days with a previous entry"
|
msgid "Number of days with a previous entry"
|
||||||
msgstr "عدد الأيام التي تحتوي على مدخل سابق"
|
msgstr "عدد الأيام التي تحتوي على مدخل سابق"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Number of days with a previous entry"
|
|
||||||
msgid "Number of days with a previous entry since"
|
msgid "Number of days with a previous entry since"
|
||||||
msgstr "عدد الأيام التي تحتوي على مدخل سابق"
|
msgstr "عدد الأيام التي تحتوي على قيد سابق منذ"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Number of days with a previous entry"
|
|
||||||
msgid "Number of days with a previous entry before"
|
msgid "Number of days with a previous entry before"
|
||||||
msgstr "عدد الأيام التي تحتوي على مدخل سابق"
|
msgstr "عدد الأيام التي يوجد فيها قيد سابق قبل ذلك"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Minutes since last entry (-1 on first entry)"
|
msgid "Minutes since last entry (-1 on first entry)"
|
||||||
msgstr ""
|
msgstr "عدد الدقائق منذ آخر تسجيل (-1 عند التسجيل الأول)"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||||
msgid "Minutes since first entry (-1 on first entry)"
|
msgid "Minutes since first entry (-1 on first entry)"
|
||||||
msgstr ""
|
msgstr "عدد الدقائق منذ أول دخول (-1 عند أول دخول)"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts
|
||||||
msgid "Error: Product not found!"
|
msgid "Error: Product not found!"
|
||||||
msgstr ""
|
msgstr "خطأ: لم يتم العثور على المنتج!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts
|
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts
|
||||||
msgid "Error: Variation not found!"
|
msgid "Error: Variation not found!"
|
||||||
msgstr ""
|
msgstr "خطأ: لم يتم العثور على النسخة!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js
|
#: pretix/static/pretixcontrol/js/ui/editor.js
|
||||||
msgid "Check-in QR"
|
msgid "Check-in QR"
|
||||||
@@ -613,16 +595,12 @@ msgid "Group of objects"
|
|||||||
msgstr "مجموعة من العناصر"
|
msgstr "مجموعة من العناصر"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js
|
#: pretix/static/pretixcontrol/js/ui/editor.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Text object"
|
|
||||||
msgid "Text object (deprecated)"
|
msgid "Text object (deprecated)"
|
||||||
msgstr "عنصر نص"
|
msgstr "كائن نصي (مهمل)"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js
|
#: pretix/static/pretixcontrol/js/ui/editor.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Text object"
|
|
||||||
msgid "Text box"
|
msgid "Text box"
|
||||||
msgstr "عنصر نص"
|
msgstr "مربع نصي"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js
|
#: pretix/static/pretixcontrol/js/ui/editor.js
|
||||||
msgid "Barcode area"
|
msgid "Barcode area"
|
||||||
@@ -669,28 +647,28 @@ msgid "Unknown error."
|
|||||||
msgstr "خطأ غير معروف."
|
msgstr "خطأ غير معروف."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Your color has great contrast and is very easy to read!"
|
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr "اللون يتمتع بتباين كبير وتسهل قراءته!"
|
msgstr "يتميز لونك بتباين رائع ويسهل قراءته للغاية! وسيوفر إمكانية وصول ممتازة."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr "اللون يحظى بتباين معقول ويمكن أن يكون مناسب للقراءة!"
|
msgstr ""
|
||||||
|
"يتميز لونك بتباين جيد، ومن المرجح أنه مناسب للقراءة! وهو كافٍ لتلبية الحد "
|
||||||
|
"الأدنى من متطلبات سهولة الوصول."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"اللون الذي اخترته لا يتمتع بتباين كافٍ مع اللون الأبيض. وسيؤثر ذلك على إمكانية "
|
||||||
|
"الوصول إلى موقعك."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "البحث في الاستفسارات"
|
msgstr "استعلام البحث"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||||
msgid "All"
|
msgid "All"
|
||||||
@@ -706,11 +684,11 @@ msgstr "المختارة فقط"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr "أدخل رقم الصفحة بين 1 و %(max)s."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr "رقم الصفحة غير صحيح."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
@@ -729,10 +707,8 @@ msgid "Calculating default price…"
|
|||||||
msgstr "حساب السعر الافتراضي…"
|
msgstr "حساب السعر الافتراضي…"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/plugins.js
|
#: pretix/static/pretixcontrol/js/ui/plugins.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Search results"
|
|
||||||
msgid "No results"
|
msgid "No results"
|
||||||
msgstr "البحث في النتائج"
|
msgstr "البحث: لا توجد نتائج"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/question.js
|
#: pretix/static/pretixcontrol/js/ui/question.js
|
||||||
msgid "Others"
|
msgid "Others"
|
||||||
@@ -740,7 +716,7 @@ msgstr "غير ذلك"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/question.js
|
#: pretix/static/pretixcontrol/js/ui/question.js
|
||||||
msgid "Count"
|
msgid "Count"
|
||||||
msgstr "احسب"
|
msgstr "العدد"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/subevent.js
|
#: pretix/static/pretixcontrol/js/ui/subevent.js
|
||||||
msgid "(one more date)"
|
msgid "(one more date)"
|
||||||
@@ -753,12 +729,12 @@ msgstr[4] "أيام عديدة"
|
|||||||
msgstr[5] "أخرى"
|
msgstr[5] "أخرى"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "The items in your cart are no longer reserved for you."
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The items in your cart are no longer reserved for you. You can still "
|
"The items in your cart are no longer reserved for you. You can still "
|
||||||
"complete your order as long as they’re available."
|
"complete your order as long as they’re available."
|
||||||
msgstr "لم تعد العناصر الموجودة في عربة التسوق الخاصة بك محجوزة لك."
|
msgstr ""
|
||||||
|
"لم تعد المنتجات الموجودة في سلة التسوق محجوزة لك. لا يزال بإمكانك إتمام طلبك "
|
||||||
|
"طالما كانت هذه المنتجات متوفرة."
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||||
msgid "Cart expired"
|
msgid "Cart expired"
|
||||||
@@ -766,13 +742,9 @@ msgstr "انتهت صلاحية عربة التسوق"
|
|||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||||
msgid "Your cart is about to expire."
|
msgid "Your cart is about to expire."
|
||||||
msgstr ""
|
msgstr "سوف تنتهي صلاحية سلة التسوق الخاصة بك قريبًا."
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "The items in your cart are reserved for you for one minute."
|
|
||||||
#| msgid_plural ""
|
|
||||||
#| "The items in your cart are reserved for you for {num} minutes."
|
|
||||||
msgid "The items in your cart are reserved for you for one minute."
|
msgid "The items in your cart are reserved for you for one minute."
|
||||||
msgid_plural "The items in your cart are reserved for you for {num} minutes."
|
msgid_plural "The items in your cart are reserved for you for {num} minutes."
|
||||||
msgstr[0] "سيتم حجز العناصر لك في سلة التسوق لمدة {num}."
|
msgstr[0] "سيتم حجز العناصر لك في سلة التسوق لمدة {num}."
|
||||||
@@ -783,26 +755,24 @@ msgstr[4] "سيتم حجز العناصر لك في سلة التسوق لدقا
|
|||||||
msgstr[5] "سيتم حجز العناصر لك في سلة التسوق لمدة {num}."
|
msgstr[5] "سيتم حجز العناصر لك في سلة التسوق لمدة {num}."
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Cart expired"
|
|
||||||
msgid "Your cart has expired."
|
msgid "Your cart has expired."
|
||||||
msgstr "انتهت صلاحية عربة التسوق"
|
msgstr "انتهت صلاحية عربة التسوق"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||||
#, fuzzy
|
|
||||||
#| msgid "The items in your cart are no longer reserved for you."
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The items in your cart are no longer reserved for you. You can still "
|
"The items in your cart are no longer reserved for you. You can still "
|
||||||
"complete your order as long as they're available."
|
"complete your order as long as they're available."
|
||||||
msgstr "لم تعد العناصر الموجودة في عربة التسوق الخاصة بك محجوزة لك."
|
msgstr ""
|
||||||
|
"لم تعد المنتجات الموجودة في سلة التسوق محجوزة لك. لا يزال بإمكانك إتمام طلبك "
|
||||||
|
"طالما كانت هذه المنتجات متوفرة."
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||||
msgid "Do you want to renew the reservation period?"
|
msgid "Do you want to renew the reservation period?"
|
||||||
msgstr ""
|
msgstr "هل ترغب في تمديد فترة الحجز؟"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||||
msgid "Renew reservation"
|
msgid "Renew reservation"
|
||||||
msgstr ""
|
msgstr "تجديد الحجز"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/main.js
|
#: pretix/static/pretixpresale/js/ui/main.js
|
||||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||||
@@ -822,82 +792,77 @@ msgstr "التوقيت المحلي:"
|
|||||||
|
|
||||||
#: pretix/static/pretixpresale/js/walletdetection.js
|
#: pretix/static/pretixpresale/js/walletdetection.js
|
||||||
msgid "Google Pay"
|
msgid "Google Pay"
|
||||||
msgstr ""
|
msgstr "Google Pay"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Quantity"
|
msgid "Quantity"
|
||||||
msgstr ""
|
msgstr "الكمية"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Decrease quantity"
|
msgid "Decrease quantity"
|
||||||
msgstr ""
|
msgstr "تقليل الكمية"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Increase quantity"
|
msgid "Increase quantity"
|
||||||
msgstr ""
|
msgstr "زيادة الكمية"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Filter events by"
|
msgid "Filter events by"
|
||||||
msgstr ""
|
msgstr "تصفية الأحداث حسب"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Filter"
|
msgid "Filter"
|
||||||
msgstr ""
|
msgstr "فلتر"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Price"
|
msgid "Price"
|
||||||
msgstr ""
|
msgstr "السعر"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Original price: %s"
|
msgid "Original price: %s"
|
||||||
msgstr ""
|
msgstr "السعر الأصلي: %s"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "New price: %s"
|
msgid "New price: %s"
|
||||||
msgstr ""
|
msgstr "السعر الجديد: %s"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Selected only"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Select"
|
msgid "Select"
|
||||||
msgstr "المختارة فقط"
|
msgstr "المختارة فقط"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
#| msgid "Selected only"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Select %s"
|
msgid "Select %s"
|
||||||
msgstr "المختارة فقط"
|
msgstr "تم اختيار %s فقط"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "See variations"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Select variant %s"
|
msgid "Select variant %s"
|
||||||
msgstr "أنظر إلى الاختلافات"
|
msgstr "اختر النوع %s"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
@@ -940,7 +905,7 @@ msgstr "من %(currency) s %(price)s"
|
|||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Image of %s"
|
msgid "Image of %s"
|
||||||
msgstr ""
|
msgstr "صورة لـ %s"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
@@ -981,27 +946,21 @@ msgstr "متوفرة مع القسيمة فقط"
|
|||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "currently available: %s"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Not yet available"
|
msgid "Not yet available"
|
||||||
msgstr "متوفر حاليا: %s"
|
msgstr "حاليًا غير متوفر: %s"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Not available anymore"
|
msgid "Not available anymore"
|
||||||
msgstr ""
|
msgstr "لم يعد متوفراً"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "currently available: %s"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Currently not available"
|
msgid "Currently not available"
|
||||||
msgstr "متوفر حاليا: %s"
|
msgstr "غير متوفر حاليًا: %s"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
@@ -1029,24 +988,20 @@ msgid ""
|
|||||||
"There are currently a lot of users in this ticket shop. Please open the shop "
|
"There are currently a lot of users in this ticket shop. Please open the shop "
|
||||||
"in a new tab to continue."
|
"in a new tab to continue."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"يوجد حالياً عدد كبير من المستخدمين في متجر التذاكر هذا. يرجى فتح المتجر في "
|
||||||
|
"علامة تبويب جديدة للمتابعة."
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "Close ticket shop"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Open ticket shop"
|
msgid "Open ticket shop"
|
||||||
msgstr "إغلاق متجر التذاكر"
|
msgstr "إغلاق/فتح متجر التذاكر"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "Resume checkout"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Checkout"
|
msgid "Checkout"
|
||||||
msgstr "استئناف الدفع"
|
msgstr "استئناف عملية الدفع"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
@@ -1061,6 +1016,9 @@ msgid ""
|
|||||||
"We could not create your cart, since there are currently too many users in "
|
"We could not create your cart, since there are currently too many users in "
|
||||||
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"لم نتمكن من إنشاء سلة التسوق الخاصة بك، نظرًا لوجود عدد كبير جدًّا من "
|
||||||
|
"المستخدمين حاليًّا في متجر التذاكر هذا. يرجى النقر على «متابعة» لإعادة المحاولة "
|
||||||
|
"في علامة تبويب جديدة."
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
@@ -1110,18 +1068,15 @@ msgstr "إغلاق"
|
|||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "Resume checkout"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Close checkout"
|
msgid "Close checkout"
|
||||||
msgstr "استئناف الدفع"
|
msgstr "إغلاق عملية الدفع"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||||
msgstr ""
|
msgstr "لا يمكنك إلغاء هذه العملية. يرجى الانتظار حتى ينتهي التحميل."
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
@@ -1131,21 +1086,15 @@ msgstr "استمرار"
|
|||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "See variations"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Show variants"
|
msgid "Show variants"
|
||||||
msgstr "أنظر إلى الاختلافات"
|
msgstr "انظر الاختلافات"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "See variations"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Hide variants"
|
msgid "Hide variants"
|
||||||
msgstr "أنظر إلى الاختلافات"
|
msgstr "إخفاء الاختلافات"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
@@ -1203,11 +1152,11 @@ msgid ""
|
|||||||
"add yourself to the waiting list. We will then notify if seats are available "
|
"add yourself to the waiting list. We will then notify if seats are available "
|
||||||
"again."
|
"again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"تم بيع جميع فئات التذاكر أو بعضها حاليًا. إذا أردت، يمكنك إضافة اسمك إلى "
|
||||||
|
"قائمة الانتظار. وسنقوم بإخطارك إذا توفرت مقاعد مرة أخرى."
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Load more"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Load more"
|
msgid "Load more"
|
||||||
msgstr "تحميل المزيد"
|
msgstr "تحميل المزيد"
|
||||||
@@ -1250,37 +1199,37 @@ msgstr "الأحد"
|
|||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgid "Monday"
|
msgid "Monday"
|
||||||
msgstr ""
|
msgstr "الاثنين"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgid "Tuesday"
|
msgid "Tuesday"
|
||||||
msgstr ""
|
msgstr "الثلاثاء"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgid "Wednesday"
|
msgid "Wednesday"
|
||||||
msgstr ""
|
msgstr "الأربعاء"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgid "Thursday"
|
msgid "Thursday"
|
||||||
msgstr ""
|
msgstr "الخميس"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgid "Friday"
|
msgid "Friday"
|
||||||
msgstr ""
|
msgstr "الجمعة"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgid "Saturday"
|
msgid "Saturday"
|
||||||
msgstr ""
|
msgstr "السبت"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgid "Sunday"
|
msgid "Sunday"
|
||||||
msgstr ""
|
msgstr "الأحد"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
@@ -1305,7 +1254,7 @@ msgstr "أبريل"
|
|||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
msgid "May"
|
msgid "May"
|
||||||
msgstr "مايو"
|
msgstr "هناك"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
|
"POT-Creation-Date: 2026-07-30 13:52+0000\n"
|
||||||
"PO-Revision-Date: 2024-12-11 01:00+0000\n"
|
"PO-Revision-Date: 2024-12-11 01:00+0000\n"
|
||||||
"Last-Translator: Neriman Memmedli <nerim4n@pm.me>\n"
|
"Last-Translator: Neriman Memmedli <nerim4n@pm.me>\n"
|
||||||
"Language-Team: Azerbaijani <https://translate.pretix.eu/projects/pretix/"
|
"Language-Team: Azerbaijani <https://translate.pretix.eu/projects/pretix/"
|
||||||
@@ -19,38 +19,6 @@ msgstr ""
|
|||||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
"X-Generator: Weblate 5.8.4\n"
|
"X-Generator: Weblate 5.8.4\n"
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "Shop disabled"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale over"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale not started"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "On sale"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/_base_settings.py
|
#: pretix/_base_settings.py
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "İngiliscə"
|
msgstr "İngiliscə"
|
||||||
@@ -1201,6 +1169,19 @@ msgstr ""
|
|||||||
msgid "Download a spreadsheet of all currently registered customer accounts."
|
msgid "Download a spreadsheet of all currently registered customer accounts."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/permissions.py
|
||||||
|
#: pretix/control/navigation.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
msgid "Customers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
#: pretix/presale/views/customer.py
|
||||||
|
msgid "Memberships"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
@@ -1333,6 +1314,66 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/live.html
|
||||||
|
msgid "Test mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
|
#: pretix/plugins/reports/exporters.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
msgid "Canceled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
msgid "Membership type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
msgid "Purchase ticket"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/forms/questions.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/rrule.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "Start date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
msgid "Start time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "End date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
msgid "End time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
||||||
msgctxt "export_category"
|
msgctxt "export_category"
|
||||||
msgid "Invoices"
|
msgid "Invoices"
|
||||||
@@ -2160,30 +2201,6 @@ msgstr ""
|
|||||||
msgid "Position ID"
|
msgid "Position ID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/forms/questions.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/rrule.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "Start date"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "End date"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
||||||
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
||||||
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
||||||
@@ -2575,12 +2592,6 @@ msgstr ""
|
|||||||
msgid "Gift card code"
|
msgid "Gift card code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/live.html
|
|
||||||
msgid "Test mode"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
||||||
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup.html
|
#: pretix/control/templates/pretixcontrol/email_setup.html
|
||||||
@@ -2694,7 +2705,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/plugins/reports/exporters.py
|
#: pretix/plugins/reports/exporters.py pretix/plugins/sendmail/forms.py
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
||||||
msgid "Expired"
|
msgid "Expired"
|
||||||
@@ -2860,7 +2871,7 @@ msgid "This combination of credentials is not known to our system."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
||||||
#: pretix/presale/forms/customer.py
|
#: pretix/control/views/user.py pretix/presale/forms/customer.py
|
||||||
msgid "For security reasons, please wait 5 minutes before you try again."
|
msgid "For security reasons, please wait 5 minutes before you try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -3783,6 +3794,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/views/vouchers.py
|
#: pretix/control/views/vouchers.py
|
||||||
msgid "Price effect"
|
msgid "Price effect"
|
||||||
@@ -4400,8 +4412,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/base/models/event.py
|
#: pretix/base/models/event.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"This will be used to let users know if the event is in a different timezone "
|
"This will be used to let users know if the event is in a different timezone, "
|
||||||
"and let’s us calculate users’ local times."
|
"and to let us calculate the local time of a user."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
||||||
@@ -5696,23 +5708,6 @@ msgstr ""
|
|||||||
msgid "Number of times this membership can be used in a purchase."
|
msgid "Number of times this membership can be used in a purchase."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
|
||||||
#: pretix/plugins/reports/exporters.py
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
msgid "Canceled"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
msgid "Membership type"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/models/orders.py
|
#: pretix/base/models/orders.py
|
||||||
msgid "pending"
|
msgid "pending"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -6491,7 +6486,7 @@ msgstr ""
|
|||||||
msgid "It is currently not possible to create vouchers for add-on products."
|
msgid "It is currently not possible to create vouchers for add-on products."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"You need to select a specific product or quota if this voucher should "
|
"You need to select a specific product or quota if this voucher should "
|
||||||
"reserve tickets."
|
"reserve tickets."
|
||||||
@@ -6510,7 +6505,7 @@ msgid ""
|
|||||||
"usages."
|
"usages."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you want this voucher to block quota, you need to select a specific date."
|
"If you want this voucher to block quota, you need to select a specific date."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -6979,6 +6974,12 @@ msgstr ""
|
|||||||
msgid "This gift card was used in the meantime. Please try again."
|
msgid "This gift card was used in the meantime. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/payment.py
|
||||||
|
msgid ""
|
||||||
|
"This payment provider exists for historical purposes only and is no longer "
|
||||||
|
"usable."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/pdf.py
|
#: pretix/base/pdf.py
|
||||||
msgid "Ticket code (barcode content)"
|
msgid "Ticket code (barcode content)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7535,11 +7536,6 @@ msgid ""
|
|||||||
"permissions."
|
"permissions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
|
||||||
msgid "Customers"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
#: pretix/base/permissions.py pretix/control/navigation.py
|
||||||
msgid "Devices"
|
msgid "Devices"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -8665,6 +8661,12 @@ msgid ""
|
|||||||
"card."
|
"card."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/services/orders.py
|
||||||
|
msgid ""
|
||||||
|
"You cannot change the ticket secret of a position that has been used to "
|
||||||
|
"issue a gift card."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/services/orders.py
|
#: pretix/base/services/orders.py
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -10197,11 +10199,11 @@ msgstr ""
|
|||||||
msgid "We'll show this publicly to allow attendees to contact you."
|
msgid "We'll show this publicly to allow attendees to contact you."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
msgid "Contact URL"
|
msgid "Contact URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you set this, the footer contact link will point here instead of using "
|
"If you set this, the footer contact link will point here instead of using "
|
||||||
"the email address above. Please note that you still need to add a contact "
|
"the email address above. Please note that you still need to add a contact "
|
||||||
@@ -11682,6 +11684,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
@@ -12877,7 +12880,7 @@ msgstr ""
|
|||||||
msgid "Valid orders"
|
msgid "Valid orders"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
msgid "Paid (or canceled with paid fee)"
|
msgid "Paid (or canceled with paid fee)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -12901,7 +12904,7 @@ msgstr ""
|
|||||||
msgid "Cancellations"
|
msgid "Cancellations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
msgid "Canceled (fully)"
|
msgid "Canceled (fully)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -13076,6 +13079,22 @@ msgstr ""
|
|||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale not started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale over"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
||||||
msgid "Date from"
|
msgid "Date from"
|
||||||
@@ -13113,13 +13132,6 @@ msgstr ""
|
|||||||
msgid "not yet activated"
|
msgid "not yet activated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
#: pretix/presale/views/customer.py
|
|
||||||
msgid "Memberships"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
msgid "Has no memberships"
|
msgid "Has no memberships"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -13347,6 +13359,36 @@ msgstr ""
|
|||||||
msgid "Search email address or subject"
|
msgid "Search email address or subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
msgid "Source"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "All sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Team actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Customer actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Device actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "User email"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py pretix/control/navigation.py
|
||||||
|
msgid "All users"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/global_settings.py
|
#: pretix/control/forms/global_settings.py
|
||||||
msgid "Additional footer text"
|
msgid "Additional footer text"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -14524,6 +14566,7 @@ msgstr ""
|
|||||||
#: pretix/control/forms/renderers.py
|
#: pretix/control/forms/renderers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
msgctxt "form_bulk"
|
msgctxt "form_bulk"
|
||||||
msgid "change"
|
msgid "change"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -14637,6 +14680,53 @@ msgid ""
|
|||||||
"should show them."
|
"should show them."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"You cannot reduce the maximum number of redemptions to %(max_usages)s, "
|
||||||
|
"because at least one of the selected vouchers has already been redeemed "
|
||||||
|
"%(max_redeemed)s times."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"You cannot create a voucher that allows selection of a quota but has no date "
|
||||||
|
"selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid "The selected quota does not match the selected subevent."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid "There is no sufficient quota available to perform this change."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the maximum number of usages in bulk is not supported if any of the "
|
||||||
|
"selected vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgctxt "subevent"
|
||||||
|
msgid ""
|
||||||
|
"Changing the date in bulk is not supported if any of the selected vouchers "
|
||||||
|
"is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the product to a quota is not supported if any of the selected "
|
||||||
|
"vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"This change cannot be completed because not all assigned seats of the "
|
||||||
|
"vouchers are still available"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/vouchers.py
|
#: pretix/control/forms/vouchers.py
|
||||||
msgid "Codes"
|
msgid "Codes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -16342,10 +16432,6 @@ msgstr ""
|
|||||||
msgid "Account history"
|
msgid "Account history"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
|
||||||
msgid "All users"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
#: pretix/control/navigation.py
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
msgid "Admin sessions"
|
msgid "Admin sessions"
|
||||||
@@ -16614,6 +16700,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/users/create.html
|
#: pretix/control/templates/pretixcontrol/users/create.html
|
||||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
||||||
@@ -17031,8 +17118,8 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/question.html
|
#: pretix/control/templates/pretixcontrol/items/question.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/orders/index.html
|
#: pretix/control/templates/pretixcontrol/orders/index.html
|
||||||
@@ -17043,7 +17130,6 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
||||||
@@ -17178,6 +17264,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
||||||
msgid "Select all results on other pages as well"
|
msgid "Select all results on other pages as well"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -17733,6 +17820,22 @@ msgstr ""
|
|||||||
msgid "We found an SPF record on your domain that includes this system. Great!"
|
msgid "We found an SPF record on your domain that includes this system. Great!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "Your new DKIM record should be set up as a CNAME record like this:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "We found a DKIM record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "Your new DMARC record could look like this:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "We found a DMARC record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
msgid "Verification"
|
msgid "Verification"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -17893,6 +17996,94 @@ msgid ""
|
|||||||
"undeletable data, such as orders not performed in test mode."
|
"undeletable data, such as orders not performed in test mode."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "Personal data was cleared from this log entry."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "This change was performed by a pretix administrator."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
msgid "Inspect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>overpaid orders</strong>, for example due to "
|
||||||
|
"duplicate payment attempts. You should review the cases and consider "
|
||||||
|
"refunding the overpaid amount to the user."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show overpaid orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending refunds</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show pending refunds"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>requested cancellations</strong> that you should "
|
||||||
|
"take care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders requesting cancellation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending approvals</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders pending approval"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>fully paid orders</strong> that are not marked "
|
||||||
|
"as paid, probably because no quota was left at the time their payment "
|
||||||
|
"arrived. You should review the cases and consider either refunding the "
|
||||||
|
"customer or creating more space."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show affected orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"Orders in this event could not be <strong>synced to an external system</"
|
||||||
|
"strong> as configured."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show sync problems"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/delete.html
|
#: pretix/control/templates/pretixcontrol/event/delete.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"This operation will destroy your event including all configuration, "
|
"This operation will destroy your event including all configuration, "
|
||||||
@@ -18007,69 +18198,6 @@ msgstr ""
|
|||||||
msgid "Create QR code"
|
msgid "Create QR code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>overpaid orders</strong>, for example due to "
|
|
||||||
"duplicate payment attempts. You should review the cases and consider "
|
|
||||||
"refunding the overpaid amount to the user."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show overpaid orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending refunds</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show pending refunds"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>requested cancellations</strong> that you should "
|
|
||||||
"take care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders requesting cancellation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending approvals</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders pending approval"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>fully paid orders</strong> that are not marked "
|
|
||||||
"as paid, probably because no quota was left at the time their payment "
|
|
||||||
"arrived. You should review the cases and consider either refunding the "
|
|
||||||
"customer or creating more space."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show affected orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"Orders in this event could not be <strong>synced to an external system</"
|
|
||||||
"strong> as configured."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show sync problems"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
#: pretix/control/templates/pretixcontrol/event/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Update comment"
|
msgid "Update comment"
|
||||||
@@ -18244,44 +18372,6 @@ msgstr ""
|
|||||||
msgid "Enable test mode"
|
msgid "Enable test mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "All actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Team actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Customer actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "Personal data was cleared from this log entry."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "This change was performed by a pretix administrator."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
msgid "Inspect"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
@@ -19180,6 +19270,20 @@ msgstr ""
|
|||||||
msgid "More quotas"
|
msgid "More quotas"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "Shop disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "On sale"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
msgid "Open event dashboard"
|
msgid "Open event dashboard"
|
||||||
@@ -19190,6 +19294,10 @@ msgctxt "typography"
|
|||||||
msgid "The quick brown fox jumps over the lazy dog."
|
msgid "The quick brown fox jumps over the lazy dog."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
|
msgid "Specific object selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
||||||
msgid "Quota:"
|
msgid "Quota:"
|
||||||
@@ -20204,6 +20312,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%(number)s selected"
|
msgid "%(number)s selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -20290,6 +20399,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
msgid "Edit selected"
|
msgid "Edit selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -20586,6 +20696,13 @@ msgid ""
|
|||||||
"the customer account."
|
"the customer account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
|
#: pretix/control/views/orders.py
|
||||||
|
msgid ""
|
||||||
|
"Ticket secrets of order positions that have been used to issue a gift card "
|
||||||
|
"can not be changed. Only the link will be changed in this case."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"Removing or splitting this position will also remove or split all add-ons to "
|
"Removing or splitting this position will also remove or split all add-ons to "
|
||||||
@@ -20998,11 +21115,6 @@ msgstr ""
|
|||||||
msgid "Create a refund"
|
msgid "Create a refund"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
msgid "Source"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Cancel transfer"
|
msgid "Cancel transfer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -22079,6 +22191,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -24235,11 +24348,13 @@ msgid "Copy codes"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Voucher details"
|
msgid "Voucher details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you choose \"any product\" for a specific quota and choose to reserve "
|
"If you choose \"any product\" for a specific quota and choose to reserve "
|
||||||
@@ -24247,6 +24362,10 @@ msgid ""
|
|||||||
"voucher holder if another quota associated with the product is sold out!"
|
"voucher holder if another quota associated with the product is sold out!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
|
msgid "Change multiple vouchers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Delete voucher"
|
msgid "Delete voucher"
|
||||||
@@ -24586,7 +24705,8 @@ msgstr ""
|
|||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
||||||
"team."
|
"team. If you want to add a different user or create a new account, log out "
|
||||||
|
"and click the invitation link again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/auth.py
|
#: pretix/control/views/auth.py
|
||||||
@@ -25189,6 +25309,30 @@ msgid ""
|
|||||||
"record."
|
"record."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We could not find a CNAME record pointing to our DKIM key for domain you are "
|
||||||
|
"trying to use. This means that there is a very high change most of the "
|
||||||
|
"emails will be rejected or marked as spam. We strongly recommend setting up "
|
||||||
|
"DKIM through a CNAME record. You can do so through the DNS settings at the "
|
||||||
|
"provider you registered your domain with."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We found a CNAME record for a DKIM key, but it is not pointing to the right "
|
||||||
|
"location. This means that there is a very high chance most of the emails "
|
||||||
|
"will be rejected or marked as spam. You should update the DNS settings of "
|
||||||
|
"your domain."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We did not find DMARC record for your domain. This means that there is a "
|
||||||
|
"very high chance most of the emails will be rejected or marked as spam. You "
|
||||||
|
"should update the DNS settings of your domain."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/mailsetup.py
|
#: pretix/control/views/mailsetup.py
|
||||||
msgid "The verification code was incorrect, please try again."
|
msgid "The verification code was incorrect, please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -26248,6 +26392,7 @@ msgid "Macao"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/helpers/daterange.py
|
#: pretix/helpers/daterange.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_list.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
||||||
@@ -27435,11 +27580,6 @@ msgstr ""
|
|||||||
msgid "PayPal account"
|
msgid "PayPal account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
|
||||||
#, python-brace-format
|
|
||||||
msgid "<a target=\"_blank\" rel=\"noopener\" href=\"{docs_url}\">{text}</a>"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -28074,8 +28214,13 @@ msgstr ""
|
|||||||
#: pretix/plugins/returnurl/views.py
|
#: pretix/plugins/returnurl/views.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"Redirection will only be allowed to URLs that start with one of these "
|
"Redirection will only be allowed to URLs that start with one of these "
|
||||||
"prefixes. Enter one or more allowed URL prefix per line. URL prefixes must "
|
"prefixes. Enter one allowed URL prefix per line. URL prefixes must include a "
|
||||||
"include a slash after the hostname."
|
"slash after the hostname."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/plugins/returnurl/views.py
|
||||||
|
msgid ""
|
||||||
|
"All values must be URLs that include at last one slash after the hostname."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/sendmail/apps.py
|
#: pretix/plugins/sendmail/apps.py
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
|
"POT-Creation-Date: 2026-07-30 13:52+0000\n"
|
||||||
"PO-Revision-Date: 2026-06-25 14:00+0000\n"
|
"PO-Revision-Date: 2026-06-25 14:00+0000\n"
|
||||||
"Last-Translator: Kim Lozano <joaquim.lozano@upc.edu>\n"
|
"Last-Translator: Kim Lozano <joaquim.lozano@upc.edu>\n"
|
||||||
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix/"
|
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||||
@@ -19,38 +19,6 @@ msgstr ""
|
|||||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
"X-Generator: Weblate 2026.6.1\n"
|
"X-Generator: Weblate 2026.6.1\n"
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "Shop disabled"
|
|
||||||
msgstr "Botiga desactivada"
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale over"
|
|
||||||
msgstr "S'ha acabat la prevenda"
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale not started"
|
|
||||||
msgstr "No ha començat la prevenda"
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "On sale"
|
|
||||||
msgstr "En venda"
|
|
||||||
|
|
||||||
#: pretix/_base_settings.py
|
#: pretix/_base_settings.py
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "Anglès"
|
msgstr "Anglès"
|
||||||
@@ -1374,6 +1342,24 @@ msgstr "Compte de Stripe"
|
|||||||
msgid "Download a spreadsheet of all currently registered customer accounts."
|
msgid "Download a spreadsheet of all currently registered customer accounts."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/permissions.py
|
||||||
|
#: pretix/control/navigation.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgctxt "refund_source"
|
||||||
|
#| msgid "Customer"
|
||||||
|
msgid "Customers"
|
||||||
|
msgstr "Client"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
#: pretix/presale/views/customer.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Members"
|
||||||
|
msgid "Memberships"
|
||||||
|
msgstr "Membres"
|
||||||
|
|
||||||
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
@@ -1513,6 +1499,74 @@ msgstr "Si"
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "No"
|
msgstr "No"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/live.html
|
||||||
|
msgid "Test mode"
|
||||||
|
msgstr "Mode de prova"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
|
#: pretix/plugins/reports/exporters.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
msgid "Canceled"
|
||||||
|
msgstr "Cancel·lat"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Members"
|
||||||
|
msgid "Membership type"
|
||||||
|
msgstr "Membres"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Purchased"
|
||||||
|
msgid "Purchase ticket"
|
||||||
|
msgstr "Comprat"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/forms/questions.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/rrule.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "Start date"
|
||||||
|
msgstr "Data d'inici"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Date"
|
||||||
|
msgid "Start time"
|
||||||
|
msgstr "Data"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "End date"
|
||||||
|
msgstr "Data de finalització"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "End: %(time)s"
|
||||||
|
msgid "End time"
|
||||||
|
msgstr "Final: %(time)s"
|
||||||
|
|
||||||
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Invoices"
|
#| msgid "Invoices"
|
||||||
@@ -2390,30 +2444,6 @@ msgstr "cancel·lat"
|
|||||||
msgid "Position ID"
|
msgid "Position ID"
|
||||||
msgstr "Identificador de la posició"
|
msgstr "Identificador de la posició"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/forms/questions.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/rrule.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "Start date"
|
|
||||||
msgstr "Data d'inici"
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "End date"
|
|
||||||
msgstr "Data de finalització"
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
||||||
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
||||||
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
||||||
@@ -2854,12 +2884,6 @@ msgstr ""
|
|||||||
msgid "Gift card code"
|
msgid "Gift card code"
|
||||||
msgstr "Codi del val regal"
|
msgstr "Codi del val regal"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/live.html
|
|
||||||
msgid "Test mode"
|
|
||||||
msgstr "Mode de prova"
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
||||||
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup.html
|
#: pretix/control/templates/pretixcontrol/email_setup.html
|
||||||
@@ -2973,7 +2997,7 @@ msgstr "Expirat i amb valor"
|
|||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/plugins/reports/exporters.py
|
#: pretix/plugins/reports/exporters.py pretix/plugins/sendmail/forms.py
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
||||||
msgid "Expired"
|
msgid "Expired"
|
||||||
@@ -3159,7 +3183,7 @@ msgid "This combination of credentials is not known to our system."
|
|||||||
msgstr "El sistema no reconeix aquesta combinació de credencials."
|
msgstr "El sistema no reconeix aquesta combinació de credencials."
|
||||||
|
|
||||||
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
||||||
#: pretix/presale/forms/customer.py
|
#: pretix/control/views/user.py pretix/presale/forms/customer.py
|
||||||
msgid "For security reasons, please wait 5 minutes before you try again."
|
msgid "For security reasons, please wait 5 minutes before you try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Per raons de seguretat, si us plau espereu 5 minuts abans de tornar-ho a "
|
"Per raons de seguretat, si us plau espereu 5 minuts abans de tornar-ho a "
|
||||||
@@ -4186,6 +4210,7 @@ msgstr "Permet traspassar la quota"
|
|||||||
|
|
||||||
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/views/vouchers.py
|
#: pretix/control/views/vouchers.py
|
||||||
msgid "Price effect"
|
msgid "Price effect"
|
||||||
@@ -4909,8 +4934,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/base/models/event.py
|
#: pretix/base/models/event.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"This will be used to let users know if the event is in a different timezone "
|
"This will be used to let users know if the event is in a different timezone, "
|
||||||
"and let’s us calculate users’ local times."
|
"and to let us calculate the local time of a user."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
||||||
@@ -6448,25 +6473,6 @@ msgstr ""
|
|||||||
msgid "Number of times this membership can be used in a purchase."
|
msgid "Number of times this membership can be used in a purchase."
|
||||||
msgstr "Número de vegades que es pot utilitzar aquest val."
|
msgstr "Número de vegades que es pot utilitzar aquest val."
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
|
||||||
#: pretix/plugins/reports/exporters.py
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
msgid "Canceled"
|
|
||||||
msgstr "Cancel·lat"
|
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Members"
|
|
||||||
msgid "Membership type"
|
|
||||||
msgstr "Membres"
|
|
||||||
|
|
||||||
#: pretix/base/models/orders.py
|
#: pretix/base/models/orders.py
|
||||||
msgid "pending"
|
msgid "pending"
|
||||||
msgstr "pendent"
|
msgstr "pendent"
|
||||||
@@ -7327,7 +7333,7 @@ msgstr "Aquesta variació no pertany a aquest producte."
|
|||||||
msgid "It is currently not possible to create vouchers for add-on products."
|
msgid "It is currently not possible to create vouchers for add-on products."
|
||||||
msgstr "Actualment no es poden crear vals per a complements de productes."
|
msgstr "Actualment no es poden crear vals per a complements de productes."
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"You need to select a specific product or quota if this voucher should "
|
"You need to select a specific product or quota if this voucher should "
|
||||||
"reserve tickets."
|
"reserve tickets."
|
||||||
@@ -7355,7 +7361,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"El número màxim per comanda no pot ser menor que el número mínim per comanda."
|
"El número màxim per comanda no pot ser menor que el número mínim per comanda."
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you want this voucher to block quota, you need to select a specific date."
|
"If you want this voucher to block quota, you need to select a specific date."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7899,6 +7905,12 @@ msgstr ""
|
|||||||
msgid "This gift card was used in the meantime. Please try again."
|
msgid "This gift card was used in the meantime. Please try again."
|
||||||
msgstr "Aquesta targeta regal ja s'ha fet servir. Si us plau torneu a provar."
|
msgstr "Aquesta targeta regal ja s'ha fet servir. Si us plau torneu a provar."
|
||||||
|
|
||||||
|
#: pretix/base/payment.py
|
||||||
|
msgid ""
|
||||||
|
"This payment provider exists for historical purposes only and is no longer "
|
||||||
|
"usable."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/pdf.py
|
#: pretix/base/pdf.py
|
||||||
msgid "Ticket code (barcode content)"
|
msgid "Ticket code (barcode content)"
|
||||||
msgstr "Codi de tiquet (contingut del codi de barres)"
|
msgstr "Codi de tiquet (contingut del codi de barres)"
|
||||||
@@ -8549,14 +8561,6 @@ msgid ""
|
|||||||
"permissions."
|
"permissions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
|
||||||
#, fuzzy
|
|
||||||
#| msgctxt "refund_source"
|
|
||||||
#| msgid "Customer"
|
|
||||||
msgid "Customers"
|
|
||||||
msgstr "Client"
|
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
#: pretix/base/permissions.py pretix/control/navigation.py
|
||||||
msgid "Devices"
|
msgid "Devices"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -9949,6 +9953,14 @@ msgid ""
|
|||||||
"card."
|
"card."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/services/orders.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "You cannot select a quota that belongs to a different event."
|
||||||
|
msgid ""
|
||||||
|
"You cannot change the ticket secret of a position that has been used to "
|
||||||
|
"issue a gift card."
|
||||||
|
msgstr "No podeu seleccionar una quota que pertany a un esdeveniment diferent."
|
||||||
|
|
||||||
#: pretix/base/services/orders.py
|
#: pretix/base/services/orders.py
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -11822,13 +11834,13 @@ msgid "We'll show this publicly to allow attendees to contact you."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Això es mostrarà públicament per permetre que els assistents us contactin."
|
"Això es mostrarà públicament per permetre que els assistents us contactin."
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Contact address"
|
#| msgid "Contact address"
|
||||||
msgid "Contact URL"
|
msgid "Contact URL"
|
||||||
msgstr "Adreça de contacte"
|
msgstr "Adreça de contacte"
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you set this, the footer contact link will point here instead of using "
|
"If you set this, the footer contact link will point here instead of using "
|
||||||
"the email address above. Please note that you still need to add a contact "
|
"the email address above. Please note that you still need to add a contact "
|
||||||
@@ -13864,6 +13876,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
@@ -15303,7 +15316,7 @@ msgstr "Totes les comandes"
|
|||||||
msgid "Valid orders"
|
msgid "Valid orders"
|
||||||
msgstr "Comandes pagades"
|
msgstr "Comandes pagades"
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
msgid "Paid (or canceled with paid fee)"
|
msgid "Paid (or canceled with paid fee)"
|
||||||
msgstr "Paga (o cancel·lat amb tarifa de pagament)"
|
msgstr "Paga (o cancel·lat amb tarifa de pagament)"
|
||||||
|
|
||||||
@@ -15332,7 +15345,7 @@ msgstr "Pendent o pagat"
|
|||||||
msgid "Cancellations"
|
msgid "Cancellations"
|
||||||
msgstr "Cancel·lació"
|
msgstr "Cancel·lació"
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Canceled (paid fee)"
|
#| msgid "Canceled (paid fee)"
|
||||||
msgid "Canceled (fully)"
|
msgid "Canceled (fully)"
|
||||||
@@ -15546,6 +15559,22 @@ msgstr "La tenda està activa i la pre-venda en marxa"
|
|||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr "Inactiu"
|
msgstr "Inactiu"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale not started"
|
||||||
|
msgstr "No ha començat la prevenda"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale over"
|
||||||
|
msgstr "S'ha acabat la prevenda"
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -15595,15 +15624,6 @@ msgstr "Inactiu"
|
|||||||
msgid "not yet activated"
|
msgid "not yet activated"
|
||||||
msgstr "Inactiu"
|
msgstr "Inactiu"
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
#: pretix/presale/views/customer.py
|
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Members"
|
|
||||||
msgid "Memberships"
|
|
||||||
msgstr "Membres"
|
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Event end"
|
#| msgid "Event end"
|
||||||
@@ -15877,6 +15897,42 @@ msgstr "Revocar l'accés"
|
|||||||
msgid "Search email address or subject"
|
msgid "Search email address or subject"
|
||||||
msgstr "Requereix adreces de correu per tiquet"
|
msgstr "Requereix adreces de correu per tiquet"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
msgid "Source"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "All orders"
|
||||||
|
msgid "All sources"
|
||||||
|
msgstr "Totes les comandes"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Team actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Customer actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Device name"
|
||||||
|
msgid "Device actions"
|
||||||
|
msgstr "Nom del dispositiu"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Order details"
|
||||||
|
msgid "User email"
|
||||||
|
msgstr "Detalls de la comanda"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py pretix/control/navigation.py
|
||||||
|
msgid "All users"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/global_settings.py
|
#: pretix/control/forms/global_settings.py
|
||||||
msgid "Additional footer text"
|
msgid "Additional footer text"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -17206,6 +17262,7 @@ msgstr "Opcional"
|
|||||||
#: pretix/control/forms/renderers.py
|
#: pretix/control/forms/renderers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Save changes"
|
#| msgid "Save changes"
|
||||||
msgctxt "form_bulk"
|
msgctxt "form_bulk"
|
||||||
@@ -17327,6 +17384,65 @@ msgid ""
|
|||||||
"should show them."
|
"should show them."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"You cannot reduce the maximum number of redemptions to %(max_usages)s, "
|
||||||
|
"because at least one of the selected vouchers has already been redeemed "
|
||||||
|
"%(max_redeemed)s times."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "You cannot create a voucher that blocks quota as the selected product or "
|
||||||
|
#| "quota is currently sold out or completely reserved."
|
||||||
|
msgid ""
|
||||||
|
"You cannot create a voucher that allows selection of a quota but has no date "
|
||||||
|
"selected."
|
||||||
|
msgstr ""
|
||||||
|
"No podeu crear un val que bloca la quota ja que el producte o quota "
|
||||||
|
"seleccionats s'han venut o reservat completament."
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The selected product does not allow to select a seat."
|
||||||
|
msgid "The selected quota does not match the selected subevent."
|
||||||
|
msgstr "El producte seleccionat no permet triar un seient."
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "There is not enough quota available on quota \"{}\" to perform the "
|
||||||
|
#| "operation."
|
||||||
|
msgid "There is no sufficient quota available to perform this change."
|
||||||
|
msgstr "No hi ha prou quota disponible a \"{}\" per realitzar l'operació."
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the maximum number of usages in bulk is not supported if any of the "
|
||||||
|
"selected vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgctxt "subevent"
|
||||||
|
msgid ""
|
||||||
|
"Changing the date in bulk is not supported if any of the selected vouchers "
|
||||||
|
"is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the product to a quota is not supported if any of the selected "
|
||||||
|
"vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"This change cannot be completed because not all assigned seats of the "
|
||||||
|
"vouchers are still available"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/vouchers.py
|
#: pretix/control/forms/vouchers.py
|
||||||
msgid "Codes"
|
msgid "Codes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -19274,10 +19390,6 @@ msgstr ""
|
|||||||
msgid "Account history"
|
msgid "Account history"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
|
||||||
msgid "All users"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
#: pretix/control/navigation.py
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
msgid "Admin sessions"
|
msgid "Admin sessions"
|
||||||
@@ -19563,6 +19675,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/users/create.html
|
#: pretix/control/templates/pretixcontrol/users/create.html
|
||||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
||||||
@@ -20016,8 +20129,8 @@ msgstr "Esborrar"
|
|||||||
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/question.html
|
#: pretix/control/templates/pretixcontrol/items/question.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/orders/index.html
|
#: pretix/control/templates/pretixcontrol/orders/index.html
|
||||||
@@ -20028,7 +20141,6 @@ msgstr "Esborrar"
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
||||||
@@ -20180,6 +20292,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
||||||
msgid "Select all results on other pages as well"
|
msgid "Select all results on other pages as well"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -20823,6 +20936,22 @@ msgstr ""
|
|||||||
msgid "We found an SPF record on your domain that includes this system. Great!"
|
msgid "We found an SPF record on your domain that includes this system. Great!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "Your new DKIM record should be set up as a CNAME record like this:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "We found a DKIM record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "Your new DMARC record could look like this:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "We found a DMARC record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Verification failed"
|
#| msgid "Verification failed"
|
||||||
@@ -20997,6 +21126,94 @@ msgid ""
|
|||||||
"undeletable data, such as orders not performed in test mode."
|
"undeletable data, such as orders not performed in test mode."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "Personal data was cleared from this log entry."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "This change was performed by a pretix administrator."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
msgid "Inspect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>overpaid orders</strong>, for example due to "
|
||||||
|
"duplicate payment attempts. You should review the cases and consider "
|
||||||
|
"refunding the overpaid amount to the user."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show overpaid orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending refunds</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show pending refunds"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>requested cancellations</strong> that you should "
|
||||||
|
"take care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders requesting cancellation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending approvals</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders pending approval"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>fully paid orders</strong> that are not marked "
|
||||||
|
"as paid, probably because no quota was left at the time their payment "
|
||||||
|
"arrived. You should review the cases and consider either refunding the "
|
||||||
|
"customer or creating more space."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show affected orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"Orders in this event could not be <strong>synced to an external system</"
|
||||||
|
"strong> as configured."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show sync problems"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/delete.html
|
#: pretix/control/templates/pretixcontrol/event/delete.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"This operation will destroy your event including all configuration, "
|
"This operation will destroy your event including all configuration, "
|
||||||
@@ -21115,69 +21332,6 @@ msgstr "URL de sistema:"
|
|||||||
msgid "Create QR code"
|
msgid "Create QR code"
|
||||||
msgstr "Codi de comanda"
|
msgstr "Codi de comanda"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>overpaid orders</strong>, for example due to "
|
|
||||||
"duplicate payment attempts. You should review the cases and consider "
|
|
||||||
"refunding the overpaid amount to the user."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show overpaid orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending refunds</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show pending refunds"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>requested cancellations</strong> that you should "
|
|
||||||
"take care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders requesting cancellation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending approvals</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders pending approval"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>fully paid orders</strong> that are not marked "
|
|
||||||
"as paid, probably because no quota was left at the time their payment "
|
|
||||||
"arrived. You should review the cases and consider either refunding the "
|
|
||||||
"customer or creating more space."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show affected orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"Orders in this event could not be <strong>synced to an external system</"
|
|
||||||
"strong> as configured."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show sync problems"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
#: pretix/control/templates/pretixcontrol/event/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Update comment"
|
msgid "Update comment"
|
||||||
@@ -21369,44 +21523,6 @@ msgstr ""
|
|||||||
msgid "Enable test mode"
|
msgid "Enable test mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "All actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Team actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Customer actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "Personal data was cleared from this log entry."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "This change was performed by a pretix administrator."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
msgid "Inspect"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
@@ -22419,6 +22535,20 @@ msgstr ""
|
|||||||
msgid "More quotas"
|
msgid "More quotas"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "Shop disabled"
|
||||||
|
msgstr "Botiga desactivada"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "On sale"
|
||||||
|
msgstr "En venda"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
msgid "Open event dashboard"
|
msgid "Open event dashboard"
|
||||||
@@ -22429,6 +22559,12 @@ msgctxt "typography"
|
|||||||
msgid "The quick brown fox jumps over the lazy dog."
|
msgid "The quick brown fox jumps over the lazy dog."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Specific seat"
|
||||||
|
msgid "Specific object selected"
|
||||||
|
msgstr "Seient específic"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
||||||
msgid "Quota:"
|
msgid "Quota:"
|
||||||
@@ -23546,6 +23682,7 @@ msgstr "Pot canviar les comandes"
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%(number)s selected"
|
msgid "%(number)s selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -23636,6 +23773,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
msgid "Edit selected"
|
msgid "Edit selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -23941,6 +24079,13 @@ msgid ""
|
|||||||
"the customer account."
|
"the customer account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
|
#: pretix/control/views/orders.py
|
||||||
|
msgid ""
|
||||||
|
"Ticket secrets of order positions that have been used to issue a gift card "
|
||||||
|
"can not be changed. Only the link will be changed in this case."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid ""
|
#| msgid ""
|
||||||
@@ -24401,11 +24546,6 @@ msgstr ""
|
|||||||
msgid "Create a refund"
|
msgid "Create a refund"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
msgid "Source"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Cancel transfer"
|
msgid "Cancel transfer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -25630,6 +25770,7 @@ msgstr "Pot canviar les comandes"
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr "Configuració avançada"
|
msgstr "Configuració avançada"
|
||||||
@@ -27998,11 +28139,13 @@ msgid "Copy codes"
|
|||||||
msgstr "Copiar codis"
|
msgstr "Copiar codis"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Voucher details"
|
msgid "Voucher details"
|
||||||
msgstr "Detalls del val"
|
msgstr "Detalls del val"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you choose \"any product\" for a specific quota and choose to reserve "
|
"If you choose \"any product\" for a specific quota and choose to reserve "
|
||||||
@@ -28010,6 +28153,12 @@ msgid ""
|
|||||||
"voucher holder if another quota associated with the product is sold out!"
|
"voucher holder if another quota associated with the product is sold out!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Create multiple vouchers"
|
||||||
|
msgid "Change multiple vouchers"
|
||||||
|
msgstr "Crear múltiples vals"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Delete voucher"
|
msgid "Delete voucher"
|
||||||
@@ -28373,7 +28522,8 @@ msgstr ""
|
|||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
||||||
"team."
|
"team. If you want to add a different user or create a new account, log out "
|
||||||
|
"and click the invitation link again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/auth.py
|
#: pretix/control/views/auth.py
|
||||||
@@ -29013,6 +29163,30 @@ msgid ""
|
|||||||
"record."
|
"record."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We could not find a CNAME record pointing to our DKIM key for domain you are "
|
||||||
|
"trying to use. This means that there is a very high change most of the "
|
||||||
|
"emails will be rejected or marked as spam. We strongly recommend setting up "
|
||||||
|
"DKIM through a CNAME record. You can do so through the DNS settings at the "
|
||||||
|
"provider you registered your domain with."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We found a CNAME record for a DKIM key, but it is not pointing to the right "
|
||||||
|
"location. This means that there is a very high chance most of the emails "
|
||||||
|
"will be rejected or marked as spam. You should update the DNS settings of "
|
||||||
|
"your domain."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We did not find DMARC record for your domain. This means that there is a "
|
||||||
|
"very high chance most of the emails will be rejected or marked as spam. You "
|
||||||
|
"should update the DNS settings of your domain."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/mailsetup.py
|
#: pretix/control/views/mailsetup.py
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "This gift card was used in the meantime. Please try again."
|
#| msgid "This gift card was used in the meantime. Please try again."
|
||||||
@@ -30200,6 +30374,7 @@ msgid "Macao"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/helpers/daterange.py
|
#: pretix/helpers/daterange.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_list.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
||||||
@@ -31539,11 +31714,6 @@ msgstr ""
|
|||||||
msgid "PayPal account"
|
msgid "PayPal account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
|
||||||
#, python-brace-format
|
|
||||||
msgid "<a target=\"_blank\" rel=\"noopener\" href=\"{docs_url}\">{text}</a>"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -32269,8 +32439,13 @@ msgstr "URL base de la redirecció"
|
|||||||
#: pretix/plugins/returnurl/views.py
|
#: pretix/plugins/returnurl/views.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"Redirection will only be allowed to URLs that start with one of these "
|
"Redirection will only be allowed to URLs that start with one of these "
|
||||||
"prefixes. Enter one or more allowed URL prefix per line. URL prefixes must "
|
"prefixes. Enter one allowed URL prefix per line. URL prefixes must include a "
|
||||||
"include a slash after the hostname."
|
"slash after the hostname."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/plugins/returnurl/views.py
|
||||||
|
msgid ""
|
||||||
|
"All values must be URLs that include at last one slash after the hostname."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/sendmail/apps.py
|
#: pretix/plugins/sendmail/apps.py
|
||||||
@@ -38287,13 +38462,6 @@ msgstr "Kosovo"
|
|||||||
#~ msgid "Full access"
|
#~ msgid "Full access"
|
||||||
#~ msgstr "Nom complet"
|
#~ msgstr "Nom complet"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "You cannot select a quota that belongs to a different event."
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "You cannot cancel a position that has been used to issue a gift card."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "No podeu seleccionar una quota que pertany a un esdeveniment diferent."
|
|
||||||
|
|
||||||
#~ msgid "Automatically on payment"
|
#~ msgid "Automatically on payment"
|
||||||
#~ msgstr "Automàticament durant el pagament"
|
#~ msgstr "Automàticament durant el pagament"
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
|
"POT-Creation-Date: 2026-07-30 13:52+0000\n"
|
||||||
"PO-Revision-Date: 2026-01-29 19:42+0000\n"
|
"PO-Revision-Date: 2026-01-29 19:42+0000\n"
|
||||||
"Last-Translator: Jiří Pastrňák <jiri@pastrnak.email>\n"
|
"Last-Translator: Jiří Pastrňák <jiri@pastrnak.email>\n"
|
||||||
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix/cs/"
|
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix/cs/"
|
||||||
@@ -19,38 +19,6 @@ msgstr ""
|
|||||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||||
"X-Generator: Weblate 5.15.2\n"
|
"X-Generator: Weblate 5.15.2\n"
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "Shop disabled"
|
|
||||||
msgstr "Obchod vypnut"
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale over"
|
|
||||||
msgstr "Předprodej ukončen"
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale not started"
|
|
||||||
msgstr "Předprodej zatím nezačal"
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "On sale"
|
|
||||||
msgstr "V prodeji"
|
|
||||||
|
|
||||||
#: pretix/_base_settings.py
|
#: pretix/_base_settings.py
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "Angličtina"
|
msgstr "Angličtina"
|
||||||
@@ -1302,6 +1270,19 @@ msgstr "Zákaznické účty"
|
|||||||
msgid "Download a spreadsheet of all currently registered customer accounts."
|
msgid "Download a spreadsheet of all currently registered customer accounts."
|
||||||
msgstr "Stažení tabulky všech aktuálně registrovaných zákaznických účtů."
|
msgstr "Stažení tabulky všech aktuálně registrovaných zákaznických účtů."
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/permissions.py
|
||||||
|
#: pretix/control/navigation.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
msgid "Customers"
|
||||||
|
msgstr "Zákazníci"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
#: pretix/presale/views/customer.py
|
||||||
|
msgid "Memberships"
|
||||||
|
msgstr "Členství"
|
||||||
|
|
||||||
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
@@ -1434,6 +1415,71 @@ msgstr "Ano"
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "Ne"
|
msgstr "Ne"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/live.html
|
||||||
|
msgid "Test mode"
|
||||||
|
msgstr "Testovací režím"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
|
#: pretix/plugins/reports/exporters.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
msgid "Canceled"
|
||||||
|
msgstr "Zrušeno"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
msgid "Membership type"
|
||||||
|
msgstr "Druh členství"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Purchase ticket"
|
||||||
|
msgstr "Zakoupeno"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/forms/questions.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/rrule.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "Start date"
|
||||||
|
msgstr "Datum začátku"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Start time from"
|
||||||
|
msgid "Start time"
|
||||||
|
msgstr "Čas začátku od"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "End date"
|
||||||
|
msgstr "Datum konce"
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "End: %(time)s"
|
||||||
|
msgid "End time"
|
||||||
|
msgstr "Konec: %(time)s"
|
||||||
|
|
||||||
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
||||||
msgctxt "export_category"
|
msgctxt "export_category"
|
||||||
msgid "Invoices"
|
msgid "Invoices"
|
||||||
@@ -2289,30 +2335,6 @@ msgstr "zrušeno"
|
|||||||
msgid "Position ID"
|
msgid "Position ID"
|
||||||
msgstr "ID pozice"
|
msgstr "ID pozice"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/forms/questions.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/rrule.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "Start date"
|
|
||||||
msgstr "Datum začátku"
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "End date"
|
|
||||||
msgstr "Datum konce"
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
||||||
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
||||||
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
||||||
@@ -2717,12 +2739,6 @@ msgstr "Stáhněte si tabulku všech transakcí s dárkovými poukazy."
|
|||||||
msgid "Gift card code"
|
msgid "Gift card code"
|
||||||
msgstr "kód dárkové poukázky"
|
msgstr "kód dárkové poukázky"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/live.html
|
|
||||||
msgid "Test mode"
|
|
||||||
msgstr "Testovací režím"
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
||||||
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup.html
|
#: pretix/control/templates/pretixcontrol/email_setup.html
|
||||||
@@ -2839,7 +2855,7 @@ msgstr "Expirované a s hodnotou"
|
|||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/plugins/reports/exporters.py
|
#: pretix/plugins/reports/exporters.py pretix/plugins/sendmail/forms.py
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
||||||
msgid "Expired"
|
msgid "Expired"
|
||||||
@@ -3007,7 +3023,7 @@ msgid "This combination of credentials is not known to our system."
|
|||||||
msgstr "Zadané přihlašovací údaje nejsou platné."
|
msgstr "Zadané přihlašovací údaje nejsou platné."
|
||||||
|
|
||||||
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
||||||
#: pretix/presale/forms/customer.py
|
#: pretix/control/views/user.py pretix/presale/forms/customer.py
|
||||||
msgid "For security reasons, please wait 5 minutes before you try again."
|
msgid "For security reasons, please wait 5 minutes before you try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Z bezpečnostních důvodů, prosím, počkejte pět minut a potom to zkuste znovu."
|
"Z bezpečnostních důvodů, prosím, počkejte pět minut a potom to zkuste znovu."
|
||||||
@@ -3979,6 +3995,7 @@ msgstr "Ignorování kvóty"
|
|||||||
|
|
||||||
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/views/vouchers.py
|
#: pretix/control/views/vouchers.py
|
||||||
msgid "Price effect"
|
msgid "Price effect"
|
||||||
@@ -4670,8 +4687,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/base/models/event.py
|
#: pretix/base/models/event.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"This will be used to let users know if the event is in a different timezone "
|
"This will be used to let users know if the event is in a different timezone, "
|
||||||
"and let’s us calculate users’ local times."
|
"and to let us calculate the local time of a user."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
||||||
@@ -6138,23 +6155,6 @@ msgstr ""
|
|||||||
msgid "Number of times this membership can be used in a purchase."
|
msgid "Number of times this membership can be used in a purchase."
|
||||||
msgstr "Maximální počet využití."
|
msgstr "Maximální počet využití."
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
|
||||||
#: pretix/plugins/reports/exporters.py
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
msgid "Canceled"
|
|
||||||
msgstr "Zrušeno"
|
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
msgid "Membership type"
|
|
||||||
msgstr "Druh členství"
|
|
||||||
|
|
||||||
#: pretix/base/models/orders.py
|
#: pretix/base/models/orders.py
|
||||||
msgid "pending"
|
msgid "pending"
|
||||||
msgstr "chybějící"
|
msgstr "chybějící"
|
||||||
@@ -6990,7 +6990,7 @@ msgstr "Tato varianta nepatří k tomuto produktu."
|
|||||||
msgid "It is currently not possible to create vouchers for add-on products."
|
msgid "It is currently not possible to create vouchers for add-on products."
|
||||||
msgstr "V současné době není možné vytvářet poukazy na doplňkové produkty."
|
msgstr "V současné době není možné vytvářet poukazy na doplňkové produkty."
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"You need to select a specific product or quota if this voucher should "
|
"You need to select a specific product or quota if this voucher should "
|
||||||
"reserve tickets."
|
"reserve tickets."
|
||||||
@@ -7013,7 +7013,7 @@ msgid ""
|
|||||||
"usages."
|
"usages."
|
||||||
msgstr "Maximální počet použití nesmí být nižší než minimální počet použití."
|
msgstr "Maximální počet použití nesmí být nižší než minimální počet použití."
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you want this voucher to block quota, you need to select a specific date."
|
"If you want this voucher to block quota, you need to select a specific date."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7536,6 +7536,15 @@ msgstr "Tato dárková karta není organizátorem akce akceptována."
|
|||||||
msgid "This gift card was used in the meantime. Please try again."
|
msgid "This gift card was used in the meantime. Please try again."
|
||||||
msgstr "Tato dárková karta byla mezitím použita. Zkuste to prosím znovu."
|
msgstr "Tato dárková karta byla mezitím použita. Zkuste to prosím znovu."
|
||||||
|
|
||||||
|
#: pretix/base/payment.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "This payment provider does not exist or the respective plugin is disabled."
|
||||||
|
msgid ""
|
||||||
|
"This payment provider exists for historical purposes only and is no longer "
|
||||||
|
"usable."
|
||||||
|
msgstr "Tento poskytovatel plateb neexistuje nebo příslušný plugin je vypnutý."
|
||||||
|
|
||||||
#: pretix/base/pdf.py
|
#: pretix/base/pdf.py
|
||||||
msgid "Ticket code (barcode content)"
|
msgid "Ticket code (barcode content)"
|
||||||
msgstr "Kód vstupenky (obsah čárkového kódu)"
|
msgstr "Kód vstupenky (obsah čárkového kódu)"
|
||||||
@@ -8141,11 +8150,6 @@ msgid ""
|
|||||||
"permissions."
|
"permissions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
|
||||||
msgid "Customers"
|
|
||||||
msgstr "Zákazníci"
|
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
#: pretix/base/permissions.py pretix/control/navigation.py
|
||||||
msgid "Devices"
|
msgid "Devices"
|
||||||
msgstr "Zařízení"
|
msgstr "Zařízení"
|
||||||
@@ -9473,6 +9477,16 @@ msgid ""
|
|||||||
"card."
|
"card."
|
||||||
msgstr "Cenu pozice, která byla použita k vydání dárkové karty, nelze změnit."
|
msgstr "Cenu pozice, která byla použita k vydání dárkové karty, nelze změnit."
|
||||||
|
|
||||||
|
#: pretix/base/services/orders.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "You cannot change the price of a position that has been used to issue a "
|
||||||
|
#| "gift card."
|
||||||
|
msgid ""
|
||||||
|
"You cannot change the ticket secret of a position that has been used to "
|
||||||
|
"issue a gift card."
|
||||||
|
msgstr "Cenu pozice, která byla použita k vydání dárkové karty, nelze změnit."
|
||||||
|
|
||||||
#: pretix/base/services/orders.py
|
#: pretix/base/services/orders.py
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -11288,13 +11302,13 @@ msgstr "Kontaktní e-mail"
|
|||||||
msgid "We'll show this publicly to allow attendees to contact you."
|
msgid "We'll show this publicly to allow attendees to contact you."
|
||||||
msgstr "Tento údaj zobrazíme veřejně, aby vás účastníci mohli kontaktovat."
|
msgstr "Tento údaj zobrazíme veřejně, aby vás účastníci mohli kontaktovat."
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Contact"
|
#| msgid "Contact"
|
||||||
msgid "Contact URL"
|
msgid "Contact URL"
|
||||||
msgstr "Kontakt"
|
msgstr "Kontakt"
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you set this, the footer contact link will point here instead of using "
|
"If you set this, the footer contact link will point here instead of using "
|
||||||
"the email address above. Please note that you still need to add a contact "
|
"the email address above. Please note that you still need to add a contact "
|
||||||
@@ -13287,6 +13301,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
@@ -14596,7 +14611,7 @@ msgstr "Všechny objednávky"
|
|||||||
msgid "Valid orders"
|
msgid "Valid orders"
|
||||||
msgstr "Platné objednávky"
|
msgstr "Platné objednávky"
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
msgid "Paid (or canceled with paid fee)"
|
msgid "Paid (or canceled with paid fee)"
|
||||||
msgstr "Zaplaceno (nebo zrušeno se zaplaceným poplatkem)"
|
msgstr "Zaplaceno (nebo zrušeno se zaplaceným poplatkem)"
|
||||||
|
|
||||||
@@ -14620,7 +14635,7 @@ msgstr "Probíhající nebo zaplacené"
|
|||||||
msgid "Cancellations"
|
msgid "Cancellations"
|
||||||
msgstr "Storna"
|
msgstr "Storna"
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
msgid "Canceled (fully)"
|
msgid "Canceled (fully)"
|
||||||
msgstr "Zrušeno (kompletní)"
|
msgstr "Zrušeno (kompletní)"
|
||||||
|
|
||||||
@@ -14800,6 +14815,22 @@ msgstr "Obchod naživo a předprodej běží"
|
|||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr "Neaktivní"
|
msgstr "Neaktivní"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale not started"
|
||||||
|
msgstr "Předprodej zatím nezačal"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale over"
|
||||||
|
msgstr "Předprodej ukončen"
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
||||||
msgid "Date from"
|
msgid "Date from"
|
||||||
@@ -14837,13 +14868,6 @@ msgstr "aktivní"
|
|||||||
msgid "not yet activated"
|
msgid "not yet activated"
|
||||||
msgstr "zatím neaktivováno"
|
msgstr "zatím neaktivováno"
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
#: pretix/presale/views/customer.py
|
|
||||||
msgid "Memberships"
|
|
||||||
msgstr "Členství"
|
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
msgid "Has no memberships"
|
msgid "Has no memberships"
|
||||||
msgstr "Nemá žádné členství"
|
msgstr "Nemá žádné členství"
|
||||||
@@ -15073,6 +15097,42 @@ msgstr "Odvolaná zařízení"
|
|||||||
msgid "Search email address or subject"
|
msgid "Search email address or subject"
|
||||||
msgstr "Vyžadovat e-mailové adresy na lístek"
|
msgstr "Vyžadovat e-mailové adresy na lístek"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
msgid "Source"
|
||||||
|
msgstr "Zdroj"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "All vouchers"
|
||||||
|
msgid "All sources"
|
||||||
|
msgstr "Všechny poukázky"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Team actions"
|
||||||
|
msgstr "Týmové akce"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Customer actions"
|
||||||
|
msgstr "Zákaznické akce"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Device status"
|
||||||
|
msgid "Device actions"
|
||||||
|
msgstr "Stav zařízení"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Order details"
|
||||||
|
msgid "User email"
|
||||||
|
msgstr "Podrobnosti o objednávce"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py pretix/control/navigation.py
|
||||||
|
msgid "All users"
|
||||||
|
msgstr "Všechny uživatelé"
|
||||||
|
|
||||||
#: pretix/control/forms/global_settings.py
|
#: pretix/control/forms/global_settings.py
|
||||||
msgid "Additional footer text"
|
msgid "Additional footer text"
|
||||||
msgstr "Další text v zápatí"
|
msgstr "Další text v zápatí"
|
||||||
@@ -16440,6 +16500,7 @@ msgstr "Volitelné"
|
|||||||
#: pretix/control/forms/renderers.py
|
#: pretix/control/forms/renderers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
msgctxt "form_bulk"
|
msgctxt "form_bulk"
|
||||||
msgid "change"
|
msgid "change"
|
||||||
msgstr "změnit"
|
msgstr "změnit"
|
||||||
@@ -16555,6 +16616,65 @@ msgstr ""
|
|||||||
"Poukázka odpovídá pouze skrytým produktům, ale nezvolili jste, že je mají "
|
"Poukázka odpovídá pouze skrytým produktům, ale nezvolili jste, že je mají "
|
||||||
"zobrazit."
|
"zobrazit."
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"You cannot reduce the maximum number of redemptions to %(max_usages)s, "
|
||||||
|
"because at least one of the selected vouchers has already been redeemed "
|
||||||
|
"%(max_redeemed)s times."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "You cannot create a voucher that blocks quota as the selected product or "
|
||||||
|
#| "quota is currently sold out or completely reserved."
|
||||||
|
msgid ""
|
||||||
|
"You cannot create a voucher that allows selection of a quota but has no date "
|
||||||
|
"selected."
|
||||||
|
msgstr ""
|
||||||
|
"Nelze vytvořit poukaz, který blokuje kvótu, protože vybraný produkt nebo "
|
||||||
|
"kvóta jsou aktuálně vyprodány nebo zcela rezervovány."
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The selected product does not allow to select a seat."
|
||||||
|
msgid "The selected quota does not match the selected subevent."
|
||||||
|
msgstr "Vybraný produkt neumožňuje výběr místa."
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "There is not enough quota available on quota \"{}\" to perform the "
|
||||||
|
#| "operation."
|
||||||
|
msgid "There is no sufficient quota available to perform this change."
|
||||||
|
msgstr "Na kvótu „{}“ není k dispozici dostatek kvóty k provedení operace."
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the maximum number of usages in bulk is not supported if any of the "
|
||||||
|
"selected vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgctxt "subevent"
|
||||||
|
msgid ""
|
||||||
|
"Changing the date in bulk is not supported if any of the selected vouchers "
|
||||||
|
"is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the product to a quota is not supported if any of the selected "
|
||||||
|
"vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"This change cannot be completed because not all assigned seats of the "
|
||||||
|
"vouchers are still available"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/vouchers.py
|
#: pretix/control/forms/vouchers.py
|
||||||
msgid "Codes"
|
msgid "Codes"
|
||||||
msgstr "Kupónové kódy"
|
msgstr "Kupónové kódy"
|
||||||
@@ -18413,10 +18533,6 @@ msgstr "Autorizované aplikace"
|
|||||||
msgid "Account history"
|
msgid "Account history"
|
||||||
msgstr "Historie účtu"
|
msgstr "Historie účtu"
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
|
||||||
msgid "All users"
|
|
||||||
msgstr "Všechny uživatelé"
|
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
#: pretix/control/navigation.py
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
msgid "Admin sessions"
|
msgid "Admin sessions"
|
||||||
@@ -18695,6 +18811,7 @@ msgstr "Nastavit nové heslo"
|
|||||||
#: pretix/control/templates/pretixcontrol/users/create.html
|
#: pretix/control/templates/pretixcontrol/users/create.html
|
||||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
||||||
@@ -19150,8 +19267,8 @@ msgstr "Smazat"
|
|||||||
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/question.html
|
#: pretix/control/templates/pretixcontrol/items/question.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/orders/index.html
|
#: pretix/control/templates/pretixcontrol/orders/index.html
|
||||||
@@ -19162,7 +19279,6 @@ msgstr "Smazat"
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
||||||
@@ -19297,6 +19413,7 @@ msgstr "Čas"
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
||||||
msgid "Select all results on other pages as well"
|
msgid "Select all results on other pages as well"
|
||||||
msgstr "Vybrat všechny výsledky i na dalších stránkách"
|
msgstr "Vybrat všechny výsledky i na dalších stránkách"
|
||||||
@@ -20012,6 +20129,34 @@ msgid "We found an SPF record on your domain that includes this system. Great!"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Našli jsme záznam SPF na vaší doméně, který obsahuje tento systém. Skvělé!"
|
"Našli jsme záznam SPF na vaší doméně, který obsahuje tento systém. Skvělé!"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Your new SPF record could look like this:"
|
||||||
|
msgid "Your new DKIM record should be set up as a CNAME record like this:"
|
||||||
|
msgstr "Váš nový záznam SPF může vypadat takto:"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "We found an SPF record on your domain that includes this system. Great!"
|
||||||
|
msgid "We found a DKIM record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
"Našli jsme záznam SPF na vaší doméně, který obsahuje tento systém. Skvělé!"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Your new SPF record could look like this:"
|
||||||
|
msgid "Your new DMARC record could look like this:"
|
||||||
|
msgstr "Váš nový záznam SPF může vypadat takto:"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "We found an SPF record on your domain that includes this system. Great!"
|
||||||
|
msgid "We found a DMARC record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
"Našli jsme záznam SPF na vaší doméně, který obsahuje tento systém. Skvělé!"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
msgid "Verification"
|
msgid "Verification"
|
||||||
msgstr "Ověřování"
|
msgstr "Ověřování"
|
||||||
@@ -20211,6 +20356,103 @@ msgstr ""
|
|||||||
"nesmazatelná data, například objednávky, které nebyly provedeny v testovacím "
|
"nesmazatelná data, například objednávky, které nebyly provedeny v testovacím "
|
||||||
"režimu."
|
"režimu."
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "Personal data was cleared from this log entry."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "This change was performed by a pretix administrator."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
msgid "Inspect"
|
||||||
|
msgstr "Kontrola"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>overpaid orders</strong>, for example due to "
|
||||||
|
"duplicate payment attempts. You should review the cases and consider "
|
||||||
|
"refunding the overpaid amount to the user."
|
||||||
|
msgstr ""
|
||||||
|
"Tato akce obsahuje <strong>přeplacené objednávky</strong>, například z "
|
||||||
|
"důvodu duplicitních pokusů o platbu. Měli byste tyto případy zkontrolovat a "
|
||||||
|
"uvažovat možnost vrácení přeplacené částky uživateli."
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show overpaid orders"
|
||||||
|
msgstr "Zobrazit přeplacené objednávky"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending refunds</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
"Tato akce obsahuje <strong>nevyřízené náhrady</strong>, o které byste se "
|
||||||
|
"měli postarat."
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show pending refunds"
|
||||||
|
msgstr "Zobrazit čekající náhrady"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>requested cancellations</strong> that you should "
|
||||||
|
"take care of."
|
||||||
|
msgstr ""
|
||||||
|
"Tato akce obsahuje <strong>vyžádaná zrušení</strong>, o které byste se měli "
|
||||||
|
"postarat."
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders requesting cancellation"
|
||||||
|
msgstr "Zobrazit objednávky s požadavkem na zrušení"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending approvals</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
"Tato akce obsahuje <strong>nevyřízená schválení</strong>, o která byste se "
|
||||||
|
"měli postarat."
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders pending approval"
|
||||||
|
msgstr "Zobrazit objednávky čekající na schválení"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>fully paid orders</strong> that are not marked "
|
||||||
|
"as paid, probably because no quota was left at the time their payment "
|
||||||
|
"arrived. You should review the cases and consider either refunding the "
|
||||||
|
"customer or creating more space."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show affected orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"Orders in this event could not be <strong>synced to an external system</"
|
||||||
|
"strong> as configured."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show sync problems"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/delete.html
|
#: pretix/control/templates/pretixcontrol/event/delete.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"This operation will destroy your event including all configuration, "
|
"This operation will destroy your event including all configuration, "
|
||||||
@@ -20335,78 +20577,6 @@ msgstr "Adresa obchodu:"
|
|||||||
msgid "Create QR code"
|
msgid "Create QR code"
|
||||||
msgstr "Vytvořit kód QR"
|
msgstr "Vytvořit kód QR"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>overpaid orders</strong>, for example due to "
|
|
||||||
"duplicate payment attempts. You should review the cases and consider "
|
|
||||||
"refunding the overpaid amount to the user."
|
|
||||||
msgstr ""
|
|
||||||
"Tato akce obsahuje <strong>přeplacené objednávky</strong>, například z "
|
|
||||||
"důvodu duplicitních pokusů o platbu. Měli byste tyto případy zkontrolovat a "
|
|
||||||
"uvažovat možnost vrácení přeplacené částky uživateli."
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show overpaid orders"
|
|
||||||
msgstr "Zobrazit přeplacené objednávky"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending refunds</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
"Tato akce obsahuje <strong>nevyřízené náhrady</strong>, o které byste se "
|
|
||||||
"měli postarat."
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show pending refunds"
|
|
||||||
msgstr "Zobrazit čekající náhrady"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>requested cancellations</strong> that you should "
|
|
||||||
"take care of."
|
|
||||||
msgstr ""
|
|
||||||
"Tato akce obsahuje <strong>vyžádaná zrušení</strong>, o které byste se měli "
|
|
||||||
"postarat."
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders requesting cancellation"
|
|
||||||
msgstr "Zobrazit objednávky s požadavkem na zrušení"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending approvals</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
"Tato akce obsahuje <strong>nevyřízená schválení</strong>, o která byste se "
|
|
||||||
"měli postarat."
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders pending approval"
|
|
||||||
msgstr "Zobrazit objednávky čekající na schválení"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>fully paid orders</strong> that are not marked "
|
|
||||||
"as paid, probably because no quota was left at the time their payment "
|
|
||||||
"arrived. You should review the cases and consider either refunding the "
|
|
||||||
"customer or creating more space."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show affected orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"Orders in this event could not be <strong>synced to an external system</"
|
|
||||||
"strong> as configured."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show sync problems"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
#: pretix/control/templates/pretixcontrol/event/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Update comment"
|
msgid "Update comment"
|
||||||
@@ -20588,44 +20758,6 @@ msgstr ""
|
|||||||
msgid "Enable test mode"
|
msgid "Enable test mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "All actions"
|
|
||||||
msgstr "Všechny akce"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Team actions"
|
|
||||||
msgstr "Týmové akce"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Customer actions"
|
|
||||||
msgstr "Zákaznické akce"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "Personal data was cleared from this log entry."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "This change was performed by a pretix administrator."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
msgid "Inspect"
|
|
||||||
msgstr "Kontrola"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
@@ -21588,6 +21720,20 @@ msgstr "Žádné termíny"
|
|||||||
msgid "More quotas"
|
msgid "More quotas"
|
||||||
msgstr "Další kvóty"
|
msgstr "Další kvóty"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "Shop disabled"
|
||||||
|
msgstr "Obchod vypnut"
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "On sale"
|
||||||
|
msgstr "V prodeji"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
msgid "Open event dashboard"
|
msgid "Open event dashboard"
|
||||||
@@ -21598,6 +21744,12 @@ msgctxt "typography"
|
|||||||
msgid "The quick brown fox jumps over the lazy dog."
|
msgid "The quick brown fox jumps over the lazy dog."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Specific seat"
|
||||||
|
msgid "Specific object selected"
|
||||||
|
msgstr "Přidělené místo"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
||||||
msgid "Quota:"
|
msgid "Quota:"
|
||||||
@@ -22654,6 +22806,7 @@ msgstr "Změnit více zařízení"
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%(number)s selected"
|
msgid "%(number)s selected"
|
||||||
msgstr "%(number)s vybráno"
|
msgstr "%(number)s vybráno"
|
||||||
@@ -22750,6 +22903,7 @@ msgstr "Smazat vybrané"
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
msgid "Edit selected"
|
msgid "Edit selected"
|
||||||
msgstr "Upravit vybrané"
|
msgstr "Upravit vybrané"
|
||||||
|
|
||||||
@@ -23051,6 +23205,13 @@ msgid ""
|
|||||||
"the customer account."
|
"the customer account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
|
#: pretix/control/views/orders.py
|
||||||
|
msgid ""
|
||||||
|
"Ticket secrets of order positions that have been used to issue a gift card "
|
||||||
|
"can not be changed. Only the link will be changed in this case."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"Removing or splitting this position will also remove or split all add-ons to "
|
"Removing or splitting this position will also remove or split all add-ons to "
|
||||||
@@ -23487,11 +23648,6 @@ msgstr ""
|
|||||||
msgid "Create a refund"
|
msgid "Create a refund"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
msgid "Source"
|
|
||||||
msgstr "Zdroj"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Cancel transfer"
|
msgid "Cancel transfer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -24639,6 +24795,7 @@ msgstr "Změnit více zařízení"
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr "Rozšířená nastavení"
|
msgstr "Rozšířená nastavení"
|
||||||
@@ -26969,11 +27126,13 @@ msgid "Copy codes"
|
|||||||
msgstr "Kopírovat kódy"
|
msgstr "Kopírovat kódy"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Voucher details"
|
msgid "Voucher details"
|
||||||
msgstr "Podrobnosti o poukázce"
|
msgstr "Podrobnosti o poukázce"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you choose \"any product\" for a specific quota and choose to reserve "
|
"If you choose \"any product\" for a specific quota and choose to reserve "
|
||||||
@@ -26981,6 +27140,12 @@ msgid ""
|
|||||||
"voucher holder if another quota associated with the product is sold out!"
|
"voucher holder if another quota associated with the product is sold out!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Change multiple devices"
|
||||||
|
msgid "Change multiple vouchers"
|
||||||
|
msgstr "Změnit více zařízení"
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Delete voucher"
|
msgid "Delete voucher"
|
||||||
@@ -27337,7 +27502,8 @@ msgstr ""
|
|||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
||||||
"team."
|
"team. If you want to add a different user or create a new account, log out "
|
||||||
|
"and click the invitation link again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/auth.py
|
#: pretix/control/views/auth.py
|
||||||
@@ -27971,6 +28137,66 @@ msgstr ""
|
|||||||
"Měli byste aktualizovat nastavení DNS své domény tak, aby zahrnovalo tento "
|
"Měli byste aktualizovat nastavení DNS své domény tak, aby zahrnovalo tento "
|
||||||
"systém v záznamu SPF."
|
"systém v záznamu SPF."
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "We could not find an SPF record set for the domain you are trying to use. "
|
||||||
|
#| "This means that there is a very high change most of the emails will be "
|
||||||
|
#| "rejected or marked as spam. We strongly recommend setting an SPF record "
|
||||||
|
#| "on the domain. You can do so through the DNS settings at the provider you "
|
||||||
|
#| "registered your domain with."
|
||||||
|
msgid ""
|
||||||
|
"We could not find a CNAME record pointing to our DKIM key for domain you are "
|
||||||
|
"trying to use. This means that there is a very high change most of the "
|
||||||
|
"emails will be rejected or marked as spam. We strongly recommend setting up "
|
||||||
|
"DKIM through a CNAME record. You can do so through the DNS settings at the "
|
||||||
|
"provider you registered your domain with."
|
||||||
|
msgstr ""
|
||||||
|
"Nepodařilo se nám najít záznam SPF nastavený pro doménu, kterou se snažíte "
|
||||||
|
"použít. To znamená, že je velmi vysoká pravděpodobnost, že většina e-mailů "
|
||||||
|
"bude odmítnuta nebo označena jako spam. Důrazně doporučujeme nastavit záznam "
|
||||||
|
"SPF pro danou doménu. Můžete tak učinit prostřednictvím nastavení DNS u "
|
||||||
|
"poskytovatele, u kterého jste doménu zaregistrovali."
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "We found an SPF record set for the domain you are trying to use, but it "
|
||||||
|
#| "does not include this system's email server. This means that there is a "
|
||||||
|
#| "very high chance most of the emails will be rejected or marked as spam. "
|
||||||
|
#| "You should update the DNS settings of your domain to include this system "
|
||||||
|
#| "in the SPF record."
|
||||||
|
msgid ""
|
||||||
|
"We found a CNAME record for a DKIM key, but it is not pointing to the right "
|
||||||
|
"location. This means that there is a very high chance most of the emails "
|
||||||
|
"will be rejected or marked as spam. You should update the DNS settings of "
|
||||||
|
"your domain."
|
||||||
|
msgstr ""
|
||||||
|
"Našli jsme záznam SPF nastavený pro doménu, kterou se snažíte použít, ale "
|
||||||
|
"neobsahuje e-mailový server tohoto systému. To znamená, že je velmi vysoká "
|
||||||
|
"pravděpodobnost, že většina e-mailů bude odmítnuta nebo označena jako spam. "
|
||||||
|
"Měli byste aktualizovat nastavení DNS své domény tak, aby zahrnovalo tento "
|
||||||
|
"systém v záznamu SPF."
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "We found an SPF record set for the domain you are trying to use, but it "
|
||||||
|
#| "does not include this system's email server. This means that there is a "
|
||||||
|
#| "very high chance most of the emails will be rejected or marked as spam. "
|
||||||
|
#| "You should update the DNS settings of your domain to include this system "
|
||||||
|
#| "in the SPF record."
|
||||||
|
msgid ""
|
||||||
|
"We did not find DMARC record for your domain. This means that there is a "
|
||||||
|
"very high chance most of the emails will be rejected or marked as spam. You "
|
||||||
|
"should update the DNS settings of your domain."
|
||||||
|
msgstr ""
|
||||||
|
"Našli jsme záznam SPF nastavený pro doménu, kterou se snažíte použít, ale "
|
||||||
|
"neobsahuje e-mailový server tohoto systému. To znamená, že je velmi vysoká "
|
||||||
|
"pravděpodobnost, že většina e-mailů bude odmítnuta nebo označena jako spam. "
|
||||||
|
"Měli byste aktualizovat nastavení DNS své domény tak, aby zahrnovalo tento "
|
||||||
|
"systém v záznamu SPF."
|
||||||
|
|
||||||
#: pretix/control/views/mailsetup.py
|
#: pretix/control/views/mailsetup.py
|
||||||
msgid "The verification code was incorrect, please try again."
|
msgid "The verification code was incorrect, please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -29073,6 +29299,7 @@ msgid "Macao"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/helpers/daterange.py
|
#: pretix/helpers/daterange.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_list.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
||||||
@@ -30335,11 +30562,6 @@ msgstr ""
|
|||||||
msgid "PayPal account"
|
msgid "PayPal account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
|
||||||
#, python-brace-format
|
|
||||||
msgid "<a target=\"_blank\" rel=\"noopener\" href=\"{docs_url}\">{text}</a>"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -31025,8 +31247,13 @@ msgstr "Přesměrování URL"
|
|||||||
#: pretix/plugins/returnurl/views.py
|
#: pretix/plugins/returnurl/views.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"Redirection will only be allowed to URLs that start with one of these "
|
"Redirection will only be allowed to URLs that start with one of these "
|
||||||
"prefixes. Enter one or more allowed URL prefix per line. URL prefixes must "
|
"prefixes. Enter one allowed URL prefix per line. URL prefixes must include a "
|
||||||
"include a slash after the hostname."
|
"slash after the hostname."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/plugins/returnurl/views.py
|
||||||
|
msgid ""
|
||||||
|
"All values must be URLs that include at last one slash after the hostname."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/sendmail/apps.py
|
#: pretix/plugins/sendmail/apps.py
|
||||||
@@ -35923,6 +36150,9 @@ msgstr "Přístup k zápisu"
|
|||||||
msgid "Kosovo"
|
msgid "Kosovo"
|
||||||
msgstr "Kosovo"
|
msgstr "Kosovo"
|
||||||
|
|
||||||
|
#~ msgid "All actions"
|
||||||
|
#~ msgstr "Všechny akce"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Account information"
|
#~| msgid "Account information"
|
||||||
#~ msgid "Account invitation"
|
#~ msgid "Account invitation"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
|
"POT-Creation-Date: 2026-07-30 13:52+0000\n"
|
||||||
"PO-Revision-Date: 2023-11-14 11:00+0000\n"
|
"PO-Revision-Date: 2023-11-14 11:00+0000\n"
|
||||||
"Last-Translator: Charliecoleg <DM229135@colegsirgar.ac.uk>\n"
|
"Last-Translator: Charliecoleg <DM229135@colegsirgar.ac.uk>\n"
|
||||||
"Language-Team: Welsh <https://translate.pretix.eu/projects/pretix/pretix/cy/"
|
"Language-Team: Welsh <https://translate.pretix.eu/projects/pretix/pretix/cy/"
|
||||||
@@ -20,38 +20,6 @@ msgstr ""
|
|||||||
"(n==3) ? 3 :(n==6) ? 4 : 5;\n"
|
"(n==3) ? 3 :(n==6) ? 4 : 5;\n"
|
||||||
"X-Generator: Weblate 5.1.1\n"
|
"X-Generator: Weblate 5.1.1\n"
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "Shop disabled"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale over"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
msgid "Presale not started"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
|
||||||
#: pretix/control/views/dashboards.py
|
|
||||||
msgid "On sale"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/_base_settings.py
|
#: pretix/_base_settings.py
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "Saesneg"
|
msgstr "Saesneg"
|
||||||
@@ -1223,6 +1191,19 @@ msgstr ""
|
|||||||
msgid "Download a spreadsheet of all currently registered customer accounts."
|
msgid "Download a spreadsheet of all currently registered customer accounts."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/permissions.py
|
||||||
|
#: pretix/control/navigation.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
msgid "Customers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
#: pretix/presale/views/customer.py
|
||||||
|
msgid "Memberships"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
@@ -1355,6 +1336,66 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/live.html
|
||||||
|
msgid "Test mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
|
#: pretix/plugins/reports/exporters.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||||
|
msgid "Canceled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
|
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
||||||
|
msgid "Membership type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
msgid "Purchase ticket"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/forms/questions.py
|
||||||
|
#: pretix/base/models/memberships.py pretix/control/forms/rrule.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "Start date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
msgid "Start time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||||
|
#: pretix/base/exporters/waitinglist.py pretix/base/models/memberships.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
|
#: pretix/plugins/checkinlists/exporters.py
|
||||||
|
msgid "End date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/exporters/customers.py
|
||||||
|
msgid "End time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
||||||
msgctxt "export_category"
|
msgctxt "export_category"
|
||||||
msgid "Invoices"
|
msgid "Invoices"
|
||||||
@@ -2182,30 +2223,6 @@ msgstr ""
|
|||||||
msgid "Position ID"
|
msgid "Position ID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/forms/questions.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/rrule.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "Start date"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
|
||||||
#: pretix/plugins/checkinlists/exporters.py
|
|
||||||
msgid "End date"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
#: pretix/base/exporters/orderlist.py pretix/base/exporters/waitinglist.py
|
||||||
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
#: pretix/base/modelimport_orders.py pretix/base/modelimport_vouchers.py
|
||||||
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
#: pretix/base/models/items.py pretix/base/models/vouchers.py
|
||||||
@@ -2597,12 +2614,6 @@ msgstr ""
|
|||||||
msgid "Gift card code"
|
msgid "Gift card code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/live.html
|
|
||||||
msgid "Test mode"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
#: pretix/base/exporters/orderlist.py pretix/base/models/organizer.py
|
||||||
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
#: pretix/control/forms/event.py pretix/control/forms/filter.py
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup.html
|
#: pretix/control/templates/pretixcontrol/email_setup.html
|
||||||
@@ -2716,7 +2727,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/plugins/reports/exporters.py
|
#: pretix/plugins/reports/exporters.py pretix/plugins/sendmail/forms.py
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html
|
||||||
msgid "Expired"
|
msgid "Expired"
|
||||||
@@ -2882,7 +2893,7 @@ msgid "This combination of credentials is not known to our system."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
#: pretix/base/forms/auth.py pretix/base/forms/user.py
|
||||||
#: pretix/presale/forms/customer.py
|
#: pretix/control/views/user.py pretix/presale/forms/customer.py
|
||||||
msgid "For security reasons, please wait 5 minutes before you try again."
|
msgid "For security reasons, please wait 5 minutes before you try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -3811,6 +3822,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
#: pretix/base/modelimport_vouchers.py pretix/base/models/vouchers.py
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/views/vouchers.py
|
#: pretix/control/views/vouchers.py
|
||||||
msgid "Price effect"
|
msgid "Price effect"
|
||||||
@@ -4428,8 +4440,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/base/models/event.py
|
#: pretix/base/models/event.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"This will be used to let users know if the event is in a different timezone "
|
"This will be used to let users know if the event is in a different timezone, "
|
||||||
"and let’s us calculate users’ local times."
|
"and to let us calculate the local time of a user."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
||||||
@@ -5724,23 +5736,6 @@ msgstr ""
|
|||||||
msgid "Number of times this membership can be used in a purchase."
|
msgid "Number of times this membership can be used in a purchase."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/overview.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
|
||||||
#: pretix/plugins/reports/exporters.py
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
msgid "Canceled"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/models/memberships.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
|
|
||||||
msgid "Membership type"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/models/orders.py
|
#: pretix/base/models/orders.py
|
||||||
msgid "pending"
|
msgid "pending"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -6526,7 +6521,7 @@ msgstr ""
|
|||||||
msgid "It is currently not possible to create vouchers for add-on products."
|
msgid "It is currently not possible to create vouchers for add-on products."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"You need to select a specific product or quota if this voucher should "
|
"You need to select a specific product or quota if this voucher should "
|
||||||
"reserve tickets."
|
"reserve tickets."
|
||||||
@@ -6545,7 +6540,7 @@ msgid ""
|
|||||||
"usages."
|
"usages."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/vouchers.py
|
#: pretix/base/models/vouchers.py pretix/control/forms/vouchers.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you want this voucher to block quota, you need to select a specific date."
|
"If you want this voucher to block quota, you need to select a specific date."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7014,6 +7009,12 @@ msgstr ""
|
|||||||
msgid "This gift card was used in the meantime. Please try again."
|
msgid "This gift card was used in the meantime. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/payment.py
|
||||||
|
msgid ""
|
||||||
|
"This payment provider exists for historical purposes only and is no longer "
|
||||||
|
"usable."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/pdf.py
|
#: pretix/base/pdf.py
|
||||||
msgid "Ticket code (barcode content)"
|
msgid "Ticket code (barcode content)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7577,11 +7578,6 @@ msgid ""
|
|||||||
"permissions."
|
"permissions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
|
||||||
msgid "Customers"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/base/permissions.py pretix/control/navigation.py
|
#: pretix/base/permissions.py pretix/control/navigation.py
|
||||||
msgid "Devices"
|
msgid "Devices"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -8721,6 +8717,12 @@ msgid ""
|
|||||||
"card."
|
"card."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/base/services/orders.py
|
||||||
|
msgid ""
|
||||||
|
"You cannot change the ticket secret of a position that has been used to "
|
||||||
|
"issue a gift card."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/services/orders.py
|
#: pretix/base/services/orders.py
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -10258,13 +10260,13 @@ msgstr ""
|
|||||||
msgid "We'll show this publicly to allow attendees to contact you."
|
msgid "We'll show this publicly to allow attendees to contact you."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Content"
|
#| msgid "Content"
|
||||||
msgid "Contact URL"
|
msgid "Contact URL"
|
||||||
msgstr "Cynnwys"
|
msgstr "Cynnwys"
|
||||||
|
|
||||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
#: pretix/base/settings.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you set this, the footer contact link will point here instead of using "
|
"If you set this, the footer contact link will point here instead of using "
|
||||||
"the email address above. Please note that you still need to add a contact "
|
"the email address above. Please note that you still need to add a contact "
|
||||||
@@ -11751,6 +11753,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
#: pretix/control/templates/pretixcontrol/organizers/customers.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
@@ -12948,7 +12951,7 @@ msgstr ""
|
|||||||
msgid "Valid orders"
|
msgid "Valid orders"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
msgid "Paid (or canceled with paid fee)"
|
msgid "Paid (or canceled with paid fee)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -12972,7 +12975,7 @@ msgstr ""
|
|||||||
msgid "Cancellations"
|
msgid "Cancellations"
|
||||||
msgstr "Dileadau"
|
msgstr "Dileadau"
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py pretix/plugins/sendmail/forms.py
|
||||||
msgid "Canceled (fully)"
|
msgid "Canceled (fully)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -13147,6 +13150,22 @@ msgstr ""
|
|||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale not started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
msgid "Presale over"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
||||||
msgid "Date from"
|
msgid "Date from"
|
||||||
@@ -13184,13 +13203,6 @@ msgstr ""
|
|||||||
msgid "not yet activated"
|
msgid "not yet activated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
|
||||||
#: pretix/presale/views/customer.py
|
|
||||||
msgid "Memberships"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py
|
#: pretix/control/forms/filter.py
|
||||||
msgid "Has no memberships"
|
msgid "Has no memberships"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -13418,6 +13430,38 @@ msgstr ""
|
|||||||
msgid "Search email address or subject"
|
msgid "Search email address or subject"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||||
|
msgid "Source"
|
||||||
|
msgstr "Tarddiad"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "All sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Team actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "Customer actions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Redirection"
|
||||||
|
msgid "Device actions"
|
||||||
|
msgstr "Ailgyfeiriad"
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py
|
||||||
|
msgid "User email"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/filter.py pretix/control/navigation.py
|
||||||
|
msgid "All users"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/global_settings.py
|
#: pretix/control/forms/global_settings.py
|
||||||
msgid "Additional footer text"
|
msgid "Additional footer text"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -14605,6 +14649,7 @@ msgstr "Dewisol"
|
|||||||
#: pretix/control/forms/renderers.py
|
#: pretix/control/forms/renderers.py
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
msgctxt "form_bulk"
|
msgctxt "form_bulk"
|
||||||
msgid "change"
|
msgid "change"
|
||||||
msgstr "newid"
|
msgstr "newid"
|
||||||
@@ -14718,6 +14763,55 @@ msgid ""
|
|||||||
"should show them."
|
"should show them."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"You cannot reduce the maximum number of redemptions to %(max_usages)s, "
|
||||||
|
"because at least one of the selected vouchers has already been redeemed "
|
||||||
|
"%(max_redeemed)s times."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"You cannot create a voucher that allows selection of a quota but has no date "
|
||||||
|
"selected."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The subevent does not belong to this event."
|
||||||
|
msgid "The selected quota does not match the selected subevent."
|
||||||
|
msgstr "Nid yw'r digwyddiad yn perthyn i'r digwyddiad hwn."
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid "There is no sufficient quota available to perform this change."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the maximum number of usages in bulk is not supported if any of the "
|
||||||
|
"selected vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgctxt "subevent"
|
||||||
|
msgid ""
|
||||||
|
"Changing the date in bulk is not supported if any of the selected vouchers "
|
||||||
|
"is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"Changing the product to a quota is not supported if any of the selected "
|
||||||
|
"vouchers is assigned a seat."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/forms/vouchers.py
|
||||||
|
msgid ""
|
||||||
|
"This change cannot be completed because not all assigned seats of the "
|
||||||
|
"vouchers are still available"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/vouchers.py
|
#: pretix/control/forms/vouchers.py
|
||||||
msgid "Codes"
|
msgid "Codes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -16424,10 +16518,6 @@ msgstr ""
|
|||||||
msgid "Account history"
|
msgid "Account history"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
|
||||||
msgid "All users"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/navigation.py
|
#: pretix/control/navigation.py
|
||||||
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
#: pretix/control/templates/pretixcontrol/user/staff_session_list.html
|
||||||
msgid "Admin sessions"
|
msgid "Admin sessions"
|
||||||
@@ -16696,6 +16786,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/users/create.html
|
#: pretix/control/templates/pretixcontrol/users/create.html
|
||||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html
|
||||||
@@ -17119,8 +17210,8 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
#: pretix/control/templates/pretixcontrol/checkin/checkins.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
#: pretix/control/templates/pretixcontrol/checkin/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
#: pretix/control/templates/pretixcontrol/checkin/lists.html
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/question.html
|
#: pretix/control/templates/pretixcontrol/items/question.html
|
||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/orders/index.html
|
#: pretix/control/templates/pretixcontrol/orders/index.html
|
||||||
@@ -17131,7 +17222,6 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
#: pretix/control/templates/pretixcontrol/organizers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
#: pretix/control/templates/pretixcontrol/organizers/teams.html
|
||||||
@@ -17266,6 +17356,7 @@ msgstr "Stamp amser"
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
|
||||||
msgid "Select all results on other pages as well"
|
msgid "Select all results on other pages as well"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -17836,6 +17927,22 @@ msgstr ""
|
|||||||
msgid "We found an SPF record on your domain that includes this system. Great!"
|
msgid "We found an SPF record on your domain that includes this system. Great!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "Your new DKIM record should be set up as a CNAME record like this:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "We found a DKIM record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "Your new DMARC record could look like this:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
|
msgid "We found a DMARC record on your domain for this system. Great!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||||
msgid "Verification"
|
msgid "Verification"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -17996,6 +18103,94 @@ msgid ""
|
|||||||
"undeletable data, such as orders not performed in test mode."
|
"undeletable data, such as orders not performed in test mode."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "Personal data was cleared from this log entry."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
msgid "This change was performed by a pretix administrator."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||||
|
msgid "Inspect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>overpaid orders</strong>, for example due to "
|
||||||
|
"duplicate payment attempts. You should review the cases and consider "
|
||||||
|
"refunding the overpaid amount to the user."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show overpaid orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending refunds</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show pending refunds"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>requested cancellations</strong> that you should "
|
||||||
|
"take care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders requesting cancellation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>pending approvals</strong> that you should take "
|
||||||
|
"care of."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show orders pending approval"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"This event contains <strong>fully paid orders</strong> that are not marked "
|
||||||
|
"as paid, probably because no quota was left at the time their payment "
|
||||||
|
"arrived. You should review the cases and consider either refunding the "
|
||||||
|
"customer or creating more space."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show affected orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid ""
|
||||||
|
"Orders in this event could not be <strong>synced to an external system</"
|
||||||
|
"strong> as configured."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/event/dashboard_partial_warnings.html
|
||||||
|
msgid "Show sync problems"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/delete.html
|
#: pretix/control/templates/pretixcontrol/event/delete.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"This operation will destroy your event including all configuration, "
|
"This operation will destroy your event including all configuration, "
|
||||||
@@ -18110,69 +18305,6 @@ msgstr ""
|
|||||||
msgid "Create QR code"
|
msgid "Create QR code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>overpaid orders</strong>, for example due to "
|
|
||||||
"duplicate payment attempts. You should review the cases and consider "
|
|
||||||
"refunding the overpaid amount to the user."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show overpaid orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending refunds</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show pending refunds"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>requested cancellations</strong> that you should "
|
|
||||||
"take care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders requesting cancellation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>pending approvals</strong> that you should take "
|
|
||||||
"care of."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show orders pending approval"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"This event contains <strong>fully paid orders</strong> that are not marked "
|
|
||||||
"as paid, probably because no quota was left at the time their payment "
|
|
||||||
"arrived. You should review the cases and consider either refunding the "
|
|
||||||
"customer or creating more space."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show affected orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid ""
|
|
||||||
"Orders in this event could not be <strong>synced to an external system</"
|
|
||||||
"strong> as configured."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
|
||||||
msgid "Show sync problems"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/index.html
|
#: pretix/control/templates/pretixcontrol/event/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Update comment"
|
msgid "Update comment"
|
||||||
@@ -18347,44 +18479,6 @@ msgstr ""
|
|||||||
msgid "Enable test mode"
|
msgid "Enable test mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "All actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Team actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
msgid "Customer actions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "Personal data was cleared from this log entry."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
msgid "This change was performed by a pretix administrator."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs_embed.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/includes/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
|
||||||
msgid "Inspect"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/event/logs.html
|
#: pretix/control/templates/pretixcontrol/event/logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||||
@@ -19302,6 +19396,20 @@ msgstr ""
|
|||||||
msgid "More quotas"
|
msgid "More quotas"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "Shop disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/detail.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/views/dashboards.py
|
||||||
|
msgid "On sale"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/events/index.html
|
#: pretix/control/templates/pretixcontrol/events/index.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
#: pretix/control/templates/pretixcontrol/organizers/detail.html
|
||||||
msgid "Open event dashboard"
|
msgid "Open event dashboard"
|
||||||
@@ -19312,6 +19420,10 @@ msgctxt "typography"
|
|||||||
msgid "The quick brown fox jumps over the lazy dog."
|
msgid "The quick brown fox jumps over the lazy dog."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||||
|
msgid "Specific object selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
||||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
||||||
msgid "Quota:"
|
msgid "Quota:"
|
||||||
@@ -20342,6 +20454,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%(number)s selected"
|
msgid "%(number)s selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -20432,6 +20545,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
#: pretix/control/templates/pretixcontrol/items/quotas.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||||
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
#: pretix/control/templates/pretixcontrol/subevents/index.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/index.html
|
||||||
msgid "Edit selected"
|
msgid "Edit selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -20728,6 +20842,13 @@ msgid ""
|
|||||||
"the customer account."
|
"the customer account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
|
#: pretix/control/views/orders.py
|
||||||
|
msgid ""
|
||||||
|
"Ticket secrets of order positions that have been used to issue a gift card "
|
||||||
|
"can not be changed. Only the link will be changed in this case."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"Removing or splitting this position will also remove or split all add-ons to "
|
"Removing or splitting this position will also remove or split all add-ons to "
|
||||||
@@ -21142,11 +21263,6 @@ msgstr ""
|
|||||||
msgid "Create a refund"
|
msgid "Create a refund"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
|
||||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
|
||||||
msgid "Source"
|
|
||||||
msgstr "Tarddiad"
|
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||||
msgid "Cancel transfer"
|
msgid "Cancel transfer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -22237,6 +22353,7 @@ msgstr ""
|
|||||||
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
#: pretix/control/templates/pretixcontrol/organizers/device_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -24417,11 +24534,13 @@ msgid "Copy codes"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Voucher details"
|
msgid "Voucher details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid ""
|
msgid ""
|
||||||
"If you choose \"any product\" for a specific quota and choose to reserve "
|
"If you choose \"any product\" for a specific quota and choose to reserve "
|
||||||
@@ -24429,6 +24548,10 @@ msgid ""
|
|||||||
"voucher holder if another quota associated with the product is sold out!"
|
"voucher holder if another quota associated with the product is sold out!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||||
|
msgid "Change multiple vouchers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||||
msgid "Delete voucher"
|
msgid "Delete voucher"
|
||||||
@@ -24770,7 +24893,8 @@ msgstr ""
|
|||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
"You cannot accept the invitation for \"{}\" as you already are part of this "
|
||||||
"team."
|
"team. If you want to add a different user or create a new account, log out "
|
||||||
|
"and click the invitation link again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/auth.py
|
#: pretix/control/views/auth.py
|
||||||
@@ -25381,6 +25505,30 @@ msgid ""
|
|||||||
"record."
|
"record."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We could not find a CNAME record pointing to our DKIM key for domain you are "
|
||||||
|
"trying to use. This means that there is a very high change most of the "
|
||||||
|
"emails will be rejected or marked as spam. We strongly recommend setting up "
|
||||||
|
"DKIM through a CNAME record. You can do so through the DNS settings at the "
|
||||||
|
"provider you registered your domain with."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We found a CNAME record for a DKIM key, but it is not pointing to the right "
|
||||||
|
"location. This means that there is a very high chance most of the emails "
|
||||||
|
"will be rejected or marked as spam. You should update the DNS settings of "
|
||||||
|
"your domain."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/control/views/mailsetup.py
|
||||||
|
msgid ""
|
||||||
|
"We did not find DMARC record for your domain. This means that there is a "
|
||||||
|
"very high chance most of the emails will be rejected or marked as spam. You "
|
||||||
|
"should update the DNS settings of your domain."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/mailsetup.py
|
#: pretix/control/views/mailsetup.py
|
||||||
msgid "The verification code was incorrect, please try again."
|
msgid "The verification code was incorrect, please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -26444,6 +26592,7 @@ msgid "Macao"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/helpers/daterange.py
|
#: pretix/helpers/daterange.py
|
||||||
|
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_list.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html
|
||||||
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
#: pretix/presale/templates/pretixpresale/organizers/index.html
|
||||||
@@ -27640,11 +27789,6 @@ msgstr ""
|
|||||||
msgid "PayPal account"
|
msgid "PayPal account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
|
||||||
#, python-brace-format
|
|
||||||
msgid "<a target=\"_blank\" rel=\"noopener\" href=\"{docs_url}\">{text}</a>"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -28281,8 +28425,13 @@ msgstr "Ailgyfeirio URIs"
|
|||||||
#: pretix/plugins/returnurl/views.py
|
#: pretix/plugins/returnurl/views.py
|
||||||
msgid ""
|
msgid ""
|
||||||
"Redirection will only be allowed to URLs that start with one of these "
|
"Redirection will only be allowed to URLs that start with one of these "
|
||||||
"prefixes. Enter one or more allowed URL prefix per line. URL prefixes must "
|
"prefixes. Enter one allowed URL prefix per line. URL prefixes must include a "
|
||||||
"include a slash after the hostname."
|
"slash after the hostname."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: pretix/plugins/returnurl/views.py
|
||||||
|
msgid ""
|
||||||
|
"All values must be URLs that include at last one slash after the hostname."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/sendmail/apps.py
|
#: pretix/plugins/sendmail/apps.py
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -94,6 +94,8 @@ Checkout
|
|||||||
Chrome
|
Chrome
|
||||||
Client-ID
|
Client-ID
|
||||||
Client-Secret
|
Client-Secret
|
||||||
|
CNAME
|
||||||
|
CNAME-Eintrag
|
||||||
CODE.txt
|
CODE.txt
|
||||||
Community-Übersetzungen
|
Community-Übersetzungen
|
||||||
CONFIRM
|
CONFIRM
|
||||||
@@ -123,6 +125,11 @@ Debug-Modus
|
|||||||
dekodi
|
dekodi
|
||||||
Desktop-Apps
|
Desktop-Apps
|
||||||
Di
|
Di
|
||||||
|
DKIM
|
||||||
|
DKIM-Eintrag
|
||||||
|
DKIM-Schlüssel
|
||||||
|
DMARC
|
||||||
|
DMARC-Eintrag
|
||||||
Do
|
Do
|
||||||
Downloadformat
|
Downloadformat
|
||||||
Dr
|
Dr
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user