Compare commits

..

4 Commits

Author SHA1 Message Date
Lukas Bockstaller d17f03ccd5 include csrfcookieretry in order.html as well 2026-06-22 16:07:50 +02:00
Lukas Bockstaller 192aa9fc9f include static tag 2026-06-19 10:25:36 +02:00
Lukas Bockstaller 5e57ce6ef9 use csrfcookieretry only on event index page 2026-06-19 10:14:41 +02:00
Lukas Bockstaller 2f794c8e7d use cookieretry only on presale event pages 2026-06-19 09:22:03 +02:00
53 changed files with 791 additions and 758 deletions
+1 -1
View File
@@ -81,7 +81,7 @@ is a python method that emulates a behavior similar to ``reverse``:
If you need to communicate the URL externally, you can use a different method to ensure that it is always an absolute URL:
.. autofunction:: pretix.multidomain.urlreverse.eventreverse_absolute
.. autofunction:: pretix.multidomain.urlreverse.build_absolute_uri
In addition, there is a template tag that works similar to ``url`` but takes an event or organizer object
as its first argument and can be used like this::
+91 -109
View File
@@ -370,14 +370,14 @@
"license": "MIT"
},
"node_modules/@napi-rs/wasm-runtime": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz",
"integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
"integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@tybys/wasm-util": "^0.10.2"
"@tybys/wasm-util": "^0.10.1"
},
"funding": {
"type": "github",
@@ -427,9 +427,9 @@
}
},
"node_modules/@oxc-project/types": {
"version": "0.133.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz",
"integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==",
"version": "0.129.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.129.0.tgz",
"integrity": "sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==",
"dev": true,
"license": "MIT",
"funding": {
@@ -758,9 +758,9 @@
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz",
"integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0.tgz",
"integrity": "sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==",
"cpu": [
"arm64"
],
@@ -775,9 +775,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz",
"integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0.tgz",
"integrity": "sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==",
"cpu": [
"arm64"
],
@@ -792,9 +792,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz",
"integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0.tgz",
"integrity": "sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==",
"cpu": [
"x64"
],
@@ -809,9 +809,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz",
"integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0.tgz",
"integrity": "sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==",
"cpu": [
"x64"
],
@@ -826,9 +826,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz",
"integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0.tgz",
"integrity": "sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==",
"cpu": [
"arm"
],
@@ -843,16 +843,13 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz",
"integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0.tgz",
"integrity": "sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -863,16 +860,13 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz",
"integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0.tgz",
"integrity": "sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -883,16 +877,13 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz",
"integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0.tgz",
"integrity": "sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==",
"cpu": [
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -903,16 +894,13 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz",
"integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0.tgz",
"integrity": "sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==",
"cpu": [
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -923,16 +911,13 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz",
"integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0.tgz",
"integrity": "sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -943,16 +928,13 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz",
"integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0.tgz",
"integrity": "sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -963,9 +945,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz",
"integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0.tgz",
"integrity": "sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==",
"cpu": [
"arm64"
],
@@ -980,9 +962,9 @@
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz",
"integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0.tgz",
"integrity": "sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==",
"cpu": [
"wasm32"
],
@@ -999,9 +981,9 @@
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz",
"integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0.tgz",
"integrity": "sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==",
"cpu": [
"arm64"
],
@@ -1016,9 +998,9 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz",
"integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0.tgz",
"integrity": "sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==",
"cpu": [
"x64"
],
@@ -3176,9 +3158,9 @@
"license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.12",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
"integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [
{
"type": "github",
@@ -3352,9 +3334,9 @@
}
},
"node_modules/postcss": {
"version": "8.5.15",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
"integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
"version": "8.5.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
"integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
"funding": [
{
"type": "opencollective",
@@ -3371,7 +3353,7 @@
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.12",
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -3628,14 +3610,14 @@
}
},
"node_modules/rolldown": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz",
"integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0.tgz",
"integrity": "sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.133.0",
"@rolldown/pluginutils": "^1.0.0"
"@oxc-project/types": "=0.129.0",
"@rolldown/pluginutils": "1.0.0"
},
"bin": {
"rolldown": "bin/cli.mjs"
@@ -3644,27 +3626,27 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.0.3",
"@rolldown/binding-darwin-arm64": "1.0.3",
"@rolldown/binding-darwin-x64": "1.0.3",
"@rolldown/binding-freebsd-x64": "1.0.3",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.3",
"@rolldown/binding-linux-arm64-gnu": "1.0.3",
"@rolldown/binding-linux-arm64-musl": "1.0.3",
"@rolldown/binding-linux-ppc64-gnu": "1.0.3",
"@rolldown/binding-linux-s390x-gnu": "1.0.3",
"@rolldown/binding-linux-x64-gnu": "1.0.3",
"@rolldown/binding-linux-x64-musl": "1.0.3",
"@rolldown/binding-openharmony-arm64": "1.0.3",
"@rolldown/binding-wasm32-wasi": "1.0.3",
"@rolldown/binding-win32-arm64-msvc": "1.0.3",
"@rolldown/binding-win32-x64-msvc": "1.0.3"
"@rolldown/binding-android-arm64": "1.0.0",
"@rolldown/binding-darwin-arm64": "1.0.0",
"@rolldown/binding-darwin-x64": "1.0.0",
"@rolldown/binding-freebsd-x64": "1.0.0",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.0",
"@rolldown/binding-linux-arm64-gnu": "1.0.0",
"@rolldown/binding-linux-arm64-musl": "1.0.0",
"@rolldown/binding-linux-ppc64-gnu": "1.0.0",
"@rolldown/binding-linux-s390x-gnu": "1.0.0",
"@rolldown/binding-linux-x64-gnu": "1.0.0",
"@rolldown/binding-linux-x64-musl": "1.0.0",
"@rolldown/binding-openharmony-arm64": "1.0.0",
"@rolldown/binding-wasm32-wasi": "1.0.0",
"@rolldown/binding-win32-arm64-msvc": "1.0.0",
"@rolldown/binding-win32-x64-msvc": "1.0.0"
}
},
"node_modules/rolldown/node_modules/@rolldown/pluginutils": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
"integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0.tgz",
"integrity": "sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==",
"dev": true,
"license": "MIT"
},
@@ -4343,9 +4325,9 @@
}
},
"node_modules/tinyglobby": {
"version": "0.2.17",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
"integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"version": "0.2.16",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
"integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4483,17 +4465,17 @@
"license": "MIT"
},
"node_modules/vite": {
"version": "8.0.16",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz",
"integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==",
"version": "8.0.12",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.12.tgz",
"integrity": "sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg==",
"dev": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.4",
"postcss": "^8.5.15",
"rolldown": "1.0.3",
"tinyglobby": "^0.2.17"
"postcss": "^8.5.14",
"rolldown": "1.0.0",
"tinyglobby": "^0.2.16"
},
"bin": {
"vite": "bin/vite.js"
+4 -4
View File
@@ -33,14 +33,14 @@ dependencies = [
"bleach==6.4.*",
"celery==5.6.*",
"chardet==5.2.*",
"cryptography>=49.0.0",
"cryptography>=48.0.1",
"css-inline==0.20.*",
"defusedcsv>=3.0.0",
"dnspython==2.*",
"Django[argon2]==5.2.*",
"django-bootstrap3==26.1",
"django-compressor==4.6.0",
"django-countries==9.0.*",
"django-countries==8.2.*",
"django-filter==25.1",
"django-formset-js-improved==0.5.0.5",
"django-formtools==2.6.1",
@@ -101,7 +101,7 @@ dependencies = [
"tqdm==4.*",
"ua-parser==1.0.*",
"vobject==0.9.*",
"webauthn==2.8.*",
"webauthn==2.7.*",
"zeep==4.3.*"
]
@@ -125,7 +125,7 @@ dev = [
"pytest-sugar",
"pytest-xdist==3.8.*",
"pytest-playwright",
"pytest==9.1.*",
"pytest==9.0.*",
"playwright",
"responses",
]
+2 -2
View File
@@ -73,7 +73,7 @@ from pretix.base.settings import (
LazyI18nStringList, validate_event_settings,
)
from pretix.base.signals import api_event_settings_fields
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__)
@@ -173,7 +173,7 @@ class EventSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
)
def get_event_url(self, event):
return eventreverse_absolute(event, 'presale:event.index')
return build_absolute_uri(event, 'presale:event.index')
class Meta:
model = Event
+3 -3
View File
@@ -76,7 +76,7 @@ from pretix.base.settings import (
)
from pretix.base.signals import register_ticket_outputs
from pretix.helpers.countries import CachedCountries
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__)
@@ -757,7 +757,7 @@ class PaymentURLField(serializers.URLField):
def to_representation(self, instance: OrderPayment):
if instance.state != OrderPayment.PAYMENT_STATE_CREATED:
return None
return eventreverse_absolute(instance.order.event, 'presale:event.order.pay', kwargs={
return build_absolute_uri(instance.order.event, 'presale:event.order.pay', kwargs={
'order': instance.order.code,
'secret': instance.order.secret,
'payment': instance.pk,
@@ -806,7 +806,7 @@ class OrderRefundSerializer(I18nAwareModelSerializer):
class OrderURLField(serializers.URLField):
def to_representation(self, instance: Order):
return eventreverse_absolute(instance.event, 'presale:event.order', kwargs={
return build_absolute_uri(instance.event, 'presale:event.order', kwargs={
'order': instance.code,
'secret': instance.secret,
})
+4 -4
View File
@@ -58,8 +58,8 @@ from pretix.helpers.permission_migration import (
OLD_TO_NEW_EVENT_COMPAT, OLD_TO_NEW_EVENT_MIGRATION,
OLD_TO_NEW_ORGANIZER_COMPAT, OLD_TO_NEW_ORGANIZER_MIGRATION,
)
from pretix.helpers.urls import mainreverse_absolute
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.helpers.urls import build_absolute_uri as build_global_uri
from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__)
@@ -71,7 +71,7 @@ class OrganizerSerializer(I18nAwareModelSerializer):
slug = serializers.CharField(read_only=True)
def get_organizer_url(self, organizer):
return eventreverse_absolute(organizer, 'presale:organizer.index')
return build_absolute_uri(organizer, 'presale:organizer.index')
class Meta:
model = Organizer
@@ -499,7 +499,7 @@ class TeamInviteSerializer(serializers.ModelSerializer):
'user': self,
'organizer': self.context['organizer'].name,
'team': instance.team.name,
'url': mainreverse_absolute('control:auth.invite', kwargs={
'url': build_global_uri('control:auth.invite', kwargs={
'token': instance.token
})
},
-1
View File
@@ -872,7 +872,6 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force,
'media_policy': e.media_policy,
'media_type': e.media_type,
'list': MiniCheckinListSerializer(list_by_event[op.order.event_id]).data,
'reason': e.code,
'reason_explanation': e.msg,
}, status=400)
except CheckInError as e:
+2 -2
View File
@@ -36,7 +36,7 @@ from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from requests import RequestException
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__)
@@ -313,7 +313,7 @@ def _get_or_create_server_keypair(organizer):
def generate_id_token(customer, client, auth_time, nonce, scope, expires: datetime, scope_claims=False, with_code=None, with_access_token=None):
payload = {
'iss': eventreverse_absolute(client.organizer, 'presale:organizer.index').rstrip('/'),
'iss': build_absolute_uri(client.organizer, 'presale:organizer.index').rstrip('/'),
'aud': client.client_id,
'exp': int(expires.timestamp()),
'iat': int(time.time()),
+3 -3
View File
@@ -28,7 +28,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy
from pretix.base.models import Checkin, InvoiceAddress, Order, Question
from pretix.base.settings import PERSON_NAME_SCHEMES
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
def get_answer(op, question_identifier=None):
@@ -545,7 +545,7 @@ def get_data_fields(event, for_model=None):
_("Order link"),
Question.TYPE_STRING,
None,
lambda order: eventreverse_absolute(
lambda order: build_absolute_uri(
event,
'presale:event.order', kwargs={
'order': order.code,
@@ -560,7 +560,7 @@ def get_data_fields(event, for_model=None):
_("Ticket link"),
Question.TYPE_STRING,
None,
lambda op: eventreverse_absolute(
lambda op: build_absolute_uri(
event,
'presale:event.order.position', kwargs={
'order': op.order.code,
+3 -3
View File
@@ -68,7 +68,7 @@ from ...control.forms.filter import get_all_payment_providers
from ...helpers import GroupConcat
from ...helpers.iter import chunked_iterable
from ...helpers.safe_openpyxl import remove_invalid_excel_chars
from ...multidomain.urlreverse import eventreverse_absolute
from ...multidomain.urlreverse import build_absolute_uri
from ..exporter import (
ListExporter, MultiSheetListExporter, OrganizerLevelExportMixin,
)
@@ -429,7 +429,7 @@ class OrderListExporter(MultiSheetListExporter):
]))
row.append(
eventreverse_absolute(order.event, 'presale:event.order', kwargs={
build_absolute_uri(order.event, 'presale:event.order', kwargs={
'order': order.code,
'secret': order.secret,
})
@@ -855,7 +855,7 @@ class OrderListExporter(MultiSheetListExporter):
]))
row.append(
eventreverse_absolute(order.event, 'presale:event.order.position', kwargs={
build_absolute_uri(order.event, 'presale:event.order.position', kwargs={
'order': order.code,
'secret': op.web_secret,
'position': op.positionid
+2 -4
View File
@@ -282,12 +282,10 @@ def metric_values():
# Throwaway metrics
exact_tables = [
Order, Invoice, Event, Organizer
Order, OrderPosition, Invoice, Event, Organizer
]
for m in apps.get_models(): # Count all models
if issubclass(m, OrderPosition):
metrics['pretix_model_instances']['{model="%s"}' % m._meta] = m.all.count()
elif any(issubclass(m, p) for p in exact_tables):
if any(issubclass(m, p) for p in exact_tables):
metrics['pretix_model_instances']['{model="%s"}' % m._meta] = m.objects.count()
else:
metrics['pretix_model_instances']['{model="%s"}' % m._meta] = estimate_count_fast(m)
+3 -3
View File
@@ -57,7 +57,7 @@ from django_otp.models import Device
from django_scopes import scopes_disabled
from pretix.base.i18n import language
from pretix.helpers.urls import mainreverse_absolute
from pretix.helpers.urls import build_absolute_uri
from ...helpers.countries import FastCountryField
from ...helpers.u2f import pub_key_from_der, websafe_decode
@@ -378,7 +378,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
{
'user': self,
'messages': msg,
'url': mainreverse_absolute('control:user.settings'),
'url': build_absolute_uri('control:user.settings'),
'instance': settings.PRETIX_INSTANCE_NAME,
},
event=None,
@@ -466,7 +466,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
{
'instance': settings.PRETIX_INSTANCE_NAME,
'user': self,
'url': (mainreverse_absolute('control:auth.forgot.recover')
'url': (build_absolute_uri('control:auth.forgot.recover')
+ '?id=%d&token=%s' % (self.id, default_token_generator.make_token(self)))
},
None, locale=self.locale, user=self
+4 -4
View File
@@ -167,7 +167,7 @@ class Customer(LoggedModel):
def send_security_notice(self, message, email=None):
from pretix.base.services.mail import SendMailException, mail
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
try:
with language(self.locale):
@@ -178,7 +178,7 @@ class Customer(LoggedModel):
{
**self.get_email_context(),
'message': str(message),
'url': eventreverse_absolute(self.organizer, 'presale:organizer.customer.index')
'url': build_absolute_uri(self.organizer, 'presale:organizer.customer.index')
},
customer=self,
organizer=self.organizer,
@@ -299,12 +299,12 @@ class Customer(LoggedModel):
def send_activation_mail(self):
from pretix.base.services.mail import mail
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.forms.customer import TokenGenerator
ctx = self.get_email_context()
token = TokenGenerator().make_token(self)
ctx['url'] = eventreverse_absolute(
ctx['url'] = build_absolute_uri(
self.organizer,
'presale:organizer.customer.activate'
) + '?id=' + self.identifier + '&token=' + token
+2 -2
View File
@@ -724,7 +724,7 @@ class Event(EventMixin, LoggedModel):
@property
def social_image(self):
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
img = None
logo_file = self.settings.get('logo_image', as_type=str, default='')[7:]
@@ -742,7 +742,7 @@ class Event(EventMixin, LoggedModel):
logger.exception(f'Failed to create thumbnail of {logo_file}')
img = default_storage.url(logo_file)
if img:
return urljoin(eventreverse_absolute(self, 'presale:event.index'), img)
return urljoin(build_absolute_uri(self, 'presale:event.index'), img)
def _seats(self, ignore_voucher=None):
from .seating import Seat
+28 -50
View File
@@ -354,60 +354,38 @@ class Order(LockModel, LoggedModel):
def _transaction_key_reset(self):
self.__initial_status_paid_or_pending = self.status in (Order.STATUS_PENDING, Order.STATUS_PAID) and not self.require_approval
@classmethod
def gracefully_delete_bulk(cls, event, orders, user=None, auth=None):
# Expects to be called in a transaction
from . import (
GiftCard, GiftCardTransaction, LogEntry, Membership, Voucher,
)
if not transaction.get_connection().in_atomic_block:
raise Exception('gracefully_delete_bulk should only be called in atomic transaction!')
logs_create = []
for o in orders:
if not o.testmode:
raise TypeError("Only test mode orders can be deleted.")
order_gracefully_delete.send(event, order=o)
logs_create.append(o.log_action(
'pretix.event.order.deleted', user=user, auth=auth,
data={
'code': o.code,
},
save=False,
))
LogEntry.bulk_create_and_postprocess(logs_create)
voucher_ids = OrderPosition.objects.filter(
order__in=orders,
voucher__isnull=False
).exclude(order__status=Order.STATUS_CANCELED).values_list("voucher_id", flat=True)
voucher_usages = Counter(voucher_ids)
for v_id, usage_count in voucher_usages.items():
Voucher.objects.filter(pk=v_id).update(redeemed=Greatest(0, F('redeemed') - usage_count))
GiftCardTransaction.objects.filter(payment__order__in=orders).update(payment=None)
GiftCardTransaction.objects.filter(refund__order__in=orders).update(refund=None)
GiftCardTransaction.objects.filter(order__in=orders).update(order=None)
GiftCard.objects.filter(issued_in__order__in=orders).update(issued_in=None)
Membership.objects.filter(granted_in__order__in=orders, testmode=True).update(granted_in=None)
OrderPosition.all.filter(order__in=orders, addon_to__isnull=False).delete()
OrderPosition.all.filter(order__in=orders).delete()
OrderFee.all.filter(order__in=orders).delete()
Transaction.objects.filter(order__in=orders).delete()
OrderRefund.objects.filter(order__in=orders).delete()
OrderPayment.objects.filter(order__in=orders).delete()
if isinstance(orders, models.QuerySet):
orders.delete()
else:
Order.objects.filter(pk__in=[o.pk for o in orders]).delete()
event.cache.delete('complain_testmode_orders')
def gracefully_delete(self, user=None, auth=None):
from . import GiftCard, GiftCardTransaction, Membership, Voucher
if not self.testmode:
raise TypeError("Only test mode orders can be deleted.")
self.log_action(
'pretix.event.order.deleted', user=user, auth=auth,
data={
'code': self.code,
}
)
Order.gracefully_delete_bulk(self.event, Order.objects.filter(pk=self.pk), user, auth)
order_gracefully_delete.send(self.event, order=self)
if self.status != Order.STATUS_CANCELED:
for position in self.positions.all():
if position.voucher:
Voucher.objects.filter(pk=position.voucher.pk).update(redeemed=Greatest(0, F('redeemed') - 1))
GiftCardTransaction.objects.filter(payment__in=self.payments.all()).update(payment=None)
GiftCardTransaction.objects.filter(refund__in=self.refunds.all()).update(refund=None)
GiftCardTransaction.objects.filter(order=self).update(order=None)
GiftCard.objects.filter(issued_in__in=self.positions.all()).update(issued_in=None)
Membership.objects.filter(granted_in__order=self, testmode=True).update(granted_in=None)
OrderPosition.all.filter(order=self, addon_to__isnull=False).delete()
OrderPosition.all.filter(order=self).delete()
OrderFee.all.filter(order=self).delete()
Transaction.objects.filter(order=self).delete()
self.refunds.all().delete()
self.payments.all().delete()
self.event.cache.delete('complain_testmode_orders')
self.delete()
def email_confirm_secret(self):
return self.tagged_secret("email_confirm", 9)
+2 -2
View File
@@ -43,7 +43,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy
from pretix.base.models import Event, LogEntry
from pretix.base.signals import register_notification_types
from pretix.base.templatetags.money import money_filter
from pretix.helpers.urls import mainreverse_absolute
from pretix.helpers.urls import build_absolute_uri
logger = logging.getLogger(__name__)
_ALL_TYPES = None
@@ -170,7 +170,7 @@ class ParametrizedOrderNotificationType(NotificationType):
def build_notification(self, logentry: LogEntry):
order = logentry.content_object
order_url = mainreverse_absolute(
order_url = build_absolute_uri(
'control:event.order',
kwargs={
'organizer': logentry.event.organizer.slug,
+2 -2
View File
@@ -71,7 +71,7 @@ from pretix.helpers import OF_SELF
from pretix.helpers.countries import CachedCountries
from pretix.helpers.format import format_map
from pretix.helpers.money import DecimalTextInput
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.views import get_cart
from pretix.presale.views.cart import cart_session, get_or_create_cart_id
@@ -379,7 +379,7 @@ class BasePaymentProvider:
if not self.settings.get('_hidden_seed'):
self.settings.set('_hidden_seed', get_random_string(64))
hidden_url = eventreverse_absolute(self.event, 'presale:event.payment.unlock', kwargs={
hidden_url = build_absolute_uri(self.event, 'presale:event.payment.unlock', kwargs={
'hash': hashlib.sha256((self.settings._hidden_seed + self.event.slug).encode()).hexdigest(),
})
+3 -3
View File
@@ -51,7 +51,7 @@ from pretix.base.signals import (
)
from pretix.celery_app import app
from pretix.helpers import OF_SELF, repeatable_reads_transaction
from pretix.helpers.urls import mainreverse_absolute
from pretix.helpers.urls import build_absolute_uri
logger = logging.getLogger(__name__)
@@ -455,7 +455,7 @@ def scheduled_organizer_export(self, organizer: Organizer, schedule: int) -> Non
schedule,
organizer,
exporter,
mainreverse_absolute(
build_absolute_uri(
'control:organizer.export',
kwargs={
'organizer': organizer.slug,
@@ -481,7 +481,7 @@ def scheduled_event_export(self, event: Event, schedule: int) -> None:
schedule,
event,
exporter,
mainreverse_absolute(
build_absolute_uri(
'control:event.orders.export',
kwargs={
'event': event.slug,
+3 -3
View File
@@ -85,7 +85,7 @@ from pretix.helpers.format import (
FormattedString, PlainHtmlAlternativeString, SafeFormatter, format_map,
)
from pretix.helpers.hierarkey import clean_filename
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.ical import get_private_icals
logger = logging.getLogger('pretix.base.mail')
@@ -997,7 +997,7 @@ def _wrap_plain_body(content_plain, signature, event, order, position, no_order_
body_plain += _(
"You can view your order details at the following URL:\n{orderurl}."
).replace("\n", "\r\n").format(
orderurl=eventreverse_absolute(
orderurl=build_absolute_uri(
order.event, 'presale:event.order.position', kwargs={
'order': order.code,
'secret': position.web_secret,
@@ -1013,7 +1013,7 @@ def _wrap_plain_body(content_plain, signature, event, order, position, no_order_
body_plain += _(
"You can view your order details at the following URL:\n{orderurl}."
).replace("\n", "\r\n").format(
event=event.name, orderurl=eventreverse_absolute(
event=event.name, orderurl=build_absolute_uri(
order.event, 'presale:event.order.open', kwargs={
'order': order.code,
'secret': order.secret,
+3 -3
View File
@@ -37,7 +37,7 @@ from pretix.base.services.tasks import ProfiledTask, TransactionAwareTask
from pretix.base.signals import notification
from pretix.celery_app import app
from pretix.helpers.celery import get_task_priority
from pretix.helpers.urls import mainreverse_absolute
from pretix.helpers.urls import build_absolute_uri
@app.task(base=TransactionAwareTask, acks_late=True, max_retries=9, default_retry_delay=900)
@@ -136,10 +136,10 @@ def send_notification_mail(notification: Notification, user: User):
'site_url': settings.SITE_URL,
'color': settings.PRETIX_PRIMARY_COLOR,
'notification': notification,
'settings_url': mainreverse_absolute(
'settings_url': build_absolute_uri(
'control:user.settings.notifications',
),
'disable_url': mainreverse_absolute(
'disable_url': build_absolute_uri(
'control:user.settings.notifications.off',
kwargs={
'token': user.notifications_token,
+29 -29
View File
@@ -327,7 +327,7 @@ def get_best_name(position_or_address, parts=False):
@receiver(register_text_placeholders, dispatch_uid="pretixbase_register_text_placeholders")
def base_placeholders(sender, **kwargs):
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
def _event_sample(event):
if event.has_subevents:
@@ -388,14 +388,14 @@ def base_placeholders(sender, **kwargs):
lambda event: LazyDate(now() + timedelta(days=15))
),
SimpleFunctionalTextPlaceholder(
'url', ['order', 'event'], lambda order, event: eventreverse_absolute(
'url', ['order', 'event'], lambda order, event: build_absolute_uri(
event,
'presale:event.order.open', kwargs={
'order': order.code,
'secret': order.secret,
'hash': order.email_confirm_secret()
}
), lambda event: eventreverse_absolute(
), lambda event: build_absolute_uri(
event,
'presale:event.order.open', kwargs={
'order': 'F8VVL',
@@ -406,7 +406,7 @@ def base_placeholders(sender, **kwargs):
),
SimpleButtonPlaceholder(
'url_button', ['order', 'event'],
url_func=lambda order, event: eventreverse_absolute(
url_func=lambda order, event: build_absolute_uri(
event,
'presale:event.order.open', kwargs={
'order': order.code,
@@ -415,7 +415,7 @@ def base_placeholders(sender, **kwargs):
}
),
text_func=lambda order, event: _("View order details"),
sample_url_func=lambda event: eventreverse_absolute(
sample_url_func=lambda event: build_absolute_uri(
event,
'presale:event.order.open', kwargs={
'order': 'F8VVL',
@@ -426,13 +426,13 @@ def base_placeholders(sender, **kwargs):
sample_text_func=lambda event: _("View order details"),
),
SimpleFunctionalTextPlaceholder(
'url_info_change', ['order', 'event'], lambda order, event: eventreverse_absolute(
'url_info_change', ['order', 'event'], lambda order, event: build_absolute_uri(
event,
'presale:event.order.modify', kwargs={
'order': order.code,
'secret': order.secret,
}
), lambda event: eventreverse_absolute(
), lambda event: build_absolute_uri(
event,
'presale:event.order.modify', kwargs={
'order': 'F8VVL',
@@ -441,13 +441,13 @@ def base_placeholders(sender, **kwargs):
),
),
SimpleFunctionalTextPlaceholder(
'url_products_change', ['order', 'event'], lambda order, event: eventreverse_absolute(
'url_products_change', ['order', 'event'], lambda order, event: build_absolute_uri(
event,
'presale:event.order.change', kwargs={
'order': order.code,
'secret': order.secret,
}
), lambda event: eventreverse_absolute(
), lambda event: build_absolute_uri(
event,
'presale:event.order.change', kwargs={
'order': 'F8VVL',
@@ -456,13 +456,13 @@ def base_placeholders(sender, **kwargs):
),
),
SimpleFunctionalTextPlaceholder(
'url_cancel', ['order', 'event'], lambda order, event: eventreverse_absolute(
'url_cancel', ['order', 'event'], lambda order, event: build_absolute_uri(
event,
'presale:event.order.cancel', kwargs={
'order': order.code,
'secret': order.secret,
}
), lambda event: eventreverse_absolute(
), lambda event: build_absolute_uri(
event,
'presale:event.order.cancel', kwargs={
'order': 'F8VVL',
@@ -471,7 +471,7 @@ def base_placeholders(sender, **kwargs):
),
),
SimpleFunctionalTextPlaceholder(
'url', ['event', 'position'], lambda event, position: eventreverse_absolute(
'url', ['event', 'position'], lambda event, position: build_absolute_uri(
event,
'presale:event.order.position',
kwargs={
@@ -480,7 +480,7 @@ def base_placeholders(sender, **kwargs):
'position': position.positionid
}
),
lambda event: eventreverse_absolute(
lambda event: build_absolute_uri(
event,
'presale:event.order.position', kwargs={
'order': 'F8VVL',
@@ -491,7 +491,7 @@ def base_placeholders(sender, **kwargs):
),
SimpleButtonPlaceholder(
'url_button', ['event', 'position'],
url_func=lambda event, position: eventreverse_absolute(
url_func=lambda event, position: build_absolute_uri(
event,
'presale:event.order.position', kwargs={
'order': position.order.code,
@@ -500,7 +500,7 @@ def base_placeholders(sender, **kwargs):
}
),
text_func=lambda event, position: _("View registration details"),
sample_url_func=lambda event: eventreverse_absolute(
sample_url_func=lambda event: build_absolute_uri(
event,
'presale:event.order.position', kwargs={
'order': 'F8VVL',
@@ -511,14 +511,14 @@ def base_placeholders(sender, **kwargs):
sample_text_func=lambda event: _("View registration details"),
),
SimpleFunctionalTextPlaceholder(
'url_info_change', ['position', 'event'], lambda position, event: eventreverse_absolute(
'url_info_change', ['position', 'event'], lambda position, event: build_absolute_uri(
event,
'presale:event.order.position.modify', kwargs={
'order': position.order.code,
'secret': position.web_secret,
'position': position.positionid
}
), lambda event: eventreverse_absolute(
), lambda event: build_absolute_uri(
event,
'presale:event.order.position.modify', kwargs={
'order': 'F8VVL',
@@ -528,14 +528,14 @@ def base_placeholders(sender, **kwargs):
),
),
SimpleFunctionalTextPlaceholder(
'url_products_change', ['position', 'event'], lambda position, event: eventreverse_absolute(
'url_products_change', ['position', 'event'], lambda position, event: build_absolute_uri(
event,
'presale:event.order.position.change', kwargs={
'order': position.order.code,
'secret': position.web_secret,
'position': position.positionid
}
), lambda event: eventreverse_absolute(
), lambda event: build_absolute_uri(
event,
'presale:event.order.position.change', kwargs={
'order': 'F8VVL',
@@ -581,20 +581,20 @@ def base_placeholders(sender, **kwargs):
),
SimpleFunctionalTextPlaceholder(
'url_remove', ['waiting_list_voucher', 'event'],
lambda waiting_list_voucher, event: eventreverse_absolute(
lambda waiting_list_voucher, event: build_absolute_uri(
event, 'presale:event.waitinglist.remove'
) + '?voucher=' + waiting_list_voucher.code,
lambda event: eventreverse_absolute(
lambda event: build_absolute_uri(
event,
'presale:event.waitinglist.remove',
) + '?voucher=68CYU2H6ZTP3WLK5',
),
SimpleFunctionalTextPlaceholder(
'url', ['waiting_list_voucher', 'event'],
lambda waiting_list_voucher, event: eventreverse_absolute(
lambda waiting_list_voucher, event: build_absolute_uri(
event, 'presale:event.redeem'
) + '?voucher=' + waiting_list_voucher.code,
lambda event: eventreverse_absolute(
lambda event: build_absolute_uri(
event,
'presale:event.redeem',
) + '?voucher=68CYU2H6ZTP3WLK5',
@@ -611,7 +611,7 @@ def base_placeholders(sender, **kwargs):
'orders', ['event', 'orders'], lambda event, orders: '\n' + '\n\n'.join(
'* {} - {}'.format(
order.full_code,
eventreverse_absolute(event, 'presale:event.order.open', kwargs={
build_absolute_uri(event, 'presale:event.order.open', kwargs={
'event': event.slug,
'organizer': event.organizer.slug,
'order': order.code,
@@ -623,7 +623,7 @@ def base_placeholders(sender, **kwargs):
), lambda event: '\n' + '\n\n'.join(
'* {} - {}'.format(
'{}-{}'.format(event.slug.upper(), order['code']),
eventreverse_absolute(event, 'presale:event.order.open', kwargs={
build_absolute_uri(event, 'presale:event.order.open', kwargs={
'event': event.slug,
'organizer': event.organizer.slug,
'order': order['code'],
@@ -662,13 +662,13 @@ def base_placeholders(sender, **kwargs):
# join vouchers with two spaces at end of line so markdown-parser inserts a <br>
'voucher_url_list', ['event', 'voucher_list'],
lambda event, voucher_list: ' \n'.join([
eventreverse_absolute(
build_absolute_uri(
event, 'presale:event.redeem'
) + '?voucher=' + c
for c in voucher_list
]),
lambda event: ' \n'.join([
eventreverse_absolute(
build_absolute_uri(
event, 'presale:event.redeem'
) + '?voucher=' + c
for c in ['68CYU2H6ZTP3WLK5', '7MB94KKPVEPSMVF2']
@@ -676,10 +676,10 @@ def base_placeholders(sender, **kwargs):
inline=False,
),
SimpleFunctionalTextPlaceholder(
'url', ['event', 'voucher_list'], lambda event, voucher_list: eventreverse_absolute(event, 'presale:event.index', kwargs={
'url', ['event', 'voucher_list'], lambda event, voucher_list: build_absolute_uri(event, 'presale:event.index', kwargs={
'event': event.slug,
'organizer': event.organizer.slug,
}), lambda event: eventreverse_absolute(event, 'presale:event.index', kwargs={
}), lambda event: build_absolute_uri(event, 'presale:event.index', kwargs={
'event': event.slug,
'organizer': event.organizer.slug,
})
+2 -2
View File
@@ -37,7 +37,7 @@ from pretix.base.services.mail import mail
from pretix.base.settings import GlobalSettingsObject
from pretix.base.signals import periodic_task
from pretix.celery_app import app
from pretix.helpers.urls import mainreverse_absolute
from pretix.helpers.urls import build_absolute_uri
@receiver(signal=periodic_task)
@@ -121,7 +121,7 @@ def send_update_notification_email():
)
),
{
'url': mainreverse_absolute('control:global.update')
'url': build_absolute_uri('control:global.update')
},
)
+2 -2
View File
@@ -80,7 +80,7 @@ from pretix.control.forms.widgets import Select2
from pretix.helpers.countries import CachedCountries
from pretix.multidomain.models import AlternativeDomainAssignment, KnownDomain
from pretix.multidomain.urlreverse import (
eventreverse_absolute, get_organizer_domain,
build_absolute_uri, get_organizer_domain,
)
from pretix.plugins.banktransfer.payment import BankTransfer
from pretix.presale.style import get_fonts
@@ -219,7 +219,7 @@ class EventWizardBasicsForm(I18nModelForm):
self.fields['location'].widget.attrs['placeholder'] = _(
'Sample Conference Center\nHeidelberg, Germany'
)
self.fields['slug'].widget.prefix = eventreverse_absolute(self.organizer, 'presale:organizer.index')
self.fields['slug'].widget.prefix = build_absolute_uri(self.organizer, 'presale:organizer.index')
self.fields['tax_rate']._required = True # Do not render as optional because it is conditionally required
if self.has_subevents:
del self.fields['presale_start']
+2 -2
View File
@@ -88,7 +88,7 @@ from pretix.control.forms.event import (
)
from pretix.control.forms.widgets import Select2, Select2Multiple
from pretix.multidomain.models import KnownDomain
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
class OrganizerForm(I18nModelForm):
@@ -791,7 +791,7 @@ class MailSettingsForm(SettingsForm):
}
if 'url' in base_parameters:
placeholders['url'] = eventreverse_absolute(
placeholders['url'] = build_absolute_uri(
self.organizer,
'presale:organizer.customer.activate'
) + '?token=' + get_random_string(30)
+4 -9
View File
@@ -97,9 +97,7 @@ from pretix.control.permissions import EventPermissionRequiredMixin
from pretix.control.views.mailsetup import MailSettingsSetupView
from pretix.control.views.user import RecentAuthenticationRequiredMixin
from pretix.helpers.database import rolledback_transaction
from pretix.multidomain.urlreverse import (
eventreverse_absolute, get_event_domain,
)
from pretix.multidomain.urlreverse import build_absolute_uri, get_event_domain
from pretix.presale.views.widget import (
version_default as widget_version_default,
)
@@ -1150,11 +1148,8 @@ class EventLive(EventPermissionRequiredMixin, TemplateView):
if request.POST.get("delete") == "yes":
try:
with transaction.atomic():
Order.gracefully_delete_bulk(
request.event,
request.event.orders.filter(testmode=True),
user=self.request.user
)
for order in request.event.orders.filter(testmode=True):
order.gracefully_delete(user=self.request.user)
except ProtectedError:
messages.error(self.request, _('An order could not be deleted as some constraints (e.g. data '
'created by plug-ins) do not allow it.'))
@@ -1739,7 +1734,7 @@ class EventQRCode(EventPermissionRequiredMixin, View):
permission = None
def get(self, request, *args, filetype, **kwargs):
url = eventreverse_absolute(request.event, 'presale:event.index')
url = build_absolute_uri(request.event, 'presale:event.index')
if "url" in request.GET:
if url_has_allowed_host_and_scheme(request.GET["url"], allowed_hosts=[urlparse(url).netloc]):
+4 -17
View File
@@ -139,7 +139,6 @@ from pretix.helpers import OF_SELF
from pretix.helpers.compat import CompatDeleteView
from pretix.helpers.format import SafeFormatter, format_map
from pretix.helpers.hierarkey import clean_filename
from pretix.helpers.iter import chunked_iterable
from pretix.helpers.json import CustomJSONEncoder
from pretix.helpers.safedownload import check_token
from pretix.presale.signals import question_form_fields
@@ -241,7 +240,7 @@ class BaseOrderBulkActionView(OrderSearchMixin, EventPermissionRequiredMixin, As
raise NotImplementedError()
def execute_bulk(self, queryset: QuerySet, form: forms.Form):
qs = self.allowed_for(self.get_queryset())
qs = self.allowed_for(self.allowed_for(self.get_queryset()))
total = qs.count()
orders_with_successful_action = 0
for i, o in enumerate(qs):
@@ -395,21 +394,9 @@ class OrderDeleteBulkActionView(BaseOrderBulkActionView):
testmode=True,
)
def execute_bulk(self, queryset: QuerySet, form: forms.Form):
qs = self.allowed_for(self.get_queryset())
total = qs.count()
all_ids = list(qs.values_list("id", flat=True))
orders_with_successful_action = 0
for chunk in chunked_iterable(all_ids, 1000):
Order.gracefully_delete_bulk(
self.request.event,
qs.filter(id__in=chunk),
user=self.request.user,
)
orders_with_successful_action += len(chunk)
self.async_set_progress(orders_with_successful_action / total * 100)
return orders_with_successful_action, total
def execute_single(self, instance, form: forms.Form):
instance.gracefully_delete(user=self.request.user)
return True
class OrderList(OrderSearchMixin, EventPermissionRequiredMixin, PaginationMixin, ListView):
+8 -10
View File
@@ -139,8 +139,8 @@ from pretix.helpers import OF_SELF, GroupConcat
from pretix.helpers.compat import CompatDeleteView
from pretix.helpers.dicts import merge_dicts
from pretix.helpers.format import SafeFormatter, format_map
from pretix.helpers.urls import mainreverse_absolute
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.helpers.urls import build_absolute_uri as build_global_uri
from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.forms.customer import TokenGenerator
logger = logging.getLogger(__name__)
@@ -1039,7 +1039,7 @@ class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
'user': self,
'organizer': self.request.organizer.name,
'team': instance.team.name,
'url': mainreverse_absolute('control:auth.invite', kwargs={
'url': build_global_uri('control:auth.invite', kwargs={
'token': instance.token
})
},
@@ -2851,12 +2851,10 @@ class SSOProviderUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequire
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['redirect_uri'] = eventreverse_absolute(
self.request.organizer, 'presale:organizer.customer.login.return',
kwargs={
'provider': self.object.pk
}
)
ctx['redirect_uri'] = build_absolute_uri(self.request.organizer, 'presale:organizer.customer.login.return',
kwargs={
'provider': self.object.pk
})
return ctx
def get_form_kwargs(self):
@@ -3087,7 +3085,7 @@ class CustomerDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
self.customer.log_action('pretix.customer.password.resetrequested', {}, user=self.request.user)
ctx = self.customer.get_email_context()
token = TokenGenerator().make_token(self.customer)
ctx['url'] = eventreverse_absolute(
ctx['url'] = build_absolute_uri(
self.request.organizer,
'presale:organizer.customer.recoverpw'
) + '?id=' + self.customer.identifier + '&token=' + token
+2 -2
View File
@@ -77,7 +77,7 @@ from pretix.control.views import PaginationMixin
from pretix.helpers.compat import CompatDeleteView
from pretix.helpers.format import SafeFormatter, format_map
from pretix.helpers.models import modelcopy
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView):
@@ -338,7 +338,7 @@ class VoucherUpdate(EventPermissionRequiredMixin, UpdateView):
}
if self.object.subevent_id:
url_params['subevent'] = self.object.subevent_id
ctx['url'] = eventreverse_absolute(self.request.event, "presale:event.redeem") + "?" + urlencode(url_params)
ctx['url'] = build_absolute_uri(self.request.event, "presale:event.redeem") + "?" + urlencode(url_params)
return ctx
+2 -2
View File
@@ -35,7 +35,7 @@ from geoip2.errors import AddressNotFoundError
from pretix.base.i18n import language
from pretix.base.services.mail import mail
from pretix.helpers.http import get_client_ip
from pretix.helpers.urls import mainreverse_absolute
from pretix.helpers.urls import build_absolute_uri
logger = logging.getLogger(__name__)
@@ -175,7 +175,7 @@ def handle_login_source(user, request):
'source': src,
'country': Country(str(country)).name if country else _('Unknown country'),
'instance': settings.PRETIX_INSTANCE_NAME,
'url': mainreverse_absolute('control:user.settings')
'url': build_absolute_uri('control:user.settings')
},
event=None,
user=user,
-10
View File
@@ -19,7 +19,6 @@
# 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 warnings
from urllib.parse import urljoin
from django.conf import settings
@@ -27,15 +26,6 @@ from django.urls import reverse
def build_absolute_uri(urlname, args=None, kwargs=None):
warnings.warn(
'Usage of build_absolute_uri is confusing since there are many functions with that name. '
'Replace this usage with ',
DeprecationWarning
)
return mainreverse_absolute(urlname, args, kwargs)
def mainreverse_absolute(urlname, args=None, kwargs=None):
from pretix.multidomain import maindomain_urlconf
return urljoin(settings.SITE_URL, reverse(urlname, args=args, kwargs=kwargs, urlconf=maindomain_urlconf))
+270 -158
View File
@@ -4,16 +4,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-27 15:47+0000\n"
"PO-Revision-Date: 2026-06-20 17:00+0000\n"
"PO-Revision-Date: 2026-05-22 07:03+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/"
"da/>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
">\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2026.6.1\n"
"X-Generator: Weblate 2026.5\n"
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:670
#: pretix/control/templates/pretixcontrol/events/index.html:166
@@ -612,17 +612,16 @@ msgstr ""
"underordnede objekter som f.eks. varianter eller pakker."
#: pretix/api/webhooks.py:413
#, fuzzy
#| msgid "Quota handling"
msgid "Quota changed"
msgstr "Kvoten er ændret"
msgstr "Håndtering af kvoter"
#: pretix/api/webhooks.py:414
msgid ""
"This includes related events like creation, deletion, opening or closing of "
"quotas. No webhook is sent for changes to the resulting availability."
msgstr ""
"Dette omfatter relaterede hændelser såsom oprettelse, sletning, åbning eller "
"lukning af kvoter. Der sendes ingen webhook ved ændringer i den deraf "
"følgende tilgængelighed."
#: pretix/api/webhooks.py:419
msgid "Shop taken live"
@@ -3395,12 +3394,12 @@ msgstr "Indtast venligst et kortere navn."
msgid ""
"The field \"%(label)s\" may not contain special characters such as "
"\"%(chars)s\"."
msgstr "Feltet \"%(label)s\" må ikke indeholde specialtegn såsom \"%(chars)s\"."
msgstr ""
#: pretix/base/forms/questions.py:305
#, python-format
msgid "The field \"%(label)s\" may not contain an URL (%(url)s)."
msgstr "Feltet \"%(label)s\" må ikke indeholde en URL (%(url)s)."
msgstr ""
#: pretix/base/forms/questions.py:338
msgctxt "phonenumber"
@@ -8291,14 +8290,19 @@ msgid "Program times"
msgstr "Programtider"
#: pretix/base/pdf.py:503
#, fuzzy
#| msgid ""
#| "2017-05-31 10:00 12:00\n"
#| "2017-05-31 14:00 16:00\n"
#| "2017-05-31 14:00 2017-06-01 14:00"
msgid ""
"2017-05-31 10:00 12:00, Room 1\n"
"2017-05-31 14:00 16:00, Room 2\n"
"2017-05-31 14:00 2017-06-01 14:00, Building A"
msgstr ""
"31. maj 2017 kl. 10.00 12.00, lokale 1\n"
"31. maj 2017 kl. 14.00 16.00, lokale 2\n"
"31. maj 2017 kl. 14.00 1. juni 2017 kl. 14.00, bygning A"
"31. maj 2017 kl. 10.00 12.00\n"
"31. maj 2017 kl. 14.00 16.00\n"
"31. maj 2017 kl. 14.00 1. juni 2017 kl. 14.00"
#: pretix/base/pdf.py:507
msgid "Reusable Medium ID"
@@ -8823,7 +8827,13 @@ msgid "This voucher code is not known in our database."
msgstr "Denne voucherkode genkendes ikke."
#: pretix/base/services/cart.py:165
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "The voucher code \"%(voucher)s\" can only be used if you select at least "
#| "%(number)s matching products."
#| msgid_plural ""
#| "The voucher code \"%(voucher)s\" can only be used if you select at least "
#| "%(number)s matching products."
msgid ""
"The voucher code \"%(voucher)s\" can only be used if you select at least "
"%(number)s matching product."
@@ -8831,14 +8841,22 @@ msgid_plural ""
"The voucher code \"%(voucher)s\" can only be used if you select at least "
"%(number)s matching products."
msgstr[0] ""
"Voucherkoden \"%(voucher)s\" kan kun blive brugt, hvis du vælger mindst %"
"(number)s passende produkter."
"Voucherkoden \"%(voucher)s\" kan kun blive brugt, hvis du vælger mindst "
"%(number)s passende produkter."
msgstr[1] ""
"Voucherkoderne \"%(voucher)s\" kan kun blive brugt, hvis du vælger mindst %"
"(number)s passende produkter."
"Voucherkoden \"%(voucher)s\" kan kun blive brugt, hvis du vælger mindst "
"%(number)s passende produkter."
#: pretix/base/services/cart.py:170
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "The voucher code \"%(voucher)s\" can only be used if you select at least "
#| "%(number)s matching products. We have therefore removed some positions "
#| "from your cart that can no longer be purchased like this."
#| msgid_plural ""
#| "The voucher code \"%(voucher)s\" can only be used if you select at least "
#| "%(number)s matching products. We have therefore removed some positions "
#| "from your cart that can no longer be purchased like this."
msgid ""
"The voucher code \"%(voucher)s\" can only be used if you select at least "
"%(number)s matching product. We have therefore removed some positions from "
@@ -8848,12 +8866,12 @@ msgid_plural ""
"%(number)s matching products. We have therefore removed some positions from "
"your cart that can no longer be purchased like this."
msgstr[0] ""
"Voucherkoden \"%(voucher)s\" kan kun blive brugt, hvis du vælger mindst %"
"(number)s passende produkter. Vi har derfor fjernet nogle poster fra din "
"Voucherkoden \"%(voucher)s\" kan kun blive brugt, hvis du vælger mindst "
"%(number)s passende produkter. Vi har derfor fjernet nogle poster fra din "
"indkøbskurv, som ikke længere kan blive købt på denne måde."
msgstr[1] ""
"Voucherkoderne \"%(voucher)s\" kan kun blive brugt, hvis du vælger mindst %"
"(number)s passende produkter. Vi har derfor fjernet nogle poster fra din "
"Voucherkoden \"%(voucher)s\" kan kun blive brugt, hvis du vælger mindst "
"%(number)s passende produkter. Vi har derfor fjernet nogle poster fra din "
"indkøbskurv, som ikke længere kan blive købt på denne måde."
#: pretix/base/services/cart.py:176
@@ -14087,8 +14105,6 @@ msgid ""
"You entered an URL, which is not allowed. Please remove %(match)s from your "
"input."
msgstr ""
"Du har indtastet en URL, som ikke er tilladt. Fjern venligst %(match)s fra "
"din indtastning."
#: pretix/base/views/errors.py:48
msgid ""
@@ -16011,8 +16027,14 @@ msgid "inactive"
msgstr "inaktiv"
#: pretix/control/forms/item.py:1414
#, fuzzy
#| msgid ""
#| "Sample Conference Center\n"
#| "Heidelberg, Germany"
msgid "Sample Conference Center, Heidelberg, Germany"
msgstr "Eksempelkonferencecenter, Århus, Danmark"
msgstr ""
"Eksempelkonferencecenter\n"
"Andeby, Danmark"
#: pretix/control/forms/mailsetup.py:42
msgid "Hostname"
@@ -17797,11 +17819,12 @@ msgstr ""
"afvist."
#: pretix/control/logdisplay.py:571
#, fuzzy
msgid ""
"An email has been sent to notify the user that the order has been approved."
msgstr ""
"Der er sendt en e-mail for at informere brugeren om, at ordren er blevet "
"godkendt."
"En e-mail er blevet sendt for at fortælle brugeren at bestillingen er "
"modtaget."
#: pretix/control/logdisplay.py:574
msgid ""
@@ -17812,12 +17835,13 @@ msgstr ""
"modtaget og kræver betaling."
#: pretix/control/logdisplay.py:575
#, fuzzy
msgid ""
"An email has been sent to notify the user that the order has been received "
"and requires approval."
msgstr ""
"Der er sendt en e-mail for at informere brugeren om, at ordren er modtaget "
"og skal godkendes."
"En e-mail er blevet sendt for at fortælle brugeren at bestillingen er "
"modtaget og kræver betaling."
#: pretix/control/logdisplay.py:578
msgid ""
@@ -17827,22 +17851,21 @@ msgstr ""
"bestillingsdetaljer."
#: pretix/control/logdisplay.py:579
#, fuzzy
msgid "An email has been sent to notify the user that the payment failed."
msgstr ""
"Der er sendt en e-mail for at informere brugeren om, at betalingen "
"mislykkedes."
"En e-mail er blevet sendt for at fortælle brugeren at betaling er modtaget."
#: pretix/control/logdisplay.py:586
msgid "The voucher has been created."
msgstr "Voucheren er blevet oprettet."
#: pretix/control/logdisplay.py:589
#, fuzzy
msgid ""
"The voucher has been set to expire because the recipient removed themselves "
"from the waiting list."
msgstr ""
"Kuponen er sat til at udløbe, fordi modtageren har fjernet sig selv fra "
"ventelisten."
msgstr "En rabatkode er blevet sendt til en person på ventelisten."
#: pretix/control/logdisplay.py:590
msgid "The voucher has been changed."
@@ -17853,13 +17876,16 @@ msgid "The voucher has been deleted."
msgstr "Voucheren er blevet slettet."
#: pretix/control/logdisplay.py:592
#, fuzzy
#| msgid "The selected voucher has been deleted."
msgid "Cart positions including the voucher have been deleted."
msgstr "Indkøbskurvens varer, herunder gavekortet, er blevet slettet."
msgstr "Den valgte rabatkode er blevet slettet."
#: pretix/control/logdisplay.py:593
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "A voucher has been sent to a person on the waiting list."
msgid "The voucher has been assigned to {email} through the waiting list."
msgstr "Kuponen er blevet tildelt {email} via ventelisten."
msgstr "En rabatkode er blevet sendt til en person på ventelisten."
#: pretix/control/logdisplay.py:602
#, python-brace-format
@@ -17879,8 +17905,9 @@ msgid "The category has been changed."
msgstr "Kategorien er blevet ændret."
#: pretix/control/logdisplay.py:620
#, fuzzy
msgid "The category has been reordered."
msgstr "Kategorien er blevet omorganiseret."
msgstr "Kategorien er blevet slettet."
#: pretix/control/logdisplay.py:627
msgid "The tax rule has been added."
@@ -17910,14 +17937,14 @@ msgid "{user} has been invited to the team."
msgstr "{user} er blevet inviteret med i gruppen."
#: pretix/control/logdisplay.py:644
#, python-brace-format
#, fuzzy, python-brace-format
msgid "Invite for {user} has been deleted."
msgstr "Invitationen til {user} er blevet slettet."
msgstr "Invitationen til {user} er blevet trukket tilbage."
#: pretix/control/logdisplay.py:645
#, python-brace-format
#, fuzzy, python-brace-format
msgid "Invite for {user} has been resent."
msgstr "Invitationen til {user} er blevet sendt igen."
msgstr "Invitationen til {user} er blevet trukket tilbage."
#: pretix/control/logdisplay.py:656
#, python-brace-format
@@ -17935,245 +17962,294 @@ msgstr "Din e-mailadresse er blevet ændret til {email}."
#: pretix/control/logdisplay.py:673
msgid "Your account has been enabled."
msgstr "Din konto er nu aktiveret."
msgstr ""
#: pretix/control/logdisplay.py:675
msgid "Your account has been disabled."
msgstr "Din konto er blevet deaktiveret."
msgstr ""
#: pretix/control/logdisplay.py:680 pretix/presale/views/customer.py:642
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "The email address has been changed from \"{old_email}\" to \"{new_email}"
#| "\"."
msgid "Your email address has been changed from {old_email} to {email}."
msgstr "Din e-mailadresse er blevet ændret fra {old_email} til {email}."
msgstr ""
"E-mailadressen er blevet ændret fra \"{old_email}\" til \"{new_email}\"."
#: pretix/control/logdisplay.py:681
#, python-brace-format
#, fuzzy, python-brace-format
msgid "Your email address {email} has been confirmed."
msgstr "Din e-mailadresse {email} er blevet bekræftet."
msgstr "Din kurv er blevet opdateret."
#: pretix/control/logdisplay.py:693
#, python-brace-format
msgid "You impersonated {}."
msgstr "Du udgav dig for at være {}."
msgstr ""
#: pretix/control/logdisplay.py:694
#, python-brace-format
msgid "You stopped impersonating {}."
msgstr "Du er holdt op med at udgive dig for at være {}."
msgstr ""
#: pretix/control/logdisplay.py:701
msgid "This object has been created by cloning."
msgstr "Dette objekt er blevet oprettet ved kloning"
#: pretix/control/logdisplay.py:702
#, fuzzy
msgid "The organizer has been changed."
msgstr "Arrangøren er blevet ændret."
msgstr "Bestillingen er blevet ændret."
#: pretix/control/logdisplay.py:703
#, fuzzy
msgid "The organizer settings have been changed."
msgstr "Indstillingerne for arrangøren er blevet ændret."
msgstr "Gruppeindstillingerne er blevet ændret."
#: pretix/control/logdisplay.py:704 pretix/control/logdisplay.py:849
#, fuzzy
msgid "The footer links have been changed."
msgstr "Linkene i sidefoden er blevet ændret."
msgstr "Bestillingsdetaljerne er blevet ændret."
#: pretix/control/logdisplay.py:705 pretix/control/logdisplay.py:754
#, fuzzy
msgid "A scheduled export has been added."
msgstr "Der er tilføjet en planlagt eksport."
msgstr "Kvoten er blevet tilføjet."
#: pretix/control/logdisplay.py:706 pretix/control/logdisplay.py:755
#, fuzzy
msgid "A scheduled export has been changed."
msgstr "En planlagt eksport er blevet ændret."
msgstr "Produktet er blevet ændret."
#: pretix/control/logdisplay.py:707 pretix/control/logdisplay.py:756
#, fuzzy
msgid "A scheduled export has been deleted."
msgstr "En planlagt eksport er blevet slettet."
msgstr "Det valgte produkt er blevet slettet."
#: pretix/control/logdisplay.py:708 pretix/control/logdisplay.py:757
#, fuzzy
msgid "A scheduled export has been executed."
msgstr "En planlagt eksport er blevet udført."
msgstr "Det valgte produkt er blevet slettet."
#: pretix/control/logdisplay.py:709 pretix/control/logdisplay.py:758
#, python-brace-format
msgid "A scheduled export has failed: {reason}."
msgstr "En planlagt eksport er mislykket: {reason}."
msgstr ""
#: pretix/control/logdisplay.py:710
#, fuzzy
#| msgid "The email has been queued to be sent."
msgid "Failed emails have been scheduled to be retried."
msgstr ""
"Der er planlagt et nyt forsøg på at sende de e-mails, der ikke kunne leveres."
msgstr "Denne e-mail er sat i udsendelseskøen."
#: pretix/control/logdisplay.py:711
#, fuzzy
#| msgid "The order details have been changed."
msgid "Queued emails have been aborted."
msgstr "E-mails i køen er blevet afbrudt."
msgstr "Bestillingsdetaljerne er blevet ændret."
#: pretix/control/logdisplay.py:712
#, fuzzy
msgid "Gift card acceptance for another organizer has been added."
msgstr ""
"Der er nu tilføjet mulighed for at acceptere gavekort fra en anden arrangør."
msgstr "Den nye arrangør er blevet oprettet."
#: pretix/control/logdisplay.py:713
#, fuzzy
msgid "Gift card acceptance for another organizer has been removed."
msgstr ""
"Muligheden for at modtage gavekort fra en anden arrangør er blevet fjernet."
msgstr "Den nye arrangør er blevet oprettet."
#: pretix/control/logdisplay.py:714
#, fuzzy
msgid "A new gift card acceptor has been invited."
msgstr "Der er blevet inviteret en ny modtager af gavekort."
msgstr "Gruppen er blevet oprettet."
#: pretix/control/logdisplay.py:715
#, fuzzy
msgid "A gift card acceptor has been removed."
msgstr "En gavekort-modtager er blevet fjernet."
msgstr "Gruppen er blevet oprettet."
#: pretix/control/logdisplay.py:716
#, fuzzy
msgid "A gift card issuer has been removed or declined."
msgstr "En udsteder af gavekort er blevet fjernet eller afvist."
msgstr "Den valgte kategorien er blevet slettet."
#: pretix/control/logdisplay.py:717
#, fuzzy
msgid "A new gift card issuer has been accepted."
msgstr "En ny udsteder af gavekort er blevet godkendt."
msgstr "Den valgte kategorien er blevet slettet."
#: pretix/control/logdisplay.py:718
#, fuzzy
msgid "The webhook has been created."
msgstr "Webhooken er blevet oprettet."
msgstr "Gruppen er blevet oprettet."
#: pretix/control/logdisplay.py:719
#, fuzzy
msgid "The webhook has been changed."
msgstr "Webhooken er blevet ændret."
msgstr "Kategorien er blevet ændret."
#: pretix/control/logdisplay.py:720
msgid "The webhook call retry jobs have been manually expedited."
msgstr ""
"Opgaverne vedrørende gentagelse af webhook-kald er blevet fremskyndet "
"manuelt."
#: pretix/control/logdisplay.py:721
#, fuzzy
msgid "The webhook call retry jobs have been dropped."
msgstr "Opgaverne til gentagelse af webhook-kald er blevet annulleret."
msgstr "Gruppen er blevet oprettet."
#: pretix/control/logdisplay.py:722
#, fuzzy
msgid "The SSO provider has been created."
msgstr "SSO-udbyderen er blevet oprettet."
msgstr "Bestilling oprettet."
#: pretix/control/logdisplay.py:723
#, fuzzy
msgid "The SSO provider has been changed."
msgstr "SSO-udbyderen er blevet skiftet."
msgstr "Bestillingen er blevet ændret."
#: pretix/control/logdisplay.py:724
#, fuzzy
msgid "The SSO provider has been deleted."
msgstr "SSO-udbyderen er blevet slettet."
msgstr "Bestillingen er blevet tilbagebetalt."
#: pretix/control/logdisplay.py:725
#, fuzzy
msgid "The SSO client has been created."
msgstr "SSO-klienten er oprettet."
msgstr "Arrangementsdatoen er blevet oprettet."
#: pretix/control/logdisplay.py:726
#, fuzzy
msgid "The SSO client has been changed."
msgstr "SSO-klienten er blevet ændret."
msgstr "Kategorien er blevet ændret."
#: pretix/control/logdisplay.py:727
#, fuzzy
msgid "The SSO client has been deleted."
msgstr "SSO-klienten er blevet slettet."
msgstr "Produktet er blevet slettet."
#: pretix/control/logdisplay.py:728 pretix/control/views/organizer.py:2715
#, fuzzy
msgid "The membership type has been created."
msgstr "Medlemskabstypen er oprettet."
msgstr "Arrangementsdatoen er blevet oprettet."
#: pretix/control/logdisplay.py:729
#, fuzzy
msgid "The membership type has been changed."
msgstr "Medlemskabstypen er blevet ændret."
msgstr "Arrangementsdatoen er blevet ændret."
#: pretix/control/logdisplay.py:730
#, fuzzy
msgid "The membership type has been deleted."
msgstr "Medlemskabstypen er blevet slettet."
msgstr "Arrangementsdatoen er blevet slettet."
#: pretix/control/logdisplay.py:731 pretix/control/views/organizer.py:3556
#, fuzzy
#| msgctxt "subevent"
#| msgid "The new date has been created."
msgid "The sales channel has been created."
msgstr "Salgskanalen er oprettet."
msgstr "Den nye dato er blevet oprettet."
#: pretix/control/logdisplay.py:732
#, fuzzy
msgid "The sales channel has been changed."
msgstr "Salgskanalen er blevet ændret."
msgstr "Voucheren er blevet ændret."
#: pretix/control/logdisplay.py:733
#, fuzzy
#| msgid "The selected list has been deleted."
msgid "The sales channel has been deleted."
msgstr "Salgskanalen er blevet slettet."
msgstr "Den valgte lister er blevet slettet."
#: pretix/control/logdisplay.py:734
#, fuzzy
msgid "The account has been created."
msgstr "Kontoen er oprettet."
msgstr "Gruppen er blevet oprettet."
#: pretix/control/logdisplay.py:735
#, fuzzy
msgid "The account has been changed."
msgstr "Kontoen er blevet ændret."
msgstr "Kategorien er blevet ændret."
#: pretix/control/logdisplay.py:736
#, fuzzy
msgid "A membership for this account has been added."
msgstr "Der er tilføjet et medlemskab til denne konto."
msgstr "Den valgte konfiguration er blevet slettet."
#: pretix/control/logdisplay.py:737
#, fuzzy
msgid "A membership of this account has been changed."
msgstr "Et medlemskab på denne konto er blevet ændret."
msgstr "En svarmulighed er blevet ændret."
#: pretix/control/logdisplay.py:738
#, fuzzy
msgid "A membership of this account has been deleted."
msgstr "Et medlemskab tilknyttet denne konto er blevet slettet."
msgstr "Den valgte konfiguration er blevet slettet."
#: pretix/control/logdisplay.py:739
#, fuzzy
msgid "The account has been disabled and anonymized."
msgstr "Kontoen er blevet deaktiveret og anonymiseret."
msgstr "Bestillingen er blevet tilbagebetalt."
#: pretix/control/logdisplay.py:740
#, fuzzy
msgid "A new password has been requested."
msgstr "Der er anmodet om en ny adgangskode."
msgstr "Adgangskoden er blevet nulstillet."
#: pretix/control/logdisplay.py:741
#, fuzzy
msgid "A new password has been set."
msgstr "Der er blevet oprettet en ny adgangskode."
msgstr "Adgangskoden er blevet nulstillet."
#: pretix/control/logdisplay.py:743
#, fuzzy
msgid "The reusable medium has been created."
msgstr "Det genanvendelige medie er blevet oprettet."
msgstr "Gruppen er blevet oprettet."
#: pretix/control/logdisplay.py:744
#, fuzzy
msgid "The reusable medium has been created automatically."
msgstr "Det genanvendelige medie er blevet oprettet automatisk."
msgstr "Arrangementsdatoen er blevet oprettet."
#: pretix/control/logdisplay.py:745
#, fuzzy
msgid "The reusable medium has been changed."
msgstr "Det genanvendelige medie er blevet udskiftet."
msgstr "Momsreglen er blevet ændret."
#: pretix/control/logdisplay.py:746
#, fuzzy
msgid "The medium has been connected to a new ticket."
msgstr "Mediet er blevet knyttet til en ny sag."
msgstr "Denne e-mail er sat i udsendelseskøen."
#: pretix/control/logdisplay.py:747
#, fuzzy
msgid "The medium has been connected to a new gift card."
msgstr "Mediet er blevet knyttet til et nyt gavekort."
msgstr "Denne e-mail er sat i udsendelseskøen."
#: pretix/control/logdisplay.py:749
msgid "The event's internal comment has been updated."
msgstr "Intern kommentar opdateret."
#: pretix/control/logdisplay.py:750
#, fuzzy
msgid "The event has been canceled."
msgstr "Arrangementet er blevet aflyst."
msgstr "Bestillingen er blevet annulleret."
#: pretix/control/logdisplay.py:751
#, fuzzy
msgid "An event has been deleted."
msgstr "En begivenhed er blevet slettet."
msgstr "Arrangementsdatoen er blevet slettet."
#: pretix/control/logdisplay.py:752
msgid "A removal process for personal data has been started."
msgstr "Der er iværksat en sletningsproces for personoplysninger."
msgstr ""
#: pretix/control/logdisplay.py:753
msgid "A removal process for personal data has been completed."
msgstr "En sletning af personoplysninger er blevet gennemført."
msgstr ""
#: pretix/control/logdisplay.py:759
msgid "The user has been created."
msgstr "Brugeren er blevet oprettet."
msgstr ""
#: pretix/control/logdisplay.py:760
#, python-brace-format
@@ -18181,8 +18257,6 @@ msgid ""
"A first login using {agent_type} on {os_type} from {country} has been "
"detected."
msgstr ""
"Der er registreret en første login med {agent_type} på {os_type} fra "
"{country}."
#: pretix/control/logdisplay.py:762 pretix/control/views/user.py:474
#: pretix/control/views/user.py:534 pretix/control/views/user.py:593
@@ -18199,8 +18273,9 @@ msgid "Your two-factor emergency codes have been regenerated."
msgstr "Dine sikkerhedskoder til tofaktorgodkendelse er blevet genoprettet."
#: pretix/control/logdisplay.py:765
#, fuzzy
msgid "A two-factor emergency code has been generated."
msgstr "Der er genereret en tofaktorkode til nødsituationer."
msgstr "Dine sikkerhedskoder til tofaktorgodkendelse er blevet genoprettet."
#: pretix/control/logdisplay.py:766
#, python-brace-format
@@ -18220,19 +18295,20 @@ msgstr ""
#: pretix/control/logdisplay.py:770
msgid "Notifications have been enabled."
msgstr "Notifikationer er blevet aktiveret."
msgstr ""
#: pretix/control/logdisplay.py:771
msgid "Notifications have been disabled."
msgstr "Notifikationer er blevet deaktiveret."
msgstr ""
#: pretix/control/logdisplay.py:772
msgid "Your notification settings have been changed."
msgstr "Dine notifikationsindstillinger er blevet ændret."
msgstr ""
#: pretix/control/logdisplay.py:773
#, fuzzy
msgid "This user has been anonymized."
msgstr "Denne bruger er blevet anonymiseret."
msgstr "Bestillingen er blevet tilbagebetalt."
#: pretix/control/logdisplay.py:777
msgid "Password reset mail sent."
@@ -18247,21 +18323,20 @@ msgid ""
"A repeated password reset has been denied, as the last request was less than "
"24 hours ago."
msgstr ""
"En gentagen anmodning om nulstilling af adgangskode er blevet afvist, da den "
"seneste anmodning blev fremsat for mindre end 24 timer siden."
#: pretix/control/logdisplay.py:781
#, python-brace-format
#, fuzzy, python-brace-format
msgid "The organizer \"{name}\" has been deleted."
msgstr "Arrangøren \"{name}\" er blevet slettet."
msgstr "Varianten \"{value}\" er blevet slettet."
#: pretix/control/logdisplay.py:782 pretix/control/logdisplay.py:1013
msgid "A voucher has been sent to a person on the waiting list."
msgstr "En rabatkode er blevet sendt til en person på ventelisten."
#: pretix/control/logdisplay.py:783
#, fuzzy
msgid "An entry has been transferred to another waiting list."
msgstr "En ansøgning er blevet flyttet til en anden venteliste."
msgstr "En bruger er føjet til gruppen."
#: pretix/control/logdisplay.py:784
msgid "The team has been created."
@@ -18276,16 +18351,19 @@ msgid "The team has been deleted."
msgstr "Gruppen er blevet slettet."
#: pretix/control/logdisplay.py:787 pretix/control/views/organizer.py:2381
#, fuzzy
msgid "The gate has been created."
msgstr "Porten er blevet oprettet."
msgstr "Gruppen er blevet oprettet."
#: pretix/control/logdisplay.py:788
#, fuzzy
msgid "The gate has been changed."
msgstr "Porten er blevet ændret."
msgstr "Kategorien er blevet ændret."
#: pretix/control/logdisplay.py:789
#, fuzzy
msgid "The gate has been deleted."
msgstr "Porten er blevet slettet."
msgstr "Gruppen er blevet slettet."
#: pretix/control/logdisplay.py:790
msgctxt "subevent"
@@ -18293,9 +18371,10 @@ msgid "The event date has been deleted."
msgstr "Arrangementsdatoen er blevet slettet."
#: pretix/control/logdisplay.py:791
#, fuzzy
msgctxt "subevent"
msgid "The event date has been canceled."
msgstr "Begivenhedsdatoen er blevet aflyst."
msgstr "Arrangementsdatoen er blevet ændret."
#: pretix/control/logdisplay.py:792
msgctxt "subevent"
@@ -18323,50 +18402,58 @@ msgid "A quota has been removed from the event date."
msgstr "En kvote er blevet fjernet fra arrangementsdatoen."
#: pretix/control/logdisplay.py:797
#, fuzzy
msgid "The device has been created."
msgstr "Enheden er blevet oprettet."
msgstr "Arrangementsdatoen er blevet oprettet."
#: pretix/control/logdisplay.py:798
#, fuzzy
msgid "The device has been changed."
msgstr "Enheden er blevet udskiftet."
msgstr "Voucheren er blevet ændret."
#: pretix/control/logdisplay.py:799
#, fuzzy
msgid "Access of the device has been revoked."
msgstr "Adgangen til enheden er blevet tilbagekaldt."
msgstr "Enheden er blevet fjernet."
#: pretix/control/logdisplay.py:800
#, fuzzy
msgid "The device has been initialized."
msgstr "Enheden er blevet initialiseret."
msgstr "Enheden er blevet fjernet."
#: pretix/control/logdisplay.py:801
#, fuzzy
msgid "The access token of the device has been regenerated."
msgstr "Enhedens adgangstoken er blevet genereret på ny."
msgstr "Fakturaen er blevet genereret igen."
#: pretix/control/logdisplay.py:802
msgid "The device has notified the server of an hardware or software update."
msgstr ""
"Enheden har meddelt serveren, at der er en hardware- eller "
"softwareopdatering."
#: pretix/control/logdisplay.py:803
#, fuzzy
msgid "The gift card has been created."
msgstr "Gavekortet er oprettet."
msgstr "Gruppen er blevet oprettet."
#: pretix/control/logdisplay.py:804 pretix/control/views/organizer.py:1943
#, fuzzy
msgid "The gift card has been changed."
msgstr "Gavekortet er blevet ændret."
msgstr "Gruppen er blevet oprettet."
#: pretix/control/logdisplay.py:805
#, fuzzy
msgid "A manual transaction has been performed."
msgstr "Der er udført en manuel overførsel."
msgstr "Spørgsmålet er blevet tilføjet."
#: pretix/control/logdisplay.py:806
#, fuzzy
msgid "A payment has been performed."
msgstr "Der er blevet foretaget en betaling."
msgstr "Betalingsbetingelser er blevet ændret."
#: pretix/control/logdisplay.py:807
#, fuzzy
msgid "A refund has been performed. "
msgstr "Der er blevet foretaget en tilbagebetaling. "
msgstr "Bestilling oprettet."
#: pretix/control/logdisplay.py:808
#, python-brace-format
@@ -18379,34 +18466,44 @@ msgid "The token \"{name}\" has been revoked."
msgstr "Token \"{name}\" slettet."
#: pretix/control/logdisplay.py:810
#, fuzzy
#| msgid "The check-in list has been deleted."
msgid "The check-in and print log state has been reset."
msgstr "Status for indtjeknings- og udskriftsloggen er blevet nulstillet."
msgstr "Tjek-ind-listen er blevet slettet."
#: pretix/control/logdisplay.py:817 pretix/control/logdisplay.py:876
#, fuzzy
#| msgid "A plugin has been enabled."
msgid "The plugin has been enabled."
msgstr "Plugin'et er blevet aktiveret."
msgstr "En plugin er blevet aktiveret."
#: pretix/control/logdisplay.py:818 pretix/control/logdisplay.py:877
#: pretix/control/views/event.py:497 pretix/control/views/organizer.py:757
#, fuzzy
#| msgid "A plugin has been disabled."
msgid "The plugin has been disabled."
msgstr "Plugin'et er blevet deaktiveret."
msgstr "En plugin er blevet deaktiveret."
#: pretix/control/logdisplay.py:821 pretix/control/logdisplay.py:880
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Question {val}"
msgid "Plugin {val}"
msgstr "Plugin {val}"
msgstr "Spørgsmål {val}"
#: pretix/control/logdisplay.py:836
#, fuzzy
msgid "A meta property has been added to this event."
msgstr "Der er tilføjet en metaegenskab til denne begivenhed."
msgstr "En bruger er føjet til gruppen."
#: pretix/control/logdisplay.py:837
#, fuzzy
msgid "A meta property has been removed from this event."
msgstr "En metaegenskab er blevet fjernet fra denne begivenhed."
msgstr "En bruger er blevet fjernet fra gruppen."
#: pretix/control/logdisplay.py:838
#, fuzzy
msgid "A meta property has been changed on this event."
msgstr "En metaegenskab er blevet ændret i forbindelse med denne begivenhed."
msgstr "En kvote er blevet ændret på arrangementsdatoen."
#: pretix/control/logdisplay.py:839
msgid "The event settings have been changed."
@@ -18418,27 +18515,31 @@ msgstr "Indstillingerne for download af billet er blevet ændret."
#: pretix/control/logdisplay.py:843
msgid "The shop has been taken live."
msgstr "Butikken er nu gået live."
msgstr ""
#: pretix/control/logdisplay.py:844
msgid "The shop has been taken offline."
msgstr "Butikken er blevet taget offline."
msgstr ""
#: pretix/control/logdisplay.py:845
#, fuzzy
msgid "The shop has been taken into test mode."
msgstr "Butikken er nu sat i testtilstand."
msgstr "Bestillingen er blevet tilbagebetalt."
#: pretix/control/logdisplay.py:846
#, fuzzy
msgid "The test mode has been disabled."
msgstr "Testtilstanden er blevet deaktiveret."
msgstr "Den valgte dato er blevet slettet."
#: pretix/control/logdisplay.py:847
#, fuzzy
msgid "The event has been created."
msgstr "Begivenheden er blevet oprettet."
msgstr "Arrangementsdatoen er blevet oprettet."
#: pretix/control/logdisplay.py:848
#, fuzzy
msgid "The event details have been changed."
msgstr "Begivenhedens oplysninger er blevet ændret."
msgstr "Indstillingerne for arrangementet er blevet ændret."
#: pretix/control/logdisplay.py:850
msgid "An answer option has been added to the question."
@@ -18481,9 +18582,10 @@ msgid "The check-in list has been changed."
msgstr "Tjek-ind-listen er blevet ændret."
#: pretix/control/logdisplay.py:869
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Check-in list"
msgid "Check-in list {val}"
msgstr "Tjek-ind-liste {val}"
msgstr "Tjek-ind-liste"
#: pretix/control/logdisplay.py:896
msgid "The product has been created."
@@ -18494,8 +18596,9 @@ msgid "The product has been changed."
msgstr "Produktet er blevet ændret."
#: pretix/control/logdisplay.py:898
#, fuzzy
msgid "The product has been reordered."
msgstr "Produktet er blevet genbestilt."
msgstr "Produktet er blevet oprettet."
#: pretix/control/logdisplay.py:899
msgid "The product has been deleted."
@@ -18514,28 +18617,37 @@ msgid "An add-on has been changed on this product."
msgstr "En tilføjelse er blevet ændret på dette produkt."
#: pretix/control/logdisplay.py:903
#, fuzzy
msgid "A bundled item has been added to this product."
msgstr "Der er blevet tilføjet en medfølgende vare til dette produkt."
msgstr "En tilføjelse er blevet føjet til dette produkt."
#: pretix/control/logdisplay.py:904
#, fuzzy
msgid "A bundled item has been removed from this product."
msgstr "En medfølgende vare er blevet fjernet fra dette produkt."
msgstr "En tilføjelse er blevet fjernet fra dette produkt."
#: pretix/control/logdisplay.py:905
#, fuzzy
msgid "A bundled item has been changed on this product."
msgstr "En medfølgende vare er blevet ændret for dette produkt."
msgstr "En tilføjelse er blevet ændret dette produkt."
#: pretix/control/logdisplay.py:906
#, fuzzy
#| msgid "An add-on has been added to this product."
msgid "A program time has been added to this product."
msgstr "Der er blevet tilføjet en programtid til dette produkt."
msgstr "En tilføjelse er blevet føjet til dette produkt."
#: pretix/control/logdisplay.py:907
#, fuzzy
#| msgid "An add-on has been changed on this product."
msgid "A program time has been changed on this product."
msgstr "En programtid for dette produkt er blevet ændret."
msgstr "En tilføjelse er blevet ændret på dette produkt."
#: pretix/control/logdisplay.py:908
#, fuzzy
#| msgid "An add-on has been removed from this product."
msgid "A program time has been removed from this product."
msgstr "En programtid er blevet fjernet fra dette produkt."
msgstr "En tilføjelse er blevet fjernet fra dette produkt."
#: pretix/control/logdisplay.py:915
#, python-brace-format
@@ -18553,9 +18665,9 @@ msgid "The variation \"{value}\" has been changed."
msgstr "Varianten \"{value}\" er blevet ændret."
#: pretix/control/logdisplay.py:934
#, python-brace-format
#, fuzzy, python-brace-format
msgid "Payment {local_id} has been confirmed."
msgstr "Betalingen {local_id} er blevet bekræftet."
msgstr "Betalingsmetoden er blevet ændret."
#: pretix/control/logdisplay.py:935
#, fuzzy, python-brace-format
+41 -29
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-27 14:47+0000\n"
"PO-Revision-Date: 2026-06-18 21:00+0000\n"
"Last-Translator: Szurofka Márton <szurofka.marton@sze.hu>\n"
"PO-Revision-Date: 2026-01-23 15:00+0000\n"
"Last-Translator: Vajda Tamás <vajda.tamas@szwg.hu>\n"
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix-"
"js/hu/>\n"
"Language: hu\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2026.6.1\n"
"X-Generator: Weblate 5.15.2\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -31,16 +31,16 @@ msgstr "Megjegyzés:"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
msgid "PayPal"
msgstr "PayPal"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
msgid "Venmo"
msgstr "Venmo"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:36
#: pretix/static/pretixpresale/js/walletdetection.js:38
msgid "Apple Pay"
msgstr "Apple Pay"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:37
msgid "Itaú"
@@ -56,7 +56,7 @@ msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
msgid "PayPal Pay Later"
msgstr "PayPal Későbbi Fizetés"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
msgid "iDEAL | Wero"
@@ -148,7 +148,7 @@ msgstr "A fizetés megerősítése…"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:254
msgid "Payment method unavailable"
msgstr "Fizetésimód nem elérhető"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:63
@@ -163,12 +163,12 @@ msgstr "Kifizetett megrendelések"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (ordered)"
msgstr "Résztvevők (megrendelve)"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (paid)"
msgstr "Résztvevők (fizetve)"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51
msgid "Total revenue"
@@ -187,13 +187,18 @@ msgid "Contacting your bank …"
msgstr "Kapcsolatfelvétel a bankjával…"
#: pretix/static/lightbox/js/lightbox.js:96
#, fuzzy
#| msgctxt "widget"
#| msgid "Close"
msgid "close"
msgstr "bezárás"
msgstr "Bezárás"
#: pretix/static/pretixbase/js/addressform.js:108
#: pretix/static/pretixpresale/js/ui/main.js:529
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "a kosár lejárt"
msgstr "A kosár lejárt"
#: pretix/static/pretixbase/js/asynctask.js:13
#, fuzzy
@@ -271,8 +276,6 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:286
msgid "If this takes longer than a few minutes, please contact us."
msgstr ""
"Amennyiben ez több időt vesz igénybe, mint néhány perc, kérjük jelezze "
"felénk."
#: pretix/static/pretixbase/js/asynctask.js:341
msgid "Close message"
@@ -299,20 +302,26 @@ msgid "Group of objects"
msgstr "tárgy csoport"
#: pretix/static/pretixcontrol/js/ui/editor.js:909
#, fuzzy
#| msgid "Text object"
msgid "Text object (deprecated)"
msgstr "Szöveg elem (elavult)"
msgstr "Szöveg"
#: pretix/static/pretixcontrol/js/ui/editor.js:911
#, fuzzy
#| msgid "Text object"
msgid "Text box"
msgstr "Szövegdoboz"
msgstr "Szöveg"
#: pretix/static/pretixcontrol/js/ui/editor.js:913
msgid "Barcode area"
msgstr "Vonalkód terület"
#: pretix/static/pretixcontrol/js/ui/editor.js:915
#, fuzzy
#| msgid "Barcode area"
msgid "Image area"
msgstr "Kép helye"
msgstr "Vonalkód terület"
#: pretix/static/pretixcontrol/js/ui/editor.js:917
msgid "Powered by pretix"
@@ -352,16 +361,19 @@ msgid "Unknown error."
msgstr "Ismeretlen hiba."
#: pretix/static/pretixcontrol/js/ui/main.js:310
#, fuzzy
#| msgid "Your color has great contrast and is very easy to read!"
msgid "Your color has great contrast and will provide excellent accessibility."
msgstr "A választott színek remek kontrasztot adnak, és nagyon könnyű olvasni."
msgstr "A választott színek remek kontrasztot adnak, és nagyon könnyű olvasni!"
#: pretix/static/pretixcontrol/js/ui/main.js:314
#, fuzzy
#| msgid "Your color has decent contrast and is probably good-enough to read!"
msgid ""
"Your color has decent contrast and is sufficient for minimum accessibility "
"requirements."
msgstr ""
"A választott színek kontrasztja elégséges, és elegendő a minimum "
"követelménynek."
"A választott színek kontrasztja elégséges, és valószínűleg jól olvasható!"
#: pretix/static/pretixcontrol/js/ui/main.js:318
msgid ""
@@ -372,7 +384,7 @@ msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:446
#: pretix/static/pretixcontrol/js/ui/main.js:466
msgid "Search query"
msgstr "Keresési lekérdezés"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:464
msgid "All"
@@ -392,7 +404,7 @@ msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:845
msgid "Invalid page number."
msgstr "Helytelen oldalszám."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1003
msgid "Use a different name internally"
@@ -453,7 +465,7 @@ msgstr "A kosár lejárt"
#: pretix/static/pretixpresale/js/ui/cart.js:58
#: pretix/static/pretixpresale/js/ui/cart.js:84
msgid "Your cart is about to expire."
msgstr "Kosara tartalma hamarosan lejár."
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:62
#, fuzzy
@@ -520,32 +532,32 @@ msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16
msgctxt "widget"
msgid "Quantity"
msgstr "Mennyiség"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17
msgctxt "widget"
msgid "Decrease quantity"
msgstr "Mennyiség csökkentése"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18
msgctxt "widget"
msgid "Increase quantity"
msgstr "Mennyiség növelése"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Filter events by"
msgstr "Események szűrése a következő szerint"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "Filter"
msgstr "Szűrés"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "Price"
msgstr "Ár"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22
#, javascript-format
+174 -200
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-27 15:47+0000\n"
"PO-Revision-Date: 2026-06-20 17:00+0000\n"
"Last-Translator: Nikita Mitasov <me@ch4og.com>\n"
"PO-Revision-Date: 2025-10-17 16:55+0000\n"
"Last-Translator: fd <fd@denkena-consulting.com>\n"
"Language-Team: Russian <https://translate.pretix.eu/projects/pretix/pretix/"
"ru/>\n"
"Language: ru\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 2026.6.1\n"
"X-Generator: Weblate 5.13.3\n"
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:670
#: pretix/control/templates/pretixcontrol/events/index.html:166
@@ -53,7 +53,7 @@ msgstr "В продаже"
#: pretix/_base_settings.py:89
msgid "English"
msgstr "Английский язык"
msgstr "английский язык"
#: pretix/_base_settings.py:90
msgid "German"
@@ -466,7 +466,7 @@ msgstr "Этот пользователь уже имеет разрешения
#: pretix/api/views/cart.py:209
msgid ""
"The specified voucher has already been used the maximum number of times."
msgstr "Указанный промокод уже использован максимальное количество раз."
msgstr "Указанный ваучер уже использован максимальное количество раз."
#: pretix/api/views/checkin.py:645 pretix/api/views/checkin.py:652
msgid "Medium connected to other event"
@@ -565,50 +565,65 @@ msgid "Refund of payment failed"
msgstr "Возврат платежа не удался"
#: pretix/api/webhooks.py:359
#, fuzzy
#| msgctxt "checkoutflow"
#| msgid "Order confirmed"
msgid "Payment confirmed"
msgstr "Платёж подтверждён"
msgstr "Заказ подтверждён"
#: pretix/api/webhooks.py:363
msgid "Order approved"
msgstr "Заказ подтверждён"
msgstr ""
#: pretix/api/webhooks.py:367
msgid "Order denied"
msgstr "Заказ отклонён"
msgstr ""
#: pretix/api/webhooks.py:371
#, fuzzy
#| msgid "Order date"
msgid "Order deleted"
msgstr "Заказ удалён"
msgstr "Дата заказа"
#: pretix/api/webhooks.py:375
msgid "Ticket checked in"
msgstr "Билет использован"
msgstr ""
#: pretix/api/webhooks.py:379
msgid "Ticket check-in reverted"
msgstr "Использование билета отменено"
msgstr ""
#: pretix/api/webhooks.py:383
#, fuzzy
#| msgid "Event date"
msgid "Event created"
msgstr "Мероприятие создано"
msgstr "Дата мероприятия"
#: pretix/api/webhooks.py:387
#, fuzzy
#| msgid "Event date range"
msgid "Event details changed"
msgstr "Данные о мероприятии изменились"
msgstr "Диапазон дат мероприятия"
#: pretix/api/webhooks.py:391
#, fuzzy
#| msgid "Event date"
msgid "Event deleted"
msgstr "Мероприятие удалено"
msgstr "Дата мероприятия"
#: pretix/api/webhooks.py:395
#, fuzzy
#| msgid "Event begin date and time"
msgctxt "subevent"
msgid "Event series date added"
msgstr "Добавлена дата серии мероприятий"
msgstr "Дата и время начала мероприятия"
#: pretix/api/webhooks.py:399
#, fuzzy
#| msgid "Event date range"
msgctxt "subevent"
msgid "Event series date changed"
msgstr "Изменена дата серии мероприятий"
msgstr "Диапазон дат мероприятия"
#: pretix/api/webhooks.py:403
#, fuzzy
@@ -851,13 +866,14 @@ msgid "<a {a_attr}>powered by {name} based on pretix</a>"
msgstr "на базе <a %(a_attr)s>pretix</a>"
#: pretix/base/context.py:55
#, python-format
#, fuzzy, python-format
#| msgid "<a %(a_attr)s>event ticketing powered by pretix</a>"
msgid "<a %(a_attr)s>ticketing powered by pretix</a>"
msgstr "<a %(a_attr)s>продажа билетов на базе pretix</a>"
msgstr "<a %(a_attr)s>event ticketing powered by pretix</a>"
#: pretix/base/context.py:64
msgid "source code"
msgstr "исходный код"
msgstr "Промокод"
#: pretix/base/customersso/oidc.py:61
#, python-brace-format
@@ -2761,8 +2777,10 @@ msgid "Voucher"
msgstr ""
#: pretix/base/exporters/orderlist.py:656
#, fuzzy
#| msgid "Voucher code used:"
msgid "Voucher budget usage"
msgstr "Использовано по промокоду"
msgstr "Использованный код ваучера:"
#: pretix/base/exporters/orderlist.py:657
#, fuzzy
@@ -3158,7 +3176,7 @@ msgstr "Заказы в ожидании"
#: pretix/base/exporters/orderlist.py:1209
msgid "Blocking vouchers"
msgstr "Блокирующие промокоды"
msgstr "Блокирующие ваучеры"
#: pretix/base/exporters/orderlist.py:1210 pretix/control/views/item.py:1149
msgid "Current user's carts"
@@ -4588,7 +4606,7 @@ msgstr "Архивные события не найдены."
#: pretix/base/modelimport_vouchers.py:50 pretix/base/models/vouchers.py:491
msgid "A voucher with this code already exists."
msgstr "Промокод с этим кодом уже существует."
msgstr "Ваучер с этим кодом уже существует."
#: pretix/base/modelimport_vouchers.py:68 pretix/base/models/memberships.py:57
#: pretix/base/models/vouchers.py:199 pretix/control/views/vouchers.py:121
@@ -4690,7 +4708,7 @@ msgstr ""
#: pretix/base/modelimport_vouchers.py:334 pretix/base/models/vouchers.py:300
msgid "Shows hidden products that match this voucher"
msgstr "Показывает скрытые продукты, которые соответствуют этому промокоду"
msgstr "Показывает скрытые продукты, которые соответствуют этому ваучеру"
#: pretix/base/modelimport_vouchers.py:343 pretix/base/models/vouchers.py:304
msgid "Offer all add-on products for free when redeeming this voucher"
@@ -4942,8 +4960,11 @@ msgid "Order not approved"
msgstr "Срок действия заказа истёк"
#: pretix/base/models/checkin.py:367
#, fuzzy
#| msgctxt "subevent"
#| msgid "This voucher is not valid for this event date."
msgid "Ticket not valid at this time"
msgstr "Билет не действителен в это время"
msgstr "Этот ваучер не действителен на эту дату мероприятия."
#: pretix/base/models/checkin.py:368
#, fuzzy
@@ -7740,9 +7761,9 @@ msgid ""
"same value for multiple vouchers, you can get statistics on how many of them "
"have been redeemed etc."
msgstr ""
"Вы можете использовать это поле для группировки нескольких промокодов. Если "
ы введёте одно и то же значение для нескольких промокодов, вы сможете "
"получить статистику о том, сколько из них было использовано и т. д."
"Вы можете использовать это поле для группировки нескольких ваучеров. Если вы "
"введёте одно и то же значение для нескольких ваучеров, вы сможете получить "
"статистику о том, сколько из них было использовано и т. д."
#: pretix/base/models/vouchers.py:316 pretix/base/permissions.py:242
#: pretix/control/navigation.py:289
@@ -7787,7 +7808,7 @@ msgstr "Этот вариант не относится к этому проду
#: pretix/base/models/vouchers.py:358
msgid "It is currently not possible to create vouchers for add-on products."
msgstr ""
"В настоящее время невозможно создать промокоды для дополнительных продуктов."
"В настоящее время невозможно создать ваучеры для дополнительных продуктов."
#: pretix/base/models/vouchers.py:360 pretix/base/models/vouchers.py:472
#, fuzzy
@@ -7803,7 +7824,7 @@ msgid ""
"This voucher has already been redeemed %(redeemed)s times. You cannot reduce "
"the maximum number of usages below this number."
msgstr ""
"Этот промокод уже был использован %(redeemed)s раз. Вы не можете уменьшить "
"Этот ваучер уже был использован %(redeemed)s раз. Вы не можете уменьшить "
"максимальное количество использований ниже этого числа."
#: pretix/base/models/vouchers.py:379
@@ -7822,7 +7843,7 @@ msgstr ""
msgid ""
"If you want this voucher to block quota, you need to select a specific date."
msgstr ""
"Если вы хотите, чтобы этот промокод блокировал квоту, вы должны выбрать "
"Если вы хотите, чтобы этот ваучер блокировал квоту, вы должны выбрать "
"конкретную дату."
#: pretix/base/models/vouchers.py:387
@@ -7836,7 +7857,7 @@ msgid ""
"You cannot create a voucher that blocks quota as the selected product or "
"quota is currently sold out or completely reserved."
msgstr ""
"Вы не можете создать промокод, который блокирует квоту, поскольку выбранный "
"Вы не можете создать ваучер, который блокирует квоту, поскольку выбранный "
"продукт или квота в настоящее время распроданы или полностью зарезервированы."
#: pretix/base/models/vouchers.py:507
@@ -7858,7 +7879,7 @@ msgstr "В листе ожидания с"
#: pretix/base/models/waitinglist.py:84
msgid "Assigned voucher"
msgstr "Присвоенный промокод"
msgstr "Присвоенный ваучер"
#: pretix/base/models/waitinglist.py:93
msgid "The product the user waits for."
@@ -7892,7 +7913,7 @@ msgstr "Эта запись анонимизирована и больше не
#: pretix/base/models/waitinglist.py:197
msgid "A voucher has already been sent to this person."
msgstr "Промокод уже отправлен данному лицу."
msgstr "Ваучер уже отправлен данному лицу."
#: pretix/base/models/waitinglist.py:208
#, python-brace-format
@@ -8062,8 +8083,8 @@ msgid ""
"You entered a voucher instead of a gift card. Vouchers can only be entered "
"on the first page of the shop below the product selection."
msgstr ""
"Вы ввели промокод вместо подарочного сертификата. Промокод можно вводить "
"только на первой странице магазина под ассортиментом продуктов."
"Вы ввели ваучер вместо подарочного сертификата. Ваучеры можно вводить только "
"на первой странице магазина под ассортиментом продуктов."
#: pretix/base/payment.py:151
msgid "This gift card is not known."
@@ -9352,7 +9373,7 @@ msgstr "Введённая цена слишком высока."
#: pretix/base/services/cart.py:163
msgid "This voucher code is not known in our database."
msgstr "Этот промокод не известен в нашей базе данных."
msgstr "Этот код ваучера не известен в нашей базе данных."
#: pretix/base/services/cart.py:165
#, fuzzy, python-format
@@ -9386,7 +9407,7 @@ msgstr[2] ""
msgid ""
"This voucher code has already been used the maximum number of times allowed."
msgstr ""
"Этот промокод уже был использован максимально допустимое количество раз."
"Этот код ваучера уже был использован максимально допустимое количество раз."
#: pretix/base/services/cart.py:178
#, python-format
@@ -9396,16 +9417,15 @@ msgid ""
"or that you tried to redeem it before but did not complete the checkout "
"process. You can try to use it again in %d minutes."
msgstr ""
"Этот промокод в настоящее время заблокирован, так как он уже содержится в "
"Этот код ваучера в настоящее время заблокирован, так как он уже содержится в "
"корзине. Это может означать, что кто-то другой сейчас использует этот "
"промокод, или что вы пытались его использовать ранее, но не завершили "
"процесс оформления. Вы можете попробовать использовать его снова через %d "
"минут."
"ваучер, или что вы пытались его использовать ранее, но не завершили процесс "
"оформления. Вы можете попробовать использовать его снова через %d минут."
#: pretix/base/services/cart.py:183
#, python-format
msgid "This voucher code can only be redeemed %d more times."
msgstr "Этот промокод можно использовать ещё %d раз."
msgstr "Этот код ваучера можно использовать только ещё %d раз."
#: pretix/base/services/cart.py:184
msgid ""
@@ -9418,20 +9438,23 @@ msgid ""
"You already used this voucher code. Remove the associated line from your "
"cart if you want to use it for a different product."
msgstr ""
"Вы уже использовали этот промокод. Удалите связанную строку из вашей "
"Вы уже использовали этот код ваучера. Удалите связанную строку из вашей "
"корзины, если вы хотите использовать его для другого продукта."
#: pretix/base/services/cart.py:189
msgid "This voucher is expired."
msgstr "Срок действия этого промокода истёк."
msgstr "Срок действия этого ваучера истёк."
#: pretix/base/services/cart.py:190
msgid "This voucher is not valid for this product."
msgstr "Этот промокод недействителен для данного продукта."
msgstr "Этот ваучер недействителен для данного продукта."
#: pretix/base/services/cart.py:191
#, fuzzy
#| msgctxt "subevent"
#| msgid "This voucher is not valid for this event date."
msgid "This voucher is not valid for this seat."
msgstr "Этот промокод не действителен для данного места."
msgstr "Этот ваучер не действителен на эту дату мероприятия."
#: pretix/base/services/cart.py:193
msgid ""
@@ -9443,17 +9466,16 @@ msgstr ""
#: pretix/base/services/cart.py:198
msgid "Your voucher is valid for a product that is currently not for sale."
msgstr ""
"Ваш промокод действителен для продукта, который в настоящее время не "
"продаётся."
"Ваш ваучер действителен для продукта, который в настоящее время не продаётся."
#: pretix/base/services/cart.py:199
msgctxt "subevent"
msgid "This voucher is not valid for this event date."
msgstr "Этот промокод не действителен на эту дату мероприятия."
msgstr "Этот ваучер не действителен на эту дату мероприятия."
#: pretix/base/services/cart.py:200
msgid "You need a valid voucher code to order this product."
msgstr "Необходим действительный промокод для заказа этого продукта."
msgstr "Необходим действительный код ваучера для заказа этого продукта."
#: pretix/base/services/cart.py:201
msgctxt "subevent"
@@ -9556,8 +9578,8 @@ msgid ""
"You entered a gift card instead of a voucher. Gift cards can be entered "
"later on when you're asked for your payment details."
msgstr ""
"Вы ввели подарочный сертификат вместо промокода. Подарочные сертификаты "
"можно ввести позже, когда вас попросят указать реквизиты для оплаты."
"Вы ввели подарочный сертификат вместо ваучера. Подарочные сертификаты можно "
"ввести позже, когда вас попросят указать реквизиты для оплаты."
#: pretix/base/services/cart.py:224
msgid ""
@@ -9724,9 +9746,11 @@ msgid "This order is not yet approved."
msgstr "Этот заказ не ожидает утверждения."
#: pretix/base/services/checkin.py:999 pretix/base/services/checkin.py:1003
#, python-brace-format
#, fuzzy, python-brace-format
#| msgctxt "subevent"
#| msgid "This voucher is not valid for this event date."
msgid "This ticket is only valid after {datetime}."
msgstr "Этот билет действителен только после {datetime}."
msgstr "Этот ваучер не действителен на эту дату мероприятия."
#: pretix/base/services/checkin.py:1013 pretix/base/services/checkin.py:1017
#, fuzzy, python-brace-format
@@ -9884,12 +9908,6 @@ msgid ""
"We are sending this email because you configured us to do so in your event "
"settings."
msgstr ""
"Здравствуйте,\n"
"\n"
"новый счет для заказа {order} на {event} создан, смотрите вложение.\n"
"\n"
"Вы получили это письмо, поскольку в настройках мероприятия была включена "
"отправка таких уведомлений."
#: pretix/base/services/mail.py:144
#, fuzzy
@@ -10145,8 +10163,8 @@ msgid ""
"The voucher code used for one of the items in your cart is not known in our "
"database."
msgstr ""
"Промокод, использованный для одной из позиций в вашей корзине, неизвестен в "
"нашей базе данных."
"Код ваучера, использованный для одной из позиций в вашей корзине, неизвестен "
"в нашей базе данных."
#: pretix/base/services/orders.py:173
msgid ""
@@ -10154,24 +10172,30 @@ msgid ""
"used the maximum number of times allowed. We removed this item from your "
"cart."
msgstr ""
"Промокод, использованный для одной из позиций в вашей корзине, уже был "
"Код ваучера, использованный для одной из позиций в вашей корзине, уже был "
"использован максимально допустимое количество раз. Мы удалили эту позицию из "
"вашей корзины."
#: pretix/base/services/orders.py:177
#, fuzzy
#| msgid ""
#| "The voucher code used for one of the items in your cart has already been "
#| "used the maximum number of times allowed. We removed this item from your "
#| "cart."
msgid ""
"The voucher code used for one of the items in your cart has already been too "
"often. We adjusted the price of the item in your cart."
msgstr ""
"Промокод, применённый к одному из товаров в вашей корзине, был использован "
"слишком много раз. Мы скорректировали цену товара в вашей корзине."
"Код ваучера, использованный для одной из позиций в вашей корзине, уже был "
"использован максимально допустимое количество раз. Мы удалили эту позицию из "
"вашей корзины."
#: pretix/base/services/orders.py:181
msgid ""
"The voucher code used for one of the items in your cart is expired. We "
"removed this item from your cart."
msgstr ""
"Срок действия промокода, использованного для одной из позиций в вашей "
"Срок действия кода ваучера, использованного для одной из позиций в вашей "
"корзине, истёк. Мы удалили эту позицию из вашей корзины."
#: pretix/base/services/orders.py:184
@@ -10179,12 +10203,14 @@ msgid ""
"The voucher code used for one of the items in your cart is not valid for "
"this item. We removed this item from your cart."
msgstr ""
"Промокод, использованный для одной из позиций в вашей корзине, "
"Код ваучера, использованный для одной из позиций в вашей корзине, "
"недействителен для этой позиции. Мы удалили эту позицию из вашей корзины."
#: pretix/base/services/orders.py:186
#, fuzzy
#| msgid "You need a valid voucher code to order this product."
msgid "You need a valid voucher code to order one of the products."
msgstr "Необходим действительный промокод для одного из продуктов."
msgstr "Необходим действительный код ваучера для заказа этого продукта."
#: pretix/base/services/orders.py:187
msgid ""
@@ -12195,16 +12221,6 @@ msgid ""
"Best regards, \n"
"Your {event} team"
msgstr ""
"Здравствуйте,\n"
"\n"
"вы получили это письмо, потому что запросили ссылку\n"
"на ваш заказ для мероприятия {event}.\n"
"\n"
"Вы можете изменить данные заказа и просмотреть его статус по ссылке:\n"
"{url}\n"
"\n"
"С уважением, \n"
"Команда мероприятия {event}"
#: pretix/base/settings.py:2461
#, python-brace-format
@@ -12224,15 +12240,6 @@ msgid ""
"Best regards, \n"
"Your {event} team"
msgstr ""
"Здравствуйте,\n"
"\n"
"кто-то запросил список ваших заказов для мероприятия {event}.\n"
"Список заказов::\n"
"\n"
"{orders}\n"
"\n"
"С уважением, \n"
"Команда мероприятия {event}"
#: pretix/base/settings.py:2481
#, python-brace-format
@@ -12262,17 +12269,6 @@ msgid ""
"Best regards, \n"
"Your {event} team"
msgstr ""
"Здравствуйте,\n"
"\n"
"ваш заказ для мероприятия {event} прошел успешно. Поскольку ваш заказ "
"состоит только из бесплатных позиций,\n"
"оплата не требуется.\n"
"\n"
"Вы можете изменить детали заказа и посмотреть его статус по ссылке:\n"
"{url}\n"
"\n"
"С уважением, \n"
"Команда мероприятия {event}"
#: pretix/base/settings.py:2518
#, python-brace-format
@@ -12289,18 +12285,6 @@ msgid ""
"Best regards, \n"
"Your {event} team"
msgstr ""
"Здравствуйте,\n"
"\n"
"мы успешно получили ваш заказ для мероприятия {event}. Поскольку вы "
"заказали\n"
"товар, требующий подтверждения со стороны организатора, просим вас\n"
"подождать нашего следующего письма.\n"
"\n"
"Вы можете изменить данные заказа и просмотреть его статус по ссылке:\n"
"{url}\n"
"\n"
"С уважением, \n"
"Команда мероприятия {event}"
#: pretix/base/settings.py:2536
#, python-brace-format
@@ -12319,19 +12303,6 @@ msgid ""
"Best regards, \n"
"Your {event} team"
msgstr ""
"Здравствуйте,\n"
"\n"
"мы успешно получили ваш заказ на сумму {total_with_currency} для мероприятия "
"{event}.\n"
"Пожалуйста, завершите оплату до {expire_date}.\n"
"\n"
"{payment_info}\n"
"\n"
"Вы можете изменить данные заказа и просмотреть его статус по ссылке:\n"
"{url}\n"
"\n"
"С уважением, \n"
"Команда мероприятия {event}"
#: pretix/base/settings.py:2554
#, fuzzy
@@ -12383,15 +12354,6 @@ msgid ""
"Best regards, \n"
"Your {event} team"
msgstr ""
"Здравствуйте,\n"
"\n"
"ваш заказ для мероприятия {event} был изменен.\n"
"\n"
"Вы можете посмотреть статус своего заказа по ссылке:\n"
"{url}\n"
"\n"
"С уважением, \n"
"Команда мероприятия {event}"
#: pretix/base/settings.py:2614
#, python-brace-format
@@ -12413,17 +12375,6 @@ msgid ""
"Best regards, \n"
"Your {event} team"
msgstr ""
"Здравствуйте,\n"
"\n"
"мы успешно получили вашу оплату за мероприятие {event}. Спасибо!\n"
"\n"
"{payment_info}\n"
"\n"
"Вы можете изменить данные заказа и просмотреть его статус по ссылке:\n"
"{url}\n"
"\n"
"С уважением, \n"
"Команда мероприятия {event}"
#: pretix/base/settings.py:2636
#, python-brace-format
@@ -12475,17 +12426,6 @@ msgid ""
"Best regards, \n"
"Your {event} team"
msgstr ""
"Здравствуйте,\n"
"\n"
"мы не получили полной оплаты вашего заказа для мероприятия {event}.\n"
"Обратите внимание: мы можем гарантировать ваш заказ только в том случае,\n"
"если оплата поступит до {expire_date}.\n"
"\n"
"Информацию об оплате и статус заказа можно посмотреть по ссылке:\n"
"{url}\n"
"\n"
"С уважением, \n"
"Команда мероприятия {event}"
#: pretix/base/settings.py:2685
#, python-brace-format
@@ -13708,8 +13648,10 @@ msgid "created by"
msgstr "создано"
#: pretix/base/templates/pretixbase/email/order_details.html:34
#, fuzzy
#| msgid "Bancontact"
msgid "Contact:"
msgstr "Связаться:"
msgstr "Bancontact"
#: pretix/base/templates/pretixbase/email/order_details.html:54
#, fuzzy, python-format
@@ -13742,8 +13684,10 @@ msgstr ""
#: pretix/base/templates/pretixbase/email/order_details.html:136
#: pretix/presale/templates/pretixpresale/event/base.html:223
#: pretix/presale/templates/pretixpresale/organizers/base.html:101
#, fuzzy
#| msgid "Bancontact"
msgid "Contact"
msgstr "Связаться"
msgstr "Bancontact"
#: pretix/base/templates/pretixbase/email/shred_completed.txt:2
#, python-format
@@ -13814,17 +13758,16 @@ msgid "Proceed to %(host)s"
msgstr "Приступить к оформлению заказа"
#: pretix/base/templates/source.html:5 pretix/base/templates/source.html:9
#, fuzzy
#| msgid "Voucher code"
msgid "Source code"
msgstr "Исходный код"
msgstr "Код ваучера"
#: pretix/base/templates/source.html:10
msgid ""
"This site is powered by free software. If you want to read the license terms "
"or obtain the source code, follow these links or instructions:"
msgstr ""
"Этот сайт работает на свободном программном обеспечении. Если вы хотите "
"ознакомиться с условиями лицензии или получить исходный код, перейдите по "
"следующим ссылкам или следуйте инструкциям:"
#: pretix/base/ticketoutput.py:182
#, fuzzy
@@ -15759,7 +15702,6 @@ msgid ""
"This installation of pretix includes changes or extensions made to the "
"source code."
msgstr ""
"Данная установка pretix содержит изменения или расширения исходного кода."
#: pretix/control/forms/global_settings.py:162
msgid "Usage of pretix"
@@ -15850,8 +15792,10 @@ msgid ""
msgstr ""
#: pretix/control/forms/global_settings.py:217
#, fuzzy
#| msgid "Your registration"
msgid "Source code instructions"
msgstr "Инструкции для получения исходного кода"
msgstr "Ваша регистрация"
#: pretix/control/forms/global_settings.py:219
msgid ""
@@ -16817,8 +16761,10 @@ msgid "An medium with this type and identifier is already registered."
msgstr "Ваучер с этим кодом уже существует."
#: pretix/control/forms/organizer.py:1059
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "An account with this customer ID is already registered."
msgstr "Аккаунт с таким ID клиента уже существует."
msgstr "Ваучер с этим кодом уже существует."
#: pretix/control/forms/organizer.py:1076
#: pretix/control/templates/pretixcontrol/organizers/customer.html:62
@@ -16941,8 +16887,10 @@ msgid "The selected organizer has already been invited."
msgstr "Выбранный организатор не найден."
#: pretix/control/forms/organizer.py:1379
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "A sales channel with the same identifier already exists."
msgstr "Канал продаж с таким идентификатором уже существует."
msgstr "Ваучер с этим кодом уже существует."
#: pretix/control/forms/organizer.py:1391
msgid "Events with active plugin"
@@ -17225,8 +17173,10 @@ msgid "Only includes active products."
msgstr ""
#: pretix/control/forms/waitinglist.py:115
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "A voucher for this waiting list entry was already sent out."
msgstr "Промокод для данного места в листе ожидания уже отправлен."
msgstr "Ваучер с этим кодом уже существует."
#: pretix/control/forms/waitinglist.py:125
#, fuzzy
@@ -18862,7 +18812,7 @@ msgstr "Оплата"
#: pretix/presale/templates/pretixpresale/organizers/index.html:89
#: pretix/presale/templates/pretixpresale/organizers/index.html:91
msgid "Tickets"
msgstr "Билеты"
msgstr ""
#: pretix/control/navigation.py:97
#: pretix/control/templates/pretixcontrol/event/tax.html:4
@@ -22154,7 +22104,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html:3
#, python-format
msgid "Currently available: %(num)s"
msgstr "Сейчас доступно: %(num)s"
msgstr ""
#: pretix/control/templates/pretixcontrol/global_license.html:8
msgid ""
@@ -24077,7 +24027,7 @@ msgstr "Начальная дата мероприятия"
#: pretix/control/templates/pretixcontrol/order/index.html:498
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:55
msgid "Voucher code used:"
msgstr "Использованный промокод:"
msgstr "Использованный код ваучера:"
#: pretix/control/templates/pretixcontrol/order/index.html:500
#, fuzzy, python-format
@@ -27874,8 +27824,10 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/import_start.html:6
#: pretix/control/templates/pretixcontrol/vouchers/index.html:81
#: pretix/control/templates/pretixcontrol/vouchers/index.html:94
#, fuzzy
#| msgid "Blocking vouchers"
msgid "Import vouchers"
msgstr "Импорт промокодов"
msgstr "Блокирующие ваучеры"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:10
msgid ""
@@ -30809,8 +30761,6 @@ msgid ""
"After completing your purchase, we will ask you to transfer the money to the "
"following bank account, using a personal reference code:"
msgstr ""
"После завершения покупки, мы попросим вас перевести оплату на следующий "
"банковский счет, указав персональный код назначения платежа:"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:11
msgid ""
@@ -30821,27 +30771,23 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:14
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:21
msgid "Reference code (important):"
msgstr "Код назначения платежа (важно):"
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:30
msgid "We will assign you a personal reference code in the next step."
msgstr "Мы присвоим вам персональный код назначения платежа на следующем шаге."
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:36
msgid ""
"We will assign you a personal reference code to use after you completed the "
"order."
msgstr ""
"Мы присвоим вам персональный код назначения платежа после завершения "
"оформления заказа."
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:41
msgid ""
"After completing your purchase, we will ask you to transfer the money to our "
"bank account, using a personal reference code."
msgstr ""
"После завершения покупки мы попросим вас перевести оплату на следующий "
"банковский счёт, указав персональный код назначения платежа."
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:6
#, fuzzy
@@ -30864,7 +30810,7 @@ msgstr "Общая сумма"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:38
msgid "Reference code"
msgstr "Код назначения платежа"
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:4
msgid ""
@@ -31003,7 +30949,7 @@ msgstr "Сумма:"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:34
#: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:30
msgid "There is no further action required on this website."
msgstr "Дальнейших действий на этом сайте не требуется."
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:35
#: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:31
@@ -34417,9 +34363,11 @@ msgstr ""
#: pretix/presale/forms/renderers.py:66
#: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:14
#, fuzzy
#| msgid "expired"
msgctxt "form"
msgid "required"
msgstr "обязательно"
msgstr "истекло"
#: pretix/presale/ical.py:87 pretix/presale/ical.py:146
#: pretix/presale/ical.py:182
@@ -34611,8 +34559,10 @@ msgid "We're now trying to book these add-ons for you!"
msgstr "Сейчас мы пытаемся забронировать эти дополнительные продукты для вас!"
#: pretix/presale/templates/pretixpresale/event/checkout_addons.html:28
#, fuzzy
#| msgid "Additional information"
msgid "Additional options for"
msgstr "Дополнительные опции"
msgstr "Дополнительная информация"
#: pretix/presale/templates/pretixpresale/event/checkout_addons.html:60
#, fuzzy
@@ -34664,8 +34614,10 @@ msgid "Cart expired"
msgstr "Срок действия корзины истёк"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
#, fuzzy
#| msgid "Show variants"
msgid "Show full cart"
msgstr "Показать полную корзину"
msgstr "Показать варианты"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:52
#: pretix/presale/templates/pretixpresale/event/index.html:86
@@ -34997,12 +34949,21 @@ msgstr[1] ""
msgstr[2] ""
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:26
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "You can choose between %(min_count)s and %(max_count)s options from this "
#| "category."
msgid "You can choose one option from this category."
msgid_plural "You can choose up to %(max_count)s options from this category."
msgstr[0] "Вы можете выбрать не более %(max_count)s варианта из этой категории."
msgstr[1] "Вы можете выбрать не более %(max_count)s вариантов из этой категории."
msgstr[2] "Вы можете выбрать не более %(max_count)s вариантов из этой категории."
msgstr[0] ""
"Вы можете выбрать между вариантами %(min_count)s и %(max_count)s из этой "
"категории."
msgstr[1] ""
"Вы можете выбрать между вариантами %(min_count)s и %(max_count)s из этой "
"категории."
msgstr[2] ""
"Вы можете выбрать между вариантами %(min_count)s и %(max_count)s из этой "
"категории."
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:34
#, python-format
@@ -35402,7 +35363,8 @@ msgid ""
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:516
#, python-format
#, fuzzy, python-format
#| msgid "The items in your cart are reserved for you for %(minutes)s minutes."
msgid "The items in your cart are reserved for you for %(minutes)s minutes."
msgstr "Позиции в вашей корзине зарезервированы для вас на %(minutes)s минут."
@@ -35451,7 +35413,7 @@ msgstr "Очистить корзину"
#: pretix/presale/templates/pretixpresale/event/index.html:248
#: pretix/presale/templates/pretixpresale/event/voucher_form.html:16
msgid "Redeem a voucher"
msgstr "Использовать промокод"
msgstr "Использовать ваучер/промокод"
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:71
msgid "We're applying this voucher to your cart..."
@@ -35460,7 +35422,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:79
#: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:27
msgid "Redeem voucher"
msgstr "Активировать промокод"
msgstr "Использовать ваучер"
#: pretix/presale/templates/pretixpresale/event/fragment_change_confirm.html:10
#, fuzzy
@@ -35784,7 +35746,7 @@ msgstr "Изменить цену для %(item)s"
#: pretix/presale/templates/pretixpresale/event/fragment_quota_left.html:4
#, python-format
msgid "%(num)s currently available"
msgstr "%(num)s доступно сейчас"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:5
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:5
@@ -36037,23 +35999,32 @@ msgstr ""
"завершения процесса."
#: pretix/presale/templates/pretixpresale/event/order.html:56
#, fuzzy
#| msgid ""
#| "Please bookmark or save the link to this exact page if you want to access "
#| "your order later. We also sent you an email containing the link to the "
#| "address you specified."
msgid ""
"Please bookmark or save the link to this exact page if you want to access "
"your order later. We also sent you an email to the address you specified "
"containing the link to this page."
msgstr ""
"Пожалуйста, сохраните закладку или ссылку на эту страницу, если вам "
"потребуется доступ к заказу позже. Мы также отправили письмо на указанный "
"вами адрес электронной почты со ссылкой на эту страницу."
"Пожалуйста, добавьте в закладки или сохраните ссылку именно на эту страницу, "
"если вы хотите получить доступ к вашему заказу позже. Мы также отправили вам "
"электронное письмо со ссылкой на указанный вами адрес."
#: pretix/presale/templates/pretixpresale/event/order.html:60
#, fuzzy
#| msgid ""
#| "Please save the following link if you want to access your order later. We "
#| "also sent you an email containing the link to the address you specified."
msgid ""
"Please save the following link if you want to access your order later. We "
"also sent you an email to the address you specified containing the link."
msgstr ""
"Пожалуйста, сохраните ссылку на эту страницу, если вам потребуется доступ к "
"заказу позже. Мы также отправили письмо на указанный вами адрес электронной "
"почты со ссылкой на эту страницу."
"Пожалуйста, сохраните следующую ссылку, если вы хотите получить доступ к "
"вашему заказу позже. Мы также отправили вам электронное письмо со ссылкой на "
"указанный вами адрес."
#: pretix/presale/templates/pretixpresale/event/order.html:75
#: pretix/presale/templates/pretixpresale/event/position.html:18
@@ -36580,11 +36551,14 @@ msgstr "Включить вебхук"
#: pretix/presale/templates/pretixpresale/event/voucher.html:36
#: pretix/presale/templates/pretixpresale/event/voucher_form.html:9
msgid "Voucher redemption"
msgstr "Активация промокода"
msgstr "Использование ваучера"
#: pretix/presale/templates/pretixpresale/event/voucher.html:20
#, fuzzy
#| msgctxt "subevent"
#| msgid "This voucher is not valid for this event date."
msgid "This voucher is valid only for the following specific date and time."
msgstr "Этот промокод действителен только на указанную дату и время."
msgstr "Этот ваучер не действителен на эту дату мероприятия."
#: pretix/presale/templates/pretixpresale/event/voucher.html:43
msgid ""
@@ -36603,8 +36577,8 @@ msgid ""
"You entered a voucher code that allows you to buy one of the following "
"products at the specified price:"
msgstr ""
"Вы ввели промокод, который позволяет вам купить один из следующих продуктов "
"по указанной цене:"
"Вы ввели код ваучера, который позволяет вам купить один из следующих "
"продуктов по указанной цене:"
#: pretix/presale/templates/pretixpresale/event/voucher.html:112
#, python-format
@@ -27,7 +27,7 @@ from django.urls import NoReverseMatch
from django.utils.encoding import smart_str
from django.utils.html import conditional_escape
from pretix.multidomain.urlreverse import eventreverse_absolute, mainreverse
from pretix.multidomain.urlreverse import build_absolute_uri, mainreverse
register = template.Library()
@@ -49,7 +49,7 @@ class EventURLNode(URLNode):
url = ''
try:
if self.absolute:
url = eventreverse_absolute(event, view_name, kwargs=kwargs)
url = build_absolute_uri(event, view_name, kwargs=kwargs)
elif self.event is False:
url = mainreverse(view_name, kwargs)
else:
-10
View File
@@ -32,7 +32,6 @@
# 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.
import warnings
from urllib.parse import urljoin, urlsplit
from django.conf import settings
@@ -191,15 +190,6 @@ def eventreverse(obj, name, kwargs=None):
def build_absolute_uri(obj, urlname, kwargs=None):
warnings.warn(
'Usage of build_absolute_uri is confusing since there are many functions with that name. '
'Replace this usage with eventreverse_absolute',
DeprecationWarning
)
return eventreverse_absolute(obj, urlname, kwargs)
def eventreverse_absolute(obj, urlname, kwargs=None):
"""
Works similar to ``eventreverse`` but always returns an absolute URL.
+6 -6
View File
@@ -58,7 +58,7 @@ from pretix.base.forms import SecretKeySettingsField
from pretix.base.models import Event, Order, OrderPayment, OrderRefund, Quota
from pretix.base.payment import BasePaymentProvider, PaymentException
from pretix.base.settings import SettingsSandbox
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.plugins.paypal.api import Api
from pretix.plugins.paypal.models import ReferencedPayPalObject
@@ -268,8 +268,8 @@ class Paypal(BasePaymentProvider):
"payment_method": "paypal",
},
"redirect_urls": {
"return_url": eventreverse_absolute(request.event, 'plugins:paypal:return', kwargs=kwargs),
"cancel_url": eventreverse_absolute(request.event, 'plugins:paypal:abort', kwargs=kwargs),
"return_url": build_absolute_uri(request.event, 'plugins:paypal:return', kwargs=kwargs),
"cancel_url": build_absolute_uri(request.event, 'plugins:paypal:abort', kwargs=kwargs),
},
"transactions": [
{
@@ -351,7 +351,7 @@ class Paypal(BasePaymentProvider):
if request.session.get('iframe_session', False):
signer = signing.Signer(salt='safe-redirect')
return (
eventreverse_absolute(request.event, 'plugins:paypal:redirect') + '?url=' +
build_absolute_uri(request.event, 'plugins:paypal:redirect') + '?url=' +
urllib.parse.quote(signer.sign(link.href))
)
else:
@@ -613,8 +613,8 @@ class Paypal(BasePaymentProvider):
"payment_method": "paypal",
},
"redirect_urls": {
"return_url": eventreverse_absolute(request.event, 'plugins:paypal:return'),
"cancel_url": eventreverse_absolute(request.event, 'plugins:paypal:abort'),
"return_url": build_absolute_uri(request.event, 'plugins:paypal:return'),
"cancel_url": build_absolute_uri(request.event, 'plugins:paypal:abort'),
},
"transactions": [
{
+6 -6
View File
@@ -56,8 +56,8 @@ from pretix.base.models import Event, Order, OrderPayment, OrderRefund, Quota
from pretix.base.payment import BasePaymentProvider, PaymentException
from pretix.base.settings import SettingsSandbox
from pretix.helpers import OF_SELF
from pretix.helpers.urls import mainreverse_absolute
from pretix.multidomain.urlreverse import eventreverse, eventreverse_absolute
from pretix.helpers.urls import build_absolute_uri as build_global_uri
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.plugins.paypal2.client.core.environment import (
LiveEnvironment, SandboxEnvironment,
)
@@ -264,7 +264,7 @@ class PaypalSettingsHolder(BasePaymentProvider):
settings_content = "<div class='alert alert-info'>%s<br /><code>%s</code></div>" % (
_('Please configure a PayPal Webhook to the following endpoint in order to automatically cancel orders '
'when payments are refunded externally.'),
mainreverse_absolute('plugins:paypal2:webhook')
build_global_uri('plugins:paypal2:webhook')
)
if self.event.currency not in SUPPORTED_CURRENCIES:
@@ -321,7 +321,7 @@ class PaypalSettingsHolder(BasePaymentProvider):
],
"partner_config_override": {
"partner_logo_url": urllib.parse.urljoin(settings.SITE_URL, static('pretixbase/img/pretix-logo.svg')),
"return_url": mainreverse_absolute('plugins:paypal2:isu.return', kwargs={
"return_url": build_global_uri('plugins:paypal2:isu.return', kwargs={
'organizer': self.event.organizer.slug,
'event': self.event.slug,
})
@@ -585,8 +585,8 @@ class PaypalMethod(BasePaymentProvider):
'locale': request.LANGUAGE_CODE.split('-')[0],
'shipping_preference': 'NO_SHIPPING', # 'SET_PROVIDED_ADDRESS', # Do not set on non-ship order?
'user_action': 'CONTINUE',
'return_url': eventreverse_absolute(request.event, 'plugins:paypal2:return', kwargs=kwargs),
'cancel_url': eventreverse_absolute(request.event, 'plugins:paypal2:abort', kwargs=kwargs),
'return_url': build_absolute_uri(request.event, 'plugins:paypal2:return', kwargs=kwargs),
'cancel_url': build_absolute_uri(request.event, 'plugins:paypal2:abort', kwargs=kwargs),
},
})
response = self.client.execute(paymentreq)
+9 -9
View File
@@ -75,8 +75,8 @@ from pretix.base.settings import SettingsSandbox
from pretix.helpers import OF_SELF
from pretix.helpers.countries import CachedCountries
from pretix.helpers.http import get_client_ip
from pretix.helpers.urls import mainreverse_absolute
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.helpers.urls import build_absolute_uri as build_global_uri
from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.plugins.stripe.forms import StripeKeyValidator
from pretix.plugins.stripe.models import (
ReferencedStripeObject, RegisteredApplePayDomain,
@@ -197,7 +197,7 @@ class StripeSettingsHolder(BasePaymentProvider):
).format(
self.settings.connect_client_id,
request.session['payment_stripe_oauth_token'],
urllib.parse.quote(mainreverse_absolute('plugins:stripe:oauth.return')),
urllib.parse.quote(build_global_uri('plugins:stripe:oauth.return')),
)
def settings_content_render(self, request):
@@ -229,7 +229,7 @@ class StripeSettingsHolder(BasePaymentProvider):
_('Please configure a <a href="https://dashboard.stripe.com/account/webhooks">Stripe Webhook</a> to '
'the following endpoint in order to automatically cancel orders when charges are refunded externally '
'and to process asynchronous payment methods like SOFORT.'),
mainreverse_absolute('plugins:stripe:webhook')
build_global_uri('plugins:stripe:webhook')
)
@property
@@ -746,7 +746,7 @@ class StripeMethod(BasePaymentProvider):
def redirect(self, request, url):
if request.session.get('iframe_session', False):
return (
eventreverse_absolute(request.event, 'plugins:stripe:redirect') +
build_absolute_uri(request.event, 'plugins:stripe:redirect') +
'?data=' + signing.dumps({
'url': url,
'session': {
@@ -941,7 +941,7 @@ class StripeMethod(BasePaymentProvider):
},
# TODO: Is this sufficient?
idempotency_key=str(self.event.id) + payment.order.code + idempotency_key_seed,
return_url=eventreverse_absolute(self.event, 'plugins:stripe:sca.return', kwargs={
return_url=build_absolute_uri(self.event, 'plugins:stripe:sca.return', kwargs={
'order': payment.order.code,
'payment': payment.pk,
'hash': payment.order.tagged_secret('plugins:stripe'),
@@ -1047,13 +1047,13 @@ class StripeMethod(BasePaymentProvider):
raise PaymentException(_('Stripe reported an error: %s') % intent.last_payment_error.message)
def _redirect_to_sca(self, request, payment):
url = eventreverse_absolute(self.event, 'plugins:stripe:sca', kwargs={
url = build_absolute_uri(self.event, 'plugins:stripe:sca', kwargs={
'order': payment.order.code,
'payment': payment.pk,
'hash': payment.order.tagged_secret('plugins:stripe'),
})
if not self.redirect_in_widget_allowed and request.session.get('iframe_session', False):
return eventreverse_absolute(self.event, 'plugins:stripe:redirect') + '?data=' + signing.dumps({
return build_absolute_uri(self.event, 'plugins:stripe:redirect') + '?data=' + signing.dumps({
'url': url,
'session': {},
}, salt='safe-redirect')
@@ -1068,7 +1068,7 @@ class StripeMethod(BasePaymentProvider):
intent = stripe.PaymentIntent.confirm(
payment_info['id'],
return_url=eventreverse_absolute(self.event, 'plugins:stripe:sca.return', kwargs={
return_url=build_absolute_uri(self.event, 'plugins:stripe:sca.return', kwargs={
'order': payment.order.code,
'payment': payment.pk,
'hash': payment.order.tagged_secret('plugins:stripe'),
+2 -2
View File
@@ -64,7 +64,7 @@ from pretix.control.views.event import DecoupleMixin
from pretix.control.views.organizer import OrganizerDetailViewMixin
from pretix.helpers import OF_SELF
from pretix.helpers.http import redirect_to_url
from pretix.multidomain.urlreverse import eventreverse, eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.plugins.stripe.forms import OrganizerStripeSettingsForm
from pretix.plugins.stripe.models import ReferencedStripeObject
from pretix.plugins.stripe.tasks import (
@@ -90,7 +90,7 @@ def redirect_view(request, *args, **kwargs):
params = request.GET.copy()
params['go'] = '1'
r = render(request, 'pretixplugins/stripe/redirect.html', {
'url': eventreverse_absolute(request.event, 'plugins:stripe:redirect') + '?' + urllib.parse.urlencode(params),
'url': build_absolute_uri(request.event, 'plugins:stripe:redirect') + '?' + urllib.parse.urlencode(params),
})
r._csp_ignore = True
return r
+2 -2
View File
@@ -44,7 +44,7 @@ from pretix.base.forms.questions import (
from pretix.base.i18n import get_language_without_region
from pretix.base.models import Customer
from pretix.helpers.http import get_client_ip
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
class TokenGenerator(PasswordResetTokenGenerator):
@@ -84,7 +84,7 @@ class AuthenticationForm(forms.Form):
self.customer_cache = None
super().__init__(*args, **kwargs)
self.fields['password'].help_text = "<a target='_blank' href='{}'>{}</a>".format(
eventreverse_absolute(False, 'presale:organizer.customer.resetpw', kwargs={
build_absolute_uri(False, 'presale:organizer.customer.resetpw', kwargs={
'organizer': request.organizer.slug,
}),
_('Forgot your password?')
+6 -6
View File
@@ -32,7 +32,7 @@ from django.utils.translation import gettext as _
from pretix.base.email import get_email_context
from pretix.base.models import Event
from pretix.helpers.format import format_map
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
def get_public_ical(events):
@@ -48,9 +48,9 @@ def get_public_ical(events):
event = ev if isinstance(ev, Event) else ev.event
tz = event.timezone
if isinstance(ev, Event):
url = eventreverse_absolute(event, 'presale:event.index')
url = build_absolute_uri(event, 'presale:event.index')
else:
url = eventreverse_absolute(event, 'presale:event.index', {
url = build_absolute_uri(event, 'presale:event.index', {
'subevent': ev.pk
})
@@ -134,7 +134,7 @@ def get_private_icals(event, positions):
program_times = p.item.program_times.all()
if program_times:
# if program times have been configured, they are preferred for the position's calendar entries
url = eventreverse_absolute(event, 'presale:event.index')
url = build_absolute_uri(event, 'presale:event.index')
for index, pt in enumerate(program_times):
summary = _('{event} - {item}').format(event=ev, item=p.item.name)
if event.settings.mail_attach_ical_description:
@@ -167,11 +167,11 @@ def get_private_icals(event, positions):
else:
# without program times, the subevent or event times are used for calendar entries, preferring subevents
if p.subevent:
url = eventreverse_absolute(event, 'presale:event.index', {
url = build_absolute_uri(event, 'presale:event.index', {
'subevent': p.subevent.pk
})
else:
url = eventreverse_absolute(event, 'presale:event.index')
url = build_absolute_uri(event, 'presale:event.index')
if event.settings.mail_attach_ical_description:
ctx = get_email_context(event=event, event_or_subevent=ev)
@@ -9,7 +9,7 @@
{% load anonymize_email %}
{% block thetitle %}
{% if messages %}
{{ messages|join:" " }} ::
{{ messages|join:" " }} ::
{% endif %}
{% block title %}{% endblock %}{% if request.resolver_match.url_name != "event.index" %} :: {% endif %}{{ event.name }}
{% endblock %}
@@ -1,6 +1,7 @@
{% extends "pretixpresale/event/base.html" %}
{% load i18n %}
{% load l10n %}
{% load static %}
{% load eventurl %}
{% load cache_large %}
{% load money %}
@@ -39,6 +40,7 @@
{% else %}
<meta property="og:url" content="{% abseventurl request.event "presale:event.index" %}" />
{% endif %}
<script type="text/javascript" src="{% static "pretixpresale/js/csrfcookieretry.js" %}"></script>
{% endblock %}
{% block content %}
@@ -6,6 +6,7 @@
{% load money %}
{% load expiresformat %}
{% load eventurl %}
{% load static %}
{% load phone_format %}
{% load rich_text %}
{% load getitem %}
@@ -22,6 +23,10 @@
{% endif %}
{% trans "Order details" %}
{% endblock %}
{% block custom_header %}
{{ block.super }}
<script type="text/javascript" src="{% static "pretixpresale/js/csrfcookieretry.js" %}"></script>
{% endblock %}
{% block content %}
{% if "thanks" in request.GET or "paid" in request.GET %}
<div class="thank-you">
+2 -2
View File
@@ -59,7 +59,7 @@ from pretix.base.timemachine import time_machine_now_assigned_from_request
from pretix.helpers.http import redirect_to_url
from pretix.multidomain.models import KnownDomain
from pretix.multidomain.urlreverse import (
eventreverse_absolute, get_event_domain, get_organizer_domain,
build_absolute_uri, get_event_domain, get_organizer_domain,
)
from pretix.presale.signals import process_request, process_response
@@ -283,7 +283,7 @@ def _detect_event(request, require_live=True, require_plugin=None):
domain, domainmode = get_event_domain(request.event, fallback=False, return_mode=True)
if not domain and request_domain_mode == KnownDomain.MODE_ORG_ALT_DOMAIN:
path = request.get_full_path().split("/", 2)[-1]
r = redirect_to_url(eventreverse_absolute(request.event, "presale:event.index") + path)
r = redirect_to_url(build_absolute_uri(request.event, "presale:event.index") + path)
r['Access-Control-Allow-Origin'] = '*'
return r
elif domain and domain != request.host:
+6 -8
View File
@@ -56,7 +56,7 @@ from pretix.base.signals import customer_created, customer_signed_in
from pretix.helpers.compat import CompatDeleteView
from pretix.helpers.http import redirect_to_url
from pretix.multidomain.models import KnownDomain
from pretix.multidomain.urlreverse import eventreverse, eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.presale.forms.customer import (
AuthenticationForm, ChangeInfoForm, ChangePasswordForm, RegistrationForm,
ResetPasswordForm, SetPasswordForm, TokenGenerator,
@@ -316,10 +316,8 @@ class ResetPasswordView(FormView):
customer.log_action('pretix.customer.password.resetrequested', {})
ctx = customer.get_email_context()
token = TokenGenerator().make_token(customer)
ctx['url'] = eventreverse_absolute(
self.request.organizer,
'presale:organizer.customer.recoverpw'
) + '?id=' + customer.identifier + '&token=' + token
ctx['url'] = build_absolute_uri(self.request.organizer,
'presale:organizer.customer.recoverpw') + '?id=' + customer.identifier + '&token=' + token
mail(
customer.email,
self.request.organizer.settings.mail_subject_customer_reset,
@@ -576,7 +574,7 @@ class ChangeInformationView(CustomerAccountBaseMixin, FormView):
new_email = form.cleaned_data['email']
form.cleaned_data['email'] = form.instance.email = self.initial_email
ctx = form.instance.get_email_context()
ctx['url'] = eventreverse_absolute(
ctx['url'] = build_absolute_uri(
self.request.organizer,
'presale:organizer.customer.change.confirm'
) + '?token=' + dumps({
@@ -705,7 +703,7 @@ class SSOLoginView(RedirectBackMixin, View):
request.session[f'pretix_customerauth_{self.provider.pk}_nonce'] = nonce
request.session[f'pretix_customerauth_{self.provider.pk}_popup_origin'] = popup_origin
request.session[f'pretix_customerauth_{self.provider.pk}_cross_domain_requested'] = self.request.GET.get("request_cross_domain_customer_auth") == "true"
redirect_uri = eventreverse_absolute(self.request.organizer, 'presale:organizer.customer.login.return', kwargs={
redirect_uri = build_absolute_uri(self.request.organizer, 'presale:organizer.customer.login.return', kwargs={
'provider': self.provider.pk
})
@@ -779,7 +777,7 @@ class SSOLoginReturnView(RedirectBackMixin, View):
),
popup_origin,
)
redirect_uri = eventreverse_absolute(
redirect_uri = build_absolute_uri(
self.request.organizer, 'presale:organizer.customer.login.return',
kwargs={
'provider': self.provider.pk
+6 -6
View File
@@ -46,7 +46,7 @@ from pretix.base.models.customers import (
)
from pretix.helpers.http import redirect_to_url
from pretix.multidomain.middlewares import CsrfViewMiddleware
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.forms.customer import AuthenticationForm
from pretix.presale.utils import customer_login, get_customer_auth_time
@@ -519,17 +519,17 @@ class ConfigurationView(View):
def get(self, request, *args, **kwargs):
return JsonResponse({
'issuer': eventreverse_absolute(request.organizer, 'presale:organizer.index').rstrip('/'),
'authorization_endpoint': eventreverse_absolute(
'issuer': build_absolute_uri(request.organizer, 'presale:organizer.index').rstrip('/'),
'authorization_endpoint': build_absolute_uri(
request.organizer, 'presale:organizer.oauth2.v1.authorize'
),
'token_endpoint': eventreverse_absolute(
'token_endpoint': build_absolute_uri(
request.organizer, 'presale:organizer.oauth2.v1.token'
),
'userinfo_endpoint': eventreverse_absolute(
'userinfo_endpoint': build_absolute_uri(
request.organizer, 'presale:organizer.oauth2.v1.userinfo'
),
'jwks_uri': eventreverse_absolute(
'jwks_uri': build_absolute_uri(
request.organizer, 'presale:organizer.oauth2.v1.jwks'
),
'scopes_supported': [k for k, v in CustomerSSOClient.SCOPE_CHOICES],
+2 -2
View File
@@ -89,7 +89,7 @@ from pretix.base.views.mixins import OrderQuestionsViewMixin
from pretix.base.views.tasks import AsyncAction
from pretix.helpers.http import redirect_to_url
from pretix.helpers.safedownload import check_token
from pretix.multidomain.urlreverse import eventreverse, eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.presale.forms.checkout import InvoiceAddressForm, QuestionsForm
from pretix.presale.forms.order import OrderPositionChangeForm
from pretix.presale.signals import question_form_fields_overrides
@@ -312,7 +312,7 @@ class OrderDetails(EventViewMixin, OrderDetailMixin, CartMixin, TicketPageMixin,
state__in=[OrderPayment.PAYMENT_STATE_CANCELED, OrderPayment.PAYMENT_STATE_FAILED]
).exists() and self.order.status == Order.STATUS_PENDING:
ctx['generate_invoice_requires'] = 'payment'
ctx['url'] = eventreverse_absolute(
ctx['url'] = build_absolute_uri(
self.request.event, 'presale:event.order', kwargs={
'order': self.order.code,
'secret': self.order.secret
+2 -2
View File
@@ -74,7 +74,7 @@ from pretix.helpers.formats.en.formats import (
from pretix.helpers.http import redirect_to_url
from pretix.helpers.i18n import parse_date_localized
from pretix.helpers.thumb import get_thumbnail
from pretix.multidomain.urlreverse import eventreverse, eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.presale.forms.organizer import EventListFilterForm
from pretix.presale.ical import get_public_ical
from pretix.presale.signals import filter_subevents
@@ -1380,7 +1380,7 @@ class OrganizerFavicon(View):
class RedirectToOrganizerIndex(View):
def get(self, *args, **kwargs):
return redirect_to_url(eventreverse_absolute(self.request.organizer, "presale:organizer.index"))
return redirect_to_url(build_absolute_uri(self.request.organizer, "presale:organizer.index"))
class AccessibilityView(OrganizerViewMixin, EventListMixin, TemplateView):
+6 -6
View File
@@ -65,7 +65,7 @@ from pretix.base.settings import GlobalSettingsObject
from pretix.base.templatetags.rich_text import rich_text
from pretix.helpers.daterange import daterange
from pretix.helpers.thumb import get_thumbnail
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.forms.organizer import meta_filtersets
from pretix.presale.style import get_theme_vars_css
from pretix.presale.views.cart import get_or_create_cart_id
@@ -303,7 +303,7 @@ def get_picture(event, picture, size=None):
logger.exception(f'Failed to create thumbnail of {picture.name}')
if not thumb:
thumb = default_storage.url(picture.name)
return urljoin(eventreverse_absolute(event, 'presale:event.index'), thumb)
return urljoin(build_absolute_uri(event, 'presale:event.index'), thumb)
class WidgetAPIProductList(EventListMixin, View):
@@ -547,7 +547,7 @@ class WidgetAPIProductList(EventListMixin, View):
'location': str(ev.location),
'date_range': self._get_date_range(ev, event, tz=tz),
'availability': self._get_availability(ev, event, tz=tz),
'event_url': eventreverse_absolute(event, 'presale:event.index'),
'event_url': build_absolute_uri(event, 'presale:event.index'),
'subevent': ev.pk if isinstance(ev, SubEvent) else None,
})
return events
@@ -748,7 +748,7 @@ class WidgetAPIProductList(EventListMixin, View):
'location': str(ev.location),
'date_range': self._get_date_range(ev, ev.event, tz),
'availability': self._get_availability(ev, ev.event, tz=tz),
'event_url': eventreverse_absolute(ev.event, 'presale:event.index'),
'event_url': build_absolute_uri(ev.event, 'presale:event.index'),
'subevent': ev.pk,
} for ev in evs
]
@@ -771,7 +771,7 @@ class WidgetAPIProductList(EventListMixin, View):
'location': str(event.location),
'date_range': dr,
'availability': avail,
'event_url': eventreverse_absolute(event, 'presale:event.index'),
'event_url': build_absolute_uri(event, 'presale:event.index'),
})
cache.set(cache_key, data, 30)
@@ -796,7 +796,7 @@ class WidgetAPIProductList(EventListMixin, View):
return self.response(cached_data)
data = {
'target_url': eventreverse_absolute(request.event, 'presale:event.index'),
'target_url': build_absolute_uri(request.event, 'presale:event.index'),
'subevent': self.subevent.pk if self.subevent else None,
'currency': request.event.currency,
'display_net_prices': request.event.settings.display_net_prices,
@@ -0,0 +1,13 @@
document.addEventListener("DOMContentLoaded", () => {
const COOKIE_NAME = "__Host-pretix_csrftoken";
const RELOAD_FLAG = "csrfReloadPerformed";
const hasCookie = document.cookie
.split("; ")
.some((c) => c.startsWith(COOKIE_NAME + "="));
if (!hasCookie && !sessionStorage.getItem(RELOAD_FLAG)) {
sessionStorage.setItem(RELOAD_FLAG, "1");
location.reload();
}
});
+3 -3
View File
@@ -22,17 +22,17 @@
from django import urls
from django.test import override_settings
from pretix.helpers.urls import mainreverse_absolute
from pretix.helpers.urls import build_absolute_uri
def test_site_url_domain():
with override_settings(SITE_URL='https://example.com'):
assert mainreverse_absolute('control:auth.login') == 'https://example.com/control/login'
assert build_absolute_uri('control:auth.login') == 'https://example.com/control/login'
def test_site_url_subpath():
with override_settings(SITE_URL='https://example.com/presale'):
old_prefix = urls.get_script_prefix()
urls.set_script_prefix('/presale/')
assert mainreverse_absolute('control:auth.login') == 'https://example.com/presale/control/login'
assert build_absolute_uri('control:auth.login') == 'https://example.com/presale/control/login'
urls.set_script_prefix(old_prefix)
+5 -5
View File
@@ -26,7 +26,7 @@ from django_scopes import scopes_disabled
from pretix.base.models import Event, Organizer
from pretix.multidomain.models import KnownDomain
from pretix.multidomain.urlreverse import eventreverse, eventreverse_absolute
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.testutils.queries import assert_num_queries
@@ -248,20 +248,20 @@ def test_event_custom_domain_cache_clear(env):
@pytest.mark.django_db
def test_event_main_domain_absolute(env):
assert eventreverse_absolute(env[1], 'presale:event.index') == 'http://example.com/mrmcd/2015/'
assert build_absolute_uri(env[1], 'presale:event.index') == 'http://example.com/mrmcd/2015/'
@pytest.mark.django_db
def test_event_custom_domain_absolute(env):
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
KnownDomain.objects.create(domainname='barfoo', organizer=env[0], event=env[1])
assert eventreverse_absolute(env[1], 'presale:event.index') == 'http://barfoo/'
assert build_absolute_uri(env[1], 'presale:event.index') == 'http://barfoo/'
@pytest.mark.django_db
def test_event_org_domain_absolute(env):
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
assert eventreverse_absolute(env[1], 'presale:event.index') == 'http://foobar/2015/'
assert build_absolute_uri(env[1], 'presale:event.index') == 'http://foobar/2015/'
@pytest.mark.django_db
@@ -269,4 +269,4 @@ def test_event_org_alt_domain_absolute(env):
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
d = KnownDomain.objects.create(domainname='altfoo', organizer=env[0], mode=KnownDomain.MODE_ORG_ALT_DOMAIN)
d.event_assignments.create(event=env[1])
assert eventreverse_absolute(env[1], 'presale:event.index') == 'http://altfoo/2015/'
assert build_absolute_uri(env[1], 'presale:event.index') == 'http://altfoo/2015/'