diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 861830209a..88cb801b64 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,7 +1,7 @@
repos:
- repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version.
- rev: 'v0.2.2'
+ rev: 'v0.15.22'
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix, --extend-exclude, TCH]
diff --git a/cdk/app.py b/cdk/app.py
index 5632f2ecb6..03a0025142 100644
--- a/cdk/app.py
+++ b/cdk/app.py
@@ -22,9 +22,9 @@
# Set the DC Environment early on. This is important to be able to conditionally
# change the stack configurations
dc_environment = app.node.try_get_context("dc-environment") or None
-assert (
- dc_environment in valid_environments
-), f"context `dc-environment` must be one of {valid_environments}"
+assert dc_environment in valid_environments, (
+ f"context `dc-environment` must be one of {valid_environments}"
+)
YnrStack(
diff --git a/pyproject.toml b/pyproject.toml
index d0ce3d7929..4ca22351c0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -85,8 +85,8 @@ dev = [
"pytest-cov==4.0.0",
"pytest-django==4.5.2",
"pytest-freezegun==0.4.2",
- "pytest-ruff==0.2.1",
- "ruff==0.2.2",
+ "pytest-ruff==0.5",
+ "ruff==0.15.22",
"watchdog==4.0.2",
"WebTest==3.0.0",
]
diff --git a/uv.lock b/uv.lock
index f087066893..1107b7f444 100644
--- a/uv.lock
+++ b/uv.lock
@@ -947,7 +947,7 @@ name = "jinxed"
version = "1.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "ansicon", marker = "sys_platform == 'win32'" },
+ { name = "ansicon" },
]
sdist = { url = "https://files.pythonhosted.org/packages/20/d0/59b2b80e7a52d255f9e0ad040d2e826342d05580c4b1d7d7747cfb8db731/jinxed-1.3.0.tar.gz", hash = "sha256:1593124b18a41b7a3da3b078471442e51dbad3d77b4d4f2b0c26ab6f7d660dbf", size = 80981, upload-time = "2024-07-31T22:39:18.854Z" }
wheels = [
@@ -1286,7 +1286,7 @@ name = "pexpect"
version = "4.9.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "ptyprocess", marker = "sys_platform != 'win32'" },
+ { name = "ptyprocess" },
]
sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" }
wheels = [
@@ -1567,14 +1567,15 @@ wheels = [
[[package]]
name = "pytest-ruff"
-version = "0.2.1"
+version = "0.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
+ { name = "pytest" },
{ name = "ruff" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/fe/d7/6a26602ccf764f4e055cb91002f9c682fca5756dd2df580f48b11d32c0f1/pytest_ruff-0.2.1.tar.gz", hash = "sha256:078ad696bfa347b466991ed4f9cc5ec807f5a171d7f06091660d8f16ba03a5dc", size = 3216, upload-time = "2023-10-31T18:52:11.29Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/32/5a/bee55130757fb4a14e0ac5d2c6558323275b5dccfa2f5353f3893299ff7d/pytest_ruff-0.5.tar.gz", hash = "sha256:f611c780fc2b9b8d7041fa0e7589f0a9f352b288d0cfc330881101b35d382063", size = 3854, upload-time = "2025-06-19T07:26:24.607Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d4/18/982b32eb5b453444f302a9f443baea0cfe11756c67c9c5025d45d658903e/pytest_ruff-0.2.1-py3-none-any.whl", hash = "sha256:f586bbd7978cb5782b673c8e55fa069d83430139931b918bd72232ba3f71eb67", size = 3750, upload-time = "2023-10-31T18:52:09.763Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/ca/abfce6de0bb0f017ed05ef9f2330596235cc5a3341b4d8d40895682b3814/pytest_ruff-0.5-py3-none-any.whl", hash = "sha256:d9db170d86fb167008e6702b4d79e2cccd8287f069c3a57f9261831cebdc4a31", size = 4680, upload-time = "2025-06-19T07:26:23.897Z" },
]
[[package]]
@@ -1677,26 +1678,27 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.2.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/70/06/b2e9ee5f17dab59476fcb6cc6fdd268e8340d95b7dfc760ed93f4243f16f/ruff-0.2.2.tar.gz", hash = "sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d", size = 2040633, upload-time = "2024-02-17T22:36:38.19Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/13/21/e56126ca3b56e6d05a0f6744558305f6589327945ee01b85ffe85a0f37bf/ruff-0.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6", size = 14894866, upload-time = "2024-02-17T22:35:45.715Z" },
- { url = "https://files.pythonhosted.org/packages/b6/1e/fd238f116e2fab69a2fbb4c3ab8903225836cb6d900ff8139c03c2f6f7b7/ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39", size = 7634941, upload-time = "2024-02-17T22:35:51.518Z" },
- { url = "https://files.pythonhosted.org/packages/4c/53/30651b54241f4f26796cbc5b7cdcafebf5ecd7a30997e7a08673e8050b30/ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73", size = 7332185, upload-time = "2024-02-17T22:35:55.053Z" },
- { url = "https://files.pythonhosted.org/packages/1c/8a/8c14e40da4cb8d651fc78f769e938552069e7bc34e9e65f7335f3469f9d2/ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba", size = 6739587, upload-time = "2024-02-17T22:35:57.465Z" },
- { url = "https://files.pythonhosted.org/packages/db/71/5be31e5505307e852020d624049ae6610e1ebb68431bb03251904aa082c6/ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c", size = 7813597, upload-time = "2024-02-17T22:36:00.015Z" },
- { url = "https://files.pythonhosted.org/packages/45/20/89df4f35f0644b529b9e8bb4c9a0a4633ad2fcba888941caaba744ae5768/ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e", size = 8465022, upload-time = "2024-02-17T22:36:03.46Z" },
- { url = "https://files.pythonhosted.org/packages/ec/c2/d2f2b750971593580b29d965bd7bc36a7f5e971b3de24e342235ae7578a9/ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca", size = 8196736, upload-time = "2024-02-17T22:36:07.188Z" },
- { url = "https://files.pythonhosted.org/packages/bc/83/0dfcc589d8d4d27c551dfb5d50ef57b58fc6432298bc115010f7a0642f48/ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001", size = 8896228, upload-time = "2024-02-17T22:36:10.642Z" },
- { url = "https://files.pythonhosted.org/packages/27/f1/3bf230a048561fd03bc779f2a3e5b05d8ea8cb1c91456a4246c5673b8ef5/ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3", size = 7817875, upload-time = "2024-02-17T22:36:15.006Z" },
- { url = "https://files.pythonhosted.org/packages/63/ad/57e10d775d94a22eabdbe272d6ebb687d10ff0312ad8cd81dbc3bdf74081/ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726", size = 7248228, upload-time = "2024-02-17T22:36:17.976Z" },
- { url = "https://files.pythonhosted.org/packages/1d/65/250a8dd655563a31d7f38af35e5a2860a54bc66c121084f36c63d46dd687/ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e", size = 6735053, upload-time = "2024-02-17T22:36:20.94Z" },
- { url = "https://files.pythonhosted.org/packages/ac/e5/6684718861b205985164afb9a1a8ab83deb4fa2326c903570e9d1af9347a/ruff-0.2.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e", size = 7471896, upload-time = "2024-02-17T22:36:23.793Z" },
- { url = "https://files.pythonhosted.org/packages/4c/40/25de7bd89d5af3cd033d42935c7ea2bc79f52fa2f2cf4cbd8f1dbc2cae2b/ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9", size = 7883633, upload-time = "2024-02-17T22:36:26.637Z" },
- { url = "https://files.pythonhosted.org/packages/49/98/9c678bd07561bcdf2129df8284b5708e0393e7c52256db9b30b1b1043cfd/ruff-0.2.2-py3-none-win32.whl", hash = "sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325", size = 6909240, upload-time = "2024-02-17T22:36:29.721Z" },
- { url = "https://files.pythonhosted.org/packages/47/d2/23fe9d73dadec045cbffc0c2046a34f7b829f217abd76fb2d6ef7114d792/ruff-0.2.2-py3-none-win_amd64.whl", hash = "sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d", size = 7593466, upload-time = "2024-02-17T22:36:32.51Z" },
- { url = "https://files.pythonhosted.org/packages/1a/83/0d002e72ba3c15a74e5ac63d31f57d222d8f297e637d065db28f1253f109/ruff-0.2.2-py3-none-win_arm64.whl", hash = "sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd", size = 7222811, upload-time = "2024-02-17T22:36:35.499Z" },
+version = "0.15.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3a/06/ae069393fc66e8ff33036d4b368003833bf6e88ccf182e17e7a2f1c754fd/ruff-0.15.22.tar.gz", hash = "sha256:3f15175b1fb580126f58285a5dae6b2ea89000136d980c64499211f116b54809", size = 4785063, upload-time = "2026-07-16T15:14:13.244Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/23/18/ee54b7ae1e121be7a28ea6da4b67564ebb0530e183a54415ab7e3bcd2c4e/ruff-0.15.22-py3-none-linux_armv6l.whl", hash = "sha256:44423e73493737f5e7c5b41d475483898ff37afcdae38bc3da5085e29af1c2d8", size = 10781258, upload-time = "2026-07-16T15:13:19.452Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/d2/2520cb14761ddbeaf57642a76942fc36adcbdbe53b4532241995f6fc485c/ruff-0.15.22-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b82c6482946e9eda7ff2e091d25b8bad3f718684e1916d41bd56873cee05b697", size = 10999477, upload-time = "2026-07-16T15:13:23.318Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/10/74e53572aa758dfaa678c2a2646b5c5515d884b7ca56be4d2ce03ca4b560/ruff-0.15.22-py3-none-macosx_11_0_arm64.whl", hash = "sha256:11c1c715af53a09f714e011106bffc419751ec8232fcb5da42173284ea3fec6f", size = 10466716, upload-time = "2026-07-16T15:13:26.162Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/cc/44eaaf0844e028182f2d0a8f2190d0f359159aed0a9e5ab861d892f1ae2a/ruff-0.15.22-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:742a29cf29bddb7c8327895d6a10e0e6c5b38a96dd407af9b5d0857f809c0576", size = 10892644, upload-time = "2026-07-16T15:13:29.229Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/21/8edf559014d2b0f82beea19cfb713993ad802ccda16868769979c6090a84/ruff-0.15.22-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72af58b951b0ae395935ae79763dc349bc0eb706319d28f7a33ad2cfb3cfc178", size = 10576719, upload-time = "2026-07-16T15:13:32.35Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/1e/3a13abd392a3b50b62e5938a831f9ab6e588358cacad5c18545b716d2182/ruff-0.15.22-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d425005c1835eb24e2ee4161cb90e8db263415f4a71c8c72c33abaa6c0c224", size = 11376494, upload-time = "2026-07-16T15:13:35.958Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/3e/422d3d95bcf04dd78e1aeac22184d4f9a8fb2c01865d39d44618484a0317/ruff-0.15.22-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b9b3f8779a4f08c969defc3c8c35abffaa757e601ed5ae66d6d1db6519969a", size = 12208370, upload-time = "2026-07-16T15:13:39.185Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/91/5d065a0e0a02bf4813f5119ad278462eed081d2b832eb7c021ade0ec9e65/ruff-0.15.22-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e0dd1b2e4d3d585f897a0d137cbf4eaf6223bef4e8ce34d6bb12556c5f9249e", size = 11581098, upload-time = "2026-07-16T15:13:42.132Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/f9/a0d4871d12fae702eb1f41b686caf05f1f8b124dc6db6f784f53d74918fa/ruff-0.15.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365523eb91d9224e1bcb03b022fbf0facb8f9e23792a2c53d9d4b3924bdbdebb", size = 11399422, upload-time = "2026-07-16T15:13:45.2Z" },
+ { url = "https://files.pythonhosted.org/packages/18/80/c843a5176cddbceb0b7e8dd41cf9993490796c1c469348d384f5a5c13c56/ruff-0.15.22-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:fabfd168afdf29fee5be98b831efa9683c94d7c5a3b58b9ce5a2e38444589a74", size = 11381683, upload-time = "2026-07-16T15:13:48.46Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/00/8485de0ae92239438a36cfc51350db9b9e85c9ebdfaea91b18e422706662/ruff-0.15.22-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:225dbf095a87f1d9f90f5fd7924d2613ee452a75a4308c63a8f50f761787aa7c", size = 10850295, upload-time = "2026-07-16T15:13:51.655Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/91/24977ec2ec72eaf15e4394ace2959fdff2dd1e14f03e005e838023407169/ruff-0.15.22-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1877d63b9d24ed278744f1523fd11b85540566d54641f97c566d7d9dc5ca5296", size = 10579640, upload-time = "2026-07-16T15:13:54.79Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/47/9b51216951974df1f263ac19da550d34252e0ed7218c25f10c5ef9ed7517/ruff-0.15.22-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a1606c510bd7215680d32efab38965f7cdec3ef69f5170a3f4791404ffdd5262", size = 11105077, upload-time = "2026-07-16T15:13:57.915Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/47/20e9d4a3b8016778acea5fc32bb50d35d207500a17ddb529ffa6996feef8/ruff-0.15.22-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:630479b18625f5ffc373f77603a22a9f8ac0acd7ff0501178b5db28ec71e9c64", size = 11490980, upload-time = "2026-07-16T15:14:01.032Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/76/3f72d8fc38c1cb77b38c56a70da9d0c17700cc1cc50f9649c9d3c8f5ba71/ruff-0.15.22-py3-none-win32.whl", hash = "sha256:e5ba0e4a13fd14abbed2a77b517a3911290c6c6c59ef67784328d1668fab76cf", size = 10789165, upload-time = "2026-07-16T15:14:04.16Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/46/4965251734c2b6fcdca1b1b187d20bcac3af0ee5b083b89c910bb961ce3a/ruff-0.15.22-py3-none-win_amd64.whl", hash = "sha256:9be63ba1eb936acd2d1342fb8337c356353706fce233b2a15a09a97037e6acde", size = 11938297, upload-time = "2026-07-16T15:14:07.316Z" },
+ { url = "https://files.pythonhosted.org/packages/57/c9/e69b1ff4c8b69093ef08b8919ab767af0569666865b39c30a8795d88d3c6/ruff-0.15.22-py3-none-win_arm64.whl", hash = "sha256:e1168075b72158510839f250027659cdd78476f40507dd517892304c41318661", size = 11298172, upload-time = "2026-07-16T15:14:10.51Z" },
]
[[package]]
@@ -2223,8 +2225,8 @@ dev = [
{ name = "pytest-django", specifier = "==4.5.2" },
{ name = "pytest-dotenv", specifier = "==0.5.2" },
{ name = "pytest-freezegun", specifier = "==0.4.2" },
- { name = "pytest-ruff", specifier = "==0.2.1" },
- { name = "ruff", specifier = "==0.2.2" },
+ { name = "pytest-ruff", specifier = "==0.5" },
+ { name = "ruff", specifier = "==0.15.22" },
{ name = "watchdog", specifier = "==4.0.2" },
{ name = "webtest", specifier = "==3.0.0" },
]
diff --git a/ynr/apps/api/tests/test_api_next.py b/ynr/apps/api/tests/test_api_next.py
index aa528da13e..a06999f074 100644
--- a/ynr/apps/api/tests/test_api_next.py
+++ b/ynr/apps/api/tests/test_api_next.py
@@ -210,7 +210,7 @@ def test_all_parties_view(self):
},
{
"id": "PP53__1",
- "text": "Labour Party " "Candidate",
+ "text": "Labour Party Candidate",
"register": "GB",
},
],
diff --git a/ynr/apps/auth_helpers/views.py b/ynr/apps/auth_helpers/views.py
index 4065d12de3..ea072bb736 100644
--- a/ynr/apps/auth_helpers/views.py
+++ b/ynr/apps/auth_helpers/views.py
@@ -12,7 +12,6 @@ def user_in_group(user, group_name):
class GroupRequiredMixin(object):
-
"""A mixin that requires the user is a member of a particular group
You should set 'required_group_name' on the class that uses this
diff --git a/ynr/apps/bulk_adding/forms.py b/ynr/apps/bulk_adding/forms.py
index 87f21b9eec..e0fec89d13 100644
--- a/ynr/apps/bulk_adding/forms.py
+++ b/ynr/apps/bulk_adding/forms.py
@@ -121,9 +121,9 @@ def total_form_count(self) -> int:
def get_form_kwargs(self, index):
kwargs = super().get_form_kwargs(index)
kwargs["party_choices"] = self.parties
- kwargs[
- "previous_party_affiliations_choices"
- ] = self.previous_party_affiliations_choices
+ kwargs["previous_party_affiliations_choices"] = (
+ self.previous_party_affiliations_choices
+ )
return kwargs
@property
diff --git a/ynr/apps/bulk_adding/tests/test_bulk_add_by_party.py b/ynr/apps/bulk_adding/tests/test_bulk_add_by_party.py
index 5c7ad5d75c..e20d9b4a4e 100644
--- a/ynr/apps/bulk_adding/tests/test_bulk_add_by_party.py
+++ b/ynr/apps/bulk_adding/tests/test_bulk_add_by_party.py
@@ -199,9 +199,9 @@ def test_submit_name_and_social_media_links_for_area(self):
form[f"{ballot.pk}-0-person_identifiers_0_1"] = "homepage_url"
form[f"{ballot.pk}-0-person_identifiers_1_0"] = "pp@gmail.com"
form[f"{ballot.pk}-0-person_identifiers_1_1"] = "email"
- form[
- f"{ballot.pk}-0-person_identifiers_2_0"
- ] = "https://linkedin.com/in/pamphero"
+ form[f"{ballot.pk}-0-person_identifiers_2_0"] = (
+ "https://linkedin.com/in/pamphero"
+ )
form[f"{ballot.pk}-0-person_identifiers_2_1"] = "linkedin_url"
response = form.submit().follow()
@@ -305,22 +305,22 @@ def test_bulk_add_with_100_ballots(self):
form["source"] = "https://example.com/candidates/"
for ballot in ballots:
form[f"{ballot.pk}-0-name"] = f"Candidate {ballot.pk}"
- form[
- f"{ballot.pk}-0-biography"
- ] = f"Biography for Candidate {ballot.pk}"
+ form[f"{ballot.pk}-0-biography"] = (
+ f"Biography for Candidate {ballot.pk}"
+ )
form[f"{ballot.pk}-0-gender"] = "female"
form[f"{ballot.pk}-0-birth_date"] = "1990"
- form[
- f"{ballot.pk}-0-person_identifiers_0_0"
- ] = f"https://example.com/{ballot.pk}"
+ form[f"{ballot.pk}-0-person_identifiers_0_0"] = (
+ f"https://example.com/{ballot.pk}"
+ )
form[f"{ballot.pk}-0-person_identifiers_0_1"] = "homepage_url"
- form[
- f"{ballot.pk}-0-person_identifiers_1_0"
- ] = f"candidate{ballot.pk}@example.com"
+ form[f"{ballot.pk}-0-person_identifiers_1_0"] = (
+ f"candidate{ballot.pk}@example.com"
+ )
form[f"{ballot.pk}-0-person_identifiers_1_1"] = "email"
- form[
- f"{ballot.pk}-0-person_identifiers_2_0"
- ] = f"https://linkedin.com/in/candidate{ballot.pk}"
+ form[f"{ballot.pk}-0-person_identifiers_2_0"] = (
+ f"https://linkedin.com/in/candidate{ballot.pk}"
+ )
form[f"{ballot.pk}-0-person_identifiers_2_1"] = "linkedin_url"
# Submit the form
diff --git a/ynr/apps/bulk_adding/views/sopns.py b/ynr/apps/bulk_adding/views/sopns.py
index 6f68b29e5d..c888131ce0 100644
--- a/ynr/apps/bulk_adding/views/sopns.py
+++ b/ynr/apps/bulk_adding/views/sopns.py
@@ -286,9 +286,9 @@ def get_context_data(self, **kwargs):
)
if party_description:
form["description_id"] = party_description
- form[
- "party_description_text"
- ] = party_description.description
+ form["party_description_text"] = (
+ party_description.description
+ )
form["name"] = candidacy["name"]
form["party_id"] = party_obj.ec_id
diff --git a/ynr/apps/cached_counts/filters.py b/ynr/apps/cached_counts/filters.py
index ffbc196e50..14e8a843a7 100644
--- a/ynr/apps/cached_counts/filters.py
+++ b/ynr/apps/cached_counts/filters.py
@@ -12,14 +12,14 @@
class CompletenessFilter(django_filters.FilterSet):
def __init__(self, data=None, queryset=None, *, request=None, prefix=None):
for identifier in PersonIdentifierFields:
- self.base_filters[
- f"has_{identifier.name}"
- ] = django_filters.ChoiceFilter(
- field_name=identifier.name,
- method="filter_null_or_empty_str",
- label=f"Has {identifier.value}",
- choices=[("yes", "Yes"), ("no", "No")],
- widget=forms.HiddenInput,
+ self.base_filters[f"has_{identifier.name}"] = (
+ django_filters.ChoiceFilter(
+ field_name=identifier.name,
+ method="filter_null_or_empty_str",
+ label=f"Has {identifier.value}",
+ choices=[("yes", "Yes"), ("no", "No")],
+ widget=forms.HiddenInput,
+ )
)
super().__init__(data, queryset, request=request, prefix=prefix)
diff --git a/ynr/apps/cached_counts/report_helpers.py b/ynr/apps/cached_counts/report_helpers.py
index 82544612d1..587255340a 100644
--- a/ynr/apps/cached_counts/report_helpers.py
+++ b/ynr/apps/cached_counts/report_helpers.py
@@ -808,8 +808,8 @@ def report(self):
] = gender["gender_count"]
for seats_contested, data in grouped_rows.items():
ratio = (
- f'{round(data["M"] / data["F"], 2)}'
- f':{round(data["F"] / data["F"], 2)}'
+ f"{round(data['M'] / data['F'], 2)}"
+ f":{round(data['F'] / data['F'], 2)}"
)
report_list.append([seats_contested, data["F"], data["M"], ratio])
diff --git a/ynr/apps/candidates/csv_helpers.py b/ynr/apps/candidates/csv_helpers.py
index 4e641e160a..f49611a9d8 100644
--- a/ynr/apps/candidates/csv_helpers.py
+++ b/ynr/apps/candidates/csv_helpers.py
@@ -10,7 +10,7 @@ def list_to_csv(membership_list):
csv_fields = settings.CSV_ROW_FIELDS
writer = BufferDictWriter(fieldnames=csv_fields)
writer.writeheader()
- for row in sorted(membership_list, key=lambda d: (d["election_date"])):
+ for row in sorted(membership_list, key=lambda d: d["election_date"]):
writer.writerow(row)
return writer.output
diff --git a/ynr/apps/candidates/management/commands/candidates_rename_ballot.py b/ynr/apps/candidates/management/commands/candidates_rename_ballot.py
index e565eefe48..4973288d5d 100644
--- a/ynr/apps/candidates/management/commands/candidates_rename_ballot.py
+++ b/ynr/apps/candidates/management/commands/candidates_rename_ballot.py
@@ -2,6 +2,7 @@
Foo Bar
"""
+
import json
import sys
from argparse import ArgumentParser
diff --git a/ynr/apps/candidates/models/popolo_extra.py b/ynr/apps/candidates/models/popolo_extra.py
index 76d423fd90..85c2d806af 100644
--- a/ynr/apps/candidates/models/popolo_extra.py
+++ b/ynr/apps/candidates/models/popolo_extra.py
@@ -210,9 +210,9 @@ def by_nation(self, *nation_codes):
"""
nuts_codes = []
for nation_code in nation_codes:
- assert (
- nation_code in settings.NUTS_TO_NATION
- ), f"Unknown nation {nation_code}"
+ assert nation_code in settings.NUTS_TO_NATION, (
+ f"Unknown nation {nation_code}"
+ )
nuts_codes += settings.NUTS_TO_NATION[nation_code]
return self.filter(tags__NUTS1__key__in=nuts_codes)
diff --git a/ynr/apps/candidates/models/versions.py b/ynr/apps/candidates/models/versions.py
index dd3837f87a..44e95e4199 100644
--- a/ynr/apps/candidates/models/versions.py
+++ b/ynr/apps/candidates/models/versions.py
@@ -81,9 +81,9 @@ def get_person_as_version_data(person, new_person=False):
if membership.elected is not None:
candidacy["elected"] = membership.elected
if membership.party_list_position is not None:
- candidacy[
- "party_list_position"
- ] = membership.party_list_position
+ candidacy["party_list_position"] = (
+ membership.party_list_position
+ )
if ballot.is_welsh_run:
ec_ids = membership.previous_party_affiliations.values_list(
"ec_id", flat=True
diff --git a/ynr/apps/candidates/tests/test_models.py b/ynr/apps/candidates/tests/test_models.py
index 8cae0618a6..6ead96e60a 100644
--- a/ynr/apps/candidates/tests/test_models.py
+++ b/ynr/apps/candidates/tests/test_models.py
@@ -220,7 +220,7 @@ def test_is_welsh_run_false(self):
"gla.",
"ref.",
# TODO confirm if these could be welsh run?
- "pcc." "mayor.",
+ "pcc.mayor.",
# TODO check this one
"naw.",
]
diff --git a/ynr/apps/candidates/tests/test_update_view.py b/ynr/apps/candidates/tests/test_update_view.py
index a973977bcb..6781910146 100644
--- a/ynr/apps/candidates/tests/test_update_view.py
+++ b/ynr/apps/candidates/tests/test_update_view.py
@@ -59,9 +59,9 @@ def test_update_person_submission(self):
"/person/2009/update", user=self.user_who_can_lock
)
form = response.forms["person-details"]
- form[
- "tmp_person_identifiers-0-value"
- ] = "http://en.wikipedia.org/wiki/Tessa_Jowell"
+ form["tmp_person_identifiers-0-value"] = (
+ "http://en.wikipedia.org/wiki/Tessa_Jowell"
+ )
form["tmp_person_identifiers-0-value_type"] = "wikipedia_url"
form["memberships-0-party_identifier_1"] = self.labour_party.ec_id
@@ -146,9 +146,9 @@ def test_update_person_add_new_candidacy(self):
# happen with the Javascript addition of a new candidacy.
form = response.forms["person-details"]
form["memberships-1-party_identifier_1"] = self.labour_party.ec_id
- form[
- "memberships-1-ballot_paper_id"
- ] = self.local_ballot.ballot_paper_id
+ form["memberships-1-ballot_paper_id"] = (
+ self.local_ballot.ballot_paper_id
+ )
form["source"] = "testing adding new candidacy"
response = form.submit()
diff --git a/ynr/apps/candidates/views/help.py b/ynr/apps/candidates/views/help.py
index f7560bb749..e960bbe513 100644
--- a/ynr/apps/candidates/views/help.py
+++ b/ynr/apps/candidates/views/help.py
@@ -30,8 +30,8 @@ def get_context_data(self, **kwargs):
for role_data in elections:
for election_dict in role_data["elections"]:
election = election_dict["election"]
- election_dict[
- "results_file_exists"
- ] = self.results_file_exists(election.slug)
+ election_dict["results_file_exists"] = (
+ self.results_file_exists(election.slug)
+ )
return context
diff --git a/ynr/apps/candidates/views/users.py b/ynr/apps/candidates/views/users.py
index fff041d951..7c05db2e70 100644
--- a/ynr/apps/candidates/views/users.py
+++ b/ynr/apps/candidates/views/users.py
@@ -41,9 +41,9 @@ class LeaderboardView(ContributorsMixin, TemplateView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["leaderboards"] = self.get_leaderboards()
- context[
- "num_new_users_since_date"
- ] = self.get_num_new_users_since_date()
+ context["num_new_users_since_date"] = (
+ self.get_num_new_users_since_date()
+ )
return context
@@ -52,9 +52,9 @@ class UserContributions(View):
def get(self, request, *args, **kwargs):
response = HttpResponse(content_type="text/csv")
- response[
- "Content-Disposition"
- ] = 'attachment; filename="contributions.csv"'
+ response["Content-Disposition"] = (
+ 'attachment; filename="contributions.csv"'
+ )
headers = ["rank", "username", "contributions"]
writer = csv.DictWriter(response, fieldnames=headers)
writer.writerow({k: k for k in headers})
diff --git a/ynr/apps/data_exports/filters.py b/ynr/apps/data_exports/filters.py
index 599c7c57ff..07a0cb4dd1 100644
--- a/ynr/apps/data_exports/filters.py
+++ b/ynr/apps/data_exports/filters.py
@@ -179,8 +179,7 @@ def create_materialized_membership_filter(
:return:
"""
- class DynamicMaterializedMembershipFilter(MaterializedMembershipFilter):
- ...
+ class DynamicMaterializedMembershipFilter(MaterializedMembershipFilter): ...
for field_name, field in fields:
if not field.dynamic_filter:
diff --git a/ynr/apps/data_exports/views.py b/ynr/apps/data_exports/views.py
index e28b5b2782..3755a18947 100644
--- a/ynr/apps/data_exports/views.py
+++ b/ynr/apps/data_exports/views.py
@@ -140,9 +140,9 @@ class DataShortcutView(TemplateView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Get loads of recent elections for this page
- context[
- "charismatic_elections"
- ] = ElectionReport.objects.all().order_by("-election_date")
+ context["charismatic_elections"] = (
+ ElectionReport.objects.all().order_by("-election_date")
+ )
context["special_reports"] = [
{
"only_by_elections": True,
diff --git a/ynr/apps/elections/tests/test_ballot_lock.py b/ynr/apps/elections/tests/test_ballot_lock.py
index e466456e5e..48917730d5 100644
--- a/ynr/apps/elections/tests/test_ballot_lock.py
+++ b/ynr/apps/elections/tests/test_ballot_lock.py
@@ -256,9 +256,9 @@ def test_add_when_unlocked_allowed(self):
form = response.forms["new-candidate-form"]
form["name"] = "Imaginary Candidate"
form["party_identifier_1"] = self.green_party.ec_id
- form[
- "source"
- ] = "Testing adding a new candidate to a locked constituency"
+ form["source"] = (
+ "Testing adding a new candidate to a locked constituency"
+ )
submission_response = form.submit()
self.assertEqual(submission_response.status_code, 302)
# Find the person this should have redirected to:
@@ -279,9 +279,9 @@ def test_move_into_locked_privileged_allowed(self):
form["memberships-0-ballot_paper_id"].value,
self.dulwich_post_ballot.ballot_paper_id,
)
- form[
- "memberships-0-ballot_paper_id"
- ] = self.camberwell_post_ballot.ballot_paper_id
+ form["memberships-0-ballot_paper_id"] = (
+ self.camberwell_post_ballot.ballot_paper_id
+ )
submission_response = form.submit()
self.assertEqual(
submission_response.context["memberships_formset"].errors,
diff --git a/ynr/apps/elections/uk/management/commands/uk_create_elections_from_every_election.py b/ynr/apps/elections/uk/management/commands/uk_create_elections_from_every_election.py
index a83c30d933..db47e116a6 100644
--- a/ynr/apps/elections/uk/management/commands/uk_create_elections_from_every_election.py
+++ b/ynr/apps/elections/uk/management/commands/uk_create_elections_from_every_election.py
@@ -135,9 +135,9 @@ def check_local_current_against_remote(self):
local_current_ballots = Ballot.objects.filter(
election__current=True
).count()
- assert (
- ee_current_ballots == local_current_ballots
- ), f"Local and EE current ballots don't match EE: {ee_current_ballots} Local: {local_current_ballots}"
+ assert ee_current_ballots == local_current_ballots, (
+ f"Local and EE current ballots don't match EE: {ee_current_ballots} Local: {local_current_ballots}"
+ )
def delete_deleted_elections(self, recently_updated_timestamp):
# Get all deleted elections from EE
diff --git a/ynr/apps/elections/uk/templatetags/home_page_tags.py b/ynr/apps/elections/uk/templatetags/home_page_tags.py
index 324c18b4a2..b6b4b7b2a9 100644
--- a/ynr/apps/elections/uk/templatetags/home_page_tags.py
+++ b/ynr/apps/elections/uk/templatetags/home_page_tags.py
@@ -204,12 +204,12 @@ def results_progress(context):
output_field=TextField(),
)
- context[
- "results_progress_by_election_type"
- ] = results_progress_by_value(
- ballot_qs.annotate(election_type=election_type),
- lookup_value="election_type",
- label_field="election__for_post_role",
+ context["results_progress_by_election_type"] = (
+ results_progress_by_value(
+ ballot_qs.annotate(election_type=election_type),
+ lookup_value="election_type",
+ label_field="election__for_post_role",
+ )
)
shortcuts = filter_shortcuts(context["request"])["list"]
diff --git a/ynr/apps/elections/views.py b/ynr/apps/elections/views.py
index a4a23eb825..7a9ee8b1bf 100644
--- a/ynr/apps/elections/views.py
+++ b/ynr/apps/elections/views.py
@@ -242,11 +242,11 @@ def get_authenticated_user_context(self, ballot, context):
# Lock Suggestions
if ballot.has_lock_suggestion:
- context[
- "current_user_suggested_lock"
- ] = ballot.suggestedpostlock_set.filter(
- user=self.request.user
- ).exists()
+ context["current_user_suggested_lock"] = (
+ ballot.suggestedpostlock_set.filter(
+ user=self.request.user
+ ).exists()
+ )
else:
context["suggest_lock_form"] = SuggestedPostLockForm(ballot=ballot)
@@ -264,20 +264,20 @@ def get_authenticated_user_context(self, ballot, context):
context["identifiers_formset"] = PersonIdentifierFormsetFactory()
# Previous candidate suggestions
- context["previous_ballot"] = (
- previous_ballot
- ) = Ballot.objects.get_previous_ballot_for_post(ballot)
+ context["previous_ballot"] = previous_ballot = (
+ Ballot.objects.get_previous_ballot_for_post(ballot)
+ )
if previous_ballot and not ballot.polls_closed:
- context[
- "people_not_standing"
- ] = ballot.people_not_standing_again(previous_ballot)
-
- context[
- "candidates_might_stand_again"
- ] = Membership.objects.memberships_for_ballot(
- previous_ballot,
- exclude_memberships_qs=context["candidates"],
- exclude_people_qs=context["people_not_standing"],
+ context["people_not_standing"] = (
+ ballot.people_not_standing_again(previous_ballot)
+ )
+
+ context["candidates_might_stand_again"] = (
+ Membership.objects.memberships_for_ballot(
+ previous_ballot,
+ exclude_memberships_qs=context["candidates"],
+ exclude_people_qs=context["people_not_standing"],
+ )
)
context["logged_actions"] = (
@@ -558,7 +558,7 @@ def get(self, request, *args, **kwargs):
attrs_str = " ".join(
[f"{k}='{v}'" for k, v in option_attrs.items()]
)
- data.append(f"")
+ data.append(f"")
data.append("")
# empty option needs to be included for select2 to display a placeholder
# see https://select2.org/placeholders#single-select-placeholders
diff --git a/ynr/apps/moderation_queue/tests/test_queue.py b/ynr/apps/moderation_queue/tests/test_queue.py
index 752e869305..b89806d828 100644
--- a/ynr/apps/moderation_queue/tests/test_queue.py
+++ b/ynr/apps/moderation_queue/tests/test_queue.py
@@ -275,9 +275,9 @@ def test_photo_review_upload_rejected_privileged(self, mock_send_mail):
)
form = review_page_response.forms["photo-review-form"]
form["decision"] = "rejected"
- form[
- "rejection_reason"
- ] = "There's no clear source or copyright statement"
+ form["rejection_reason"] = (
+ "There's no clear source or copyright statement"
+ )
response = form.submit(user=self.test_reviewer)
self.assertEqual(response.status_code, 302)
split_location = urlsplit(response.location)
diff --git a/ynr/apps/moderation_queue/views.py b/ynr/apps/moderation_queue/views.py
index 09cd792763..550291fced 100644
--- a/ynr/apps/moderation_queue/views.py
+++ b/ynr/apps/moderation_queue/views.py
@@ -257,10 +257,10 @@ def get_context_data(self, **kwargs):
context["google_image_search_url"] = self.get_google_image_search_url(
person
)
- context[
- "google_reverse_image_search_url"
- ] = self.get_google_reverse_image_search_url(
- self.queued_image.image.url
+ context["google_reverse_image_search_url"] = (
+ self.get_google_reverse_image_search_url(
+ self.queued_image.image.url
+ )
)
context["person"] = person
return context
diff --git a/ynr/apps/official_documents/tests/test_page_splitter.py b/ynr/apps/official_documents/tests/test_page_splitter.py
index da910792d5..3f3729aeb9 100644
--- a/ynr/apps/official_documents/tests/test_page_splitter.py
+++ b/ynr/apps/official_documents/tests/test_page_splitter.py
@@ -65,11 +65,14 @@ def test_raises_pdf_read_error_for_non_pdf(self):
def test_dependency_error_raises_pdf_processing_error(self):
ballot_to_pages = {"ballot1": [0]}
splitter = ElectionSOPNPageSplitter(self.election_sopn, ballot_to_pages)
- with patch.object(
- PdfWriter,
- "add_page",
- side_effect=DependencyError("missing dependency"),
- ), self.assertRaises(PDFProcessingError):
+ with (
+ patch.object(
+ PdfWriter,
+ "add_page",
+ side_effect=DependencyError("missing dependency"),
+ ),
+ self.assertRaises(PDFProcessingError),
+ ):
splitter.split()
def test_split_pages(self):
diff --git a/ynr/apps/parties/forms.py b/ynr/apps/parties/forms.py
index 0185d1cd9a..04abb9b078 100644
--- a/ynr/apps/parties/forms.py
+++ b/ynr/apps/parties/forms.py
@@ -39,9 +39,7 @@ def party_and_description_dict_from_string(value):
)
return ret
except Party.DoesNotExist:
- raise ValidationError(
- f"'{value}' is not a current party " f"identifier"
- )
+ raise ValidationError(f"'{value}' is not a current party identifier")
class PartyIdentifierInput(forms.CharField):
diff --git a/ynr/apps/parties/models.py b/ynr/apps/parties/models.py
index 9672ed3ea7..ef7694bd9e 100644
--- a/ynr/apps/parties/models.py
+++ b/ynr/apps/parties/models.py
@@ -133,10 +133,10 @@ def as_slack_attachment(self):
"fallback": "{} {}".format(self.name, url),
}
if self.default_emblem:
- attachment[
- "image_url"
- ] = "http://search.electoralcommission.org.uk/Api/Registrations/Emblems/{}".format(
- self.default_emblem.ec_emblem_id
+ attachment["image_url"] = (
+ "http://search.electoralcommission.org.uk/Api/Registrations/Emblems/{}".format(
+ self.default_emblem.ec_emblem_id
+ )
)
if self.descriptions.exists():
attachment["fields"] = [
diff --git a/ynr/apps/parties/tests/test_importer.py b/ynr/apps/parties/tests/test_importer.py
index 80f4c4d178..38335f67e2 100644
--- a/ynr/apps/parties/tests/test_importer.py
+++ b/ynr/apps/parties/tests/test_importer.py
@@ -308,7 +308,7 @@ def test_bilingual_description_marked_inactive(self, FakeEmblemPath):
However, there are existing candidacies with FKs out to the old
bilingual ones. They should be kept around and marked inactive.
"""
- bilingual_description = f'{FAKE_PARTY_DICT["PartyDescriptions"][0]["Description"]} | {FAKE_PARTY_DICT["PartyDescriptions"][0]["Translation"]}'
+ bilingual_description = f"{FAKE_PARTY_DICT['PartyDescriptions'][0]['Description']} | {FAKE_PARTY_DICT['PartyDescriptions'][0]['Translation']}"
FakeEmblemPath.return_value = make_tmp_file_from_source(
EXAMPLE_IMAGE_FILENAME
diff --git a/ynr/apps/parties/tests/test_managers.py b/ynr/apps/parties/tests/test_managers.py
index 751d1d9cf5..7f76927270 100644
--- a/ynr/apps/parties/tests/test_managers.py
+++ b/ynr/apps/parties/tests/test_managers.py
@@ -2,6 +2,7 @@
Test some of the basic model use cases
"""
+
from collections import namedtuple
from django.test import TestCase
diff --git a/ynr/apps/parties/tests/test_models.py b/ynr/apps/parties/tests/test_models.py
index 5fac442cc4..61ef3999ae 100644
--- a/ynr/apps/parties/tests/test_models.py
+++ b/ynr/apps/parties/tests/test_models.py
@@ -2,6 +2,7 @@
Test some of the basic model use cases
"""
+
from candidates.tests.helpers import TmpMediaRootMixin
from django.conf import settings
from django.core.files.storage import DefaultStorage
diff --git a/ynr/apps/people/forms/forms.py b/ynr/apps/people/forms/forms.py
index e4631c296b..8de4a3f878 100644
--- a/ynr/apps/people/forms/forms.py
+++ b/ynr/apps/people/forms/forms.py
@@ -110,9 +110,9 @@ def clean(self):
if self.cleaned_data.get("value_type") in self.HTTP_IDENTIFIERS:
# Add https schema if missing
if not self.cleaned_data.get("value").startswith("http"):
- self.cleaned_data[
- "value"
- ] = f"https://{self.cleaned_data['value']}"
+ self.cleaned_data["value"] = (
+ f"https://{self.cleaned_data['value']}"
+ )
URLValidator()(value=self.cleaned_data["value"])
if (
"value_type" in self.cleaned_data
@@ -206,7 +206,7 @@ def save(self, commit=True):
class PersonMembershipForm(PopulatePartiesMixin, forms.ModelForm):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user", None)
- instance: Membership = kwargs.get("instance", None)
+ instance: Membership = kwargs.get("instance")
person: Person = kwargs.pop("person", None)
if instance:
if instance.party_description:
@@ -233,9 +233,9 @@ def __init__(self, *args, **kwargs):
)
if self.show_previous_party_affiliations:
- self.fields[
- "previous_party_affiliations"
- ] = PreviousPartyAffiliationsField(membership=self.instance)
+ self.fields["previous_party_affiliations"] = (
+ PreviousPartyAffiliationsField(membership=self.instance)
+ )
@property
def show_previous_party_affiliations(self):
@@ -504,7 +504,7 @@ class Meta:
def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user", None)
- instance: Membership = kwargs.get("instance", None)
+ instance: Membership = kwargs.get("instance")
if instance:
initial = {}
if hasattr(instance.ballot, "sopn"):
diff --git a/ynr/apps/people/migrations/0013_populate_favourite_biscuit.py b/ynr/apps/people/migrations/0013_populate_favourite_biscuit.py
index aecf1a5a04..a0a68e926b 100644
--- a/ynr/apps/people/migrations/0013_populate_favourite_biscuit.py
+++ b/ynr/apps/people/migrations/0013_populate_favourite_biscuit.py
@@ -26,8 +26,7 @@ def populate_favourite_biscuit_from_extrafieldvalue(apps, schema_editor):
if too_long.exists():
msg = [
- "Value is too long for the following people. "
- "Please manually fix:"
+ "Value is too long for the following people. Please manually fix:"
]
for value_field in too_long:
msg.append(str(value_field.person.pk))
diff --git a/ynr/apps/people/tests/test_merge_view.py b/ynr/apps/people/tests/test_merge_view.py
index fb75d940e5..7f4a2223a4 100644
--- a/ynr/apps/people/tests/test_merge_view.py
+++ b/ynr/apps/people/tests/test_merge_view.py
@@ -626,9 +626,9 @@ def setUp(self):
form["name"] = "Elizabeth Bennet"
form["tmp_person_identifiers-0-value"] = "lizzie@example.com"
form["tmp_person_identifiers-0-value_type"] = "email"
- form[
- "tmp_person_identifiers-1-value"
- ] = "http://en.wikipedia.org/wiki/Lizzie_Bennet"
+ form["tmp_person_identifiers-1-value"] = (
+ "http://en.wikipedia.org/wiki/Lizzie_Bennet"
+ )
form["tmp_person_identifiers-1-value_type"] = "wikipedia_url"
form["party_identifier_1"] = self.labour_party.ec_id
@@ -739,9 +739,9 @@ def test_merge_three_people(self):
form = response.forms["new-candidate-form"]
form["name"] = "Foo Bar"
form["party_identifier_1"] = self.labour_party.ec_id
- form[
- "ballot_paper_id"
- ] = self.dulwich_post_ballot_earlier.ballot_paper_id
+ form["ballot_paper_id"] = (
+ self.dulwich_post_ballot_earlier.ballot_paper_id
+ )
form["source"] = "foo bar"
response = form.submit()
diff --git a/ynr/apps/people/tests/test_merging.py b/ynr/apps/people/tests/test_merging.py
index 8ac6f3eec6..25ce82531e 100644
--- a/ynr/apps/people/tests/test_merging.py
+++ b/ynr/apps/people/tests/test_merging.py
@@ -551,9 +551,9 @@ def test_conflicting_standing_in_values_regression(self):
form = response.forms["new-candidate-form"]
form["name"] = "Imaginary Candidate"
form["party_identifier_1"] = self.green_party.ec_id
- form[
- "source"
- ] = "Testing adding a new candidate to a locked constituency"
+ form["source"] = (
+ "Testing adding a new candidate to a locked constituency"
+ )
response = form.submit().follow()
person_1 = response.context["person"]
@@ -562,9 +562,9 @@ def test_conflicting_standing_in_values_regression(self):
form = response.forms["new-candidate-form"]
form["name"] = "Imaginary Candidate"
form["party_identifier_1"] = self.green_party.ec_id
- form[
- "source"
- ] = "Testing adding a new candidate to a locked constituency"
+ form["source"] = (
+ "Testing adding a new candidate to a locked constituency"
+ )
response = form.submit().follow()
person_2 = response.context["person"]
diff --git a/ynr/apps/people/tests/test_new_person_view.py b/ynr/apps/people/tests/test_new_person_view.py
index e8cab1a879..81a1b677cb 100644
--- a/ynr/apps/people/tests/test_new_person_view.py
+++ b/ynr/apps/people/tests/test_new_person_view.py
@@ -33,9 +33,9 @@ def test_new_person_submission(self):
form["name"] = "Elizabeth Bennet"
form["tmp_person_identifiers-0-value"] = "lizzie@example.com"
form["tmp_person_identifiers-0-value_type"] = "email"
- form[
- "tmp_person_identifiers-1-value"
- ] = "http://en.wikipedia.org/wiki/Lizzie_Bennet"
+ form["tmp_person_identifiers-1-value"] = (
+ "http://en.wikipedia.org/wiki/Lizzie_Bennet"
+ )
form["tmp_person_identifiers-1-value_type"] = "wikipedia_url"
form["party_identifier_1"] = self.labour_party.ec_id
diff --git a/ynr/apps/people/tests/test_person_form_identifier_crud.py b/ynr/apps/people/tests/test_person_form_identifier_crud.py
index fc2eeece5a..1b6c7a3dd3 100644
--- a/ynr/apps/people/tests/test_person_form_identifier_crud.py
+++ b/ynr/apps/people/tests/test_person_form_identifier_crud.py
@@ -372,9 +372,9 @@ def test_duplicate_values_raises_form_error(self):
form["tmp_person_identifiers-0-value_type"] = "email"
form["tmp_person_identifiers-0-value"] = "person@example.com"
- form[
- "tmp_person_identifiers-1-value"
- ] = "https://www.facebook.com/example"
+ form["tmp_person_identifiers-1-value"] = (
+ "https://www.facebook.com/example"
+ )
form["tmp_person_identifiers-1-value_type"] = "facebook_page_url"
form["tmp_person_identifiers-2-id"] = pi.pk
diff --git a/ynr/apps/people/tests/test_person_models.py b/ynr/apps/people/tests/test_person_models.py
index 144aa00a6b..da9b352051 100644
--- a/ynr/apps/people/tests/test_person_models.py
+++ b/ynr/apps/people/tests/test_person_models.py
@@ -123,9 +123,9 @@ def test_current_elections_not_standing_then_standing_again(self):
form = response.forms["person-details"]
form["memberships-0-ballot_paper_id"].value = ballot.ballot_paper_id
form["memberships-0-party_identifier_0"].value = self.labour_party.ec_id
- form[
- "source"
- ] = "Test adding a person to a ballot removes them from the not standing list"
+ form["source"] = (
+ "Test adding a person to a ballot removes them from the not standing list"
+ )
form.submit()
# check that the person is no longer marked as not standing in the election
diff --git a/ynr/apps/people/tests/test_revert.py b/ynr/apps/people/tests/test_revert.py
index d1cad5d655..aa3e5030cf 100644
--- a/ynr/apps/people/tests/test_revert.py
+++ b/ynr/apps/people/tests/test_revert.py
@@ -144,9 +144,9 @@ def test_revert_to_earlier_version(
response = self.app.get("/person/2009/update", user=self.user)
revert_form = response.forms["revert-form-5469de7db0cbd155"]
- revert_form[
- "source"
- ] = "Reverting to version 5469de7db0cbd155 for testing purposes"
+ revert_form["source"] = (
+ "Reverting to version 5469de7db0cbd155 for testing purposes"
+ )
response = revert_form.submit()
self.assertEqual(response.status_code, 302)
self.assertEqual(response.location, "/person/2009")
@@ -255,9 +255,9 @@ def test_revert_to_earlier_version_with_results(
response = self.app.get("/person/2009/update", user=self.user)
revert_form = response.forms["revert-form-5469de7db0cbd155"]
- revert_form[
- "source"
- ] = "Reverting to version 5469de7db0cbd155 for testing purposes"
+ revert_form["source"] = (
+ "Reverting to version 5469de7db0cbd155 for testing purposes"
+ )
response = revert_form.submit()
self.assertEqual(response.status_code, 302)
self.assertEqual(response.location, "/person/2009")
@@ -288,9 +288,9 @@ def test_revert_with_memberships(self):
response = self.app.get(person.get_edit_url(), user=self.user)
revert_form = response.forms["revert-form-5469de7db0cbd155"]
- revert_form[
- "source"
- ] = "Reverting to version 5469de7db0cbd155 for testing purposes"
+ revert_form["source"] = (
+ "Reverting to version 5469de7db0cbd155 for testing purposes"
+ )
response = revert_form.submit()
def test_revert_with_memberships_previous_party_affiliations(self):
diff --git a/ynr/apps/popolo/tests/test_models.py b/ynr/apps/popolo/tests/test_models.py
index b30f7b7575..db64676d81 100644
--- a/ynr/apps/popolo/tests/test_models.py
+++ b/ynr/apps/popolo/tests/test_models.py
@@ -82,9 +82,12 @@ def test_is_welsh_run_ballot(self):
Membership.is_welsh_run_ballot returns the same
"""
for case in [True, False]:
- with self.subTest(msg=case), patch.object(
- Ballot, "is_welsh_run", new_callable=PropertyMock
- ) as mock:
+ with (
+ self.subTest(msg=case),
+ patch.object(
+ Ballot, "is_welsh_run", new_callable=PropertyMock
+ ) as mock,
+ ):
mock.return_value = case
membership = Membership(ballot=Ballot())
assert membership.is_welsh_run_ballot is case
diff --git a/ynr/apps/resultsbot/helpers.py b/ynr/apps/resultsbot/helpers.py
index 1939b7e7ef..1eccd611b5 100644
--- a/ynr/apps/resultsbot/helpers.py
+++ b/ynr/apps/resultsbot/helpers.py
@@ -54,9 +54,9 @@ def _mark_candidates_as_winner(self, instance):
edit_type=EditType.BOT.name,
)
else:
- change_metadata[
- "information_source"
- ] = 'Setting as "not elected" by implication'
+ change_metadata["information_source"] = (
+ 'Setting as "not elected" by implication'
+ )
membership.person.record_version(change_metadata)
membership.person.save()
@@ -74,9 +74,9 @@ def add_results(self, division=None, candidate_list=None, source=None):
}
# Only include num_turnout_reported if it was reported in Modgov
if division.numballotpapersissued > 0:
- defaults[
- "num_turnout_reported"
- ] = division.numballotpapersissued
+ defaults["num_turnout_reported"] = (
+ division.numballotpapersissued
+ )
# Same for total electorate
if division.electorate > 0:
defaults["total_electorate"] = division.electorate
diff --git a/ynr/apps/search/tests/test_search.py b/ynr/apps/search/tests/test_search.py
index e76874fec6..5cebd0c3e3 100644
--- a/ynr/apps/search/tests/test_search.py
+++ b/ynr/apps/search/tests/test_search.py
@@ -140,7 +140,7 @@ def test_backtick_regression(self):
PersonFactory(name="Henry Jekyll")
self.assertTrue(
search_person_by_name(
- "` ' £$$^* ($ £% Henry " "Jekyll \t"
+ "` ' £$$^* ($ £% Henry Jekyll \t"
).exists()
)
diff --git a/ynr/apps/sopn_parsing/helpers/convert_pdf.py b/ynr/apps/sopn_parsing/helpers/convert_pdf.py
index f83d65efa9..389a25bade 100644
--- a/ynr/apps/sopn_parsing/helpers/convert_pdf.py
+++ b/ynr/apps/sopn_parsing/helpers/convert_pdf.py
@@ -14,9 +14,10 @@ def convert_docx_to_pdf(uploaded_file: ContentFile):
Takes a File-like docx object, attempts to convert it to a PDF, and returns the
new file.
"""
- with tempfile.NamedTemporaryFile(
- suffix=".docx"
- ) as in_file, tempfile.NamedTemporaryFile(suffix=".pdf") as out_file:
+ with (
+ tempfile.NamedTemporaryFile(suffix=".docx") as in_file,
+ tempfile.NamedTemporaryFile(suffix=".pdf") as out_file,
+ ):
# convert the docx and save to a temp file
with open(in_file.name, "wb") as f:
uploaded_file.seek(0)
diff --git a/ynr/apps/sopn_parsing/helpers/parse_tables.py b/ynr/apps/sopn_parsing/helpers/parse_tables.py
index edcc61dc38..8d6540bfba 100644
--- a/ynr/apps/sopn_parsing/helpers/parse_tables.py
+++ b/ynr/apps/sopn_parsing/helpers/parse_tables.py
@@ -486,9 +486,11 @@ def parse_dataframe(ballot: Ballot, df: DataFrame):
df.reset_index(drop=True, inplace=True)
polling_station_index = df[
df.apply(
- lambda row: row.astype(str)
- .str.contains("polling station", case=False)
- .any(),
+ lambda row: (
+ row.astype(str)
+ .str.contains("polling station", case=False)
+ .any()
+ ),
axis=1,
)
].index
diff --git a/ynr/apps/sopn_parsing/management/commands/sopn_parsing_parse_tables.py b/ynr/apps/sopn_parsing/management/commands/sopn_parsing_parse_tables.py
index 26448b697f..742327fb82 100644
--- a/ynr/apps/sopn_parsing/management/commands/sopn_parsing_parse_tables.py
+++ b/ynr/apps/sopn_parsing/management/commands/sopn_parsing_parse_tables.py
@@ -31,9 +31,9 @@ def build_filter_kwargs(self, options):
return filter_kwargs
if options.get("reparse"):
- filter_kwargs[
- "rawpeople__source_type"
- ] = RawPeople.SOURCE_PARSED_PDF
+ filter_kwargs["rawpeople__source_type"] = (
+ RawPeople.SOURCE_PARSED_PDF
+ )
return filter_kwargs
return filter_kwargs
diff --git a/ynr/apps/sopn_parsing/tests/test_parse_textract_results.py b/ynr/apps/sopn_parsing/tests/test_parse_textract_results.py
index 1e0e1bc651..0f2321eb65 100644
--- a/ynr/apps/sopn_parsing/tests/test_parse_textract_results.py
+++ b/ynr/apps/sopn_parsing/tests/test_parse_textract_results.py
@@ -1,6 +1,7 @@
"""
Tests for the code that converts a raw Textract result into a pandas data frame for parsing.
"""
+
from pathlib import Path
from candidates.tests.uk_examples import UK2015ExamplesMixin
diff --git a/ynr/apps/twitterbot/tests/test_twitter_queue_images_command.py b/ynr/apps/twitterbot/tests/test_twitter_queue_images_command.py
index f2e33a7b93..0fd77b94ec 100644
--- a/ynr/apps/twitterbot/tests/test_twitter_queue_images_command.py
+++ b/ynr/apps/twitterbot/tests/test_twitter_queue_images_command.py
@@ -167,8 +167,7 @@ def test_command_output(self, mock_twitter_data, mock_requests):
" That person already had an image in the queue, so skipping.",
"Considering adding a photo for Person With An Existing "
"Image But None In The Queue with Twitter user ID: 1006",
- " Adding that person's Twitter avatar to the moderation "
- "queue",
+ " Adding that person's Twitter avatar to the moderation queue",
"Considering adding a photo for Person With Only Rejected "
"Images In The Queue with Twitter user ID: 1003",
" That person already had an image in the queue, so skipping.",
diff --git a/ynr/apps/uk_results/views/base_views.py b/ynr/apps/uk_results/views/base_views.py
index 346fffeebb..01be41718c 100644
--- a/ynr/apps/uk_results/views/base_views.py
+++ b/ynr/apps/uk_results/views/base_views.py
@@ -17,9 +17,9 @@ def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
elections_list = reverse("election_list_view")
- context[
- "elections_without_results_url"
- ] = f"{elections_list}?has_results=0&is_cancelled=0"
+ context["elections_without_results_url"] = (
+ f"{elections_list}?has_results=0&is_cancelled=0"
+ )
return context
def test_func(self, user):
diff --git a/ynr/apps/wombles/management/commands/wombles_make_email_list_for_candidates.py b/ynr/apps/wombles/management/commands/wombles_make_email_list_for_candidates.py
index 70962311b5..d124fecc56 100644
--- a/ynr/apps/wombles/management/commands/wombles_make_email_list_for_candidates.py
+++ b/ynr/apps/wombles/management/commands/wombles_make_email_list_for_candidates.py
@@ -9,8 +9,7 @@
from sesame.utils import get_token
-class NoEmailError(ValueError):
- ...
+class NoEmailError(ValueError): ...
def make_fake_username(email):
diff --git a/ynr/apps/wombles/views.py b/ynr/apps/wombles/views.py
index 168140d5e0..b491bc46cb 100644
--- a/ynr/apps/wombles/views.py
+++ b/ynr/apps/wombles/views.py
@@ -54,9 +54,9 @@ def get_context_data(self, **kwargs):
.order_by("day")
)
- context[
- "edits_over_time"
- ] = self.object.womble_profile.edits_over_time()
+ context["edits_over_time"] = (
+ self.object.womble_profile.edits_over_time()
+ )
return context
@@ -82,9 +82,9 @@ class LoginView(FormView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
- context[
- "new_user_creation_allowed"
- ] = settings.NEW_USER_ACCOUNT_CREATION_ALLOWED
+ context["new_user_creation_allowed"] = (
+ settings.NEW_USER_ACCOUNT_CREATION_ALLOWED
+ )
return context
def make_fake_username(self, email):
diff --git a/ynr/context_processors.py b/ynr/context_processors.py
index 4b7e22d7b3..2d8bcfd2d3 100644
--- a/ynr/context_processors.py
+++ b/ynr/context_processors.py
@@ -66,9 +66,9 @@ def add_notification_data(request):
.count()
)
if TRUSTED_TO_MERGE_GROUP_NAME in groups:
- result[
- "duplicate_suggestions"
- ] = DuplicateSuggestion.objects.open().count()
+ result["duplicate_suggestions"] = (
+ DuplicateSuggestion.objects.open().count()
+ )
if TRUSTED_TO_EDIT_NAME in groups:
result["person_name_edits"] = OtherName.objects.filter(
needs_review=True
diff --git a/ynr/wsgi.py b/ynr/wsgi.py
index 254a49e814..158bb1d0f7 100644
--- a/ynr/wsgi.py
+++ b/ynr/wsgi.py
@@ -13,6 +13,7 @@
framework.
"""
+
import os
from os.path import abspath, dirname
from sys import path