Compare commits

...

30 Commits

Author SHA1 Message Date
Raphael Michel
5af7e1b6d6 Silence useless log messages from celery in dev 2026-01-09 17:31:17 +01:00
luelista
9222ce0ecd datasync: Fix configuring value mappings on newly added property mappings (Z#23217990) (#5793) 2026-01-09 16:11:32 +01:00
dependabot[bot]
8afb0e43e0 Update sentry-sdk requirement from ==2.48.* to ==2.49.* (#5788)
Updates the requirements on [sentry-sdk](https://github.com/getsentry/sentry-python) to permit the latest version.
- [Release notes](https://github.com/getsentry/sentry-python/releases)
- [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-python/compare/2.48.0...2.49.0)

---
updated-dependencies:
- dependency-name: sentry-sdk
  dependency-version: 2.49.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-09 13:36:20 +01:00
Raphael Michel
c65fecf45e Fix #5765 -- Email rendering: Ampersands and placeholders in URLs (#5766) 2026-01-09 13:01:21 +01:00
George Hickman
1c684d62d4 Get the Organizer of organizer-level plugin log entries directly (#5784) 2026-01-08 14:41:34 +01:00
dependabot[bot]
48809dc477 Update dnspython requirement from ==2.7.* to ==2.8.* (#5770)
Updates the requirements on [dnspython](https://github.com/rthalley/dnspython) to permit the latest version.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/main/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.7.0rc1...v2.8.0)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-version: 2.8.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 13:13:20 +01:00
dependabot[bot]
71df116079 Bump django-bootstrap3 from 25.2 to 26.1 (#5764)
Bumps [django-bootstrap3](https://github.com/zostera/django-bootstrap3) from 25.2 to 26.1.
- [Changelog](https://github.com/zostera/django-bootstrap3/blob/main/CHANGELOG.md)
- [Commits](https://github.com/zostera/django-bootstrap3/compare/v25.2...v26.1)

---
updated-dependencies:
- dependency-name: django-bootstrap3
  dependency-version: '26.1'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 13:12:46 +01:00
dependabot[bot]
ad64f6e88b Update pillow requirement from ==11.3.* to ==12.1.* (#5768)
Updates the requirements on [pillow](https://github.com/python-pillow/Pillow) to permit the latest version.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/11.3.0...12.1.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-version: 12.1.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 12:42:49 +01:00
dependabot[bot]
891ba9d99c Update django-phonenumber-field requirement from ==8.3.* to ==8.4.* (#5771)
Updates the requirements on [django-phonenumber-field](https://github.com/stefanfoulis/django-phonenumber-field) to permit the latest version.
- [Release notes](https://github.com/stefanfoulis/django-phonenumber-field/releases)
- [Changelog](https://github.com/django-phonenumber-field/django-phonenumber-field/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/stefanfoulis/django-phonenumber-field/compare/8.3.0...8.4.0)

---
updated-dependencies:
- dependency-name: django-phonenumber-field
  dependency-version: 8.4.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 12:42:39 +01:00
dependabot[bot]
5cd1476a07 Update bleach requirement from ==6.2.* to ==6.3.* (#5767)
Updates the requirements on [bleach](https://github.com/mozilla/bleach) to permit the latest version.
- [Changelog](https://github.com/mozilla/bleach/blob/main/CHANGES)
- [Commits](https://github.com/mozilla/bleach/compare/v6.2.0...v6.3.0)

---
updated-dependencies:
- dependency-name: bleach
  dependency-version: 6.3.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 12:40:54 +01:00
dependabot[bot]
cb393a0b31 Bump markdown from 3.9 to 3.10 (#5757)
Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.9 to 3.10.
- [Release notes](https://github.com/Python-Markdown/markdown/releases)
- [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md)
- [Commits](https://github.com/Python-Markdown/markdown/compare/3.9.0...3.10.0)

---
updated-dependencies:
- dependency-name: markdown
  dependency-version: '3.10'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 12:39:45 +01:00
dependabot[bot]
af59a89ecb Update pytest requirement from ==8.4.* to ==9.0.* (#5763)
Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.4.0.dev0...9.0.2)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 9.0.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 12:39:21 +01:00
dependabot[bot]
1eb0008da9 Update isort requirement from ==6.1.* to ==7.0.* (#5760)
Updates the requirements on [isort](https://github.com/PyCQA/isort) to permit the latest version.
- [Release notes](https://github.com/PyCQA/isort/releases)
- [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PyCQA/isort/compare/6.1.0...7.0.0)

---
updated-dependencies:
- dependency-name: isort
  dependency-version: 7.0.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 12:39:14 +01:00
dependabot[bot]
d6489c6dd8 Bump django-compressor from 4.5.1 to 4.6.0 (#5759)
Bumps [django-compressor](https://github.com/django-compressor/django-compressor) from 4.5.1 to 4.6.0.
- [Changelog](https://github.com/django-compressor/django-compressor/blob/develop/docs/changelog.txt)
- [Commits](https://github.com/django-compressor/django-compressor/compare/4.5.1...4.6)

---
updated-dependencies:
- dependency-name: django-compressor
  dependency-version: 4.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 12:38:44 +01:00
dependabot[bot]
abe6acc9d8 Update redis requirement from ==7.0.* to ==7.1.* (#5758)
Updates the requirements on [redis](https://github.com/redis/redis-py) to permit the latest version.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v7.0.0b1...v7.1.0)

---
updated-dependencies:
- dependency-name: redis
  dependency-version: 7.1.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 12:38:21 +01:00
dependabot[bot]
2dcbb791f0 Update sphinx-rtd-theme requirement from ~=3.1.0rc1 to ~=3.1.0rc2 (#5777)
Updates the requirements on [sphinx-rtd-theme](https://github.com/readthedocs/sphinx_rtd_theme) to permit the latest version.
- [Changelog](https://github.com/readthedocs/sphinx_rtd_theme/blob/master/docs/changelog.rst)
- [Commits](https://github.com/readthedocs/sphinx_rtd_theme/compare/3.1.0rc1...3.1.0rc2)

---
updated-dependencies:
- dependency-name: sphinx-rtd-theme
  dependency-version: 3.1.0rc2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 11:24:33 +01:00
dependabot[bot]
2efc40e20b Update django-otp requirement from ==1.6.* to ==1.7.* (#5779)
Updates the requirements on [django-otp](https://github.com/django-otp/django-otp) to permit the latest version.
- [Changelog](https://github.com/django-otp/django-otp/blob/master/CHANGES.rst)
- [Commits](https://github.com/django-otp/django-otp/compare/v1.6.0...v1.7.0)

---
updated-dependencies:
- dependency-name: django-otp
  dependency-version: 1.7.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 11:24:13 +01:00
Raphael Michel
0693681473 Drop support for Python 3.9 (#5783) 2026-01-08 11:22:58 +01:00
Jiří Pastrňák
3aabc8a163 Translations: Update Czech
Currently translated at 94.4% (240 of 254 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/cs/

powered by weblate
2026-01-08 11:19:59 +01:00
Jiří Pastrňák
062f8fa409 Translations: Update Czech
Currently translated at 69.9% (4333 of 6193 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/cs/

powered by weblate
2026-01-08 11:19:59 +01:00
CVZ-es
106339c928 Translations: Update Spanish
Currently translated at 100.0% (6193 of 6193 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/es/

powered by weblate
2026-01-08 11:19:59 +01:00
CVZ-es
222ea08dd0 Translations: Update French
Currently translated at 100.0% (6193 of 6193 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2026-01-08 11:19:59 +01:00
Raphael Michel
62bc16f963 Translation status: Properly account for plurals 2026-01-07 09:20:37 +01:00
Raphael Michel
3332fc818a Update Peppol ID list
https://docs.peppol.eu/edelivery/codelists/changelog.html
2026-01-06 17:10:23 +01:00
Raphael Michel
d87dbaf9e5 Docs: Update sphinx from 7.x to 9.x (#5755)
* Docs: Update sphinx from 7.x to 9.x

* Update docs.yml
2026-01-06 16:21:33 +01:00
CVZ-es
67580c4ca5 Translations: Update French
Currently translated at 99.8% (6182 of 6193 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2026-01-06 15:48:14 +01:00
et15
c5b32484b1 Translations: Update German
Currently translated at 100.0% (6193 of 6193 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2026-01-06 15:48:14 +01:00
Jiří Pastrňák
b5560509ad Translations: Update Czech
Currently translated at 69.7% (4319 of 6193 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/cs/

powered by weblate
2026-01-06 15:48:14 +01:00
Luca Sorace "Stranck
c78365ce43 API: Fix race conditions in OrderChangeSerializer (#5756)
* OrderPositionCreateForExistingOrderSerializer.create: Fix race condition

* OrderFeeCreateForExistingOrderSerializer.create: Fix race condition

* OrderChange API serializers: Fix import orders
2026-01-06 15:46:41 +01:00
Luca Sorace "Stranck
8cc12fa1c7 OrderChangeManager: add_position() returns a handle to the newly created position (#5557)
* OrderChangeManager: Add support for custom operations

* OrderChangeManager: Add callback to AddPosition operation

This is also meant as a way to fix #5548

* Refs #5557: Checkstyle fix

* Refs #5557: Added tests

* Refs #5557: Changes requested in the PR review

* Refs #5557: Fix error in previous merge conflict

* Refs #5557: PR review
2026-01-05 17:34:53 +01:00
24 changed files with 598 additions and 591 deletions

View File

@@ -26,10 +26,10 @@ jobs:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
- name: Set up Python 3.13
uses: actions/setup-python@v5
with:
python-version: 3.11
python-version: 3.13
- uses: actions/cache@v4
with:
path: ~/.cache/pip

View File

@@ -23,13 +23,13 @@ jobs:
name: Tests
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11"]
python-version: ["3.10", "3.11", "3.13"]
database: [sqlite, postgres]
exclude:
- database: sqlite
python-version: "3.9"
- database: sqlite
python-version: "3.10"
- database: sqlite
python-version: "3.11"
services:
postgres:
image: postgres:15

View File

@@ -6,10 +6,14 @@
{%- else %}
{%- set titlesuffix = "" %}
{%- endif %}
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
{# Build sphinx_version_info tuple from sphinx_version string in pure Jinja #}
{%- set (_ver_major, _ver_minor) = (sphinx_version.split('.') | list)[:2] | map('int') -%}
{%- set sphinx_version_info = (_ver_major, _ver_minor, -1) -%}
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<html class="writer-html5" lang="{{ lang_attr }}"{% if sphinx_version_info >= (7, 2) %} data-content_root="{{ content_root }}"{% endif %}>
<head>
<meta charset="utf-8">
{{ metatags }}
@@ -18,59 +22,50 @@
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
{% endblock %}
{#- CSS #}
{%- for css in css_files %}
{%- if css|attr("rel") %}
<link rel="{{ css.rel }}" href="{{ pathto(css.filename, 1) }}" type="text/css"{% if css.title is not none %} title="{{ css.title }}"{% endif %} />
{#- CSS #}
{%- for css_file in css_files %}
{%- if css_file|attr("filename") %}
{{ css_tag(css_file) }}
{%- else %}
<link rel="stylesheet" href="{{ pathto(css, 1) }}" type="text/css" />
<link rel="stylesheet" href="{{ pathto(css_file, 1)|escape }}" type="text/css" />
{%- endif %}
{%- endfor %}
{%- endfor %}
{%- for cssfile in extra_css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{%- endfor -%}
{#- FAVICON #}
{%- if favicon_url %}
<link rel="shortcut icon" href="{{ favicon_url }}"/>
{%- endif %}
{#- FAVICON
favicon_url is the only context var necessary since Sphinx 4.
In Sphinx<4, we use favicon but need to prepend path info.
#}
{%- set _favicon_url = favicon_url | default(pathto('_static/' + (favicon or ""), 1)) %}
{%- if favicon_url or favicon %}
<link rel="shortcut icon" href="{{ _favicon_url }}"/>
{%- endif %}
{#- CANONICAL URL (deprecated) #}
{%- if theme_canonical_url and not pageurl %}
{#- CANONICAL URL (deprecated) #}
{%- if theme_canonical_url and not pageurl %}
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
{%- endif -%}
{%- endif -%}
{#- CANONICAL URL #}
{%- if pageurl %}
{#- CANONICAL URL #}
{%- if pageurl %}
<link rel="canonical" href="{{ pageurl|e }}" />
{%- endif -%}
{%- endif -%}
{#- JAVASCRIPTS #}
{%- block scripts %}
<!--[if lt IE 9]>
<script src="{{ pathto('_static/js/html5shiv.min.js', 1) }}"></script>
<![endif]-->
{%- if not embedded %}
{# XXX Sphinx 1.8.0 made this an external js-file, quick fix until we refactor the template to inherert more blocks directly from sphinx #}
{%- for scriptfile in script_files %}
{{ js_tag(scriptfile) }}
{%- endfor %}
{#- JAVASCRIPTS #}
{%- block scripts %}
{%- if not embedded %}
{%- for scriptfile in script_files %}
{{ js_tag(scriptfile) }}
{%- endfor %}
<script src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{%- if READTHEDOCS or DEBUG %}
<script src="{{ pathto('_static/js/versions.js', 1) }}"></script>
{%- endif %}
{#- OPENSEARCH #}
{%- if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml"
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
href="{{ pathto('_static/opensearch.xml', 1) }}"/>
{%- endif %}
{%- endif %}
{%- endblock %}
{%- endif %}
{%- endblock %}
{%- block linktags %}
{%- if hasdoc('about') %}
@@ -123,23 +118,23 @@
{% endblock %}
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
{% block menu %}
{#
The singlehtml builder doesn't handle this toctree call when the
toctree is empty. Skip building this for now.
#}
{% if 'singlehtml' not in builder %}
{% set global_toc = toctree(maxdepth=theme_navigation_depth|int, collapse=theme_collapse_navigation, includehidden=True) %}
{% endif %}
{% if global_toc %}
{{ global_toc }}
{% else %}
{%- block navigation %}
{#- Translators: This is an ARIA section label for the main navigation menu -#}
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="{{ _('Navigation menu') }}">
{%- block menu %}
{%- set toctree = toctree(maxdepth=theme_navigation_depth|int,
collapse=theme_collapse_navigation|tobool,
includehidden=theme_includehidden|tobool,
titles_only=theme_titles_only|tobool) %}
{%- if toctree %}
{{ toctree }}
{%- else %}
<!-- Local TOC -->
<div class="local-toc">{{ toc }}</div>
{% endif %}
{% endblock %}
</div>
{%- endif %}
{%- endblock %}
</div>
{%- endblock %}
{% if theme_display_version %}
{%- set nav_version = version %}
@@ -158,53 +153,42 @@
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
{# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
{% block mobile_nav %}
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="{{ pathto('index') }}">{{ project }}</a>
{% endblock %}
</nav>
<nav class="wy-nav-top" aria-label="{{ _('Mobile navigation menu') }}" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
{%- block mobile_nav %}
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
{%- endblock %}
</nav>
{# PAGE CONTENT #}
<div class="wy-nav-content">
<div class="rst-content">
{% include "breadcrumbs.html" %}
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody" class="section">
{% block body %}{% endblock %}
</div>
<div class="articleComments">
{% block comments %}{% endblock %}
</div>
</div>
{% include "footer.html" %}
<div class="wy-nav-content">
{%- block content %}
{%- if theme_style_external_links|tobool %}
<div class="rst-content style-external-links">
{%- else %}
<div class="rst-content">
{%- endif %}
{% include "breadcrumbs.html" %}
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
{%- block document %}
<div itemprop="articleBody">
{% block body %}{% endblock %}
</div>
{%- if self.comments()|trim %}
<div class="articleComments">
{%- block comments %}{% endblock %}
</div>
{%- endif%}
</div>
{%- endblock %}
{% include "footer.html" %}
</div>
{%- endblock %}
</div>
</div>
</section>
</div>
{% include "versions.html" %}
{% if not embedded %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }},
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}'
};
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{% endif %}
{# RTD hosts this file, so just load on non RTD builds #}
{% if not READTHEDOCS %}
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
@@ -214,7 +198,7 @@
{% if theme_sticky_navigation %}
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation|tobool else 'false' }});
});
</script>
{% endif %}

View File

@@ -1,136 +1,86 @@
{#
basic/layout.html
~~~~~~~~~~~~~~~~~
Master layout template for Sphinx themes.
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
#}
{%- block doctype -%}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
{%- endblock %}
{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
(sidebars != []) %}
{# TEMPLATE VAR SETTINGS #}
{%- set url_root = pathto('', 1) %}
{# XXX necessary? #}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
{%- if not embedded and docstitle %}
{%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
{%- else %}
{%- set titlesuffix = "" %}
{%- endif %}
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
{%- macro relbar() %}
<div class="related">
<h3>{{ _('Navigation') }}</h3>
<ul>
{%- for rellink in rellinks %}
<li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
<a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}"
{{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
{%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
{%- endfor %}
{%- block rootrellink %}
<li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
{%- endblock %}
{%- for parent in parents %}
<li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
{%- endfor %}
{%- block relbaritems %} {% endblock %}
</ul>
</div>
{%- endmacro %}
{# Build sphinx_version_info tuple from sphinx_version string in pure Jinja #}
{%- set (_ver_major, _ver_minor) = (sphinx_version.split('.') | list)[:2] | map('int') -%}
{%- set sphinx_version_info = (_ver_major, _ver_minor, -1) -%}
{%- macro sidebar() %}
{%- if render_sidebar %}
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
{%- block sidebarlogo %}
{%- if logo %}
<p class="logo"><a href="{{ pathto(master_doc) }}">
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
</a></p>
{%- endif %}
{%- endblock %}
{%- if sidebars != None %}
{#- new style sidebar: explicitly include/exclude templates #}
{%- for sidebartemplate in sidebars %}
{%- include sidebartemplate %}
{%- endfor %}
{%- else %}
{#- old style sidebars: using blocks -- should be deprecated #}
{%- block sidebartoc %}
{%- include "localtoc.html" %}
{%- endblock %}
{%- block sidebarrel %}
{%- include "relations.html" %}
{%- endblock %}
{%- block sidebarsourcelink %}
{%- include "sourcelink.html" %}
{%- endblock %}
{%- if customsidebar %}
{%- include customsidebar %}
{%- endif %}
{%- block sidebarsearch %}
{%- include "searchbox.html" %}
{%- endblock %}
{%- endif %}
</div>
</div>
{%- endif %}
{%- endmacro %}
<!DOCTYPE html>
<html class="writer-html5" lang="{{ lang_attr }}"{% if sphinx_version_info >= (7, 2) %} data-content_root="{{ content_root }}"{% endif %}>
<head>
<meta charset="utf-8" />
{%- if READTHEDOCS and not embedded %}
<meta name="readthedocs-addons-api-version" content="1">
{%- endif %}
{{- metatags }}
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{%- block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
{%- endblock -%}
{%- macro script() %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '{{ url_root }}',
VERSION: '{{ release|e }}',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }},
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}'
};
</script>
{#- CSS #}
{%- for css_file in css_files %}
{%- if css_file|attr("filename") %}
{{ css_tag(css_file) }}
{%- else %}
<link rel="stylesheet" href="{{ pathto(css_file, 1)|escape }}" type="text/css" />
{%- endif %}
{%- endfor %}
{#
"extra_css_files" is an undocumented Read the Docs theme specific option.
There is no need to check for ``|attr("filename")`` here because it's always a string.
Note that this option should be removed in favor of regular ``html_css_files``:
https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_css_files
#}
{%- for css_file in extra_css_files %}
<link rel="stylesheet" href="{{ pathto(css_file, 1)|escape }}" type="text/css" />
{%- endfor -%}
{#- FAVICON #}
{%- if favicon_url %}
<link rel="shortcut icon" href="{{ favicon_url }}"/>
{%- endif %}
{#- CANONICAL URL (deprecated) #}
{%- if theme_canonical_url and not pageurl %}
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
{%- endif -%}
{#- CANONICAL URL #}
{%- if pageurl %}
<link rel="canonical" href="{{ pageurl|e }}" />
{%- endif -%}
{#- JAVASCRIPTS #}
{%- block scripts %}
{%- if not embedded %}
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{{ js_tag(scriptfile) }}
{%- endfor %}
{%- endmacro %}
<script src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{%- macro css() %}
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
{%- for cssfile in css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{%- endfor %}
{%- endmacro %}
{%- if READTHEDOCS or DEBUG %}
<script src="{{ pathto('_static/js/versions.js', 1) }}"></script>
{%- endif %}
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
{{ metatags }}
{%- block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
{%- endblock %}
{{ css() }}
{%- if not embedded %}
{{ script() }}
{#- OPENSEARCH #}
{%- if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml"
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
href="{{ pathto('_static/opensearch.xml', 1) }}"/>
{%- endif %}
{%- if favicon %}
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
{%- endif %}
{%- if theme_canonical_url %}
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
{%- endif %}
{%- endif %}
{%- block linktags %}
{%- endif %}
{%- endblock %}
{%- block linktags %}
{%- if hasdoc('about') %}
<link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
{%- endif %}
@@ -143,67 +93,135 @@
{%- if hasdoc('copyright') %}
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
{%- endif %}
<link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
{%- if parents %}
<link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
{%- endif %}
{%- if next %}
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
{%- endif %}
{%- if prev %}
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
{%- endif %}
{%- endblock %}
{%- block extrahead %} {% endblock %}
</head>
<body>
{%- block header %}{% endblock %}
{%- block relbar1 %}{{ relbar() }}{% endblock %}
{%- block content %}
{%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
<div class="document">
{%- block document %}
<div class="documentwrapper">
{%- if render_sidebar %}
<div class="bodywrapper">
{%- endif %}
<div class="body">
{% block body %} {% endblock %}
</div>
{%- if render_sidebar %}
</div>
{%- endif %}
</div>
{%- endblock %}
{%- block extrahead %} {% endblock %}
</head>
{%- block sidebar2 %}{{ sidebar() }}{% endblock %}
<div class="clearer"></div>
</div>
{%- endblock %}
<body class="wy-body-for-nav">
{%- block relbar2 %}{{ relbar() }}{% endblock %}
{%- block extrabody %} {% endblock %}
<div class="wy-grid-for-nav">
{#- SIDE NAV, TOGGLES ON MOBILE #}
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
{%- block sidebartitle %}
{# the logo helper function was removed in Sphinx 6 and deprecated since Sphinx 4 #}
{# the master_doc variable was renamed to root_doc in Sphinx 4 (master_doc still exists in later Sphinx versions) #}
{%- set _logo_url = logo_url|default(pathto('_static/' + (logo or ""), 1)) %}
{%- set _root_doc = root_doc|default(master_doc) %}
<a href="{{ pathto(_root_doc) }}"{% if not theme_logo_only %} class="icon icon-home"{% endif %}>
{% if not theme_logo_only %}{{ project }}{% endif %}
{%- if logo or logo_url %}
<img src="{{ _logo_url }}" class="logo" alt="{{ _('Logo') }}"/>
{%- endif %}
</a>
{%- if READTHEDOCS or DEBUG %}
{%- if theme_version_selector or theme_language_selector %}
<div class="switch-menus">
<div class="version-switch"></div>
<div class="language-switch"></div>
</div>
{%- endif %}
{%- endif %}
{%- include "searchbox.html" %}
{%- endblock %}
</div>
{%- block navigation %}
{#- Translators: This is an ARIA section label for the main navigation menu -#}
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="{{ _('Navigation menu') }}">
{%- block menu %}
{%- set toctree = toctree(maxdepth=theme_navigation_depth|int,
collapse=theme_collapse_navigation|tobool,
includehidden=theme_includehidden|tobool,
titles_only=theme_titles_only|tobool) %}
{%- if toctree %}
{{ toctree }}
{%- else %}
<!-- Local TOC -->
<div class="local-toc">{{ toc }}</div>
{%- endif %}
{%- endblock %}
</div>
{%- endblock %}
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
{#- MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
{#- Translators: This is an ARIA section label for the navigation menu that is visible when viewing the page on mobile devices -#}
<nav class="wy-nav-top" aria-label="{{ _('Mobile navigation menu') }}" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
{%- block mobile_nav %}
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
{%- endblock %}
</nav>
<div class="wy-nav-content">
{%- block content %}
{%- if theme_style_external_links|tobool %}
<div class="rst-content style-external-links">
{%- else %}
<div class="rst-content">
{%- endif %}
{% include "breadcrumbs.html" %}
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
{%- block document %}
<div itemprop="articleBody">
{% block body %}{% endblock %}
</div>
{%- if self.comments()|trim %}
<div class="articleComments">
{%- block comments %}{% endblock %}
</div>
{%- endif%}
</div>
{%- endblock %}
{% include "footer.html" %}
</div>
{%- endblock %}
</div>
</section>
</div>
{% include "versions.html" -%}
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation|tobool else 'false' }});
});
</script>
{#- Do not conflict with RTD insertion of analytics script #}
{%- if not READTHEDOCS %}
{%- if theme_analytics_id %}
<!-- Theme Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ theme_analytics_id }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ theme_analytics_id }}', {
'anonymize_ip': {{ 'true' if theme_analytics_anonymize_ip|tobool else 'false' }},
});
</script>
{%- block footer %}
<div class="footer">
{%- if show_copyright %}
{%- if hasdoc('copyright') %}
{% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
{%- else %}
{% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
{%- endif %}
{%- endif %}
{%- if last_updated %}
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
{%- endif %}
{%- if show_sphinx %}
{% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx-doc.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
{%- endif %}
</div>
<p>asdf asdf asdf asdf 22</p>
{%- endblock %}
</body>
</html>
{%- endif %}
{%- block footer %} {% endblock %}
</body>
</html>

View File

@@ -39,7 +39,7 @@ as well as the type of underlying hardware. Example:
"rsa_pubkey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqh…nswIDAQAB\n-----END PUBLIC KEY-----\n"
}
The ``rsa_pubkey`` is optional any only required for certain fatures such as working with reusable
The ``rsa_pubkey`` is optional any only required for certain features such as working with reusable
media and NFC cryptography.
Every initialization token can only be used once. On success, you will receive a response containing

View File

@@ -46,28 +46,28 @@ Endpoints
Vary: Accept
Content-Type: application/json
{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"start": "2025-08-14T22:00:00Z",
"end": "2025-08-15T00:00:00Z"
},
{
"id": 3,
"start": "2025-08-12T22:00:00Z",
"end": "2025-08-13T22:00:00Z"
},
{
"id": 14,
"start": "2025-08-15T22:00:00Z",
"end": "2025-08-17T22:00:00Z"
}
]
}
{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"start": "2025-08-14T22:00:00Z",
"end": "2025-08-15T00:00:00Z"
},
{
"id": 3,
"start": "2025-08-12T22:00:00Z",
"end": "2025-08-13T22:00:00Z"
},
{
"id": 14,
"start": "2025-08-15T22:00:00Z",
"end": "2025-08-17T22:00:00Z"
}
]
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch

View File

@@ -1,9 +1,8 @@
sphinx==7.4.*
jinja2==3.1.*
sphinx-rtd-theme
sphinxcontrib-httpdomain
sphinxcontrib-images
sphinxcontrib-jquery
sphinxcontrib-spelling==8.*
sphinxemoji
sphinx==9.1.*
sphinx-rtd-theme~=3.1.0rc2
sphinxcontrib-httpdomain~=1.8.1
sphinxcontrib-images~=1.0.1
sphinxcontrib-jquery~=4.1
sphinxcontrib-spelling~=8.0.2
sphinxemoji~=0.3.2
pyenchant==3.3.*

View File

@@ -1,10 +1,9 @@
-e ../
sphinx==7.4.*
jinja2==3.1.*
sphinx-rtd-theme
sphinxcontrib-httpdomain
sphinxcontrib-images
sphinxcontrib-jquery
sphinxcontrib-spelling==8.*
sphinxemoji
sphinx==9.1.*
sphinx-rtd-theme~=3.1.0rc2
sphinxcontrib-httpdomain~=1.8.1
sphinxcontrib-images~=1.0.1
sphinxcontrib-jquery~=4.1
sphinxcontrib-spelling~=8.0.2
sphinxemoji~=0.3.2
pyenchant==3.3.*

View File

@@ -3,7 +3,7 @@ name = "pretix"
dynamic = ["version"]
description = "Reinventing presales, one ticket at a time"
readme = "README.rst"
requires-python = ">=3.9"
requires-python = ">=3.10"
license = {file = "LICENSE"}
keywords = ["tickets", "web", "shop", "ecommerce"]
authors = [
@@ -29,7 +29,7 @@ dependencies = [
"arabic-reshaper==3.0.0", # Support for Arabic in reportlab
"babel",
"BeautifulSoup4==4.14.*",
"bleach==6.2.*",
"bleach==6.3.*",
"celery==5.6.*",
"chardet==5.2.*",
"cryptography>=44.0.0",
@@ -37,8 +37,8 @@ dependencies = [
"defusedcsv>=1.1.0",
"dnspython==2.*",
"Django[argon2]==4.2.*,>=4.2.26",
"django-bootstrap3==25.2",
"django-compressor==4.5.1",
"django-bootstrap3==26.1",
"django-compressor==4.6.0",
"django-countries==8.2.*",
"django-filter==25.1",
"django-formset-js-improved==0.5.0.4",
@@ -50,13 +50,13 @@ dependencies = [
"django-localflavor==5.0",
"django-markup",
"django-oauth-toolkit==2.3.*",
"django-otp==1.6.*",
"django-phonenumber-field==8.3.*",
"django-otp==1.7.*",
"django-phonenumber-field==8.4.*",
"django-redis==6.0.*",
"django-scopes==2.0.*",
"django-statici18n==2.6.*",
"djangorestframework==3.16.*",
"dnspython==2.7.*",
"dnspython==2.8.*",
"drf_ujson2==1.7.*",
"geoip2==5.*",
"importlib_metadata==8.*", # Polyfill, we can probably drop this once we require Python 3.10+
@@ -65,7 +65,7 @@ dependencies = [
"kombu==5.6.*",
"libsass==0.23.*",
"lxml",
"markdown==3.9", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
"markdown==3.10", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
# We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7
"mt-940==4.30.*",
"oauthlib==3.3.*",
@@ -75,7 +75,7 @@ dependencies = [
"paypal-checkout-serversdk==1.0.*",
"PyJWT==2.10.*",
"phonenumberslite==9.0.*",
"Pillow==11.3.*",
"Pillow==12.1.*",
"pretix-plugin-build",
"protobuf==6.33.*",
"psycopg2-binary",
@@ -89,10 +89,10 @@ dependencies = [
"pytz-deprecation-shim==0.1.*",
"pyuca",
"qrcode==8.2",
"redis==7.0.*",
"redis==7.1.*",
"reportlab==4.4.*",
"requests==2.32.*",
"sentry-sdk==2.48.*",
"sentry-sdk==2.49.*",
"sepaxml==2.7.*",
"stripe==7.9.*",
"text-unidecode==1.*",
@@ -113,7 +113,7 @@ dev = [
"fakeredis==2.33.*",
"flake8==7.3.*",
"freezegun",
"isort==6.1.*",
"isort==7.0.*",
"pep8-naming==0.15.*",
"potypo",
"pytest-asyncio>=0.24",
@@ -123,7 +123,7 @@ dev = [
"pytest-mock==3.15.*",
"pytest-sugar",
"pytest-xdist==3.8.*",
"pytest==8.4.*",
"pytest==9.0.*",
"responses",
]

View File

@@ -33,7 +33,7 @@ from pretix.api.serializers.order import (
OrderFeeCreateSerializer, OrderPositionCreateSerializer,
)
from pretix.base.models import ItemVariation, Order, OrderFee, OrderPosition
from pretix.base.services.orders import OrderError
from pretix.base.services.orders import OrderChangeManager, OrderError
from pretix.base.settings import COUNTRIES_WITH_STATE_IN_ADDRESS
logger = logging.getLogger(__name__)
@@ -82,11 +82,11 @@ class OrderPositionCreateForExistingOrderSerializer(OrderPositionCreateSerialize
return data
def create(self, validated_data):
ocm = self.context['ocm']
ocm: OrderChangeManager = self.context['ocm']
check_quotas = self.context.get('check_quotas', True)
try:
ocm.add_position(
new_position = ocm.add_position(
item=validated_data['item'],
variation=validated_data.get('variation'),
price=validated_data.get('price'),
@@ -98,7 +98,7 @@ class OrderPositionCreateForExistingOrderSerializer(OrderPositionCreateSerialize
)
if self.context.get('commit', True):
ocm.commit(check_quotas=check_quotas)
return validated_data['order'].positions.order_by('-positionid').first()
return new_position.position
else:
return OrderPosition() # fake to appease DRF
except OrderError as e:
@@ -131,7 +131,7 @@ class OrderFeeCreateForExistingOrderSerializer(OrderFeeCreateSerializer):
return data
def create(self, validated_data):
ocm = self.context['ocm']
ocm: OrderChangeManager = self.context['ocm']
try:
f = OrderFee(
@@ -146,7 +146,7 @@ class OrderFeeCreateForExistingOrderSerializer(OrderFeeCreateSerializer):
ocm.add_fee(f)
if self.context.get('commit', True):
ocm.commit()
return validated_data['order'].fees.order_by('-pk').first()
return f
else:
return OrderFee() # fake to appease DRF
except OrderError as e:
@@ -310,7 +310,7 @@ class OrderPositionChangeSerializer(serializers.ModelSerializer):
return data
def update(self, instance, validated_data):
ocm = self.context['ocm']
ocm: OrderChangeManager = self.context['ocm']
check_quotas = self.context.get('check_quotas', True)
current_seat = {'seat_guid': instance.seat.seat_guid} if instance.seat else None
item = validated_data.get('item', instance.item)
@@ -399,7 +399,7 @@ class OrderFeeChangeSerializer(serializers.ModelSerializer):
)
def update(self, instance, validated_data):
ocm = self.context['ocm']
ocm: OrderChangeManager = self.context['ocm']
value = validated_data.get('value', instance.value)
try:

View File

@@ -73,6 +73,9 @@ class PeppolIdValidator:
"0205": "[A-Z0-9]+",
"0221": "T[0-9]{13}",
"0230": ".*",
"0244": "[0-9]{13}",
"0245": "[0-9]{10}",
"0246": "DE[0-9]{9}(-[0-9]{5})?(\\.[0-9A-Z]{1,8})?",
"9901": ".*",
"9902": "[1-9][0-9]{7}",
"9904": "DK[0-9]{8}",
@@ -120,7 +123,6 @@ class PeppolIdValidator:
"9951": ".*",
"9952": ".*",
"9953": ".*",
"9954": ".*",
"9956": "0[0-9]{9}",
"9957": ".*",
"9959": ".*",

View File

@@ -1630,7 +1630,7 @@ class OrderChangeManager:
MembershipOperation = namedtuple('MembershipOperation', ('position', 'membership'))
CancelOperation = namedtuple('CancelOperation', ('position', 'price_diff'))
AddOperation = namedtuple('AddOperation', ('item', 'variation', 'price', 'addon_to', 'subevent', 'seat', 'membership',
'valid_from', 'valid_until', 'is_bundled'))
'valid_from', 'valid_until', 'is_bundled', 'result'))
SplitOperation = namedtuple('SplitOperation', ('position',))
FeeValueOperation = namedtuple('FeeValueOperation', ('fee', 'value', 'price_diff'))
AddFeeOperation = namedtuple('AddFeeOperation', ('fee', 'price_diff'))
@@ -1642,6 +1642,18 @@ class OrderChangeManager:
AddBlockOperation = namedtuple('AddBlockOperation', ('position', 'block_name', 'ignore_from_quota_while_blocked'))
RemoveBlockOperation = namedtuple('RemoveBlockOperation', ('position', 'block_name', 'ignore_from_quota_while_blocked'))
class AddPositionResult:
_position: Optional[OrderPosition]
def __init__(self):
self._position = None
@property
def position(self) -> OrderPosition:
if self._position is None:
raise RuntimeError("Order position has not been created yet. Call commit() first on OrderChangeManager.")
return self._position
def __init__(self, order: Order, user=None, auth=None, notify=True, reissue_invoice=True, allow_blocked_seats=False):
self.order = order
self.user = user
@@ -1846,7 +1858,7 @@ class OrderChangeManager:
def add_position(self, item: Item, variation: ItemVariation, price: Decimal, addon_to: OrderPosition = None,
subevent: SubEvent = None, seat: Seat = None, membership: Membership = None,
valid_from: datetime = None, valid_until: datetime = None):
valid_from: datetime = None, valid_until: datetime = None) -> 'OrderChangeManager.AddPositionResult':
if isinstance(seat, str):
if not seat:
seat = None
@@ -1905,8 +1917,11 @@ class OrderChangeManager:
self._quotadiff.update(new_quotas)
if seat:
self._seatdiff.update([seat])
result = self.AddPositionResult()
self._operations.append(self.AddOperation(item, variation, price, addon_to, subevent, seat, membership,
valid_from, valid_until, is_bundled))
valid_from, valid_until, is_bundled, result))
return result
def split(self, position: OrderPosition):
if self.order.event.settings.invoice_include_free or position.price != Decimal('0.00'):
@@ -2525,6 +2540,7 @@ class OrderChangeManager:
'valid_from': op.valid_from.isoformat() if op.valid_from else None,
'valid_until': op.valid_until.isoformat() if op.valid_until else None,
})
op.result._position = pos
elif isinstance(op, self.SplitOperation):
position = position_cache.setdefault(op.position.pk, op.position)
split_positions.append(position)

View File

@@ -32,13 +32,14 @@
# 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 html
import re
import urllib.parse
import bleach
import markdown
from bleach import DEFAULT_CALLBACKS
from bleach.linkifier import build_email_re, build_url_re
from bleach import DEFAULT_CALLBACKS, html5lib_shim
from bleach.linkifier import build_email_re
from django import template
from django.conf import settings
from django.core import signing
@@ -124,6 +125,23 @@ ALLOWED_ATTRIBUTES = {
ALLOWED_PROTOCOLS = {'http', 'https', 'mailto', 'tel'}
def build_url_re(tlds=tld_set, protocols=html5lib_shim.allowed_protocols):
# Differs from bleach regex by allowing { and } in URL to allow placeholders in URL parameters
return re.compile(
r"""\(* # Match any opening parentheses.
\b(?<![@.])(?:(?:{0}):/{{0,3}}(?:(?:\w+:)?\w+@)?)? # http://
([\w-]+\.)+(?:{1})(?:\:[0-9]+)?(?!\.\w)\b # xx.yy.tld(:##)?
(?:[/?][^\s\|\\\^`<>"]*)?
# /path/zz (excluding "unsafe" chars from RFC 3986,
# except for # and ~, which happen in practice)
""".format(
"|".join(sorted(protocols)), "|".join(sorted(tlds))
),
re.IGNORECASE | re.VERBOSE | re.UNICODE,
)
URL_RE = SimpleLazyObject(lambda: build_url_re(tlds=sorted(tld_set, key=len, reverse=True)))
EMAIL_RE = SimpleLazyObject(lambda: build_email_re(tlds=sorted(tld_set, key=len, reverse=True)))
@@ -333,8 +351,14 @@ def markdown_compile_email(source, allowed_tags=None, allowed_attributes=ALLOWED
# This is a workaround to fix placeholders in URL targets
def context_callback(attrs, new=False):
if (None, "href") in attrs and "{" in attrs[None, "href"]:
# Do not use MODE_RICH_TO_HTML to avoid recursive linkification
attrs[None, "href"] = escape(format_map(attrs[None, "href"], context=context, mode=SafeFormatter.MODE_RICH_TO_PLAIN))
# Do not use MODE_RICH_TO_HTML to avoid recursive linkification.
# We want to esacpe the end result, however, we need to unescape the input to prevent & being turned
# to &amp;amp; because the input is already escaped by the markdown parser.
attrs[None, "href"] = escape(format_map(
html.unescape(attrs[None, "href"]),
context=context,
mode=SafeFormatter.MODE_RICH_TO_PLAIN
))
return attrs
context_callbacks.append(context_callback)

View File

@@ -814,7 +814,7 @@ class OrganizerPluginStateLogEntryType(LogEntryType):
if app and hasattr(app, 'PretixPluginMeta'):
return {
'href': reverse('control:organizer.settings.plugins', kwargs={
'organizer': logentry.event.organizer.slug,
'organizer': logentry.organizer.slug,
}) + '#plugin_' + logentry.parsed_data['plugin'],
'val': app.PretixPluginMeta.name
}

View File

@@ -55,7 +55,7 @@
<div class="col-md-2">
{% bootstrap_field formset.empty_form.overwrite layout='inline' form_group_class="" %}
</div>
{{ f.value_map.as_hidden }}
{{ formset.empty_form.value_map.as_hidden }}
<div class="col-md-2 text-right flip">
<i class="fa fa-warning hidden" data-toggle="tooltip" title=""></i>
<button type="button" class="btn btn-default hidden" data-edit-value-map data-toggle="modal"

View File

@@ -229,7 +229,8 @@ def get_language_score(locale):
if not catalog:
score = 1
else:
score = len(list(catalog.items())) or 1
source_strings = [k[1] if isinstance(k, tuple) else k for k in catalog.keys()]
score = len(set(source_strings)) or 1
return score

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-05 12:12+0000\n"
"PO-Revision-Date: 2026-01-05 14:52+0000\n"
"PO-Revision-Date: 2026-01-08 04:00+0000\n"
"Last-Translator: Jiří Pastrňák <jiri@pastrnak.email>\n"
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix/cs/>"
"\n"
@@ -1881,7 +1881,7 @@ msgstr "IČO"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:99
#: pretix/presale/templates/pretixpresale/event/order.html:327
msgid "VAT ID"
msgstr "DPH"
msgstr "D"
#: pretix/base/exporters/invoices.py:216 pretix/base/exporters/invoices.py:217
#: pretix/base/exporters/invoices.py:218 pretix/base/exporters/invoices.py:219
@@ -1926,7 +1926,7 @@ msgstr "Příjemce"
#: pretix/control/templates/pretixcontrol/order/index.html:1064
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:111
msgid "Internal reference"
msgstr "Interní číslo"
msgstr "Interní označení"
#: pretix/base/exporters/invoices.py:226 pretix/base/models/tax.py:161
#: pretix/control/forms/event.py:1628
@@ -2594,7 +2594,7 @@ msgstr "Kód vstupenky"
#: pretix/base/modelimport_vouchers.py:272
#: pretix/plugins/checkinlists/exporters.py:527
msgid "Seat ID"
msgstr "ID sedadla"
msgstr "ID místa"
#: pretix/base/exporters/orderlist.py:623
#: pretix/plugins/checkinlists/exporters.py:528
@@ -2614,7 +2614,7 @@ msgstr "Řada"
#: pretix/base/exporters/orderlist.py:626
#: pretix/plugins/checkinlists/exporters.py:531
msgid "Seat number"
msgstr "Číslo sedadla"
msgstr "Číslo místa"
#: pretix/base/exporters/orderlist.py:627
#: pretix/control/templates/pretixcontrol/order/change.html:224
@@ -3345,7 +3345,7 @@ msgstr "Prosím uveďte kratší jméno."
#: pretix/base/forms/questions.py:314
msgctxt "phonenumber"
msgid "International area code"
msgstr "PSČ"
msgstr "Mezinárodní předvolba"
#: pretix/base/forms/questions.py:340
msgctxt "phonenumber"
@@ -3561,7 +3561,7 @@ msgstr "Firma nebo instituce"
#: pretix/base/forms/widgets.py:238
msgid "Individual customer"
msgstr "Zákazník"
msgstr "Fyzická osoba"
#: pretix/base/invoicing/email.py:50
msgid "Email invoice directly to accounting department"
@@ -3571,19 +3571,15 @@ msgstr "Zaslat fakturu přímo účetnímu oddělení"
msgid ""
"If not selected, the invoice will be sent to you using the email address "
"listed above."
msgstr ""
msgstr "Pokud tuto možnost nezvolíte, zašleme fakturu na e-mail uvedený výše."
#: pretix/base/invoicing/email.py:55
#, fuzzy
#| msgid "Email address verified"
msgid "Email address for invoice"
msgstr "E-mailová adresa ověřena"
msgstr "E-mail pro zaslání faktury"
#: pretix/base/invoicing/email.py:91
#, fuzzy
#| msgid "Preview email"
msgid "PDF via email"
msgstr "Náhled e-mailu"
msgstr "PDF do e-mailu"
#: pretix/base/invoicing/national.py:37
msgctxt "italian_invoice"
@@ -3642,7 +3638,7 @@ msgstr "Faktura od"
#: pretix/base/invoicing/pdf.py:433
msgctxt "invoice"
msgid "Invoice to"
msgstr "Faktura na"
msgstr "Fakturováno"
#: pretix/base/invoicing/pdf.py:470 pretix/base/invoicing/pdf.py:1221
msgctxt "invoice"
@@ -3672,12 +3668,12 @@ msgstr "Datum zrušení"
#: pretix/base/invoicing/pdf.py:504
msgctxt "invoice"
msgid "Original invoice date"
msgstr "Původní datum faktury"
msgstr "Datum originální faktury"
#: pretix/base/invoicing/pdf.py:511 pretix/base/invoicing/pdf.py:1258
msgctxt "invoice"
msgid "Invoice date"
msgstr "Datum faktury"
msgstr "Datum vystavení"
#: pretix/base/invoicing/pdf.py:527
msgctxt "invoice"
@@ -3704,7 +3700,7 @@ msgstr "Faktura č. {num}"
#, python-brace-format
msgctxt "invoice"
msgid "Customer reference: {reference}"
msgstr "Referenční číslo zákazníka: {reference}"
msgstr "Interní označení: {reference}"
#: pretix/base/invoicing/pdf.py:668
msgctxt "invoice"
@@ -3732,7 +3728,7 @@ msgstr "Faktura"
#: pretix/presale/templates/pretixpresale/event/order.html:244
msgctxt "invoice"
msgid "Cancellation"
msgstr "Zrušení"
msgstr "Storno"
#: pretix/base/invoicing/pdf.py:732 pretix/base/invoicing/pdf.py:740
msgctxt "invoice"
@@ -3768,13 +3764,13 @@ msgstr "Suma"
#, python-brace-format
msgctxt "invoice"
msgid "Single price: {net_price} net / {gross_price} gross"
msgstr "Jednotlivá cena: {net_price} netto / {gross_price} brutto"
msgstr "Jednotková cena: {net_price} netto / {gross_price} brutto"
#: pretix/base/invoicing/pdf.py:900
#, python-brace-format
msgctxt "invoice"
msgid "Single price: {price}"
msgstr "Jednotná cena: {price}"
msgstr "Jednotková cena: {price}"
#: pretix/base/invoicing/pdf.py:943 pretix/base/invoicing/pdf.py:948
msgctxt "invoice"
@@ -3802,12 +3798,10 @@ msgid "Remaining amount"
msgstr "Zbývající částka"
#: pretix/base/invoicing/pdf.py:1008
#, fuzzy, python-brace-format
#| msgctxt "invoice"
#| msgid "Event date: {date_range}"
#, python-brace-format
msgctxt "invoice"
msgid "Invoice period: {daterange}"
msgstr "Datum akce: {date_range}"
msgstr "Fakturované období: {daterange}"
#: pretix/base/invoicing/pdf.py:1039
msgctxt "invoice"
@@ -4175,7 +4169,7 @@ msgstr "Bylo nalezeno více shodných míst."
#: pretix/base/modelimport_orders.py:628
#: pretix/base/modelimport_vouchers.py:293
msgid "No matching seat was found."
msgstr "Nebylo nalezeno žádné odpovídající sedadlo."
msgstr "Nebylo nalezeno žádné odpovídající místo."
#: pretix/base/modelimport_orders.py:631
#: pretix/base/modelimport_vouchers.py:296 pretix/base/services/cart.py:220
@@ -4280,7 +4274,7 @@ msgstr "Pokud si vyberete místo, musíte si vybrat datum."
#: pretix/base/modelimport_vouchers.py:299 pretix/base/models/vouchers.py:516
msgid "You need to choose a specific product if you select a seat."
msgstr "Pokud si vyberete sedadlo, musíte si vybrat konkrétní produkt."
msgstr "Pokud si vyberete místo, musíte zvolit konkrétní produkt."
#: pretix/base/modelimport_vouchers.py:302 pretix/base/models/vouchers.py:519
msgid "Seat-specific vouchers can only be used once."
@@ -4289,7 +4283,7 @@ msgstr "Poukazy na konkrétní místo lze použít pouze jednou."
#: pretix/base/modelimport_vouchers.py:306 pretix/base/models/vouchers.py:522
#, python-brace-format
msgid "You need to choose the product \"{prod}\" for this seat."
msgstr "Pro toto sedadlo je třeba vybrat produkt \"{prod}\"."
msgstr "Pro toto místo je třeba vybrat produkt \"{prod}\"."
#: pretix/base/modelimport_vouchers.py:318 pretix/base/models/vouchers.py:288
#: pretix/control/templates/pretixcontrol/vouchers/index.html:129
@@ -5237,13 +5231,13 @@ msgstr ""
#, python-format
msgctxt "invoice"
msgid "Tax ID: %s"
msgstr "DIČ: %s"
msgstr "IČO: %s"
#: pretix/base/models/invoices.py:240 pretix/base/services/invoices.py:155
#, python-format
msgctxt "invoice"
msgid "VAT-ID: %s"
msgstr "IČO: %s"
msgstr "DIČ: %s"
#: pretix/base/models/items.py:93
msgid "Category name"
@@ -6446,7 +6440,7 @@ msgstr "Objednaný produkt \"{item}\" již není k dispozici."
#: pretix/base/models/orders.py:1066
#, python-brace-format
msgid "The seat \"{seat}\" is no longer available."
msgstr "Sedadlo \"{seat}\" již není k dispozici.."
msgstr "Místo \"{seat}\" již není k dispozici."
#: pretix/base/models/orders.py:1067
#, python-brace-format
@@ -6635,7 +6629,7 @@ msgstr "Obchodní zákazník"
#: pretix/base/models/orders.py:3407
msgid "This reference will be printed on your invoice for your convenience."
msgstr "Tento odkaz bude pro vaše potřeby vytištěn na faktuře."
msgstr "Tato informace bude uvedena na faktuře pro vaše potřeby."
#: pretix/base/models/orders.py:3534
msgid "Transmission type"
@@ -6831,7 +6825,7 @@ msgstr "Řada {number}"
#: pretix/base/models/seating.py:205
#, python-brace-format
msgid "Seat {number}"
msgstr "Sedadlo {number}"
msgstr "Místo {number}"
#: pretix/base/models/tax.py:143
msgid "Standard rates"
@@ -7273,7 +7267,7 @@ msgstr ""
#: pretix/base/models/vouchers.py:507
#, python-brace-format
msgid "The specified seat ID \"{id}\" does not exist for this event."
msgstr "Zadané ID sedadla \"{id}\" pro tuto událost neexistuje."
msgstr "Zadané ID místa \"{id}\" pro tuto událost neexistuje."
#: pretix/base/models/vouchers.py:511
#, python-brace-format
@@ -7314,7 +7308,7 @@ msgstr "Tento produkt není v současné době k dispozici."
#: pretix/base/models/waitinglist.py:186
msgid "No seat with this product is currently available."
msgstr "K tomuto produktu ne v současné době k dispozici žádné sedadlo."
msgstr "K tomuto produktu nejsou v současné době k dispozici žádná místa."
#: pretix/base/models/waitinglist.py:189
msgid "A voucher has already been sent to this person."
@@ -8133,11 +8127,11 @@ msgstr ""
#: pretix/base/pdf.py:505
msgid "Seat: Full name"
msgstr "Sedadlo: Celé jméno"
msgstr "Místo: Celé jméno"
#: pretix/base/pdf.py:506
msgid "Ground floor, Row 3, Seat 4"
msgstr "Přízemí, řada 3, sedadlo 4"
msgstr "Přízemí, řada 3, místo 4"
#: pretix/base/pdf.py:508 pretix/base/pdf.py:514
#: pretix/control/forms/orders.py:344
@@ -8146,7 +8140,7 @@ msgstr "včetně všech daní"
#: pretix/base/pdf.py:511
msgid "Seat: zone"
msgstr "Sedadlo: zóna"
msgstr "Místo: zóna"
#: pretix/base/pdf.py:512
msgid "Ground floor"
@@ -8154,11 +8148,11 @@ msgstr "parket"
#: pretix/base/pdf.py:517
msgid "Seat: row"
msgstr "sedadlo: řada"
msgstr "Místo: řada"
#: pretix/base/pdf.py:522
msgid "Seat: seat number"
msgstr "sedadlo: číslo"
msgstr "Místo: číslo"
#: pretix/base/pdf.py:527
msgid "Date and time of first scan"
@@ -8554,7 +8548,7 @@ msgstr "Tento poukaz není platný pro tento produkt."
#: pretix/base/services/cart.py:191
msgid "This voucher is not valid for this seat."
msgstr "Tento poukaz není platný pro toto sedadlo."
msgstr "Tento poukaz není platný pro toto místo."
#: pretix/base/services/cart.py:193
msgid ""
@@ -10354,11 +10348,8 @@ msgid "Automatic, but prefer invoice date over event date"
msgstr ""
#: pretix/base/settings.py:1169 pretix/base/settings.py:1180
#, fuzzy
#| msgctxt "invoice"
#| msgid "Invoice date"
msgid "Invoice date"
msgstr "Datum faktury"
msgstr "Datum vystavení"
#: pretix/base/settings.py:1173
#, fuzzy
@@ -10411,11 +10402,11 @@ msgstr "ulice Alberta-Einstein 52"
#: pretix/base/settings.py:1299
msgid "Domestic tax ID"
msgstr "Domácí daňové identifikační číslo"
msgstr "Lokální identifikační číslo"
#: pretix/base/settings.py:1300
msgid "e.g. tax number in Germany, ABN in Australia, …"
msgstr "např. daňové číslo v Německu, číslo ABN v Austrálii, …"
msgstr "např. IČO v Česku, daňové číslo v Německu, číslo ABN v Austrálii, …"
#: pretix/base/settings.py:1310
msgid "EU VAT ID"
@@ -12707,7 +12698,7 @@ msgstr "Pan"
#: pretix/base/settings.py:3873
msgctxt "person_name"
msgid "Degree (after name)"
msgstr "titul (za jménem)"
msgstr "Titul (za jménem)"
#: pretix/base/settings.py:3895
msgctxt "person_name_sample"
@@ -12922,7 +12913,7 @@ msgstr "Očekávaný název hostitele podle konfigurace"
#: pretix/base/templates/400_hostname.html:26
msgid "Received headers"
msgstr "Přijaté titulky"
msgstr "Přijaté hlavičky"
#: pretix/base/templates/400_hostname.html:32
msgid "ignored"
@@ -15751,7 +15742,7 @@ msgstr "Doplňkový produkt k"
#: pretix/presale/templates/pretixpresale/event/checkout_membership.html:23
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:101
msgid "Seat"
msgstr "Sedadlo"
msgstr "Místo"
#: pretix/control/forms/orders.py:348
#: pretix/control/templates/pretixcontrol/order/change.html:182
@@ -16557,7 +16548,7 @@ msgstr "Pozice #{posid}: Použité členství bylo změněno."
#: pretix/control/logdisplay.py:117
#, python-brace-format
msgid "Position #{posid}: Seat \"{old_seat}\" changed to \"{new_seat}\"."
msgstr "Pozice #{posid}: Sedadlo \" {old_seat}\" se změnilo na \"{new_seat}\"."
msgstr "Pozice #{posid}: Místo \" {old_seat}\" se změnilo na \"{new_seat}\"."
#: pretix/control/logdisplay.py:127
#, python-brace-format
@@ -18641,7 +18632,7 @@ msgstr "běží v režimu vývoje"
#: pretix/presale/templates/pretixpresale/postmessage.html:27
#: pretix/presale/templates/pretixpresale/waiting.html:42
msgid "If this takes longer than a few minutes, please contact us."
msgstr "Pokud to trvá déle než několik minut, kontaktujte nás."
msgstr "Pokud akce trvá déle než několik minut, kontaktujte nás."
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4
#: pretix/control/templates/pretixcontrol/organizers/devices.html:71
@@ -20238,10 +20229,8 @@ msgid "Invoice customization"
msgstr ""
#: pretix/control/templates/pretixcontrol/event/invoicing.html:79
#, fuzzy
#| msgid "Invoice information"
msgid "Invoice transmission"
msgstr "Informace o faktuře"
msgstr "Způsob doručení faktury"
#: pretix/control/templates/pretixcontrol/event/invoicing.html:81
msgid ""
@@ -21589,9 +21578,8 @@ msgid "August"
msgstr ""
#: pretix/control/templates/pretixcontrol/global_sysreport.html:24
#, fuzzy
msgid "September"
msgstr "Číslo sedadla"
msgstr "Září"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:25
msgid "October"
@@ -22969,7 +22957,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:35
#: pretix/presale/templates/pretixpresale/event/order_modify.html:29
msgid "Invoice information"
msgstr "Informace o faktuře"
msgstr "Fakturační údaje"
#: pretix/control/templates/pretixcontrol/order/change_questions.html:26
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:36
@@ -23311,12 +23299,12 @@ msgstr "Celkem"
#: pretix/control/templates/pretixcontrol/order/index.html:789
#: pretix/presale/templates/pretixpresale/event/order.html:210
msgid "Successful payments"
msgstr ""
msgstr "Úspěšné platby"
#: pretix/control/templates/pretixcontrol/order/index.html:798
#: pretix/presale/templates/pretixpresale/event/order.html:219
msgid "Pending total"
msgstr ""
msgstr "Čeká na platbu"
#: pretix/control/templates/pretixcontrol/order/index.html:824
#: pretix/control/templates/pretixcontrol/search/payments.html:88
@@ -28358,7 +28346,7 @@ msgstr ""
#: pretix/control/views/organizer.py:3483
#: pretix/control/views/organizer.py:3527
msgid "Your changes could not be saved."
msgstr ""
msgstr "Vaše změny nebyly uloženy."
#: pretix/control/views/organizer.py:982
msgid "The selected team cannot be deleted."
@@ -29843,15 +29831,12 @@ msgstr "Částka:"
#: 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 "Na této stránce není nutné provádět další kroky."
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:35
#: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:31
#, fuzzy
msgid "We will send you an email as soon as we received your payment."
msgstr ""
"Jakmile organizátor vaši objednávku schválí nebo zamítne, budeme vás "
"informovat e-mailem."
msgstr "Zašleme vám e-mail, jakmile platbu obdržíme."
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:5
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:7
@@ -30858,7 +30843,7 @@ msgstr "Stránka %d z %d"
#: pretix/plugins/reports/exporters.py:210
#, python-format
msgid "Page %d"
msgstr "Strana %dd"
msgstr "Stránka %dd"
#: pretix/plugins/reports/exporters.py:212
#, python-format
@@ -32713,7 +32698,7 @@ msgstr "Zadávejte prosím pouze čísla."
#: pretix/presale/checkoutflow.py:758
msgctxt "checkoutflow"
msgid "Your information"
msgstr "Informace pro vás"
msgstr "Osobní údaje"
#: pretix/presale/checkoutflow.py:992
msgid ""
@@ -33204,7 +33189,7 @@ msgstr "Váš košík"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:27
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:18
msgid "Cart expired"
msgstr "Nákupní košík vypršel"
msgstr "Rezervace košíku vypršela"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
msgid "Show full cart"
@@ -33244,7 +33229,7 @@ msgstr "Upravit"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:75
msgid "Modify invoice information"
msgstr "Upravit informace na faktuře"
msgstr "Upravit fakturační údaje"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:127
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:19
@@ -33435,7 +33420,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:9
msgid "Before we continue, we need you to answer some questions."
msgstr "Před provedením objednávky prosím odpovězte na níže uvedené otázky."
msgstr "Pro dokončení objednávky potřebujeme následující údaje."
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:49
msgid "Auto-fill with address"
@@ -33449,7 +33434,7 @@ msgstr "Vyplnit formulář"
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:93
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:170
msgid "Copy answers from above"
msgstr "Zkopírujte odpovědi z výše uvedených položek"
msgstr "Zkopírujte odpovědi z předchozího"
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:150
msgid "Auto-fill with profile"
@@ -33574,7 +33559,7 @@ msgstr "Zobrazit varianty"
#: pretix/presale/templates/pretixpresale/event/voucher.html:147
#: pretix/presale/templates/pretixpresale/event/voucher.html:304
msgid "Original price:"
msgstr "Originální cena:"
msgstr "Původní cena:"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:136
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:278
@@ -33722,7 +33707,7 @@ msgstr "Celková cena"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:46
msgid "Seat:"
msgstr "Sedadlo:"
msgstr "Místo:"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:61
msgctxt "subevent"
@@ -33867,16 +33852,12 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
#, fuzzy
#| msgid "Event description"
msgid "Renew reservation"
msgstr "Popis akce"
msgstr "Obnovit rezervaci"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:526
#, fuzzy
#| msgid "Reservation period"
msgid "Reservation renewed"
msgstr "Doba rezervace"
msgstr "Rezervace obnovena"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:532
msgid "Overview of your ordered products."
@@ -34181,14 +34162,12 @@ msgstr "Zobrazit obraz %(item)s v celé velikosti"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:131
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:288
#, fuzzy, python-format
#| msgid "%(count)s event"
#| msgid_plural "%(count)s events"
#, python-format
msgid "%(amount)s× in your cart"
msgid_plural "%(amount)s× in your cart"
msgstr[0] "%(count)s akce"
msgstr[1] "%(count)s akce"
msgstr[2] "%(count)s akcí"
msgstr[0] "%(amount)s× ve vašem košíku"
msgstr[1] "%(amount)s× ve vašem košíku"
msgstr[2] "%(amount)s× ve vašem košíku"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:209
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:374
@@ -34564,7 +34543,7 @@ msgstr "Požádat o fakturu"
#: pretix/presale/templates/pretixpresale/event/order.html:287
msgid "Your information"
msgstr "Informace pro vás"
msgstr "Fakturační údaje"
#: pretix/presale/templates/pretixpresale/event/order.html:290
msgid "Change your information"
@@ -34572,7 +34551,7 @@ msgstr "Změňte své údaje"
#: pretix/presale/templates/pretixpresale/event/order.html:335
msgid "Internal Reference"
msgstr "Interní reference"
msgstr "Interní označení"
#: pretix/presale/templates/pretixpresale/event/order.html:354
msgctxt "action"
@@ -35636,12 +35615,12 @@ msgid ""
"Your cart timeout was extended. Please note that some of the prices in your "
"cart changed."
msgstr ""
"Platnost vašeho košíku byla prodloužena. Berte prosím na vědomí, že ceny "
"některých položek ve vašem košíku se změnily."
#: pretix/presale/views/cart.py:573
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Your cart timeout was extended."
msgstr "Váš košík byl aktualizován."
msgstr "Platnost vašeho košíku byla prodloužena."
#: pretix/presale/views/cart.py:588
msgid "The products have been successfully added to your cart."

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-05 12:13+0000\n"
"PO-Revision-Date: 2025-09-08 18:57+0000\n"
"Last-Translator: Alois Pospíšil <alois.pospisil@gmail.com>\n"
"PO-Revision-Date: 2026-01-08 04:00+0000\n"
"Last-Translator: Jiří Pastrňák <jiri@pastrnak.email>\n"
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
"cs/>\n"
"Language: cs\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 5.13\n"
"X-Generator: Weblate 5.15.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -416,7 +416,7 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276
msgid "If this takes longer than a few minutes, please contact us."
msgstr ""
msgstr "Pokud akce trvá déle než několik minut, kontaktujte nás."
#: pretix/static/pretixbase/js/asynctask.js:331
msgid "Close message"
@@ -734,7 +734,7 @@ msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:49
msgid "Cart expired"
msgstr "Nákupní košík vypršel"
msgstr "Rezervace košíku vypršela"
#: pretix/static/pretixpresale/js/ui/cart.js:58
#: pretix/static/pretixpresale/js/ui/cart.js:84
@@ -753,27 +753,23 @@ msgstr[2] ""
#: pretix/static/pretixpresale/js/ui/cart.js:83
msgid "Your cart has expired."
msgstr "Nákupní košík vypršel."
msgstr "Platnost rezervace vašeho košíku vypršela."
#: pretix/static/pretixpresale/js/ui/cart.js:86
#, fuzzy
#| msgid ""
#| "The items in your cart are no longer reserved for you. You can still "
#| "complete your order as long as theyre available."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as they're available."
msgstr ""
"Produkty v nákupním košíku již nejsou pro vás rezervovány. Pokud je lístek "
"stále dostupný, můžete objednávku dokončit."
"Produkty v nákupním košíku již nejsou rezervovány. Svou objednávku se přesto "
"můžete pokusit dokončit, některé položky však už nemusí být dostupné."
#: pretix/static/pretixpresale/js/ui/cart.js:87
msgid "Do you want to renew the reservation period?"
msgstr ""
msgstr "Chcete obnovit rezervaci košíku?"
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Renew reservation"
msgstr ""
msgstr "Obnovit rezervaci"
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"

View File

@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-05 12:12+0000\n"
"PO-Revision-Date: 2026-01-05 14:44+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"PO-Revision-Date: 2026-01-06 14:46+0000\n"
"Last-Translator: et15 <e.t.tst@live.de>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/"
"de/>\n"
"Language: de\n"
@@ -1521,8 +1521,8 @@ msgid ""
"Only include invoices issued in this time frame. Note that the invoice date "
"does not always correspond to the order or payment date."
msgstr ""
"Nur Rechnungen, die in diesem Zeitraum wurden. Achtung: Das Rechnungsdatum "
"korrespondiert nicht zwingend zum Bestell- oder Zahlungsdatum."
"Nur Rechnungen, die in diesem Zeitraum ausgestellt wurden. Achtung: Das "
"Rechnungsdatum korrespondiert nicht zwingend zum Bestell- oder Zahlungsdatum."
#: pretix/base/exporters/events.py:47
msgid "Event data"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-05 12:12+0000\n"
"PO-Revision-Date: 2025-11-22 23:00+0000\n"
"PO-Revision-Date: 2026-01-06 23:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\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 5.14.3\n"
"X-Generator: Weblate 5.15.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -3870,7 +3870,7 @@ msgstr ""
#: pretix/base/invoicing/peppol.py:164
msgid "The Peppol participant ID is not registered on the Peppol network."
msgstr ""
msgstr "El ID de participante de Peppol no está registrado en la red Peppol."
#: pretix/base/invoicing/peppol.py:184
msgid "Peppol participant ID"
@@ -8445,6 +8445,8 @@ msgid ""
"Some products can no longer be purchased and have been removed from your "
"cart for the following reason: %s"
msgstr ""
"Algunos productos ya no se pueden comprar y se han eliminado de su carrito "
"por el siguiente motivo: %s"
#: pretix/base/services/cart.py:117
msgid ""
@@ -9626,21 +9628,15 @@ msgid "Uncategorized"
msgstr "Sin categorías"
#: pretix/base/services/tax.py:43
#, fuzzy
#| msgid ""
#| "Your VAT ID could not be checked, as the VAT checking service of your "
#| "country is currently not available. We will therefore need to charge VAT "
#| "on your invoice. You can get the tax amount back via the VAT "
#| "reimbursement process."
msgid ""
"Your VAT ID could not be checked, as the VAT checking service of your "
"country is currently not available. We will therefore need to charge you the "
"same tax rate as if you did not enter a VAT ID."
msgstr ""
"Tu Identificador IVA no puede ser chequeado, porque el verificador para tu "
"país no está disponible actualmente. Nosotros deberemos de cargar el IVA en "
"tu compra. Puedes obtener el total del impuesto mediante el proceso de "
"reembolso de IVA."
"No se ha podido verificar su número de identificación fiscal, ya que el "
"servicio de verificación del IVA de su país no está disponible en este "
"momento. Por lo tanto, tendremos que cobrarle el mismo tipo impositivo que "
"si no hubiera introducido ningún número de identificación fiscal."
#: pretix/base/services/tax.py:47 pretix/base/services/tax.py:366
#: pretix/base/services/tax.py:393
@@ -10081,24 +10077,18 @@ msgid "Ask for VAT ID"
msgstr "Solicitar ID de IVA"
#: pretix/base/settings.py:632
#, fuzzy, python-brace-format
#| msgid ""
#| "Only works if an invoice address is asked for. VAT ID is never required "
#| "and only requested from business customers in the following countries: "
#| "{countries}"
#, python-brace-format
msgid ""
"Only works if an invoice address is asked for. VAT ID is only requested from "
"business customers in the following countries: {countries}."
msgstr ""
"Solo funciona si se solicita una dirección de factura. El ID de IVA nunca es "
"obligatorio y solo se solicita a clientes comerciales en los siguientes "
"países: {countries}"
"Solo funciona si se solicita una dirección de facturación. El número de "
"identificación fiscal solo se solicita a los clientes empresariales de los "
"siguientes países: {countries}."
#: pretix/base/settings.py:651
#, fuzzy
#| msgid "Require name"
msgid "Require VAT ID in"
msgstr "Requerir nombre"
msgstr "Solicitar número de identificación fiscal en"
#: pretix/base/settings.py:657
msgid ""
@@ -10106,6 +10096,10 @@ msgid ""
"ID in all countries. VAT ID will be required for all business addresses in "
"the selected countries."
msgstr ""
"El número de identificación fiscal es opcional por defecto, ya que no todas "
"las empresas tienen asignado un número de identificación fiscal en todos los "
"países. El número de identificación fiscal será obligatorio para todas las "
"direcciones comerciales en los países seleccionados."
#: pretix/base/settings.py:672
msgid "Invoice address explanation"
@@ -13838,11 +13832,9 @@ msgstr ""
"mismo origen\"."
#: pretix/base/views/js_helpers.py:41
#, fuzzy
#| msgid "ID"
msgctxt "tax_id_swiss"
msgid "UID"
msgstr "ID"
msgstr "UID"
#. Translators: Only translate to French (IDE) and Italien (IDI), otherwise keep the same
#. Awareness around VAT IDs differes by EU country. For example, in Germany the VAT ID is assigned
@@ -13852,35 +13844,27 @@ msgstr "ID"
#. number (Partita IVA) and also used on domestic transactions. So someone who never purchased something international
#. for their company, might still know the value, if we call it the right way and not just "VAT ID".
#: pretix/base/views/js_helpers.py:49
#, fuzzy
#| msgid "VAT ID"
msgctxt "tax_id_italy"
msgid "VAT ID / P.IVA"
msgstr "Identificador IVA"
msgstr "Número de identificación fiscal / P.IVA"
#. Translators: Translate to only "P.IVA" in Italian, keep second part as-is in other languages
#: pretix/base/views/js_helpers.py:50
#, fuzzy
#| msgid "VAT ID"
msgctxt "tax_id_greece"
msgid "VAT ID / TIN"
msgstr "Identificador IVA"
msgstr "Número de identificación fiscal / TIN"
#. Translators: Translate to only "ΑΦΜ" in Greek
#: pretix/base/views/js_helpers.py:51
#, fuzzy
#| msgid "VAT ID"
msgctxt "tax_id_spain"
msgid "VAT ID / NIF"
msgstr "Identificador IVA"
msgstr "Número de identificación fiscal / NIF"
#. Translators: Translate to only "NIF" in Spanish
#: pretix/base/views/js_helpers.py:52
#, fuzzy
#| msgid "VAT ID"
msgctxt "tax_id_portugal"
msgid "VAT ID / NIF"
msgstr "Identificador IVA"
msgstr "NIF"
#: pretix/base/views/tasks.py:185
msgid "An unexpected error has occurred, please try again later."
@@ -14436,6 +14420,9 @@ msgid ""
"Formatting is not supported, as some accounting departments process mail "
"automatically and do not handle formatted emails properly."
msgstr ""
"No se admite el formato, ya que algunos departamentos de contabilidad "
"procesan el correo automáticamente y no gestionan correctamente los correos "
"electrónicos con formato."
#: pretix/control/forms/event.py:1356
msgid ""
@@ -14889,7 +14876,7 @@ msgstr "Pagado"
#: pretix/control/forms/filter.py:1304
msgctxt "subevent"
msgid "Date doesn't start in selected date range."
msgstr ""
msgstr "La fecha no comienza en el intervalo de fechas seleccionado."
#: pretix/control/forms/filter.py:1360 pretix/control/forms/filter.py:1827
msgid "Shop live and presale running"
@@ -28812,6 +28799,9 @@ msgid ""
"automatically. We recommend that you rename these in your source file to "
"avoid problems during import."
msgstr ""
"Varias columnas del archivo CSV tienen el mismo nombre y se han renombrado "
"automáticamente. Le recomendamos que cambie el nombre de estas columnas en "
"su archivo de origen para evitar problemas durante la importación."
#: pretix/control/views/modelimport.py:188
msgid "The import was successful."
@@ -30483,7 +30473,7 @@ msgstr ""
#: pretix/plugins/banktransfer/camtimport.py:33
msgid "Empty file or unknown format."
msgstr ""
msgstr "Archivo vacío o formato desconocido."
#: pretix/plugins/banktransfer/payment.py:69
msgid ""
@@ -33053,16 +33043,17 @@ msgid "Przelewy24"
msgstr "Przelewy24"
#: pretix/plugins/stripe/payment.py:417 pretix/plugins/stripe/payment.py:1836
#, fuzzy
#| msgid "Payment by bank transfer"
msgid "Pay by bank"
msgstr "Pago por transferencia bancaria"
msgstr "Pagar por transferencia bancaria"
#: pretix/plugins/stripe/payment.py:422
msgid ""
"Currently only available for charges in GBP and customers with UK bank "
"accounts, and in private preview for France and Germany."
msgstr ""
"Actualmente solo disponible para cargos en libra esterlina y clientes con "
"cuentas bancarias en el Reino Unido, y en vista previa privada para Francia "
"y Alemania."
#: pretix/plugins/stripe/payment.py:429 pretix/plugins/stripe/payment.py:1789
msgid "WeChat Pay"
@@ -33374,16 +33365,17 @@ msgstr ""
"favor, tenga a mano su información de acceso."
#: pretix/plugins/stripe/payment.py:1835
#, fuzzy
#| msgid "PayPal via Stripe"
msgid "Pay by bank via Stripe"
msgstr "PayPal via Stripe"
msgstr "Pagar por transferencia bancaria a través de Stripe"
#: pretix/plugins/stripe/payment.py:1841
msgid ""
"Pay by bank allows you to authorize a secure Open Banking payment from your "
"banking app. Currently available only with a UK bank account."
msgstr ""
"El pago por banco te permite autorizar un pago seguro de banca abierta desde "
"tu aplicación bancaria. Actualmente solo disponible con una cuenta bancaria "
"del Reino Unido."
#: pretix/plugins/stripe/payment.py:1861
msgid "PayPal via Stripe"
@@ -33402,22 +33394,16 @@ msgstr ""
"suecas Swish y BankID. Por favor, ten tu app preparada."
#: pretix/plugins/stripe/payment.py:1893
#, fuzzy
#| msgid "giropay via Stripe"
msgid "PromptPay via Stripe"
msgstr "giropay via Stripe"
msgstr "PromptPay a través de Stripe"
#: pretix/plugins/stripe/payment.py:1898
#, fuzzy
#| msgid ""
#| "This payment method is available to MobilePay app users in Denmark and "
#| "Finland. Please have your app ready."
msgid ""
"This payment method is available to PromptPay users in Thailand. Please have "
"your app ready."
msgstr ""
"Este modo de pago está disponible para los usuarios de la aplicación "
"MobilePay en Dinamarca y Finlandia. Por favor, tenga su app preparada."
"Este método de pago está disponible para los usuarios de PromptPay en "
"Tailandia. Por favor, tenga su aplicación lista."
#: pretix/plugins/stripe/payment.py:1917
msgid "TWINT via Stripe"
@@ -33728,22 +33714,16 @@ msgid "Confirm payment: %(code)s"
msgstr "Confirmar pago: %(code)s"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html:32
#, fuzzy
#| msgid ""
#| "Please scan the barcode below to complete your WeChat payment. Once you "
#| "have completed your payment, you can refresh this page."
msgid ""
"Please scan the QR code below to complete your PromptPay payment. Once you "
"have completed your payment, you can refresh this page."
msgstr ""
"Escanee el código de barras a continuación para completar su pago de WeChat. "
"Una vez que haya completado su pago, puede actualizar esta página."
"Escanee el código QR que aparece a continuación para completar su pago con "
"PromptPay. Una vez que haya completado el pago, puede actualizar esta página."
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html:37
#, fuzzy
#| msgid "Create QR code"
msgid "PromptPay QR code"
msgstr "Crear código QR"
msgstr "Código QR de PromptPay"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca_return.html:20
msgid "Confirming your payment…"
@@ -34790,14 +34770,11 @@ msgstr[0] "Necesitas elegir exactamente una opción para esta categoría."
msgstr[1] "Necesitas elegir %(min_count)s opciones para esta categoría."
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:26
#, fuzzy, python-format
#| msgid "You can choose at most one option from this category."
#| msgid_plural ""
#| "You can choose up to %(max_count)s options from this category."
#, python-format
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] "Puedes elegir como máximo una opción en esta categoría."
msgstr[1] "Puedes elegir como máximo %(max_count)s opciones en esta categoría."
msgstr[0] "Puede elegir una opción de esta categoría."
msgstr[1] "Puede elegir hasta %(max_count)s opciones de esta categoría."
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:34
#, python-format
@@ -36885,6 +36862,8 @@ msgid ""
"Your cart timeout was extended. Please note that some of the prices in your "
"cart changed."
msgstr ""
"Se ha ampliado el tiempo de espera de su carrito. Tenga en cuenta que "
"algunos de los precios de su carrito han cambiado."
#: pretix/presale/views/cart.py:573
msgid "Your cart timeout was extended."

View File

@@ -4,16 +4,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-05 12:12+0000\n"
"PO-Revision-Date: 2025-11-22 23:00+0000\n"
"PO-Revision-Date: 2026-01-06 23:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
">\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/"
"fr/>\n"
"Language: fr\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 5.14.3\n"
"X-Generator: Weblate 5.15.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -3874,6 +3874,8 @@ msgstr ""
#: pretix/base/invoicing/peppol.py:164
msgid "The Peppol participant ID is not registered on the Peppol network."
msgstr ""
"L'identifiant Peppol du participant n'est pas enregistré sur le réseau "
"Peppol."
#: pretix/base/invoicing/peppol.py:184
msgid "Peppol participant ID"
@@ -8495,6 +8497,8 @@ msgid ""
"Some products can no longer be purchased and have been removed from your "
"cart for the following reason: %s"
msgstr ""
"Certains produits ne peuvent plus être achetés et ont été retirés de votre "
"panier pour la raison suivante : %s"
#: pretix/base/services/cart.py:117
msgid ""
@@ -9690,21 +9694,15 @@ msgid "Uncategorized"
msgstr "Non catégorisé"
#: pretix/base/services/tax.py:43
#, fuzzy
#| msgid ""
#| "Your VAT ID could not be checked, as the VAT checking service of your "
#| "country is currently not available. We will therefore need to charge VAT "
#| "on your invoice. You can get the tax amount back via the VAT "
#| "reimbursement process."
msgid ""
"Your VAT ID could not be checked, as the VAT checking service of your "
"country is currently not available. We will therefore need to charge you the "
"same tax rate as if you did not enter a VAT ID."
msgstr ""
"Votre numéro de TVA n' a pas pu être vérifié, car le service de contrôle de "
"la TVA de votre pays n'est actuellement pas disponible. Nous devons donc "
"facturer la TVA sur votre facture. Vous pouvez récupérer le montant de la "
"taxe via le processus de remboursement de la TVA."
"Votre numéro d'identification TVA n'a pas pu être vérifié, car le service de "
"vérification de la TVA de votre pays n'est actuellement pas disponible. Nous "
"devrons donc vous facturer le même taux de taxe que si vous n'aviez pas "
"saisi de numéro d'identification TVA."
#: pretix/base/services/tax.py:47 pretix/base/services/tax.py:366
#: pretix/base/services/tax.py:393
@@ -10144,24 +10142,18 @@ msgid "Ask for VAT ID"
msgstr "Demander l'identification TVA"
#: pretix/base/settings.py:632
#, fuzzy, python-brace-format
#| msgid ""
#| "Only works if an invoice address is asked for. VAT ID is never required "
#| "and only requested from business customers in the following countries: "
#| "{countries}"
#, python-brace-format
msgid ""
"Only works if an invoice address is asked for. VAT ID is only requested from "
"business customers in the following countries: {countries}."
msgstr ""
"Ne fonctionne que si une adresse de facturation est demandée. Le numéro de "
"TVA nest jamais requis et nest demandé quaux clients professionnels des "
"pays suivants : {countries}"
"Fonctionne uniquement si une adresse de facturation est demandée. Le numéro "
"d'identification TVA n'est demandé qu'aux clients professionnels dans les "
"pays suivants : {countries}."
#: pretix/base/settings.py:651
#, fuzzy
#| msgid "Require name"
msgid "Require VAT ID in"
msgstr "Nom requis"
msgstr "Exiger un numéro d'identification TVA dans"
#: pretix/base/settings.py:657
msgid ""
@@ -10169,6 +10161,10 @@ msgid ""
"ID in all countries. VAT ID will be required for all business addresses in "
"the selected countries."
msgstr ""
"Le numéro d'identification TVA est facultatif par défaut, car toutes les "
"entreprises ne se voient pas attribuer un numéro d'identification TVA dans "
"tous les pays. Le numéro d'identification TVA sera obligatoire pour toutes "
"les adresses professionnelles dans les pays sélectionnés."
#: pretix/base/settings.py:672
msgid "Invoice address explanation"
@@ -13964,11 +13960,9 @@ msgstr ""
"origine."
#: pretix/base/views/js_helpers.py:41
#, fuzzy
#| msgid "ID"
msgctxt "tax_id_swiss"
msgid "UID"
msgstr "ID"
msgstr "UID"
#. Translators: Only translate to French (IDE) and Italien (IDI), otherwise keep the same
#. Awareness around VAT IDs differes by EU country. For example, in Germany the VAT ID is assigned
@@ -13978,35 +13972,27 @@ msgstr "ID"
#. number (Partita IVA) and also used on domestic transactions. So someone who never purchased something international
#. for their company, might still know the value, if we call it the right way and not just "VAT ID".
#: pretix/base/views/js_helpers.py:49
#, fuzzy
#| msgid "VAT ID"
msgctxt "tax_id_italy"
msgid "VAT ID / P.IVA"
msgstr "Identifiant de TVA"
msgstr "Numéro de TVA intracommunautaire"
#. Translators: Translate to only "P.IVA" in Italian, keep second part as-is in other languages
#: pretix/base/views/js_helpers.py:50
#, fuzzy
#| msgid "VAT ID"
msgctxt "tax_id_greece"
msgid "VAT ID / TIN"
msgstr "Identifiant de TVA"
msgstr "Numéro de TVA intracommunautaire / TIN"
#. Translators: Translate to only "ΑΦΜ" in Greek
#: pretix/base/views/js_helpers.py:51
#, fuzzy
#| msgid "VAT ID"
msgctxt "tax_id_spain"
msgid "VAT ID / NIF"
msgstr "Identifiant de TVA"
msgstr "Numéro de TVA intracommunautaire"
#. Translators: Translate to only "NIF" in Spanish
#: pretix/base/views/js_helpers.py:52
#, fuzzy
#| msgid "VAT ID"
msgctxt "tax_id_portugal"
msgid "VAT ID / NIF"
msgstr "Identifiant de TVA"
msgstr "Numéro de TVA intracommunautaire / NIF"
#: pretix/base/views/tasks.py:185
msgid "An unexpected error has occurred, please try again later."
@@ -14566,6 +14552,9 @@ msgid ""
"Formatting is not supported, as some accounting departments process mail "
"automatically and do not handle formatted emails properly."
msgstr ""
"Le formatage n'est pas pris en charge, car certains services comptables "
"traitent automatiquement le courrier et ne gèrent pas correctement les e-"
"mails formatés."
#: pretix/control/forms/event.py:1356
msgid ""
@@ -15017,7 +15006,7 @@ msgstr "Payé"
#: pretix/control/forms/filter.py:1304
msgctxt "subevent"
msgid "Date doesn't start in selected date range."
msgstr ""
msgstr "La date ne commence pas dans la plage de dates sélectionnée."
#: pretix/control/forms/filter.py:1360 pretix/control/forms/filter.py:1827
msgid "Shop live and presale running"
@@ -29026,6 +29015,9 @@ msgid ""
"automatically. We recommend that you rename these in your source file to "
"avoid problems during import."
msgstr ""
"Plusieurs colonnes du fichier CSV portent le même nom et ont été renommées "
"automatiquement. Nous vous recommandons de les renommer dans votre fichier "
"source afin d'éviter tout problème lors de l'importation."
#: pretix/control/views/modelimport.py:188
msgid "The import was successful."
@@ -30716,7 +30708,7 @@ msgstr ""
#: pretix/plugins/banktransfer/camtimport.py:33
msgid "Empty file or unknown format."
msgstr ""
msgstr "Fichier vide ou format inconnu."
#: pretix/plugins/banktransfer/payment.py:69
msgid ""
@@ -33311,16 +33303,17 @@ msgid "Przelewy24"
msgstr "Przelewy24"
#: pretix/plugins/stripe/payment.py:417 pretix/plugins/stripe/payment.py:1836
#, fuzzy
#| msgid "Payment by bank transfer"
msgid "Pay by bank"
msgstr "Paiement par virement bancaire"
msgstr "Payer par virement bancaire"
#: pretix/plugins/stripe/payment.py:422
msgid ""
"Currently only available for charges in GBP and customers with UK bank "
"accounts, and in private preview for France and Germany."
msgstr ""
"Actuellement disponible uniquement pour les frais en livre sterling et les "
"clients disposant d'un compte bancaire au Royaume-Uni, et pour les clients "
"en test restreint pour la France et l'Allemagne."
#: pretix/plugins/stripe/payment.py:429 pretix/plugins/stripe/payment.py:1789
msgid "WeChat Pay"
@@ -33637,16 +33630,17 @@ msgstr ""
"connexion à porter de main."
#: pretix/plugins/stripe/payment.py:1835
#, fuzzy
#| msgid "PayPal via Stripe"
msgid "Pay by bank via Stripe"
msgstr "PayPal via Stripe"
msgstr "Payer par virement bancaire via Stripe"
#: pretix/plugins/stripe/payment.py:1841
msgid ""
"Pay by bank allows you to authorize a secure Open Banking payment from your "
"banking app. Currently available only with a UK bank account."
msgstr ""
"Le paiement par virement bancaire vous permet d'autoriser un paiement "
"sécurisé via Open Banking depuis votre application bancaire. Actuellement "
"disponible uniquement avec un compte bancaire britannique."
#: pretix/plugins/stripe/payment.py:1861
msgid "PayPal via Stripe"
@@ -33665,22 +33659,16 @@ msgstr ""
"suédoises Swish et BankID. Veuillez préparer votre application."
#: pretix/plugins/stripe/payment.py:1893
#, fuzzy
#| msgid "giropay via Stripe"
msgid "PromptPay via Stripe"
msgstr "giropay via Stripe"
msgstr "PromptPay via Stripe"
#: pretix/plugins/stripe/payment.py:1898
#, fuzzy
#| msgid ""
#| "This payment method is available to MobilePay app users in Denmark and "
#| "Finland. Please have your app ready."
msgid ""
"This payment method is available to PromptPay users in Thailand. Please have "
"your app ready."
msgstr ""
"Ce mode de paiement est disponible pour les utilisateurs de l'application "
"MobilePay au Danemark et en Finlande. Veuillez préparer votre application."
"Ce mode de paiement est disponible pour les utilisateurs de PromptPay en "
"Thaïlande. Veuillez préparer votre application."
#: pretix/plugins/stripe/payment.py:1917
msgid "TWINT via Stripe"
@@ -33995,23 +33983,17 @@ msgid "Confirm payment: %(code)s"
msgstr "Confirmer le paiement : %(code)s"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html:32
#, fuzzy
#| msgid ""
#| "Please scan the barcode below to complete your WeChat payment. Once you "
#| "have completed your payment, you can refresh this page."
msgid ""
"Please scan the QR code below to complete your PromptPay payment. Once you "
"have completed your payment, you can refresh this page."
msgstr ""
"Veuillez scanner le code-barres ci-dessous pour effectuer votre paiement "
"WeChat. Une fois que vous avez effectué votre paiement, vous pouvez "
"actualiser cette page."
"Veuillez scanner le code QR ci-dessous pour effectuer votre paiement "
"PromptPay. Une fois votre paiement effectué, vous pouvez actualiser cette "
"page."
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html:37
#, fuzzy
#| msgid "Create QR code"
msgid "PromptPay QR code"
msgstr "Créer un code QR"
msgstr "Code QR PromptPay"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca_return.html:20
msgid "Confirming your payment…"
@@ -35068,14 +35050,11 @@ msgstr[0] "Vous devez choisir exactement une option de cette catégorie."
msgstr[1] "Vous devez choisir les options %(min_count)s de cette catégorie."
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:26
#, fuzzy, python-format
#| msgid "You can choose at most one option from this category."
#| msgid_plural ""
#| "You can choose up to %(max_count)s options from this category."
#, python-format
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] "Vous pouvez choisir au plus une option de cette catégorie."
msgstr[1] "Vous pouvez choisir jusqu' à %(max_count)s dans cette catégorie."
msgstr[0] "Vous pouvez choisir une option dans cette catégorie."
msgstr[1] "Vous pouvez choisir jusqu'à %(max_count)s options dans cette catégorie."
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:34
#, python-format
@@ -37206,6 +37185,8 @@ msgid ""
"Your cart timeout was extended. Please note that some of the prices in your "
"cart changed."
msgstr ""
"Le délai d'expiration de votre panier a été prolongé. Veuillez noter que "
"certains prix dans votre panier ont changé."
#: pretix/presale/views/cart.py:573
msgid "Your cart timeout was extended."

View File

@@ -656,6 +656,11 @@ LOGGING = {
'handlers': ['null'],
'propagate': False,
},
'celery.utils.functional': {
'handlers': ['file', 'console'],
'level': 'INFO', # Do not output all the queries
'propagate': False,
},
'django.db.backends': {
'handlers': ['file', 'console'],
'level': 'INFO', # Do not output all the queries

View File

@@ -227,7 +227,9 @@ def test_placeholder_html_rendering_from_string(env):
"Event website: [{event}](https://example.org/{event_slug})\n\n"
"Other website: [{event}]({meta_Website})\n\n"
"URL: {url}\n\n"
"URL with text: <a href=\"{url}\">Test</a>"
"URL with text: <a href=\"{url}\">Test</a>\n\n"
"URL with params: https://example.com/form?action=foo&eventid={event_slug}\n\n"
"URL with params and text: [Link & Text](https://example.com/form?action=foo&eventid={event_slug})\n\n"
})
djmail.outbox = []
event, user, organizer = env
@@ -249,6 +251,8 @@ def test_placeholder_html_rendering_from_string(env):
assert '**Meta**: *Beep*' in djmail.outbox[0].body
assert 'URL: https://google.com' in djmail.outbox[0].body
assert 'URL with text: <a href="https://google.com">Test</a>' in djmail.outbox[0].body
assert 'URL with params: https://example.com/form?action=foo&eventid=dummy' in djmail.outbox[0].body
assert 'URL with params and text: [Link & Text](https://example.com/form?action=foo&eventid=dummy)' in djmail.outbox[0].body
assert '&lt;' not in djmail.outbox[0].body
assert '&amp;' not in djmail.outbox[0].body
html = _extract_html(djmail.outbox[0])
@@ -272,3 +276,13 @@ def test_placeholder_html_rendering_from_string(env):
r'URL with text: <a href="https://google.com" rel="noopener" style="[^"]+" target="_blank">Test</a>',
html
)
assert re.search(
r'URL with params: <a href="https://example.com/form\?action=foo&amp;eventid=dummy" rel="noopener" '
r'style="[^"]+" target="_blank">https://example.com/form\?action=foo&amp;eventid=dummy</a>',
html
)
assert re.search(
r'URL with params and text: <a href="https://example.com/form\?action=foo&amp;eventid=dummy" rel="noopener" '
r'style="[^"]+" target="_blank">Link &amp; Text</a>',
html
)

View File

@@ -2465,6 +2465,16 @@ class OrderChangeManagerTests(TestCase):
assert nop.price == Decimal('12.00')
assert nop.subevent == se1
@classscope(attr='o')
def test_add_item_result_value(self):
res_shirt = self.ocm.add_position(self.shirt, None, None, None)
res_ticket2 = self.ocm.add_position(self.ticket2, None, None, None)
with self.assertRaises(RuntimeError):
_ = res_ticket2.position
self.ocm.commit()
assert res_shirt.position.item == self.shirt
assert res_ticket2.position.item == self.ticket2
@classscope(attr='o')
def test_add_item_with_rounding(self):
self.order.tax_rounding_mode = "sum_by_net"