diff --git a/.github/contributors.json b/.github/contributors.json
index 9aaf688a8..7d9b1b348 100644
--- a/.github/contributors.json
+++ b/.github/contributors.json
@@ -1693,5 +1693,20 @@
"name": "Alan Cyment",
"github_login": "acyment",
"twitter_username": ""
+ },
+ {
+ "name": "Kawsar Alam Foysal",
+ "github_login": "iamfoysal",
+ "twitter_username": ""
+ },
+ {
+ "name": "Igor Jerosimić",
+ "github_login": "igor-wl",
+ "twitter_username": ""
+ },
+ {
+ "name": "Pepa",
+ "github_login": "07pepa",
+ "twitter_username": ""
}
]
\ No newline at end of file
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index a24abcfef..14935baab 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -2,23 +2,16 @@
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
+enable-beta-ecosystems: true
updates:
# Update Python deps for the template (not the generated project)
- - package-ecosystem: "pip"
+ - package-ecosystem: "uv"
directory: "/"
schedule:
interval: "daily"
labels:
- "project infrastructure"
- # Update Python deps for the documentation
- - package-ecosystem: "pip"
- directory: "docs/"
- schedule:
- interval: "daily"
- labels:
- - "project infrastructure"
-
# Update GitHub actions in workflows
- package-ecosystem: "github-actions"
directory: "/"
@@ -36,11 +29,11 @@ updates:
- "update"
# Enable version updates for Docker
- # We need to specify each Dockerfile in a separate entry because Dependabot doesn't
- # support wildcards or recursively checking subdirectories. Check this issue for updates:
- # https://github.com/dependabot/dependabot-core/issues/2178
- package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/local/django/"
+ directories:
+ - "{{cookiecutter.project_slug}}/compose/local/django/"
+ - "{{cookiecutter.project_slug}}/compose/local/docs/"
+ - "{{cookiecutter.project_slug}}/compose/production/django/"
schedule:
interval: "daily"
ignore:
@@ -52,60 +45,12 @@ updates:
- "update"
- package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/local/docs/"
- schedule:
- interval: "daily"
- ignore:
- - dependency-name: "*"
- update-types:
- - "version-update:semver-major"
- - "version-update:semver-minor"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/local/node/"
- schedule:
- interval: "daily"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/aws/"
- schedule:
- interval: "daily"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/django/"
- schedule:
- interval: "daily"
- ignore:
- - dependency-name: "*"
- update-types:
- - "version-update:semver-major"
- - "version-update:semver-minor"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/postgres/"
- schedule:
- interval: "daily"
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/nginx/"
- schedule:
- interval: "daily"
- versioning-strategy: increase
- labels:
- - "update"
-
- - package-ecosystem: "docker"
- directory: "{{cookiecutter.project_slug}}/compose/production/traefik/"
+ directories:
+ - "{{cookiecutter.project_slug}}/compose/local/node/"
+ - "{{cookiecutter.project_slug}}/compose/production/aws/"
+ - "{{cookiecutter.project_slug}}/compose/production/postgres/"
+ - "{{cookiecutter.project_slug}}/compose/production/nginx/"
+ - "{{cookiecutter.project_slug}}/compose/production/traefik/"
schedule:
interval: "daily"
labels:
diff --git a/.github/workflows/align-versions.yml b/.github/workflows/align-versions.yml
index 2ded34062..6444aa972 100644
--- a/.github/workflows/align-versions.yml
+++ b/.github/workflows/align-versions.yml
@@ -14,6 +14,7 @@ permissions:
jobs:
run:
+ if: ${{ github.actor == 'pyup-bot' }}
runs-on: ubuntu-latest
env:
GH_PAT: ${{ secrets.GH_PAT }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6efcef8f2..1fa399174 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -81,7 +81,7 @@ jobs:
ports:
- 6379:6379
postgres:
- image: postgres:12
+ image: postgres:13
ports:
- 5432:5432
env:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 9cb8e4b36..4eb01036e 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -34,22 +34,22 @@ repos:
exclude: hooks/
- repo: https://github.com/psf/black
- rev: 24.10.0
+ rev: 25.1.0
hooks:
- id: black
- repo: https://github.com/PyCQA/isort
- rev: 5.13.2
+ rev: 6.0.1
hooks:
- id: isort
- repo: https://github.com/PyCQA/flake8
- rev: 7.1.1
+ rev: 7.2.0
hooks:
- id: flake8
- repo: https://github.com/tox-dev/pyproject-fmt
- rev: "v2.5.0"
+ rev: "v2.5.1"
hooks:
- id: pyproject-fmt
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9332b7487..a2f257826 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,195 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
+## 2025.04.03
+
+
+### Updated
+
+- Update django-anymail to 13.0 ([#5763](https://github.com/cookiecutter/cookiecutter-django/pull/5763))
+
+- Update pytest-django to 4.11.1 ([#5762](https://github.com/cookiecutter/cookiecutter-django/pull/5762))
+
+- Update ruff to 0.11.3 ([#5761](https://github.com/cookiecutter/cookiecutter-django/pull/5761))
+
+- Update django-allauth to 65.7.0 ([#5760](https://github.com/cookiecutter/cookiecutter-django/pull/5760))
+
+## 2025.04.02
+
+
+### Fixed
+
+- Fix line endings for dotenv merge script on Windows ([#5754](https://github.com/cookiecutter/cookiecutter-django/pull/5754))
+
+### Updated
+
+- Update crispy-bootstrap5 to 2025.4 ([#5756](https://github.com/cookiecutter/cookiecutter-django/pull/5756))
+
+- Update Django from 5.0 to 5.1 ([#5740](https://github.com/cookiecutter/cookiecutter-django/pull/5740))
+
+- Update sentry-sdk to 2.25.1 ([#5757](https://github.com/cookiecutter/cookiecutter-django/pull/5757))
+
+- Update django-storages to 1.14.6 ([#5753](https://github.com/cookiecutter/cookiecutter-django/pull/5753))
+
+- Update pytest-django to 4.11.0 ([#5752](https://github.com/cookiecutter/cookiecutter-django/pull/5752))
+
+## 2025.04.01
+
+
+### Updated
+
+- Update pillow to 11.2.0 ([#5751](https://github.com/cookiecutter/cookiecutter-django/pull/5751))
+
+- Bump traefik from 3.3.4 to 3.3.5 ([#5750](https://github.com/cookiecutter/cookiecutter-django/pull/5750))
+
+- Update celery to 5.5.0 ([#5748](https://github.com/cookiecutter/cookiecutter-django/pull/5748))
+
+## 2025.03.31
+
+
+### Updated
+
+- Update django-allauth to 65.6.0 ([#5741](https://github.com/cookiecutter/cookiecutter-django/pull/5741))
+
+- Update sentry-sdk to 2.25.0 ([#5747](https://github.com/cookiecutter/cookiecutter-django/pull/5747))
+
+- Update coverage to 7.8.0 ([#5745](https://github.com/cookiecutter/cookiecutter-django/pull/5745))
+
+## 2025.03.28
+
+
+### Updated
+
+- Update djangorestframework to 3.16.0 ([#5743](https://github.com/cookiecutter/cookiecutter-django/pull/5743))
+
+- Update django-upgrade pre-commit hook to v1.24.0 ([#5742](https://github.com/cookiecutter/cookiecutter-django/pull/5742))
+
+## 2025.03.24
+
+
+### Updated
+
+- Update django-allauth to 65.5.0 ([#5723](https://github.com/cookiecutter/cookiecutter-django/pull/5723))
+
+- Update sentry-sdk to 2.24.1 ([#5739](https://github.com/cookiecutter/cookiecutter-django/pull/5739))
+
+## 2025.03.22
+
+
+### Updated
+
+- Update coverage to 7.7.1 ([#5736](https://github.com/cookiecutter/cookiecutter-django/pull/5736))
+
+## 2025.03.21
+
+
+### Updated
+
+- Update sentry-sdk to 2.24.0 ([#5734](https://github.com/cookiecutter/cookiecutter-django/pull/5734))
+
+- Update django-debug-toolbar to 5.1.0 ([#5732](https://github.com/cookiecutter/cookiecutter-django/pull/5732))
+
+- Update ruff to 0.11.2 ([#5735](https://github.com/cookiecutter/cookiecutter-django/pull/5735))
+
+- Bump amazon/aws-cli from 2.24.0 to 2.25.0 ([#5733](https://github.com/cookiecutter/cookiecutter-django/pull/5733))
+
+- Auto-update pre-commit hooks ([#5657](https://github.com/cookiecutter/cookiecutter-django/pull/5657))
+
+## 2025.03.19
+
+
+### Updated
+
+- Update pre-commit to 4.2.0 ([#5730](https://github.com/cookiecutter/cookiecutter-django/pull/5730))
+
+## 2025.03.17
+
+
+### Updated
+
+- Update sentry-sdk to 2.23.1 ([#5727](https://github.com/cookiecutter/cookiecutter-django/pull/5727))
+
+- Update coverage to 7.7.0 ([#5725](https://github.com/cookiecutter/cookiecutter-django/pull/5725))
+
+## 2025.03.15
+
+
+### Updated
+
+- Update psycopg to 3.2.6 ([#5721](https://github.com/cookiecutter/cookiecutter-django/pull/5721))
+
+- Update ruff to 0.11.0 ([#5724](https://github.com/cookiecutter/cookiecutter-django/pull/5724))
+
+## 2025.03.08
+
+
+### Updated
+
+- Update ruff to 0.9.10 ([#5720](https://github.com/cookiecutter/cookiecutter-django/pull/5720))
+
+## 2025.03.06
+
+
+### Updated
+
+- Update django to 5.0.13 ([#5719](https://github.com/cookiecutter/cookiecutter-django/pull/5719))
+
+## 2025.03.04
+
+
+### Changed
+
+- Add groups for dependabot updates ([#5709](https://github.com/cookiecutter/cookiecutter-django/pull/5709))
+
+### Updated
+
+- Update sphinx to 8.3.0 ([#5714](https://github.com/cookiecutter/cookiecutter-django/pull/5714))
+
+- Update pytest to 8.3.5 ([#5713](https://github.com/cookiecutter/cookiecutter-django/pull/5713))
+
+## 2025.03.01
+
+
+### Updated
+
+- Update ruff to 0.9.9 ([#5711](https://github.com/cookiecutter/cookiecutter-django/pull/5711))
+
+## 2025.02.28
+
+
+### Updated
+
+- Update ruff to 0.9.8 ([#5708](https://github.com/cookiecutter/cookiecutter-django/pull/5708))
+
+- Bump babel-loader from 9.2.1 to 10.0.0 ([#5710](https://github.com/cookiecutter/cookiecutter-django/pull/5710))
+
+## 2025.02.26
+
+
+### Updated
+
+- Bump traefik from 3.3.3 to 3.3.4 ([#5705](https://github.com/cookiecutter/cookiecutter-django/pull/5705))
+
+## 2025.02.25
+
+
+### Documentation
+
+- Fix links to FAQ about `contrib.sites` directory ([#5704](https://github.com/cookiecutter/cookiecutter-django/pull/5704))
+
+## 2025.02.23
+
+
+### Changed
+
+- Group dependabot docker directories ([#5698](https://github.com/cookiecutter/cookiecutter-django/pull/5698))
+
+### Updated
+
+- Update sphinx to 8.2.1 ([#5696](https://github.com/cookiecutter/cookiecutter-django/pull/5696))
+
+- Update psycopg to 3.2.5 ([#5697](https://github.com/cookiecutter/cookiecutter-django/pull/5697))
+
## 2025.02.21
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 80b0d7344..4b34cc62b 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -1104,6 +1104,13 @@ Listed in alphabetical order.
Peter Bittner |
diff --git a/README.md b/README.md
index a46f214b4..715e0b102 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ production-ready Django projects quickly.
## Features
-- For Django 5.0
+- For Django 5.1
- Works with Python 3.12
- Renders Django projects with 100% starting test coverage
- Twitter [Bootstrap](https://github.com/twbs/bootstrap) v5
@@ -51,7 +51,7 @@ _These features can be enabled during initial project setup._
## Constraints
- Only maintained 3rd party libraries are used.
-- Uses PostgreSQL everywhere: 12 - 16 ([MySQL fork](https://github.com/mabdullahadeel/cookiecutter-django-mysql) also available).
+- Uses PostgreSQL everywhere: 13 - 16 ([MySQL fork](https://github.com/mabdullahadeel/cookiecutter-django-mysql) also available).
- Environment variables for configuration (This won't work with Apache/mod_wsgi).
## Support this Project!
@@ -133,8 +133,7 @@ Answer the prompts with your own desired [options](http://cookiecutter-django.re
2 - 15
3 - 14
4 - 13
- 5 - 12
- Choose from 1, 2, 3, 4, 5 [1]: 1
+ Choose from 1, 2, 3, 4 [1]: 1
Select cloud_provider:
1 - AWS
2 - GCP
diff --git a/cookiecutter.json b/cookiecutter.json
index 86e44f368..99acae738 100644
--- a/cookiecutter.json
+++ b/cookiecutter.json
@@ -18,7 +18,7 @@
"windows": "n",
"editor": ["None", "PyCharm", "VS Code"],
"use_docker": "n",
- "postgresql_version": ["16", "15", "14", "13", "12"],
+ "postgresql_version": ["16", "15", "14", "13"],
"cloud_provider": ["AWS", "GCP", "Azure", "None"],
"mail_service": [
"Mailgun",
diff --git a/docs/1-getting-started/project-generation-options.rst b/docs/1-getting-started/project-generation-options.rst
index 21059d3a2..cef89e3cb 100644
--- a/docs/1-getting-started/project-generation-options.rst
+++ b/docs/1-getting-started/project-generation-options.rst
@@ -70,7 +70,6 @@ postgresql_version:
2. 15
3. 14
4. 13
- 5. 12
cloud_provider:
Select a cloud provider for static & media files. The choices are:
diff --git a/pyproject.toml b/pyproject.toml
index a8f932e6c..8999bc8ac 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "cookiecutter-django"
-version = "2025.02.21"
+version = "2025.04.03"
description = "A Cookiecutter template for creating production-ready Django projects quickly."
readme = "README.md"
keywords = [
@@ -43,7 +43,7 @@ dependencies = [
"pytest-xdist==3.6.1",
"pyyaml==6.0.2",
"requests==2.32.3",
- "ruff==0.9.7",
+ "ruff==0.11.4",
"sh==2.1; sys_platform!='win23'",
"tox==4.23.2",
"tox-uv>=1.17",
diff --git a/tests/test_cookiecutter_generation.py b/tests/test_cookiecutter_generation.py
index 1c03015c4..558eae9e3 100755
--- a/tests/test_cookiecutter_generation.py
+++ b/tests/test_cookiecutter_generation.py
@@ -63,7 +63,6 @@ SUPPORTED_COMBINATIONS = [
{"postgresql_version": "15"},
{"postgresql_version": "14"},
{"postgresql_version": "13"},
- {"postgresql_version": "12"},
{"cloud_provider": "AWS", "use_whitenoise": "y"},
{"cloud_provider": "AWS", "use_whitenoise": "n"},
{"cloud_provider": "GCP", "use_whitenoise": "y"},
@@ -273,7 +272,7 @@ def test_djlint_check_passes(cookies, context_override):
@pytest.mark.parametrize(
- ["use_docker", "expected_test_script"],
+ ("use_docker", "expected_test_script"),
[
("n", "pytest"),
("y", "docker compose -f docker-compose.local.yml run django pytest"),
@@ -298,7 +297,7 @@ def test_travis_invokes_pytest(cookies, context, use_docker, expected_test_scrip
@pytest.mark.parametrize(
- ["use_docker", "expected_test_script"],
+ ("use_docker", "expected_test_script"),
[
("n", "pytest"),
("y", "docker compose -f docker-compose.local.yml run django pytest"),
@@ -317,7 +316,7 @@ def test_gitlab_invokes_precommit_and_pytest(cookies, context, use_docker, expec
try:
gitlab_config = yaml.safe_load(gitlab_yml)
assert gitlab_config["precommit"]["script"] == [
- "pre-commit run --show-diff-on-failure --color=always --all-files"
+ "pre-commit run --show-diff-on-failure --color=always --all-files",
]
assert gitlab_config["pytest"]["script"] == [expected_test_script]
except yaml.YAMLError as e:
@@ -325,7 +324,7 @@ def test_gitlab_invokes_precommit_and_pytest(cookies, context, use_docker, expec
@pytest.mark.parametrize(
- ["use_docker", "expected_test_script"],
+ ("use_docker", "expected_test_script"),
[
("n", "pytest"),
("y", "docker compose -f docker-compose.local.yml run django pytest"),
@@ -380,7 +379,7 @@ def test_error_if_incompatible(cookies, context, invalid_context):
@pytest.mark.parametrize(
- ["editor", "pycharm_docs_exist"],
+ ("editor", "pycharm_docs_exist"),
[
("None", False),
("PyCharm", True),
@@ -403,7 +402,7 @@ def test_trim_domain_email(cookies, context):
"use_docker": "y",
"domain_name": " example.com ",
"email": " me@example.com ",
- }
+ },
)
result = cookies.bake(extra_context=context)
diff --git a/tests/test_hooks.py b/tests/test_hooks.py
index 2ccac84b2..c8d503426 100644
--- a/tests/test_hooks.py
+++ b/tests/test_hooks.py
@@ -8,7 +8,7 @@ import pytest
from hooks.post_gen_project import append_to_gitignore_file
-@pytest.fixture()
+@pytest.fixture
def working_directory(tmp_path):
prev_cwd = Path.cwd()
os.chdir(tmp_path)
diff --git a/uv.lock b/uv.lock
index 1855fc86c..4693d7e43 100644
--- a/uv.lock
+++ b/uv.lock
@@ -182,7 +182,7 @@ wheels = [
[[package]]
name = "cookiecutter-django"
-version = "2025.2.21"
+version = "2025.4.3"
source = { virtual = "." }
dependencies = [
{ name = "binaryornot" },
@@ -229,7 +229,7 @@ requires-dist = [
{ name = "pytest-xdist", specifier = "==3.6.1" },
{ name = "pyyaml", specifier = "==6.0.2" },
{ name = "requests", specifier = "==2.32.3" },
- { name = "ruff", specifier = "==0.9.7" },
+ { name = "ruff", specifier = "==0.11.4" },
{ name = "sh", marker = "sys_platform != 'win23'", specifier = "==2.1" },
{ name = "tox", specifier = "==4.23.2" },
{ name = "tox-uv", specifier = ">=1.17" },
@@ -830,27 +830,27 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.9.7"
+version = "0.11.4"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/39/8b/a86c300359861b186f18359adf4437ac8e4c52e42daa9eedc731ef9d5b53/ruff-0.9.7.tar.gz", hash = "sha256:643757633417907510157b206e490c3aa11cab0c087c912f60e07fbafa87a4c6", size = 3669813 }
+sdist = { url = "https://files.pythonhosted.org/packages/e8/5b/3ae20f89777115944e89c2d8c2e795dcc5b9e04052f76d5347e35e0da66e/ruff-0.11.4.tar.gz", hash = "sha256:f45bd2fb1a56a5a85fae3b95add03fb185a0b30cf47f5edc92aa0355ca1d7407", size = 3933063 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b1/f3/3a1d22973291226df4b4e2ff70196b926b6f910c488479adb0eeb42a0d7f/ruff-0.9.7-py3-none-linux_armv6l.whl", hash = "sha256:99d50def47305fe6f233eb8dabfd60047578ca87c9dcb235c9723ab1175180f4", size = 11774588 },
- { url = "https://files.pythonhosted.org/packages/8e/c9/b881f4157b9b884f2994fd08ee92ae3663fb24e34b0372ac3af999aa7fc6/ruff-0.9.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d59105ae9c44152c3d40a9c40d6331a7acd1cdf5ef404fbe31178a77b174ea66", size = 11746848 },
- { url = "https://files.pythonhosted.org/packages/14/89/2f546c133f73886ed50a3d449e6bf4af27d92d2f960a43a93d89353f0945/ruff-0.9.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f313b5800483770bd540cddac7c90fc46f895f427b7820f18fe1822697f1fec9", size = 11177525 },
- { url = "https://files.pythonhosted.org/packages/d7/93/6b98f2c12bf28ab9def59c50c9c49508519c5b5cfecca6de871cf01237f6/ruff-0.9.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042ae32b41343888f59c0a4148f103208bf6b21c90118d51dc93a68366f4e903", size = 11996580 },
- { url = "https://files.pythonhosted.org/packages/8e/3f/b3fcaf4f6d875e679ac2b71a72f6691a8128ea3cb7be07cbb249f477c061/ruff-0.9.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87862589373b33cc484b10831004e5e5ec47dc10d2b41ba770e837d4f429d721", size = 11525674 },
- { url = "https://files.pythonhosted.org/packages/f0/48/33fbf18defb74d624535d5d22adcb09a64c9bbabfa755bc666189a6b2210/ruff-0.9.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a17e1e01bee0926d351a1ee9bc15c445beae888f90069a6192a07a84af544b6b", size = 12739151 },
- { url = "https://files.pythonhosted.org/packages/63/b5/7e161080c5e19fa69495cbab7c00975ef8a90f3679caa6164921d7f52f4a/ruff-0.9.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7c1f880ac5b2cbebd58b8ebde57069a374865c73f3bf41f05fe7a179c1c8ef22", size = 13416128 },
- { url = "https://files.pythonhosted.org/packages/4e/c8/b5e7d61fb1c1b26f271ac301ff6d9de5e4d9a9a63f67d732fa8f200f0c88/ruff-0.9.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e63fc20143c291cab2841dbb8260e96bafbe1ba13fd3d60d28be2c71e312da49", size = 12870858 },
- { url = "https://files.pythonhosted.org/packages/da/cb/2a1a8e4e291a54d28259f8fc6a674cd5b8833e93852c7ef5de436d6ed729/ruff-0.9.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91ff963baed3e9a6a4eba2a02f4ca8eaa6eba1cc0521aec0987da8d62f53cbef", size = 14786046 },
- { url = "https://files.pythonhosted.org/packages/ca/6c/c8f8a313be1943f333f376d79724260da5701426c0905762e3ddb389e3f4/ruff-0.9.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88362e3227c82f63eaebf0b2eff5b88990280fb1ecf7105523883ba8c3aaf6fb", size = 12550834 },
- { url = "https://files.pythonhosted.org/packages/9d/ad/f70cf5e8e7c52a25e166bdc84c082163c9c6f82a073f654c321b4dff9660/ruff-0.9.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0372c5a90349f00212270421fe91874b866fd3626eb3b397ede06cd385f6f7e0", size = 11961307 },
- { url = "https://files.pythonhosted.org/packages/52/d5/4f303ea94a5f4f454daf4d02671b1fbfe2a318b5fcd009f957466f936c50/ruff-0.9.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d76b8ab60e99e6424cd9d3d923274a1324aefce04f8ea537136b8398bbae0a62", size = 11612039 },
- { url = "https://files.pythonhosted.org/packages/eb/c8/bd12a23a75603c704ce86723be0648ba3d4ecc2af07eecd2e9fa112f7e19/ruff-0.9.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0c439bdfc8983e1336577f00e09a4e7a78944fe01e4ea7fe616d00c3ec69a3d0", size = 12168177 },
- { url = "https://files.pythonhosted.org/packages/cc/57/d648d4f73400fef047d62d464d1a14591f2e6b3d4a15e93e23a53c20705d/ruff-0.9.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:115d1f15e8fdd445a7b4dc9a30abae22de3f6bcabeb503964904471691ef7606", size = 12610122 },
- { url = "https://files.pythonhosted.org/packages/49/79/acbc1edd03ac0e2a04ae2593555dbc9990b34090a9729a0c4c0cf20fb595/ruff-0.9.7-py3-none-win32.whl", hash = "sha256:e9ece95b7de5923cbf38893f066ed2872be2f2f477ba94f826c8defdd6ec6b7d", size = 9988751 },
- { url = "https://files.pythonhosted.org/packages/6d/95/67153a838c6b6ba7a2401241fd8a00cd8c627a8e4a0491b8d853dedeffe0/ruff-0.9.7-py3-none-win_amd64.whl", hash = "sha256:3770fe52b9d691a15f0b87ada29c45324b2ace8f01200fb0c14845e499eb0c2c", size = 11002987 },
- { url = "https://files.pythonhosted.org/packages/63/6a/aca01554949f3a401991dc32fe22837baeaccb8a0d868256cbb26a029778/ruff-0.9.7-py3-none-win_arm64.whl", hash = "sha256:b075a700b2533feb7a01130ff656a4ec0d5f340bb540ad98759b8401c32c2037", size = 10177763 },
+ { url = "https://files.pythonhosted.org/packages/9c/db/baee59ac88f57527fcbaad3a7b309994e42329c6bc4d4d2b681a3d7b5426/ruff-0.11.4-py3-none-linux_armv6l.whl", hash = "sha256:d9f4a761ecbde448a2d3e12fb398647c7f0bf526dbc354a643ec505965824ed2", size = 10106493 },
+ { url = "https://files.pythonhosted.org/packages/c1/d6/9a0962cbb347f4ff98b33d699bf1193ff04ca93bed4b4222fd881b502154/ruff-0.11.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8c1747d903447d45ca3d40c794d1a56458c51e5cc1bc77b7b64bd2cf0b1626cc", size = 10876382 },
+ { url = "https://files.pythonhosted.org/packages/3a/8f/62bab0c7d7e1ae3707b69b157701b41c1ccab8f83e8501734d12ea8a839f/ruff-0.11.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:51a6494209cacca79e121e9b244dc30d3414dac8cc5afb93f852173a2ecfc906", size = 10237050 },
+ { url = "https://files.pythonhosted.org/packages/09/96/e296965ae9705af19c265d4d441958ed65c0c58fc4ec340c27cc9d2a1f5b/ruff-0.11.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f171605f65f4fc49c87f41b456e882cd0c89e4ac9d58e149a2b07930e1d466f", size = 10424984 },
+ { url = "https://files.pythonhosted.org/packages/e5/56/644595eb57d855afed6e54b852e2df8cd5ca94c78043b2f29bdfb29882d5/ruff-0.11.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebf99ea9af918878e6ce42098981fc8c1db3850fef2f1ada69fb1dcdb0f8e79e", size = 9957438 },
+ { url = "https://files.pythonhosted.org/packages/86/83/9d3f3bed0118aef3e871ded9e5687fb8c5776bde233427fd9ce0a45db2d4/ruff-0.11.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edad2eac42279df12e176564a23fc6f4aaeeb09abba840627780b1bb11a9d223", size = 11547282 },
+ { url = "https://files.pythonhosted.org/packages/40/e6/0c6e4f5ae72fac5ccb44d72c0111f294a5c2c8cc5024afcb38e6bda5f4b3/ruff-0.11.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f103a848be9ff379fc19b5d656c1f911d0a0b4e3e0424f9532ececf319a4296e", size = 12182020 },
+ { url = "https://files.pythonhosted.org/packages/b5/92/4aed0e460aeb1df5ea0c2fbe8d04f9725cccdb25d8da09a0d3f5b8764bf8/ruff-0.11.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:193e6fac6eb60cc97b9f728e953c21cc38a20077ed64f912e9d62b97487f3f2d", size = 11679154 },
+ { url = "https://files.pythonhosted.org/packages/1b/d3/7316aa2609f2c592038e2543483eafbc62a0e1a6a6965178e284808c095c/ruff-0.11.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7af4e5f69b7c138be8dcffa5b4a061bf6ba6a3301f632a6bce25d45daff9bc99", size = 13905985 },
+ { url = "https://files.pythonhosted.org/packages/63/80/734d3d17546e47ff99871f44ea7540ad2bbd7a480ed197fe8a1c8a261075/ruff-0.11.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:126b1bf13154aa18ae2d6c3c5efe144ec14b97c60844cfa6eb960c2a05188222", size = 11348343 },
+ { url = "https://files.pythonhosted.org/packages/04/7b/70fc7f09a0161dce9613a4671d198f609e653d6f4ff9eee14d64c4c240fb/ruff-0.11.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8806daaf9dfa881a0ed603f8a0e364e4f11b6ed461b56cae2b1c0cab0645304", size = 10308487 },
+ { url = "https://files.pythonhosted.org/packages/1a/22/1cdd62dabd678d75842bf4944fd889cf794dc9e58c18cc547f9eb28f95ed/ruff-0.11.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5d94bb1cc2fc94a769b0eb975344f1b1f3d294da1da9ddbb5a77665feb3a3019", size = 9929091 },
+ { url = "https://files.pythonhosted.org/packages/9f/20/40e0563506332313148e783bbc1e4276d657962cc370657b2fff20e6e058/ruff-0.11.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:995071203d0fe2183fc7a268766fd7603afb9996785f086b0d76edee8755c896", size = 10924659 },
+ { url = "https://files.pythonhosted.org/packages/b5/41/eef9b7aac8819d9e942f617f9db296f13d2c4576806d604aba8db5a753f1/ruff-0.11.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7a37ca937e307ea18156e775a6ac6e02f34b99e8c23fe63c1996185a4efe0751", size = 11428160 },
+ { url = "https://files.pythonhosted.org/packages/ff/61/c488943414fb2b8754c02f3879de003e26efdd20f38167ded3fb3fc1cda3/ruff-0.11.4-py3-none-win32.whl", hash = "sha256:0e9365a7dff9b93af933dab8aebce53b72d8f815e131796268709890b4a83270", size = 10311496 },
+ { url = "https://files.pythonhosted.org/packages/b6/2b/2a1c8deb5f5dfa3871eb7daa41492c4d2b2824a74d2b38e788617612a66d/ruff-0.11.4-py3-none-win_amd64.whl", hash = "sha256:5a9fa1c69c7815e39fcfb3646bbfd7f528fa8e2d4bebdcf4c2bd0fa037a255fb", size = 11399146 },
+ { url = "https://files.pythonhosted.org/packages/4f/03/3aec4846226d54a37822e4c7ea39489e4abd6f88388fba74e3d4abe77300/ruff-0.11.4-py3-none-win_arm64.whl", hash = "sha256:d435db6b9b93d02934cf61ef332e66af82da6d8c69aefdea5994c89997c7a0fc", size = 10450306 },
]
[[package]]
diff --git a/{{cookiecutter.project_slug}}/.github/dependabot.yml b/{{cookiecutter.project_slug}}/.github/dependabot.yml
index 4ea47bd28..45f35a28e 100644
--- a/{{cookiecutter.project_slug}}/.github/dependabot.yml
+++ b/{{cookiecutter.project_slug}}/.github/dependabot.yml
@@ -9,16 +9,20 @@ updates:
# Every weekday
schedule:
interval: 'daily'
+ groups:
+ github-actions:
+ patterns:
+ - '*'
{%- if cookiecutter.use_docker == 'y' %}
# Enable version updates for Docker
- # We need to specify each Dockerfile in a separate entry because Dependabot doesn't
- # support wildcards or recursively checking subdirectories. Check this issue for updates:
- # https://github.com/dependabot/dependabot-core/issues/2178
- package-ecosystem: 'docker'
# Look for a `Dockerfile` in the `compose/local/django` directory
- directory: 'compose/local/django/'
+ directories:
+ - 'compose/local/django/'
+ - 'compose/local/docs/'
+ - 'compose/production/django/'
# Every weekday
schedule:
interval: 'daily'
@@ -28,70 +32,25 @@ updates:
update-types:
- 'version-update:semver-major'
- 'version-update:semver-minor'
+ groups:
+ docker-python:
+ patterns:
+ - '*'
+
- package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/local/docs` directory
- directory: 'compose/local/docs/'
- # Every weekday
- schedule:
- interval: 'daily'
- # Ignore minor version updates (3.10 -> 3.11) but update patch versions
- ignore:
- - dependency-name: '*'
- update-types:
- - 'version-update:semver-major'
- - 'version-update:semver-minor'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/local/node` directory
- directory: 'compose/local/node/'
- # Every weekday
- schedule:
- interval: 'daily'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/aws` directory
- directory: 'compose/production/aws/'
- # Every weekday
- schedule:
- interval: 'daily'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/django` directory
- directory: 'compose/production/django/'
- # Every weekday
- schedule:
- interval: 'daily'
- # Ignore minor version updates (3.10 -> 3.11) but update patch versions
- ignore:
- - dependency-name: '*'
- update-types:
- - 'version-update:semver-major'
- - 'version-update:semver-minor'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/postgres` directory
- directory: 'compose/production/postgres/'
- # Every weekday
- schedule:
- interval: 'daily'
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/traefik` directory
- directory: 'compose/production/traefik/'
- # Every weekday
- schedule:
- interval: 'daily'
-
+ # Look for a `Dockerfile` in the listed directories
+ directories:
+ - 'compose/local/node/'
+ - 'compose/production/aws/'
+ - 'compose/production/postgres/'
+ - 'compose/production/traefik/'
{%- if cookiecutter.cloud_provider == 'None' %}
-
- - package-ecosystem: 'docker'
- # Look for a `Dockerfile` in the `compose/production/nginx` directory
- directory: 'compose/production/nginx/'
+ - 'compose/production/nginx/'
+{%- endif %}
# Every weekday
schedule:
interval: 'daily'
-{%- endif %}
{%- endif %}
@@ -103,6 +62,11 @@ updates:
# Every weekday
schedule:
interval: 'daily'
+ groups:
+ python:
+ update-types:
+ - 'minor'
+ - 'patch'
{%- if cookiecutter.frontend_pipeline == 'Gulp' %}
@@ -113,5 +77,10 @@ updates:
# Every weekday
schedule:
interval: 'daily'
+ groups:
+ javascript:
+ update-types:
+ - 'minor'
+ - 'patch'
{%- endif %}
diff --git a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
index 661922ec9..6c34dd5ba 100644
--- a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
+++ b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
@@ -29,14 +29,14 @@ repos:
exclude: '{{cookiecutter.project_slug}}/templates/'
- repo: https://github.com/adamchainz/django-upgrade
- rev: '1.22.2'
+ rev: '1.24.0'
hooks:
- id: django-upgrade
args: ['--target-version', '5.0']
# Run the Ruff linter.
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.9.7
+ rev: v0.11.4
hooks:
# Linter
- id: ruff
diff --git a/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile
index d87f3c4c1..2c820984d 100644
--- a/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile
@@ -1,4 +1,4 @@
-FROM docker.io/amazon/aws-cli:2.24.0
+FROM docker.io/amazon/aws-cli:2.25.0
# Clear entrypoint from the base image, otherwise it's always calling the aws CLI
ENTRYPOINT []
diff --git a/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile
index b6188bf4a..3c9b1d8ab 100644
--- a/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile
@@ -1,4 +1,4 @@
-FROM docker.io/traefik:3.3.3
+FROM docker.io/traefik:3.3.5
RUN mkdir -p /etc/traefik/acme \
&& touch /etc/traefik/acme/acme.json \
&& chmod 600 /etc/traefik/acme/acme.json
diff --git a/{{cookiecutter.project_slug}}/config/asgi.py b/{{cookiecutter.project_slug}}/config/asgi.py
index edfffbbc5..302db2613 100644
--- a/{{cookiecutter.project_slug}}/config/asgi.py
+++ b/{{cookiecutter.project_slug}}/config/asgi.py
@@ -1,4 +1,3 @@
-# ruff: noqa
"""
ASGI config for {{ cookiecutter.project_name }} project.
@@ -25,12 +24,9 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
# This application object is used by any ASGI server configured to use this file.
django_application = get_asgi_application()
-# Apply ASGI middleware here.
-# from helloworld.asgi import HelloWorldApplication
-# application = HelloWorldApplication(application)
# Import websocket application here, so apps from django_application are loaded first
-from config.websocket import websocket_application
+from config.websocket import websocket_application # noqa: E402
async def application(scope, receive, send):
diff --git a/{{cookiecutter.project_slug}}/config/settings/base.py b/{{cookiecutter.project_slug}}/config/settings/base.py
index 22876096c..ba0a7ce46 100644
--- a/{{cookiecutter.project_slug}}/config/settings/base.py
+++ b/{{cookiecutter.project_slug}}/config/settings/base.py
@@ -337,10 +337,10 @@ ACCOUNT_ALLOW_REGISTRATION = env.bool("DJANGO_ACCOUNT_ALLOW_REGISTRATION", True)
# https://docs.allauth.org/en/latest/account/configuration.html
ACCOUNT_LOGIN_METHODS = {"{{cookiecutter.username_type}}"}
# https://docs.allauth.org/en/latest/account/configuration.html
-ACCOUNT_EMAIL_REQUIRED = True
-{%- if cookiecutter.username_type == "email" %}
-# https://docs.allauth.org/en/latest/account/configuration.html
-ACCOUNT_USERNAME_REQUIRED = False
+{%- if cookiecutter.username_type == "username" %}
+ACCOUNT_SIGNUP_FIELDS = ["email*", "username*", "password1*", "password2*"]
+{%- else %}
+ACCOUNT_SIGNUP_FIELDS = ["email*", "password1*", "password2*"]
# https://docs.allauth.org/en/latest/account/configuration.html
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
{%- endif %}
diff --git a/{{cookiecutter.project_slug}}/config/urls.py b/{{cookiecutter.project_slug}}/config/urls.py
index aca4352e6..c69358180 100644
--- a/{{cookiecutter.project_slug}}/config/urls.py
+++ b/{{cookiecutter.project_slug}}/config/urls.py
@@ -1,4 +1,3 @@
-# ruff: noqa
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
@@ -43,7 +42,7 @@ urlpatterns += [
# API base url
path("api/", include("config.api_router")),
# DRF auth token
- path("api/auth-token/", obtain_auth_token),
+ path("api/auth-token/", obtain_auth_token, name="obtain_auth_token"),
path("api/schema/", SpectacularAPIView.as_view(), name="api-schema"),
path(
"api/docs/",
@@ -77,4 +76,7 @@ if settings.DEBUG:
if "debug_toolbar" in settings.INSTALLED_APPS:
import debug_toolbar
- urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns
+ urlpatterns = [
+ path("__debug__/", include(debug_toolbar.urls)),
+ *urlpatterns,
+ ]
diff --git a/{{cookiecutter.project_slug}}/config/wsgi.py b/{{cookiecutter.project_slug}}/config/wsgi.py
index 73a6cddcb..cc82dd7f3 100644
--- a/{{cookiecutter.project_slug}}/config/wsgi.py
+++ b/{{cookiecutter.project_slug}}/config/wsgi.py
@@ -1,4 +1,3 @@
-# ruff: noqa
"""
WSGI config for {{ cookiecutter.project_name }} project.
@@ -25,16 +24,9 @@ from django.core.wsgi import get_wsgi_application
# {{ cookiecutter.project_slug }} directory.
BASE_DIR = Path(__file__).resolve(strict=True).parent.parent
sys.path.append(str(BASE_DIR / "{{ cookiecutter.project_slug }}"))
-# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
-# if running multiple sites in the same mod_wsgi process. To fix this, use
-# mod_wsgi daemon mode with each site in its own daemon process, or use
-# os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
application = get_wsgi_application()
-# Apply WSGI middleware here.
-# from helloworld.wsgi import HelloWorldApplication
-# application = HelloWorldApplication(application)
diff --git a/{{cookiecutter.project_slug}}/docs/conf.py b/{{cookiecutter.project_slug}}/docs/conf.py
index 31a828fe5..02bd02a0c 100644
--- a/{{cookiecutter.project_slug}}/docs/conf.py
+++ b/{{cookiecutter.project_slug}}/docs/conf.py
@@ -1,4 +1,4 @@
-# ruff: noqa
+# ruff: noqa: ERA001, PTH100
# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
@@ -13,9 +13,10 @@
import os
import sys
+
import django
-if os.getenv("READTHEDOCS", default=False) == "True":
+if os.getenv("READTHEDOCS", default="False") == "True":
sys.path.insert(0, os.path.abspath(".."))
os.environ["DJANGO_READ_DOT_ENV_FILE"] = "True"
os.environ["USE_DOCKER"] = "no"
@@ -32,7 +33,7 @@ django.setup()
# -- Project information -----------------------------------------------------
project = "{{ cookiecutter.project_name }}"
-copyright = """{% now 'utc', '%Y' %}, {{ cookiecutter.author_name }}"""
+copyright = """{% now 'utc', '%Y' %}, {{ cookiecutter.author_name }}""" # noqa: A001
author = "{{ cookiecutter.author_name }}"
diff --git a/{{cookiecutter.project_slug}}/manage.py b/{{cookiecutter.project_slug}}/manage.py
index a39871814..d6c4f110f 100755
--- a/{{cookiecutter.project_slug}}/manage.py
+++ b/{{cookiecutter.project_slug}}/manage.py
@@ -1,28 +1,22 @@
#!/usr/bin/env python
-# ruff: noqa
+"""Django's command-line utility for administrative tasks."""
import os
import sys
from pathlib import Path
-if __name__ == "__main__":
+
+def main():
+ """Run administrative tasks."""
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
try:
from django.core.management import execute_from_command_line
- except ImportError:
- # The above import may fail for some other reason. Ensure that the
- # issue is really that Django is missing to avoid masking other
- # exceptions on Python 2.
- try:
- import django
- except ImportError:
- raise ImportError(
- "Couldn't import Django. Are you sure it's installed and "
- "available on your PYTHONPATH environment variable? Did you "
- "forget to activate a virtual environment?"
- )
-
- raise
+ except ImportError as exc:
+ raise ImportError( # noqa: TRY003
+ "Couldn't import Django. Are you sure it's installed and " # noqa: EM101
+ "available on your PYTHONPATH environment variable? Did you "
+ "forget to activate a virtual environment?",
+ ) from exc
# This allows easy placement of apps within the interior
# {{ cookiecutter.project_slug }} directory.
@@ -30,3 +24,7 @@ if __name__ == "__main__":
sys.path.append(str(current_path / "{{ cookiecutter.project_slug }}"))
execute_from_command_line(sys.argv)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py b/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py
index c83ed7166..b05037433 100644
--- a/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py
+++ b/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py
@@ -1,5 +1,3 @@
-# ruff: noqa
-import os
from collections.abc import Sequence
from pathlib import Path
@@ -19,7 +17,7 @@ def merge(
merged_content = ""
for merge_file in files_to_merge:
merged_content += merge_file.read_text()
- merged_content += os.linesep
+ merged_content += "\n"
output_file.write_text(merged_content)
diff --git a/{{cookiecutter.project_slug}}/package.json b/{{cookiecutter.project_slug}}/package.json
index c42075e8f..d0458179b 100644
--- a/{{cookiecutter.project_slug}}/package.json
+++ b/{{cookiecutter.project_slug}}/package.json
@@ -6,7 +6,7 @@
"@babel/preset-env": "^7.16.5",
"@popperjs/core": "^2.10.2",
"autoprefixer": "^10.4.0",
- "babel-loader": "^9.1.2",
+ "babel-loader": "^10.0.0",
"bootstrap": "^5.2.3",
"browser-sync": "^3.0.2",
"css-loader": "^7.1.2",
diff --git a/{{cookiecutter.project_slug}}/requirements/base.txt b/{{cookiecutter.project_slug}}/requirements/base.txt
index 8bf3eb2eb..dc58dbc56 100644
--- a/{{cookiecutter.project_slug}}/requirements/base.txt
+++ b/{{cookiecutter.project_slug}}/requirements/base.txt
@@ -1,5 +1,5 @@
python-slugify==8.0.4 # https://github.com/un33k/python-slugify
-Pillow==11.1.0 # https://github.com/python-pillow/Pillow
+Pillow==11.1.0 # pyup: != 11.2.0 # https://github.com/python-pillow/Pillow
{%- if cookiecutter.frontend_pipeline == 'Django Compressor' %}
{%- if cookiecutter.windows == 'y' and cookiecutter.use_docker == 'n' %}
rcssmin==1.1.2 --install-option="--without-c-extensions" # https://github.com/ndparker/rcssmin
@@ -16,7 +16,7 @@ redis==5.2.1 # https://github.com/redis/redis-py
hiredis==3.1.0 # https://github.com/redis/hiredis-py
{%- endif %}
{%- if cookiecutter.use_celery == "y" %}
-celery==5.4.0 # pyup: < 6.0 # https://github.com/celery/celery
+celery==5.5.0 # pyup: < 6.0 # https://github.com/celery/celery
django-celery-beat==2.7.0 # https://github.com/celery/django-celery-beat
{%- if cookiecutter.use_docker == 'y' %}
flower==2.0.1 # https://github.com/mher/flower
@@ -29,19 +29,19 @@ uvicorn-worker==0.3.0 # https://github.com/Kludex/uvicorn-worker
# Django
# ------------------------------------------------------------------------------
-django==5.0.12 # pyup: < 5.1 # https://www.djangoproject.com/
+django==5.1.8 # pyup: < 5.2 # https://www.djangoproject.com/
django-environ==0.12.0 # https://github.com/joke2k/django-environ
django-model-utils==5.0.0 # https://github.com/jazzband/django-model-utils
-django-allauth[mfa]==65.4.1 # https://github.com/pennersr/django-allauth
+django-allauth[mfa]==65.7.0 # https://github.com/pennersr/django-allauth
django-crispy-forms==2.3 # https://github.com/django-crispy-forms/django-crispy-forms
-crispy-bootstrap5==2024.10 # https://github.com/django-crispy-forms/crispy-bootstrap5
+crispy-bootstrap5==2025.4 # https://github.com/django-crispy-forms/crispy-bootstrap5
{%- if cookiecutter.frontend_pipeline == 'Django Compressor' %}
django-compressor==4.5.1 # https://github.com/django-compressor/django-compressor
{%- endif %}
django-redis==5.4.0 # https://github.com/jazzband/django-redis
{%- if cookiecutter.use_drf == 'y' %}
# Django REST Framework
-djangorestframework==3.15.2 # https://github.com/encode/django-rest-framework
+djangorestframework==3.16.0 # https://github.com/encode/django-rest-framework
django-cors-headers==4.7.0 # https://github.com/adamchainz/django-cors-headers
# DRF-spectacular for api documentation
drf-spectacular==0.28.0 # https://github.com/tfranzel/drf-spectacular
diff --git a/{{cookiecutter.project_slug}}/requirements/local.txt b/{{cookiecutter.project_slug}}/requirements/local.txt
index 099b3946c..4f32e422b 100644
--- a/{{cookiecutter.project_slug}}/requirements/local.txt
+++ b/{{cookiecutter.project_slug}}/requirements/local.txt
@@ -3,9 +3,9 @@
Werkzeug[watchdog]==3.1.3 # https://github.com/pallets/werkzeug
ipdb==0.13.13 # https://github.com/gotcha/ipdb
{%- if cookiecutter.use_docker == 'y' %}
-psycopg[c]==3.2.4 # https://github.com/psycopg/psycopg
+psycopg[c]==3.2.6 # https://github.com/psycopg/psycopg
{%- else %}
-psycopg[binary]==3.2.4 # https://github.com/psycopg/psycopg
+psycopg[binary]==3.2.6 # https://github.com/psycopg/psycopg
{%- endif %}
{%- if cookiecutter.use_async == 'y' or cookiecutter.use_celery == 'y' %}
watchfiles==1.0.4 # https://github.com/samuelcolvin/watchfiles
@@ -15,29 +15,29 @@ watchfiles==1.0.4 # https://github.com/samuelcolvin/watchfiles
# ------------------------------------------------------------------------------
mypy==1.15.0 # https://github.com/python/mypy
django-stubs[compatible-mypy]==5.1.3 # https://github.com/typeddjango/django-stubs
-pytest==8.3.4 # https://github.com/pytest-dev/pytest
-pytest-sugar==1.0.0 # https://github.com/Frozenball/pytest-sugar
+pytest==8.3.5 # https://github.com/pytest-dev/pytest
+pytest-sugar==1.0.0 # https://github.com/Teemu/pytest-sugar
{%- if cookiecutter.use_drf == "y" %}
djangorestframework-stubs==3.15.3 # https://github.com/typeddjango/djangorestframework-stubs
{%- endif %}
# Documentation
# ------------------------------------------------------------------------------
-sphinx==8.2.0 # https://github.com/sphinx-doc/sphinx
+sphinx==8.2.3 # pyup: != 8.3.0 # https://github.com/sphinx-doc/sphinx
sphinx-autobuild==2024.10.3 # https://github.com/GaretJax/sphinx-autobuild
# Code quality
# ------------------------------------------------------------------------------
-ruff==0.9.7 # https://github.com/astral-sh/ruff
-coverage==7.6.12 # https://github.com/nedbat/coveragepy
+ruff==0.11.4 # https://github.com/astral-sh/ruff
+coverage==7.8.0 # https://github.com/nedbat/coveragepy
djlint==1.36.4 # https://github.com/Riverside-Healthcare/djLint
-pre-commit==4.1.0 # https://github.com/pre-commit/pre-commit
+pre-commit==4.2.0 # https://github.com/pre-commit/pre-commit
# Django
# ------------------------------------------------------------------------------
factory-boy==3.3.2 # https://github.com/FactoryBoy/factory_boy
-django-debug-toolbar==5.0.1 # https://github.com/jazzband/django-debug-toolbar
+django-debug-toolbar==5.1.0 # https://github.com/jazzband/django-debug-toolbar
django-extensions==3.2.3 # https://github.com/django-extensions/django-extensions
django-coverage-plugin==3.1.0 # https://github.com/nedbat/django_coverage_plugin
-pytest-django==4.10.0 # https://github.com/pytest-dev/pytest-django
+pytest-django==4.11.1 # https://github.com/pytest-dev/pytest-django
diff --git a/{{cookiecutter.project_slug}}/requirements/production.txt b/{{cookiecutter.project_slug}}/requirements/production.txt
index 23d12d23f..df6553a3a 100644
--- a/{{cookiecutter.project_slug}}/requirements/production.txt
+++ b/{{cookiecutter.project_slug}}/requirements/production.txt
@@ -3,12 +3,12 @@
-r base.txt
gunicorn==23.0.0 # https://github.com/benoitc/gunicorn
-psycopg[c]==3.2.4 # https://github.com/psycopg/psycopg
+psycopg[c]==3.2.6 # https://github.com/psycopg/psycopg
{%- if cookiecutter.use_whitenoise == 'n'and cookiecutter.cloud_provider in ('AWS', 'GCP') %}
Collectfasta==3.2.1 # https://github.com/jasongi/collectfasta
{%- endif %}
{%- if cookiecutter.use_sentry == "y" %}
-sentry-sdk==2.22.0 # https://github.com/getsentry/sentry-python
+sentry-sdk==2.25.1 # https://github.com/getsentry/sentry-python
{%- endif %}
{%- if cookiecutter.use_docker == "n" and cookiecutter.windows == "y" %}
hiredis==3.1.0 # https://github.com/redis/hiredis-py
@@ -17,28 +17,28 @@ hiredis==3.1.0 # https://github.com/redis/hiredis-py
# Django
# ------------------------------------------------------------------------------
{%- if cookiecutter.cloud_provider == 'AWS' %}
-django-storages[s3]==1.14.5 # https://github.com/jschneier/django-storages
+django-storages[s3]==1.14.6 # https://github.com/jschneier/django-storages
{%- elif cookiecutter.cloud_provider == 'GCP' %}
-django-storages[google]==1.14.5 # https://github.com/jschneier/django-storages
+django-storages[google]==1.14.6 # https://github.com/jschneier/django-storages
{%- elif cookiecutter.cloud_provider == 'Azure' %}
-django-storages[azure]==1.14.5 # https://github.com/jschneier/django-storages
+django-storages[azure]==1.14.6 # https://github.com/jschneier/django-storages
{%- endif %}
{%- if cookiecutter.mail_service == 'Mailgun' %}
-django-anymail[mailgun]==12.0 # https://github.com/anymail/django-anymail
+django-anymail[mailgun]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Amazon SES' %}
-django-anymail[amazon-ses]==12.0 # https://github.com/anymail/django-anymail
+django-anymail[amazon-ses]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Mailjet' %}
-django-anymail[mailjet]==12.0 # https://github.com/anymail/django-anymail
+django-anymail[mailjet]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Mandrill' %}
-django-anymail[mandrill]==12.0 # https://github.com/anymail/django-anymail
+django-anymail[mandrill]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Postmark' %}
-django-anymail[postmark]==12.0 # https://github.com/anymail/django-anymail
+django-anymail[postmark]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Sendgrid' %}
-django-anymail[sendgrid]==12.0 # https://github.com/anymail/django-anymail
+django-anymail[sendgrid]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Brevo' %}
-django-anymail[brevo]==12.0 # https://github.com/anymail/django-anymail
+django-anymail[brevo]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'SparkPost' %}
-django-anymail[sparkpost]==12.0 # https://github.com/anymail/django-anymail
+django-anymail[sparkpost]==13.0 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Other SMTP' %}
-django-anymail==12.0 # https://github.com/anymail/django-anymail
+django-anymail==13.0 # https://github.com/anymail/django-anymail
{%- endif %}
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/__init__.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/__init__.py
index 1c7ecc894..6b5912444 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/__init__.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/__init__.py
@@ -1,5 +1,5 @@
"""
To understand why this file is here, please read:
-http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
+https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/__init__.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/__init__.py
index 1c7ecc894..6b5912444 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/__init__.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/__init__.py
@@ -1,5 +1,5 @@
"""
To understand why this file is here, please read:
-http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
+https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py
index 85ee2d9c1..df7f47729 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py
@@ -1,7 +1,7 @@
"""
To understand why this file is here, please read:
-http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
+https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""
from django.conf import settings
from django.db import migrations
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/__init__.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/__init__.py
index 1c7ecc894..6b5912444 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/__init__.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/__init__.py
@@ -1,5 +1,5 @@
"""
To understand why this file is here, please read:
-http://cookiecutter-django.readthedocs.io/en/latest/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
+https://cookiecutter-django.readthedocs.io/en/latest/5-help/faq.html#why-is-there-a-django-contrib-sites-directory-in-cookiecutter-django
"""
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/forms.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/forms.py
index 35a70101e..49f837fcd 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/forms.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/forms.py
@@ -17,7 +17,7 @@ class UserAdminChangeForm(admin_forms.UserChangeForm):
{%- endif %}
-class UserAdminCreationForm(admin_forms.UserCreationForm):
+class UserAdminCreationForm(admin_forms.AdminUserCreationForm): # type: ignore[name-defined] # django-stubs is missing the class, thats why the error is thrown: typeddjango/django-stubs#2555
"""
Form for User Creation in the Admin Area.
To change user signup, see UserSignupForm and UserSocialSignupForm.
|