diff --git a/dejacode/settings.py b/dejacode/settings.py
index 4ccb29df..c9bc11d9 100644
--- a/dejacode/settings.py
+++ b/dejacode/settings.py
@@ -473,6 +473,11 @@ def gettext_noop(s):
"SSL": env.bool("DEJACODE_RQ_REDIS_SSL", default=False),
},
}
+# COMMIT_MODE "on_db_commit" enqueues jobs through transaction.on_commit(),
+# so a job is only picked up by a worker once its transaction is committed.
+RQ = {
+ "COMMIT_MODE": "on_db_commit",
+}
# Cron jobs (scheduler)
daily_at_3am = "0 3 * * *"
@@ -503,6 +508,11 @@ def get_fake_redis_connection(config, use_strict_redis):
connection_utils.get_redis_connection = get_fake_redis_connection
+ # Default COMMIT_MODE is "on_db_commit": jobs are enqueued through
+ # transaction.on_commit(), which never fires inside a TestCase since its
+ # wrapping transaction is always rolled back. "auto" enqueues immediately.
+ RQ["COMMIT_MODE"] = "auto"
+
DEJACODE_ASYNC = env.bool("DEJACODE_ASYNC", default=False)
if not DEJACODE_ASYNC or IS_TESTS:
diff --git a/pyproject.toml b/pyproject.toml
index 1ea026ba..75c02445 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -38,7 +38,7 @@ dependencies = [
# Django
"django==6.1.1",
"asgiref==3.12.1",
- "typing_extensions==4.15.0",
+ "typing-extensions==4.16.0",
"sqlparse==0.6.0",
# Django apps
"django-crispy-forms==2.7",
@@ -69,7 +69,7 @@ dependencies = [
"qrcode==8.2",
"pypng==0.20220715.0",
# Database
- "psycopg==3.3.4",
+ "psycopg==3.3.5",
# Cache
"redis==8.1.0",
# Antivirus
@@ -77,10 +77,10 @@ dependencies = [
# Testing
"model_bakery==1.23.3",
# Task queue
- "rq==2.9.0",
+ "rq==2.12.0",
"croniter==6.2.4",
- "django-rq==3.2.2",
- "fakeredis==2.36.2",
+ "django-rq==4.2.0",
+ "fakeredis==2.38.0",
# Libs
"certifi==2026.7.22",
"urllib3==2.7.0",
@@ -100,7 +100,7 @@ dependencies = [
"markdown==3.10.2",
"bleach==6.4.0",
"bleach_allowlist==1.0.3",
- "webencodings==0.5.1",
+ "webencodings==0.6.1",
# Authentication
"oauthlib==3.3.1",
"python3-openid==3.2.0",
@@ -138,22 +138,22 @@ dependencies = [
"rpds-py==0.30.0",
"attrs==25.4.0",
# CycloneDX
- "cyclonedx-python-lib==11.6.0",
+ "cyclonedx-python-lib==11.12.0",
"sortedcontainers==2.4.0",
"py-serializable==2.1.0",
# CSAF
"pydantic==2.12.5",
"pydantic-core==2.41.5",
- "typing-inspection==0.4.2",
+ "typing-inspection==0.4.4",
"maturin==1.11.5",
"setuptools-rust==1.12.0",
"annotated-types==0.7.0",
"semantic-version==2.10.0",
# OpenVEX
- "msgspec==0.20.0",
+ "msgspec==0.21.1",
# OpenDocument Format
"odfdo==3.22.0",
- "lxml==6.1.1",
+ "lxml==6.1.3",
]
[project.optional-dependencies]
diff --git a/thirdparty/dist/click-8.4.2-py3-none-any.whl b/thirdparty/dist/click-8.4.2-py3-none-any.whl
deleted file mode 100644
index aaeffdb3..00000000
Binary files a/thirdparty/dist/click-8.4.2-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/crispy_bootstrap5-2026.3-py3-none-any.whl b/thirdparty/dist/crispy_bootstrap5-2026.3-py3-none-any.whl
deleted file mode 100644
index 7f271b15..00000000
Binary files a/thirdparty/dist/crispy_bootstrap5-2026.3-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/crispy_bootstrap5-2026.3-py3-none-any.whl.ABOUT b/thirdparty/dist/crispy_bootstrap5-2026.3-py3-none-any.whl.ABOUT
deleted file mode 100644
index 821b6635..00000000
--- a/thirdparty/dist/crispy_bootstrap5-2026.3-py3-none-any.whl.ABOUT
+++ /dev/null
@@ -1,17 +0,0 @@
-about_resource: crispy_bootstrap5-2026.3-py3-none-any.whl
-name: crispy-bootstrap5
-version: '2026.3'
-download_url: https://files.pythonhosted.org/packages/9d/2d/93f78072f203aa28d961add6a130b929b47f7aa3fef6905898b4bb9a637d/crispy_bootstrap5-2026.3-py3-none-any.whl
-package_url: pkg:pypi/crispy-bootstrap5@2026.3
-license_expression: mit AND unknown-license-reference
-copyright: Copyright crispy-bootstrap5 project contributors
-attribute: yes
-checksum_md5: cfb86388b260ba60735c2d156ee26dcc
-checksum_sha1: 065b9b385fdfad76a4c499771affa9328ff14370
-licenses:
- - key: mit
- name: MIT License
- file: mit.LICENSE
- - key: unknown-license-reference
- name: Unknown License file reference
- file: unknown-license-reference.LICENSE
diff --git a/thirdparty/dist/cyclonedx_python_lib-11.12.0-py3-none-any.whl b/thirdparty/dist/cyclonedx_python_lib-11.12.0-py3-none-any.whl
new file mode 100644
index 00000000..f2ba5ed0
Binary files /dev/null and b/thirdparty/dist/cyclonedx_python_lib-11.12.0-py3-none-any.whl differ
diff --git a/thirdparty/dist/cyclonedx_python_lib-11.6.0-py3-none-any.whl b/thirdparty/dist/cyclonedx_python_lib-11.6.0-py3-none-any.whl
deleted file mode 100644
index 49ec9b27..00000000
Binary files a/thirdparty/dist/cyclonedx_python_lib-11.6.0-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/cyclonedx_python_lib-11.6.0-py3-none-any.whl.ABOUT b/thirdparty/dist/cyclonedx_python_lib-11.6.0-py3-none-any.whl.ABOUT
deleted file mode 100644
index 8c4fc73f..00000000
--- a/thirdparty/dist/cyclonedx_python_lib-11.6.0-py3-none-any.whl.ABOUT
+++ /dev/null
@@ -1,15 +0,0 @@
-about_resource: cyclonedx_python_lib-11.6.0-py3-none-any.whl
-name: cyclonedx-python-lib
-version: 11.6.0
-download_url: https://files.pythonhosted.org/packages/c7/1b/534ad8a5e0f9470522811a8e5a9bc5d328fb7738ba29faf357467a4ef6d0/cyclonedx_python_lib-11.6.0-py3-none-any.whl
-package_url: pkg:pypi/cyclonedx-python-lib@11.6.0
-license_expression: apache-2.0
-copyright: Copyright OWASP Foundation
-attribute: yes
-track_changes: yes
-checksum_md5: 1f8a970a5307c851ff4ab8f2836db736
-checksum_sha1: 2272f348d83800d8450edbc7ce52974386e7f229
-licenses:
- - key: apache-2.0
- name: Apache License 2.0
- file: apache-2.0.LICENSE
diff --git a/thirdparty/dist/django-6.0.8-py3-none-any.whl b/thirdparty/dist/django-6.0.8-py3-none-any.whl
deleted file mode 100644
index 3fbd9c58..00000000
Binary files a/thirdparty/dist/django-6.0.8-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/django_crispy_forms-2.6-py3-none-any.whl b/thirdparty/dist/django_crispy_forms-2.6-py3-none-any.whl
deleted file mode 100644
index 582dfd8b..00000000
Binary files a/thirdparty/dist/django_crispy_forms-2.6-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/django_crispy_forms-2.6-py3-none-any.whl.ABOUT b/thirdparty/dist/django_crispy_forms-2.6-py3-none-any.whl.ABOUT
deleted file mode 100644
index a9997c72..00000000
--- a/thirdparty/dist/django_crispy_forms-2.6-py3-none-any.whl.ABOUT
+++ /dev/null
@@ -1,13 +0,0 @@
-about_resource: django_crispy_forms-2.6-py3-none-any.whl
-name: django-crispy-forms
-version: '2.6'
-download_url: https://files.pythonhosted.org/packages/96/e3/4c5915a732d6ab54da8871400852b67529518eedfb6b78ecf10bbccfcabb/django_crispy_forms-2.6-py3-none-any.whl
-package_url: pkg:pypi/django-crispy-forms@2.6
-license_expression: unknown-license-reference
-copyright: Copyright django-crispy-forms project contributors
-checksum_md5: 6c45e06bdef246a29905cf96d1300036
-checksum_sha1: 2d5827887f31a44c0309278ca5fa2e7821063801
-licenses:
- - key: unknown-license-reference
- name: Unknown License file reference
- file: unknown-license-reference.LICENSE
diff --git a/thirdparty/dist/django_debug_toolbar-7.1.1-py3-none-any.whl b/thirdparty/dist/django_debug_toolbar-7.1.1-py3-none-any.whl
deleted file mode 100644
index 342264a6..00000000
Binary files a/thirdparty/dist/django_debug_toolbar-7.1.1-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/django_filter-25.2-py3-none-any.whl b/thirdparty/dist/django_filter-25.2-py3-none-any.whl
deleted file mode 100644
index 40875a3d..00000000
Binary files a/thirdparty/dist/django_filter-25.2-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/django_filter-25.2-py3-none-any.whl.ABOUT b/thirdparty/dist/django_filter-25.2-py3-none-any.whl.ABOUT
deleted file mode 100644
index edf6261a..00000000
--- a/thirdparty/dist/django_filter-25.2-py3-none-any.whl.ABOUT
+++ /dev/null
@@ -1,14 +0,0 @@
-about_resource: django_filter-25.2-py3-none-any.whl
-name: django-filter
-version: '25.2'
-download_url: https://files.pythonhosted.org/packages/c1/40/6a02495c5658beb1f31eb09952d8aa12ef3c2a66342331ce3a35f7132439/django_filter-25.2-py3-none-any.whl
-package_url: pkg:pypi/django-filter@25.2
-license_expression: bsd-new
-copyright: Copyright django-filter project contributors
-attribute: yes
-checksum_md5: c45048f113d2281c952c3b9b253e05ae
-checksum_sha1: 3c7b6ad1ef39070b64ce15f6a35bc59dd5fda858
-licenses:
- - key: bsd-new
- name: BSD-3-Clause
- file: bsd-new.LICENSE
diff --git a/thirdparty/dist/django_guardian-3.3.2-py3-none-any.whl b/thirdparty/dist/django_guardian-3.3.2-py3-none-any.whl
deleted file mode 100644
index 3686787f..00000000
Binary files a/thirdparty/dist/django_guardian-3.3.2-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/django_otp-1.7.0-py3-none-any.whl b/thirdparty/dist/django_otp-1.7.0-py3-none-any.whl
deleted file mode 100644
index 0118f0da..00000000
Binary files a/thirdparty/dist/django_otp-1.7.0-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/django_otp-1.7.0-py3-none-any.whl.ABOUT b/thirdparty/dist/django_otp-1.7.0-py3-none-any.whl.ABOUT
deleted file mode 100644
index f3c482f7..00000000
--- a/thirdparty/dist/django_otp-1.7.0-py3-none-any.whl.ABOUT
+++ /dev/null
@@ -1,13 +0,0 @@
-about_resource: django_otp-1.7.0-py3-none-any.whl
-name: django-otp
-version: 1.7.0
-download_url: https://files.pythonhosted.org/packages/9c/f0/75ee6cdcf916b7c67dffa87aecdd173e4d68e456839dd53b9313e9cc9201/django_otp-1.7.0-py3-none-any.whl
-package_url: pkg:pypi/django-otp@1.7.0
-license_expression: unlicense
-copyright: Copyright django-otp project contributors
-checksum_md5: dc77d137ff8501a161a02b3710f7b9c4
-checksum_sha1: dd03964929aaf7bc89a2b9f8a3410e96c66cd958
-licenses:
- - key: unlicense
- name: Unlicense
- file: unlicense.LICENSE
diff --git a/thirdparty/dist/django_rq-3.2.2-py3-none-any.whl b/thirdparty/dist/django_rq-3.2.2-py3-none-any.whl
deleted file mode 100644
index 1ee73a15..00000000
Binary files a/thirdparty/dist/django_rq-3.2.2-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/django_rq-3.2.2-py3-none-any.whl.ABOUT b/thirdparty/dist/django_rq-3.2.2-py3-none-any.whl.ABOUT
deleted file mode 100644
index 80db80c3..00000000
--- a/thirdparty/dist/django_rq-3.2.2-py3-none-any.whl.ABOUT
+++ /dev/null
@@ -1,17 +0,0 @@
-about_resource: django_rq-3.2.2-py3-none-any.whl
-name: django-rq
-version: 3.2.2
-download_url: https://files.pythonhosted.org/packages/e8/dc/c6c9b193b8d66b252206e77d6cfdf93724e48ebe5e86e6d70542de9064d5/django_rq-3.2.2-py3-none-any.whl
-package_url: pkg:pypi/django-rq@3.2.2
-license_expression: mit AND unknown-license-reference
-copyright: Copyright django-rq project contributors
-attribute: yes
-checksum_md5: d7f95462e65e3d06d6434ef2601002be
-checksum_sha1: 8444fa3da4151ed48765630b1f857948ae221b8a
-licenses:
- - key: mit
- name: MIT License
- file: mit.LICENSE
- - key: unknown-license-reference
- name: Unknown License file reference
- file: unknown-license-reference.LICENSE
diff --git a/thirdparty/dist/django_rq-4.2.0-py3-none-any.whl b/thirdparty/dist/django_rq-4.2.0-py3-none-any.whl
new file mode 100644
index 00000000..9d7777a6
Binary files /dev/null and b/thirdparty/dist/django_rq-4.2.0-py3-none-any.whl differ
diff --git a/thirdparty/dist/fakeredis-2.36.2-py3-none-any.whl b/thirdparty/dist/fakeredis-2.36.2-py3-none-any.whl
deleted file mode 100644
index 35d7a637..00000000
Binary files a/thirdparty/dist/fakeredis-2.36.2-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/fakeredis-2.38.0-py3-none-any.whl b/thirdparty/dist/fakeredis-2.38.0-py3-none-any.whl
new file mode 100644
index 00000000..b71d4646
Binary files /dev/null and b/thirdparty/dist/fakeredis-2.38.0-py3-none-any.whl differ
diff --git a/thirdparty/dist/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl b/thirdparty/dist/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
deleted file mode 100644
index 8b37c5cd..00000000
Binary files a/thirdparty/dist/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl and /dev/null differ
diff --git a/thirdparty/dist/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl b/thirdparty/dist/lxml-6.1.3-cp314-cp314-macosx_10_15_universal2.whl
similarity index 53%
rename from thirdparty/dist/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl
rename to thirdparty/dist/lxml-6.1.3-cp314-cp314-macosx_10_15_universal2.whl
index 60a575c8..0cd3f07e 100644
Binary files a/thirdparty/dist/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl and b/thirdparty/dist/lxml-6.1.3-cp314-cp314-macosx_10_15_universal2.whl differ
diff --git a/thirdparty/dist/lxml-6.1.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl b/thirdparty/dist/lxml-6.1.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
new file mode 100644
index 00000000..4593b21b
Binary files /dev/null and b/thirdparty/dist/lxml-6.1.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl differ
diff --git a/thirdparty/dist/msgspec-0.20.0.tar.gz b/thirdparty/dist/msgspec-0.20.0.tar.gz
deleted file mode 100644
index 884d5155..00000000
Binary files a/thirdparty/dist/msgspec-0.20.0.tar.gz and /dev/null differ
diff --git a/thirdparty/dist/msgspec-0.20.0.tar.gz.ABOUT b/thirdparty/dist/msgspec-0.20.0.tar.gz.ABOUT
deleted file mode 100644
index b8c32f8d..00000000
--- a/thirdparty/dist/msgspec-0.20.0.tar.gz.ABOUT
+++ /dev/null
@@ -1,127 +0,0 @@
-about_resource: msgspec-0.20.0.tar.gz
-name: msgspec
-version: 0.20.0
-download_url: https://files.pythonhosted.org/packages/ea/9c/bfbd12955a49180cbd234c5d29ec6f74fe641698f0cd9df154a854fc8a15/msgspec-0.20.0.tar.gz
-description: |
- A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML.
-
-
-
-
-
-
-
-
- [](https://github.com/jcrist/msgspec/actions/workflows/ci.yml)
- [](https://jcristharif.com/msgspec/)
- [](https://github.com/jcrist/msgspec/blob/main/LICENSE)
- [](https://pypi.org/project/msgspec/)
- [](https://anaconda.org/conda-forge/msgspec)
- [](https://app.codecov.io/gh/jcrist/msgspec)
-
-
-
- `msgspec` is a *fast* serialization and validation library, with builtin
- support for [JSON](https://json.org), [MessagePack](https://msgpack.org),
- [YAML](https://yaml.org), and [TOML](https://toml.io/en/). It features:
-
- - 🚀 **High performance encoders/decoders** for common protocols. The JSON and
- MessagePack implementations regularly
- [benchmark](https://jcristharif.com/msgspec/benchmarks.html) as the fastest
- options for Python.
-
- - 🎉 **Support for a wide variety of Python types**. Additional types may be
- supported through
- [extensions](https://jcristharif.com/msgspec/extending.html).
-
- - 🔍 **Zero-cost schema validation** using familiar Python type annotations. In
- [benchmarks](https://jcristharif.com/msgspec/benchmarks.html) `msgspec`
- decodes *and* validates JSON faster than
- [orjson](https://github.com/ijl/orjson) can decode it alone.
-
- - ✨ **A speedy Struct type** for representing structured data. If you already
- use [dataclasses](https://docs.python.org/3/library/dataclasses.html) or
- [attrs](https://www.attrs.org/en/stable/),
- [structs](https://jcristharif.com/msgspec/structs.html) should feel familiar.
- However, they're
- [5-60x faster](https://jcristharif.com/msgspec/benchmarks.html#structs)
- for common operations.
-
- All of this is included in a
- [lightweight library](https://jcristharif.com/msgspec/benchmarks.html#library-size)
- with no required dependencies.
-
- ---
-
- `msgspec` may be used for serialization alone, as a faster JSON or
- MessagePack library. For the greatest benefit though, we recommend using
- `msgspec` to handle the full serialization & validation workflow:
-
- **Define** your message schemas using standard Python type annotations.
-
- ```python
- >>> import msgspec
-
- >>> class User(msgspec.Struct):
- ... """A new type describing a User"""
- ... name: str
- ... groups: set[str] = set()
- ... email: str | None = None
- ```
-
- **Encode** messages as JSON, or one of the many other supported protocols.
-
- ```python
- >>> alice = User("alice", groups={"admin", "engineering"})
-
- >>> alice
- User(name='alice', groups={"admin", "engineering"}, email=None)
-
- >>> msg = msgspec.json.encode(alice)
-
- >>> msg
- b'{"name":"alice","groups":["admin","engineering"],"email":null}'
- ```
-
- **Decode** messages back into Python objects, with optional schema validation.
-
- ```python
- >>> msgspec.json.decode(msg, type=User)
- User(name='alice', groups={"admin", "engineering"}, email=None)
-
- >>> msgspec.json.decode(b'{"name":"bob","groups":[123]}', type=User)
- Traceback (most recent call last):
- File "", line 1, in
- msgspec.ValidationError: Expected `str`, got `int` - at `$.groups[0]`
- ```
-
- `msgspec` is designed to be as performant as possible, while retaining some of
- the nicities of validation libraries like
- [pydantic](https://docs.pydantic.dev/latest/). For supported types,
- encoding/decoding a message with `msgspec` can be
- [~10-80x faster than alternative libraries](https://jcristharif.com/msgspec/benchmarks.html).
-
-
-
-
-
-
-
- See [the documentation](https://jcristharif.com/msgspec/) for more information.
-
-
- ## LICENSE
-
- New BSD. See the
- [License File](https://github.com/jcrist/msgspec/blob/main/LICENSE).
-homepage_url: https://jcristharif.com/msgspec/
-package_url: pkg:pypi/msgspec@0.20.0
-license_expression: bsd-new
-copyright: Copyright Jim Crist-Harif
-attribute: yes
-checksum_md5: cbed0fb989c48199efdbe1fc8f89e1b4
-checksum_sha1: 8a9a5a04fa077c4012231e2788a638d664641f4f
-licenses:
- - key: bsd-new
- name: BSD-3-Clause
- file: bsd-new.LICENSE
diff --git a/thirdparty/dist/msgspec-0.21.1-cp314-cp314-macosx_11_0_arm64.whl b/thirdparty/dist/msgspec-0.21.1-cp314-cp314-macosx_11_0_arm64.whl
new file mode 100644
index 00000000..429bec8b
Binary files /dev/null and b/thirdparty/dist/msgspec-0.21.1-cp314-cp314-macosx_11_0_arm64.whl differ
diff --git a/thirdparty/dist/msgspec-0.21.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl b/thirdparty/dist/msgspec-0.21.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
new file mode 100644
index 00000000..e583f350
Binary files /dev/null and b/thirdparty/dist/msgspec-0.21.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl differ
diff --git a/thirdparty/dist/psycopg-3.3.4-py3-none-any.whl b/thirdparty/dist/psycopg-3.3.5-py3-none-any.whl
similarity index 62%
rename from thirdparty/dist/psycopg-3.3.4-py3-none-any.whl
rename to thirdparty/dist/psycopg-3.3.5-py3-none-any.whl
index dd7a5098..d28ded9e 100644
Binary files a/thirdparty/dist/psycopg-3.3.4-py3-none-any.whl and b/thirdparty/dist/psycopg-3.3.5-py3-none-any.whl differ
diff --git a/thirdparty/dist/rq-2.10.0-py3-none-any.whl b/thirdparty/dist/rq-2.12.0-py3-none-any.whl
similarity index 57%
rename from thirdparty/dist/rq-2.10.0-py3-none-any.whl
rename to thirdparty/dist/rq-2.12.0-py3-none-any.whl
index 16ba7bab..c5c7c0c8 100644
Binary files a/thirdparty/dist/rq-2.10.0-py3-none-any.whl and b/thirdparty/dist/rq-2.12.0-py3-none-any.whl differ
diff --git a/thirdparty/dist/rq-2.9.0-py3-none-any.whl b/thirdparty/dist/rq-2.9.0-py3-none-any.whl
deleted file mode 100644
index e4bdd585..00000000
Binary files a/thirdparty/dist/rq-2.9.0-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/typing_extensions-4.15.0-py3-none-any.whl b/thirdparty/dist/typing_extensions-4.15.0-py3-none-any.whl
deleted file mode 100644
index 5fec9ca6..00000000
Binary files a/thirdparty/dist/typing_extensions-4.15.0-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/typing_extensions-4.15.0-py3-none-any.whl.ABOUT b/thirdparty/dist/typing_extensions-4.15.0-py3-none-any.whl.ABOUT
deleted file mode 100644
index 6198e934..00000000
--- a/thirdparty/dist/typing_extensions-4.15.0-py3-none-any.whl.ABOUT
+++ /dev/null
@@ -1,18 +0,0 @@
-about_resource: typing_extensions-4.15.0-py3-none-any.whl
-name: typing-extensions
-version: 4.15.0
-download_url: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl
-package_url: pkg:pypi/typing-extensions@4.15.0
-license_expression: psf-2.0 AND unknown-license-reference
-copyright: Copyright typing-extensions project contributors
-attribute: yes
-track_changes: yes
-checksum_md5: 1394f56d85d87540f7907680572797e1
-checksum_sha1: 807e4d7ccad443949cbe10eae99937fd71c2b0c8
-licenses:
- - key: psf-2.0
- name: PSF-2.0
- file: psf-2.0.LICENSE
- - key: unknown-license-reference
- name: Unknown License file reference
- file: unknown-license-reference.LICENSE
diff --git a/thirdparty/dist/typing_extensions-4.16.0-py3-none-any.whl b/thirdparty/dist/typing_extensions-4.16.0-py3-none-any.whl
new file mode 100644
index 00000000..9f9aae6a
Binary files /dev/null and b/thirdparty/dist/typing_extensions-4.16.0-py3-none-any.whl differ
diff --git a/thirdparty/dist/typing_inspection-0.4.2-py3-none-any.whl b/thirdparty/dist/typing_inspection-0.4.2-py3-none-any.whl
deleted file mode 100644
index db190df9..00000000
Binary files a/thirdparty/dist/typing_inspection-0.4.2-py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/typing_inspection-0.4.2-py3-none-any.whl.ABOUT b/thirdparty/dist/typing_inspection-0.4.2-py3-none-any.whl.ABOUT
deleted file mode 100644
index 794e6edd..00000000
--- a/thirdparty/dist/typing_inspection-0.4.2-py3-none-any.whl.ABOUT
+++ /dev/null
@@ -1,38 +0,0 @@
-about_resource: typing_inspection-0.4.2-py3-none-any.whl
-name: typing-inspection
-version: 0.4.2
-download_url: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl
-description: |
- Runtime typing introspection tools
- # typing-inspection
-
- [](https://github.com/pydantic/typing-inspection/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)
- [](https://coverage-badge.samuelcolvin.workers.dev/redirect/pydantic/typing-inspection)
- [](https://pypi.org/project/typing-inspection/)
- [](https://github.com/pydantic/typing-inspection)
- [](https://github.com/pydantic/typing-inspection/blob/main/LICENSE)
- [](https://github.com/astral-sh/ruff)
-
- `typing-inspection` provides tools to inspect type annotations at runtime.
-
- ## Installation
-
- From [PyPI](https://pypi.org/project/typing-inspection/):
-
- ```bash
- pip install typing-inspection
- ```
-
- The library can be imported from the `typing_inspection` module.
-package_url: pkg:pypi/typing-inspection@0.4.2
-license_expression: mit AND unknown-license-reference
-copyright: Copyright typing-inspection project contributors
-attribute: yes
-checksum_md5: 245304d58de21f4f0bdd15f7ea4b0ea8
-licenses:
- - key: mit
- name: MIT License
- file: mit.LICENSE
- - key: unknown-license-reference
- name: Unknown License file reference
- file: unknown-license-reference.LICENSE
diff --git a/thirdparty/dist/typing_inspection-0.4.4-py3-none-any.whl b/thirdparty/dist/typing_inspection-0.4.4-py3-none-any.whl
new file mode 100644
index 00000000..2a5ded83
Binary files /dev/null and b/thirdparty/dist/typing_inspection-0.4.4-py3-none-any.whl differ
diff --git a/thirdparty/dist/webencodings-0.5.1-py2.py3-none-any.whl b/thirdparty/dist/webencodings-0.5.1-py2.py3-none-any.whl
deleted file mode 100644
index 04b75063..00000000
Binary files a/thirdparty/dist/webencodings-0.5.1-py2.py3-none-any.whl and /dev/null differ
diff --git a/thirdparty/dist/webencodings-0.5.1-py2.py3-none-any.whl.ABOUT b/thirdparty/dist/webencodings-0.5.1-py2.py3-none-any.whl.ABOUT
deleted file mode 100644
index 89f8f3fc..00000000
--- a/thirdparty/dist/webencodings-0.5.1-py2.py3-none-any.whl.ABOUT
+++ /dev/null
@@ -1,20 +0,0 @@
-about_resource: webencodings-0.5.1-py2.py3-none-any.whl
-name: webencodings
-version: 0.5.1
-download_url: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl
-description: Character encoding for the web. This is a Python implementation of the WHATWG Encoding
- standard.
-homepage_url: https://github.com/gsnedders/python-webencodings
-package_url: pkg:pypi/webencodings@0.5.1
-license_expression: bsd-new
-copyright: Copyright by Simon Sapin
-notice_file: webencodings-0.5.1-py2.py3-none-any.whl.NOTICE
-attribute: yes
-owner: Geoffrey Sneddon
-owner_url: https://github.com/gsnedders
-checksum_md5: 36654e7c7b772611b536014fa9e6e918
-checksum_sha1: e3a9cf249ab74b68056e96e5968245291b40ca1a
-licenses:
- - key: bsd-new
- name: BSD-3-Clause
- file: bsd-new.LICENSE
diff --git a/thirdparty/dist/webencodings-0.6.1-py3-none-any.whl b/thirdparty/dist/webencodings-0.6.1-py3-none-any.whl
new file mode 100644
index 00000000..c1753804
Binary files /dev/null and b/thirdparty/dist/webencodings-0.6.1-py3-none-any.whl differ
diff --git a/uv.lock b/uv.lock
index 32a49724..355d92a9 100644
--- a/uv.lock
+++ b/uv.lock
@@ -136,14 +136,14 @@ wheels = [
[[package]]
name = "crispy-bootstrap5"
-version = "2026.3"
+version = "2026.9"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "django" },
{ name = "django-crispy-forms" },
]
wheels = [
- { path = "crispy_bootstrap5-2026.3-py3-none-any.whl" },
+ { path = "crispy_bootstrap5-2026.9-py3-none-any.whl" },
]
[[package]]
@@ -159,7 +159,7 @@ wheels = [
[[package]]
name = "cyclonedx-python-lib"
-version = "11.6.0"
+version = "11.12.0"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "license-expression" },
@@ -168,7 +168,7 @@ dependencies = [
{ name = "sortedcontainers" },
]
wheels = [
- { path = "cyclonedx_python_lib-11.6.0-py3-none-any.whl" },
+ { path = "cyclonedx_python_lib-11.12.0-py3-none-any.whl" },
]
[[package]]
@@ -312,29 +312,29 @@ requires-dist = [
{ name = "clamd", specifier = "==1.0.2" },
{ name = "click", specifier = "==8.3.3" },
{ name = "confusable-homoglyphs", specifier = "==3.3.1" },
- { name = "crispy-bootstrap5", specifier = "==2026.3" },
+ { name = "crispy-bootstrap5", specifier = "==2026.9" },
{ name = "croniter", specifier = "==6.2.4" },
- { name = "cyclonedx-python-lib", specifier = "==11.6.0" },
+ { name = "cyclonedx-python-lib", specifier = "==11.12.0" },
{ name = "cython", specifier = "==3.2.4" },
{ name = "defusedxml", specifier = "==0.7.1" },
- { name = "django", specifier = "==6.0.8" },
+ { name = "django", specifier = "==6.1.1" },
{ name = "django-altcha", specifier = "==1.0.0" },
{ name = "django-auth-ldap", specifier = "==5.3.0" },
{ name = "django-axes", specifier = "==8.3.1" },
- { name = "django-crispy-forms", specifier = "==2.6" },
- { name = "django-debug-toolbar", specifier = "==7.1.1" },
+ { name = "django-crispy-forms", specifier = "==2.7" },
+ { name = "django-debug-toolbar", specifier = "==8.0.0" },
{ name = "django-environ", specifier = "==0.14.0" },
- { name = "django-filter", specifier = "==25.2" },
+ { name = "django-filter", specifier = "==26.1" },
{ name = "django-grappelli", specifier = "==5.0.0" },
- { name = "django-guardian", specifier = "==3.3.2" },
+ { name = "django-guardian", specifier = "==3.5.0" },
{ name = "django-notifications-patched", specifier = "==2.0.0" },
- { name = "django-otp", specifier = "==1.7.0" },
+ { name = "django-otp", specifier = "==1.7.3" },
{ name = "django-registration", specifier = "==5.2.1" },
- { name = "django-rq", specifier = "==3.2.2" },
- { name = "djangorestframework", specifier = "==3.16.1" },
+ { name = "django-rq", specifier = "==4.2.0" },
+ { name = "djangorestframework", specifier = "==3.18.1" },
{ name = "drf-yasg", specifier = "==1.21.15" },
{ name = "et-xmlfile", specifier = "==2.0.0" },
- { name = "fakeredis", specifier = "==2.36.2" },
+ { name = "fakeredis", specifier = "==2.38.0" },
{ name = "gunicorn", specifier = "==26.1.0" },
{ name = "idna", specifier = "==3.19" },
{ name = "inflection", specifier = "==0.5.1" },
@@ -343,12 +343,12 @@ requires-dist = [
{ name = "jsonschema", specifier = "==4.26.0" },
{ name = "jsonschema-specifications", specifier = "==2025.9.1" },
{ name = "license-expression", specifier = "==30.4.4" },
- { name = "lxml", specifier = "==6.1.1" },
+ { name = "lxml", specifier = "==6.1.3" },
{ name = "markdown", specifier = "==3.10.2" },
{ name = "markupsafe", specifier = "==3.0.3" },
{ name = "maturin", specifier = "==1.11.5" },
{ name = "model-bakery", specifier = "==1.23.3" },
- { name = "msgspec", specifier = "==0.20.0" },
+ { name = "msgspec", specifier = "==0.21.1" },
{ name = "natsort", specifier = "==8.4.0" },
{ name = "oauthlib", specifier = "==3.3.1" },
{ name = "odfdo", specifier = "==3.22.0" },
@@ -356,7 +356,7 @@ requires-dist = [
{ name = "packageurl-python", specifier = "==0.17.6" },
{ name = "packaging", specifier = "==26.2" },
{ name = "pip", specifier = "==26.2.1" },
- { name = "psycopg", specifier = "==3.3.4" },
+ { name = "psycopg", specifier = "==3.3.5" },
{ name = "py-serializable", specifier = "==2.1.0" },
{ name = "pyasn1", specifier = "==0.6.4" },
{ name = "pyasn1-modules", specifier = "==0.4.2" },
@@ -376,7 +376,7 @@ requires-dist = [
{ name = "requests", specifier = "==2.34.2" },
{ name = "requests-oauthlib", specifier = "==2.0.0" },
{ name = "rpds-py", specifier = "==0.30.0" },
- { name = "rq", specifier = "==2.9.0" },
+ { name = "rq", specifier = "==2.12.0" },
{ name = "ruff", marker = "extra == 'dev'", specifier = "==0.15.14" },
{ name = "saneyaml", specifier = "==0.6.1" },
{ name = "semantic-version", specifier = "==2.10.0" },
@@ -388,11 +388,11 @@ requires-dist = [
{ name = "sqlparse", specifier = "==0.6.0" },
{ name = "swapper", specifier = "==1.4.0" },
{ name = "tblib", specifier = "==3.2.2" },
- { name = "typing-extensions", specifier = "==4.15.0" },
- { name = "typing-inspection", specifier = "==0.4.2" },
+ { name = "typing-extensions", specifier = "==4.16.0" },
+ { name = "typing-inspection", specifier = "==0.4.4" },
{ name = "uritemplate", specifier = "==4.2.0" },
{ name = "urllib3", specifier = "==2.7.0" },
- { name = "webencodings", specifier = "==0.5.1" },
+ { name = "webencodings", specifier = "==0.6.1" },
{ name = "wheel", specifier = "==0.48.0" },
{ name = "xlsxwriter", specifier = "==3.2.9" },
{ name = "zipp", specifier = "==4.1.0" },
@@ -401,14 +401,14 @@ provides-extras = ["dev"]
[[package]]
name = "django"
-version = "6.0.8"
+version = "6.1.1"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "asgiref" },
{ name = "sqlparse" },
]
wheels = [
- { path = "django-6.0.8-py3-none-any.whl" },
+ { path = "django-6.1.1-py3-none-any.whl" },
]
[[package]]
@@ -449,25 +449,25 @@ wheels = [
[[package]]
name = "django-crispy-forms"
-version = "2.6"
+version = "2.7"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "django" },
]
wheels = [
- { path = "django_crispy_forms-2.6-py3-none-any.whl" },
+ { path = "django_crispy_forms-2.7-py3-none-any.whl" },
]
[[package]]
name = "django-debug-toolbar"
-version = "7.1.1"
+version = "8.0.0"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "django" },
{ name = "sqlparse" },
]
wheels = [
- { path = "django_debug_toolbar-7.1.1-py3-none-any.whl" },
+ { path = "django_debug_toolbar-8.0.0-py3-none-any.whl" },
]
[[package]]
@@ -480,13 +480,13 @@ wheels = [
[[package]]
name = "django-filter"
-version = "25.2"
+version = "26.1"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "django" },
]
wheels = [
- { path = "django_filter-25.2-py3-none-any.whl" },
+ { path = "django_filter-26.1-py3-none-any.whl" },
]
[[package]]
@@ -499,13 +499,13 @@ wheels = [
[[package]]
name = "django-guardian"
-version = "3.3.2"
+version = "3.5.0"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "django" },
]
wheels = [
- { path = "django_guardian-3.3.2-py3-none-any.whl" },
+ { path = "django_guardian-3.5.0-py3-none-any.whl" },
]
[[package]]
@@ -521,13 +521,13 @@ sdist = { path = "django-notifications-patched-2.0.0.tar.gz" }
[[package]]
name = "django-otp"
-version = "1.7.0"
+version = "1.7.3"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "django" },
]
wheels = [
- { path = "django_otp-1.7.0-py3-none-any.whl" },
+ { path = "django_otp-1.7.3-py3-none-any.whl" },
]
[[package]]
@@ -544,7 +544,7 @@ wheels = [
[[package]]
name = "django-rq"
-version = "3.2.2"
+version = "4.2.0"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "django" },
@@ -552,18 +552,18 @@ dependencies = [
{ name = "rq" },
]
wheels = [
- { path = "django_rq-3.2.2-py3-none-any.whl" },
+ { path = "django_rq-4.2.0-py3-none-any.whl" },
]
[[package]]
name = "djangorestframework"
-version = "3.16.1"
+version = "3.18.1"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "django" },
]
wheels = [
- { path = "djangorestframework-3.16.1-py3-none-any.whl" },
+ { path = "djangorestframework-3.18.1-py3-none-any.whl" },
]
[[package]]
@@ -593,14 +593,14 @@ wheels = [
[[package]]
name = "fakeredis"
-version = "2.36.2"
+version = "2.38.0"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "redis" },
{ name = "sortedcontainers" },
]
wheels = [
- { path = "fakeredis-2.36.2-py3-none-any.whl" },
+ { path = "fakeredis-2.38.0-py3-none-any.whl" },
]
[[package]]
@@ -687,11 +687,11 @@ wheels = [
[[package]]
name = "lxml"
-version = "6.1.1"
+version = "6.1.3"
source = { registry = "thirdparty/dist" }
wheels = [
- { path = "lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl" },
- { path = "lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl" },
+ { path = "lxml-6.1.3-cp314-cp314-macosx_10_15_universal2.whl" },
+ { path = "lxml-6.1.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl" },
]
[[package]]
@@ -735,9 +735,12 @@ wheels = [
[[package]]
name = "msgspec"
-version = "0.20.0"
+version = "0.21.1"
source = { registry = "thirdparty/dist" }
-sdist = { path = "msgspec-0.20.0.tar.gz" }
+wheels = [
+ { path = "msgspec-0.21.1-cp314-cp314-macosx_11_0_arm64.whl" },
+ { path = "msgspec-0.21.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" },
+]
[[package]]
name = "natsort"
@@ -803,10 +806,10 @@ wheels = [
[[package]]
name = "psycopg"
-version = "3.3.4"
+version = "3.3.5"
source = { registry = "thirdparty/dist" }
wheels = [
- { path = "psycopg-3.3.4-py3-none-any.whl" },
+ { path = "psycopg-3.3.5-py3-none-any.whl" },
]
[[package]]
@@ -1006,7 +1009,7 @@ wheels = [
[[package]]
name = "rq"
-version = "2.9.0"
+version = "2.12.0"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "click" },
@@ -1014,7 +1017,7 @@ dependencies = [
{ name = "redis" },
]
wheels = [
- { path = "rq-2.9.0-py3-none-any.whl" },
+ { path = "rq-2.12.0-py3-none-any.whl" },
]
[[package]]
@@ -1119,21 +1122,21 @@ wheels = [
[[package]]
name = "typing-extensions"
-version = "4.15.0"
+version = "4.16.0"
source = { registry = "thirdparty/dist" }
wheels = [
- { path = "typing_extensions-4.15.0-py3-none-any.whl" },
+ { path = "typing_extensions-4.16.0-py3-none-any.whl" },
]
[[package]]
name = "typing-inspection"
-version = "0.4.2"
+version = "0.4.4"
source = { registry = "thirdparty/dist" }
dependencies = [
{ name = "typing-extensions" },
]
wheels = [
- { path = "typing_inspection-0.4.2-py3-none-any.whl" },
+ { path = "typing_inspection-0.4.4-py3-none-any.whl" },
]
[[package]]
@@ -1154,10 +1157,10 @@ wheels = [
[[package]]
name = "webencodings"
-version = "0.5.1"
+version = "0.6.1"
source = { registry = "thirdparty/dist" }
wheels = [
- { path = "webencodings-0.5.1-py2.py3-none-any.whl" },
+ { path = "webencodings-0.6.1-py3-none-any.whl" },
]
[[package]]