diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7b1598129..adcbd20e8 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -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 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 975087c75..68e8639fb 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -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 diff --git a/doc/_themes/pretix_theme/layout.html b/doc/_themes/pretix_theme/layout.html index b0fa5c142..bca924e3b 100644 --- a/doc/_themes/pretix_theme/layout.html +++ b/doc/_themes/pretix_theme/layout.html @@ -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) -%} - - += (7, 2) %} data-content_root="{{ content_root }}"{% endif %}>
{{ metatags }} @@ -18,59 +22,50 @@asdf asdf asdf asdf 22
-{%- endblock %} - - + {%- endif %} + {%- block footer %} {% endblock %} + + + \ No newline at end of file diff --git a/doc/api/deviceauth.rst b/doc/api/deviceauth.rst index 99d9006b9..acf3d22a8 100644 --- a/doc/api/deviceauth.rst +++ b/doc/api/deviceauth.rst @@ -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 diff --git a/doc/api/fundamentals.rst b/doc/api/fundamentals.rst index 00b2d261c..d72e3f6d6 100644 --- a/doc/api/fundamentals.rst +++ b/doc/api/fundamentals.rst @@ -117,7 +117,7 @@ List-level conditional fetching If modification checks are not possible with this granularity, you can instead check for the full list. In this case, the list of objects may contain a regular HTTP header ``Last-Modified`` with the date of the last modification to any item of that resource. You can then pass this date back in your next request in the -``If-Modified-Since`` header. If the any object has changed in the meantime, you will receive back a full list +``If-Modified-Since`` header. If any object has changed in the meantime, you will receive back a full list (if something it missing, this means the object has been deleted). If nothing happened, we'll send back a ``304 Not Modified`` return code. diff --git a/doc/api/resources/item_program_times.rst b/doc/api/resources/item_program_times.rst index eedf3be0a..db8a6d336 100644 --- a/doc/api/resources/item_program_times.rst +++ b/doc/api/resources/item_program_times.rst @@ -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 diff --git a/doc/development/algorithms/pricing.rst b/doc/development/algorithms/pricing.rst index aa1c7769f..f64790e12 100644 --- a/doc/development/algorithms/pricing.rst +++ b/doc/development/algorithms/pricing.rst @@ -211,7 +211,7 @@ The line-based computation has a few significant advantages: The main disadvantage is that the tax looks "wrong" when computed from the sum. Taking the sum of net prices (420.15) and multiplying it with the tax rate (19%) yields a tax amount of 79.83 (instead of 79.85) and a gross sum of 499.98 -(instead of 499.98). This becomes a problem when juristictions, data formats, or external systems expect this calculation +(instead of 500.00). This becomes a problem when juristictions, data formats, or external systems expect this calculation to work on the level of the entire order. A prominent example is the EN 16931 standard for e-invoicing that does not allow the computation as created by pretix. diff --git a/doc/requirements.rtd.txt b/doc/requirements.rtd.txt index ca98fe9ab..19638c5b7 100644 --- a/doc/requirements.rtd.txt +++ b/doc/requirements.rtd.txt @@ -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.0 +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.* diff --git a/doc/requirements.txt b/doc/requirements.txt index 5de0c0984..74538aae4 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -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.0 +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.* diff --git a/pyproject.toml b/pyproject.toml index ddda75cbd..437177516 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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,18 +29,19 @@ dependencies = [ "arabic-reshaper==3.0.0", # Support for Arabic in reportlab "babel", "BeautifulSoup4==4.14.*", - "bleach==6.2.*", - "celery==5.5.*", + "bleach==6.3.*", + "celery==5.6.*", "chardet==5.2.*", "cryptography>=44.0.0", - "css-inline==0.18.*", + "css-inline==0.19.*", "defusedcsv>=1.1.0", + "dnspython==2.*", "Django[argon2]==4.2.*,>=4.2.26", - "django-bootstrap3==25.2", - "django-compressor==4.5.1", - "django-countries==7.6.*", + "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", + "django-formset-js-improved==0.5.0.5", "django-formtools==2.5.1", "django-hierarkey==2.0.*,>=2.0.1", "django-hijack==3.7.*", @@ -49,22 +50,22 @@ dependencies = [ "django-localflavor==5.0", "django-markup", "django-oauth-toolkit==2.3.*", - "django-otp==1.6.*", - "django-phonenumber-field==7.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+ "isoweek", "jsonschema", - "kombu==5.5.*", + "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.1", # 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.*", @@ -74,31 +75,30 @@ 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", "pycountry", - "pycparser==2.23", + "pycparser==3.0", "pycryptodome==3.23.*", - "pypdf==6.3.*", + "pypdf==6.5.*", "python-bidi==0.6.*", # Support for Arabic in reportlab "python-dateutil==2.9.*", "pytz", "pytz-deprecation-shim==0.1.*", "pyuca", "qrcode==8.2", - "redis==6.4.*", + "redis==7.1.*", "reportlab==4.4.*", "requests==2.32.*", - "sentry-sdk==2.45.*", + "sentry-sdk==2.50.*", "sepaxml==2.7.*", "stripe==7.9.*", "text-unidecode==1.*", "tlds>=2020041600", "tqdm==4.*", "ua-parser==1.0.*", - "vat_moss_forked==2020.3.20.0.11.0", "vobject==0.9.*", "webauthn==2.7.*", "zeep==4.3.*" @@ -110,10 +110,10 @@ dev = [ "aiohttp==3.13.*", "coverage", "coveralls", - "fakeredis==2.32.*", + "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", ] diff --git a/src/pretix/__init__.py b/src/pretix/__init__.py index 86d132f5e..9f5eafff1 100644 --- a/src/pretix/__init__.py +++ b/src/pretix/__init__.py @@ -19,4 +19,4 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see #