From a3b6114d87e02fe3c865eae4cac53d90582ded73 Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Wed, 29 Nov 2023 09:48:12 +0800 Subject: [PATCH 01/20] Add deviceid prefix to loggedpoint outputs. --- tracking/views.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tracking/views.py b/tracking/views.py index 646cdfb..1be2f3b 100644 --- a/tracking/views.py +++ b/tracking/views.py @@ -129,6 +129,11 @@ def dispatch(self, *args, **kwargs): return HttpResponseBadRequest("Missing device_id") return super().dispatch(*args, **kwargs) + def get_filename_prefix(self): + device_id = self.kwargs["device_id"] + device = Device.objects.get(pk=device_id) + return f"{device.deviceid}_loggedpoint" + def get_queryset(self): qs = super().get_queryset() From 66a98269cacc4a2ea098c0268543359be3db4f56 Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Fri, 1 Dec 2023 09:03:22 +0800 Subject: [PATCH 02/20] Bump sentry-sdk version, update settings. --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- resource_tracking/settings.py | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index 335651b..ff74975 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1128,13 +1128,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "sentry-sdk" -version = "1.32.0" +version = "1.38.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.32.0.tar.gz", hash = "sha256:935e8fbd7787a3702457393b74b13d89a5afb67185bc0af85c00cb27cbd42e7c"}, - {file = "sentry_sdk-1.32.0-py2.py3-none-any.whl", hash = "sha256:eeb0b3550536f3bbc05bb1c7e0feb3a78d74acb43b607159a606ed2ec0a33a4d"}, + {file = "sentry-sdk-1.38.0.tar.gz", hash = "sha256:8feab81de6bbf64f53279b085bd3820e3e737403b0a0d9317f73a2c3374ae359"}, + {file = "sentry_sdk-1.38.0-py2.py3-none-any.whl", hash = "sha256:0017fa73b8ae2d4e57fd2522ee3df30453715b29d2692142793ec5d5f90b94a6"}, ] [package.dependencies] @@ -1348,4 +1348,4 @@ brotli = ["Brotli"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "d4e9da0187fbee17d49950745e55f920e035a7ae3558f5af1480413593404e57" +content-hash = "9f25af0f8a7bc8bbb007153702ea10d171f9bbc3be913c39ac203cb177621fa9" diff --git a/pyproject.toml b/pyproject.toml index 730d98a..f49de7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ django-geojson = "4.0.0" unicodecsv = "0.14.1" whitenoise = {version = "6.5.0", extras = ["brotli"]} azure-storage-blob = "12.17.0" -sentry-sdk = {version = "1.32.0", extras = ["django"]} +sentry-sdk = {version = "1.38.0", extras = ["django"]} tomli = "2.0.1" [tool.poetry.group.dev.dependencies] diff --git a/resource_tracking/settings.py b/resource_tracking/settings.py index 76a9c20..eb2dd13 100644 --- a/resource_tracking/settings.py +++ b/resource_tracking/settings.py @@ -149,16 +149,16 @@ # Sentry settings SENTRY_DSN = env('SENTRY_DSN', None) -SENTRY_SAMPLE_RATE = env('SENTRY_SAMPLE_RATE', 0.0) # 0.0 - 1.0 +SENTRY_SAMPLE_RATE = env('SENTRY_SAMPLE_RATE', 1.0) # Error sampling rate +SENTRY_TRANSACTION_SAMPLE_RATE = env('SENTRY_TRANSACTION_SAMPLE_RATE', 0.0) # Transaction sampling SENTRY_ENVIRONMENT = env('SENTRY_ENVIRONMENT', None) if SENTRY_DSN and SENTRY_ENVIRONMENT: import sentry_sdk - import tomli - project = tomli.load(open(os.path.join(BASE_DIR, "pyproject.toml"), "rb")) sentry_sdk.init( dsn=SENTRY_DSN, - traces_sample_rate=SENTRY_SAMPLE_RATE, + sample_rate=SENTRY_SAMPLE_RATE, + traces_sample_rate=SENTRY_TRANSACTION_SAMPLE_RATE, environment=SENTRY_ENVIRONMENT, - release=project["tool"]["poetry"]["version"], + release=APPLICATION_VERSION_NO, ) From 4c0d0d9c927b4541a667072030c06db06ecf2f5f Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Fri, 1 Dec 2023 09:14:21 +0800 Subject: [PATCH 03/20] Added Sentry env vars to deployment_patch.yaml --- kustomize/overlays/prod/deployment_patch.yaml | 12 ++++++++++++ kustomize/overlays/uat/deployment_patch.yaml | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/kustomize/overlays/prod/deployment_patch.yaml b/kustomize/overlays/prod/deployment_patch.yaml index 57ba85c..31f41e9 100644 --- a/kustomize/overlays/prod/deployment_patch.yaml +++ b/kustomize/overlays/prod/deployment_patch.yaml @@ -77,3 +77,15 @@ spec: secretKeyRef: name: resourcetracking-env-prod key: TRACPLUS_URL + - name: SENTRY_DSN + valueFrom: + secretKeyRef: + name: resourcetracking-env-prod + key: SENTRY_DSN + - name: SENTRY_TRANSACTION_SAMPLE_RATE + valueFrom: + secretKeyRef: + name: resourcetracking-env-prod + key: SENTRY_TRANSACTION_SAMPLE_RATE + - name: SENTRY_ENVIRONMENT + value: "prod" diff --git a/kustomize/overlays/uat/deployment_patch.yaml b/kustomize/overlays/uat/deployment_patch.yaml index 5ef05e6..bf76b0d 100644 --- a/kustomize/overlays/uat/deployment_patch.yaml +++ b/kustomize/overlays/uat/deployment_patch.yaml @@ -67,3 +67,15 @@ spec: secretKeyRef: name: resourcetracking-env-uat key: TRACPLUS_URL + - name: SENTRY_DSN + valueFrom: + secretKeyRef: + name: resourcetracking-env-uat + key: SENTRY_DSN + - name: SENTRY_TRANSACTION_SAMPLE_RATE + valueFrom: + secretKeyRef: + name: resourcetracking-env-uat + key: SENTRY_TRANSACTION_SAMPLE_RATE + - name: SENTRY_ENVIRONMENT + value: "uat" From b05cbaed559b940982ff8187a795aa1725fbdb51 Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Fri, 1 Dec 2023 09:28:18 +0800 Subject: [PATCH 04/20] Update settings to derive app version. --- resource_tracking/settings.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resource_tracking/settings.py b/resource_tracking/settings.py index eb2dd13..ac79f75 100644 --- a/resource_tracking/settings.py +++ b/resource_tracking/settings.py @@ -4,12 +4,15 @@ from datetime import timedelta from pathlib import Path import sys +import tomli # Project paths # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = str(Path(__file__).resolve().parents[1]) # Application definition +project = tomli.load(open(os.path.join(BASE_DIR, "pyproject.toml"), "rb")) +APPLICATION_VERSION_NO = project["tool"]["poetry"]["version"] DEBUG = env('DEBUG', False) SECRET_KEY = env('SECRET_KEY', 'PlaceholderSecretKey') CSRF_COOKIE_SECURE = env('CSRF_COOKIE_SECURE', False) From 7d8627e0623f0a1ad5061e8f24f6acded1b2c87e Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Fri, 1 Dec 2023 11:42:34 +0800 Subject: [PATCH 05/20] Bugfix: devices.csv days parameter cast to int. --- tracking/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracking/views.py b/tracking/views.py index 1be2f3b..06c65a1 100644 --- a/tracking/views.py +++ b/tracking/views.py @@ -108,7 +108,7 @@ def get_queryset(self): qs = super().get_queryset() if "days" in self.request.GET and self.request.GET["days"]: - days = self.request.GET["days"] + days = int(self.request.GET["days"]) else: days = 14 qs = qs.filter(seen__gte=timezone.now() - timedelta(days=days)) From 510083a1abc9121b7d1e1762d6b260eaf7abd891 Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Tue, 5 Dec 2023 08:14:15 +0800 Subject: [PATCH 06/20] Added dependabot.yml --- .github/dependabot.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..5a9fb03 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 +updates: + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "github-actions" + # Workflow files stored in the + # default location of `.github/workflows` + directory: "/" + schedule: + interval: "weekly" From 44915e8ad1a752441276abb9c98bfc4e3b96a310 Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Tue, 5 Dec 2023 08:14:58 +0800 Subject: [PATCH 07/20] Update dj-database-url. --- poetry.lock | 41 +++++++++++++++++++++-------------------- pyproject.toml | 6 +++--- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/poetry.lock b/poetry.lock index ff74975..7419ee2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -512,17 +512,18 @@ files = [ [[package]] name = "dj-database-url" -version = "1.0.0" +version = "2.1.0" description = "Use Database URLs in your Django Application." optional = false python-versions = "*" files = [ - {file = "dj-database-url-1.0.0.tar.gz", hash = "sha256:ccf3e8718f75ddd147a1e212fca88eecdaa721759ee48e38b485481c77bca3dc"}, - {file = "dj_database_url-1.0.0-py3-none-any.whl", hash = "sha256:cd354a3b7a9136d78d64c17b2aec369e2ae5616fbca6bfbe435ef15bb372ce39"}, + {file = "dj-database-url-2.1.0.tar.gz", hash = "sha256:f2042cefe1086e539c9da39fad5ad7f61173bf79665e69bf7e4de55fa88b135f"}, + {file = "dj_database_url-2.1.0-py3-none-any.whl", hash = "sha256:04bc34b248d4c21aaa13e4ab419ae6575ef5f10f3df735ce7da97722caa356e0"}, ] [package.dependencies] -Django = ">3.2" +Django = ">=3.2" +typing-extensions = ">=3.10.0.0" [[package]] name = "django" @@ -935,24 +936,24 @@ wcwidth = "*" [[package]] name = "psycopg2" -version = "2.9.6" +version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, - {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, - {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, - {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, - {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, - {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, - {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, - {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, - {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, - {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, - {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, - {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, - {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, + {file = "psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, + {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, + {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, + {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, + {file = "psycopg2-2.9.9-cp312-cp312-win32.whl", hash = "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024"}, + {file = "psycopg2-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, + {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, + {file = "psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, + {file = "psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, + {file = "psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, + {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, ] [[package]] @@ -1348,4 +1349,4 @@ brotli = ["Brotli"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "9f25af0f8a7bc8bbb007153702ea10d171f9bbc3be913c39ac203cb177621fa9" +content-hash = "4ec4189f1e7b717896b4ed9fb2e6237bf34accd4c0b7ed58cee36756cc342521" diff --git a/pyproject.toml b/pyproject.toml index f49de7f..56e9b83 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "resource_tracking" -version = "1.4.2" +version = "1.4.3" description = "DBCA internal corporate application to download and serve data from remote tracking devices." authors = ["DBCA OIM "] license = "Apache-2.0" @@ -8,10 +8,10 @@ license = "Apache-2.0" [tool.poetry.dependencies] python = "^3.10" django = "3.2.23" -psycopg2 = "2.9.6" +psycopg2 = "2.9.9" dbca-utils = "1.1.6" python-dotenv = "1.0.0" -dj-database-url = "1.0.0" +dj-database-url = "2.1.0" gunicorn = "21.2.0" django-extensions = "3.2.3" django-tastypie = "0.14.5" From 65db0a7573763218dc94561759ec70ca8092142b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 00:15:46 +0000 Subject: [PATCH 08/20] Bump docker/login-action from 2 to 3 Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/image-build-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-build-scan.yml b/.github/workflows/image-build-scan.yml index fde46be..92b92dc 100644 --- a/.github/workflows/image-build-scan.yml +++ b/.github/workflows/image-build-scan.yml @@ -33,7 +33,7 @@ jobs: uses: docker/setup-buildx-action@v2 - name: Log into registry ${{ env.REGISTRY }} if: github.event_name != 'pull_request' - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} From 9ee4ab954576874bbf9fa80e4e66b62a97ff770a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 00:15:49 +0000 Subject: [PATCH 09/20] Bump docker/setup-qemu-action from 2 to 3 Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/image-build-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-build-scan.yml b/.github/workflows/image-build-scan.yml index fde46be..0ba3646 100644 --- a/.github/workflows/image-build-scan.yml +++ b/.github/workflows/image-build-scan.yml @@ -23,7 +23,7 @@ jobs: security-events: write steps: - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Checkout repository uses: actions/checkout@v3 id: checkout-repo From b60bffebe7b1f699f06b825a28ee5b343a5310f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 00:15:53 +0000 Subject: [PATCH 10/20] Bump docker/setup-buildx-action from 2 to 3 Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/image-build-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-build-scan.yml b/.github/workflows/image-build-scan.yml index fde46be..b2ba916 100644 --- a/.github/workflows/image-build-scan.yml +++ b/.github/workflows/image-build-scan.yml @@ -30,7 +30,7 @@ jobs: with: fetch-depth: 0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Log into registry ${{ env.REGISTRY }} if: github.event_name != 'pull_request' uses: docker/login-action@v2 From c23957499f4ad49819c81a133b78e9ec69c5d5f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 00:15:56 +0000 Subject: [PATCH 11/20] Bump docker/build-push-action from 4 to 5 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4 to 5. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v4...v5) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/image-build-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-build-scan.yml b/.github/workflows/image-build-scan.yml index fde46be..6396bc1 100644 --- a/.github/workflows/image-build-scan.yml +++ b/.github/workflows/image-build-scan.yml @@ -46,7 +46,7 @@ jobs: flavor: | latest=true - name: Build and push Docker image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: . push: ${{ github.event_name != 'pull_request' }} From 3b76853467cacb4fcd149cf71befa2249d87a02b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 00:16:00 +0000 Subject: [PATCH 12/20] Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/image-build-scan.yml | 2 +- .github/workflows/run-tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-build-scan.yml b/.github/workflows/image-build-scan.yml index fde46be..9a1aa8d 100644 --- a/.github/workflows/image-build-scan.yml +++ b/.github/workflows/image-build-scan.yml @@ -25,7 +25,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 id: checkout-repo with: fetch-depth: 0 diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 2ae025e..24ed823 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -37,7 +37,7 @@ jobs: # Checkout repo and set up Python #---------------------------------------------- - name: Check out repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 id: setup-python From 4344b46b702240ebc5df28b1788b530f990e4a26 Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Tue, 5 Dec 2023 11:29:27 +0800 Subject: [PATCH 13/20] Bump dependency versions. --- poetry.lock | 142 ++++++++++++++++++++++--------------------------- pyproject.toml | 4 +- 2 files changed, 67 insertions(+), 79 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7419ee2..f29e27e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,16 +1,5 @@ # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. -[[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -optional = false -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] - [[package]] name = "asgiref" version = "3.7.2" @@ -67,13 +56,13 @@ aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-storage-blob" -version = "12.17.0" +version = "12.19.0" description = "Microsoft Azure Blob Storage Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-storage-blob-12.17.0.zip", hash = "sha256:c14b785a17050b30fc326a315bdae6bc4a078855f4f94a4c303ad74a48dc8c63"}, - {file = "azure_storage_blob-12.17.0-py3-none-any.whl", hash = "sha256:0016e0c549a80282d7b4920c03f2f4ba35c53e6e3c7dbcd2a4a8c8eb3882c1e7"}, + {file = "azure-storage-blob-12.19.0.tar.gz", hash = "sha256:26c0a4320a34a3c2a1b74528ba6812ebcb632a04cd67b1c7377232c4b01a5897"}, + {file = "azure_storage_blob-12.19.0-py3-none-any.whl", hash = "sha256:7bbc2c9c16678f7a420367fef6b172ba8730a7e66df7f4d7a55d5b3c8216615b"}, ] [package.dependencies] @@ -431,34 +420,34 @@ files = [ [[package]] name = "cryptography" -version = "41.0.5" +version = "41.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797"}, - {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5"}, - {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147"}, - {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696"}, - {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da"}, - {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20"}, - {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548"}, - {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d"}, - {file = "cryptography-41.0.5-cp37-abi3-win32.whl", hash = "sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936"}, - {file = "cryptography-41.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81"}, - {file = "cryptography-41.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1"}, - {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72"}, - {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88"}, - {file = "cryptography-41.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf"}, - {file = "cryptography-41.0.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e"}, - {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8"}, - {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179"}, - {file = "cryptography-41.0.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d"}, - {file = "cryptography-41.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1"}, - {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86"}, - {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723"}, - {file = "cryptography-41.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84"}, - {file = "cryptography-41.0.5.tar.gz", hash = "sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, + {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, + {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, + {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, ] [package.dependencies] @@ -579,27 +568,27 @@ field = ["django-leaflet (>=0.12)"] [[package]] name = "django-tastypie" -version = "0.14.5" +version = "0.14.6" description = "A flexible & capable API layer for Django." optional = false python-versions = "*" files = [ - {file = "django-tastypie-0.14.5.tar.gz", hash = "sha256:0f17da085a1583c434dc0fb0ded8dd66c09a512689d0ce705f61629337d5e740"}, + {file = "django-tastypie-0.14.6.tar.gz", hash = "sha256:7f16928ffa5b1b390edd81fa0c15a239cca7fc1134d440ecaa2040b5edc549b8"}, ] [package.dependencies] -python-dateutil = ">=1.5,<2.0 || >2.0" +python-dateutil = ">=2.1" python-mimeparse = ">=0.1.4,<1.5 || >1.5" [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -685,13 +674,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] @@ -712,24 +701,23 @@ tomli = {version = "*", markers = "python_version > \"3.6\" and python_version < [[package]] name = "ipython" -version = "8.17.2" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.9" files = [ - {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, - {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" @@ -875,13 +863,13 @@ files = [ [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -889,13 +877,13 @@ ptyprocess = ">=0.5" [[package]] name = "platformdirs" -version = "3.11.0" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] @@ -994,13 +982,13 @@ files = [ [[package]] name = "pygments" -version = "2.17.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "pygments-2.17.1-py3-none-any.whl", hash = "sha256:1b37f1b1e1bff2af52ecaf28cc601e2ef7077000b227a0675da25aef85784bc4"}, - {file = "pygments-2.17.1.tar.gz", hash = "sha256:e45a0e74bf9c530f564ca81b8952343be986a29f6afe7f5ad95c5f06b7bdf5e8"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] @@ -1175,13 +1163,13 @@ tornado = ["tornado (>=5)"] [[package]] name = "setuptools" -version = "69.0.0" +version = "69.0.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.0-py3-none-any.whl", hash = "sha256:eb03b43f23910c5fd0909cb677ad017cd9531f493d27f8b3f5316ff1fb07390e"}, - {file = "setuptools-69.0.0.tar.gz", hash = "sha256:4c65d4f7891e5b046e9146913b87098144de2ca2128fbc10135b8556a6ddd946"}, + {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, + {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, ] [package.extras] @@ -1248,18 +1236,18 @@ files = [ [[package]] name = "traitlets" -version = "5.13.0" +version = "5.14.0" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, - {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, + {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, + {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typing-extensions" @@ -1300,19 +1288,19 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.6" +version = "20.25.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.6-py3-none-any.whl", hash = "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381"}, - {file = "virtualenv-20.24.6.tar.gz", hash = "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af"}, + {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, + {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<4" +platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] @@ -1320,13 +1308,13 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "wcwidth" -version = "0.2.10" +version = "0.2.12" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.10-py2.py3-none-any.whl", hash = "sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f"}, - {file = "wcwidth-0.2.10.tar.gz", hash = "sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97"}, + {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, + {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, ] [[package]] @@ -1349,4 +1337,4 @@ brotli = ["Brotli"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "4ec4189f1e7b717896b4ed9fb2e6237bf34accd4c0b7ed58cee36756cc342521" +content-hash = "833a8561b1636bd17af55c52794d224678d74bc136fc192c406e19ac57d1675f" diff --git a/pyproject.toml b/pyproject.toml index 56e9b83..905d16a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,11 +14,11 @@ python-dotenv = "1.0.0" dj-database-url = "2.1.0" gunicorn = "21.2.0" django-extensions = "3.2.3" -django-tastypie = "0.14.5" +django-tastypie = "0.14.6" django-geojson = "4.0.0" unicodecsv = "0.14.1" whitenoise = {version = "6.5.0", extras = ["brotli"]} -azure-storage-blob = "12.17.0" +azure-storage-blob = "12.19.0" sentry-sdk = {version = "1.38.0", extras = ["django"]} tomli = "2.0.1" From b6a6e09fd53b9a9cc6d4f50c50c3813e2bfb9b7b Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Tue, 5 Dec 2023 11:29:56 +0800 Subject: [PATCH 14/20] Removed LoggedPointResource class from tracking API. --- resource_tracking/api.py | 3 +-- tracking/api.py | 9 +-------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/resource_tracking/api.py b/resource_tracking/api.py index 11897a7..d7fc616 100644 --- a/resource_tracking/api.py +++ b/resource_tracking/api.py @@ -1,7 +1,6 @@ from tastypie.api import Api -from tracking.api import DeviceResource, LoggedPointResource +from tracking.api import DeviceResource v1_api = Api(api_name='v1') v1_api.register(DeviceResource()) -v1_api.register(LoggedPointResource()) diff --git a/tracking/api.py b/tracking/api.py index 713c568..999efd0 100644 --- a/tracking/api.py +++ b/tracking/api.py @@ -11,7 +11,7 @@ from tastypie.serializers import Serializer import unicodecsv as csv -from tracking.models import Device, LoggedPoint +from tracking.models import Device class CSVSerializer(Serializer): @@ -136,10 +136,3 @@ def build_filters(self, filters=None): age_colour = fields.CharField(attribute='age_colour', readonly=True, null=True) age_text = fields.CharField(attribute='age_text', readonly=True, null=True) icon = fields.CharField(attribute='icon', readonly=True) - - -class LoggedPointResource(APIResource): - device = fields.IntegerField(attribute='device_id', readonly=True) - Meta = generate_meta(LoggedPoint, { - 'cache': HttpCache(settings.HISTORY_HTTP_CACHE_TIMEOUT) - }) From dc7d2489a099a6c49520b9c7ef810994fcea5db0 Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Tue, 5 Dec 2023 11:30:41 +0800 Subject: [PATCH 15/20] Remove basic auth allowance for SpatialDataView. --- tracking/basic_auth.py | 101 ----------------------------------------- tracking/views.py | 6 --- 2 files changed, 107 deletions(-) delete mode 100644 tracking/basic_auth.py diff --git a/tracking/basic_auth.py b/tracking/basic_auth.py deleted file mode 100644 index 2740d0c..0000000 --- a/tracking/basic_auth.py +++ /dev/null @@ -1,101 +0,0 @@ -import base64 -from django.http import HttpResponse -from django.contrib.auth import authenticate - - -def view_or_basicauth(view, request, test_func, realm="", *args, **kwargs): - """ - This is a helper function used by both 'logged_in_or_basicauth' and - 'has_perm_or_basicauth' that does the nitty of determining if they - are already logged in or if they have provided proper http-authorization - and returning the view if all goes well, otherwise responding with a 401. - """ - if test_func(request.user): - # Already logged in, just return the view. - # - return view(request, *args, **kwargs) - - # They are not logged in. See if they provided login credentials - # - if 'HTTP_AUTHORIZATION' in request.META: - auth = request.META['HTTP_AUTHORIZATION'].split() - if len(auth) == 2: - # NOTE: We are only support basic authentication for now. - # - if auth[0].lower() == "basic": - uname, passwd = base64.b64decode(auth[1]).split(':') - user = authenticate(username=uname, password=passwd) - if user is not None: - if user.is_active: - request.user = user - if test_func(request.user): - return view(request, *args, **kwargs) - - # Either they did not provide an authorization header or - # something in the authorization attempt failed. Send a 401 - # back to them to ask them to authenticate. - # - response = HttpResponse() - response.status_code = 401 - response['WWW-Authenticate'] = 'Basic realm="%s"' % realm - return response - - -def logged_in_or_basicauth(realm=""): - """ - A simple decorator that requires a user to be logged in. If they are not - logged in the request is examined for a 'authorization' header. - - If the header is present it is tested for basic authentication and - the user is logged in with the provided credentials. - - If the header is not present a http 401 is sent back to the - requestor to provide credentials. - - The purpose of this is that in several django projects I have needed - several specific views that need to support basic authentication, yet the - web site as a whole used django's provided authentication. - - The uses for this are for urls that are access programmatically such as - by rss feed readers, yet the view requires a user to be logged in. Many rss - readers support supplying the authentication credentials via http basic - auth (and they do NOT support a redirect to a form where they post a - username/password.) - - Use is simple: - - @logged_in_or_basicauth - def your_view: - ... - - You can provide the name of the realm to ask for authentication within. - """ - def view_decorator(func): - def wrapper(request, *args, **kwargs): - return view_or_basicauth(func, request, - lambda u: u.is_authenticated, - realm, *args, **kwargs) - return wrapper - return view_decorator - - -def has_perm_or_basicauth(perm, realm=""): - """ - This is similar to the above decorator 'logged_in_or_basicauth' - except that it requires the logged in user to have a specific - permission. - - Use: - - @logged_in_or_basicauth('asforums.view_forumcollection') - def your_view: - ... - - """ - def view_decorator(func): - def wrapper(request, *args, **kwargs): - return view_or_basicauth(func, request, - lambda u: u.has_perm(perm), - realm, *args, **kwargs) - return wrapper - return view_decorator diff --git a/tracking/views.py b/tracking/views.py index 06c65a1..613a2ca 100644 --- a/tracking/views.py +++ b/tracking/views.py @@ -3,11 +3,9 @@ from django.core.serializers import serialize from django.http import HttpResponse, HttpResponseBadRequest from django.utils import timezone -from django.utils.decorators import method_decorator from django.views.generic import View from tracking.api import CSVSerializer -from tracking.basic_auth import logged_in_or_basicauth from tracking.models import Device, LoggedPoint @@ -22,10 +20,6 @@ class SpatialDataView(View): properties = () filename_prefix = None - @method_decorator(logged_in_or_basicauth(realm="Resource Tracking")) - def dispatch(self, *args, **kwargs): - return super(SpatialDataView, self).dispatch(*args, **kwargs) - def get_filename_prefix(self): if not self.filename_prefix: return self.model._meta.model_name From 9d9b28a14635478a0196e11482ee1a87d50a0be3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 15:36:22 +0000 Subject: [PATCH 16/20] Bump docker/metadata-action from 4 to 5 Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4 to 5. - [Release notes](https://github.com/docker/metadata-action/releases) - [Upgrade guide](https://github.com/docker/metadata-action/blob/master/UPGRADE.md) - [Commits](https://github.com/docker/metadata-action/compare/v4...v5) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/image-build-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-build-scan.yml b/.github/workflows/image-build-scan.yml index 3323b50..d8506e3 100644 --- a/.github/workflows/image-build-scan.yml +++ b/.github/workflows/image-build-scan.yml @@ -40,7 +40,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Extract Docker metadata id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} flavor: | From b875f7f188afad4fee4c52cb51ae41fd6ef7b32c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 15:36:29 +0000 Subject: [PATCH 17/20] Bump actions/setup-python from 4 to 5 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/run-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 24ed823..003e299 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -39,7 +39,7 @@ jobs: - name: Check out repository uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 id: setup-python with: python-version: '3.10' From 355cda58183c62a125f57719e2066cd098b2f1db Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Tue, 12 Dec 2023 12:50:44 +0800 Subject: [PATCH 18/20] Added Kustomize overlay for DPlus email harvest. --- kustomize/base/deployment.yaml | 1 + .../harvest-email-dplus/kustomization.yaml | 7 ++++ .../cronjobs/harvest-email-dplus/patch.yaml | 35 +++++++++++++++++++ .../harvest-email-dplus/kustomization.yaml | 7 ++++ .../cronjobs/harvest-email-dplus/patch.yaml | 34 ++++++++++++++++++ kustomize/overlays/uat/kustomization.yaml | 1 + 6 files changed, 85 insertions(+) create mode 100644 kustomize/overlays/prod/cronjobs/harvest-email-dplus/kustomization.yaml create mode 100644 kustomize/overlays/prod/cronjobs/harvest-email-dplus/patch.yaml create mode 100644 kustomize/overlays/uat/cronjobs/harvest-email-dplus/kustomization.yaml create mode 100644 kustomize/overlays/uat/cronjobs/harvest-email-dplus/patch.yaml diff --git a/kustomize/base/deployment.yaml b/kustomize/base/deployment.yaml index 2542d3b..b7f6462 100644 --- a/kustomize/base/deployment.yaml +++ b/kustomize/base/deployment.yaml @@ -61,3 +61,4 @@ spec: emptyDir: medium: "Memory" restartPolicy: Always + terminationGracePeriodSeconds: 180 diff --git a/kustomize/overlays/prod/cronjobs/harvest-email-dplus/kustomization.yaml b/kustomize/overlays/prod/cronjobs/harvest-email-dplus/kustomization.yaml new file mode 100644 index 0000000..23dbc73 --- /dev/null +++ b/kustomize/overlays/prod/cronjobs/harvest-email-dplus/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - ../../../../template +nameSuffix: -harvest-dplus +patches: + - path: patch.yaml diff --git a/kustomize/overlays/prod/cronjobs/harvest-email-dplus/patch.yaml b/kustomize/overlays/prod/cronjobs/harvest-email-dplus/patch.yaml new file mode 100644 index 0000000..cb4db05 --- /dev/null +++ b/kustomize/overlays/prod/cronjobs/harvest-email-dplus/patch.yaml @@ -0,0 +1,35 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: resourcetracking-cronjob +spec: + schedule: "* * * * *" + jobTemplate: + spec: + template: + spec: + containers: + - name: resourcetracking-cronjob + imagePullPolicy: IfNotPresent + args: ["manage.py", "harvest_tracking_email", "--device-type", "dplus", "--purge-email"] + env: + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: resourcetracking-env-prod + key: DATABASE_URL + - name: EMAIL_HOST + valueFrom: + secretKeyRef: + name: resourcetracking-env-prod + key: EMAIL_HOST + - name: EMAIL_USER + valueFrom: + secretKeyRef: + name: resourcetracking-env-prod + key: EMAIL_USER + - name: EMAIL_PASSWORD + valueFrom: + secretKeyRef: + name: resourcetracking-env-prod + key: EMAIL_PASSWORD diff --git a/kustomize/overlays/uat/cronjobs/harvest-email-dplus/kustomization.yaml b/kustomize/overlays/uat/cronjobs/harvest-email-dplus/kustomization.yaml new file mode 100644 index 0000000..9220004 --- /dev/null +++ b/kustomize/overlays/uat/cronjobs/harvest-email-dplus/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - ../../../../template +nameSuffix: -harvest-email-dplus +patches: + - path: patch.yaml diff --git a/kustomize/overlays/uat/cronjobs/harvest-email-dplus/patch.yaml b/kustomize/overlays/uat/cronjobs/harvest-email-dplus/patch.yaml new file mode 100644 index 0000000..1470045 --- /dev/null +++ b/kustomize/overlays/uat/cronjobs/harvest-email-dplus/patch.yaml @@ -0,0 +1,34 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: resourcetracking-cronjob +spec: + schedule: "* * * * *" + jobTemplate: + spec: + template: + spec: + containers: + - name: resourcetracking-cronjob + args: ["manage.py", "harvest_tracking_email", "--device-type", "dplus"] + env: + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: resourcetracking-env-uat + key: DATABASE_URL + - name: EMAIL_HOST + valueFrom: + secretKeyRef: + name: resourcetracking-env-uat + key: EMAIL_HOST + - name: EMAIL_USER + valueFrom: + secretKeyRef: + name: resourcetracking-env-uat + key: EMAIL_USER + - name: EMAIL_PASSWORD + valueFrom: + secretKeyRef: + name: resourcetracking-env-uat + key: EMAIL_PASSWORD diff --git a/kustomize/overlays/uat/kustomization.yaml b/kustomize/overlays/uat/kustomization.yaml index 96283fb..89ed944 100644 --- a/kustomize/overlays/uat/kustomization.yaml +++ b/kustomize/overlays/uat/kustomization.yaml @@ -9,6 +9,7 @@ secretGenerator: resources: - ../../base - cronjobs/harvest-dfes + - cronjobs/harvest-email-dplus - cronjobs/harvest-email-iriditrak - cronjobs/harvest-email-mp70 - cronjobs/harvest-tracplus From 8e9fa797143e1115b12c74507dffc8ee6778e25e Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Tue, 12 Dec 2023 12:58:38 +0800 Subject: [PATCH 19/20] Increment image version in prod overlay. --- kustomize/overlays/prod/kustomization.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kustomize/overlays/prod/kustomization.yaml b/kustomize/overlays/prod/kustomization.yaml index 1100834..9576b2b 100644 --- a/kustomize/overlays/prod/kustomization.yaml +++ b/kustomize/overlays/prod/kustomization.yaml @@ -22,7 +22,7 @@ labels: variant: prod images: - name: ghcr.io/dbca-wa/resource_tracking - newTag: 1.4.1 + newTag: 1.4.3 patches: - path: deployment_patch.yaml - path: service_patch.yaml From 93eec6507df2c3ee623ffc543368049fc5385920 Mon Sep 17 00:00:00 2001 From: Ashley Felton Date: Tue, 12 Dec 2023 13:01:30 +0800 Subject: [PATCH 20/20] Bump whitenoise minor version. --- poetry.lock | 40 ++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index f29e27e..6917ec3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "asgiref" @@ -660,13 +660,13 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "identify" -version = "2.5.32" +version = "2.5.33" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.32-py2.py3-none-any.whl", hash = "sha256:0b7656ef6cba81664b783352c73f8c24b39cf82f926f78f4550eda928e5e0545"}, - {file = "identify-2.5.32.tar.gz", hash = "sha256:5d9979348ec1a21c768ae07e0a652924538e8bce67313a73cb0f681cf08ba407"}, + {file = "identify-2.5.33-py2.py3-none-any.whl", hash = "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34"}, + {file = "identify-2.5.33.tar.gz", hash = "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d"}, ] [package.extras] @@ -852,13 +852,13 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] @@ -892,13 +892,13 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co [[package]] name = "pre-commit" -version = "3.5.0" +version = "3.6.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, - {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, + {file = "pre_commit-3.6.0-py2.py3-none-any.whl", hash = "sha256:c255039ef399049a5544b6ce13d135caba8f2c28c3b4033277a788f434308376"}, + {file = "pre_commit-3.6.0.tar.gz", hash = "sha256:d30bad9abf165f7785c15a21a1f46da7d0677cb00ee7ff4c579fd38922efe15d"}, ] [package.dependencies] @@ -1251,13 +1251,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.9.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] @@ -1319,13 +1319,13 @@ files = [ [[package]] name = "whitenoise" -version = "6.5.0" +version = "6.6.0" description = "Radically simplified static file serving for WSGI applications" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "whitenoise-6.5.0-py3-none-any.whl", hash = "sha256:16468e9ad2189f09f4a8c635a9031cc9bb2cdbc8e5e53365407acf99f7ade9ec"}, - {file = "whitenoise-6.5.0.tar.gz", hash = "sha256:15fe60546ac975b58e357ccaeb165a4ca2d0ab697e48450b8f0307ca368195a8"}, + {file = "whitenoise-6.6.0-py3-none-any.whl", hash = "sha256:b1f9db9bf67dc183484d760b99f4080185633136a273a03f6436034a41064146"}, + {file = "whitenoise-6.6.0.tar.gz", hash = "sha256:8998f7370973447fac1e8ef6e8ded2c5209a7b1f67c1012866dbcd09681c3251"}, ] [package.dependencies] @@ -1337,4 +1337,4 @@ brotli = ["Brotli"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "833a8561b1636bd17af55c52794d224678d74bc136fc192c406e19ac57d1675f" +content-hash = "6026fada177618bac82438ba27ddcf36b84d74e2d3368dc38f5732f69055b0bb" diff --git a/pyproject.toml b/pyproject.toml index 905d16a..db5f42c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ django-extensions = "3.2.3" django-tastypie = "0.14.6" django-geojson = "4.0.0" unicodecsv = "0.14.1" -whitenoise = {version = "6.5.0", extras = ["brotli"]} +whitenoise = {version = "6.6.0", extras = ["brotli"]} azure-storage-blob = "12.19.0" sentry-sdk = {version = "1.38.0", extras = ["django"]} tomli = "2.0.1"