From d4331d40b85035e651510bc9becdd5116e5b2f1c Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Mon, 6 Oct 2025 17:25:18 +0300 Subject: [PATCH 01/11] deps: bump django 5.2 and requirements Details: - Bump Django 5.2 - Bump all requirements to latest versions - Switch to psycopg[c] - Remove deprecated 'drf-oidc-auth'-package - Remove django-csp version pin - Remove ruff- and pre-commit-packages - Remove outdated ruff and pre-commit-sync tests - Add migration for organizations-module Refs: PT-1947 --- .../migrations/0016_user_last_api_use.py | 18 + .../tests/test_pre_commit_ruff_version.py | 42 - requirements-dev.in | 2 - requirements-dev.txt | 637 +++++---- requirements.in | 7 +- requirements.txt | 1200 +++++++++-------- 6 files changed, 988 insertions(+), 918 deletions(-) create mode 100644 organisations/migrations/0016_user_last_api_use.py delete mode 100644 palvelutarjotin/tests/test_pre_commit_ruff_version.py diff --git a/organisations/migrations/0016_user_last_api_use.py b/organisations/migrations/0016_user_last_api_use.py new file mode 100644 index 00000000..df60ff7f --- /dev/null +++ b/organisations/migrations/0016_user_last_api_use.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2025-10-06 13:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organisations', '0015_add_ordering_and_indices_to_organisations'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='last_api_use', + field=models.DateField(blank=True, null=True, verbose_name='Latest API token usage date'), + ), + ] diff --git a/palvelutarjotin/tests/test_pre_commit_ruff_version.py b/palvelutarjotin/tests/test_pre_commit_ruff_version.py deleted file mode 100644 index a10ea689..00000000 --- a/palvelutarjotin/tests/test_pre_commit_ruff_version.py +++ /dev/null @@ -1,42 +0,0 @@ -import re - -RUFF_VERSION_PRE_COMMIT_REGEX = re.compile( - r"rev: v(\d+(\.\d+)+)\s*# ruff-pre-commit version" -) -RUFF_VERSION_DEV_REQS_REGEX = re.compile(r"^ruff==(\d+(\.\d+)+)\s*\S$") - - -def get_ruff_version_from_dev_requirements() -> str | None: - with open("./requirements-dev.txt") as file: - dev_requirements = file.read() - for line in dev_requirements.splitlines(): - match = RUFF_VERSION_DEV_REQS_REGEX.search(line) - if match: - return match.group(1) - return None - - -def get_ruff_version_from_pre_commit_config() -> str | None: - with open("./.pre-commit-config.yaml") as file: - pre_commit_config = file.read() - for line in pre_commit_config.splitlines(): - match = RUFF_VERSION_PRE_COMMIT_REGEX.search(line) - if match: - return match.group(1) - return None - - -def test_ruff_is_in_dev_requirements(): - ruff_version_dev_requirements = get_ruff_version_from_dev_requirements() - assert ruff_version_dev_requirements is not None - - -def test_ruff_is_in_pre_commit_config(): - ruff_version_pre_commit = get_ruff_version_from_pre_commit_config() - assert ruff_version_pre_commit is not None - - -def test_ruff_same_in_dev_requirements_and_pre_commit_config(): - ruff_version_dev_requirements = get_ruff_version_from_dev_requirements() - ruff_version_pre_commit = get_ruff_version_from_pre_commit_config() - assert ruff_version_dev_requirements == ruff_version_pre_commit diff --git a/requirements-dev.in b/requirements-dev.in index 2d2d0ae8..a166f34a 100644 --- a/requirements-dev.in +++ b/requirements-dev.in @@ -2,12 +2,10 @@ cryptography freezegun parameterized -pre-commit pip-tools pytest pytest-cov pytest-django requests-mock responses -ruff syrupy diff --git a/requirements-dev.txt b/requirements-dev.txt index 329dce7a..a6c8eef7 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,186 +2,186 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --allow-unsafe --cert=None --client-cert=None --generate-hashes --index-url=None --pip-args=None --strip-extras requirements-dev.in +# pip-compile --allow-unsafe --generate-hashes --strip-extras requirements-dev.in # build==1.3.0 \ --hash=sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397 \ --hash=sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4 # via pip-tools -certifi==2025.1.31 \ - --hash=sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651 \ - --hash=sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe +certifi==2025.10.5 \ + --hash=sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de \ + --hash=sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43 # via # -c requirements.txt # requests -cffi==1.17.1 \ - --hash=sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8 \ - --hash=sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2 \ - --hash=sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1 \ - --hash=sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15 \ - --hash=sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36 \ - --hash=sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824 \ - --hash=sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8 \ - --hash=sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36 \ - --hash=sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17 \ - --hash=sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf \ - --hash=sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc \ - --hash=sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3 \ - --hash=sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed \ - --hash=sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702 \ - --hash=sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1 \ - --hash=sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8 \ - --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 \ - --hash=sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6 \ - --hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d \ - --hash=sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b \ - --hash=sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e \ - --hash=sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be \ - --hash=sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c \ - --hash=sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683 \ - --hash=sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9 \ - --hash=sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c \ - --hash=sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8 \ - --hash=sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1 \ - --hash=sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4 \ - --hash=sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655 \ - --hash=sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67 \ - --hash=sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595 \ - --hash=sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0 \ - --hash=sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65 \ - --hash=sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 \ - --hash=sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6 \ - --hash=sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 \ - --hash=sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6 \ - --hash=sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3 \ - --hash=sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16 \ - --hash=sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93 \ - --hash=sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e \ - --hash=sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4 \ - --hash=sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964 \ - --hash=sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c \ - --hash=sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576 \ - --hash=sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0 \ - --hash=sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3 \ - --hash=sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662 \ - --hash=sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3 \ - --hash=sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff \ - --hash=sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5 \ - --hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \ - --hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \ - --hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \ - --hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \ - --hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \ - --hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \ - --hash=sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7 \ - --hash=sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382 \ - --hash=sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a \ - --hash=sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e \ - --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a \ - --hash=sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4 \ - --hash=sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99 \ - --hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \ - --hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b +cffi==2.0.0 \ + --hash=sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb \ + --hash=sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b \ + --hash=sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f \ + --hash=sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9 \ + --hash=sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44 \ + --hash=sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2 \ + --hash=sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c \ + --hash=sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 \ + --hash=sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65 \ + --hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \ + --hash=sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a \ + --hash=sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e \ + --hash=sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 \ + --hash=sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a \ + --hash=sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe \ + --hash=sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b \ + --hash=sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91 \ + --hash=sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592 \ + --hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \ + --hash=sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c \ + --hash=sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1 \ + --hash=sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94 \ + --hash=sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba \ + --hash=sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb \ + --hash=sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165 \ + --hash=sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529 \ + --hash=sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca \ + --hash=sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c \ + --hash=sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6 \ + --hash=sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c \ + --hash=sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0 \ + --hash=sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743 \ + --hash=sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63 \ + --hash=sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 \ + --hash=sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5 \ + --hash=sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4 \ + --hash=sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d \ + --hash=sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b \ + --hash=sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93 \ + --hash=sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205 \ + --hash=sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27 \ + --hash=sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512 \ + --hash=sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d \ + --hash=sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c \ + --hash=sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037 \ + --hash=sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 \ + --hash=sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322 \ + --hash=sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb \ + --hash=sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c \ + --hash=sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8 \ + --hash=sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4 \ + --hash=sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414 \ + --hash=sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9 \ + --hash=sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664 \ + --hash=sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9 \ + --hash=sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 \ + --hash=sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739 \ + --hash=sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc \ + --hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \ + --hash=sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe \ + --hash=sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9 \ + --hash=sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92 \ + --hash=sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5 \ + --hash=sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 \ + --hash=sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d \ + --hash=sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 \ + --hash=sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f \ + --hash=sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495 \ + --hash=sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b \ + --hash=sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6 \ + --hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c \ + --hash=sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef \ + --hash=sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5 \ + --hash=sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18 \ + --hash=sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad \ + --hash=sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3 \ + --hash=sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7 \ + --hash=sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5 \ + --hash=sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534 \ + --hash=sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49 \ + --hash=sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2 \ + --hash=sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 \ + --hash=sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453 \ + --hash=sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf # via # -c requirements.txt # cryptography -cfgv==3.4.0 \ - --hash=sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9 \ - --hash=sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560 - # via pre-commit -charset-normalizer==3.4.1 \ - --hash=sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537 \ - --hash=sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa \ - --hash=sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a \ - --hash=sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294 \ - --hash=sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b \ - --hash=sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd \ - --hash=sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601 \ - --hash=sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd \ - --hash=sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4 \ - --hash=sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d \ - --hash=sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2 \ - --hash=sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313 \ - --hash=sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd \ - --hash=sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa \ - --hash=sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8 \ - --hash=sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1 \ - --hash=sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2 \ - --hash=sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496 \ - --hash=sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d \ - --hash=sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b \ - --hash=sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e \ - --hash=sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a \ - --hash=sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4 \ - --hash=sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca \ - --hash=sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78 \ - --hash=sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408 \ - --hash=sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5 \ - --hash=sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3 \ - --hash=sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f \ - --hash=sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a \ - --hash=sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765 \ - --hash=sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6 \ - --hash=sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146 \ - --hash=sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6 \ - --hash=sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9 \ - --hash=sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd \ - --hash=sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c \ - --hash=sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f \ - --hash=sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545 \ - --hash=sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176 \ - --hash=sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770 \ - --hash=sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824 \ - --hash=sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f \ - --hash=sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf \ - --hash=sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487 \ - --hash=sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d \ - --hash=sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd \ - --hash=sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b \ - --hash=sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534 \ - --hash=sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f \ - --hash=sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b \ - --hash=sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9 \ - --hash=sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd \ - --hash=sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125 \ - --hash=sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9 \ - --hash=sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de \ - --hash=sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11 \ - --hash=sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d \ - --hash=sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35 \ - --hash=sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f \ - --hash=sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda \ - --hash=sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7 \ - --hash=sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a \ - --hash=sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971 \ - --hash=sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8 \ - --hash=sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41 \ - --hash=sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d \ - --hash=sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f \ - --hash=sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757 \ - --hash=sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a \ - --hash=sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886 \ - --hash=sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77 \ - --hash=sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76 \ - --hash=sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247 \ - --hash=sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85 \ - --hash=sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb \ - --hash=sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7 \ - --hash=sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e \ - --hash=sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6 \ - --hash=sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037 \ - --hash=sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1 \ - --hash=sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e \ - --hash=sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807 \ - --hash=sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407 \ - --hash=sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c \ - --hash=sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12 \ - --hash=sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3 \ - --hash=sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089 \ - --hash=sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd \ - --hash=sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e \ - --hash=sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00 \ - --hash=sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616 +charset-normalizer==3.4.3 \ + --hash=sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91 \ + --hash=sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0 \ + --hash=sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154 \ + --hash=sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601 \ + --hash=sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884 \ + --hash=sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07 \ + --hash=sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c \ + --hash=sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64 \ + --hash=sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe \ + --hash=sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f \ + --hash=sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432 \ + --hash=sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc \ + --hash=sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa \ + --hash=sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9 \ + --hash=sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae \ + --hash=sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19 \ + --hash=sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d \ + --hash=sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e \ + --hash=sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4 \ + --hash=sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7 \ + --hash=sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312 \ + --hash=sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92 \ + --hash=sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31 \ + --hash=sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c \ + --hash=sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f \ + --hash=sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99 \ + --hash=sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b \ + --hash=sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15 \ + --hash=sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392 \ + --hash=sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f \ + --hash=sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8 \ + --hash=sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491 \ + --hash=sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0 \ + --hash=sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc \ + --hash=sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0 \ + --hash=sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f \ + --hash=sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a \ + --hash=sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40 \ + --hash=sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927 \ + --hash=sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849 \ + --hash=sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce \ + --hash=sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14 \ + --hash=sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05 \ + --hash=sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c \ + --hash=sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c \ + --hash=sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a \ + --hash=sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc \ + --hash=sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34 \ + --hash=sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9 \ + --hash=sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096 \ + --hash=sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14 \ + --hash=sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30 \ + --hash=sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b \ + --hash=sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b \ + --hash=sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942 \ + --hash=sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db \ + --hash=sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5 \ + --hash=sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b \ + --hash=sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce \ + --hash=sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669 \ + --hash=sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0 \ + --hash=sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018 \ + --hash=sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93 \ + --hash=sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe \ + --hash=sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049 \ + --hash=sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a \ + --hash=sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef \ + --hash=sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2 \ + --hash=sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca \ + --hash=sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16 \ + --hash=sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f \ + --hash=sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb \ + --hash=sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1 \ + --hash=sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557 \ + --hash=sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37 \ + --hash=sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7 \ + --hash=sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72 \ + --hash=sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c \ + --hash=sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9 # via # -c requirements.txt # requests @@ -295,61 +295,68 @@ coverage==7.10.7 \ --hash=sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a \ --hash=sha256:fff7b9c3f19957020cac546c70025331113d2e61537f6e2441bc7657913de7d3 # via pytest-cov -cryptography==44.0.2 \ - --hash=sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390 \ - --hash=sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41 \ - --hash=sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688 \ - --hash=sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5 \ - --hash=sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1 \ - --hash=sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d \ - --hash=sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7 \ - --hash=sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843 \ - --hash=sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5 \ - --hash=sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c \ - --hash=sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a \ - --hash=sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79 \ - --hash=sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6 \ - --hash=sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181 \ - --hash=sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4 \ - --hash=sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5 \ - --hash=sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562 \ - --hash=sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639 \ - --hash=sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922 \ - --hash=sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3 \ - --hash=sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d \ - --hash=sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471 \ - --hash=sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd \ - --hash=sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa \ - --hash=sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb \ - --hash=sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699 \ - --hash=sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb \ - --hash=sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa \ - --hash=sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0 \ - --hash=sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23 \ - --hash=sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9 \ - --hash=sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615 \ - --hash=sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea \ - --hash=sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7 \ - --hash=sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308 +cryptography==46.0.2 \ + --hash=sha256:04911b149eae142ccd8c9a68892a70c21613864afb47aba92d8c7ed9cc001023 \ + --hash=sha256:07c0eb6657c0e9cca5891f4e35081dbf985c8131825e21d99b4f440a8f496f36 \ + --hash=sha256:0b507c8e033307e37af61cb9f7159b416173bdf5b41d11c4df2e499a1d8e007c \ + --hash=sha256:0c7ffe8c9b1fcbb07a26d7c9fa5e857c2fe80d72d7b9e0353dcf1d2180ae60ee \ + --hash=sha256:1a88634851d9b8de8bb53726f4300ab191d3b2f42595e2581a54b26aba71b7cc \ + --hash=sha256:1d3b3edd145953832e09607986f2bd86f85d1dc9c48ced41808b18009d9f30e5 \ + --hash=sha256:1e3b6428a3d56043bff0bb85b41c535734204e599c1c0977e1d0f261b02f3ad5 \ + --hash=sha256:1fd1a69086926b623ef8126b4c33d5399ce9e2f3fac07c9c734c2a4ec38b6d02 \ + --hash=sha256:218abd64a2e72f8472c2102febb596793347a3e65fafbb4ad50519969da44470 \ + --hash=sha256:21b6fc8c71a3f9a604f028a329e5560009cc4a3a828bfea5fcba8eb7647d88fe \ + --hash=sha256:27c53b4f6a682a1b645fbf1cd5058c72cf2f5aeba7d74314c36838c7cbc06e0f \ + --hash=sha256:2b9cad9cf71d0c45566624ff76654e9bae5f8a25970c250a26ccfc73f8553e2d \ + --hash=sha256:2fafb6aa24e702bbf74de4cb23bfa2c3beb7ab7683a299062b69724c92e0fa73 \ + --hash=sha256:3f37aa12b2d91e157827d90ce78f6180f0c02319468a0aea86ab5a9566da644b \ + --hash=sha256:48b983089378f50cba258f7f7aa28198c3f6e13e607eaf10472c26320332ca9a \ + --hash=sha256:48c01988ecbb32979bb98731f5c2b2f79042a6c58cc9a319c8c2f9987c7f68f9 \ + --hash=sha256:4a766d2a5d8127364fd936572c6e6757682fc5dfcbdba1632d4554943199f2fa \ + --hash=sha256:512c0250065e0a6b286b2db4bbcc2e67d810acd53eb81733e71314340366279e \ + --hash=sha256:5840f05518caa86b09d23f8b9405a7b6d5400085aa14a72a98fdf5cf1568c0d2 \ + --hash=sha256:5e38f203160a48b93010b07493c15f2babb4e0f2319bbd001885adb3f3696d21 \ + --hash=sha256:6b275e398ab3a7905e168c036aad54b5969d63d3d9099a0a66cc147a3cc983be \ + --hash=sha256:7282d8f092b5be7172d6472f29b0631f39f18512a3642aefe52c3c0e0ccfad5a \ + --hash=sha256:747b6f4a4a23d5a215aadd1d0b12233b4119c4313df83ab4137631d43672cc90 \ + --hash=sha256:758cfc7f4c38c5c5274b55a57ef1910107436f4ae842478c4989abbd24bd5acb \ + --hash=sha256:8b16c1ede6a937c291d41176934268e4ccac2c6521c69d3f5961c5a1e11e039e \ + --hash=sha256:8b9bf67b11ef9e28f4d78ff88b04ed0929fcd0e4f70bb0f704cfc32a5c6311ee \ + --hash=sha256:8e2ad4d1a5899b7caa3a450e33ee2734be7cc0689010964703a7c4bcc8dd4fd0 \ + --hash=sha256:9066cfd7f146f291869a9898b01df1c9b0e314bfa182cef432043f13fc462c92 \ + --hash=sha256:91447f2b17e83c9e0c89f133119d83f94ce6e0fb55dd47da0a959316e6e9cfa1 \ + --hash=sha256:97e83bf4f2f2c084d8dd792d13841d0a9b241643151686010866bbd076b19659 \ + --hash=sha256:9bd26f2f75a925fdf5e0a446c0de2714f17819bf560b44b7480e4dd632ad6c46 \ + --hash=sha256:9bdc25e4e01b261a8fda4e98618f1c9515febcecebc9566ddf4a70c63967043b \ + --hash=sha256:9ec3f2e2173f36a9679d3b06d3d01121ab9b57c979de1e6a244b98d51fea1b20 \ + --hash=sha256:9f13b040649bc18e7eb37936009b24fd31ca095a5c647be8bb6aaf1761142bd1 \ + --hash=sha256:a08e7401a94c002e79dc3bc5231b6558cd4b2280ee525c4673f650a37e2c7685 \ + --hash=sha256:a61c154cc5488272a6c4b86e8d5beff4639cdb173d75325ce464d723cda0052b \ + --hash=sha256:bb7fb9cd44c2582aa5990cf61a4183e6f54eea3172e54963787ba47287edd135 \ + --hash=sha256:bca3f0ce67e5a2a2cf524e86f44697c4323a86e0fd7ba857de1c30d52c11ede1 \ + --hash=sha256:bda55e8dbe8533937956c996beaa20266a8eca3570402e52ae52ed60de1faca8 \ + --hash=sha256:be939b99d4e091eec9a2bcf41aaf8f351f312cd19ff74b5c83480f08a8a43e0b \ + --hash=sha256:c4b93af7920cdf80f71650769464ccf1fb49a4b56ae0024173c24c48eb6b1612 \ + --hash=sha256:cb5e8daac840e8879407acbe689a174f5ebaf344a062f8918e526824eb5d97af \ + --hash=sha256:d19f5f48883752b5ab34cff9e2f7e4a7f216296f33714e77d1beb03d108632b6 \ + --hash=sha256:d30bc11d35743bf4ddf76674a0a369ec8a21f87aaa09b0661b04c5f6c46e8d7b \ + --hash=sha256:e12b61e0b86611e3f4c1756686d9086c1d36e6fd15326f5658112ad1f1cc8807 \ + --hash=sha256:e6f6775eaaa08c0eec73e301f7592f4367ccde5e4e4df8e58320f2ebf161ea2c \ + --hash=sha256:e7155c0b004e936d381b15425273aee1cebc94f879c0ce82b0d7fecbf755d53a \ + --hash=sha256:e8633996579961f9b5a3008683344c2558d38420029d3c0bc7ff77c17949a4e1 \ + --hash=sha256:f25a41f5b34b371a06dad3f01799706631331adc7d6c05253f5bca22068c7a34 \ + --hash=sha256:f3e32ab7dd1b1ef67b9232c4cf5e2ee4cd517d4316ea910acaaa9c5712a1c663 \ + --hash=sha256:f9b2dc7668418fb6f221e4bf701f716e05e8eadb4f1988a2487b11aedf8abe62 \ + --hash=sha256:fab8f805e9675e61ed8538f192aad70500fa6afb33a8803932999b1049363a08 \ + --hash=sha256:fe245cf4a73c20592f0f48da39748b3513db114465be78f0a36da847221bd1b4 \ + --hash=sha256:ff798ad7a957a5021dcbab78dfff681f0cf15744d0e6af62bd6746984d9c9e9c # via # -c requirements.txt # -r requirements-dev.in -distlib==0.4.0 \ - --hash=sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16 \ - --hash=sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d - # via virtualenv -filelock==3.19.1 \ - --hash=sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58 \ - --hash=sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d - # via virtualenv freezegun==1.5.5 \ --hash=sha256:ac7742a6cc6c25a2c35e9292dfd554b897b517d2dec26891a2e8debf205cb94a \ --hash=sha256:cd557f4a75cf074e84bc374249b9dd491eaeacd61376b9eb3c423282211619d2 # via -r requirements-dev.in -identify==2.6.14 \ - --hash=sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e \ - --hash=sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a - # via pre-commit idna==3.10 \ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 @@ -360,13 +367,9 @@ iniconfig==2.1.0 \ --hash=sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7 \ --hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 # via pytest -nodeenv==1.9.1 \ - --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ - --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 - # via pre-commit -packaging==24.2 \ - --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 \ - --hash=sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ + --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f # via # -c requirements.txt # build @@ -375,27 +378,19 @@ parameterized==0.9.0 \ --hash=sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b \ --hash=sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1 # via -r requirements-dev.in -pip-tools==7.5.0 \ - --hash=sha256:30639f50961bb09f49d22f4389e8d7d990709677c094ce1114186b1f2e9b5821 \ - --hash=sha256:69758e4e5a65f160e315d74db46246fdbb30d549f1ed0c4236d057122c9b0f18 +pip-tools==7.5.1 \ + --hash=sha256:a051a94794ba52df9acad2d7c9b0b09ae001617db458a543f8287fea7b89c2cf \ + --hash=sha256:f5ff803823529edc0e6e40c86b1aa7da7266fb1078093c8beea4e5b77877036a # via -r requirements-dev.in -platformdirs==4.4.0 \ - --hash=sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85 \ - --hash=sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf - # via virtualenv pluggy==1.6.0 \ --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 # via # pytest # pytest-cov -pre-commit==4.3.0 \ - --hash=sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8 \ - --hash=sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16 - # via -r requirements-dev.in -pycparser==2.22 \ - --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ - --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc +pycparser==2.23 \ + --hash=sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2 \ + --hash=sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934 # via # -c requirements.txt # cffi @@ -433,67 +428,86 @@ python-dateutil==2.9.0.post0 \ # via # -c requirements.txt # freezegun -pyyaml==6.0.2 \ - --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ - --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ - --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ - --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ - --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ - --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ - --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ - --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ - --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ - --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ - --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ - --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ - --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ - --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ - --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ - --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ - --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ - --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ - --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ - --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ - --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ - --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ - --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ - --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ - --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ - --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ - --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ - --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ - --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ - --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ - --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ - --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ - --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ - --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ - --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ - --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ - --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ - --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ - --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ - --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ - --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ - --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ - --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ - --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ - --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ - --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ - --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ - --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ - --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ - --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ - --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ - --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ - --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 +pyyaml==6.0.3 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 # via # -c requirements.txt - # pre-commit # responses -requests==2.32.4 \ - --hash=sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c \ - --hash=sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422 +requests==2.32.5 \ + --hash=sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6 \ + --hash=sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf # via # -c requirements.txt # requests-mock @@ -506,36 +520,15 @@ responses==0.25.8 \ --hash=sha256:0c710af92def29c8352ceadff0c3fe340ace27cf5af1bbe46fb71275bcd2831c \ --hash=sha256:9374d047a575c8f781b94454db5cab590b6029505f488d12899ddb10a4af1cf4 # via -r requirements-dev.in -ruff==0.13.2 \ - --hash=sha256:17d95fb32218357c89355f6f6f9a804133e404fc1f65694372e02a557edf8585 \ - --hash=sha256:1887c230c2c9d65ed1b4e4cfe4d255577ea28b718ae226c348ae68df958191aa \ - --hash=sha256:1dbc875cf3720c64b3990fef8939334e74cb0ca65b8dbc61d1f439201a38101b \ - --hash=sha256:3196bc13ab2110c176b9a4ae5ff7ab676faaa1964b330a1383ba20e1e19645f2 \ - --hash=sha256:3796345842b55f033a78285e4f1641078f902020d8450cade03aad01bffd81c3 \ - --hash=sha256:4f8f9e3cd6714358238cd6626b9d43026ed19c0c018376ac1ef3c3a04ffb42d8 \ - --hash=sha256:50e2d52acb8de3804fc5f6e2fa3ae9bdc6812410a9e46837e673ad1f90a18736 \ - --hash=sha256:5b939a1b2a960e9742e9a347e5bbc9b3c3d2c716f86c6ae273d9cbd64f193f22 \ - --hash=sha256:5bcb10276b69b3cfea3a102ca119ffe5c6ba3901e20e60cf9efb53fa417633c3 \ - --hash=sha256:6ae3f469b5465ba6d9721383ae9d49310c19b452a161b57507764d7ef15f4b07 \ - --hash=sha256:7c2a0b7c1e87795fec3404a485096bcd790216c7c146a922d121d8b9c8f1aaac \ - --hash=sha256:aed130b2fde049cea2019f55deb939103123cdd191105f97a0599a3e753d61b0 \ - --hash=sha256:afa721017aa55a555b2ff7944816587f1cb813c2c0a882d158f59b832da1660d \ - --hash=sha256:c6ed79584a8f6cbe2e5d7dbacf7cc1ee29cbdb5df1172e77fbdadc8bb85a1f89 \ - --hash=sha256:c75e9d2a2fafd1fdd895d0e7e24b44355984affdde1c412a6f6d3f6e16b22d46 \ - --hash=sha256:cb12fffd32fb16d32cef4ed16d8c7cdc27ed7c944eaa98d99d01ab7ab0b710ff \ - --hash=sha256:cceac74e7bbc53ed7d15d1042ffe7b6577bf294611ad90393bf9b2a0f0ec7cb6 \ - --hash=sha256:da711b14c530412c827219312b7d7fbb4877fb31150083add7e8c5336549cea7 \ - --hash=sha256:ff7e4dda12e683e9709ac89e2dd436abf31a4d8a8fc3d89656231ed808e231d2 - # via -r requirements-dev.in six==1.17.0 \ --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 # via # -c requirements.txt # python-dateutil -syrupy==4.9.1 \ - --hash=sha256:b7d0fcadad80a7d2f6c4c71917918e8ebe2483e8c703dfc8d49cdbb01081f9a4 \ - --hash=sha256:b94cc12ed0e5e75b448255430af642516842a2374a46936dd2650cfb6dd20eda +syrupy==5.0.0 \ + --hash=sha256:3282fe963fa5d4d3e47231b16d1d4d0f4523705e8199eeb99a22a1bc9f5942f2 \ + --hash=sha256:c848e1a980ca52a28715cd2d2b4d434db424699c05653bd1158fb31cf56e9546 # via -r requirements-dev.in urllib3==2.5.0 \ --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \ @@ -544,10 +537,6 @@ urllib3==2.5.0 \ # -c requirements.txt # requests # responses -virtualenv==20.34.0 \ - --hash=sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026 \ - --hash=sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a - # via pre-commit wheel==0.45.1 \ --hash=sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729 \ --hash=sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248 diff --git a/requirements.in b/requirements.in index b8624aa4..928694d8 100644 --- a/requirements.in +++ b/requirements.in @@ -3,7 +3,7 @@ django-admin-list-filter-dropdown django-axes django-auditlog django-cors-headers -django-csp~=4.0 +django-csp django-environ django-filter django-graphql-jwt @@ -12,8 +12,7 @@ django-helusers django-ilmoitin django-parler django-utils-six -Django~=4.2.25 -drf-oidc-auth +Django~=5.2 drf-spectacular factory-boy geopy @@ -22,7 +21,7 @@ graphene-file-upload helsinki-profile-gdpr-api importlib_metadata ipython -psycopg2 +psycopg[c] requests sentry-sdk social-auth-app-django diff --git a/requirements.txt b/requirements.txt index be06028a..d1907cb0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.12 # by the following command: # -# pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in +# pip-compile --allow-unsafe --cert=None --client-cert=None --generate-hashes --index-url=None --pip-args=None --strip-extras requirements.in # -asgiref==3.8.1 \ - --hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 \ - --hash=sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590 +asgiref==3.10.0 \ + --hash=sha256:aef8a81283a34d0ab31630c9b7dfe70c812c95eba78171367ca8745e88124734 \ + --hash=sha256:d89f2d8cd8b56dada7d52fa7dc8075baa08fb836560710d38c292a7a3f78c04e # via # django # django-axes @@ -21,220 +21,243 @@ attrs==25.3.0 \ # via # jsonschema # referencing -authlib==1.6.4 \ - --hash=sha256:104b0442a43061dc8bc23b133d1d06a2b0a9c2e3e33f34c4338929e816287649 \ - --hash=sha256:39313d2a2caac3ecf6d8f95fbebdfd30ae6ea6ae6a6db794d976405fdd9aa796 +authlib==1.6.5 \ + --hash=sha256:3e0e0507807f842b02175507bdee8957a1d5707fd4afb17c32fb43fee90b6e3a \ + --hash=sha256:6aaf9c79b7cc96c900f0b284061691c5d4e61221640a948fe690b556a6d6d10b # via drf-oidc-auth -cachetools==5.5.2 \ - --hash=sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4 \ - --hash=sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a +cachetools==6.2.0 \ + --hash=sha256:1c76a8960c0041fcc21097e357f882197c79da0dbff766e7317890a65d7d8ba6 \ + --hash=sha256:38b328c0889450f05f5e120f56ab68c8abaf424e1275522b138ffc93253f7e32 # via django-helusers -certifi==2025.1.31 \ - --hash=sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651 \ - --hash=sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe +certifi==2025.10.5 \ + --hash=sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de \ + --hash=sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43 # via # -r requirements.in # requests # sentry-sdk -cffi==1.17.1 \ - --hash=sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8 \ - --hash=sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2 \ - --hash=sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1 \ - --hash=sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15 \ - --hash=sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36 \ - --hash=sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824 \ - --hash=sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8 \ - --hash=sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36 \ - --hash=sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17 \ - --hash=sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf \ - --hash=sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc \ - --hash=sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3 \ - --hash=sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed \ - --hash=sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702 \ - --hash=sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1 \ - --hash=sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8 \ - --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 \ - --hash=sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6 \ - --hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d \ - --hash=sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b \ - --hash=sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e \ - --hash=sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be \ - --hash=sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c \ - --hash=sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683 \ - --hash=sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9 \ - --hash=sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c \ - --hash=sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8 \ - --hash=sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1 \ - --hash=sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4 \ - --hash=sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655 \ - --hash=sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67 \ - --hash=sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595 \ - --hash=sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0 \ - --hash=sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65 \ - --hash=sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 \ - --hash=sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6 \ - --hash=sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 \ - --hash=sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6 \ - --hash=sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3 \ - --hash=sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16 \ - --hash=sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93 \ - --hash=sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e \ - --hash=sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4 \ - --hash=sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964 \ - --hash=sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c \ - --hash=sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576 \ - --hash=sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0 \ - --hash=sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3 \ - --hash=sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662 \ - --hash=sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3 \ - --hash=sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff \ - --hash=sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5 \ - --hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \ - --hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \ - --hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \ - --hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \ - --hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \ - --hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \ - --hash=sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7 \ - --hash=sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382 \ - --hash=sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a \ - --hash=sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e \ - --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a \ - --hash=sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4 \ - --hash=sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99 \ - --hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \ - --hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b +cffi==2.0.0 \ + --hash=sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb \ + --hash=sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b \ + --hash=sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f \ + --hash=sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9 \ + --hash=sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44 \ + --hash=sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2 \ + --hash=sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c \ + --hash=sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 \ + --hash=sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65 \ + --hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \ + --hash=sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a \ + --hash=sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e \ + --hash=sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 \ + --hash=sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a \ + --hash=sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe \ + --hash=sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b \ + --hash=sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91 \ + --hash=sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592 \ + --hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \ + --hash=sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c \ + --hash=sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1 \ + --hash=sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94 \ + --hash=sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba \ + --hash=sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb \ + --hash=sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165 \ + --hash=sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529 \ + --hash=sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca \ + --hash=sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c \ + --hash=sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6 \ + --hash=sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c \ + --hash=sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0 \ + --hash=sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743 \ + --hash=sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63 \ + --hash=sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 \ + --hash=sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5 \ + --hash=sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4 \ + --hash=sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d \ + --hash=sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b \ + --hash=sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93 \ + --hash=sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205 \ + --hash=sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27 \ + --hash=sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512 \ + --hash=sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d \ + --hash=sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c \ + --hash=sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037 \ + --hash=sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 \ + --hash=sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322 \ + --hash=sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb \ + --hash=sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c \ + --hash=sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8 \ + --hash=sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4 \ + --hash=sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414 \ + --hash=sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9 \ + --hash=sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664 \ + --hash=sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9 \ + --hash=sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 \ + --hash=sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739 \ + --hash=sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc \ + --hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \ + --hash=sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe \ + --hash=sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9 \ + --hash=sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92 \ + --hash=sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5 \ + --hash=sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 \ + --hash=sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d \ + --hash=sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 \ + --hash=sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f \ + --hash=sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495 \ + --hash=sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b \ + --hash=sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6 \ + --hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c \ + --hash=sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef \ + --hash=sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5 \ + --hash=sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18 \ + --hash=sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad \ + --hash=sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3 \ + --hash=sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7 \ + --hash=sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5 \ + --hash=sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534 \ + --hash=sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49 \ + --hash=sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2 \ + --hash=sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 \ + --hash=sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453 \ + --hash=sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf # via cryptography -charset-normalizer==3.4.1 \ - --hash=sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537 \ - --hash=sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa \ - --hash=sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a \ - --hash=sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294 \ - --hash=sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b \ - --hash=sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd \ - --hash=sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601 \ - --hash=sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd \ - --hash=sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4 \ - --hash=sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d \ - --hash=sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2 \ - --hash=sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313 \ - --hash=sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd \ - --hash=sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa \ - --hash=sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8 \ - --hash=sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1 \ - --hash=sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2 \ - --hash=sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496 \ - --hash=sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d \ - --hash=sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b \ - --hash=sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e \ - --hash=sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a \ - --hash=sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4 \ - --hash=sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca \ - --hash=sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78 \ - --hash=sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408 \ - --hash=sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5 \ - --hash=sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3 \ - --hash=sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f \ - --hash=sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a \ - --hash=sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765 \ - --hash=sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6 \ - --hash=sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146 \ - --hash=sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6 \ - --hash=sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9 \ - --hash=sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd \ - --hash=sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c \ - --hash=sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f \ - --hash=sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545 \ - --hash=sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176 \ - --hash=sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770 \ - --hash=sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824 \ - --hash=sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f \ - --hash=sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf \ - --hash=sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487 \ - --hash=sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d \ - --hash=sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd \ - --hash=sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b \ - --hash=sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534 \ - --hash=sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f \ - --hash=sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b \ - --hash=sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9 \ - --hash=sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd \ - --hash=sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125 \ - --hash=sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9 \ - --hash=sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de \ - --hash=sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11 \ - --hash=sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d \ - --hash=sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35 \ - --hash=sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f \ - --hash=sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda \ - --hash=sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7 \ - --hash=sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a \ - --hash=sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971 \ - --hash=sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8 \ - --hash=sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41 \ - --hash=sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d \ - --hash=sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f \ - --hash=sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757 \ - --hash=sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a \ - --hash=sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886 \ - --hash=sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77 \ - --hash=sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76 \ - --hash=sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247 \ - --hash=sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85 \ - --hash=sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb \ - --hash=sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7 \ - --hash=sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e \ - --hash=sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6 \ - --hash=sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037 \ - --hash=sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1 \ - --hash=sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e \ - --hash=sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807 \ - --hash=sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407 \ - --hash=sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c \ - --hash=sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12 \ - --hash=sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3 \ - --hash=sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089 \ - --hash=sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd \ - --hash=sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e \ - --hash=sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00 \ - --hash=sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616 +charset-normalizer==3.4.3 \ + --hash=sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91 \ + --hash=sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0 \ + --hash=sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154 \ + --hash=sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601 \ + --hash=sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884 \ + --hash=sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07 \ + --hash=sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c \ + --hash=sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64 \ + --hash=sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe \ + --hash=sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f \ + --hash=sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432 \ + --hash=sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc \ + --hash=sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa \ + --hash=sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9 \ + --hash=sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae \ + --hash=sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19 \ + --hash=sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d \ + --hash=sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e \ + --hash=sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4 \ + --hash=sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7 \ + --hash=sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312 \ + --hash=sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92 \ + --hash=sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31 \ + --hash=sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c \ + --hash=sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f \ + --hash=sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99 \ + --hash=sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b \ + --hash=sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15 \ + --hash=sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392 \ + --hash=sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f \ + --hash=sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8 \ + --hash=sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491 \ + --hash=sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0 \ + --hash=sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc \ + --hash=sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0 \ + --hash=sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f \ + --hash=sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a \ + --hash=sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40 \ + --hash=sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927 \ + --hash=sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849 \ + --hash=sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce \ + --hash=sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14 \ + --hash=sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05 \ + --hash=sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c \ + --hash=sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c \ + --hash=sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a \ + --hash=sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc \ + --hash=sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34 \ + --hash=sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9 \ + --hash=sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096 \ + --hash=sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14 \ + --hash=sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30 \ + --hash=sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b \ + --hash=sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b \ + --hash=sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942 \ + --hash=sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db \ + --hash=sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5 \ + --hash=sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b \ + --hash=sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce \ + --hash=sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669 \ + --hash=sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0 \ + --hash=sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018 \ + --hash=sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93 \ + --hash=sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe \ + --hash=sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049 \ + --hash=sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a \ + --hash=sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef \ + --hash=sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2 \ + --hash=sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca \ + --hash=sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16 \ + --hash=sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f \ + --hash=sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb \ + --hash=sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1 \ + --hash=sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557 \ + --hash=sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37 \ + --hash=sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7 \ + --hash=sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72 \ + --hash=sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c \ + --hash=sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9 # via requests -cryptography==44.0.2 \ - --hash=sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390 \ - --hash=sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41 \ - --hash=sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688 \ - --hash=sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5 \ - --hash=sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1 \ - --hash=sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d \ - --hash=sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7 \ - --hash=sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843 \ - --hash=sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5 \ - --hash=sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c \ - --hash=sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a \ - --hash=sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79 \ - --hash=sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6 \ - --hash=sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181 \ - --hash=sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4 \ - --hash=sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5 \ - --hash=sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562 \ - --hash=sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639 \ - --hash=sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922 \ - --hash=sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3 \ - --hash=sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d \ - --hash=sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471 \ - --hash=sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd \ - --hash=sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa \ - --hash=sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb \ - --hash=sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699 \ - --hash=sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb \ - --hash=sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa \ - --hash=sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0 \ - --hash=sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23 \ - --hash=sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9 \ - --hash=sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615 \ - --hash=sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea \ - --hash=sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7 \ - --hash=sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308 +cryptography==46.0.2 \ + --hash=sha256:04911b149eae142ccd8c9a68892a70c21613864afb47aba92d8c7ed9cc001023 \ + --hash=sha256:07c0eb6657c0e9cca5891f4e35081dbf985c8131825e21d99b4f440a8f496f36 \ + --hash=sha256:0b507c8e033307e37af61cb9f7159b416173bdf5b41d11c4df2e499a1d8e007c \ + --hash=sha256:0c7ffe8c9b1fcbb07a26d7c9fa5e857c2fe80d72d7b9e0353dcf1d2180ae60ee \ + --hash=sha256:1a88634851d9b8de8bb53726f4300ab191d3b2f42595e2581a54b26aba71b7cc \ + --hash=sha256:1d3b3edd145953832e09607986f2bd86f85d1dc9c48ced41808b18009d9f30e5 \ + --hash=sha256:1e3b6428a3d56043bff0bb85b41c535734204e599c1c0977e1d0f261b02f3ad5 \ + --hash=sha256:1fd1a69086926b623ef8126b4c33d5399ce9e2f3fac07c9c734c2a4ec38b6d02 \ + --hash=sha256:218abd64a2e72f8472c2102febb596793347a3e65fafbb4ad50519969da44470 \ + --hash=sha256:21b6fc8c71a3f9a604f028a329e5560009cc4a3a828bfea5fcba8eb7647d88fe \ + --hash=sha256:27c53b4f6a682a1b645fbf1cd5058c72cf2f5aeba7d74314c36838c7cbc06e0f \ + --hash=sha256:2b9cad9cf71d0c45566624ff76654e9bae5f8a25970c250a26ccfc73f8553e2d \ + --hash=sha256:2fafb6aa24e702bbf74de4cb23bfa2c3beb7ab7683a299062b69724c92e0fa73 \ + --hash=sha256:3f37aa12b2d91e157827d90ce78f6180f0c02319468a0aea86ab5a9566da644b \ + --hash=sha256:48b983089378f50cba258f7f7aa28198c3f6e13e607eaf10472c26320332ca9a \ + --hash=sha256:48c01988ecbb32979bb98731f5c2b2f79042a6c58cc9a319c8c2f9987c7f68f9 \ + --hash=sha256:4a766d2a5d8127364fd936572c6e6757682fc5dfcbdba1632d4554943199f2fa \ + --hash=sha256:512c0250065e0a6b286b2db4bbcc2e67d810acd53eb81733e71314340366279e \ + --hash=sha256:5840f05518caa86b09d23f8b9405a7b6d5400085aa14a72a98fdf5cf1568c0d2 \ + --hash=sha256:5e38f203160a48b93010b07493c15f2babb4e0f2319bbd001885adb3f3696d21 \ + --hash=sha256:6b275e398ab3a7905e168c036aad54b5969d63d3d9099a0a66cc147a3cc983be \ + --hash=sha256:7282d8f092b5be7172d6472f29b0631f39f18512a3642aefe52c3c0e0ccfad5a \ + --hash=sha256:747b6f4a4a23d5a215aadd1d0b12233b4119c4313df83ab4137631d43672cc90 \ + --hash=sha256:758cfc7f4c38c5c5274b55a57ef1910107436f4ae842478c4989abbd24bd5acb \ + --hash=sha256:8b16c1ede6a937c291d41176934268e4ccac2c6521c69d3f5961c5a1e11e039e \ + --hash=sha256:8b9bf67b11ef9e28f4d78ff88b04ed0929fcd0e4f70bb0f704cfc32a5c6311ee \ + --hash=sha256:8e2ad4d1a5899b7caa3a450e33ee2734be7cc0689010964703a7c4bcc8dd4fd0 \ + --hash=sha256:9066cfd7f146f291869a9898b01df1c9b0e314bfa182cef432043f13fc462c92 \ + --hash=sha256:91447f2b17e83c9e0c89f133119d83f94ce6e0fb55dd47da0a959316e6e9cfa1 \ + --hash=sha256:97e83bf4f2f2c084d8dd792d13841d0a9b241643151686010866bbd076b19659 \ + --hash=sha256:9bd26f2f75a925fdf5e0a446c0de2714f17819bf560b44b7480e4dd632ad6c46 \ + --hash=sha256:9bdc25e4e01b261a8fda4e98618f1c9515febcecebc9566ddf4a70c63967043b \ + --hash=sha256:9ec3f2e2173f36a9679d3b06d3d01121ab9b57c979de1e6a244b98d51fea1b20 \ + --hash=sha256:9f13b040649bc18e7eb37936009b24fd31ca095a5c647be8bb6aaf1761142bd1 \ + --hash=sha256:a08e7401a94c002e79dc3bc5231b6558cd4b2280ee525c4673f650a37e2c7685 \ + --hash=sha256:a61c154cc5488272a6c4b86e8d5beff4639cdb173d75325ce464d723cda0052b \ + --hash=sha256:bb7fb9cd44c2582aa5990cf61a4183e6f54eea3172e54963787ba47287edd135 \ + --hash=sha256:bca3f0ce67e5a2a2cf524e86f44697c4323a86e0fd7ba857de1c30d52c11ede1 \ + --hash=sha256:bda55e8dbe8533937956c996beaa20266a8eca3570402e52ae52ed60de1faca8 \ + --hash=sha256:be939b99d4e091eec9a2bcf41aaf8f351f312cd19ff74b5c83480f08a8a43e0b \ + --hash=sha256:c4b93af7920cdf80f71650769464ccf1fb49a4b56ae0024173c24c48eb6b1612 \ + --hash=sha256:cb5e8daac840e8879407acbe689a174f5ebaf344a062f8918e526824eb5d97af \ + --hash=sha256:d19f5f48883752b5ab34cff9e2f7e4a7f216296f33714e77d1beb03d108632b6 \ + --hash=sha256:d30bc11d35743bf4ddf76674a0a369ec8a21f87aaa09b0661b04c5f6c46e8d7b \ + --hash=sha256:e12b61e0b86611e3f4c1756686d9086c1d36e6fd15326f5658112ad1f1cc8807 \ + --hash=sha256:e6f6775eaaa08c0eec73e301f7592f4367ccde5e4e4df8e58320f2ebf161ea2c \ + --hash=sha256:e7155c0b004e936d381b15425273aee1cebc94f879c0ce82b0d7fecbf755d53a \ + --hash=sha256:e8633996579961f9b5a3008683344c2558d38420029d3c0bc7ff77c17949a4e1 \ + --hash=sha256:f25a41f5b34b371a06dad3f01799706631331adc7d6c05253f5bca22068c7a34 \ + --hash=sha256:f3e32ab7dd1b1ef67b9232c4cf5e2ee4cd517d4316ea910acaaa9c5712a1c663 \ + --hash=sha256:f9b2dc7668418fb6f221e4bf701f716e05e8eadb4f1988a2487b11aedf8abe62 \ + --hash=sha256:fab8f805e9675e61ed8538f192aad70500fa6afb33a8803932999b1049363a08 \ + --hash=sha256:fe245cf4a73c20592f0f48da39748b3513db114465be78f0a36da847221bd1b4 \ + --hash=sha256:ff798ad7a957a5021dcbab78dfff681f0cf15744d0e6af62bd6746984d9c9e9c # via # authlib # drf-oidc-auth @@ -253,9 +276,9 @@ deprecation==2.1.0 \ --hash=sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff \ --hash=sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a # via django-helusers -django==4.2.25 \ - --hash=sha256:2391ab3d78191caaae2c963c19fd70b99e9751008da22a0adcc667c5a4f8d311 \ - --hash=sha256:9584cf26b174b35620e53c2558b09d7eb180a655a3470474f513ff9acb494f8c +django==5.2.7 \ + --hash=sha256:59a13a6515f787dec9d97a0438cd2efac78c8aca1c80025244b0fe507fe0754b \ + --hash=sha256:e0f6f12e2551b1716a95a63a1366ca91bbcd7be059862c1b18f989b1da356cdd # via # -r requirements.in # django-anymail @@ -281,26 +304,26 @@ django-admin-list-filter-dropdown==1.0.3 \ --hash=sha256:07cd37b6a9be1b08f11d4a92957c69b67bc70b1f87a2a7d4ae886c93ea51eb53 \ --hash=sha256:bf1b48bab9772dad79db71efef17e78782d4f2421444d5e49bb10e0da71cd6bb # via -r requirements.in -django-anymail==12.0 \ - --hash=sha256:65789c1b0f42915aa0450a4f173f77572d4c552979b748ddd8125af41972ad30 \ - --hash=sha256:de8458d713d0f9776da9ed04dcd3a0161be23e9ecbcb49dcf149219700ecd274 +django-anymail==13.1 \ + --hash=sha256:63e48402ec8258f17640eb73c8c64141f16d2f8ae7d448d0fb1c66e82b7cbcf6 \ + --hash=sha256:b51783176f8a8382e958808151551558e4a46d1375fbc343742d1ebd06ce8e9e # via django-ilmoitin -django-auditlog==3.0.0 \ - --hash=sha256:92db1cf4a51ceca5c26b3ff46997d9e3305a02da1bd435e2efb5b8b6d300ce1f \ - --hash=sha256:9de49f80a4911135d136017123cd73461f869b4947eec14d5e76db4b88182f3f +django-auditlog==3.3.0 \ + --hash=sha256:01331a0e7bb1a8ff7573311b486c88f3d0c431c388f5a1e4a9b6b26911dd79b8 \ + --hash=sha256:ab0f0f556a7107ac01c8fa87137bdfbb2b6f0debf70f7753169d9a40673d2636 # via # -r requirements.in # django-auditlog-extra django-auditlog-extra @ https://github.com/City-of-Helsinki/django-auditlog-extra/archive/bff5fa3921d6821bebdd6be6c9fd20db39d32d54.zip \ --hash=sha256:34bfceb4392595daa3bbe52601d990e92c8320822d3a894e524660c24d71552d # via -r requirements.in -django-axes==7.0.2 \ - --hash=sha256:893dacce259d39e8cbcff655c61a008b3b827797c2f733f64fd9baf6bc7256e9 \ - --hash=sha256:a96bd6cdca9fbcbd250cf5ce1d92bfc72f2ce64b928804d9802d30a090406c59 +django-axes==8.0.0 \ + --hash=sha256:7ddc55f21b704b7e9b3e793a75deac01ff16cb67f561649b04336e1e96980035 \ + --hash=sha256:f95b6ae67fd77d44cc688818cef174914c4ad98c48daf65020b6f03f37220e45 # via -r requirements.in -django-cors-headers==4.7.0 \ - --hash=sha256:6fdf31bf9c6d6448ba09ef57157db2268d515d94fc5c89a0a1028e1fc03ee52b \ - --hash=sha256:f1c125dcd58479fe7a67fe2499c16ee38b81b397463cf025f0e2c42937421070 +django-cors-headers==4.9.0 \ + --hash=sha256:15c7f20727f90044dcee2216a9fd7303741a864865f0c3657e28b7056f61b449 \ + --hash=sha256:fe5d7cb59fdc2c8c646ce84b727ac2bca8912a247e6e68e1fb507372178e59e8 # via -r requirements.in django-csp==4.0 \ --hash=sha256:b27010bb702eb20a3dad329178df2b61a2b82d338b70fbdc13c3a3bd28712833 \ @@ -310,21 +333,21 @@ django-environ==0.12.0 \ --hash=sha256:227dc891453dd5bde769c3449cf4a74b6f2ee8f7ab2361c93a07068f4179041a \ --hash=sha256:92fb346a158abda07ffe6eb23135ce92843af06ecf8753f43adf9d2366dcc0ca # via -r requirements.in -django-filter==25.1 \ - --hash=sha256:1ec9eef48fa8da1c0ac9b411744b16c3f4c31176c867886e4c48da369c407153 \ - --hash=sha256:4fa48677cf5857b9b1347fed23e355ea792464e0fe07244d1fdfb8a806215b80 +django-filter==25.2 \ + --hash=sha256:760e984a931f4468d096f5541787efb8998c61217b73006163bf2f9523fe8f23 \ + --hash=sha256:9c0f8609057309bba611062fe1b720b4a873652541192d232dd28970383633e3 # via -r requirements.in django-graphql-jwt==0.4.0 \ --hash=sha256:537972519f0deeec7a0e4a306ddfed1fe385266ef61c9f78c54cd04ac01a171e \ --hash=sha256:5823aa8ac9bf0b7a6e3b2febd029598b332c41fe9043d89900c116fcecd23f5e # via -r requirements.in -django-health-check==3.18.3 \ - --hash=sha256:18b75daca4551c69a43f804f9e41e23f5f5fb9efd06cf6a313b3d5031bb87bd0 \ - --hash=sha256:f5f58762b80bdf7b12fad724761993d6e83540f97e2c95c42978f187e452fa07 +django-health-check==3.20.0 \ + --hash=sha256:bcb2b8f36f463cead0564a028345c5b17e2a2d18e9cc88ecd611b13a26521926 \ + --hash=sha256:cd69ac5facf73fe7241d9492d939b57bd20e24f46c4edea91e6a900bf22c2d8e # via -r requirements.in -django-helusers==0.13.3 \ - --hash=sha256:26b396edcfd247886171e185fe5f56a1d9ae2937edfa342f1cf2977371cb4974 \ - --hash=sha256:2b5e29f1440eabb380c1e9484953d91f159003f79fd5b4bf4f2df9061eb79b53 +django-helusers==0.14.0 \ + --hash=sha256:424f97e7aa6792ae255de56344f765795444849ea82e9d4e01666494c28e960c \ + --hash=sha256:79b922d51278a9e9793a00279782e5455b72e9e9d0f261dd17be2f0dbcbaa1f9 # via # -r requirements.in # helsinki-profile-gdpr-api @@ -346,9 +369,9 @@ django-utils-six==2.0 \ --hash=sha256:4ef9d20de679a5b2448429476452493661fe08f23d6e788a8e9816ec05e3c5b0 \ --hash=sha256:8f0e77289d911069a6a15bab5a25ccf2c0fcb8fc4177461dd17470cfdeb94aa6 # via -r requirements.in -djangorestframework==3.15.2 \ - --hash=sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20 \ - --hash=sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad +djangorestframework==3.16.1 \ + --hash=sha256:166809528b1aced0a17dc66c24492af18049f2c9420dbd0be29422029cfc3ff7 \ + --hash=sha256:33a59f47fb9c85ede792cbf88bde71893bcda0667bc573f784649521f1102cec # via # drf-oidc-auth # drf-spectacular @@ -356,9 +379,7 @@ djangorestframework==3.15.2 \ drf-oidc-auth==3.0.0 \ --hash=sha256:243b44ffaf9bbb4a26445370616ab6b666a541479649e6bd3319ede502ea723b \ --hash=sha256:9b3ee051e86709f2bb8bb9a7e9bb975b7d9a1cf2c55cadcdd5b6889454f99075 - # via - # -r requirements.in - # helsinki-profile-gdpr-api + # via helsinki-profile-gdpr-api drf-spectacular==0.28.0 \ --hash=sha256:2c778a47a40ab2f5078a7c42e82baba07397bb35b074ae4680721b2805943061 \ --hash=sha256:856e7edf1056e49a4245e87a61e8da4baff46c83dbc25be1da2df77f354c7cb4 @@ -375,13 +396,13 @@ factory-boy==3.3.3 \ --hash=sha256:1c39e3289f7e667c4285433f305f8d506efc2fe9c73aaea4151ebd5cdea394fc \ --hash=sha256:866862d226128dfac7f2b4160287e899daf54f2612778327dd03d0e2cb1e3d03 # via -r requirements.in -faker==37.0.2 \ - --hash=sha256:8955706c56c28099585e9e2b6f814eb0a3a227eb36a2ee3eb9ab577c4764eacc \ - --hash=sha256:948bd27706478d3aa0b6f9f58b9f25207098f6ca79852c7b49c44a8ced2bc59b +faker==37.8.0 \ + --hash=sha256:090bb5abbec2b30949a95ce1ba6b20d1d0ed222883d63483a0d4be4a970d6fb8 \ + --hash=sha256:b08233118824423b5fc239f7dd51f145e7018082b4164f8da6a9994e1f1ae793 # via factory-boy -geographiclib==2.0 \ - --hash=sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734 \ - --hash=sha256:f7f41c85dc3e1c2d3d935ec86660dc3b2c848c83e17f9a9e51ba9d5146a15859 +geographiclib==2.1 \ + --hash=sha256:6a6545e6262d0ed3522e13c515713718797e37ed8c672c31ad7b249f372ef108 \ + --hash=sha256:e2a873b9b9e7fc38721ad73d5f4e6c9ed140d428a339970f505c07056997d40b # via geopy geopy==2.4.1 \ --hash=sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1 \ @@ -424,17 +445,17 @@ idna==3.10 \ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # via requests -importlib-metadata==8.6.1 \ - --hash=sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e \ - --hash=sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580 +importlib-metadata==8.7.0 \ + --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ + --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd # via -r requirements.in inflection==0.5.1 \ --hash=sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417 \ --hash=sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2 # via drf-spectacular -ipython==9.5.0 \ - --hash=sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113 \ - --hash=sha256:88369ffa1d5817d609120daa523a6da06d02518e582347c29f8451732a9c5e72 +ipython==9.6.0 \ + --hash=sha256:5603d6d5d356378be5043e69441a072b50a5b33b4503428c77b04cb8ce7bc731 \ + --hash=sha256:5f77efafc886d2f023442479b8149e7d86547ad0a979e9da9f045d252f648196 # via -r requirements.in ipython-pygments-lexers==1.1.1 \ --hash=sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81 \ @@ -448,95 +469,125 @@ jinja2==3.1.6 \ --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 # via django-ilmoitin -jsonschema==4.23.0 \ - --hash=sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4 \ - --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 +jsonschema==4.25.1 \ + --hash=sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63 \ + --hash=sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85 # via drf-spectacular -jsonschema-specifications==2025.4.1 \ - --hash=sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af \ - --hash=sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608 +jsonschema-specifications==2025.9.1 \ + --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \ + --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d # via jsonschema lockfile==0.12.2 \ --hash=sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799 \ --hash=sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa # via django-mailer -markupsafe==3.0.2 \ - --hash=sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4 \ - --hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \ - --hash=sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0 \ - --hash=sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9 \ - --hash=sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 \ - --hash=sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13 \ - --hash=sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028 \ - --hash=sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca \ - --hash=sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557 \ - --hash=sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832 \ - --hash=sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0 \ - --hash=sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b \ - --hash=sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579 \ - --hash=sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a \ - --hash=sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c \ - --hash=sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff \ - --hash=sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c \ - --hash=sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22 \ - --hash=sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094 \ - --hash=sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb \ - --hash=sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e \ - --hash=sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5 \ - --hash=sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a \ - --hash=sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d \ - --hash=sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a \ - --hash=sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b \ - --hash=sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8 \ - --hash=sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225 \ - --hash=sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c \ - --hash=sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144 \ - --hash=sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f \ - --hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 \ - --hash=sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d \ - --hash=sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93 \ - --hash=sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf \ - --hash=sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158 \ - --hash=sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84 \ - --hash=sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb \ - --hash=sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48 \ - --hash=sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171 \ - --hash=sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c \ - --hash=sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6 \ - --hash=sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd \ - --hash=sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d \ - --hash=sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1 \ - --hash=sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d \ - --hash=sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca \ - --hash=sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a \ - --hash=sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29 \ - --hash=sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe \ - --hash=sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798 \ - --hash=sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c \ - --hash=sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8 \ - --hash=sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f \ - --hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f \ - --hash=sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a \ - --hash=sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178 \ - --hash=sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0 \ - --hash=sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79 \ - --hash=sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430 \ - --hash=sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50 +markupsafe==3.0.3 \ + --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \ + --hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \ + --hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf \ + --hash=sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19 \ + --hash=sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf \ + --hash=sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c \ + --hash=sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175 \ + --hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 \ + --hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb \ + --hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 \ + --hash=sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab \ + --hash=sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26 \ + --hash=sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1 \ + --hash=sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce \ + --hash=sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218 \ + --hash=sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634 \ + --hash=sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695 \ + --hash=sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad \ + --hash=sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73 \ + --hash=sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c \ + --hash=sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe \ + --hash=sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa \ + --hash=sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559 \ + --hash=sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa \ + --hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37 \ + --hash=sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758 \ + --hash=sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f \ + --hash=sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8 \ + --hash=sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d \ + --hash=sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c \ + --hash=sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 \ + --hash=sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a \ + --hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19 \ + --hash=sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9 \ + --hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9 \ + --hash=sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc \ + --hash=sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2 \ + --hash=sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4 \ + --hash=sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354 \ + --hash=sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50 \ + --hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698 \ + --hash=sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9 \ + --hash=sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b \ + --hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc \ + --hash=sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115 \ + --hash=sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e \ + --hash=sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485 \ + --hash=sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f \ + --hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12 \ + --hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025 \ + --hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009 \ + --hash=sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d \ + --hash=sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b \ + --hash=sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a \ + --hash=sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 \ + --hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f \ + --hash=sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d \ + --hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1 \ + --hash=sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287 \ + --hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6 \ + --hash=sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f \ + --hash=sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 \ + --hash=sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed \ + --hash=sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b \ + --hash=sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c \ + --hash=sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 \ + --hash=sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8 \ + --hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 \ + --hash=sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6 \ + --hash=sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e \ + --hash=sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d \ + --hash=sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d \ + --hash=sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 \ + --hash=sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7 \ + --hash=sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419 \ + --hash=sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 \ + --hash=sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1 \ + --hash=sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5 \ + --hash=sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d \ + --hash=sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42 \ + --hash=sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe \ + --hash=sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda \ + --hash=sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e \ + --hash=sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737 \ + --hash=sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523 \ + --hash=sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591 \ + --hash=sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc \ + --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ + --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via jinja2 matplotlib-inline==0.1.7 \ --hash=sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90 \ --hash=sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca # via ipython -oauthlib==3.2.2 \ - --hash=sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca \ - --hash=sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918 +oauthlib==3.3.1 \ + --hash=sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9 \ + --hash=sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1 # via # requests-oauthlib # social-auth-core -packaging==24.2 \ - --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 \ - --hash=sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f - # via deprecation +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ + --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f + # via + # deprecation + # django-csp parso==0.8.5 \ --hash=sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a \ --hash=sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887 @@ -552,18 +603,13 @@ prompt-toolkit==3.0.52 \ --hash=sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855 \ --hash=sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955 # via ipython -psycopg2==2.9.10 \ - --hash=sha256:0435034157049f6846e95103bd8f5a668788dd913a7c30162ca9503fdf542cb4 \ - --hash=sha256:12ec0b40b0273f95296233e8750441339298e6a572f7039da5b260e3c8b60e11 \ - --hash=sha256:47c4f9875125344f4c2b870e41b6aad585901318068acd01de93f3677a6522c2 \ - --hash=sha256:4a579d6243da40a7b3182e0430493dbd55950c493d8c68f4eec0b302f6bbf20e \ - --hash=sha256:5df2b672140f95adb453af93a7d669d7a7bf0a56bcd26f1502329166f4a61716 \ - --hash=sha256:65a63d7ab0e067e2cdb3cf266de39663203d38d6a8ed97f5ca0cb315c73fe067 \ - --hash=sha256:88138c8dedcbfa96408023ea2b0c369eda40fe5d75002c0964c78f46f11fa442 \ - --hash=sha256:91fd603a2155da8d0cfcdbf8ab24a2d54bca72795b90d2a3ed2b6da8d979dee2 \ - --hash=sha256:9d5b3b94b79a844a986d029eee38998232451119ad653aea42bb9220a8c5066b \ - --hash=sha256:c6f7b8561225f9e711a9c47087388a97fdc948211c10a4bccbf0ba68ab7b3b5a +psycopg==3.2.10 \ + --hash=sha256:0bce99269d16ed18401683a8569b2c5abd94f72f8364856d56c0389bcd50972a \ + --hash=sha256:ab5caf09a9ec42e314a21f5216dbcceac528e0e05142e42eea83a3b28b320ac3 # via -r requirements.in +psycopg-c==3.2.10 \ + --hash=sha256:30183897f5fe7ff4375b7dfcec9d44dfe8a5e009080addc1626889324a9eb1ed + # via psycopg ptyprocess==0.7.0 \ --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 @@ -572,15 +618,15 @@ pure-eval==0.2.3 \ --hash=sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 \ --hash=sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42 # via stack-data -pyasn1==0.4.8 \ - --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \ - --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba +pyasn1==0.6.1 \ + --hash=sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629 \ + --hash=sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034 # via # python-jose # rsa -pycparser==2.22 \ - --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ - --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc +pycparser==2.23 \ + --hash=sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2 \ + --hash=sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934 # via cffi pygments==2.19.2 \ --hash=sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887 \ @@ -600,68 +646,88 @@ python-dateutil==2.9.0.post0 \ # via # django-auditlog # graphene -python-jose==3.4.0 \ - --hash=sha256:9a9a40f418ced8ecaf7e3b28d69887ceaa76adad3bcaa6dae0d9e596fec1d680 \ - --hash=sha256:9c9f616819652d109bd889ecd1e15e9a162b9b94d682534c9c2146092945b78f +python-jose==3.5.0 \ + --hash=sha256:abd1202f23d34dfad2c3d28cb8617b90acf34132c7afd60abd0b0b7d3cb55771 \ + --hash=sha256:fb4eaa44dbeb1c26dcc69e4bd7ec54a1cb8dd64d3b4d81ef08d90ff453f2b01b # via django-helusers python3-openid==3.2.0 \ --hash=sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf \ --hash=sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b # via social-auth-core -pyyaml==6.0.2 \ - --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ - --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ - --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ - --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ - --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ - --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ - --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ - --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ - --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ - --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ - --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ - --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ - --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ - --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ - --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ - --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ - --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ - --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ - --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ - --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ - --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ - --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ - --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ - --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ - --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ - --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ - --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ - --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ - --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ - --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ - --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ - --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ - --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ - --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ - --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ - --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ - --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ - --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ - --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ - --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ - --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ - --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ - --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ - --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ - --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ - --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ - --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ - --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ - --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ - --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ - --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ - --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ - --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 +pyyaml==6.0.3 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 # via drf-spectacular referencing==0.36.2 \ --hash=sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa \ @@ -669,9 +735,9 @@ referencing==0.36.2 \ # via # jsonschema # jsonschema-specifications -requests==2.32.4 \ - --hash=sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c \ - --hash=sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422 +requests==2.32.5 \ + --hash=sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6 \ + --hash=sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf # via # -r requirements.in # django-anymail @@ -683,131 +749,172 @@ requests-oauthlib==2.0.0 \ --hash=sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36 \ --hash=sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9 # via social-auth-core -rpds-py==0.24.0 \ - --hash=sha256:0047638c3aa0dbcd0ab99ed1e549bbf0e142c9ecc173b6492868432d8989a046 \ - --hash=sha256:006f4342fe729a368c6df36578d7a348c7c716be1da0a1a0f86e3021f8e98724 \ - --hash=sha256:041f00419e1da7a03c46042453598479f45be3d787eb837af382bfc169c0db33 \ - --hash=sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc \ - --hash=sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032 \ - --hash=sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a \ - --hash=sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7 \ - --hash=sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c \ - --hash=sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718 \ - --hash=sha256:1b221c2457d92a1fb3c97bee9095c874144d196f47c038462ae6e4a14436f7bc \ - --hash=sha256:208b3a70a98cf3710e97cabdc308a51cd4f28aa6e7bb11de3d56cd8b74bab98d \ - --hash=sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272 \ - --hash=sha256:24795c099453e3721fda5d8ddd45f5dfcc8e5a547ce7b8e9da06fecc3832e26f \ - --hash=sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d \ - --hash=sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b \ - --hash=sha256:2c13777ecdbbba2077670285dd1fe50828c8742f6a4119dbef6f83ea13ad10fb \ - --hash=sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef \ - --hash=sha256:2d53747da70a4e4b17f559569d5f9506420966083a31c5fbd84e764461c4444b \ - --hash=sha256:32bab0a56eac685828e00cc2f5d1200c548f8bc11f2e44abf311d6b548ce2e45 \ - --hash=sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4 \ - --hash=sha256:369d9c6d4c714e36d4a03957b4783217a3ccd1e222cdd67d464a3a479fc17796 \ - --hash=sha256:3a55fc10fdcbf1a4bd3c018eea422c52cf08700cf99c28b5cb10fe97ab77a0d3 \ - --hash=sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c \ - --hash=sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9 \ - --hash=sha256:43dba99f00f1d37b2a0265a259592d05fcc8e7c19d140fe51c6e6f16faabeb1f \ - --hash=sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029 \ - --hash=sha256:493fe54318bed7d124ce272fc36adbf59d46729659b2c792e87c3b95649cdee9 \ - --hash=sha256:4b28e5122829181de1898c2c97f81c0b3246d49f585f22743a1246420bb8d399 \ - --hash=sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586 \ - --hash=sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda \ - --hash=sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91 \ - --hash=sha256:5db385bacd0c43f24be92b60c857cf760b7f10d8234f4bd4be67b5b20a7c0b6b \ - --hash=sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a \ - --hash=sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c \ - --hash=sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405 \ - --hash=sha256:60748789e028d2a46fc1c70750454f83c6bdd0d05db50f5ae83e2db500b34da5 \ - --hash=sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143 \ - --hash=sha256:619ca56a5468f933d940e1bf431c6f4e13bef8e688698b067ae68eb4f9b30e3a \ - --hash=sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c \ - --hash=sha256:63981feca3f110ed132fd217bf7768ee8ed738a55549883628ee3da75bb9cb78 \ - --hash=sha256:66420986c9afff67ef0c5d1e4cdc2d0e5262f53ad11e4f90e5e22448df485bf0 \ - --hash=sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350 \ - --hash=sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7 \ - --hash=sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba \ - --hash=sha256:6e1daf5bf6c2be39654beae83ee6b9a12347cb5aced9a29eecf12a2d25fff664 \ - --hash=sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a \ - --hash=sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56 \ - --hash=sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e \ - --hash=sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d \ - --hash=sha256:79e8d804c2ccd618417e96720ad5cd076a86fa3f8cb310ea386a3e6229bae7d1 \ - --hash=sha256:7e80d375134ddb04231a53800503752093dbb65dad8dabacce2c84cccc78e964 \ - --hash=sha256:8097b3422d020ff1c44effc40ae58e67d93e60d540a65649d2cdaf9466030791 \ - --hash=sha256:8205ee14463248d3349131bb8099efe15cd3ce83b8ef3ace63c7e976998e7124 \ - --hash=sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e \ - --hash=sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120 \ - --hash=sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad \ - --hash=sha256:896c41007931217a343eff197c34513c154267636c8056fb409eafd494c3dcdc \ - --hash=sha256:8aa362811ccdc1f8dadcc916c6d47e554169ab79559319ae9fae7d7752d0d60c \ - --hash=sha256:8b3b397eefecec8e8e39fa65c630ef70a24b09141a6f9fc17b3c3a50bed6b50e \ - --hash=sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba \ - --hash=sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797 \ - --hash=sha256:921ae54f9ecba3b6325df425cf72c074cd469dea843fb5743a26ca7fb2ccb149 \ - --hash=sha256:92558d37d872e808944c3c96d0423b8604879a3d1c86fdad508d7ed91ea547d5 \ - --hash=sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240 \ - --hash=sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034 \ - --hash=sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25 \ - --hash=sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7 \ - --hash=sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d \ - --hash=sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793 \ - --hash=sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba \ - --hash=sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d \ - --hash=sha256:a36b452abbf29f68527cf52e181fced56685731c86b52e852053e38d8b60bc8d \ - --hash=sha256:a5b66d1b201cc71bc3081bc2f1fc36b0c1f268b773e03bbc39066651b9e18391 \ - --hash=sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e \ - --hash=sha256:a88c0d17d039333a41d9bf4616bd062f0bd7aa0edeb6cafe00a2fc2a804e944f \ - --hash=sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7 \ - --hash=sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd \ - --hash=sha256:afc6e35f344490faa8276b5f2f7cbf71f88bc2cda4328e00553bd451728c571f \ - --hash=sha256:b9a4df06c35465ef4d81799999bba810c68d29972bf1c31db61bfdb81dd9d5bb \ - --hash=sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea \ - --hash=sha256:bbc4362e06f950c62cad3d4abf1191021b2ffaf0b31ac230fbf0526453eee75e \ - --hash=sha256:c0145295ca415668420ad142ee42189f78d27af806fcf1f32a18e51d47dd2052 \ - --hash=sha256:c30ff468163a48535ee7e9bf21bd14c7a81147c0e58a36c1078289a8ca7af0bd \ - --hash=sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47 \ - --hash=sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d \ - --hash=sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9 \ - --hash=sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8 \ - --hash=sha256:cc31e13ce212e14a539d430428cd365e74f8b2d534f8bc22dd4c9c55b277b875 \ - --hash=sha256:cdabcd3beb2a6dca7027007473d8ef1c3b053347c76f685f5f060a00327b8b65 \ - --hash=sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e \ - --hash=sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114 \ - --hash=sha256:d3aa13bdf38630da298f2e0d77aca967b200b8cc1473ea05248f6c5e9c9bdb44 \ - --hash=sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9 \ - --hash=sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a \ - --hash=sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205 \ - --hash=sha256:d8754d872a5dfc3c5bf9c0e059e8107451364a30d9fd50f1f1a85c4fb9481164 \ - --hash=sha256:d8f9a6e7fd5434817526815f09ea27f2746c4a51ee11bb3439065f5fc754db58 \ - --hash=sha256:dbcbb6db5582ea33ce46a5d20a5793134b5365110d84df4e30b9d37c6fd40ad3 \ - --hash=sha256:e0f3ef95795efcd3b2ec3fe0a5bcfb5dadf5e3996ea2117427e524d4fbf309c6 \ - --hash=sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97 \ - --hash=sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6 \ - --hash=sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae \ - --hash=sha256:e8acd55bd5b071156bae57b555f5d33697998752673b9de554dd82f5b5352727 \ - --hash=sha256:e8e5ab32cf9eb3647450bc74eb201b27c185d3857276162c101c0f8c6374e098 \ - --hash=sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c \ - --hash=sha256:ebea2821cdb5f9fef44933617be76185b80150632736f3d76e54829ab4a3b4d1 \ - --hash=sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8 \ - --hash=sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d \ - --hash=sha256:f5c0ed12926dec1dfe7d645333ea59cf93f4d07750986a586f511c0bc61fe103 \ - --hash=sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30 \ - --hash=sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d \ - --hash=sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5 \ - --hash=sha256:fc2c1e1b00f88317d9de6b2c2b39b012ebbfe35fe5e7bef980fd2a91f6100a07 \ - --hash=sha256:fd822f019ccccd75c832deb7aa040bb02d70a92eb15a2f16c7987b7ad4ee8d83 +rpds-py==0.27.1 \ + --hash=sha256:008b839781d6c9bf3b6a8984d1d8e56f0ec46dc56df61fd669c49b58ae800400 \ + --hash=sha256:037a2361db72ee98d829bc2c5b7cc55598ae0a5e0ec1823a56ea99374cfd73c1 \ + --hash=sha256:079bc583a26db831a985c5257797b2b5d3affb0386e7ff886256762f82113b5e \ + --hash=sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f \ + --hash=sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60 \ + --hash=sha256:0d807710df3b5faa66c731afa162ea29717ab3be17bdc15f90f2d9f183da4059 \ + --hash=sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2 \ + --hash=sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff \ + --hash=sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef \ + --hash=sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd \ + --hash=sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf \ + --hash=sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d \ + --hash=sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e \ + --hash=sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52 \ + --hash=sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8 \ + --hash=sha256:1fea2b1a922c47c51fd07d656324531adc787e415c8b116530a1d29c0516c62d \ + --hash=sha256:23f6b69d1c26c4704fec01311963a41d7de3ee0570a84ebde4d544e5a1859ffc \ + --hash=sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5 \ + --hash=sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8 \ + --hash=sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf \ + --hash=sha256:2c426b99a068601b5f4623573df7a7c3d72e87533a2dd2253353a03e7502566c \ + --hash=sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418 \ + --hash=sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746 \ + --hash=sha256:2fd50659a069c15eef8aa3d64bbef0d69fd27bb4a50c9ab4f17f83a16cbf8905 \ + --hash=sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688 \ + --hash=sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39 \ + --hash=sha256:31d3ebadefcd73b73928ed0b2fd696f7fefda8629229f81929ac9c1854d0cffb \ + --hash=sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502 \ + --hash=sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66 \ + --hash=sha256:3adc388fc3afb6540aec081fa59e6e0d3908722771aa1e37ffe22b220a436f0b \ + --hash=sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc \ + --hash=sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675 \ + --hash=sha256:3d905d16f77eb6ab2e324e09bfa277b4c8e5e6b8a78a3e7ff8f3cdf773b4c013 \ + --hash=sha256:3deab27804d65cd8289eb814c2c0e807c4b9d9916c9225e363cb0cf875eb67c1 \ + --hash=sha256:3e039aabf6d5f83c745d5f9a0a381d031e9ed871967c0a5c38d201aca41f3ba1 \ + --hash=sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a \ + --hash=sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734 \ + --hash=sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5 \ + --hash=sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e \ + --hash=sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92 \ + --hash=sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c \ + --hash=sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195 \ + --hash=sha256:4e44099bd522cba71a2c6b97f68e19f40e7d85399de899d66cdb67b32d7cb786 \ + --hash=sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274 \ + --hash=sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3 \ + --hash=sha256:4fc9b7fe29478824361ead6e14e4f5aed570d477e06088826537e202d25fe859 \ + --hash=sha256:50c946f048209e6362e22576baea09193809f87687a95a8db24e5fbdb307b93a \ + --hash=sha256:5281ed1cc1d49882f9997981c88df1a22e140ab41df19071222f7e5fc4e72125 \ + --hash=sha256:530064db9146b247351f2a0250b8f00b289accea4596a033e94be2389977de71 \ + --hash=sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83 \ + --hash=sha256:5b640501be9288c77738b5492b3fd3abc4ba95c50c2e41273c8a1459f08298d3 \ + --hash=sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5 \ + --hash=sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817 \ + --hash=sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48 \ + --hash=sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772 \ + --hash=sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2 \ + --hash=sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948 \ + --hash=sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef \ + --hash=sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde \ + --hash=sha256:6f4461bf931108c9fa226ffb0e257c1b18dc2d44cd72b125bec50ee0ab1248a9 \ + --hash=sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802 \ + --hash=sha256:70d0738ef8fee13c003b100c2fbd667ec4f133468109b3472d249231108283a3 \ + --hash=sha256:71108900c9c3c8590697244b9519017a400d9ba26a36c48381b3f64743a44aab \ + --hash=sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be \ + --hash=sha256:78af06ddc7fe5cc0e967085a9115accee665fb912c22a3f54bad70cc65b05fe6 \ + --hash=sha256:7b002cab05d6339716b03a4a3a2ce26737f6231d7b523f339fa061d53368c9d8 \ + --hash=sha256:7b90b0496570bd6b0321724a330d8b545827c4df2034b6ddfc5f5275f55da2ad \ + --hash=sha256:7ba22cb9693df986033b91ae1d7a979bc399237d45fccf875b76f62bb9e52ddf \ + --hash=sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec \ + --hash=sha256:7e32721e5d4922deaaf963469d795d5bde6093207c52fec719bd22e5d1bedbc4 \ + --hash=sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1 \ + --hash=sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a \ + --hash=sha256:8177002868d1426305bb5de1e138161c2ec9eb2d939be38291d7c431c4712df8 \ + --hash=sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39 \ + --hash=sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4 \ + --hash=sha256:879b0e14a2da6a1102a3fc8af580fc1ead37e6d6692a781bd8c83da37429b5ab \ + --hash=sha256:8a3f29aba6e2d7d90528d3c792555a93497fe6538aa65eb675b44505be747808 \ + --hash=sha256:8a63b640a7845f2bdd232eb0d0a4a2dd939bcdd6c57e6bb134526487f3160ec5 \ + --hash=sha256:8b61097f7488de4be8244c89915da8ed212832ccf1e7c7753a25a394bf9b1f10 \ + --hash=sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797 \ + --hash=sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3 \ + --hash=sha256:9024de74731df54546fab0bfbcdb49fae19159ecaecfc8f37c18d2c7e2c0bd61 \ + --hash=sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228 \ + --hash=sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4 \ + --hash=sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf \ + --hash=sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881 \ + --hash=sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002 \ + --hash=sha256:9e71f5a087ead99563c11fdaceee83ee982fd39cf67601f4fd66cb386336ee52 \ + --hash=sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9 \ + --hash=sha256:a46fdec0083a26415f11d5f236b79fa1291c32aaa4a17684d82f7017a1f818b1 \ + --hash=sha256:a50431bf02583e21bf273c71b89d710e7a710ad5e39c725b14e685610555926f \ + --hash=sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998 \ + --hash=sha256:a55b9132bb1ade6c734ddd2759c8dc132aa63687d259e725221f106b83a0e485 \ + --hash=sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456 \ + --hash=sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd \ + --hash=sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e \ + --hash=sha256:aa8933159edc50be265ed22b401125c9eebff3171f570258854dbce3ecd55475 \ + --hash=sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e \ + --hash=sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c \ + --hash=sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334 \ + --hash=sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90 \ + --hash=sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2 \ + --hash=sha256:b2e7f8f169d775dd9092a1743768d771f1d1300453ddfe6325ae3ab5332b4657 \ + --hash=sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15 \ + --hash=sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b \ + --hash=sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33 \ + --hash=sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2 \ + --hash=sha256:bbf94c58e8e0cd6b6f38d8de67acae41b3a515c26169366ab58bdca4a6883bb8 \ + --hash=sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881 \ + --hash=sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136 \ + --hash=sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212 \ + --hash=sha256:c2a8fed130ce946d5c585eddc7c8eeef0051f58ac80a8ee43bd17835c144c2cc \ + --hash=sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0 \ + --hash=sha256:c4b676c4ae3921649a15d28ed10025548e9b561ded473aa413af749503c6737e \ + --hash=sha256:c796c0c1cc68cb08b0284db4229f5af76168172670c74908fdbd4b7d7f515819 \ + --hash=sha256:c918c65ec2e42c2a78d19f18c553d77319119bf43aa9e2edf7fb78d624355527 \ + --hash=sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed \ + --hash=sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df \ + --hash=sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb \ + --hash=sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a \ + --hash=sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a \ + --hash=sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21 \ + --hash=sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf \ + --hash=sha256:d7ff07d696a7a38152ebdb8212ca9e5baab56656749f3d6004b34ab726b550b8 \ + --hash=sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594 \ + --hash=sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a \ + --hash=sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e \ + --hash=sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7 \ + --hash=sha256:dd6cd0485b7d347304067153a6dc1d73f7d4fd995a396ef32a24d24b8ac63ac8 \ + --hash=sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6 \ + --hash=sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3 \ + --hash=sha256:e202e6d4188e53c6661af813b46c37ca2c45e497fc558bacc1a7630ec2695aec \ + --hash=sha256:e2f6fd8a1cea5bbe599b6e78a6e5ee08db434fc8ffea51ff201c8765679698b3 \ + --hash=sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723 \ + --hash=sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b \ + --hash=sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb \ + --hash=sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081 \ + --hash=sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7 \ + --hash=sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d \ + --hash=sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9 \ + --hash=sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9 \ + --hash=sha256:ee5422d7fb21f6a00c1901bf6559c49fee13a5159d0288320737bbf6585bd3e4 \ + --hash=sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444 \ + --hash=sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a \ + --hash=sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0 \ + --hash=sha256:f41f814b8eaa48768d1bb551591f6ba45f87ac76899453e8ccd41dba1289b04b \ + --hash=sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83 \ + --hash=sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3 \ + --hash=sha256:fb08b65b93e0c6dd70aac7f7890a9c0938d5ec71d5cb32d45cf844fb8ae47636 \ + --hash=sha256:fb7c72262deae25366e3b6c0c0ba46007967aea15d1eea746e44ddba8ec58dcc \ + --hash=sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2 \ + --hash=sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a \ + --hash=sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb \ + --hash=sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec \ + --hash=sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21 # via # jsonschema # referencing -rsa==4.9 \ - --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ - --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 +rsa==4.9.1 \ + --hash=sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762 \ + --hash=sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75 # via python-jose -sentry-sdk==2.23.1 \ - --hash=sha256:2288320465065f3f056630ce55936426204f96f63f1208edb79e033ed03774db \ - --hash=sha256:42ef3a6cc1db3d22cb2ab24163d75b23f291ad9892b1a8c44075ce809a32b191 +sentry-sdk==2.40.0 \ + --hash=sha256:b9c4672fb2cafabcc28586ab8fd0ceeff9b2352afcf2b936e13d5ba06d141b9f \ + --hash=sha256:d5f6ae0f27ea73e7b09c70ad7d42242326eb44765e87a15d8c5aab96b80013e6 # via -r requirements.in six==1.17.0 \ --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ @@ -817,13 +924,13 @@ six==1.17.0 \ # graphene-file-upload # promise # python-dateutil -social-auth-app-django==5.4.3 \ - --hash=sha256:d1f4286d5ca1e512c9b2f686e7ecb2a0128148f1a33d853b69dc07b58508362e \ - --hash=sha256:db70b972faeb10ee1ec83d0dc7dbd0558d5f5830417bba317b712b10ff58d031 +social-auth-app-django==5.5.1 \ + --hash=sha256:7a6aac52686b9703af57ad1f5935c55fb97404988067e94c4fa32143bc6a02a5 \ + --hash=sha256:a1435c17227d07d690b06cca54ea47d4ed939de4749dac45dd4393c8a98dac17 # via -r requirements.in -social-auth-core==4.5.6 \ - --hash=sha256:14753d4cf870b820918729ce8a2dfe51f332075528fb13bed908701a8486da80 \ - --hash=sha256:43114bbc50f99789f7aadfd4943c2e15aee5e2f8c8612ad67fc4115b70b46ee1 +social-auth-core==4.7.0 \ + --hash=sha256:2bba127c7b7166a81085ddb0c248d93751b3bc3cdab8569f62d9f70c6bc4ed40 \ + --hash=sha256:9eef9b49c332d1a3265b37dcc698a7ace97c3fc59df2d874b51576d11d31f6a6 # via social-auth-app-django sqlparse==0.5.3 \ --hash=sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272 \ @@ -843,19 +950,20 @@ traitlets==5.14.3 \ # via # ipython # matplotlib-inline -typing-extensions==4.12.2 \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 +typing-extensions==4.15.0 \ + --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 # via # graphene + # psycopg # referencing -tzdata==2025.1 \ - --hash=sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694 \ - --hash=sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639 +tzdata==2025.2 \ + --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ + --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 # via faker -uritemplate==4.1.1 \ - --hash=sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0 \ - --hash=sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e +uritemplate==4.2.0 \ + --hash=sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e \ + --hash=sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686 # via drf-spectacular urllib3==2.5.0 \ --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \ @@ -871,11 +979,11 @@ uwsgi==2.0.30 \ uwsgitop==0.12 \ --hash=sha256:4f9330951f0fb9633226de36cf0c28c04dcf323efab608834aa81f638b6019b2 # via -r requirements.in -wcwidth==0.2.13 \ - --hash=sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 \ - --hash=sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5 +wcwidth==0.2.14 \ + --hash=sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605 \ + --hash=sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1 # via prompt-toolkit -zipp==3.21.0 \ - --hash=sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4 \ - --hash=sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931 +zipp==3.23.0 \ + --hash=sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e \ + --hash=sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166 # via importlib-metadata From 914c8f4c99c94b8d3e98b54459460d581684d1de Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Thu, 9 Oct 2025 08:50:30 +0300 Subject: [PATCH 02/11] fix: remove deprecated PickleSerializer Remove deprecated PickleSerializer from the session serialization and use the default JSONSerializer. Refs: PT-1947 --- palvelutarjotin/settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/palvelutarjotin/settings.py b/palvelutarjotin/settings.py index d35f66a4..5b0b4df4 100644 --- a/palvelutarjotin/settings.py +++ b/palvelutarjotin/settings.py @@ -302,7 +302,6 @@ LOGIN_REDIRECT_URL = env.str("LOGIN_REDIRECT_URL") LOGOUT_REDIRECT_URL = env.str("LOGOUT_REDIRECT_URL") -SESSION_SERIALIZER = "django.contrib.sessions.serializers.PickleSerializer" AUTH_USER_MODEL = "organisations.User" # Keycloak parameters. Reference to Tunnistamo is necessary, although From 527811a6c1b5c16bb53556aa5f107966ad265c0c Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Mon, 6 Oct 2025 17:26:06 +0300 Subject: [PATCH 03/11] build: update ruff rules Refs: PT-1947 --- pyproject.toml | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b241d105..47ae42d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,18 +5,27 @@ requires-python = ">= 3.12" [tool.ruff] target-version = "py312" -extend-exclude = ["migrations", "snapshots"] +extend-exclude = ["migrations"] [tool.ruff.lint] -# See https://docs.astral.sh/ruff/rules/ for documentation of rules -extend-select = [ - "B01", # Enable B01* part of flake8-bugbear (B) rules, e.g. B015 and B018 - "C90", # Enable mccabe (C90) rules - "E", # Enable pycodestyle error (E) rules - "F", # Enable Pyflakes (F) rules - "I", # Enable isort (I) rules - "W", # Enable pycodestyle warning (W) rules +select = [ + # Pyflakes + "F", + # pycodestyle + "E", + "W", + # isort + "I", + # pep8-naming + "N", + # flake8-bugbear without opinionated rules + "B0", + # flake8-pie + "PIE", + # flake8-print + "T20", ] +extend-per-file-ignores = { "*/migrations/*" = ["E501"], "*/tests/*" = ["E501"] } [tool.pip-tools.compile] allow-unsafe = true From ed3b925904998eec7273fa726b8bc24eba373d23 Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Mon, 6 Oct 2025 17:27:53 +0300 Subject: [PATCH 04/11] style: apply updated ruff formatting rules Refs: PT-1947 --- common/tests/test_utils.py | 3 +-- graphene_linked_events/schema.py | 24 ++++++++++++------------ occurrences/schema.py | 4 ++-- organisations/notifications.py | 6 ++---- organisations/tests/test_admin.py | 3 ++- palvelutarjotin/oidc.py | 2 -- reports/models.py | 8 ++++---- reports/tests/test_views.py | 4 ++-- 8 files changed, 25 insertions(+), 29 deletions(-) diff --git a/common/tests/test_utils.py b/common/tests/test_utils.py index d5061404..8791a280 100644 --- a/common/tests/test_utils.py +++ b/common/tests/test_utils.py @@ -92,7 +92,7 @@ def test_is_enum_value_false(value): "ENUM_VALUE_1", "ENUM_VALUE_2", "LAST_ENUM_VALUE", - {1, 2, 3, "test", 2}, + {1, 2, 3, "test"}, (1, 2, 3, "test", 2), [1, 2, 3, "test", 2], (1, [2, {3: {4, (11, (12,), 13, None, "test")}}]), @@ -173,7 +173,6 @@ def test_deepfix_enum_values_changes_output_but_not_input(): 2, ], "ENUM_VALUE_1": { - 2, 2, "ENUM_VALUE_1", }, diff --git a/graphene_linked_events/schema.py b/graphene_linked_events/schema.py index ea6fbfdf..a3a31b07 100644 --- a/graphene_linked_events/schema.py +++ b/graphene_linked_events/schema.py @@ -820,7 +820,7 @@ class Arguments: @event_staff_member_required @transaction.atomic @map_enums_to_values_in_kwargs - def mutate(root, info, **kwargs): + def mutate(self, info, **kwargs): # Format to JSON POST body p_event_data = kwargs["event"].pop("p_event") validate_p_event_data(p_event_data) @@ -869,8 +869,8 @@ def mutate(root, info, **kwargs): ) return AddEventMutation(response=response) - def _create_p_event(event_obj, organisation, p_event_data) -> PalvelutarjotinEvent: - p_event_data["linked_event_id"] = event_obj.id + def _create_p_event(self, organisation, p_event_data) -> PalvelutarjotinEvent: + p_event_data["linked_event_id"] = self.id p_event_data["organisation_id"] = organisation.id translations = p_event_data.pop("translations", None) p_event, _ = PalvelutarjotinEvent.objects.get_or_create(**p_event_data) @@ -888,7 +888,7 @@ class Arguments: @event_staff_member_required @transaction.atomic @map_enums_to_values_in_kwargs - def mutate(root, info, **kwargs): + def mutate(self, info, **kwargs): # Format to JSON POST body event_id = kwargs["event"].pop("id") p_event_data = kwargs["event"].pop("p_event", None) @@ -957,7 +957,7 @@ class Arguments: @event_staff_member_required @transaction.atomic @map_enums_to_values_in_kwargs - def mutate(root, info, **kwargs): + def mutate(self, info, **kwargs): event_id = kwargs["event"].get("id") try: p_event: PalvelutarjotinEvent = PalvelutarjotinEvent.objects.get( @@ -967,7 +967,7 @@ def mutate(root, info, **kwargs): except PalvelutarjotinEvent.DoesNotExist as e: raise ObjectDoesNotExistError(e) # Publish event is actually update event, reuse UpdateEventMutation - response = UpdateEventMutation.mutate(root, info, **kwargs).response + response = UpdateEventMutation.mutate(self, info, **kwargs).response return PublishEventMutation(response=response) @@ -980,7 +980,7 @@ class Arguments: @event_staff_member_required @transaction.atomic @map_enums_to_values_in_kwargs - def mutate(root, info, **kwargs): + def mutate(self, info, **kwargs): try: kwargs["event"].update( {"publication_status": PalvelutarjotinEvent.PUBLICATION_STATUS_DRAFT} @@ -988,7 +988,7 @@ def mutate(root, info, **kwargs): except PalvelutarjotinEvent.DoesNotExist as e: raise ObjectDoesNotExistError(e) # Unpublish event is actually update event, reuse UpdateEventMutation - response = UpdateEventMutation.mutate(root, info, **kwargs).response + response = UpdateEventMutation.mutate(self, info, **kwargs).response return UnpublishEventMutation(response=response) @@ -1000,7 +1000,7 @@ class Arguments: @event_staff_member_required @map_enums_to_values_in_kwargs - def mutate(root, info, **kwargs): + def mutate(self, info, **kwargs): event_id = kwargs["event_id"] # TODO: proper validation if necessary result = api_client.delete("event", event_id) @@ -1054,7 +1054,7 @@ class Arguments: @event_staff_member_required @map_enums_to_values_in_kwargs - def mutate(root, info, **kwargs): + def mutate(self, info, **kwargs): image = kwargs["image"].pop("image") _validate_image_upload(image) body = kwargs["image"] @@ -1076,7 +1076,7 @@ class Arguments: @event_staff_member_required @map_enums_to_values_in_kwargs - def mutate(root, info, **kwargs): + def mutate(self, info, **kwargs): image_id = kwargs["image"].pop("id") body = format_request(kwargs["image"]) result = api_client.update("image", image_id, body) @@ -1095,7 +1095,7 @@ class Arguments: @event_staff_member_required @map_enums_to_values_in_kwargs - def mutate(root, info, **kwargs): + def mutate(self, info, **kwargs): image_id = kwargs["image_id"] result = api_client.delete("image", image_id) response = ImageMutationResponse( diff --git a/occurrences/schema.py b/occurrences/schema.py index e08e0e19..3be03165 100644 --- a/occurrences/schema.py +++ b/occurrences/schema.py @@ -637,8 +637,8 @@ class Meta: count = graphene.Int() - def resolve_count(root, info, **kwargs): - return root.length + def resolve_count(self, info, **kwargs): + return self.length @auditlog_access # log access because of personal information diff --git a/organisations/notifications.py b/organisations/notifications.py index 4bd84209..7a4ed2f6 100644 --- a/organisations/notifications.py +++ b/organisations/notifications.py @@ -31,10 +31,8 @@ { NotificationTemplate.MYPROFILE_CREATION: { **DEFAULT_DUMMY_CONTEXT, - **{ - "user_change_form_url": get_user_change_form_url(person), - "user_list_url": get_user_list_url(), - }, + "user_change_form_url": get_user_change_form_url(person), + "user_list_url": get_user_list_url(), }, NotificationTemplate.MYPROFILE_ACCEPTED: DEFAULT_DUMMY_CONTEXT, } diff --git a/organisations/tests/test_admin.py b/organisations/tests/test_admin.py index 248f8f68..b6338fdb 100644 --- a/organisations/tests/test_admin.py +++ b/organisations/tests/test_admin.py @@ -104,7 +104,8 @@ def test_save_form(self, add_message): user_admin_form = UserAdminForm( { **user.__dict__, - **{"is_event_staff": True, "organisations": organisations}, + "is_event_staff": True, + "organisations": organisations, }, instance=user, ) diff --git a/palvelutarjotin/oidc.py b/palvelutarjotin/oidc.py index cd53830b..6a1fadab 100644 --- a/palvelutarjotin/oidc.py +++ b/palvelutarjotin/oidc.py @@ -303,5 +303,3 @@ class KultusApiTokenAuthentication(FixTunnistamoMixin, ApiTokenAuthentication): Implemented to fix Tunnistamo AMR-issue, when needed. Tunnistamo is fixed with FixTunnistamoMixin. """ - - pass diff --git a/reports/models.py b/reports/models.py index 17b2c1e3..00007374 100644 --- a/reports/models.py +++ b/reports/models.py @@ -276,14 +276,14 @@ def save(self, *args, **kwargs): def _rehydrate(self, hydrate_linkedevents_event=False): try: # enrolment setter hydrates everything - if getattr(self, "_enrolment"): + if self._enrolment: # Trigger the setter - self.enrolment = getattr(self, "_enrolment") + self.enrolment = self._enrolment # If enrolment instance is not available, # hydrate with occurrence setter is the 2nd best thing - elif getattr(self, "_occurrence"): + elif self._occurrence: # Trigger the setter - self.occurrence = getattr(self, "_occurrence") + self.occurrence = self._occurrence if self.occurrence and not self.publisher: self.publisher = self._get_publisher_id_from_occurrence() diff --git a/reports/tests/test_views.py b/reports/tests/test_views.py index a49e912c..4540731a 100644 --- a/reports/tests/test_views.py +++ b/reports/tests/test_views.py @@ -654,11 +654,11 @@ def test_order_by_param(self, param): self._authenticate() # Ascending response = self._goto_reports(f"?order_by={param}") - assert [e["id"] for e in response.json()] == [getattr(r, "id") for r in reports] + assert [e["id"] for e in response.json()] == [r.id for r in reports] # Descending response = self._goto_reports(f"?order_by=-{param}") assert [e["id"] for e in response.json()] == list( - reversed([getattr(r, "id") for r in reports]) + reversed([r.id for r in reports]) ) def test_filtering_with_enrolment_status_from_enrolment(self): From 18a5db5b856630232c2d8eb41c76c6d61bf383b7 Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Wed, 8 Oct 2025 16:17:02 +0300 Subject: [PATCH 05/11] chore: sync pre-commit ruff version Refs: PT-1947 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 438c94a3..9ba071a2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,7 +19,7 @@ repos: # the ruff's version line, it is used by test_pre_commit_ruff_version.py # test case in order not to have to add a YAML library dependency just # to test this version: - rev: v0.13.2 # ruff-pre-commit version + rev: v0.13.3 # ruff-pre-commit version hooks: # Run the linter - id: ruff From b31d62d9f960bbe2868903d1193f696f12f5dacb Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Wed, 8 Oct 2025 17:12:43 +0300 Subject: [PATCH 06/11] refactor: apply manual ruff rules and snapshots Updates: - Update to use lowercased function-level variables - Update to use snake-casing - Move dynamic getattr-calls to module level from function default parameters - Postfix exception-classes with 'Error' - Move tzinfo-variable to module-level to reduce excessive code duplication - Update syrupy snapshots - Update GDPR-tests Refs: PT-1947 --- common/tests/test_mixins.py | 25 ++- gdpr/tests/test_gdpr_api.py | 11 +- graphene_linked_events/schema.py | 2 +- .../tests/__snapshots__/test_api.ambr | 10 +- graphene_linked_events/tests/test_api.py | 38 ++-- notification_importers/admin.py | 8 +- ...import_notifications_from_google_sheets.py | 4 +- ...mport_notifications_from_template_files.py | 4 +- .../notification_importer.py | 8 +- occurrences/schema_services.py | 10 +- occurrences/tests/test_api.py | 185 +++++++++--------- occurrences/tests/test_models.py | 41 ++-- occurrences/tests/test_signals.py | 2 +- organisations/tests/test_api.py | 6 +- palvelutarjotin/exceptions.py | 2 +- palvelutarjotin/views.py | 9 +- reports/admin.py | 4 +- reports/exceptions.py | 2 +- reports/models.py | 7 +- reports/tests/test_views.py | 82 ++++---- verification_token/models.py | 11 +- 21 files changed, 249 insertions(+), 222 deletions(-) diff --git a/common/tests/test_mixins.py b/common/tests/test_mixins.py index 71458a82..201d5a3f 100644 --- a/common/tests/test_mixins.py +++ b/common/tests/test_mixins.py @@ -29,21 +29,21 @@ def user(self): @pytest.mark.django_db def test_write_audit_access_log_of_paginated_objects(self, factory, user): - BATCH_SIZE = 3 - p_events = PalvelutarjotinEventFactory.create_batch(BATCH_SIZE) + batch_size = 3 + p_events = PalvelutarjotinEventFactory.create_batch(batch_size) request = factory.get("/") request.user = user list_view = self.DummyListView(request) with mock.patch("auditlog.signals.accessed.send") as mock_send: list_view._write_audit_access_log_of_paginated_objects(p_events) - assert mock_send.call_count == BATCH_SIZE + assert mock_send.call_count == batch_size for p_event in p_events: mock_send.assert_any_call(sender=PalvelutarjotinEvent, instance=p_event) @pytest.mark.django_db def test_paginate_queryset_no_pagination(self, factory, user): - BATCH_SIZE = 3 - p_events = PalvelutarjotinEventFactory.create_batch(BATCH_SIZE) + batch_size = 3 + p_events = PalvelutarjotinEventFactory.create_batch(batch_size) request = factory.get("/") request.user = user list_view = self.DummyListView(request) @@ -57,15 +57,12 @@ def test_paginate_queryset_no_pagination(self, factory, user): @parameterized.expand([(5, 5), (10, 20)]) @pytest.mark.django_db def test_paginate_queryset_with_pagination(self, page_size, batch_size): - PAGE_SIZE = page_size user = UserFactory() factory = APIRequestFactory() class CustomPaginator(PageNumberPagination): - page_size = PAGE_SIZE - def paginate_queryset(self, queryset, request, **kwargs): - return queryset[: self.page_size] + return queryset[:page_size] p_events = PalvelutarjotinEventFactory.create_batch(batch_size) request = factory.get("/", {"page": 1}) @@ -79,7 +76,7 @@ def paginate_queryset(self, queryset, request, **kwargs): result = list_view.paginate_queryset(p_events) assert result is not None mock_write_log.assert_called_once() - assert len(mock_write_log.call_args[0][0]) == PAGE_SIZE + assert len(mock_write_log.call_args[0][0]) == page_size @pytest.mark.django_db def test_paginate_queryset_with_empty_queryset(self, factory, user): @@ -100,14 +97,14 @@ def test_access_log_written_from_every_result(self, factory, user): Test that an access log entry is written for each object in the list view result. """ - BATCH_SIZE = 3 - p_events = PalvelutarjotinEventFactory.create_batch(BATCH_SIZE) + batch_size = 3 + p_events = PalvelutarjotinEventFactory.create_batch(batch_size) request = factory.get("/") request.user = user list_view = self.DummyListView(request) list_view.paginate_queryset(p_events) - assert PalvelutarjotinEvent.objects.count() == BATCH_SIZE + assert PalvelutarjotinEvent.objects.count() == batch_size assert ( LogEntry.objects.filter(actor=user, action=LogEntry.Action.ACCESS).count() - == BATCH_SIZE + == batch_size ) diff --git a/gdpr/tests/test_gdpr_api.py b/gdpr/tests/test_gdpr_api.py index 1ccb332f..31b898ee 100644 --- a/gdpr/tests/test_gdpr_api.py +++ b/gdpr/tests/test_gdpr_api.py @@ -282,15 +282,20 @@ def test_delete_profile_data_from_gdpr_api( all_count = LogEntry.objects.count() assert all_count > 2 created = LogEntry.objects.filter(action=LogEntry.Action.CREATE) + updated = LogEntry.objects.filter(action=LogEntry.Action.UPDATE) deleted = LogEntry.objects.filter(action=LogEntry.Action.DELETE) - assert created.count() == all_count - deleted.count() + assert created.count() == all_count - updated.count() - deleted.count() + assert updated.count() == 1 + assert updated.first().object_id == user.id assert deleted.count() == 1 assert deleted.first().object_id == user.id else: - assert LogEntry.objects.count() == 2 - (created_log, deleted_log) = LogEntry.objects.all().order_by("id") + assert LogEntry.objects.count() == 3 + (created_log, updated_log, deleted_log) = LogEntry.objects.all().order_by("id") assert created_log.action == LogEntry.Action.CREATE assert created_log.object_id == user.id + assert updated_log.action == LogEntry.Action.UPDATE + assert updated_log.object_id == user.id assert deleted_log.action == LogEntry.Action.DELETE assert deleted_log.object_id == user.id diff --git a/graphene_linked_events/schema.py b/graphene_linked_events/schema.py index a3a31b07..32092e0a 100644 --- a/graphene_linked_events/schema.py +++ b/graphene_linked_events/schema.py @@ -88,7 +88,7 @@ class LocalisedObjectInput(InputObjectType): class Division(ObjectType): type = String(required=True) - ocdId = String(description="Open Civic Data ID") + ocd_id = String(description="Open Civic Data ID") municipality = String() name = Field(LocalisedObject) diff --git a/graphene_linked_events/tests/__snapshots__/test_api.ambr b/graphene_linked_events/tests/__snapshots__/test_api.ambr index 0c8be71b..59a20e2e 100644 --- a/graphene_linked_events/tests/__snapshots__/test_api.ambr +++ b/graphene_linked_events/tests/__snapshots__/test_api.ambr @@ -868,7 +868,7 @@ 'divisions': list([ dict({ 'municipality': None, - 'ocdId': None, + 'ocdId': 'ocd-division/country:fi/kunta:espoo', }), ]), 'email': 'sellonkirjasto@espoo.fi', @@ -937,7 +937,7 @@ 'divisions': list([ dict({ 'municipality': None, - 'ocdId': None, + 'ocdId': 'ocd-division/country:fi/kunta:espoo', }), ]), 'email': 'sellonkirjasto@espoo.fi', @@ -998,7 +998,7 @@ 'divisions': list([ dict({ 'municipality': None, - 'ocdId': None, + 'ocdId': 'ocd-division/country:fi/kunta:espoo', }), ]), 'email': 'kirjasto.entresse@espoo.fi', @@ -1710,7 +1710,7 @@ 'divisions': list([ dict({ 'municipality': None, - 'ocdId': None, + 'ocdId': 'ocd-division/country:fi/kunta:espoo', }), ]), 'email': 'sellonkirjasto@espoo.fi', @@ -1771,7 +1771,7 @@ 'divisions': list([ dict({ 'municipality': None, - 'ocdId': None, + 'ocdId': 'ocd-division/country:fi/kunta:espoo', }), ]), 'email': 'kirjasto.entresse@espoo.fi', diff --git a/graphene_linked_events/tests/test_api.py b/graphene_linked_events/tests/test_api.py index 7dde6c04..be1d64f4 100644 --- a/graphene_linked_events/tests/test_api.py +++ b/graphene_linked_events/tests/test_api.py @@ -669,13 +669,13 @@ def test_resolve_events_parameter_mapping( linked_event_id = EVENTS_DATA["data"][0]["id"] organisation_id = to_global_id("OrganisationNode", organisation.id) PalvelutarjotinEventFactory(linked_event_id=linked_event_id) - with patch.object(LinkedEventsApiClient, "list") as linkedEventsApiClientMock: + with patch.object(LinkedEventsApiClient, "list") as linked_events_api_client_mock: api_client.execute( GET_EVENTS_QUERY, variables={"organisationId": organisation_id, given: ["test"]}, ) - linkedEventsApiClientMock.assert_called_with( + linked_events_api_client_mock.assert_called_with( "event", filter_list={"publisher": organisation.publisher_id, expected: ["test"]}, is_event_staff=False, @@ -980,12 +980,16 @@ def test_create_event_with_null_organisation_id( ) in executed["errors"][0]["message"] -@pytest.mark.parametrize("organisationId", ["", " ", " " * 10]) +@pytest.mark.parametrize("organisation_id", ["", " ", " " * 10]) def test_create_event_with_empty_or_whitespace_only_organisation_id( - event_staff_api_client, person, mock_create_event_data, organisation, organisationId + event_staff_api_client, + person, + mock_create_event_data, + organisation, + organisation_id, ): variables = deepcopy(CREATE_EVENT_VARIABLES) - variables["input"]["organisationId"] = organisationId + variables["input"]["organisationId"] = organisation_id variables["input"]["pEvent"]["contactPersonId"] = to_global_id( "PersonNode", person.id ) @@ -1353,12 +1357,16 @@ def test_update_event_with_null_organisation_id( ) in executed["errors"][0]["message"] -@pytest.mark.parametrize("organisationId", ["", " ", " " * 10]) +@pytest.mark.parametrize("organisation_id", ["", " ", " " * 10]) def test_update_event_with_empty_or_whitespace_only_organisation_id( - event_staff_api_client, person, mock_update_event_data, organisation, organisationId + event_staff_api_client, + person, + mock_update_event_data, + organisation, + organisation_id, ): variables = deepcopy(UPDATE_EVENT_VARIABLES) - variables["input"]["organisationId"] = organisationId + variables["input"]["organisationId"] = organisation_id variables["input"]["pEvent"]["contactPersonId"] = to_global_id( "PersonNode", person.id ) @@ -1927,24 +1935,24 @@ def test_get_upcoming_events( Event are ordered so that the event with the next upcoming occurrence is first. """ mocked_responses.assert_all_requests_are_fired = False - UPCOMING_MOCKED_EVENTS = [] + upcoming_mocked_events = [] for i in range(1, 4): p_event = PalvelutarjotinEventFactory( linked_event_id=f"kultus:{i}", organisation=organisation ) - MOCK_EVENT_DATA = {**EVENT_DATA, "id": p_event.linked_event_id} + mock_event_data = {**EVENT_DATA, "id": p_event.linked_event_id} mocked_responses.add( responses.GET, url=settings.LINKED_EVENTS_API_CONFIG["ROOT"] + f"event/{p_event.linked_event_id}/", - json=MOCK_EVENT_DATA, + json=mock_event_data, ) mocked_responses.add( responses.PUT, url=settings.LINKED_EVENTS_API_CONFIG["ROOT"] + f"event/{p_event.linked_event_id}/", - json=MOCK_EVENT_DATA, + json=mock_event_data, ) if cancelled: @@ -1967,7 +1975,7 @@ def test_get_upcoming_events( end = start + timedelta(hours=1) OccurrenceFactory.create(p_event=p_event, start_time=start, end_time=end) - UPCOMING_MOCKED_EVENTS.append(MOCK_EVENT_DATA) + upcoming_mocked_events.append(mock_event_data) if upcoming: ds = settings.LINKED_EVENTS_API_CONFIG["DATA_SOURCE"] @@ -1977,11 +1985,11 @@ def test_get_upcoming_events( url=f"{settings.LINKED_EVENTS_API_CONFIG['ROOT']}event/?{query_string}", json={ "meta": { - "count": len(UPCOMING_MOCKED_EVENTS), + "count": len(upcoming_mocked_events), "next": None, "previous": None, }, - "data": UPCOMING_MOCKED_EVENTS, + "data": upcoming_mocked_events, }, ) diff --git a/notification_importers/admin.py b/notification_importers/admin.py index d7f91358..fcb7afcc 100644 --- a/notification_importers/admin.py +++ b/notification_importers/admin.py @@ -14,7 +14,7 @@ from .notification_importer import ( AbstractNotificationImporter, - NotificationImporterException, + NotificationImporterExceptionError, ) logger = logging.getLogger(__name__) @@ -30,7 +30,7 @@ class NotificationTemplateAdminWithImporter(NotificationTemplateAdmin): def changelist_view(self, request, *args, **kwargs): try: self.importer = self.__load_importer_class_from_settings() - except NotificationImporterException as e: + except NotificationImporterExceptionError as e: self._send_error_message(request, e) return super().changelist_view(request, *args, **kwargs) @@ -55,7 +55,7 @@ def update_selected(self, request, queryset): try: num_of_updated = self.importer.update_notifications(queryset) - except NotificationImporterException as e: + except NotificationImporterExceptionError as e: self._send_error_message(request, e) return @@ -88,7 +88,7 @@ def import_missing_notifications(self, request): if self.importer: try: num_of_created = self.importer.create_missing_notifications() - except NotificationImporterException as e: + except NotificationImporterExceptionError as e: self._send_error_message(request, e) else: if num_of_created: diff --git a/notification_importers/management/commands/import_notifications_from_google_sheets.py b/notification_importers/management/commands/import_notifications_from_google_sheets.py index 9aee874b..df0f6af0 100644 --- a/notification_importers/management/commands/import_notifications_from_google_sheets.py +++ b/notification_importers/management/commands/import_notifications_from_google_sheets.py @@ -2,7 +2,7 @@ from notification_importers.notification_importer import ( NotificationGoogleSheetImporter, - NotificationImporterException, + NotificationImporterExceptionError, ) @@ -18,7 +18,7 @@ def handle(self, *args, **options): num_of_created, num_of_updated, ) = importer.create_missing_and_update_existing_notifications() - except NotificationImporterException as e: + except NotificationImporterExceptionError as e: self.stdout.write(self.style.ERROR(e)) return diff --git a/notification_importers/management/commands/import_notifications_from_template_files.py b/notification_importers/management/commands/import_notifications_from_template_files.py index 89886c7f..9e2193dd 100644 --- a/notification_importers/management/commands/import_notifications_from_template_files.py +++ b/notification_importers/management/commands/import_notifications_from_template_files.py @@ -2,7 +2,7 @@ from notification_importers.notification_importer import ( NotificationFileImporter, - NotificationImporterException, + NotificationImporterExceptionError, ) @@ -18,7 +18,7 @@ def handle(self, *args, **options): num_of_created, num_of_updated, ) = importer.create_missing_and_update_existing_notifications() - except NotificationImporterException as e: + except NotificationImporterExceptionError as e: self.stdout.write(self.style.ERROR(e)) return diff --git a/notification_importers/notification_importer.py b/notification_importers/notification_importer.py index d02fcc83..6c98d60a 100644 --- a/notification_importers/notification_importer.py +++ b/notification_importers/notification_importer.py @@ -33,7 +33,7 @@ logger = getLogger(__name__) -class NotificationImporterException(Exception): +class NotificationImporterExceptionError(Exception): pass @@ -138,7 +138,7 @@ def _create_or_update_notification_using_source_data( language_code=language, ) except NotificationTemplateException as e: - raise NotificationImporterException( + raise NotificationImporterExceptionError( f'Error rendering notification "{notification}": {e}' ) from e @@ -173,7 +173,7 @@ def __init__(self, sheet_id: str = None) -> None: else None ) if not self.sheet_id: - raise NotificationImporterException("Sheet ID not set.") + raise NotificationImporterExceptionError("Sheet ID not set.") self.source_data: SourceData = self._fetch_data() @@ -196,7 +196,7 @@ def __fetch_csv_data(self) -> str: response = requests.get(self.url, timeout=self.TIMEOUT) response.raise_for_status() except RequestException as e: - raise NotificationImporterException( + raise NotificationImporterExceptionError( f"Error fetching data from the spreadsheet: {e}" ) from e return response.content.decode("utf-8") diff --git a/occurrences/schema_services.py b/occurrences/schema_services.py index 75b2f3e4..461d26fd 100644 --- a/occurrences/schema_services.py +++ b/occurrences/schema_services.py @@ -25,7 +25,7 @@ DataValidationError, EnrolCancelledOccurrenceError, EnrolmentClosedError, - EnrolmentMaxNeededOccurrenceReached, + EnrolmentMaxNeededOccurrenceReachedError, EnrolmentNotEnoughCapacityError, EnrolmentNotStartedError, InvalidStudyGroupSizeError, @@ -128,7 +128,7 @@ def validate_enrolment( # noqa: C901 ).count() >= occurrence.p_event.needed_occurrences ): - raise EnrolmentMaxNeededOccurrenceReached( + raise EnrolmentMaxNeededOccurrenceReachedError( "Number of enrolled occurrences is greater than the needed occurrences" ) if ( @@ -243,13 +243,13 @@ def get_or_create_contact_person(contact_person_data): return person -def get_instance_list(ModelClass, instance_pks: List[str]): +def get_instance_list(model_class, instance_pks: List[str]): result = [] for instance_pk in instance_pks: try: - instance = ModelClass.objects.get(pk=instance_pk) + instance = model_class.objects.get(pk=instance_pk) result.append(instance) - except ModelClass.DoesNotExist as e: + except model_class.DoesNotExist as e: raise ObjectDoesNotExistError(e) return result diff --git a/occurrences/tests/test_api.py b/occurrences/tests/test_api.py index 0966ac38..695c0765 100644 --- a/occurrences/tests/test_api.py +++ b/occurrences/tests/test_api.py @@ -87,6 +87,9 @@ ) from verification_token.models import VerificationToken +# Module-level tzinfo variable for parametrized tests +tzinfo = timezone.now().tzinfo + @pytest.fixture(autouse=True) def autouse_db(db): @@ -799,11 +802,11 @@ def test_enrol_not_started_occurrence( # Current date froze on 2020-01-04: study_group = StudyGroupFactory(group_size=10) p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) not_started_occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 8, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 8, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=5, max_group_size=15, @@ -839,11 +842,11 @@ def test_enrol_past_occurrence( # Current date froze on 2020-01-04: study_group = StudyGroupFactory(group_size=10) p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 1, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 1, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) past_occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=5, max_group_size=15, @@ -878,11 +881,11 @@ def test_enrol_invalid_group_size( study_group_9 = StudyGroupFactory(group_size=9) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=16, max_group_size=20, @@ -935,11 +938,11 @@ def test_enrol_without_participants( empty_study_group = StudyGroupFactory(group_size=0, amount_of_adult=0) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, ) @@ -988,7 +991,7 @@ def test_enrol_full_people_count_seat_type_occurrence( study_group_20 = StudyGroupFactory(group_size=20) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, auto_acceptance=auto_acceptance, needed_occurrences=2, @@ -996,7 +999,7 @@ def test_enrol_full_people_count_seat_type_occurrence( # Invalid occurrence which does not support such a large study group invalid_occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1006,7 +1009,7 @@ def test_enrol_full_people_count_seat_type_occurrence( # if is_multi_enrolment is True, multiple occurrences are needed if is_multi_enrolment: valid_occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1058,12 +1061,12 @@ def test_enrol_full_enrolment_count_seat_type_occurrence( study_group_20 = StudyGroupFactory(group_size=20) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, auto_acceptance=auto_acceptance, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=101, @@ -1160,11 +1163,11 @@ def test_enrol_occurrence(snapshot, api_client, mock_get_event_data): study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1172,7 +1175,7 @@ def test_enrol_occurrence(snapshot, api_client, mock_get_event_data): ) occurrence_2 = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1210,11 +1213,11 @@ def test_enrol_occurrence_without_unit_info_should_raise_error( study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1222,7 +1225,7 @@ def test_enrol_occurrence_without_unit_info_should_raise_error( ) occurrence_2 = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1260,11 +1263,11 @@ def test_enrol_occurrence_with_captcha( study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1299,16 +1302,16 @@ def test_enrol_auto_acceptance_occurrence(snapshot, api_client, mock_get_event_d study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) auto_accept_p_event = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, auto_acceptance=True, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1316,7 +1319,7 @@ def test_enrol_auto_acceptance_occurrence(snapshot, api_client, mock_get_event_d ) auto_accept_occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=auto_accept_p_event, min_group_size=10, max_group_size=20, @@ -1370,14 +1373,14 @@ def test_enrol_max_needed_occurrences(snapshot, api_client, mock_get_event_data) study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, needed_occurrences=2, ) occurrences = OccurrenceFactory.create_batch( 3, - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1421,13 +1424,13 @@ def test_auto_accept_message_is_used_as_custom_message_in_auto_approved_enrolmen # Current date froze on 2020-01-04: auto_acceptance_message = "Testing auto acceptance message" auto_accept_p_event: PalvelutarjotinEvent = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, auto_acceptance=True, auto_acceptance_message=auto_acceptance_message, ) auto_accept_occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=auto_accept_p_event, min_group_size=10, max_group_size=20, @@ -1470,11 +1473,11 @@ def test_unenrol_occurrence_unauthorized( study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1505,19 +1508,19 @@ def test_unenrol_occurrence(snapshot, event_staff_api_client, mock_get_event_dat study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, needed_occurrences=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, amount_of_seats=50, ) occurrence_2 = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1553,12 +1556,12 @@ def test_approve_cancelled_occurrence_enrolment( study_group = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, needed_occurrences=1, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event, min_group_size=10, max_group_size=20, @@ -1592,12 +1595,12 @@ def test_approve_enrolment( study_group_10 = StudyGroupFactory(group_size=10) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, needed_occurrences=1, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1647,12 +1650,12 @@ def test_approve_enrolment_with_custom_message( study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, needed_occurrences=1, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1688,13 +1691,13 @@ def test_approve_enrolment_with_single_enrolment_when_multiple_needed( study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, needed_occurrences=2, auto_acceptance=False, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1725,19 +1728,19 @@ def test_decline_enrolment( study_group_10 = StudyGroupFactory(group_size=10) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, needed_occurrences=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, amount_of_seats=50, ) occurrence_2 = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1798,11 +1801,11 @@ def test_decline_enrolment_with_custom_message( study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1838,11 +1841,11 @@ def test_update_enrolment_unauthorized( study_group_15 = StudyGroupFactory(group_size=15) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1867,19 +1870,19 @@ def test_update_enrolment( study_group_10 = StudyGroupFactory(group_size=10) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, needed_occurrences=2, ) occurrence_1 = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, amount_of_seats=35, ) occurrence_2 = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, @@ -1927,10 +1930,10 @@ def test_occurrences_filter_by_date( api_client, snapshot, mock_get_event_data, mock_update_event_data ): OccurrenceFactory( - start_time=datetime(2020, 1, 1, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 1, 0, 0, 0, tzinfo=tzinfo), ) OccurrenceFactory( - start_time=datetime(2020, 1, 2, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 2, 0, 0, 0, tzinfo=tzinfo), ) variables = {"date": "2020-01-02"} executed = api_client.execute(OCCURRENCES_QUERY, variables=variables) @@ -1938,7 +1941,7 @@ def test_occurrences_filter_by_date( assert len(executed["data"]["occurrences"]["edges"]) == 1 snapshot.assert_match(executed) OccurrenceFactory( - start_time=datetime(2020, 1, 2, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 2, 0, 0, 0, tzinfo=tzinfo), ) executed = api_client.execute(OCCURRENCES_QUERY, variables=variables) assert len(executed["data"]["occurrences"]["edges"]) == 2 @@ -1950,14 +1953,16 @@ def test_occurrences_filter_by_time( ): for i in range(10, 12): OccurrenceFactory( - start_time=datetime(2020, 1, 1, i, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 1, i, 0, 0, tzinfo=tzinfo), ) OccurrenceFactory( - start_time=datetime(2020, 1, 2, i + 1, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 2, i + 1, 0, 0, tzinfo=tzinfo), ) + OccurrenceFactory( - start_time=datetime(2020, 1, 1, 13, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 1, 13, 0, 0, tzinfo=tzinfo), ) + variables_1 = {"time": "12:00:00"} variables_2 = {"time": "14:00:00+02:00"} variables_3 = {"time": "11:00:00+00:00"} @@ -1981,29 +1986,29 @@ def test_occurrences_filter_by_upcoming( mock_update_event_data, ): p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=10, ) # Current date froze on 2020-01-04: # Past occurrences OccurrenceFactory( - start_time=datetime(2020, 1, 2, 0, 0, 0, tzinfo=timezone.now().tzinfo), - end_time=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 2, 0, 0, 0, tzinfo=tzinfo), + end_time=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, ) OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), - end_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), + end_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, ) OccurrenceFactory( - start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), - end_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), + end_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, ) OccurrenceFactory( - start_time=datetime(2020, 1, 4, 0, 0, 0, tzinfo=timezone.now().tzinfo), - end_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 4, 0, 0, 0, tzinfo=tzinfo), + end_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, ) @@ -2022,23 +2027,23 @@ def test_occurrences_filter_by_enrollable( mock_update_event_data, ): p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=enrolment_end_days, ) OccurrenceFactory( - start_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, ) OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, ) # Past occurrences OccurrenceFactory( - start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, ) @@ -2093,13 +2098,13 @@ def test_occurrences_ordering_by_order_by_start_time( snapshot, api_client, mock_get_event_data, mock_update_event_data ): OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), ) OccurrenceFactory( - start_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=tzinfo), ) OccurrenceFactory( - start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), ) executed_asc = api_client.execute( @@ -2157,13 +2162,13 @@ def test_occurrences_ordering_by_order_by_end_time( snapshot, api_client, mock_get_event_data, mock_update_event_data ): OccurrenceFactory( - end_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + end_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), ) OccurrenceFactory( - end_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=timezone.now().tzinfo), + end_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=tzinfo), ) OccurrenceFactory( - end_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), + end_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), ) executed_asc = api_client.execute( @@ -2189,26 +2194,26 @@ def test_occurrences_next_and_last_occurrence( # Current date froze on 2020-01-04: OccurrenceFactory( p_event=p_event, - start_time=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), ) OccurrenceFactory( p_event=p_event, - start_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 7, 0, 0, 0, tzinfo=tzinfo), ) OccurrenceFactory( p_event=p_event, - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), ) # next, but cancelled, so won't be picked OccurrenceFactory( p_event=p_event, - start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 5, 0, 0, 0, tzinfo=tzinfo), cancelled=True, ) # last, but cancelled, so won't be picked OccurrenceFactory( p_event=p_event, - start_time=datetime(2020, 1, 8, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 8, 0, 0, 0, tzinfo=tzinfo), cancelled=True, ) @@ -2342,7 +2347,7 @@ def test_cancel_occurrence( def test_occurrence_enrolments_unauthorized( event_staff_api_client, api_client, mock_get_event_data, occurrence ): - OCCURRENCE_ENROLMENTS_QUERY = """ + occurrence_enrolments_query = """ query Occurrence($id: ID!){ occurrence(id: $id){ enrolments { @@ -2361,14 +2366,14 @@ def test_occurrence_enrolments_unauthorized( # Invalid case: Not using the API client as a staff member executed = api_client.execute( - OCCURRENCE_ENROLMENTS_QUERY, + occurrence_enrolments_query, variables={"id": to_global_id("OccurrenceNode", occurrence.id)}, ) assert_permission_denied(executed) # Invalid case: The organisation does not match executed = event_staff_api_client.execute( - OCCURRENCE_ENROLMENTS_QUERY, + occurrence_enrolments_query, variables={"id": to_global_id("OccurrenceNode", occurrence.id)}, ) # FIXME: The permission denied error should be raised @@ -2380,7 +2385,7 @@ def test_occurrence_enrolments_unauthorized( occurrence.p_event.organisation ) executed = event_staff_api_client.execute( - OCCURRENCE_ENROLMENTS_QUERY, + occurrence_enrolments_query, variables={"id": to_global_id("OccurrenceNode", occurrence.id)}, ) assert len(executed["data"]["occurrence"]["enrolments"]["edges"]) == 5 @@ -2389,7 +2394,7 @@ def test_occurrence_enrolments_unauthorized( def test_occurrence_study_groups_unauthorized( event_staff_api_client, api_client, mock_get_event_data, occurrence ): - OCCURRENCE_STUDY_GROUPS_QUERY = """ + occurrence_study_groups_query = """ query Occurrence($id: ID!){ occurrence(id: $id){ studyGroups { @@ -2408,14 +2413,14 @@ def test_occurrence_study_groups_unauthorized( # Invalid case: Not using the API client as a staff member executed = api_client.execute( - OCCURRENCE_STUDY_GROUPS_QUERY, + occurrence_study_groups_query, variables={"id": to_global_id("OccurrenceNode", occurrence.id)}, ) assert_permission_denied(executed) # Invalid case: The organisation does not match executed = event_staff_api_client.execute( - OCCURRENCE_STUDY_GROUPS_QUERY, + occurrence_study_groups_query, variables={"id": to_global_id("OccurrenceNode", occurrence.id)}, ) assert executed["data"]["occurrence"]["studyGroups"]["edges"] == [] @@ -2425,7 +2430,7 @@ def test_occurrence_study_groups_unauthorized( occurrence.p_event.organisation ) executed = event_staff_api_client.execute( - OCCURRENCE_STUDY_GROUPS_QUERY, + occurrence_study_groups_query, variables={"id": to_global_id("OccurrenceNode", occurrence.id)}, ) assert len(executed["data"]["occurrence"]["studyGroups"]["edges"]) == 5 diff --git a/occurrences/tests/test_models.py b/occurrences/tests/test_models.py index 231856e9..3892a4a4 100644 --- a/occurrences/tests/test_models.py +++ b/occurrences/tests/test_models.py @@ -34,6 +34,9 @@ User = get_user_model() +# Module-level tzinfo variable for parametrized tests +tzinfo = timezone.now().tzinfo + @pytest.mark.django_db def test_palvelutarjotin_event(mock_get_event_data): @@ -458,22 +461,22 @@ def test_occurrence_seat_approved(mock_get_event_data): def test_enrolment_approve( api_client, mock_update_event_data, mock_get_event_data, occurrence ): - TARGET_AMOUNT_OF_TAKEN_SEATS = 20 + 14 # for groups of 20 and 14 people + target_amount_of_taken_seats = 20 + 14 # for groups of 20 and 14 people study_group_14 = StudyGroupFactory(group_size=14) study_group_15 = StudyGroupFactory(group_size=15) study_group_20 = StudyGroupFactory(group_size=20) # Current date froze on 2020-01-04: p_event_1 = PalvelutarjotinEventFactory( - enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=timezone.now().tzinfo), + enrolment_start=datetime(2020, 1, 3, 0, 0, 0, tzinfo=tzinfo), enrolment_end_days=2, auto_acceptance=True, ) occurrence = OccurrenceFactory( - start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 6, 0, 0, 0, tzinfo=tzinfo), p_event=p_event_1, min_group_size=10, max_group_size=20, - amount_of_seats=TARGET_AMOUNT_OF_TAKEN_SEATS, + amount_of_seats=target_amount_of_taken_seats, ) # After 20 people there are 14 seats left @@ -495,7 +498,7 @@ def test_enrolment_approve( assert ( occurrence.seats_taken == occurrence.amount_of_seats - == TARGET_AMOUNT_OF_TAKEN_SEATS + == target_amount_of_taken_seats ) @@ -531,13 +534,13 @@ def test_languages_are_sorted_by_name_and_id(mock_get_event_data): [ # new starting occurrence ( - datetime(2020, 1, 10, 0, 0, 0, tzinfo=timezone.now().tzinfo), - datetime(2020, 1, 11, 0, 0, 0, tzinfo=timezone.now().tzinfo), + datetime(2020, 1, 10, 0, 0, 0, tzinfo=tzinfo), + datetime(2020, 1, 11, 0, 0, 0, tzinfo=tzinfo), ), # new ending occurrence ( - datetime(2020, 1, 25, 0, 0, 0, tzinfo=timezone.now().tzinfo), - datetime(2020, 1, 26, 0, 0, 0, tzinfo=timezone.now().tzinfo), + datetime(2020, 1, 25, 0, 0, 0, tzinfo=tzinfo), + datetime(2020, 1, 26, 0, 0, 0, tzinfo=tzinfo), ), ], ) @@ -548,7 +551,7 @@ def test_republish_event_to_sync_times_on_save_calls_republish_when_published( occurrence_end_time, mock_get_event_data, ): - enrolment_start = datetime(2020, 1, 10, 0, 0, 0, tzinfo=timezone.now().tzinfo) + enrolment_start = datetime(2020, 1, 10, 0, 0, 0, tzinfo=tzinfo) enrolment_end_days = 1 p_event = PalvelutarjotinEventFactory( enrolment_start=enrolment_start, @@ -558,15 +561,15 @@ def test_republish_event_to_sync_times_on_save_calls_republish_when_published( # First occurrence, starts earliest possible, is a 1 day event OccurrenceFactory( p_event=p_event, - start_time=datetime(2020, 1, 11, 0, 0, 0, tzinfo=timezone.now().tzinfo), - end_time=datetime(2020, 1, 12, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 11, 0, 0, 0, tzinfo=tzinfo), + end_time=datetime(2020, 1, 12, 0, 0, 0, tzinfo=tzinfo), ) # Last occurrence, starts 10 days after first one, is a 1 day event OccurrenceFactory( p_event=p_event, - start_time=datetime(2020, 1, 21, 0, 0, 0, tzinfo=timezone.now().tzinfo), - end_time=datetime(2020, 1, 22, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 21, 0, 0, 0, tzinfo=tzinfo), + end_time=datetime(2020, 1, 22, 0, 0, 0, tzinfo=tzinfo), ) # new parametrized occurrence @@ -585,7 +588,7 @@ def test_republish_event_to_sync_times_on_update_calls_republish_when_published( mock_send_event_republish, mock_get_event_data, ): - enrolment_start = datetime(2020, 1, 10, 0, 0, 0, tzinfo=timezone.now().tzinfo) + enrolment_start = datetime(2020, 1, 10, 0, 0, 0, tzinfo=tzinfo) enrolment_end_days = 1 p_event = PalvelutarjotinEventFactory( enrolment_start=enrolment_start, @@ -595,15 +598,15 @@ def test_republish_event_to_sync_times_on_update_calls_republish_when_published( # First occurrence, starts earliest possible, is a 1 day event occurrence1 = OccurrenceFactory( p_event=p_event, - start_time=datetime(2020, 1, 11, 0, 0, 0, tzinfo=timezone.now().tzinfo), - end_time=datetime(2020, 1, 12, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 11, 0, 0, 0, tzinfo=tzinfo), + end_time=datetime(2020, 1, 12, 0, 0, 0, tzinfo=tzinfo), ) # Last occurrence, starts 10 days after first one, is a 1 day event occurrence2 = OccurrenceFactory( p_event=p_event, - start_time=datetime(2020, 1, 21, 0, 0, 0, tzinfo=timezone.now().tzinfo), - end_time=datetime(2020, 1, 22, 0, 0, 0, tzinfo=timezone.now().tzinfo), + start_time=datetime(2020, 1, 21, 0, 0, 0, tzinfo=tzinfo), + end_time=datetime(2020, 1, 22, 0, 0, 0, tzinfo=tzinfo), ) assert Occurrence.objects.count() == 2 diff --git a/occurrences/tests/test_signals.py b/occurrences/tests/test_signals.py index 0622a4e8..8f2559eb 100644 --- a/occurrences/tests/test_signals.py +++ b/occurrences/tests/test_signals.py @@ -143,7 +143,7 @@ def test_occurrence_delete_should_ignore_errors( @patch.object( api_client, "update", return_value=mocked_json_response(data=None, status_code=404) ) -def test_occurrence_without_p_event_should_not_call_API(mock_api_client_update): +def test_occurrence_without_p_event_should_not_call_api(mock_api_client_update): occurrence = OccurrenceFactory(p_event=None) # Test p_Event does not exist occurrence.p_event_id = 0 # object which does not exist diff --git a/organisations/tests/test_api.py b/organisations/tests/test_api.py index ba296c34..cc6623bb 100644 --- a/organisations/tests/test_api.py +++ b/organisations/tests/test_api.py @@ -387,8 +387,8 @@ def test_organisation_query(snapshot, api_client, organisation): def test_organisation_persons_should_not_be_publicly_readable( api_client, event_staff_api_client, organisation ): - PERSONS_COUNT = 3 - PersonFactory.create_batch(PERSONS_COUNT, organisations=[organisation]) + persons_count = 3 + PersonFactory.create_batch(persons_count, organisations=[organisation]) variables = {"id": to_global_id("OrganisationNode", organisation.id)} anonym_executed = api_client.execute( ORGANISATION_QUERY, @@ -399,7 +399,7 @@ def test_organisation_persons_should_not_be_publicly_readable( ORGANISATION_QUERY, variables=variables ) assert ( - len(staff_executed["data"]["organisation"]["persons"]["edges"]) == PERSONS_COUNT + len(staff_executed["data"]["organisation"]["persons"]["edges"]) == persons_count ) diff --git a/palvelutarjotin/exceptions.py b/palvelutarjotin/exceptions.py index 81cc95b0..9a0ca056 100644 --- a/palvelutarjotin/exceptions.py +++ b/palvelutarjotin/exceptions.py @@ -45,7 +45,7 @@ class AuthenticationExpiredError(PalvelutarjotinGraphQLError): """Authentication expired.""" -class EnrolmentMaxNeededOccurrenceReached(PalvelutarjotinGraphQLError): +class EnrolmentMaxNeededOccurrenceReachedError(PalvelutarjotinGraphQLError): """Number of enroled occurrences greater than needed occurrences""" diff --git a/palvelutarjotin/views.py b/palvelutarjotin/views.py index 16b95c40..4cfe6ce8 100644 --- a/palvelutarjotin/views.py +++ b/palvelutarjotin/views.py @@ -41,7 +41,7 @@ DataValidationError, EnrolCancelledOccurrenceError, EnrolmentClosedError, - EnrolmentMaxNeededOccurrenceReached, + EnrolmentMaxNeededOccurrenceReachedError, EnrolmentNotEnoughCapacityError, EnrolmentNotStartedError, IncorrectGlobalIdError, @@ -78,7 +78,7 @@ EnrolmentNotStartedError: ENROLMENT_NOT_STARTED_ERROR, EnrolmentClosedError: ENROLMENT_CLOSED_ERROR, EnrolCancelledOccurrenceError: ENROL_CANCELLED_OCCURRENCE_ERROR, - EnrolmentMaxNeededOccurrenceReached: MAX_NEEDED_OCCURRENCES_REACHED_ERROR, + EnrolmentMaxNeededOccurrenceReachedError: MAX_NEEDED_OCCURRENCES_REACHED_ERROR, InvalidStudyGroupSizeError: INVALID_STUDY_GROUP_SIZE_ERROR, InvalidEmailFormatError: INVALID_EMAIL_FORMAT_ERROR, CaptchaValidationFailedError: CAPTCHA_VALIDATION_FAILED_ERROR, @@ -131,11 +131,12 @@ def _capture_sentry_exceptions(self, errors, query): def format_error(error): def get_error_code(exception): """Get the most specific error code for the exception via superclass""" - for exception in exception.mro(): + for e in exception.mro(): try: - return error_codes[exception] + return error_codes[e] except KeyError: continue + return None try: error_code = get_error_code(error.original_error.__class__) diff --git a/reports/admin.py b/reports/admin.py index c161f6a7..06a16eb6 100644 --- a/reports/admin.py +++ b/reports/admin.py @@ -10,7 +10,7 @@ from django.utils.translation import ngettext_lazy from occurrences.models import Language, StudyLevel -from reports.exceptions import EnrolmentReportCouldNotHydrateLinkedEventsData +from reports.exceptions import EnrolmentReportCouldNotHydrateLinkedEventsDataError from reports.models import EnrolmentReport logger = logging.getLogger(__name__) @@ -251,7 +251,7 @@ def __sync_enrolment_reports( for report in queryset: report._rehydrate(hydrate_linkedevents_event=hydrate_linkedevents_event) report.save() - except EnrolmentReportCouldNotHydrateLinkedEventsData as e: + except EnrolmentReportCouldNotHydrateLinkedEventsDataError as e: self._send_error_message(request, e) return diff --git a/reports/exceptions.py b/reports/exceptions.py index 9582137b..06ad1e42 100644 --- a/reports/exceptions.py +++ b/reports/exceptions.py @@ -1,3 +1,3 @@ -class EnrolmentReportCouldNotHydrateLinkedEventsData(Exception): +class EnrolmentReportCouldNotHydrateLinkedEventsDataError(Exception): """An Enrolment Report instance failed to rehydrate it's field with the data from LinkedEvents API""" diff --git a/reports/models.py b/reports/models.py index 00007374..4dbd0cfd 100644 --- a/reports/models.py +++ b/reports/models.py @@ -10,7 +10,7 @@ import occurrences.models as occurrences_models import reports.services as reports_services from common.models import TimestampedModel -from reports.exceptions import EnrolmentReportCouldNotHydrateLinkedEventsData +from reports.exceptions import EnrolmentReportCouldNotHydrateLinkedEventsDataError from reports.utils import get_event_keywords, get_event_provider logger = logging.getLogger(__name__) @@ -296,7 +296,10 @@ def _rehydrate(self, hydrate_linkedevents_event=False): # calculate the distance self.set_distance_from_unit_to_event_place() - except (AttributeError, EnrolmentReportCouldNotHydrateLinkedEventsData) as e: + except ( + AttributeError, + EnrolmentReportCouldNotHydrateLinkedEventsDataError, + ) as e: logger.warning( "Error in rehydration of enrolment report " f"(id: {self.id}, _enrolment.id: {self._enrolment_id}) - {e}." diff --git a/reports/tests/test_views.py b/reports/tests/test_views.py index 4540731a..469ba0cd 100644 --- a/reports/tests/test_views.py +++ b/reports/tests/test_views.py @@ -243,19 +243,19 @@ def setUp(self): @pytest.mark.django_db def test_auditlog_access_logging(self): - PERSONS_BATCH_COUNT = 5 + persons_batch_count = 5 user = UserFactory() - PersonFactory.create_batch(PERSONS_BATCH_COUNT) + PersonFactory.create_batch(persons_batch_count) self.view.request = RequestFactory().get( "/fake-path/", headers={"X-Forwarded-For": REMOTE_ADDR} ) self.view.request.user = user queryset = self.view.get_queryset() - self.assertEqual(queryset.count(), PERSONS_BATCH_COUNT) + self.assertEqual(queryset.count(), persons_batch_count) access_logs = LogEntry.objects.filter(action=LogEntry.Action.ACCESS) self.assertEqual( access_logs.count(), - PERSONS_BATCH_COUNT, + persons_batch_count, ) access_log_entry = access_logs.first() self.assertEqual(access_log_entry.actor, user) @@ -287,9 +287,9 @@ def test_get_context_data(self): def test_auditlog_access_logging( self, ): - ORGANISATION_BATCH_COUNT = 2 + organisation_batch_count = 2 user = UserFactory() - org1, org2 = OrganisationFactory.create_batch(ORGANISATION_BATCH_COUNT) + org1, org2 = OrganisationFactory.create_batch(organisation_batch_count) PersonFactory.create_batch(2, organisations=[org1]) PersonFactory.create_batch(2, organisations=[org2]) self.view.request = RequestFactory().get( @@ -297,11 +297,11 @@ def test_auditlog_access_logging( ) self.view.request.user = user queryset = self.view.get_queryset() - self.assertEqual(queryset.count(), ORGANISATION_BATCH_COUNT) + self.assertEqual(queryset.count(), organisation_batch_count) access_logs = LogEntry.objects.filter(action=LogEntry.Action.ACCESS) self.assertEqual( access_logs.count(), - ORGANISATION_BATCH_COUNT, + organisation_batch_count, ) access_log_entry = access_logs.first() self.assertEqual(access_log_entry.actor, user) @@ -350,22 +350,22 @@ def test_get_context_data(self): def test_auditlog_access_logging( self, ): - EVENT_BATCH_COUNT = 2 - ENROLMENT_BATCH_COUNT = 2 - ENROLMENT_TOTAL_COUNT = EVENT_BATCH_COUNT * ENROLMENT_BATCH_COUNT + event_batch_count = 2 + enrolment_batch_count = 2 + enrolment_total_count = event_batch_count * enrolment_batch_count user = UserFactory() today = datetime.now(tz=datetime_timezone.utc) p_event1, p_event2 = PalvelutarjotinEventFactory.create_batch( - EVENT_BATCH_COUNT, enrolment_start=today + event_batch_count, enrolment_start=today ) EnrolmentFactory.create_batch( - ENROLMENT_BATCH_COUNT, + enrolment_batch_count, occurrence__p_event=p_event1, status=Enrolment.STATUS_APPROVED, ) EnrolmentFactory.create_batch( - ENROLMENT_BATCH_COUNT, + enrolment_batch_count, occurrence__p_event=p_event2, status=Enrolment.STATUS_APPROVED, ) @@ -373,14 +373,14 @@ def test_auditlog_access_logging( "/fake-path/", headers={"X-Forwarded-For": REMOTE_ADDR} ) self.view.request.user = user - self.assertEqual(PalvelutarjotinEvent.objects.count(), EVENT_BATCH_COUNT) - self.assertEqual(Enrolment.objects.count(), ENROLMENT_TOTAL_COUNT) + self.assertEqual(PalvelutarjotinEvent.objects.count(), event_batch_count) + self.assertEqual(Enrolment.objects.count(), enrolment_total_count) kwargs = {} self.view.get_context_data(object_list=[p_event1, p_event2], **kwargs) access_logs = LogEntry.objects.filter(action=LogEntry.Action.ACCESS) self.assertEqual( access_logs.count(), - ENROLMENT_TOTAL_COUNT, + enrolment_total_count, ) access_log_entry = access_logs.first() self.assertEqual(access_log_entry.actor, user) @@ -393,8 +393,8 @@ class PersonsCsvViewTest(TestCase): def test_export_persons_csv_data( self, ): - PERSONS_BATCH_COUNT = 2 - person_1, person_2 = PersonFactory.create_batch(PERSONS_BATCH_COUNT) + persons_batch_count = 2 + person_1, person_2 = PersonFactory.create_batch(persons_batch_count) admin_user = UserFactory(is_event_staff=True) user = UserFactory(is_event_staff=False) @@ -426,10 +426,10 @@ def test_export_persons_csv_data( def test_auditlog_access_logging( self, ): - PERSON_BATCH_COUNT = 2 + person_batch_count = 2 admin_user = UserFactory(is_event_staff=True) PersonFactory.create_batch( - PERSON_BATCH_COUNT, + person_batch_count, ) staff_api_client = APIClient() staff_api_client.force_authenticate(user=admin_user) @@ -438,13 +438,13 @@ def test_auditlog_access_logging( headers={"X-Forwarded-For": REMOTE_ADDR}, ) - self.assertEqual(Person.objects.count(), PERSON_BATCH_COUNT) + self.assertEqual(Person.objects.count(), person_batch_count) access_logs = LogEntry.objects.filter( action=LogEntry.Action.ACCESS, actor=admin_user ) self.assertEqual( access_logs.count(), - PERSON_BATCH_COUNT, + person_batch_count, ) access_log_entry = access_logs.first() self.assertEqual(access_log_entry.actor, admin_user) @@ -488,17 +488,17 @@ def test_export_organisation_csv_data(self): def test_auditlog_access_logging( self, ): - ORGANISATION_BATCH_COUNT = 2 - PERSON_BATCH_COUNT = 2 - PERSON_TOTAL_COUNT = ORGANISATION_BATCH_COUNT * PERSON_BATCH_COUNT + organisation_batch_count = 2 + person_batch_count = 2 + person_total_count = organisation_batch_count * person_batch_count admin_user = UserFactory(is_staff=True) - org1, org2 = OrganisationFactory.create_batch(ORGANISATION_BATCH_COUNT) + org1, org2 = OrganisationFactory.create_batch(organisation_batch_count) PersonFactory.create_batch( - PERSON_BATCH_COUNT, + person_batch_count, organisations=[org1], ) PersonFactory.create_batch( - PERSON_BATCH_COUNT, + person_batch_count, organisations=[org2], ) staff_api_client = APIClient() @@ -508,14 +508,14 @@ def test_auditlog_access_logging( headers={"X-Forwarded-For": REMOTE_ADDR}, ) - self.assertEqual(Organisation.objects.count(), ORGANISATION_BATCH_COUNT) - self.assertEqual(Person.objects.count(), PERSON_TOTAL_COUNT) + self.assertEqual(Organisation.objects.count(), organisation_batch_count) + self.assertEqual(Person.objects.count(), person_total_count) access_logs = LogEntry.objects.filter( action=LogEntry.Action.ACCESS, actor=admin_user ) self.assertEqual( access_logs.count(), - PERSON_TOTAL_COUNT, + person_total_count, ) access_log_entry = access_logs.first() self.assertEqual(access_log_entry.actor, admin_user) @@ -571,21 +571,21 @@ def test_export_enrolment_csv_data(self): def test_auditlog_access_logging( self, ): - EVENT_BATCH_COUNT = 2 - ENROLMENT_BATCH_COUNT = 2 - ENROLMENT_TOTAL_COUNT = EVENT_BATCH_COUNT * ENROLMENT_BATCH_COUNT + event_batch_count = 2 + enrolment_batch_count = 2 + enrolment_total_count = event_batch_count * enrolment_batch_count today = datetime.now(tz=datetime_timezone.utc) admin_user = UserFactory(is_staff=True) p_event1, p_event2 = PalvelutarjotinEventFactory.create_batch( - EVENT_BATCH_COUNT, enrolment_start=today + event_batch_count, enrolment_start=today ) EnrolmentFactory.create_batch( - ENROLMENT_BATCH_COUNT, + enrolment_batch_count, occurrence__p_event=p_event1, status=Enrolment.STATUS_APPROVED, ) EnrolmentFactory.create_batch( - ENROLMENT_BATCH_COUNT, + enrolment_batch_count, occurrence__p_event=p_event2, status=Enrolment.STATUS_APPROVED, ) @@ -595,14 +595,14 @@ def test_auditlog_access_logging( "/reports/palvelutarjotinevent/enrolments/csv/", headers={"X-Forwarded-For": REMOTE_ADDR}, ) - self.assertEqual(PalvelutarjotinEvent.objects.count(), EVENT_BATCH_COUNT) - self.assertEqual(Enrolment.objects.count(), ENROLMENT_TOTAL_COUNT) + self.assertEqual(PalvelutarjotinEvent.objects.count(), event_batch_count) + self.assertEqual(Enrolment.objects.count(), enrolment_total_count) access_logs = LogEntry.objects.filter( action=LogEntry.Action.ACCESS, actor=admin_user ) self.assertEqual( access_logs.count(), - ENROLMENT_TOTAL_COUNT, + enrolment_total_count, ) access_log_entry = access_logs.first() self.assertEqual(access_log_entry.actor, admin_user) diff --git a/verification_token/models.py b/verification_token/models.py index e6d059ed..a3ecbeea 100644 --- a/verification_token/models.py +++ b/verification_token/models.py @@ -11,6 +11,11 @@ from organisations.models import Person +VERIFICATION_TOKEN_VALID_MINUTES = getattr( + settings, "VERIFICATION_TOKEN_VALID_MINUTES", 15 +) +VERIFICATION_TOKEN_LENGTH = getattr(settings, "VERIFICATION_TOKEN_LENGTH", 32) + class VerificationTokenManager(models.Manager): def deactivate_token( @@ -28,7 +33,7 @@ def deactivate_and_create_token( obj, person, verification_type, - expiry_minutes=getattr(settings, "VERIFICATION_TOKEN_VALID_MINUTES", 15), + expiry_minutes=VERIFICATION_TOKEN_VALID_MINUTES, ): """ Deactivate old tokens (of a type) and create a new one. @@ -42,7 +47,7 @@ def create_token( person, verification_type, email=None, - expiry_minutes=getattr(settings, "VERIFICATION_TOKEN_VALID_MINUTES", 15), + expiry_minutes=VERIFICATION_TOKEN_VALID_MINUTES, ): key = self.model.generate_key() @@ -136,7 +141,7 @@ class VerificationToken(models.Model): @classmethod def generate_key(cls): """Generates a new key for a verification token.""" - return token_urlsafe(getattr(settings, "VERIFICATION_TOKEN_LENGTH", 32)) + return token_urlsafe(VERIFICATION_TOKEN_LENGTH) def is_valid(self): """Validates token state.""" From f20e836ce002bb1ce0d776cfd2c000329dc69c26 Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Thu, 9 Oct 2025 08:12:17 +0300 Subject: [PATCH 07/11] chore: bump postgres to 17 Django 5.2 dropped support for PostgreSQL 13. Refs: PT-1947 --- .github/workflows/ci.yml | 2 +- README.md | 2 +- compose.yaml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 22e4177e..e7894dfa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,4 +13,4 @@ jobs: secrets: inherit with: python-version: 3.12 - postgres-major-version: 13 + postgres-major-version: 17 diff --git a/README.md b/README.md index ecca6326..0a3f43d9 100644 --- a/README.md +++ b/README.md @@ -196,7 +196,7 @@ The project is now running at http://localhost:8081 Prerequisites (defined by [Dockerfile](./Dockerfile) and [compose.yaml](./compose.yaml)): -- PostgreSQL 13 +- PostgreSQL 17 - Python 3.12 Steps: diff --git a/compose.yaml b/compose.yaml index 8d82486c..af4b4ed2 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,13 +1,13 @@ services: kultus-db: - image: postgres:13 + image: postgres:17-alpine restart: on-failure env_file: - .env # For POSTGRES_USER, POSTGRES_PASSWORD and POSTGRES_DB ports: - ${DB_PORT:-5434}:5432 volumes: - - pgdata:/var/lib/postgresql@13/data + - pgdata:/var/lib/postgresql/data container_name: kultus-db django: From 45d4d679fe961df9ad9476c086d430b09a0150b6 Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Thu, 9 Oct 2025 08:24:42 +0300 Subject: [PATCH 08/11] style: include migrations to ruff-config Apply ruff formatting. Refs: PT-1947 --- .../migrations/0023_study_level_data.py | 22 ++++++------- .../0038_deletable_person_support.py | 2 +- .../0039_deletable_contact_info_support.py | 2 +- ...4_add_group_name_to_studygroup_order_by.py | 11 ++++--- organisations/migrations/0001_initial.py | 3 +- .../migrations/0010_fix_user_manager.py | 1 + ...vent_staff_alter_user_is_admin_and_more.py | 33 ++++++++++++------- .../0014_data_populate_kultus_admin_access.py | 30 ++++++++--------- ...d_ordering_and_indices_to_organisations.py | 25 ++++++++------ .../migrations/0016_user_last_api_use.py | 11 ++++--- pyproject.toml | 1 - 11 files changed, 79 insertions(+), 62 deletions(-) diff --git a/occurrences/migrations/0023_study_level_data.py b/occurrences/migrations/0023_study_level_data.py index c6fd34fb..8c21f18b 100644 --- a/occurrences/migrations/0023_study_level_data.py +++ b/occurrences/migrations/0023_study_level_data.py @@ -18,10 +18,10 @@ def init_study_levels(apps, schema_editor): translation.activate("en") for level in range(len(StudyGroupStudyLevels.STUDY_LEVELS)): - id, en_label = StudyGroupStudyLevels.STUDY_LEVELS[level] + _id, en_label = StudyGroupStudyLevels.STUDY_LEVELS[level] # Multiply by 10, so it's easier to add new levels between existing ones. study_level = NewStudyLevel( - id=id, + id=_id, level=level * 10, ) study_level.label = en_label @@ -33,8 +33,8 @@ def clear_study_levels(apps, schema_editor): Reverse for init_study_levels: Clears the StudyLevel table. """ - StudyLevel = apps.get_model("occurrences", "StudyLevel") - StudyLevel.objects.all().delete() + study_level_model = apps.get_model("occurrences", "StudyLevel") + study_level_model.objects.all().delete() def link_study_levels(apps, schema_editor): @@ -48,19 +48,19 @@ def link_study_levels(apps, schema_editor): # The StudyGroup model cannot be imported directly as it has been changed. # The historical version must be used instead. - StudyGroup = apps.get_model("occurrences", "StudyGroup") - ThroughModel = NewStudyGroup.study_levels.through + study_group_model = apps.get_model("occurrences", "StudyGroup") + through_model = NewStudyGroup.study_levels.through new_objects = [ - ThroughModel(studygroup_id=studygroup_id, studylevel_id=studylevel_id) - for studygroup_id, studylevel_id in StudyGroup.objects.exclude( + through_model(studygroup_id=studygroup_id, studylevel_id=studylevel_id) + for studygroup_id, studylevel_id in study_group_model.objects.exclude( study_level__isnull=True ) .exclude(study_level__exact="") .values_list("id", "study_level") ] - ThroughModel.objects.bulk_create(new_objects) + through_model.objects.bulk_create(new_objects) def reverse_link_study_levels(apps, schema_editor): @@ -69,8 +69,8 @@ def reverse_link_study_levels(apps, schema_editor): StudyGroups and StudyLevels and populates a study_level field. """ - StudyLevel = apps.get_model("occurrences", "StudyLevel") - for study_level in StudyLevel.objects.all(): + study_level_model = apps.get_model("occurrences", "StudyLevel") + for study_level in study_level_model.objects.all(): study_level.study_groups.all().update(study_level=study_level.id) diff --git a/occurrences/migrations/0038_deletable_person_support.py b/occurrences/migrations/0038_deletable_person_support.py index c056c1eb..f5f6dcab 100644 --- a/occurrences/migrations/0038_deletable_person_support.py +++ b/occurrences/migrations/0038_deletable_person_support.py @@ -1,7 +1,7 @@ # Generated by Django 3.2.13 on 2022-12-27 14:03 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/occurrences/migrations/0039_deletable_contact_info_support.py b/occurrences/migrations/0039_deletable_contact_info_support.py index 3b2009f0..4ee0e989 100644 --- a/occurrences/migrations/0039_deletable_contact_info_support.py +++ b/occurrences/migrations/0039_deletable_contact_info_support.py @@ -1,7 +1,7 @@ # Generated by Django 3.2.13 on 2022-12-29 09:58 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/occurrences/migrations/0044_add_group_name_to_studygroup_order_by.py b/occurrences/migrations/0044_add_group_name_to_studygroup_order_by.py index 5d4d1238..71d2d646 100644 --- a/occurrences/migrations/0044_add_group_name_to_studygroup_order_by.py +++ b/occurrences/migrations/0044_add_group_name_to_studygroup_order_by.py @@ -4,14 +4,17 @@ class Migration(migrations.Migration): - dependencies = [ - ('occurrences', '0043_add_is_queueing_allowed_and_preferred_times'), + ("occurrences", "0043_add_is_queueing_allowed_and_preferred_times"), ] operations = [ migrations.AlterModelOptions( - name='studygroup', - options={'ordering': ['created_at', 'group_name'], 'verbose_name': 'study group', 'verbose_name_plural': 'study groups'}, + name="studygroup", + options={ + "ordering": ["created_at", "group_name"], + "verbose_name": "study group", + "verbose_name_plural": "study groups", + }, ), ] diff --git a/organisations/migrations/0001_initial.py b/organisations/migrations/0001_initial.py index 3274c47a..5f2a7581 100644 --- a/organisations/migrations/0001_initial.py +++ b/organisations/migrations/0001_initial.py @@ -1,10 +1,11 @@ # Generated by Django 2.2.10 on 2020-04-29 09:17 +import uuid + import django.contrib.auth.models import django.contrib.auth.validators import django.db.models.deletion import django.utils.timezone -import uuid from django.conf import settings from django.db import migrations, models diff --git a/organisations/migrations/0010_fix_user_manager.py b/organisations/migrations/0010_fix_user_manager.py index b4d0f569..cb43c9e9 100644 --- a/organisations/migrations/0010_fix_user_manager.py +++ b/organisations/migrations/0010_fix_user_manager.py @@ -1,6 +1,7 @@ # Generated by Django 3.2.13 on 2023-01-05 08:24 from django.db import migrations + import organisations.models diff --git a/organisations/migrations/0013_user_is_event_staff_alter_user_is_admin_and_more.py b/organisations/migrations/0013_user_is_event_staff_alter_user_is_admin_and_more.py index ea1823ca..ee964f0f 100644 --- a/organisations/migrations/0013_user_is_event_staff_alter_user_is_admin_and_more.py +++ b/organisations/migrations/0013_user_is_event_staff_alter_user_is_admin_and_more.py @@ -4,25 +4,36 @@ class Migration(migrations.Migration): - dependencies = [ - ('organisations', '0012_alter_person_options'), + ("organisations", "0012_alter_person_options"), ] operations = [ migrations.AddField( - model_name='user', - name='is_event_staff', - field=models.BooleanField(default=False, help_text='Designates whether the user can access the Kultus Admin UI (React app) as an event provider to manage events and their enrolments. Note that staff users are automatically also event staff members.', verbose_name='Event Admin (in Kultus Admin UI)'), + model_name="user", + name="is_event_staff", + field=models.BooleanField( + default=False, + help_text="Designates whether the user can access the Kultus Admin UI (React app) as an event provider to manage events and their enrolments. Note that staff users are automatically also event staff members.", + verbose_name="Event Admin (in Kultus Admin UI)", + ), ), migrations.AlterField( - model_name='user', - name='is_admin', - field=models.BooleanField(default=False, help_text='Designates whether the user actively administrates the provider users. Admins receives some administrative emails, e.g, whenever a user requests a provider user status and an access to the Kultus Admin UI. Note that admin users are automatically also staff members.', verbose_name='Admin status'), + model_name="user", + name="is_admin", + field=models.BooleanField( + default=False, + help_text="Designates whether the user actively administrates the provider users. Admins receives some administrative emails, e.g, whenever a user requests a provider user status and an access to the Kultus Admin UI. Note that admin users are automatically also staff members.", + verbose_name="Admin status", + ), ), migrations.AlterField( - model_name='user', - name='is_staff', - field=models.BooleanField(default=False, help_text='Designates whether the user can log into the Django Admin site. This permission is primarily intended for internal Django administration tasks. Note that staff users are automatically also event staff members.', verbose_name='Staff Status (Django Admin)'), + model_name="user", + name="is_staff", + field=models.BooleanField( + default=False, + help_text="Designates whether the user can log into the Django Admin site. This permission is primarily intended for internal Django administration tasks. Note that staff users are automatically also event staff members.", + verbose_name="Staff Status (Django Admin)", + ), ), ] diff --git a/organisations/migrations/0014_data_populate_kultus_admin_access.py b/organisations/migrations/0014_data_populate_kultus_admin_access.py index 0a0d652e..a949ec60 100644 --- a/organisations/migrations/0014_data_populate_kultus_admin_access.py +++ b/organisations/migrations/0014_data_populate_kultus_admin_access.py @@ -1,44 +1,40 @@ from django.db import migrations from django.db.models import F + def data_populate_kultus_admin_access(apps, schema_editor): - User = apps.get_model('organisations', 'User') + User = apps.get_model("organisations", "User") # Update non-superusers: Set is_event_staff based on is_staff and set is_staff to False User.objects.filter(is_superuser=False).update( - is_event_staff=F('is_staff'), - is_staff=False + is_event_staff=F("is_staff"), is_staff=False ) # Update superusers: Set is_staff and is_event_staff to True - User.objects.filter(is_superuser=True).update( - is_staff=True, - is_event_staff=True - ) + User.objects.filter(is_superuser=True).update(is_staff=True, is_event_staff=True) + def reverse_data_populate_kultus_admin_access(apps, schema_editor): - User = apps.get_model('organisations', 'User') + User = apps.get_model("organisations", "User") # WARNING: Reversing this data migration might lead to data loss in the # 'is_staff' field for non-superusers if the 'is_event_staff' field has # been modified after the forward migration. # Reverse for non-superusers: Set is_staff based on is_event_staff - User.objects.filter(is_superuser=False).update( - is_staff=F('is_event_staff') - ) + User.objects.filter(is_superuser=False).update(is_staff=F("is_event_staff")) # Reverse for all users: Set is_event_staff to False (as it was the new field) - User.objects.all().update( - is_event_staff=False - ) + User.objects.all().update(is_event_staff=False) -class Migration(migrations.Migration): +class Migration(migrations.Migration): dependencies = [ - ('organisations', '0013_user_is_event_staff_alter_user_is_admin_and_more'), + ("organisations", "0013_user_is_event_staff_alter_user_is_admin_and_more"), ] operations = [ - migrations.RunPython(data_populate_kultus_admin_access, reverse_data_populate_kultus_admin_access), + migrations.RunPython( + data_populate_kultus_admin_access, reverse_data_populate_kultus_admin_access + ), ] diff --git a/organisations/migrations/0015_add_ordering_and_indices_to_organisations.py b/organisations/migrations/0015_add_ordering_and_indices_to_organisations.py index b82839aa..898e1e65 100644 --- a/organisations/migrations/0015_add_ordering_and_indices_to_organisations.py +++ b/organisations/migrations/0015_add_ordering_and_indices_to_organisations.py @@ -4,24 +4,29 @@ class Migration(migrations.Migration): - dependencies = [ - ('organisations', '0014_data_populate_kultus_admin_access'), + ("organisations", "0014_data_populate_kultus_admin_access"), ] operations = [ migrations.AlterModelOptions( - name='organisation', - options={'ordering': ['name', 'publisher_id', 'id'], 'verbose_name': 'organisation', 'verbose_name_plural': 'organisations'}, + name="organisation", + options={ + "ordering": ["name", "publisher_id", "id"], + "verbose_name": "organisation", + "verbose_name_plural": "organisations", + }, ), migrations.AlterField( - model_name='organisation', - name='name', - field=models.CharField(db_index=True, max_length=255, verbose_name='name'), + model_name="organisation", + name="name", + field=models.CharField(db_index=True, max_length=255, verbose_name="name"), ), migrations.AlterField( - model_name='organisation', - name='publisher_id', - field=models.CharField(db_index=True, max_length=255, verbose_name='publisher id'), + model_name="organisation", + name="publisher_id", + field=models.CharField( + db_index=True, max_length=255, verbose_name="publisher id" + ), ), ] diff --git a/organisations/migrations/0016_user_last_api_use.py b/organisations/migrations/0016_user_last_api_use.py index df60ff7f..9672347b 100644 --- a/organisations/migrations/0016_user_last_api_use.py +++ b/organisations/migrations/0016_user_last_api_use.py @@ -4,15 +4,16 @@ class Migration(migrations.Migration): - dependencies = [ - ('organisations', '0015_add_ordering_and_indices_to_organisations'), + ("organisations", "0015_add_ordering_and_indices_to_organisations"), ] operations = [ migrations.AddField( - model_name='user', - name='last_api_use', - field=models.DateField(blank=True, null=True, verbose_name='Latest API token usage date'), + model_name="user", + name="last_api_use", + field=models.DateField( + blank=True, null=True, verbose_name="Latest API token usage date" + ), ), ] diff --git a/pyproject.toml b/pyproject.toml index 47ae42d2..a4044073 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,6 @@ requires-python = ">= 3.12" [tool.ruff] target-version = "py312" -extend-exclude = ["migrations"] [tool.ruff.lint] select = [ From 93e628b5a31e36e9ba6e93d812939f337d88b8b3 Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Thu, 9 Oct 2025 08:26:33 +0300 Subject: [PATCH 09/11] style: use default ruff linting rules Apply updated ruff rules. Refs: 1947 --- gdpr/service.py | 2 +- graphene_linked_events/schema.py | 2 +- graphene_linked_events/tests/test_api.py | 2 +- graphene_linked_events/utils.py | 2 +- occurrences/event_api_services.py | 2 +- occurrences/schema.py | 2 +- organisations/schema.py | 2 +- palvelutarjotin/tests/test_oidc.py | 2 +- pyproject.toml | 8 -------- reports/tests/test_views.py | 2 +- reports/views/api.py | 2 +- reports/views/csv_api.py | 2 +- 12 files changed, 11 insertions(+), 19 deletions(-) diff --git a/gdpr/service.py b/gdpr/service.py index 39ccf2a2..2c4e1169 100644 --- a/gdpr/service.py +++ b/gdpr/service.py @@ -1,5 +1,5 @@ import logging -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional from helsinki_gdpr.types import ErrorResponse diff --git a/graphene_linked_events/schema.py b/graphene_linked_events/schema.py index 32092e0a..74095d90 100644 --- a/graphene_linked_events/schema.py +++ b/graphene_linked_events/schema.py @@ -8,11 +8,11 @@ from django.db import transaction from django.utils.translation import gettext_lazy as _ from graphene import ( + ID, Boolean, Enum, Field, Float, - ID, InputField, InputObjectType, Int, diff --git a/graphene_linked_events/tests/test_api.py b/graphene_linked_events/tests/test_api.py index be1d64f4..f887722f 100644 --- a/graphene_linked_events/tests/test_api.py +++ b/graphene_linked_events/tests/test_api.py @@ -19,10 +19,10 @@ mocked_json_response, ) from graphene_linked_events.rest_client import LinkedEventsApiClient +from graphene_linked_events.schema import Query from graphene_linked_events.schema import ( api_client as graphene_linked_events_api_client, ) -from graphene_linked_events.schema import Query from graphene_linked_events.tests.mock_data import ( EVENT_DATA, EVENTS_DATA, diff --git a/graphene_linked_events/utils.py b/graphene_linked_events/utils.py index 58bbfe0d..98a353d6 100644 --- a/graphene_linked_events/utils.py +++ b/graphene_linked_events/utils.py @@ -5,8 +5,8 @@ from typing import List from django.conf import settings -from geopy import distance as geopy_distance from geopy import Point +from geopy import distance as geopy_distance from graphene_linked_events.rest_client import LinkedEventsApiClient from palvelutarjotin.exceptions import ApiBadRequestError, ObjectDoesNotExistError diff --git a/occurrences/event_api_services.py b/occurrences/event_api_services.py index 07f23a0c..7cbace7c 100644 --- a/occurrences/event_api_services.py +++ b/occurrences/event_api_services.py @@ -1,7 +1,7 @@ import json import logging from datetime import timedelta -from typing import List, Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, List, Optional from django.utils import timezone diff --git a/occurrences/schema.py b/occurrences/schema.py index 3be03165..a288e0f6 100644 --- a/occurrences/schema.py +++ b/occurrences/schema.py @@ -14,9 +14,9 @@ from graphene_django.filter import DjangoFilterConnectionField from common.utils import ( + LanguageEnum, get_editable_obj_from_global_id, get_node_id_from_global_id, - LanguageEnum, map_enums_to_values_in_kwargs, raise_permission_denied_if_not_event_staff, update_object, diff --git a/organisations/schema.py b/organisations/schema.py index 9493b1af..4191246d 100644 --- a/organisations/schema.py +++ b/organisations/schema.py @@ -12,8 +12,8 @@ from graphql_jwt.decorators import login_required, superuser_required from common.utils import ( - get_node_id_from_global_id, LanguageEnum, + get_node_id_from_global_id, map_enums_to_values_in_kwargs, update_object, ) diff --git a/palvelutarjotin/tests/test_oidc.py b/palvelutarjotin/tests/test_oidc.py index 058d45d3..ba458afb 100644 --- a/palvelutarjotin/tests/test_oidc.py +++ b/palvelutarjotin/tests/test_oidc.py @@ -6,7 +6,7 @@ import jwt import pytest from authlib.jose.rfc7519.claims import JWTClaims -from django.test import override_settings, TestCase +from django.test import TestCase, override_settings from django.test.client import RequestFactory from django.utils import timezone from freezegun import freeze_time diff --git a/pyproject.toml b/pyproject.toml index a4044073..2ff048c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,14 +31,6 @@ allow-unsafe = true generate-hashes = true strip-extras = true -[tool.ruff.lint.isort] -# isort options for ruff: -# https://docs.astral.sh/ruff/settings/#lintisort -order-by-type = false # Don't use type (i.e. case) to sort imports - -[tool.ruff.format] -docstring-code-format = true # Format code in docstrings - [tool.coverage.run] # Coverage run options: # https://coverage.readthedocs.io/en/latest/config.html#run diff --git a/reports/tests/test_views.py b/reports/tests/test_views.py index 469ba0cd..e7cd93bd 100644 --- a/reports/tests/test_views.py +++ b/reports/tests/test_views.py @@ -7,7 +7,7 @@ from auditlog.models import LogEntry from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType -from django.test import override_settings, TestCase +from django.test import TestCase, override_settings from django.test.client import RequestFactory from django.utils.timezone import get_current_timezone from django.views.generic import TemplateView diff --git a/reports/views/api.py b/reports/views/api.py index 38ead961..ee35acb7 100644 --- a/reports/views/api.py +++ b/reports/views/api.py @@ -2,7 +2,7 @@ from django.utils.translation import gettext as _ from drf_spectacular.types import OpenApiTypes -from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiResponse +from drf_spectacular.utils import OpenApiParameter, OpenApiResponse, extend_schema from rest_framework import generics from rest_framework.permissions import DjangoModelPermissions diff --git a/reports/views/csv_api.py b/reports/views/csv_api.py index 757620de..9673feeb 100644 --- a/reports/views/csv_api.py +++ b/reports/views/csv_api.py @@ -9,7 +9,7 @@ from django.utils import timezone from django.utils.translation import gettext as _ from drf_spectacular.types import OpenApiTypes -from drf_spectacular.utils import extend_schema, OpenApiExample, OpenApiResponse +from drf_spectacular.utils import OpenApiExample, OpenApiResponse, extend_schema from rest_framework import generics from rest_framework.authentication import SessionAuthentication from rest_framework.permissions import BasePermission From 17e34c9abdb7389abe8f74d1ece459e8b960dea5 Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Thu, 9 Oct 2025 08:43:40 +0300 Subject: [PATCH 10/11] fix: update time-filtering for Django 5 Django 5 requires a date for DST-calculations, therefore use full datetime with timezone info. Refs: PT-1947 --- common/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/utils.py b/common/utils.py index 873660e9..d47cf801 100644 --- a/common/utils.py +++ b/common/utils.py @@ -100,9 +100,9 @@ def convert_to_localtime_tz(value): dt = datetime.combine(datetime.now().date(), value) if timezone.is_naive(value): # Auto add local timezone to naive time - return timezone.make_aware(dt).timetz() + return timezone.make_aware(dt) else: - return timezone.localtime(dt).timetz() + return timezone.localtime(dt) def to_local_datetime_if_naive(value) -> datetime: From 25f6c4fbc35a8709cff171ffed89fb0e06620a47 Mon Sep 17 00:00:00 2001 From: Mika Hietanen Date: Thu, 9 Oct 2025 13:27:12 +0300 Subject: [PATCH 11/11] fix: update verification token settings Utilize verification token settings directly from the standard 'settings'-module. Add missing 'VERIFICATION_TOKEN_LENGTH'-setting and update 'PERSONAL_DATA_RETENTION_PERIOD_MONTHS'-type. Refs: PT-1947 --- palvelutarjotin/settings.py | 5 ++++- verification_token/models.py | 11 +++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/palvelutarjotin/settings.py b/palvelutarjotin/settings.py index 5b0b4df4..eedef5d4 100644 --- a/palvelutarjotin/settings.py +++ b/palvelutarjotin/settings.py @@ -77,6 +77,7 @@ KULTUS_TEACHER_UI_BASE_URL=(str, "https://kultus.hel.fi/"), ENABLE_SUMMARY_REPORT=(bool, False), VERIFICATION_TOKEN_VALID_MINUTES=(int, 15), + VERIFICATION_TOKEN_LENGTH=(int, 32), PERSONAL_DATA_RETENTION_PERIOD_MONTHS=(int, 24), UPDATE_LAST_LOGIN_ENABLED=(bool, True), UPDATE_LAST_LOGIN_INTERVAL_MINUTES=(int, 60), @@ -428,6 +429,8 @@ "TARGET_GROUP": env.str("KEYWORD_SET_TARGET_GROUP_ID"), } +VERIFICATION_TOKEN_VALID_MINUTES = env.int("VERIFICATION_TOKEN_VALID_MINUTES") +VERIFICATION_TOKEN_LENGTH = env.int("VERIFICATION_TOKEN_LENGTH") VERIFICATION_TOKEN_URL_MAPPING = { "occurrences.enrolment.CANCELLATION": f"{KULTUS_TEACHER_UI_BASE_URL}" + "{lang}/enrolments/cancel/{unique_id}", @@ -437,7 +440,7 @@ MAX_UPLOAD_SIZE = 2621440 # 2MB -PERSONAL_DATA_RETENTION_PERIOD_MONTHS = env("PERSONAL_DATA_RETENTION_PERIOD_MONTHS") +PERSONAL_DATA_RETENTION_PERIOD_MONTHS = env.int("PERSONAL_DATA_RETENTION_PERIOD_MONTHS") # local_settings.py can be used to override environment-specific settings # like database and email that differ between development and production. diff --git a/verification_token/models.py b/verification_token/models.py index a3ecbeea..bedae371 100644 --- a/verification_token/models.py +++ b/verification_token/models.py @@ -11,11 +11,6 @@ from organisations.models import Person -VERIFICATION_TOKEN_VALID_MINUTES = getattr( - settings, "VERIFICATION_TOKEN_VALID_MINUTES", 15 -) -VERIFICATION_TOKEN_LENGTH = getattr(settings, "VERIFICATION_TOKEN_LENGTH", 32) - class VerificationTokenManager(models.Manager): def deactivate_token( @@ -33,7 +28,7 @@ def deactivate_and_create_token( obj, person, verification_type, - expiry_minutes=VERIFICATION_TOKEN_VALID_MINUTES, + expiry_minutes=settings.VERIFICATION_TOKEN_VALID_MINUTES, ): """ Deactivate old tokens (of a type) and create a new one. @@ -47,7 +42,7 @@ def create_token( person, verification_type, email=None, - expiry_minutes=VERIFICATION_TOKEN_VALID_MINUTES, + expiry_minutes=settings.VERIFICATION_TOKEN_VALID_MINUTES, ): key = self.model.generate_key() @@ -141,7 +136,7 @@ class VerificationToken(models.Model): @classmethod def generate_key(cls): """Generates a new key for a verification token.""" - return token_urlsafe(VERIFICATION_TOKEN_LENGTH) + return token_urlsafe(settings.VERIFICATION_TOKEN_LENGTH) def is_valid(self): """Validates token state."""