diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md
index da0480f1e..d955c79d4 100644
--- a/.github/ISSUE_TEMPLATE/bug.md
+++ b/.github/ISSUE_TEMPLATE/bug.md
@@ -13,7 +13,6 @@ labels: bug
- Host system configuration:
-
- Version of cookiecutter CLI (get it with `cookiecutter --version`):
- OS name and version:
diff --git a/.github/contributors.json b/.github/contributors.json
index f97aecfea..f28bf7bf4 100644
--- a/.github/contributors.json
+++ b/.github/contributors.json
@@ -1698,5 +1698,55 @@
"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": ""
+ },
+ {
+ "name": "Aidos Kanapyanov",
+ "github_login": "aidoskanapyanov",
+ "twitter_username": ""
+ },
+ {
+ "name": "Jeongseok Kang",
+ "github_login": "rapsealk",
+ "twitter_username": ""
+ },
+ {
+ "name": "Jeff Foster",
+ "github_login": "jeffpfoster",
+ "twitter_username": ""
+ },
+ {
+ "name": "Dominique Plante",
+ "github_login": "dominiqueplante",
+ "twitter_username": ""
+ },
+ {
+ "name": "Lucas Klasa",
+ "github_login": "lucaskbr",
+ "twitter_username": ""
+ },
+ {
+ "name": "DevForsure",
+ "github_login": "DevForsure",
+ "twitter_username": ""
+ },
+ {
+ "name": "Vincent Leduc",
+ "github_login": "leducvin",
+ "twitter_username": ""
+ },
+ {
+ "name": "Martín Blech",
+ "github_login": "martinblech",
+ "twitter_username": ""
}
]
\ No newline at end of file
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 14935baab..8fa3bd109 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -43,6 +43,10 @@ updates:
- "version-update:semver-minor"
labels:
- "update"
+ groups:
+ docker-python:
+ patterns:
+ - "*"
- package-ecosystem: "docker"
directories:
diff --git a/.github/workflows/align-versions.yml b/.github/workflows/align-versions.yml
index 2ded34062..d6dbb5f0f 100644
--- a/.github/workflows/align-versions.yml
+++ b/.github/workflows/align-versions.yml
@@ -14,6 +14,7 @@ permissions:
jobs:
run:
+ if: ${{ github.event_name == 'workflow_dispatch' || github.actor == 'pyup-bot' || github.actor == 'dependabot[bot]' }}
runs-on: ubuntu-latest
env:
GH_PAT: ${{ secrets.GH_PAT }}
@@ -30,22 +31,22 @@ jobs:
name: "${{ matrix.job.name }} versions"
steps:
- name: Checkout with token
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
if: ${{ env.GH_PAT != '' }}
with:
token: ${{ env.GH_PAT }}
ref: ${{ github.head_ref }}
- name: Checkout without token
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
if: ${{ env.GH_PAT == '' }}
with:
ref: ${{ github.head_ref }}
- - uses: astral-sh/setup-uv@v5
+ - uses: astral-sh/setup-uv@v6
- run: uv run ${{ matrix.job.script }}
- - uses: stefanzweifel/git-auto-commit-action@v5
+ - uses: stefanzweifel/git-auto-commit-action@v6
with:
commit_message: Align versions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6efcef8f2..a156d94e3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,7 +2,7 @@ name: CI
on:
push:
- branches: ["master", "main"]
+ branches: ["main"]
pull_request:
concurrency:
@@ -22,9 +22,9 @@ jobs:
name: "pytest ${{ matrix.os }}"
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Install uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
- name: Install dependencies
run: uv sync
- name: Run tests
@@ -51,9 +51,9 @@ jobs:
COMPOSE_DOCKER_CLI_BUILD: 1
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Install uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
- name: Install dependencies
run: uv sync
- name: Docker ${{ matrix.script.name }}
@@ -81,7 +81,7 @@ jobs:
ports:
- 6379:6379
postgres:
- image: postgres:12
+ image: postgres:13
ports:
- 5432:5432
env:
@@ -93,16 +93,16 @@ jobs:
DATABASE_URL: "postgres://postgres:postgres@localhost:5432/postgres"
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
- name: Install dependencies
run: uv sync
- uses: actions/setup-node@v4
with:
- node-version: "22.14"
+ node-version: "24.6"
- name: Bare Metal ${{ matrix.script.name }}
run: sh tests/test_bare.sh ${{ matrix.script.args }}
diff --git a/.github/workflows/dependabot-uv-lock.yml b/.github/workflows/dependabot-uv-lock.yml
index 5a2b5593d..4992c0b3d 100644
--- a/.github/workflows/dependabot-uv-lock.yml
+++ b/.github/workflows/dependabot-uv-lock.yml
@@ -17,17 +17,17 @@ jobs:
GH_PAT: ${{ secrets.GH_PAT }}
steps:
- name: Checkout with token
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
if: ${{ env.GH_PAT != '' }}
with:
token: ${{ env.GH_PAT }}
- name: Checkout without token
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
if: ${{ env.GH_PAT == '' }}
- - uses: astral-sh/setup-uv@v5
+ - uses: astral-sh/setup-uv@v6
- run: uv lock
- - uses: stefanzweifel/git-auto-commit-action@v5
+ - uses: stefanzweifel/git-auto-commit-action@v6
with:
commit_message: Regenerate uv.lock
diff --git a/.github/workflows/django-issue-checker.yml b/.github/workflows/django-issue-checker.yml
index d0a3c2709..aa904c089 100644
--- a/.github/workflows/django-issue-checker.yml
+++ b/.github/workflows/django-issue-checker.yml
@@ -16,9 +16,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Install uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
- name: Create Django Major Issue
run: uv run --frozen scripts/create_django_issue.py
env:
diff --git a/.github/workflows/pre-commit-autoupdate.yml b/.github/workflows/pre-commit-autoupdate.yml
index ebd092859..42b287da8 100644
--- a/.github/workflows/pre-commit-autoupdate.yml
+++ b/.github/workflows/pre-commit-autoupdate.yml
@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: "3.12"
diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml
index 18f55af09..e5eab0c85 100644
--- a/.github/workflows/update-changelog.yml
+++ b/.github/workflows/update-changelog.yml
@@ -14,9 +14,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Install uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
- name: Set git details
run: |
git config --global user.name "github-actions"
diff --git a/.github/workflows/update-contributors.yml b/.github/workflows/update-contributors.yml
index d5c426e0f..136906407 100644
--- a/.github/workflows/update-contributors.yml
+++ b/.github/workflows/update-contributors.yml
@@ -3,7 +3,7 @@ name: Update Contributors
on:
push:
branches:
- - master
+ - main
permissions:
contents: read
@@ -17,16 +17,16 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Install uv
- uses: astral-sh/setup-uv@v5
+ uses: astral-sh/setup-uv@v6
- name: Update list
run: uv run --frozen scripts/update_contributors.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Commit changes
- uses: stefanzweifel/git-auto-commit-action@v5.0.1
+ uses: stefanzweifel/git-auto-commit-action@v6
with:
commit_message: Update Contributors
file_pattern: CONTRIBUTORS.md .github/contributors.json
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0b8ac5775..15c4a885a 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -7,7 +7,7 @@ default_language_version:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v5.0.0
+ rev: v6.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
@@ -34,7 +34,7 @@ repos:
- id: ruff-format
- repo: https://github.com/tox-dev/pyproject-fmt
- rev: "v2.5.0"
+ rev: "v2.6.0"
hooks:
- id: pyproject-fmt
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5b1fd46a5..1a29b02f9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,682 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
+## 2025.08.21
+
+
+### Updated
+
+- Update ruff to 0.12.10 ([#5983](https://github.com/cookiecutter/cookiecutter-django/pull/5983))
+
+## 2025.08.18
+
+
+### Updated
+
+- Bump node from 24.5 to 24.6 ([#5981](https://github.com/cookiecutter/cookiecutter-django/pull/5981))
+
+- Update coverage to 7.10.4 ([#5980](https://github.com/cookiecutter/cookiecutter-django/pull/5980))
+
+- Update pytest-sugar to 1.1.0 ([#5979](https://github.com/cookiecutter/cookiecutter-django/pull/5979))
+
+## 2025.08.15
+
+
+### Updated
+
+- Update django-allauth to 65.11.0 ([#5977](https://github.com/cookiecutter/cookiecutter-django/pull/5977))
+
+- Update sentry-sdk to 2.35.0 ([#5976](https://github.com/cookiecutter/cookiecutter-django/pull/5976))
+
+## 2025.08.14
+
+
+### Updated
+
+- Update ruff to 0.12.9 ([#5975](https://github.com/cookiecutter/cookiecutter-django/pull/5975))
+
+## 2025.08.13
+
+
+### Fixed
+
+- Fix imagemin corruption with Gulp ([#5974](https://github.com/cookiecutter/cookiecutter-django/pull/5974))
+
+## 2025.08.12
+
+
+### Updated
+
+- Update coverage to 7.10.3 ([#5972](https://github.com/cookiecutter/cookiecutter-django/pull/5972))
+
+## 2025.08.10
+
+
+### Updated
+
+- Update pre-commit to 4.3.0 ([#5971](https://github.com/cookiecutter/cookiecutter-django/pull/5971))
+
+- Auto-update pre-commit hooks ([#5970](https://github.com/cookiecutter/cookiecutter-django/pull/5970))
+
+## 2025.08.08
+
+
+### Changed
+
+- Remove `project.css` when a bundler is used ([#5874](https://github.com/cookiecutter/cookiecutter-django/pull/5874))
+
+### Updated
+
+- Update redis to 6.4.0 ([#5968](https://github.com/cookiecutter/cookiecutter-django/pull/5968))
+
+- Update ruff to 0.12.8 ([#5969](https://github.com/cookiecutter/cookiecutter-django/pull/5969))
+
+## 2025.08.07
+
+
+### Updated
+
+- Update djangorestframework to 3.16.1 ([#5966](https://github.com/cookiecutter/cookiecutter-django/pull/5966))
+
+## 2025.08.06
+
+
+### Updated
+
+- Update coverage to 7.10.2 ([#5964](https://github.com/cookiecutter/cookiecutter-django/pull/5964))
+
+- Update redis to 6.3.0 ([#5963](https://github.com/cookiecutter/cookiecutter-django/pull/5963))
+
+## 2025.08.05
+
+
+### Changed
+
+- Rename `master` branch to `main` ([#5961](https://github.com/cookiecutter/cookiecutter-django/pull/5961))
+
+### Updated
+
+- Bump node from 22.14 to 24.5 in local Docker image ([#5960](https://github.com/cookiecutter/cookiecutter-django/pull/5960))
+
+## 2025.08.01
+
+
+### Updated
+
+- Update django-debug-toolbar to 6.0.0 ([#5945](https://github.com/cookiecutter/cookiecutter-django/pull/5945))
+
+- Bump amazon/aws-cli from 2.27.12 to 2.28.0 ([#5957](https://github.com/cookiecutter/cookiecutter-django/pull/5957))
+
+- Update mypy to 1.17.1 ([#5956](https://github.com/cookiecutter/cookiecutter-django/pull/5956))
+
+## 2025.07.30
+
+
+### Changed
+
+- docs: remove `$` from shell command examples for easier copy-pasting ([#5948](https://github.com/cookiecutter/cookiecutter-django/pull/5948))
+
+### Updated
+
+- Update sentry-sdk to 2.34.1 ([#5955](https://github.com/cookiecutter/cookiecutter-django/pull/5955))
+
+- Update ruff to 0.12.7 ([#5952](https://github.com/cookiecutter/cookiecutter-django/pull/5952))
+
+## 2025.07.27
+
+
+### Updated
+
+- Update coverage to 7.10.1 ([#5947](https://github.com/cookiecutter/cookiecutter-django/pull/5947))
+
+## 2025.07.25
+
+
+### Updated
+
+- Update django-anymail to 13.0.1 ([#5946](https://github.com/cookiecutter/cookiecutter-django/pull/5946))
+
+## 2025.07.24
+
+
+### Updated
+
+- Update coverage to 7.10.0 ([#5944](https://github.com/cookiecutter/cookiecutter-django/pull/5944))
+
+- Update ruff to 0.12.5 ([#5943](https://github.com/cookiecutter/cookiecutter-django/pull/5943))
+
+- Bump traefik from 3.4.4 to 3.5.0 ([#5942](https://github.com/cookiecutter/cookiecutter-django/pull/5942))
+
+## 2025.07.22
+
+
+### Updated
+
+- Update sentry-sdk to 2.33.2 ([#5941](https://github.com/cookiecutter/cookiecutter-django/pull/5941))
+
+## 2025.07.21
+
+
+### Updated
+
+- Update sentry-sdk to 2.33.1 ([#5940](https://github.com/cookiecutter/cookiecutter-django/pull/5940))
+
+## 2025.07.18
+
+
+### Updated
+
+- Update mypy to 1.17.0 ([#5937](https://github.com/cookiecutter/cookiecutter-django/pull/5937))
+
+- Update django-stubs to 5.2.2 ([#5936](https://github.com/cookiecutter/cookiecutter-django/pull/5936))
+
+## 2025.07.17
+
+
+### Updated
+
+- Update ruff to 0.12.4 ([#5935](https://github.com/cookiecutter/cookiecutter-django/pull/5935))
+
+## 2025.07.16
+
+
+### Updated
+
+- Update sentry-sdk to 2.33.0 ([#5933](https://github.com/cookiecutter/cookiecutter-django/pull/5933))
+
+## 2025.07.15
+
+
+### Updated
+
+- Update mypy to 1.16.1 ([#5901](https://github.com/cookiecutter/cookiecutter-django/pull/5901))
+
+- Bump traefik from 3.4.3 to 3.4.4 ([#5930](https://github.com/cookiecutter/cookiecutter-django/pull/5930))
+
+## 2025.07.14
+
+
+### Changed
+
+- Fix howto docker command ([#5929](https://github.com/cookiecutter/cookiecutter-django/pull/5929))
+
+## 2025.07.11
+
+
+### Updated
+
+- Update ruff to 0.12.3 ([#5928](https://github.com/cookiecutter/cookiecutter-django/pull/5928))
+
+- Update django-allauth to 65.10.0 ([#5927](https://github.com/cookiecutter/cookiecutter-django/pull/5927))
+
+## 2025.07.05
+
+
+### Updated
+
+- Update coverage to 7.9.2 ([#5925](https://github.com/cookiecutter/cookiecutter-django/pull/5925))
+
+## 2025.07.04
+
+
+### Updated
+
+- Update ruff to 0.12.2 ([#5923](https://github.com/cookiecutter/cookiecutter-django/pull/5923))
+
+## 2025.07.02
+
+
+### Updated
+
+- Update pillow to 11.3.0 ([#5921](https://github.com/cookiecutter/cookiecutter-django/pull/5921))
+
+## 2025.06.30
+
+
+### Updated
+
+- Bump traefik from 3.4.1 to 3.4.3 ([#5917](https://github.com/cookiecutter/cookiecutter-django/pull/5917))
+
+- Update uvicorn to 0.35.0 ([#5919](https://github.com/cookiecutter/cookiecutter-django/pull/5919))
+
+- Update sentry-sdk to 2.32.0 ([#5918](https://github.com/cookiecutter/cookiecutter-django/pull/5918))
+
+## 2025.06.26
+
+
+### Updated
+
+- Update ruff to 0.12.1 ([#5916](https://github.com/cookiecutter/cookiecutter-django/pull/5916))
+
+## 2025.06.24
+
+
+### Updated
+
+- Update sentry-sdk to 2.31.0 ([#5912](https://github.com/cookiecutter/cookiecutter-django/pull/5912))
+
+## 2025.06.19
+
+
+### Updated
+
+- Update pytest to 8.4.1 ([#5907](https://github.com/cookiecutter/cookiecutter-django/pull/5907))
+
+## 2025.06.18
+
+
+### Updated
+
+- Update ruff to 0.12.0 ([#5904](https://github.com/cookiecutter/cookiecutter-django/pull/5904))
+
+- Update django-stubs to 5.2.1 ([#5905](https://github.com/cookiecutter/cookiecutter-django/pull/5905))
+
+- Update django-redis to 6.0.0 ([#5903](https://github.com/cookiecutter/cookiecutter-django/pull/5903))
+
+- Update django-webpack-loader to 3.2.1 ([#5902](https://github.com/cookiecutter/cookiecutter-django/pull/5902))
+
+## 2025.06.17
+
+
+### Updated
+
+- Update django-coverage-plugin to 3.1.1 ([#5900](https://github.com/cookiecutter/cookiecutter-django/pull/5900))
+
+- Update watchfiles to 1.1.0 ([#5899](https://github.com/cookiecutter/cookiecutter-django/pull/5899))
+
+## 2025.06.15
+
+
+### Updated
+
+- Update coverage to 7.9.1 ([#5898](https://github.com/cookiecutter/cookiecutter-django/pull/5898))
+
+## 2025.06.13
+
+
+### Updated
+
+- Update coverage to 7.9.0 ([#5897](https://github.com/cookiecutter/cookiecutter-django/pull/5897))
+
+- Update sentry-sdk to 2.30.0 ([#5896](https://github.com/cookiecutter/cookiecutter-django/pull/5896))
+
+## 2025.06.11
+
+
+### Updated
+
+- Update collectfasta to 3.3.0 ([#5892](https://github.com/cookiecutter/cookiecutter-django/pull/5892))
+
+## 2025.06.10
+
+
+### Updated
+
+- Update django to 5.1.11 ([#5891](https://github.com/cookiecutter/cookiecutter-django/pull/5891))
+
+- Update crispy-bootstrap5 to 2025.6 ([#5888](https://github.com/cookiecutter/cookiecutter-django/pull/5888))
+
+## 2025.06.06
+
+
+### Updated
+
+- Update ruff to 0.11.13 ([#5887](https://github.com/cookiecutter/cookiecutter-django/pull/5887))
+
+## 2025.06.05
+
+
+### Updated
+
+- Bump python from 3.12.10 to 3.12.11 in docs Docker ([#5883](https://github.com/cookiecutter/cookiecutter-django/pull/5883))
+
+- Bump python from 3.12.10 to 3.12.11 in production Docker ([#5884](https://github.com/cookiecutter/cookiecutter-django/pull/5884))
+
+- Bump python from 3.12.10 3.12.11 in local Docker ([#5885](https://github.com/cookiecutter/cookiecutter-django/pull/5885))
+
+- Update django to 5.1.10 ([#5882](https://github.com/cookiecutter/cookiecutter-django/pull/5882))
+
+## 2025.06.04
+
+
+### Updated
+
+- Update argon2-cffi to 25.1.0 ([#5880](https://github.com/cookiecutter/cookiecutter-django/pull/5880))
+
+- Update pytest to 8.4.0 ([#5881](https://github.com/cookiecutter/cookiecutter-django/pull/5881))
+
+## 2025.06.02
+
+
+### Updated
+
+- Update django-allauth to 65.9.0 ([#5879](https://github.com/cookiecutter/cookiecutter-django/pull/5879))
+
+- Update uvicorn to 0.34.3 ([#5878](https://github.com/cookiecutter/cookiecutter-django/pull/5878))
+
+- Update celery to 5.5.3 ([#5877](https://github.com/cookiecutter/cookiecutter-django/pull/5877))
+
+- Update ruff to 0.11.12 ([#5872](https://github.com/cookiecutter/cookiecutter-django/pull/5872))
+
+## 2025.05.28
+
+
+### Updated
+
+- Update redis to 6.2.0 ([#5871](https://github.com/cookiecutter/cookiecutter-django/pull/5871))
+
+- Bump traefik from 3.4.0 to 3.4.1 ([#5870](https://github.com/cookiecutter/cookiecutter-django/pull/5870))
+
+## 2025.05.27
+
+
+### Updated
+
+- Update coverage to 7.8.2 ([#5868](https://github.com/cookiecutter/cookiecutter-django/pull/5868))
+
+- Update hiredis to 3.2.1 ([#5867](https://github.com/cookiecutter/cookiecutter-django/pull/5867))
+
+## 2025.05.24
+
+
+### Updated
+
+- Auto-update pre-commit hooks ([#5866](https://github.com/cookiecutter/cookiecutter-django/pull/5866))
+
+## 2025.05.23
+
+
+### Updated
+
+- Update hiredis to 3.2.0 ([#5864](https://github.com/cookiecutter/cookiecutter-django/pull/5864))
+
+- Update ruff to 0.11.11 ([#5865](https://github.com/cookiecutter/cookiecutter-django/pull/5865))
+
+## 2025.05.22
+
+
+### Changed
+
+- Remove pin for fido2 library ([#5861](https://github.com/cookiecutter/cookiecutter-django/pull/5861))
+
+### Updated
+
+- Update coverage to 7.8.1 ([#5860](https://github.com/cookiecutter/cookiecutter-django/pull/5860))
+
+- Update django-allauth to 65.8.1 ([#5859](https://github.com/cookiecutter/cookiecutter-django/pull/5859))
+
+## 2025.05.21
+
+
+### Updated
+
+- Auto-update pre-commit hooks ([#5858](https://github.com/cookiecutter/cookiecutter-django/pull/5858))
+
+## 2025.05.20
+
+
+### Fixed
+
+- Pin fido2<2 ([#5854](https://github.com/cookiecutter/cookiecutter-django/pull/5854))
+
+### Updated
+
+- Update sentry-sdk to 2.29.1 ([#5853](https://github.com/cookiecutter/cookiecutter-django/pull/5853))
+
+- Update django-webpack-loader to 3.2.0 ([#5852](https://github.com/cookiecutter/cookiecutter-django/pull/5852))
+
+## 2025.05.16
+
+
+### Updated
+
+- Update django-celery-beat to 2.8.1 ([#5841](https://github.com/cookiecutter/cookiecutter-django/pull/5841))
+
+- Update ruff to 0.11.10 ([#5847](https://github.com/cookiecutter/cookiecutter-django/pull/5847))
+
+## 2025.05.14
+
+
+### Updated
+
+- Auto-update pre-commit hooks ([#5846](https://github.com/cookiecutter/cookiecutter-django/pull/5846))
+
+## 2025.05.13
+
+
+### Changed
+
+- Remove redundant `use_celery` condition in local compose file ([#5845](https://github.com/cookiecutter/cookiecutter-django/pull/5845))
+
+### Updated
+
+- Update psycopg to 3.2.9 ([#5844](https://github.com/cookiecutter/cookiecutter-django/pull/5844))
+
+- Update redis to 6.1.0 ([#5842](https://github.com/cookiecutter/cookiecutter-django/pull/5842))
+
+## 2025.05.12
+
+
+### Changed
+
+- Remove extra spaces in Dockerfile `COPY` instruction paths ([#5822](https://github.com/cookiecutter/cookiecutter-django/pull/5822))
+
+- Add support for PostgreSQL 17 ([#5805](https://github.com/cookiecutter/cookiecutter-django/pull/5805))
+
+### Fixed
+
+- Fix media folder permissions prod dockerfile ([#5831](https://github.com/cookiecutter/cookiecutter-django/pull/5831))
+
+### Updated
+
+- Update sentry-sdk to 2.28.0 ([#5839](https://github.com/cookiecutter/cookiecutter-django/pull/5839))
+
+- Update djangorestframework-stubs to 3.16.0 ([#5806](https://github.com/cookiecutter/cookiecutter-django/pull/5806))
+
+- Bump traefik from 3.3.5 to 3.4.0 ([#5824](https://github.com/cookiecutter/cookiecutter-django/pull/5824))
+
+- Bump python from 3.12.9 to 3.12.10 in production Dockerfile ([#5774](https://github.com/cookiecutter/cookiecutter-django/pull/5774))
+
+- Bump python from 3.12.9 to 3.12.10 in docs Dockerfile ([#5773](https://github.com/cookiecutter/cookiecutter-django/pull/5773))
+
+- Bump python from 3.12.9 to 3.12.10 local Dockerfile ([#5772](https://github.com/cookiecutter/cookiecutter-django/pull/5772))
+
+- Update redis to 6.0.0 ([#5814](https://github.com/cookiecutter/cookiecutter-django/pull/5814))
+
+- Update psycopg to 3.2.8 ([#5836](https://github.com/cookiecutter/cookiecutter-django/pull/5836))
+
+- Update django-stubs to 5.2.0 ([#5804](https://github.com/cookiecutter/cookiecutter-django/pull/5804))
+
+- Bump amazon/aws-cli from 2.25.0 to 2.27.12 ([#5838](https://github.com/cookiecutter/cookiecutter-django/pull/5838))
+
+- Update ruff to 0.11.9 ([#5834](https://github.com/cookiecutter/cookiecutter-django/pull/5834))
+
+- Update hiredis to 3.1.1 ([#5833](https://github.com/cookiecutter/cookiecutter-django/pull/5833))
+
+## 2025.05.09
+
+
+### Updated
+
+- Update django-debug-toolbar to 5.2.0 ([#5816](https://github.com/cookiecutter/cookiecutter-django/pull/5816))
+
+- Update django-allauth to 65.8.0 ([#5830](https://github.com/cookiecutter/cookiecutter-django/pull/5830))
+
+- Update django to 5.1.9 ([#5828](https://github.com/cookiecutter/cookiecutter-django/pull/5828))
+
+## 2025.05.02
+
+
+### Updated
+
+- Update ruff to 0.11.8 ([#5819](https://github.com/cookiecutter/cookiecutter-django/pull/5819))
+
+## 2025.04.30
+
+
+### Updated
+
+- Update celery to 5.5.2 ([#5803](https://github.com/cookiecutter/cookiecutter-django/pull/5803))
+
+- Update ruff to 0.11.7 ([#5815](https://github.com/cookiecutter/cookiecutter-django/pull/5815))
+
+- Update sentry-sdk to 2.27.0 ([#5799](https://github.com/cookiecutter/cookiecutter-django/pull/5799))
+
+- Update uvicorn to 0.34.2 ([#5791](https://github.com/cookiecutter/cookiecutter-django/pull/5791))
+
+- Update django-crispy-forms to 2.4 ([#5780](https://github.com/cookiecutter/cookiecutter-django/pull/5780))
+
+- Update pillow to 11.2.1 ([#5779](https://github.com/cookiecutter/cookiecutter-django/pull/5779))
+
+- Update django-extensions to 4.1 ([#5776](https://github.com/cookiecutter/cookiecutter-django/pull/5776))
+
+- Update watchfiles to 1.0.5 ([#5771](https://github.com/cookiecutter/cookiecutter-django/pull/5771))
+
+- Update ruff to 0.11.6 ([#5789](https://github.com/cookiecutter/cookiecutter-django/pull/5789))
+
+- Update psycopg to 3.2.7 ([#5811](https://github.com/cookiecutter/cookiecutter-django/pull/5811))
+
+- Update redis to 5.3.0 ([#5813](https://github.com/cookiecutter/cookiecutter-django/pull/5813))
+
+## 2025.04.08
+
+
+### Updated
+
+- Update django-extensions to 4.0 ([#5770](https://github.com/cookiecutter/cookiecutter-django/pull/5770))
+
+## 2025.04.05
+
+
+### Changed
+
+- Add Docker build caching on GitHub Actions ([#5700](https://github.com/cookiecutter/cookiecutter-django/pull/5700))
+
+- Pin Pillow and Sphinx to non yanked release ([#5765](https://github.com/cookiecutter/cookiecutter-django/pull/5765))
+
+### Updated
+
+- Update ruff to 0.11.4 ([#5767](https://github.com/cookiecutter/cookiecutter-django/pull/5767))
+
+## 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
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e6bf04061..b8a926794 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -14,7 +14,7 @@ Always happy to get issues identified and pull requests!
2. Clone your fork
3. Create a branch for your changes
-This last step is very important, don't start developing from master, it'll cause pain if you need to send another change later.
+This last step is very important, don't start developing from main, it'll cause pain if you need to send another change later.
## Testing
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 36912e89e..363d1d714 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -201,6 +201,13 @@ Listed in alphabetical order.
Vitaly Babiy |
diff --git a/README.md b/README.md
index a46f214b4..903b34570 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
# Cookiecutter Django
-[](https://github.com/cookiecutter/cookiecutter-django/actions/workflows/ci.yml?query=branch%3Amaster)
+[](https://github.com/cookiecutter/cookiecutter-django/actions/workflows/ci.yml?query=branch%3Amain)
[](https://cookiecutter-django.readthedocs.io/en/latest/?badge=latest)
-[](https://results.pre-commit.ci/latest/github/cookiecutter/cookiecutter-django/master)
+[](https://results.pre-commit.ci/latest/github/cookiecutter/cookiecutter-django/main)
[](https://github.com/ambv/black)
[](https://pyup.io/repos/github/cookiecutter/cookiecutter-django/)
@@ -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 - 17 ([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!
@@ -84,11 +84,11 @@ and then editing the results to include your name, email, and various configurat
First, get Cookiecutter. Trust me, it's awesome:
- $ pip install "cookiecutter>=1.7.0"
+ pip install "cookiecutter>=1.7.0"
Now run it against this repo:
- $ cookiecutter https://github.com/cookiecutter/cookiecutter-django
+ cookiecutter https://github.com/cookiecutter/cookiecutter-django
You'll be prompted for some values. Provide them, then a Django project will be created for you.
@@ -129,11 +129,11 @@ Answer the prompts with your own desired [options](http://cookiecutter-django.re
Choose from 1, 2, 3 [1]: 1
use_docker [n]: n
Select postgresql_version:
- 1 - 16
- 2 - 15
- 3 - 14
- 4 - 13
- 5 - 12
+ 1 - 17
+ 2 - 16
+ 3 - 15
+ 4 - 14
+ 5 - 13
Choose from 1, 2, 3, 4, 5 [1]: 1
Select cloud_provider:
1 - AWS
@@ -175,16 +175,16 @@ Answer the prompts with your own desired [options](http://cookiecutter-django.re
Enter the project and take a look around:
- $ cd reddit/
- $ ls
+ cd reddit/
+ ls
Create a git repo and push it there:
- $ git init
- $ git add .
- $ git commit -m "first awesome commit"
- $ git remote add origin git@github.com:pydanny/redditclone.git
- $ git push -u origin master
+ git init
+ git add .
+ git commit -m "first awesome commit"
+ git remote add origin git@github.com:pydanny/redditclone.git
+ git push -u origin main
Now take a look at your repo. Don't forget to carefully look at the generated README. Awesome, right?
diff --git a/cookiecutter.json b/cookiecutter.json
index 86e44f368..4771f496c 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": ["17", "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..8ae041580 100644
--- a/docs/1-getting-started/project-generation-options.rst
+++ b/docs/1-getting-started/project-generation-options.rst
@@ -66,11 +66,11 @@ use_docker:
postgresql_version:
Select a PostgreSQL_ version to use. The choices are:
- 1. 16
- 2. 15
- 3. 14
- 4. 13
- 5. 12
+ 1. 17
+ 2. 16
+ 3. 15
+ 4. 14
+ 5. 13
cloud_provider:
Select a cloud provider for static & media files. The choices are:
diff --git a/docs/5-help/faq.rst b/docs/5-help/faq.rst
index 294e6c8e1..5b4e824f5 100644
--- a/docs/5-help/faq.rst
+++ b/docs/5-help/faq.rst
@@ -10,7 +10,7 @@ It is there to add a migration so you don't have to manually change the ``sites.
See `0003_set_site_domain_and_name.py`_.
-.. _`0003_set_site_domain_and_name.py`: https://github.com/cookiecutter/cookiecutter-django/blob/master/%7B%7Bcookiecutter.project_slug%7D%7D/%7B%7Bcookiecutter.project_slug%7D%7D/contrib/sites/migrations/0003_set_site_domain_and_name.py
+.. _`0003_set_site_domain_and_name.py`: https://github.com/cookiecutter/cookiecutter-django/blob/main/%7B%7Bcookiecutter.project_slug%7D%7D/%7B%7Bcookiecutter.project_slug%7D%7D/contrib/sites/migrations/0003_set_site_domain_and_name.py
Why aren't you using just one configuration file (12-Factor App)
diff --git a/docs/6-about/maintainer-guide.md b/docs/6-about/maintainer-guide.md
index 9baac688a..fa9dfa95a 100644
--- a/docs/6-about/maintainer-guide.md
+++ b/docs/6-about/maintainer-guide.md
@@ -96,9 +96,9 @@ With that in mind, when merging changes, it's a good idea to set the labels and
`update-contributors.yml`
-Runs on each push to master branch. List the 5 most recently merged pull requests and extract their author. If any of the authors is a new one, updates the `.github/contributors.json`, regenerate the `CONTRIBUTORS.md` from it, and push back the changes to master.
+Runs on each push to main branch. List the 5 most recently merged pull requests and extract their author. If any of the authors is a new one, updates the `.github/contributors.json`, regenerate the `CONTRIBUTORS.md` from it, and push back the changes to master.
#### Limitations
-- If you merge a pull request from a new contributor, and merge another one right after, the push to master will fail as the remote will be out of date.
+- If you merge a pull request from a new contributor, and merge another one right after, the push to main will fail as the remote will be out of date.
- If you merge more than 5 pull requests in a row like this, the new contributor might fail to be added.
diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py
index 2de3612b2..7ef449420 100644
--- a/hooks/post_gen_project.py
+++ b/hooks/post_gen_project.py
@@ -7,7 +7,7 @@ from pathlib import Path
try:
# Inspired by
- # https://github.com/django/django/blob/master/django/utils/crypto.py
+ # https://github.com/django/django/blob/main/django/utils/crypto.py
random = random.SystemRandom()
using_sysrandom = True
except NotImplementedError:
@@ -107,6 +107,12 @@ def remove_vendors_js():
vendors_js_path.unlink()
+def remove_project_css():
+ project_css_path = Path("{{ cookiecutter.project_slug }}", "static", "css", "project.css")
+ if project_css_path.exists():
+ project_css_path.unlink()
+
+
def remove_packagejson_file():
file_names = ["package.json"]
for file_name in file_names:
@@ -457,6 +463,7 @@ def main(): # noqa: C901, PLR0912, PLR0915
if "{{ cookiecutter.use_docker }}".lower() == "y":
remove_node_dockerfile()
else:
+ remove_project_css()
handle_js_runner(
"{{ cookiecutter.frontend_pipeline }}",
use_docker=("{{ cookiecutter.use_docker }}".lower() == "y"),
diff --git a/pyproject.toml b/pyproject.toml
index 193e25749..e1e5834fb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "cookiecutter-django"
-version = "2025.03.08"
+version = "2025.08.21"
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.11.0",
+ "ruff==0.12.10",
"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 bbd0c209a..f2be7ac13 100755
--- a/tests/test_cookiecutter_generation.py
+++ b/tests/test_cookiecutter_generation.py
@@ -59,11 +59,11 @@ SUPPORTED_COMBINATIONS = [
{"editor": "VS Code"},
{"use_docker": "y"},
{"use_docker": "n"},
+ {"postgresql_version": "17"},
{"postgresql_version": "16"},
{"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"},
diff --git a/uv.lock b/uv.lock
index ef5350e12..abe2661ad 100644
--- a/uv.lock
+++ b/uv.lock
@@ -182,7 +182,7 @@ wheels = [
[[package]]
name = "cookiecutter-django"
-version = "2025.3.8"
+version = "2025.8.21"
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.11.0" },
+ { name = "ruff", specifier = "==0.12.10" },
{ name = "sh", marker = "sys_platform != 'win23'", specifier = "==2.1" },
{ name = "tox", specifier = "==4.23.2" },
{ name = "tox-uv", specifier = ">=1.17" },
@@ -830,27 +830,28 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.11.0"
+version = "0.12.10"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/77/2b/7ca27e854d92df5e681e6527dc0f9254c9dc06c8408317893cf96c851cdd/ruff-0.11.0.tar.gz", hash = "sha256:e55c620690a4a7ee6f1cccb256ec2157dc597d109400ae75bbf944fc9d6462e2", size = 3799407 }
+sdist = { url = "https://files.pythonhosted.org/packages/3b/eb/8c073deb376e46ae767f4961390d17545e8535921d2f65101720ed8bd434/ruff-0.12.10.tar.gz", hash = "sha256:189ab65149d11ea69a2d775343adf5f49bb2426fc4780f65ee33b423ad2e47f9", size = 5310076 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/48/40/3d0340a9e5edc77d37852c0cd98c5985a5a8081fc3befaeb2ae90aaafd2b/ruff-0.11.0-py3-none-linux_armv6l.whl", hash = "sha256:dc67e32bc3b29557513eb7eeabb23efdb25753684b913bebb8a0c62495095acb", size = 10098158 },
- { url = "https://files.pythonhosted.org/packages/ec/a9/d8f5abb3b87b973b007649ac7bf63665a05b2ae2b2af39217b09f52abbbf/ruff-0.11.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38c23fd9bdec4eb437b4c1e3595905a0a8edfccd63a790f818b28c78fe345639", size = 10879071 },
- { url = "https://files.pythonhosted.org/packages/ab/62/aaa198614c6211677913ec480415c5e6509586d7b796356cec73a2f8a3e6/ruff-0.11.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7c8661b0be91a38bd56db593e9331beaf9064a79028adee2d5f392674bbc5e88", size = 10247944 },
- { url = "https://files.pythonhosted.org/packages/9f/52/59e0a9f2cf1ce5e6cbe336b6dd0144725c8ea3b97cac60688f4e7880bf13/ruff-0.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6c0e8d3d2db7e9f6efd884f44b8dc542d5b6b590fc4bb334fdbc624d93a29a2", size = 10421725 },
- { url = "https://files.pythonhosted.org/packages/a6/c3/dcd71acc6dff72ce66d13f4be5bca1dbed4db678dff2f0f6f307b04e5c02/ruff-0.11.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c3156d3f4b42e57247275a0a7e15a851c165a4fc89c5e8fa30ea6da4f7407b8", size = 9954435 },
- { url = "https://files.pythonhosted.org/packages/a6/9a/342d336c7c52dbd136dee97d4c7797e66c3f92df804f8f3b30da59b92e9c/ruff-0.11.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:490b1e147c1260545f6d041c4092483e3f6d8eba81dc2875eaebcf9140b53905", size = 11492664 },
- { url = "https://files.pythonhosted.org/packages/84/35/6e7defd2d7ca95cc385ac1bd9f7f2e4a61b9cc35d60a263aebc8e590c462/ruff-0.11.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1bc09a7419e09662983b1312f6fa5dab829d6ab5d11f18c3760be7ca521c9329", size = 12207856 },
- { url = "https://files.pythonhosted.org/packages/22/78/da669c8731bacf40001c880ada6d31bcfb81f89cc996230c3b80d319993e/ruff-0.11.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcfa478daf61ac8002214eb2ca5f3e9365048506a9d52b11bea3ecea822bb844", size = 11645156 },
- { url = "https://files.pythonhosted.org/packages/ee/47/e27d17d83530a208f4a9ab2e94f758574a04c51e492aa58f91a3ed7cbbcb/ruff-0.11.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fbb2aed66fe742a6a3a0075ed467a459b7cedc5ae01008340075909d819df1e", size = 13884167 },
- { url = "https://files.pythonhosted.org/packages/9f/5e/42ffbb0a5d4b07bbc642b7d58357b4e19a0f4774275ca6ca7d1f7b5452cd/ruff-0.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c0c1ff014351c0b0cdfdb1e35fa83b780f1e065667167bb9502d47ca41e6db", size = 11348311 },
- { url = "https://files.pythonhosted.org/packages/c8/51/dc3ce0c5ce1a586727a3444a32f98b83ba99599bb1ebca29d9302886e87f/ruff-0.11.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e4fd5ff5de5f83e0458a138e8a869c7c5e907541aec32b707f57cf9a5e124445", size = 10305039 },
- { url = "https://files.pythonhosted.org/packages/60/e0/475f0c2f26280f46f2d6d1df1ba96b3399e0234cf368cc4c88e6ad10dcd9/ruff-0.11.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:96bc89a5c5fd21a04939773f9e0e276308be0935de06845110f43fd5c2e4ead7", size = 9937939 },
- { url = "https://files.pythonhosted.org/packages/e2/d3/3e61b7fd3e9cdd1e5b8c7ac188bec12975c824e51c5cd3d64caf81b0331e/ruff-0.11.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a9352b9d767889ec5df1483f94870564e8102d4d7e99da52ebf564b882cdc2c7", size = 10923259 },
- { url = "https://files.pythonhosted.org/packages/30/32/cd74149ebb40b62ddd14bd2d1842149aeb7f74191fb0f49bd45c76909ff2/ruff-0.11.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:049a191969a10897fe052ef9cc7491b3ef6de79acd7790af7d7897b7a9bfbcb6", size = 11406212 },
- { url = "https://files.pythonhosted.org/packages/00/ef/033022a6b104be32e899b00de704d7c6d1723a54d4c9e09d147368f14b62/ruff-0.11.0-py3-none-win32.whl", hash = "sha256:3191e9116b6b5bbe187447656f0c8526f0d36b6fd89ad78ccaad6bdc2fad7df2", size = 10310905 },
- { url = "https://files.pythonhosted.org/packages/ed/8a/163f2e78c37757d035bd56cd60c8d96312904ca4a6deeab8442d7b3cbf89/ruff-0.11.0-py3-none-win_amd64.whl", hash = "sha256:c58bfa00e740ca0a6c43d41fb004cd22d165302f360aaa56f7126d544db31a21", size = 11411730 },
- { url = "https://files.pythonhosted.org/packages/4e/f7/096f6efabe69b49d7ca61052fc70289c05d8d35735c137ef5ba5ef423662/ruff-0.11.0-py3-none-win_arm64.whl", hash = "sha256:868364fc23f5aa122b00c6f794211e85f7e78f5dffdf7c590ab90b8c4e69b657", size = 10538956 },
+ { url = "https://files.pythonhosted.org/packages/24/e7/560d049d15585d6c201f9eeacd2fd130def3741323e5ccf123786e0e3c95/ruff-0.12.10-py3-none-linux_armv6l.whl", hash = "sha256:8b593cb0fb55cc8692dac7b06deb29afda78c721c7ccfed22db941201b7b8f7b", size = 11935161 },
+ { url = "https://files.pythonhosted.org/packages/d1/b0/ad2464922a1113c365d12b8f80ed70fcfb39764288ac77c995156080488d/ruff-0.12.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ebb7333a45d56efc7c110a46a69a1b32365d5c5161e7244aaf3aa20ce62399c1", size = 12660884 },
+ { url = "https://files.pythonhosted.org/packages/d7/f1/97f509b4108d7bae16c48389f54f005b62ce86712120fd8b2d8e88a7cb49/ruff-0.12.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d59e58586829f8e4a9920788f6efba97a13d1fa320b047814e8afede381c6839", size = 11872754 },
+ { url = "https://files.pythonhosted.org/packages/12/ad/44f606d243f744a75adc432275217296095101f83f966842063d78eee2d3/ruff-0.12.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:822d9677b560f1fdeab69b89d1f444bf5459da4aa04e06e766cf0121771ab844", size = 12092276 },
+ { url = "https://files.pythonhosted.org/packages/06/1f/ed6c265e199568010197909b25c896d66e4ef2c5e1c3808caf461f6f3579/ruff-0.12.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b4a64f4062a50c75019c61c7017ff598cb444984b638511f48539d3a1c98db", size = 11734700 },
+ { url = "https://files.pythonhosted.org/packages/63/c5/b21cde720f54a1d1db71538c0bc9b73dee4b563a7dd7d2e404914904d7f5/ruff-0.12.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c6f4064c69d2542029b2a61d39920c85240c39837599d7f2e32e80d36401d6e", size = 13468783 },
+ { url = "https://files.pythonhosted.org/packages/02/9e/39369e6ac7f2a1848f22fb0b00b690492f20811a1ac5c1fd1d2798329263/ruff-0.12.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:059e863ea3a9ade41407ad71c1de2badfbe01539117f38f763ba42a1206f7559", size = 14436642 },
+ { url = "https://files.pythonhosted.org/packages/e3/03/5da8cad4b0d5242a936eb203b58318016db44f5c5d351b07e3f5e211bb89/ruff-0.12.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bef6161e297c68908b7218fa6e0e93e99a286e5ed9653d4be71e687dff101cf", size = 13859107 },
+ { url = "https://files.pythonhosted.org/packages/19/19/dd7273b69bf7f93a070c9cec9494a94048325ad18fdcf50114f07e6bf417/ruff-0.12.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f1345fbf8fb0531cd722285b5f15af49b2932742fc96b633e883da8d841896b", size = 12886521 },
+ { url = "https://files.pythonhosted.org/packages/c0/1d/b4207ec35e7babaee62c462769e77457e26eb853fbdc877af29417033333/ruff-0.12.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f68433c4fbc63efbfa3ba5db31727db229fa4e61000f452c540474b03de52a9", size = 13097528 },
+ { url = "https://files.pythonhosted.org/packages/ff/00/58f7b873b21114456e880b75176af3490d7a2836033779ca42f50de3b47a/ruff-0.12.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:141ce3d88803c625257b8a6debf4a0473eb6eed9643a6189b68838b43e78165a", size = 13080443 },
+ { url = "https://files.pythonhosted.org/packages/12/8c/9e6660007fb10189ccb78a02b41691288038e51e4788bf49b0a60f740604/ruff-0.12.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f3fc21178cd44c98142ae7590f42ddcb587b8e09a3b849cbc84edb62ee95de60", size = 11896759 },
+ { url = "https://files.pythonhosted.org/packages/67/4c/6d092bb99ea9ea6ebda817a0e7ad886f42a58b4501a7e27cd97371d0ba54/ruff-0.12.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7d1a4e0bdfafcd2e3e235ecf50bf0176f74dd37902f241588ae1f6c827a36c56", size = 11701463 },
+ { url = "https://files.pythonhosted.org/packages/59/80/d982c55e91df981f3ab62559371380616c57ffd0172d96850280c2b04fa8/ruff-0.12.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e67d96827854f50b9e3e8327b031647e7bcc090dbe7bb11101a81a3a2cbf1cc9", size = 12691603 },
+ { url = "https://files.pythonhosted.org/packages/ad/37/63a9c788bbe0b0850611669ec6b8589838faf2f4f959647f2d3e320383ae/ruff-0.12.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ae479e1a18b439c59138f066ae79cc0f3ee250712a873d00dbafadaad9481e5b", size = 13164356 },
+ { url = "https://files.pythonhosted.org/packages/47/d4/1aaa7fb201a74181989970ebccd12f88c0fc074777027e2a21de5a90657e/ruff-0.12.10-py3-none-win32.whl", hash = "sha256:9de785e95dc2f09846c5e6e1d3a3d32ecd0b283a979898ad427a9be7be22b266", size = 11896089 },
+ { url = "https://files.pythonhosted.org/packages/ad/14/2ad38fd4037daab9e023456a4a40ed0154e9971f8d6aed41bdea390aabd9/ruff-0.12.10-py3-none-win_amd64.whl", hash = "sha256:7837eca8787f076f67aba2ca559cefd9c5cbc3a9852fd66186f4201b87c1563e", size = 13004616 },
+ { url = "https://files.pythonhosted.org/packages/24/3c/21cf283d67af33a8e6ed242396863af195a8a6134ec581524fd22b9811b6/ruff-0.12.10-py3-none-win_arm64.whl", hash = "sha256:cc138cc06ed9d4bfa9d667a65af7172b47840e1a98b02ce7011c391e54635ffc", size = 12074225 },
]
[[package]]
diff --git a/{{cookiecutter.project_slug}}/.github/workflows/ci.yml b/{{cookiecutter.project_slug}}/.github/workflows/ci.yml
index 83625e481..1e2d96488 100644
--- a/{{cookiecutter.project_slug}}/.github/workflows/ci.yml
+++ b/{{cookiecutter.project_slug}}/.github/workflows/ci.yml
@@ -7,11 +7,11 @@ env:
on:
pull_request:
- branches: ['master', 'main']
+ branches: ['main']
paths-ignore: ['docs/**']
push:
- branches: ['master', 'main']
+ branches: ['main']
paths-ignore: ['docs/**']
concurrency:
@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout Code Repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Python
uses: actions/setup-python@v5
@@ -65,14 +65,34 @@ jobs:
steps:
- name: Checkout Code Repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
{%- if cookiecutter.use_docker == 'y' %}
- - name: Build the Stack
- run: docker compose -f docker-compose.local.yml build django
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
- - name: Build the docs
- run: docker compose -f docker-compose.docs.yml build docs
+ - name: Build and cache local backend
+ uses: docker/bake-action@v6
+ with:
+ push: false
+ load: true
+ files: docker-compose.local.yml
+ targets: django
+ set: |
+ django.cache-from=type=gha,scope=django-cached-tests
+ django.cache-to=type=gha,scope=django-cached-tests,mode=max
+ postgres.cache-from=type=gha,scope=postgres-cached-tests
+ postgres.cache-to=type=gha,scope=postgres-cached-tests,mode=max
+
+ - name: Build and cache docs
+ uses: docker/bake-action@v6
+ with:
+ push: false
+ load: true
+ files: docker-compose.docs.yml
+ set: |
+ docs.cache-from=type=gha,scope=cached-docs
+ docs.cache-to=type=gha,scope=cached-docs,mode=max
- name: Check DB Migrations
run: docker compose -f docker-compose.local.yml run --rm django python manage.py makemigrations --check
diff --git a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
index 8e18d24c0..dd69c297f 100644
--- a/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
+++ b/{{cookiecutter.project_slug}}/.pre-commit-config.yaml
@@ -7,7 +7,7 @@ default_language_version:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v5.0.0
+ rev: v6.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
@@ -29,17 +29,17 @@ repos:
exclude: '{{cookiecutter.project_slug}}/templates/'
- repo: https://github.com/adamchainz/django-upgrade
- rev: '1.22.2'
+ rev: '1.25.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.11.0
+ rev: v0.12.10
hooks:
# Linter
- - id: ruff
+ - id: ruff-check
args: [--fix, --exit-non-zero-on-fix]
# Formatter
- id: ruff-format
diff --git a/{{cookiecutter.project_slug}}/compose/local/django/Dockerfile b/{{cookiecutter.project_slug}}/compose/local/django/Dockerfile
index 40cea6841..28a2102d8 100644
--- a/{{cookiecutter.project_slug}}/compose/local/django/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/local/django/Dockerfile
@@ -1,5 +1,5 @@
# define an alias for the specific python version used in this file.
-FROM docker.io/python:3.12.9-slim-bookworm AS python
+FROM docker.io/python:3.12.11-slim-bookworm AS python
# Python build stage
FROM python AS python-build-stage
@@ -17,7 +17,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
COPY ./requirements .
# Create Python Dependency and Sub-Dependency Wheels.
-RUN pip wheel --wheel-dir /usr/src/app/wheels \
+RUN pip wheel --wheel-dir /usr/src/app/wheels \
-r ${BUILD_ENVIRONMENT}.txt
@@ -48,7 +48,7 @@ RUN groupadd --gid 1000 dev-user \
# Install required system dependencies
RUN apt-get update && apt-get install --no-install-recommends -y \
# psycopg dependencies
- libpq-dev \
+ libpq-dev \
wait-for-it \
# Translations dependencies
gettext \
@@ -58,7 +58,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
# All absolute dir copies ignore workdir instruction. All relative dir copies are wrt to the workdir instruction
# copy python dependency wheels from python-build-stage
-COPY --from=python-build-stage /usr/src/app/wheels /wheels/
+COPY --from=python-build-stage /usr/src/app/wheels /wheels/
# use wheels to install python dependencies
RUN pip install --no-cache-dir --no-index --find-links=/wheels/ /wheels/* \
diff --git a/{{cookiecutter.project_slug}}/compose/local/docs/Dockerfile b/{{cookiecutter.project_slug}}/compose/local/docs/Dockerfile
index 789585281..e064142e6 100644
--- a/{{cookiecutter.project_slug}}/compose/local/docs/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/local/docs/Dockerfile
@@ -1,5 +1,5 @@
# define an alias for the specific python version used in this file.
-FROM docker.io/python:3.12.9-slim-bookworm AS python
+FROM docker.io/python:3.12.11-slim-bookworm AS python
# Python build stage
@@ -20,7 +20,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
COPY ./requirements /requirements
# create python dependency wheels
-RUN pip wheel --no-cache-dir --wheel-dir /usr/src/app/wheels \
+RUN pip wheel --no-cache-dir --wheel-dir /usr/src/app/wheels \
-r /requirements/local.txt -r /requirements/production.txt \
&& rm -rf /requirements
diff --git a/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile b/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile
index 990652a3c..c34d3bb61 100644
--- a/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/local/node/Dockerfile
@@ -1,4 +1,4 @@
-FROM docker.io/node:22.14-bookworm-slim
+FROM docker.io/node:24.6-bookworm-slim
WORKDIR /app
diff --git a/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/aws/Dockerfile
index d87f3c4c1..6cba899a2 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.28.0
# Clear entrypoint from the base image, otherwise it's always calling the aws CLI
ENTRYPOINT []
diff --git a/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile
index dccb81fc0..3443f092c 100644
--- a/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile
+++ b/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile
@@ -1,5 +1,5 @@
{% if cookiecutter.frontend_pipeline in ['Gulp', 'Webpack'] -%}
-FROM docker.io/node:22.14-bookworm-slim AS client-builder
+FROM docker.io/node:24.6-bookworm-slim AS client-builder
ARG APP_HOME=/app
WORKDIR ${APP_HOME}
@@ -25,7 +25,7 @@ RUN npm run build
{%- endif %}
# define an alias for the specific python version used in this file.
-FROM docker.io/python:3.12.9-slim-bookworm AS python
+FROM docker.io/python:3.12.11-slim-bookworm AS python
# Python build stage
FROM python AS python-build-stage
@@ -44,7 +44,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
COPY ./requirements .
# Create Python Dependency and Sub-Dependency Wheels.
-RUN pip wheel --wheel-dir /usr/src/app/wheels \
+RUN pip wheel --wheel-dir /usr/src/app/wheels \
-r ${BUILD_ENVIRONMENT}.txt
@@ -78,7 +78,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
# All absolute dir copies ignore workdir instruction. All relative dir copies are wrt to the workdir instruction
# copy python dependency wheels from python-build-stage
-COPY --from=python-build-stage /usr/src/app/wheels /wheels/
+COPY --from=python-build-stage /usr/src/app/wheels /wheels/
# use wheels to install python dependencies
RUN pip install --no-cache-dir --no-index --find-links=/wheels/ /wheels/* \
@@ -119,6 +119,11 @@ COPY --from=client-builder --chown=django:django ${APP_HOME} ${APP_HOME}
COPY --chown=django:django . ${APP_HOME}
{%- endif %}
+{%- if cookiecutter.cloud_provider == 'None' %}
+# explicitly create the media folder before changing ownership below
+RUN mkdir -p ${APP_HOME}/{{ cookiecutter.project_slug }}/media
+{%- endif %}
+
# make django owner of the WORKDIR directory as well.
RUN chown -R django:django ${APP_HOME}
diff --git a/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/traefik/Dockerfile
index 7ec39ad20..2a83e94bf 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.4
+FROM docker.io/traefik:3.5.0
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/celery_app.py b/{{cookiecutter.project_slug}}/config/celery_app.py
index 836429078..f2ffac0da 100644
--- a/{{cookiecutter.project_slug}}/config/celery_app.py
+++ b/{{cookiecutter.project_slug}}/config/celery_app.py
@@ -17,9 +17,9 @@ app.config_from_object("django.conf:settings", namespace="CELERY")
@setup_logging.connect
def config_loggers(*args, **kwargs):
- from logging.config import dictConfig
+ from logging.config import dictConfig # noqa: PLC0415
- from django.conf import settings
+ from django.conf import settings # noqa: PLC0415
dictConfig(settings.LOGGING)
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/settings/local.py b/{{cookiecutter.project_slug}}/config/settings/local.py
index f63151239..c42ce59cc 100644
--- a/{{cookiecutter.project_slug}}/config/settings/local.py
+++ b/{{cookiecutter.project_slug}}/config/settings/local.py
@@ -1,4 +1,3 @@
-# ruff: noqa: E501
from .base import * # noqa: F403
from .base import INSTALLED_APPS
from .base import MIDDLEWARE
@@ -79,7 +78,7 @@ if env("USE_DOCKER") == "yes":
import socket
hostname, _, ips = socket.gethostbyname_ex(socket.gethostname())
- INTERNAL_IPS += [".".join(ip.split(".")[:-1] + ["1"]) for ip in ips]
+ INTERNAL_IPS += [".".join([*ip.split(".")[:-1], "1"]) for ip in ips]
{%- if cookiecutter.frontend_pipeline in ['Gulp', 'Webpack'] %}
try:
_, _, ips = socket.gethostbyname_ex("node")
diff --git a/{{cookiecutter.project_slug}}/config/urls.py b/{{cookiecutter.project_slug}}/config/urls.py
index 8f9b5e426..c69358180 100644
--- a/{{cookiecutter.project_slug}}/config/urls.py
+++ b/{{cookiecutter.project_slug}}/config/urls.py
@@ -42,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/",
diff --git a/{{cookiecutter.project_slug}}/docker-compose.local.yml b/{{cookiecutter.project_slug}}/docker-compose.local.yml
index eced08ee8..9a066ccf1 100644
--- a/{{cookiecutter.project_slug}}/docker-compose.local.yml
+++ b/{{cookiecutter.project_slug}}/docker-compose.local.yml
@@ -53,10 +53,8 @@ services:
redis:
image: docker.io/redis:6
container_name: {{ cookiecutter.project_slug }}_local_redis
- {% if cookiecutter.use_celery == 'y' %}
volumes:
- {{ cookiecutter.project_slug }}_local_redis_data:/data
- {% endif %}
celeryworker:
<<: *django
diff --git a/{{cookiecutter.project_slug}}/docs/howto.rst b/{{cookiecutter.project_slug}}/docs/howto.rst
index 944c2b731..721a1b446 100644
--- a/{{cookiecutter.project_slug}}/docs/howto.rst
+++ b/{{cookiecutter.project_slug}}/docs/howto.rst
@@ -15,7 +15,7 @@ from inside the `{{cookiecutter.project_slug}}/docs` directory.
{% else %}
To build and serve docs, use the commands::
- docker compose -f docker-compose.local.yml up docs
+ docker compose -f docker-compose.docs.yml up
{% endif %}
diff --git a/{{cookiecutter.project_slug}}/gulpfile.mjs b/{{cookiecutter.project_slug}}/gulpfile.mjs
index 70d4e5e2f..41f02b78e 100644
--- a/{{cookiecutter.project_slug}}/gulpfile.mjs
+++ b/{{cookiecutter.project_slug}}/gulpfile.mjs
@@ -101,7 +101,7 @@ function vendorScripts() {
// Image compression
async function imgCompression() {
const imagemin = (await import("gulp-imagemin")).default;
- return src(`${paths.images}/*`)
+ return src(`${paths.images}/*`, { encoding: false })
.pipe(imagemin()) // Compresses PNG, JPEG, GIF and SVG images
.pipe(dest(paths.images));
}
diff --git a/{{cookiecutter.project_slug}}/manage.py b/{{cookiecutter.project_slug}}/manage.py
index d6c4f110f..0332cc26e 100755
--- a/{{cookiecutter.project_slug}}/manage.py
+++ b/{{cookiecutter.project_slug}}/manage.py
@@ -10,7 +10,7 @@ def main():
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
try:
- from django.core.management import execute_from_command_line
+ from django.core.management import execute_from_command_line # noqa: PLC0415
except ImportError as exc:
raise ImportError( # noqa: TRY003
"Couldn't import Django. Are you sure it's installed and " # noqa: EM101
diff --git a/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py b/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py
index 35139fb2e..b05037433 100644
--- a/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py
+++ b/{{cookiecutter.project_slug}}/merge_production_dotenvs_in_dotenv.py
@@ -1,4 +1,3 @@
-import os
from collections.abc import Sequence
from pathlib import Path
@@ -18,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 d0458179b..8f0c611e0 100644
--- a/{{cookiecutter.project_slug}}/package.json
+++ b/{{cookiecutter.project_slug}}/package.json
@@ -35,7 +35,7 @@
"webpack-merge": "^6.0.1"
},
"engines": {
- "node": "22.14"
+ "node": "24.6"
},
"browserslist": [
"last 2 versions"
diff --git a/{{cookiecutter.project_slug}}/requirements/base.txt b/{{cookiecutter.project_slug}}/requirements/base.txt
index bdd9cc1e0..847b8a620 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.3.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
@@ -7,45 +7,45 @@ rcssmin==1.1.2 --install-option="--without-c-extensions" # https://github.com/n
rcssmin==1.1.2 # https://github.com/ndparker/rcssmin
{%- endif %}
{%- endif %}
-argon2-cffi==23.1.0 # https://github.com/hynek/argon2_cffi
+argon2-cffi==25.1.0 # https://github.com/hynek/argon2_cffi
{%- if cookiecutter.use_whitenoise == 'y' %}
whitenoise==6.9.0 # https://github.com/evansd/whitenoise
{%- endif %}
-redis==5.2.1 # https://github.com/redis/redis-py
+redis==6.4.0 # https://github.com/redis/redis-py
{%- if cookiecutter.use_docker == "y" or cookiecutter.windows == "n" %}
-hiredis==3.1.0 # https://github.com/redis/hiredis-py
+hiredis==3.2.1 # https://github.com/redis/hiredis-py
{%- endif %}
{%- if cookiecutter.use_celery == "y" %}
-celery==5.4.0 # pyup: < 6.0 # https://github.com/celery/celery
-django-celery-beat==2.7.0 # https://github.com/celery/django-celery-beat
+celery==5.5.3 # pyup: < 6.0 # https://github.com/celery/celery
+django-celery-beat==2.8.1 # https://github.com/celery/django-celery-beat
{%- if cookiecutter.use_docker == 'y' %}
flower==2.0.1 # https://github.com/mher/flower
{%- endif %}
{%- endif %}
{%- if cookiecutter.use_async == 'y' %}
-uvicorn[standard]==0.34.0 # https://github.com/encode/uvicorn
+uvicorn[standard]==0.35.0 # https://github.com/encode/uvicorn
uvicorn-worker==0.3.0 # https://github.com/Kludex/uvicorn-worker
{%- endif %}
# Django
# ------------------------------------------------------------------------------
-django==5.0.13 # pyup: < 5.1 # https://www.djangoproject.com/
+django==5.1.11 # 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-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
+django-allauth[mfa]==65.11.0 # https://github.com/pennersr/django-allauth
+django-crispy-forms==2.4 # https://github.com/django-crispy-forms/django-crispy-forms
+crispy-bootstrap5==2025.6 # 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
+django-redis==6.0.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.1 # 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
{%- endif %}
{%- if cookiecutter.frontend_pipeline == 'Webpack' %}
-django-webpack-loader==3.1.1 # https://github.com/django-webpack/django-webpack-loader
+django-webpack-loader==3.2.1 # https://github.com/django-webpack/django-webpack-loader
{%- endif %}
diff --git a/{{cookiecutter.project_slug}}/requirements/local.txt b/{{cookiecutter.project_slug}}/requirements/local.txt
index 48f2de7ab..6d9840724 100644
--- a/{{cookiecutter.project_slug}}/requirements/local.txt
+++ b/{{cookiecutter.project_slug}}/requirements/local.txt
@@ -3,41 +3,41 @@
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.5 # https://github.com/psycopg/psycopg
+psycopg[c]==3.2.9 # https://github.com/psycopg/psycopg
{%- else %}
-psycopg[binary]==3.2.5 # https://github.com/psycopg/psycopg
+psycopg[binary]==3.2.9 # 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
+watchfiles==1.1.0 # https://github.com/samuelcolvin/watchfiles
{%- endif %}
# Testing
# ------------------------------------------------------------------------------
-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.5 # https://github.com/pytest-dev/pytest
-pytest-sugar==1.0.0 # https://github.com/Frozenball/pytest-sugar
+mypy==1.17.1 # https://github.com/python/mypy
+django-stubs[compatible-mypy]==5.2.2 # https://github.com/typeddjango/django-stubs
+pytest==8.4.1 # https://github.com/pytest-dev/pytest
+pytest-sugar==1.1.0 # https://github.com/Teemu/pytest-sugar
{%- if cookiecutter.use_drf == "y" %}
-djangorestframework-stubs==3.15.3 # https://github.com/typeddjango/djangorestframework-stubs
+djangorestframework-stubs==3.16.0 # https://github.com/typeddjango/djangorestframework-stubs
{%- endif %}
# Documentation
# ------------------------------------------------------------------------------
-sphinx==8.3.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.11.0 # https://github.com/astral-sh/ruff
-coverage==7.6.12 # https://github.com/nedbat/coveragepy
+ruff==0.12.10 # https://github.com/astral-sh/ruff
+coverage==7.10.4 # 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.3.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-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
+django-debug-toolbar==6.0.0 # https://github.com/jazzband/django-debug-toolbar
+django-extensions==4.1 # https://github.com/django-extensions/django-extensions
+django-coverage-plugin==3.1.1 # https://github.com/nedbat/django_coverage_plugin
+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 87c3a4cba..3ac7f60f8 100644
--- a/{{cookiecutter.project_slug}}/requirements/production.txt
+++ b/{{cookiecutter.project_slug}}/requirements/production.txt
@@ -3,42 +3,42 @@
-r base.txt
gunicorn==23.0.0 # https://github.com/benoitc/gunicorn
-psycopg[c]==3.2.5 # https://github.com/psycopg/psycopg
+psycopg[c]==3.2.9 # 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
+Collectfasta==3.3.0 # 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.35.0 # 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
+hiredis==3.2.1 # https://github.com/redis/hiredis-py
{%- endif %}
# 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.1 # 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.1 # 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.1 # 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.1 # 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.1 # 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.1 # 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.1 # 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.1 # 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.1 # https://github.com/anymail/django-anymail
{%- endif %}
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/apps.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/apps.py
index 5c3d4fe08..6f50d5d2c 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/apps.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/apps.py
@@ -10,4 +10,4 @@ class UsersConfig(AppConfig):
def ready(self):
with contextlib.suppress(ImportError):
- import {{ cookiecutter.project_slug }}.users.signals # noqa: F401
+ import {{ cookiecutter.project_slug }}.users.signals # noqa: F401, PLC0415
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/forms.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/forms.py
index 35a70101e..a53eac6bd 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):
"""
Form for User Creation in the Admin Area.
To change user signup, see UserSignupForm and UserSocialSignupForm.
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py
index 3e6a41a94..485e1a838 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py
@@ -60,7 +60,7 @@ class TestUserAdmin:
def _force_allauth(self, settings):
settings.DJANGO_ADMIN_FORCE_ALLAUTH = True
# Reload the admin module to apply the setting change
- import {{ cookiecutter.project_slug }}.users.admin as users_admin
+ import {{ cookiecutter.project_slug }}.users.admin as users_admin # noqa: PLC0415
with contextlib.suppress(admin.sites.AlreadyRegistered): # type: ignore[attr-defined]
reload(users_admin)
|