Merge branch 'pyup-update-psycopg2-binary-2.9.4-to-2.9.5'

This commit is contained in:
ghostformobile 2022-10-25 23:00:32 +03:00
commit b8932678b0
82 changed files with 1179 additions and 381 deletions

View File

@ -7,5 +7,5 @@ labels: question
First, make sure to examine [the docs](https://cookiecutter-django.readthedocs.io/en/latest/). If that doesn't help, we recommend one of these 3 main channels: First, make sure to examine [the docs](https://cookiecutter-django.readthedocs.io/en/latest/). If that doesn't help, we recommend one of these 3 main channels:
- If your issue is related to Django + something else but was generated with cookiecutter-django, the best is to post a question on [StackOverflow](https://stackoverflow.com/questions/tagged/cookiecutter-django) tagged with `cookiecutter-django`, you would get more visibility from other communities as well. - If your issue is related to Django + something else but was generated with cookiecutter-django, the best is to post a question on [StackOverflow](https://stackoverflow.com/questions/tagged/cookiecutter-django) tagged with `cookiecutter-django`, you would get more visibility from other communities as well.
- Join us on [Discord](https://discord.gg/bTfDa6Zz) and ask around. - Join us on [Discord](https://discord.gg/uFXweDQc5a) and ask around.
- Start [a discussion](https://github.com/cookiecutter/cookiecutter-django/discussions) on our project's GitHub. - Start [a discussion](https://github.com/cookiecutter/cookiecutter-django/discussions) on our project's GitHub.

View File

@ -1227,5 +1227,75 @@
"name": "Abdullah Adeel", "name": "Abdullah Adeel",
"github_login": "mabdullahadeel", "github_login": "mabdullahadeel",
"twitter_username": "abdadeel_" "twitter_username": "abdadeel_"
},
{
"name": "Jorge Valdez",
"github_login": "jorgeavaldez",
"twitter_username": ""
},
{
"name": "Ryan Fitch",
"github_login": "ryfi",
"twitter_username": ""
},
{
"name": "ghazi-git",
"github_login": "ghazi-git",
"twitter_username": ""
},
{
"name": "Cebrail Yılmaz",
"github_login": "b1sar",
"twitter_username": ""
},
{
"name": "Artur Barseghyan",
"github_login": "barseghyanartur",
"twitter_username": ""
},
{
"name": "innicoder",
"github_login": "innicoder",
"twitter_username": ""
},
{
"name": "Naveen",
"github_login": "naveensrinivasan",
"twitter_username": "snaveen"
},
{
"name": "Nikita Sobolev",
"github_login": "sobolevn",
"twitter_username": ""
},
{
"name": "Sebastian Reyes Espinosa",
"github_login": "sebastian-code",
"twitter_username": "sebastianreyese"
},
{
"name": "jugglinmike",
"github_login": "jugglinmike",
"twitter_username": ""
},
{
"name": "monosans",
"github_login": "monosans",
"twitter_username": ""
},
{
"name": "Marcio Mazza",
"github_login": "marciomazza",
"twitter_username": "marciomazza"
},
{
"name": "Brandon Rumiser",
"github_login": "brumiser1550",
"twitter_username": ""
},
{
"name": "krati yadav",
"github_login": "krati5",
"twitter_username": ""
} }
] ]

View File

@ -4,17 +4,21 @@ on:
push: push:
pull_request: pull_request:
concurrency:
group: ${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs: jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: actions/setup-python@v2 - uses: actions/setup-python@v4
with: with:
python-version: "3.9" python-version: "3.10"
cache: pip cache: pip
- name: Run pre-commit - name: Run pre-commit
uses: pre-commit/action@v2.0.3 uses: pre-commit/action@v3.0.0
tests: tests:
strategy: strategy:
@ -28,10 +32,10 @@ jobs:
name: "Run tests" name: "Run tests"
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: actions/setup-python@v2 - uses: actions/setup-python@v4
with: with:
python-version: "3.9" python-version: "3.10"
cache: pip cache: pip
- name: Install dependencies - name: Install dependencies
run: pip install -r requirements.txt run: pip install -r requirements.txt
@ -46,7 +50,7 @@ jobs:
- name: Basic - name: Basic
args: "" args: ""
- name: Extended - name: Extended
args: "use_celery=y use_drf=y js_task_runner=Gulp" args: "use_celery=y use_drf=y frontend_pipeline=Gulp"
name: "${{ matrix.script.name }} Docker" name: "${{ matrix.script.name }} Docker"
runs-on: ubuntu-latest runs-on: ubuntu-latest
@ -55,10 +59,10 @@ jobs:
COMPOSE_DOCKER_CLI_BUILD: 1 COMPOSE_DOCKER_CLI_BUILD: 1
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: actions/setup-python@v2 - uses: actions/setup-python@v4
with: with:
python-version: "3.9" python-version: "3.10"
cache: pip cache: pip
- name: Install dependencies - name: Install dependencies
run: pip install -r requirements.txt run: pip install -r requirements.txt
@ -71,12 +75,12 @@ jobs:
matrix: matrix:
script: script:
- name: With Celery - name: With Celery
args: "use_celery=y use_compressor=y" args: "use_celery=y frontend_pipeline='Django Compressor'"
- name: With Gulp - name: With Gulp
args: "js_task_runner=Gulp custom_bootstrap_compilation=y" args: "frontend_pipeline='Gulp'"
runs-on: ubuntu-latest
name: "${{ matrix.script.name }} Bare metal" name: "${{ matrix.script.name }} Bare metal"
runs-on: ubuntu-latest
services: services:
redis: redis:
image: redis:5.0 image: redis:5.0
@ -95,10 +99,10 @@ jobs:
DATABASE_URL: "postgres://postgres:postgres@localhost:5432/postgres" DATABASE_URL: "postgres://postgres:postgres@localhost:5432/postgres"
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: actions/setup-python@v2 - uses: actions/setup-python@v4
with: with:
python-version: "3.9" python-version: "3.10"
cache: pip cache: pip
cache-dependency-path: | cache-dependency-path: |
requirements.txt requirements.txt
@ -106,7 +110,7 @@ jobs:
{{cookiecutter.project_slug}}/requirements/local.txt {{cookiecutter.project_slug}}/requirements/local.txt
- name: Install dependencies - name: Install dependencies
run: pip install -r requirements.txt run: pip install -r requirements.txt
- uses: actions/setup-node@v2 - uses: actions/setup-node@v3
with: with:
node-version: "16" node-version: "16"
- name: Bare Metal ${{ matrix.script.name }} - name: Bare Metal ${{ matrix.script.name }}

View File

@ -16,10 +16,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: actions/setup-python@v2 - uses: actions/setup-python@v4
with: with:
python-version: "3.9" python-version: "3.10"
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip

View File

@ -8,17 +8,23 @@ on:
- cron: "15 2 * * *" - cron: "15 2 * * *"
workflow_dispatch: # to trigger manually workflow_dispatch: # to trigger manually
permissions:
contents: read
jobs: jobs:
auto-update: auto-update:
# Disables this workflow from running in a repository that is not part of the indicated organization/user # Disables this workflow from running in a repository that is not part of the indicated organization/user
if: github.repository_owner == 'cookiecutter' if: github.repository_owner == 'cookiecutter'
permissions:
contents: write # for peter-evans/create-pull-request to create branch
pull-requests: write # for peter-evans/create-pull-request to create a PR
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: actions/setup-python@v2 - uses: actions/setup-python@v4
with: with:
python-version: "3.9" python-version: "3.10"
- name: Install pre-commit - name: Install pre-commit
run: pip install pre-commit run: pip install pre-commit
@ -31,7 +37,7 @@ jobs:
run: pre-commit autoupdate run: pre-commit autoupdate
- name: Create Pull Request - name: Create Pull Request
uses: peter-evans/create-pull-request@v3.12.0 uses: peter-evans/create-pull-request@v4
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
branch: update/pre-commit-autoupdate branch: update/pre-commit-autoupdate

View File

@ -14,12 +14,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v4
with: with:
python-version: "3.9" python-version: "3.10"
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip

View File

@ -5,19 +5,24 @@ on:
branches: branches:
- master - master
permissions:
contents: read
jobs: jobs:
build: build:
# Disables this workflow from running in a repository that is not part of the indicated organization/user # Disables this workflow from running in a repository that is not part of the indicated organization/user
if: github.repository_owner == 'cookiecutter' if: github.repository_owner == 'cookiecutter'
permissions:
contents: write # for stefanzweifel/git-auto-commit-action to push code in repo
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v4
with: with:
python-version: "3.9" python-version: "3.10"
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
@ -26,7 +31,7 @@ jobs:
run: python scripts/update_contributors.py run: python scripts/update_contributors.py
- name: Commit changes - name: Commit changes
uses: stefanzweifel/git-auto-commit-action@v4.13.1 uses: stefanzweifel/git-auto-commit-action@v4.15.2
with: with:
commit_message: Update Contributors commit_message: Update Contributors
file_pattern: CONTRIBUTORS.md .github/contributors.json file_pattern: CONTRIBUTORS.md .github/contributors.json

View File

@ -3,13 +3,20 @@ default_stages: [commit]
repos: repos:
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.1.0 rev: v4.3.0
hooks: hooks:
- id: trailing-whitespace - id: trailing-whitespace
- id: check-yaml - id: check-yaml
- repo: https://github.com/asottile/pyupgrade
rev: v3.1.0
hooks:
- id: pyupgrade
args: [--py310-plus]
exclude: hooks/
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: 21.12b0 rev: 22.10.0
hooks: hooks:
- id: black - id: black
@ -19,7 +26,7 @@ repos:
- id: isort - id: isort
- repo: https://github.com/PyCQA/flake8 - repo: https://github.com/PyCQA/flake8
rev: 4.0.1 rev: 5.0.4
hooks: hooks:
- id: flake8 - id: flake8

View File

@ -3,6 +3,597 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
<!-- GENERATOR_PLACEHOLDER --> <!-- GENERATOR_PLACEHOLDER -->
## 2022.10.24
### Changed
- Upgrade Python version from 3.9 to 3.10 ([#3913](https://github.com/cookiecutter/cookiecutter-django/pull/3913))
### Updated
- Update sentry-sdk to 1.10.1 ([#3911](https://github.com/cookiecutter/cookiecutter-django/pull/3911))
- Bump stefanzweifel/git-auto-commit-action from 4.15.1 to 4.15.2 ([#3914](https://github.com/cookiecutter/cookiecutter-django/pull/3914))
## 2022.10.19
### Changed
- Set AWS_S3_MAX_MEMORY_SIZE ([#3810](https://github.com/cookiecutter/cookiecutter-django/pull/3810))
- Upgrade to Django 4.0 ([#3848](https://github.com/cookiecutter/cookiecutter-django/pull/3848))
### Updated
- Update pytz to 2022.5 ([#3906](https://github.com/cookiecutter/cookiecutter-django/pull/3906))
- Update sphinx to 5.3.0 ([#3905](https://github.com/cookiecutter/cookiecutter-django/pull/3905))
- Update django-celery-beat to 2.4.0 ([#3908](https://github.com/cookiecutter/cookiecutter-django/pull/3908))
- Update watchfiles to 0.18.0 ([#3907](https://github.com/cookiecutter/cookiecutter-django/pull/3907))
## 2022.10.13
### Updated
- Update pygithub to 1.56 ([#3904](https://github.com/cookiecutter/cookiecutter-django/pull/3904))
## 2022.10.11
### Updated
- Auto-update pre-commit hooks ([#3899](https://github.com/cookiecutter/cookiecutter-django/pull/3899))
- Update flake8-isort to 5.0.0 ([#3901](https://github.com/cookiecutter/cookiecutter-django/pull/3901))
- Update gitpython to 3.1.29 ([#3902](https://github.com/cookiecutter/cookiecutter-django/pull/3902))
- Update psycopg2 to 2.9.4 ([#3896](https://github.com/cookiecutter/cookiecutter-django/pull/3896))
- Bump stefanzweifel/git-auto-commit-action from 4.15.0 to 4.15.1 ([#3903](https://github.com/cookiecutter/cookiecutter-django/pull/3903))
- Update black to 22.10.0 ([#3898](https://github.com/cookiecutter/cookiecutter-django/pull/3898))
## 2022.10.04
### Updated
- Update django to 3.2.16 ([#3895](https://github.com/cookiecutter/cookiecutter-django/pull/3895))
- Update mypy to 0.982 ([#3893](https://github.com/cookiecutter/cookiecutter-django/pull/3893))
- Auto-update pre-commit hooks ([#3894](https://github.com/cookiecutter/cookiecutter-django/pull/3894))
## 2022.10.03
### Updated
- Update sentry-sdk to 1.9.10 ([#3892](https://github.com/cookiecutter/cookiecutter-django/pull/3892))
## 2022.10.02
### Updated
- Update pytz to 2022.4 ([#3891](https://github.com/cookiecutter/cookiecutter-django/pull/3891))
## 2022.09.30
### Updated
- Update coverage to 6.5.0 ([#3890](https://github.com/cookiecutter/cookiecutter-django/pull/3890))
- Update mypy to 0.981 ([#3889](https://github.com/cookiecutter/cookiecutter-django/pull/3889))
- Update sentry-sdk to 1.9.9 ([#3888](https://github.com/cookiecutter/cookiecutter-django/pull/3888))
- Update sphinx to 5.2.3 ([#3887](https://github.com/cookiecutter/cookiecutter-django/pull/3887))
## 2022.09.29
### Changed
- Remove outdated &amp; optional Sendgrid settings from production config ([#3885](https://github.com/cookiecutter/cookiecutter-django/pull/3885))
## 2022.09.27
### Updated
- Update sphinx to 5.2.2 ([#3884](https://github.com/cookiecutter/cookiecutter-django/pull/3884))
## 2022.09.26
### Updated
- Update drf-spectacular to 0.24.2 ([#3882](https://github.com/cookiecutter/cookiecutter-django/pull/3882))
- Update djangorestframework to 3.14.0 ([#3881](https://github.com/cookiecutter/cookiecutter-django/pull/3881))
- Update django-debug-toolbar to 3.7.0 ([#3878](https://github.com/cookiecutter/cookiecutter-django/pull/3878))
- Auto-update pre-commit hooks ([#3877](https://github.com/cookiecutter/cookiecutter-django/pull/3877))
- Bump stefanzweifel/git-auto-commit-action from 4.14.1 to 4.15.0 ([#3880](https://github.com/cookiecutter/cookiecutter-django/pull/3880))
- Update sphinx to 5.2.1 ([#3879](https://github.com/cookiecutter/cookiecutter-django/pull/3879))
## 2022.09.24
### Fixed
- Remove `--no-deps` in pip wheels command of docs Dockerfile ([#3875](https://github.com/cookiecutter/cookiecutter-django/pull/3875))
## 2022.09.23
### Changed
- Reload uvicorn on html file change ([#3866](https://github.com/cookiecutter/cookiecutter-django/pull/3866))
- Mailjet default api url does not work out of the box ([#3871](https://github.com/cookiecutter/cookiecutter-django/pull/3871))
### Updated
- Auto-update pre-commit hooks ([#3872](https://github.com/cookiecutter/cookiecutter-django/pull/3872))
- Update django-extensions to 3.2.1 ([#3867](https://github.com/cookiecutter/cookiecutter-django/pull/3867))
- Update tox to 3.26.0 ([#3864](https://github.com/cookiecutter/cookiecutter-django/pull/3864))
- Update drf-spectacular to 0.24.1 ([#3874](https://github.com/cookiecutter/cookiecutter-django/pull/3874))
## 2022.09.15
### Updated
- Update watchfiles to 0.17.0 ([#3869](https://github.com/cookiecutter/cookiecutter-django/pull/3869))
- Update drf-spectacular to 0.24.0 ([#3870](https://github.com/cookiecutter/cookiecutter-django/pull/3870))
## 2022.09.05
### Updated
- Update sentry-sdk to 1.9.8 ([#3861](https://github.com/cookiecutter/cookiecutter-django/pull/3861))
## 2022.09.02
### Updated
- Update pytest to 7.1.3 ([#3860](https://github.com/cookiecutter/cookiecutter-django/pull/3860))
- Update sentry-sdk to 1.9.7 ([#3859](https://github.com/cookiecutter/cookiecutter-django/pull/3859))
## 2022.09.01
### Changed
- Add article to README about how to use a hosted DB ([#3844](https://github.com/cookiecutter/cookiecutter-django/pull/3844))
### Updated
- Update sentry-sdk to 1.9.6 ([#3856](https://github.com/cookiecutter/cookiecutter-django/pull/3856))
- Auto-update pre-commit hooks ([#3858](https://github.com/cookiecutter/cookiecutter-django/pull/3858))
- Update black to 22.8.0 ([#3857](https://github.com/cookiecutter/cookiecutter-django/pull/3857))
## 2022.08.26
### Changed
- Fix formatting in docs ([#3850](https://github.com/cookiecutter/cookiecutter-django/pull/3850))
## 2022.08.24
### Updated
- Update django-debug-toolbar to 3.6.0 ([#3847](https://github.com/cookiecutter/cookiecutter-django/pull/3847))
- Update werkzeug to 2.2.2 ([#3846](https://github.com/cookiecutter/cookiecutter-django/pull/3846))
- Update coverage to 6.4.4 ([#3842](https://github.com/cookiecutter/cookiecutter-django/pull/3842))
- Update uvicorn to 0.18.3 ([#3845](https://github.com/cookiecutter/cookiecutter-django/pull/3845))
- Update sentry-sdk to 1.9.5 ([#3841](https://github.com/cookiecutter/cookiecutter-django/pull/3841))
- Update flower to 1.2.0 ([#3836](https://github.com/cookiecutter/cookiecutter-django/pull/3836))
- Update django-storages to 1.13.1 ([#3833](https://github.com/cookiecutter/cookiecutter-django/pull/3833))
## 2022.08.15
### Updated
- Update coverage to 6.4.3 ([#3835](https://github.com/cookiecutter/cookiecutter-django/pull/3835))
- Update pytz to 2022.2.1 ([#3840](https://github.com/cookiecutter/cookiecutter-django/pull/3840))
- Update sentry-sdk to 1.9.4 ([#3838](https://github.com/cookiecutter/cookiecutter-django/pull/3838))
## 2022.08.09
### Updated
- Update sentry-sdk to 1.9.3 ([#3837](https://github.com/cookiecutter/cookiecutter-django/pull/3837))
## 2022.08.05
### Updated
- Update sentry-sdk to 1.9.2 ([#3832](https://github.com/cookiecutter/cookiecutter-django/pull/3832))
## 2022.08.04
### Updated
- Auto-update pre-commit hooks ([#3816](https://github.com/cookiecutter/cookiecutter-django/pull/3816))
- Update flake8 to 5.0.4 ([#3829](https://github.com/cookiecutter/cookiecutter-django/pull/3829))
- Update django-compressor to 4.1 ([#3823](https://github.com/cookiecutter/cookiecutter-django/pull/3823))
- Update flake8-isort to 4.2.0 ([#3828](https://github.com/cookiecutter/cookiecutter-django/pull/3828))
## 2022.08.03
### Updated
- Update django to 3.2.15 ([#3822](https://github.com/cookiecutter/cookiecutter-django/pull/3822))
## 2022.07.29
### Updated
- Update sentry-sdk to 1.9.0 ([#3815](https://github.com/cookiecutter/cookiecutter-django/pull/3815))
## 2022.07.28
### Updated
- Update werkzeug to 2.2.1 ([#3814](https://github.com/cookiecutter/cookiecutter-django/pull/3814))
## 2022.07.27
### Updated
- Update werkzeug to 2.2.0 ([#3813](https://github.com/cookiecutter/cookiecutter-django/pull/3813))
- Update sphinx to 5.1.1 ([#3811](https://github.com/cookiecutter/cookiecutter-django/pull/3811))
- Update drf-spectacular to 0.23.1 ([#3812](https://github.com/cookiecutter/cookiecutter-django/pull/3812))
## 2022.07.26
### Changed
- Switch from `watchgod` to `watchfiles` ([#3791](https://github.com/cookiecutter/cookiecutter-django/pull/3791))
- Change Django settings file used by pylint ([#3806](https://github.com/cookiecutter/cookiecutter-django/pull/3806))
- Simplify database access in tests ([#3807](https://github.com/cookiecutter/cookiecutter-django/pull/3807))
- Provide more context when wating for PostgreSQL takes too long ([#3782](https://github.com/cookiecutter/cookiecutter-django/pull/3782))
### Updated
- Update django-compressor to 4.0 ([#3802](https://github.com/cookiecutter/cookiecutter-django/pull/3802))
- Update flake8-isort to 4.1.2.post0 ([#3809](https://github.com/cookiecutter/cookiecutter-django/pull/3809))
- Update sphinx to 5.1.0 ([#3808](https://github.com/cookiecutter/cookiecutter-django/pull/3808))
- Update sh to 1.14.3 ([#3798](https://github.com/cookiecutter/cookiecutter-django/pull/3798))
- Auto-update pre-commit hooks ([#3780](https://github.com/cookiecutter/cookiecutter-django/pull/3780))
## 2022.07.22
### Updated
- Update pytest-sugar to 0.9.5 ([#3800](https://github.com/cookiecutter/cookiecutter-django/pull/3800))
- Update sphinx to 5.0.2 ([#3801](https://github.com/cookiecutter/cookiecutter-django/pull/3801))
- Update pillow to 9.2.0 ([#3799](https://github.com/cookiecutter/cookiecutter-django/pull/3799))
- Update werkzeug to 2.1.2 ([#3797](https://github.com/cookiecutter/cookiecutter-django/pull/3797))
## 2022.07.21
### Changed
- Set user to form instance in update user view test ([#3776](https://github.com/cookiecutter/cookiecutter-django/pull/3776))
- Fix warning from django-coverage-plugin in tests ([#3790](https://github.com/cookiecutter/cookiecutter-django/pull/3790))
- Always use `const` instead of `var` in `gulpfile.js` ([#3786](https://github.com/cookiecutter/cookiecutter-django/pull/3786))
### Updated
- Update flower to 1.1.0 ([#3796](https://github.com/cookiecutter/cookiecutter-django/pull/3796))
- Update coverage to 6.4.2 ([#3783](https://github.com/cookiecutter/cookiecutter-django/pull/3783))
- Update mypy to 0.971 ([#3788](https://github.com/cookiecutter/cookiecutter-django/pull/3788))
- Update sentry-sdk to 1.8.0 ([#3792](https://github.com/cookiecutter/cookiecutter-django/pull/3792))
- Update pre-commit to 2.20.0 ([#3779](https://github.com/cookiecutter/cookiecutter-django/pull/3779))
- Update django-extensions to 3.2.0 ([#3774](https://github.com/cookiecutter/cookiecutter-django/pull/3774))
- Update tox to 3.25.1 ([#3767](https://github.com/cookiecutter/cookiecutter-django/pull/3767))
- Update uvicorn to 0.18.2 ([#3762](https://github.com/cookiecutter/cookiecutter-django/pull/3762))
- Update redis to 4.3.4 ([#3763](https://github.com/cookiecutter/cookiecutter-django/pull/3763))
- Update requests to 2.28.1 ([#3766](https://github.com/cookiecutter/cookiecutter-django/pull/3766))
## 2022.07.10
### Changed
- Revert auto-update pre-commit hooks ([#3778](https://github.com/cookiecutter/cookiecutter-django/pull/3778))
### Updated
- Auto-update pre-commit hooks ([#3775](https://github.com/cookiecutter/cookiecutter-django/pull/3775))
## 2022.07.06
### Updated
- Update django to 3.2.14 ([#3768](https://github.com/cookiecutter/cookiecutter-django/pull/3768))
## 2022.06.28
### Updated
- Auto-update pre-commit hooks ([#3765](https://github.com/cookiecutter/cookiecutter-django/pull/3765))
- Update black to 22.6.0 ([#3764](https://github.com/cookiecutter/cookiecutter-django/pull/3764))
## 2022.06.23
### Updated
- Update django-debug-toolbar to 3.5.0 ([#3760](https://github.com/cookiecutter/cookiecutter-django/pull/3760))
## 2022.06.22
### Updated
- Update django-stubs to 1.12.0 ([#3757](https://github.com/cookiecutter/cookiecutter-django/pull/3757))
- Update sentry-sdk to 1.6.0 ([#3756](https://github.com/cookiecutter/cookiecutter-django/pull/3756))
- Update djangorestframework-stubs to 1.7.0 ([#3754](https://github.com/cookiecutter/cookiecutter-django/pull/3754))
## 2022.06.15
### Updated
- Update django-environ to 0.9.0 ([#3751](https://github.com/cookiecutter/cookiecutter-django/pull/3751))
## 2022.06.13
### Updated
- Update cookiecutter to 2.1.1 ([#3727](https://github.com/cookiecutter/cookiecutter-django/pull/3727))
## 2022.06.11
### Updated
- Update requests to 2.28.0 ([#3748](https://github.com/cookiecutter/cookiecutter-django/pull/3748))
## 2022.06.09
### Updated
- Bump actions/setup-python from 3 to 4 ([#3746](https://github.com/cookiecutter/cookiecutter-django/pull/3746))
## 2022.06.08
### Updated
- Auto-update pre-commit hooks ([#3744](https://github.com/cookiecutter/cookiecutter-django/pull/3744))
## 2022.06.07
### Updated
- Update django-allauth to 0.51.0 ([#3743](https://github.com/cookiecutter/cookiecutter-django/pull/3743))
- Auto-update pre-commit hooks ([#3742](https://github.com/cookiecutter/cookiecutter-django/pull/3742))
## 2022.06.06
### Updated
- Bump pre-commit/action from 2.0.3 to 3.0.0 ([#3739](https://github.com/cookiecutter/cookiecutter-django/pull/3739))
## 2022.06.05
### Updated
- Update whitenoise to 6.2.0 ([#3737](https://github.com/cookiecutter/cookiecutter-django/pull/3737))
- Update django-cors-headers to 3.13.0 ([#3738](https://github.com/cookiecutter/cookiecutter-django/pull/3738))
## 2022.06.04
### Updated
- Update django-cors-headers to 3.12.0 ([#3736](https://github.com/cookiecutter/cookiecutter-django/pull/3736))
- Update djangorestframework-stubs to 1.6.0 ([#3718](https://github.com/cookiecutter/cookiecutter-django/pull/3718))
- Update django-stubs to 1.11.0 ([#3734](https://github.com/cookiecutter/cookiecutter-django/pull/3734))
- Update sphinx to 5.0.1 ([#3733](https://github.com/cookiecutter/cookiecutter-django/pull/3733))
- Update sphinx to 5.0.0 ([#3724](https://github.com/cookiecutter/cookiecutter-django/pull/3724))
- Update celery to 5.2.7 ([#3732](https://github.com/cookiecutter/cookiecutter-django/pull/3732))
- Update django-celery-beat to 2.3.0 ([#3731](https://github.com/cookiecutter/cookiecutter-django/pull/3731))
## 2022.06.02
### Updated
- Update coverage to 6.4.1 ([#3729](https://github.com/cookiecutter/cookiecutter-django/pull/3729))
- Update redis to 4.3.3 ([#3728](https://github.com/cookiecutter/cookiecutter-django/pull/3728))
## 2022.06.01
### Updated
- Update redis to 4.3.2 ([#3726](https://github.com/cookiecutter/cookiecutter-django/pull/3726))
## 2022.05.24
### Updated
- Update coverage to 6.4 ([#3716](https://github.com/cookiecutter/cookiecutter-django/pull/3716))
## 2022.05.18
### Updated
- Update pillow to 9.1.1 ([#3714](https://github.com/cookiecutter/cookiecutter-django/pull/3714))
## 2022.05.16
### Changed
- Update postgres versions ([#3712](https://github.com/cookiecutter/cookiecutter-django/pull/3712))
### Updated
- Update django-anymail to 8.6 ([#3713](https://github.com/cookiecutter/cookiecutter-django/pull/3713))
## 2022.05.14
### Updated
- Update coverage to 6.3.3 ([#3709](https://github.com/cookiecutter/cookiecutter-django/pull/3709))
- Update whitenoise to 6.1.0 ([#3707](https://github.com/cookiecutter/cookiecutter-django/pull/3707))
- Update sentry-sdk to 1.5.12 ([#3706](https://github.com/cookiecutter/cookiecutter-django/pull/3706))
- Update redis to 4.3.1 ([#3704](https://github.com/cookiecutter/cookiecutter-django/pull/3704))
## 2022.05.07
### Changed
- Add pyupgrade to pre-commit config ([#3702](https://github.com/cookiecutter/cookiecutter-django/pull/3702))
- Set permissions for GitHub actions ([#3698](https://github.com/cookiecutter/cookiecutter-django/pull/3698))
### Updated
- Update jinja2 to 3.1.2 ([#3700](https://github.com/cookiecutter/cookiecutter-django/pull/3700))
## 2022.05.06
### Updated
- Update pre-commit to 2.19.0 ([#3697](https://github.com/cookiecutter/cookiecutter-django/pull/3697))
## 2022.05.04
### Updated
- Update django-coverage-plugin to 2.0.3 ([#3695](https://github.com/cookiecutter/cookiecutter-django/pull/3695))
## 2022.05.03
### Updated
- Update django-debug-toolbar to 3.4.0 ([#3692](https://github.com/cookiecutter/cookiecutter-django/pull/3692))
- Update sentry-sdk to 1.5.11 ([#3693](https://github.com/cookiecutter/cookiecutter-django/pull/3693))
## 2022.05.01
### Updated
- Update django-debug-toolbar to 3.3.0 ([#3690](https://github.com/cookiecutter/cookiecutter-django/pull/3690))
## 2022.04.28
### Changed
- Add the possibility to set a max django version on create_django_issue script ([#3680](https://github.com/cookiecutter/cookiecutter-django/pull/3680))
## 2022.04.27
### Updated
- Update mypy to 0.950 ([#3687](https://github.com/cookiecutter/cookiecutter-django/pull/3687))
- Update python-slugify to 6.1.2 ([#3686](https://github.com/cookiecutter/cookiecutter-django/pull/3686))
- Update drf-spectacular to 0.22.1 ([#3684](https://github.com/cookiecutter/cookiecutter-django/pull/3684))
## 2022.04.25
### Updated
- Update pytest to 7.1.2 ([#3683](https://github.com/cookiecutter/cookiecutter-django/pull/3683))
## 2022.04.19
### Updated
- Update tox to 3.25.0 ([#3675](https://github.com/cookiecutter/cookiecutter-django/pull/3675))
- Update sentry-sdk to 1.5.10 ([#3679](https://github.com/cookiecutter/cookiecutter-django/pull/3679))
## 2022.04.13
### Updated
- Bump stefanzweifel/git-auto-commit-action from 4.14.0 to 4.14.1 ([#3677](https://github.com/cookiecutter/cookiecutter-django/pull/3677))
## 2022.04.11
### Updated
- Update django to 3.2.13 ([#3676](https://github.com/cookiecutter/cookiecutter-django/pull/3676))
## 2022.04.08
### Updated
- Auto-update pre-commit hooks ([#3673](https://github.com/cookiecutter/cookiecutter-django/pull/3673))
## 2022.04.05
### Updated
- Update celery to 5.2.6 ([#3671](https://github.com/cookiecutter/cookiecutter-django/pull/3671))
## 2022.04.04
### Updated
- Update redis to 4.2.2 ([#3670](https://github.com/cookiecutter/cookiecutter-django/pull/3670))
- Update celery to 5.2.5 ([#3669](https://github.com/cookiecutter/cookiecutter-django/pull/3669))
- Update pre-commit to 2.18.1 ([#3668](https://github.com/cookiecutter/cookiecutter-django/pull/3668))
- Update pillow to 9.1.0 ([#3665](https://github.com/cookiecutter/cookiecutter-django/pull/3665))
## 2022.04.01
### Changed
- Update domain for Celery docs ([#3663](https://github.com/cookiecutter/cookiecutter-django/pull/3663))
### Updated
- Update watchgod to 0.8.2 ([#3664](https://github.com/cookiecutter/cookiecutter-django/pull/3664))
- Update redis to 4.2.1 ([#3660](https://github.com/cookiecutter/cookiecutter-django/pull/3660))
## 2022.03.28
### Changed
- Update `black` version to `22.3.0` ([#3657](https://github.com/cookiecutter/cookiecutter-django/pull/3657))
## 2022.03.27
### Updated
- Update sphinx to 4.5.0 ([#3654](https://github.com/cookiecutter/cookiecutter-django/pull/3654))
- Update jinja2 to 3.1.1 ([#3652](https://github.com/cookiecutter/cookiecutter-django/pull/3652))
- Update pylint-django to 2.5.3 ([#3650](https://github.com/cookiecutter/cookiecutter-django/pull/3650))
- Update django-allauth to 0.50.0 ([#3649](https://github.com/cookiecutter/cookiecutter-django/pull/3649))
- Update mypy to 0.942 ([#3648](https://github.com/cookiecutter/cookiecutter-django/pull/3648))
- Update jinja2 to 3.1.0 ([#3647](https://github.com/cookiecutter/cookiecutter-django/pull/3647))
- Update redis to 4.2.0 ([#3646](https://github.com/cookiecutter/cookiecutter-django/pull/3646))
- Update watchgod to 0.8.1 ([#3643](https://github.com/cookiecutter/cookiecutter-django/pull/3643))
- Bump stefanzweifel/git-auto-commit-action from 4.13.1 to 4.14.0 ([#3641](https://github.com/cookiecutter/cookiecutter-django/pull/3641))
- Update drf-spectacular to 0.22.0 ([#3642](https://github.com/cookiecutter/cookiecutter-django/pull/3642))
- Update pytz to 2022.1 ([#3639](https://github.com/cookiecutter/cookiecutter-django/pull/3639))
- Update sentry-sdk to 1.5.8 ([#3638](https://github.com/cookiecutter/cookiecutter-django/pull/3638))
- Update pytest to 7.1.1 ([#3637](https://github.com/cookiecutter/cookiecutter-django/pull/3637))
- Update uvicorn to 0.17.6 ([#3627](https://github.com/cookiecutter/cookiecutter-django/pull/3627))
## 2022.03.23
### Updated
- Bump peter-evans/create-pull-request from 3.14.0 to 4 ([#3645](https://github.com/cookiecutter/cookiecutter-django/pull/3645))
## 2022.03.20
### Changed
- Unify compressor, gulp and custom bootstrap options ([#3535](https://github.com/cookiecutter/cookiecutter-django/pull/3535))
## 2022.03.14
### Fixed
- Fix broken link in README of generated projects ([#3634](https://github.com/cookiecutter/cookiecutter-django/pull/3634))
## 2022.03.13
### Changed
- Add DRF spectacular link in requirements ([#3630](https://github.com/cookiecutter/cookiecutter-django/pull/3630))
## 2022.03.09
### Changed
- Fix a few typos in the documentation ([#3625](https://github.com/cookiecutter/cookiecutter-django/pull/3625))
## 2022.03.08
### Updated
- Update sentry-sdk to 1.5.7 ([#3624](https://github.com/cookiecutter/cookiecutter-django/pull/3624))
## 2022.03.03
### Updated
- Upgrade actions/setup-python to v3 ([#3621](https://github.com/cookiecutter/cookiecutter-django/pull/3621))
## 2022.03.02
### Updated
- Bump actions/checkout from 2 to 3 ([#3619](https://github.com/cookiecutter/cookiecutter-django/pull/3619))
## 2022.03.01
### Updated
- Bump actions/setup-python from 2 to 3 ([#3617](https://github.com/cookiecutter/cookiecutter-django/pull/3617))
- Bump peter-evans/create-pull-request from 3.13.0 to 3.14.0 ([#3618](https://github.com/cookiecutter/cookiecutter-django/pull/3618))
## 2022.02.28
### Updated
- Update python-slugify to 6.1.1 ([#3615](https://github.com/cookiecutter/cookiecutter-django/pull/3615))
- Bump peter-evans/create-pull-request from 3.12.1 to 3.13.0 ([#3616](https://github.com/cookiecutter/cookiecutter-django/pull/3616))
## 2022.02.25
### Updated
- Bump actions/setup-node from 2 to 3 ([#3614](https://github.com/cookiecutter/cookiecutter-django/pull/3614))
## 2022.02.24
### Updated
- Update django-allauth to 0.49.0 ([#3613](https://github.com/cookiecutter/cookiecutter-django/pull/3613))
- Update sentry-sdk to 1.5.6 ([#3611](https://github.com/cookiecutter/cookiecutter-django/pull/3611))
- Update python-slugify to 6.1.0 ([#3612](https://github.com/cookiecutter/cookiecutter-django/pull/3612))
## 2022.02.21
### Changed
- Cancel previous CI runs on successive PR pushes with GitHub actions ([#3575](https://github.com/cookiecutter/cookiecutter-django/pull/3575))
### Updated
- Update coverage to 6.3.2 ([#3610](https://github.com/cookiecutter/cookiecutter-django/pull/3610))
- Update gitpython to 3.1.27 ([#3607](https://github.com/cookiecutter/cookiecutter-django/pull/3607))
- Update pylint-django to 2.5.2 ([#3602](https://github.com/cookiecutter/cookiecutter-django/pull/3602))
- Update python-slugify to 6.0.1 ([#3599](https://github.com/cookiecutter/cookiecutter-django/pull/3599))
- Update uvicorn to 0.17.5 ([#3596](https://github.com/cookiecutter/cookiecutter-django/pull/3596))
- Update redis to 4.1.4 ([#3595](https://github.com/cookiecutter/cookiecutter-django/pull/3595))
## 2022.02.20
### Changed
- Fix incorrect createdb instruction in documentation ([#3606](https://github.com/cookiecutter/cookiecutter-django/pull/3606))
## 2022.02.16
### Fixed
- Fix Swagger schema API endpoint &amp; add a test for it ([#3592](https://github.com/cookiecutter/cookiecutter-django/pull/3592))
## 2022.02.15
### Changed
- Update the drf-spectacular local dev server url to use http instead of https ([#3591](https://github.com/cookiecutter/cookiecutter-django/pull/3591))
## 2022.02.13
### Changed
- Change docs port from 7000 to 9000 ([#3590](https://github.com/cookiecutter/cookiecutter-django/pull/3590))
## 2022.02.12
### Updated
- Update pytest to 7.0.1 ([#3588](https://github.com/cookiecutter/cookiecutter-django/pull/3588))
## 2022.02.11
### Updated
- Update sentry-sdk to 1.5.5 ([#3586](https://github.com/cookiecutter/cookiecutter-django/pull/3586))
## 2022.02.10
### Fixed
- Fix GitLab CI error caused by Docker Compose&#39;s `platform` option ([#3585](https://github.com/cookiecutter/cookiecutter-django/pull/3585))
### Updated
- Update whitenoise to 6.0.0 ([#3583](https://github.com/cookiecutter/cookiecutter-django/pull/3583))
## 2022.02.08
### Fixed
- Fixed some typos in drf-spectacular description and comments ([#3579](https://github.com/cookiecutter/cookiecutter-django/pull/3579))
### Updated
- Update redis to 4.1.3 ([#3577](https://github.com/cookiecutter/cookiecutter-django/pull/3577))
- Update werkzeug to 2.0.3 ([#3576](https://github.com/cookiecutter/cookiecutter-django/pull/3576))
## 2022.02.07
### Changed
- Update black to 22.1.0 ([#3572](https://github.com/cookiecutter/cookiecutter-django/pull/3572))
### Fixed
- Fix docker-compose config on Apple silicon ([#3562](https://github.com/cookiecutter/cookiecutter-django/pull/3562))
### Updated
- Update uvicorn to 0.17.4 ([#3574](https://github.com/cookiecutter/cookiecutter-django/pull/3574))
- Update django-allauth to 0.48.0 ([#3573](https://github.com/cookiecutter/cookiecutter-django/pull/3573))
- Update pytest to 7.0.0 ([#3567](https://github.com/cookiecutter/cookiecutter-django/pull/3567))
- Update coverage to 6.3.1 ([#3561](https://github.com/cookiecutter/cookiecutter-django/pull/3561))
- Update pillow to 9.0.1 ([#3571](https://github.com/cookiecutter/cookiecutter-django/pull/3571))
- Bump peter-evans/create-pull-request from 3.12.0 to 3.12.1 ([#3558](https://github.com/cookiecutter/cookiecutter-django/pull/3558))
- Update drf-spectacular to 0.21.2 ([#3560](https://github.com/cookiecutter/cookiecutter-django/pull/3560))
- Update django to 3.2.12 ([#3559](https://github.com/cookiecutter/cookiecutter-django/pull/3559))
## 2022.01.27 ## 2022.01.27
### Updated ### Updated

3
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,3 @@
## Code of Conduct
Everyone who interacts in the Cookiecutter project's codebase, issue trackers, chat rooms, and mailing lists is expected to follow the [PyPA Code of Conduct](https://www.pypa.io/en/latest/code-of-conduct/).

View File

@ -33,7 +33,7 @@ To run all tests using various versions of python in virtualenvs defined in tox.
It is possible to test with a specific version of python. To do this, the command It is possible to test with a specific version of python. To do this, the command
is: is:
$ tox -e py39 $ tox -e py310
This will run pytest with the python3.9 interpreter, for example. This will run pytest with the python3.9 interpreter, for example.

View File

@ -285,6 +285,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>Artur Barseghyan</td>
<td>
<a href="https://github.com/barseghyanartur">barseghyanartur</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>AsheKR</td> <td>AsheKR</td>
<td> <td>
@ -369,6 +376,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>Brandon Rumiser</td>
<td>
<a href="https://github.com/brumiser1550">brumiser1550</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>Brent Payne</td> <td>Brent Payne</td>
<td> <td>
@ -404,6 +418,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>Cebrail Yılmaz</td>
<td>
<a href="https://github.com/b1sar">b1sar</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>Chao Yang Wu</td> <td>Chao Yang Wu</td>
<td> <td>
@ -768,6 +789,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>ghazi-git</td>
<td>
<a href="https://github.com/ghazi-git">ghazi-git</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>Gilbishkosma</td> <td>Gilbishkosma</td>
<td> <td>
@ -866,6 +894,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>innicoder</td>
<td>
<a href="https://github.com/innicoder">innicoder</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>Irfan Ahmad</td> <td>Irfan Ahmad</td>
<td> <td>
@ -971,6 +1006,20 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>Jorge Valdez</td>
<td>
<a href="https://github.com/jorgeavaldez">jorgeavaldez</a>
</td>
<td></td>
</tr>
<tr>
<td>jugglinmike</td>
<td>
<a href="https://github.com/jugglinmike">jugglinmike</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>Jules Cheron</td> <td>Jules Cheron</td>
<td> <td>
@ -1055,6 +1104,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>krati yadav</td>
<td>
<a href="https://github.com/krati5">krati5</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>Krzysztof Szumny</td> <td>Krzysztof Szumny</td>
<td> <td>
@ -1167,6 +1223,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>Marcio Mazza</td>
<td>
<a href="https://github.com/marciomazza">marciomazza</a>
</td>
<td>marciomazza</td>
</tr>
<tr> <tr>
<td>Martin Blech</td> <td>Martin Blech</td>
<td> <td>
@ -1300,6 +1363,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>monosans</td>
<td>
<a href="https://github.com/monosans">monosans</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>mozillazg</td> <td>mozillazg</td>
<td> <td>
@ -1314,6 +1384,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>Naveen</td>
<td>
<a href="https://github.com/naveensrinivasan">naveensrinivasan</a>
</td>
<td>snaveen</td>
</tr>
<tr> <tr>
<td>Nico Stefani</td> <td>Nico Stefani</td>
<td> <td>
@ -1321,6 +1398,13 @@ Listed in alphabetical order.
</td> </td>
<td>moby_dick91</td> <td>moby_dick91</td>
</tr> </tr>
<tr>
<td>Nikita Sobolev</td>
<td>
<a href="https://github.com/sobolevn">sobolevn</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>Noah H</td> <td>Noah H</td>
<td> <td>
@ -1461,6 +1545,13 @@ Listed in alphabetical order.
</td> </td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>Ryan Fitch</td>
<td>
<a href="https://github.com/ryfi">ryfi</a>
</td>
<td></td>
</tr>
<tr> <tr>
<td>Sam Collins</td> <td>Sam Collins</td>
<td> <td>
@ -1475,6 +1566,13 @@ Listed in alphabetical order.
</td> </td>
<td>saschalalala</td> <td>saschalalala</td>
</tr> </tr>
<tr>
<td>Sebastian Reyes Espinosa</td>
<td>
<a href="https://github.com/sebastian-code">sebastian-code</a>
</td>
<td>sebastianreyese</td>
</tr>
<tr> <tr>
<td>Simon Rey</td> <td>Simon Rey</td>
<td> <td>

View File

@ -3,7 +3,7 @@
[![Build Status](https://img.shields.io/github/workflow/status/cookiecutter/cookiecutter-django/CI/master)](https://github.com/cookiecutter/cookiecutter-django/actions?query=workflow%3ACI) [![Build Status](https://img.shields.io/github/workflow/status/cookiecutter/cookiecutter-django/CI/master)](https://github.com/cookiecutter/cookiecutter-django/actions?query=workflow%3ACI)
[![Documentation Status](https://readthedocs.org/projects/cookiecutter-django/badge/?version=latest)](https://cookiecutter-django.readthedocs.io/en/latest/?badge=latest) [![Documentation Status](https://readthedocs.org/projects/cookiecutter-django/badge/?version=latest)](https://cookiecutter-django.readthedocs.io/en/latest/?badge=latest)
[![Updates](https://pyup.io/repos/github/cookiecutter/cookiecutter-django/shield.svg)](https://pyup.io/repos/github/cookiecutter/cookiecutter-django/) [![Updates](https://pyup.io/repos/github/cookiecutter/cookiecutter-django/shield.svg)](https://pyup.io/repos/github/cookiecutter/cookiecutter-django/)
[![Join our Discord](https://img.shields.io/badge/Discord-cookiecutter-5865F2?style=flat&logo=discord&logoColor=white)](https://discord.gg/9BrxzPKuEW) [![Join our Discord](https://img.shields.io/badge/Discord-cookiecutter-5865F2?style=flat&logo=discord&logoColor=white)](https://discord.gg/uFXweDQc5a)
[![Code Helpers Badge](https://www.codetriage.com/cookiecutter/cookiecutter-django/badges/users.svg)](https://www.codetriage.com/cookiecutter/cookiecutter-django) [![Code Helpers Badge](https://www.codetriage.com/cookiecutter/cookiecutter-django/badges/users.svg)](https://www.codetriage.com/cookiecutter/cookiecutter-django)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)
@ -17,8 +17,8 @@ production-ready Django projects quickly.
## Features ## Features
- For Django 3.2 - For Django 4.0
- Works with Python 3.9 - Works with Python 3.10
- Renders Django projects with 100% starting test coverage - Renders Django projects with 100% starting test coverage
- Twitter [Bootstrap](https://github.com/twbs/bootstrap) v5 - Twitter [Bootstrap](https://github.com/twbs/bootstrap) v5
- [12-Factor](http://12factor.net/) based settings via [django-environ](https://github.com/joke2k/django-environ) - [12-Factor](http://12factor.net/) based settings via [django-environ](https://github.com/joke2k/django-environ)
@ -42,7 +42,7 @@ production-ready Django projects quickly.
*These features can be enabled during initial project setup.* *These features can be enabled during initial project setup.*
- Serve static files from Amazon S3, Google Cloud Storage or [Whitenoise](https://whitenoise.readthedocs.io/) - Serve static files from Amazon S3, Google Cloud Storage or [Whitenoise](https://whitenoise.readthedocs.io/)
- Configuration for [Celery](http://www.celeryproject.org/) and [Flower](https://github.com/mher/flower) (the latter in Docker setup only) - Configuration for [Celery](https://docs.celeryq.dev) and [Flower](https://github.com/mher/flower) (the latter in Docker setup only)
- Integration with [MailHog](https://github.com/mailhog/MailHog) for local email testing - Integration with [MailHog](https://github.com/mailhog/MailHog) for local email testing
- Integration with [Sentry](https://sentry.io/welcome/) for error logging - Integration with [Sentry](https://sentry.io/welcome/) for error logging
@ -121,16 +121,12 @@ Answer the prompts with your own desired [options](http://cookiecutter-django.re
use_pycharm [n]: y use_pycharm [n]: y
use_docker [n]: n use_docker [n]: n
Select postgresql_version: Select postgresql_version:
1 - 14.1 1 - 14
2 - 13.5 2 - 13
3 - 12.9 3 - 12
4 - 11.14 4 - 11
5 - 10.19 5 - 10
Choose from 1, 2, 3, 4, 5 [1]: 1 Choose from 1, 2, 3, 4, 5 [1]: 1
Select js_task_runner:
1 - None
2 - Gulp
Choose from 1, 2 [1]: 1
Select cloud_provider: Select cloud_provider:
1 - AWS 1 - AWS
2 - GCP 2 - GCP
@ -149,8 +145,11 @@ Answer the prompts with your own desired [options](http://cookiecutter-django.re
Choose from 1, 2, 3, 4, 5, 6, 7, 8, 9 [1]: 1 Choose from 1, 2, 3, 4, 5, 6, 7, 8, 9 [1]: 1
use_async [n]: n use_async [n]: n
use_drf [n]: y use_drf [n]: y
custom_bootstrap_compilation [n]: n Select frontend_pipeline:
use_compressor [n]: n 1 - None
2 - Django Compressor
3 - Gulp
Choose from 1, 2, 3, 4 [1]: 1
use_celery [n]: y use_celery [n]: y
use_mailhog [n]: n use_mailhog [n]: n
use_sentry [n]: y use_sentry [n]: y
@ -189,7 +188,7 @@ For local development, see the following:
- Have questions? **Before you ask questions anywhere else**, please post your question on [Stack Overflow](http://stackoverflow.com/questions/tagged/cookiecutter-django) under the *cookiecutter-django* tag. We check there periodically for questions. - Have questions? **Before you ask questions anywhere else**, please post your question on [Stack Overflow](http://stackoverflow.com/questions/tagged/cookiecutter-django) under the *cookiecutter-django* tag. We check there periodically for questions.
- If you think you found a bug or want to request a feature, please open an [issue](https://github.com/cookiecutter/cookiecutter-django/issues). - If you think you found a bug or want to request a feature, please open an [issue](https://github.com/cookiecutter/cookiecutter-django/issues).
- For anything else, you can chat with us on [Discord](https://discord.gg/9BrxzPKuEW). - For anything else, you can chat with us on [Discord](https://discord.gg/uFXweDQc5a).
## For Readers of Two Scoops of Django ## For Readers of Two Scoops of Django
@ -233,6 +232,7 @@ experience better.
## Articles ## Articles
- [Cookiecutter Django With Amazon RDS](https://haseeburrehman.com/posts/cookiecutter-django-with-amazon-rds/) - Apr, 2, 2021
- [Using cookiecutter-django with Google Cloud Storage](https://ahhda.github.io/cloud/gce/django/2019/03/12/using-django-cookiecutter-cloud-storage.html) - Mar. 12, 2019 - [Using cookiecutter-django with Google Cloud Storage](https://ahhda.github.io/cloud/gce/django/2019/03/12/using-django-cookiecutter-cloud-storage.html) - Mar. 12, 2019
- [cookiecutter-django with Nginx, Route 53 and ELB](https://msaizar.com/blog/cookiecutter-django-nginx-route-53-and-elb/) - Feb. 12, 2018 - [cookiecutter-django with Nginx, Route 53 and ELB](https://msaizar.com/blog/cookiecutter-django-nginx-route-53-and-elb/) - Feb. 12, 2018
- [cookiecutter-django and Amazon RDS](https://msaizar.com/blog/cookiecutter-django-and-amazon-rds/) - Feb. 7, 2018 - [cookiecutter-django and Amazon RDS](https://msaizar.com/blog/cookiecutter-django-and-amazon-rds/) - Feb. 7, 2018
@ -245,8 +245,3 @@ experience better.
- [How to create a Django Application using Cookiecutter and Django 1.8](https://www.swapps.io/blog/how-to-create-a-django-application-using-cookiecutter-and-django-1-8/) - Sept. 12, 2015 - [How to create a Django Application using Cookiecutter and Django 1.8](https://www.swapps.io/blog/how-to-create-a-django-application-using-cookiecutter-and-django-1-8/) - Sept. 12, 2015
Have a blog or online publication? Write about your cookiecutter-django tips and tricks, then send us a pull request with the link. Have a blog or online publication? Write about your cookiecutter-django tips and tricks, then send us a pull request with the link.
## Code of Conduct
Everyone interacting in the Cookiecutter project's codebases, issue trackers, chat
rooms, and mailing lists is expected to follow the [PyPA Code of Conduct](https://www.pypa.io/en/latest/code-of-conduct/).

View File

@ -18,15 +18,11 @@
"use_pycharm": "n", "use_pycharm": "n",
"use_docker": "n", "use_docker": "n",
"postgresql_version": [ "postgresql_version": [
"14.1", "14",
"13.5", "13",
"12.9", "12",
"11.14", "11",
"10.19" "10"
],
"js_task_runner": [
"None",
"Gulp"
], ],
"cloud_provider": [ "cloud_provider": [
"AWS", "AWS",
@ -47,8 +43,11 @@
], ],
"use_async": "n", "use_async": "n",
"use_drf": "n", "use_drf": "n",
"custom_bootstrap_compilation": "n", "frontend_pipeline": [
"use_compressor": "n", "None",
"Django Compressor",
"Gulp"
],
"use_celery": "n", "use_celery": "n",
"use_mailhog": "n", "use_mailhog": "n",
"use_sentry": "n", "use_sentry": "n",

View File

@ -39,7 +39,7 @@ master_doc = "index"
# General information about the project. # General information about the project.
project = "Cookiecutter Django" project = "Cookiecutter Django"
copyright = "2013-{}, Daniel Roy Greenfeld".format(now.year) copyright = f"2013-{now.year}, Daniel Roy Greenfeld"
# The version info for the project you're documenting, acts as replacement for # The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the # |version| and |release|, also used in various other places throughout the

View File

@ -112,7 +112,7 @@ Or add the DSN for your account, if you already have one:
Gulp & Bootstrap compilation Gulp & Bootstrap compilation
++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++
If you've opted for a custom bootstrap build, you'll most likely need to setup If you've opted for Gulp, you'll most likely need to setup
your app to use `multiple buildpacks`_: one for Python & one for Node.js: your app to use `multiple buildpacks`_: one for Python & one for Node.js:
.. code-block:: bash .. code-block:: bash

View File

@ -34,7 +34,7 @@ Make sure your project is fully committed and pushed up to Bitbucket or Github o
git clone <my-repo-url> # you can also use hg git clone <my-repo-url> # you can also use hg
cd my-project-name cd my-project-name
mkvirtualenv --python=/usr/bin/python3.9 my-project-name mkvirtualenv --python=/usr/bin/python3.10 my-project-name
pip install -r requirements/production.txt # may take a few minutes pip install -r requirements/production.txt # may take a few minutes

View File

@ -18,7 +18,7 @@ Prerequisites
* Docker; if you don't have it yet, follow the `installation instructions`_; * Docker; if you don't have it yet, follow the `installation instructions`_;
* Docker Compose; refer to the official documentation for the `installation guide`_. * Docker Compose; refer to the official documentation for the `installation guide`_.
* Pre-commit; refer to the official documentation for the [pre-commit](https://pre-commit.com/#install). * Pre-commit; refer to the official documentation for the `pre-commit`_.
.. _`installation instructions`: https://docs.docker.com/install/#supported-platforms .. _`installation instructions`: https://docs.docker.com/install/#supported-platforms
.. _`installation guide`: https://docs.docker.com/compose/install/ .. _`installation guide`: https://docs.docker.com/compose/install/
@ -190,7 +190,7 @@ Celery tasks in local development
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When not using docker Celery tasks are set to run in Eager mode, so that a full stack is not needed. When using docker the task scheduler will be used by default. When not using docker Celery tasks are set to run in Eager mode, so that a full stack is not needed. When using docker the task scheduler will be used by default.
If you need tasks to be executed on the main thread during development set CELERY_TASK_ALWAYS_EAGER = True in config/settings/local.py. If you need tasks to be executed on the main thread during development set ``CELERY_TASK_ALWAYS_EAGER = True`` in ``config/settings/local.py``.
Possible uses could be for testing, or ease of profiling with DJDT. Possible uses could be for testing, or ease of profiling with DJDT.
@ -215,7 +215,7 @@ Developing locally with HTTPS
Increasingly it is becoming necessary to develop software in a secure environment in order that there are very few changes when deploying to production. Recently Facebook changed their policies for apps/sites that use Facebook login which requires the use of an HTTPS URL for the OAuth redirect URL. So if you want to use the ``users`` application with a OAuth provider such as Facebook, securing your communication to the local development environment will be necessary. Increasingly it is becoming necessary to develop software in a secure environment in order that there are very few changes when deploying to production. Recently Facebook changed their policies for apps/sites that use Facebook login which requires the use of an HTTPS URL for the OAuth redirect URL. So if you want to use the ``users`` application with a OAuth provider such as Facebook, securing your communication to the local development environment will be necessary.
In order to create a secure environment, we need to have a trusted SSL certficate installed in our Docker application. In order to create a secure environment, we need to have a trusted SSL certificate installed in our Docker application.
#. **Let's Encrypt** #. **Let's Encrypt**

View File

@ -9,7 +9,7 @@ Setting Up Development Environment
Make sure to have the following on your host: Make sure to have the following on your host:
* Python 3.9 * Python 3.10
* PostgreSQL_. * PostgreSQL_.
* Redis_, if using Celery * Redis_, if using Celery
* Cookiecutter_ * Cookiecutter_
@ -18,7 +18,7 @@ First things first.
#. Create a virtualenv: :: #. Create a virtualenv: ::
$ python3.9 -m venv <virtual env path> $ python3.10 -m venv <virtual env path>
#. Activate the virtualenv you have just created: :: #. Activate the virtualenv you have just created: ::
@ -42,7 +42,8 @@ First things first.
#. Create a new PostgreSQL database using createdb_: :: #. Create a new PostgreSQL database using createdb_: ::
$ createdb <what you have entered as the project_slug at setup stage> -U postgres --password <password> $ createdb --username=postgres <project_slug>
``project_slug`` is what you have entered as the project_slug at the setup stage.
.. note:: .. note::
@ -81,7 +82,7 @@ First things first.
or if you're running asynchronously: :: or if you're running asynchronously: ::
$ uvicorn config.asgi:application --host 0.0.0.0 --reload $ uvicorn config.asgi:application --host 0.0.0.0 --reload --reload-include '*.html'
.. _PostgreSQL: https://www.postgresql.org/download/ .. _PostgreSQL: https://www.postgresql.org/download/
.. _Redis: https://redis.io/download .. _Redis: https://redis.io/download
@ -154,7 +155,7 @@ To run Celery locally, make sure redis-server is installed (instructions are ava
Sass Compilation & Live Reloading Sass Compilation & Live Reloading
--------------------------------- ---------------------------------
If you've opted for Gulp as JS task runner, the project comes configured with `Sass`_ compilation and `live reloading`_. As you change you Sass/JS source files, the task runner will automatically rebuild the corresponding CSS and JS assets and reload them in your browser without refreshing the page. If you've opted for Gulp as front-end pipeline, the project comes configured with `Sass`_ compilation and `live reloading`_. As you change you Sass/JS source files, the task runner will automatically rebuild the corresponding CSS and JS assets and reload them in your browser without refreshing the page.
#. Make sure that `Node.js`_ v16 is installed on your machine. #. Make sure that `Node.js`_ v16 is installed on your machine.
#. In the project root, install the JS dependencies with:: #. In the project root, install the JS dependencies with::
@ -167,7 +168,7 @@ If you've opted for Gulp as JS task runner, the project comes configured with `S
The app will now run with live reloading enabled, applying front-end changes dynamically. The app will now run with live reloading enabled, applying front-end changes dynamically.
.. note:: The task will start 2 processes in parallel: the static assets build loop on one side, and the Django server on the other. You don NOT need to run Django as your would normally with ``manage.py runserver``. .. note:: The task will start 2 processes in parallel: the static assets build loop on one side, and the Django server on the other. You do NOT need to run Django as your would normally with ``manage.py runserver``.
.. _Node.js: http://nodejs.org/download/ .. _Node.js: http://nodejs.org/download/
.. _Sass: https://sass-lang.com/ .. _Sass: https://sass-lang.com/

View File

@ -13,7 +13,7 @@ If you set up your project to `develop locally with docker`_, run the following
$ docker-compose -f local.yml up docs $ docker-compose -f local.yml up docs
Navigate to port 7000 on your host to see the documentation. This will be opened automatically at `localhost`_ for local, non-docker development. Navigate to port 9000 on your host to see the documentation. This will be opened automatically at `localhost`_ for local, non-docker development.
Note: using Docker for documentation sets up a temporary SQLite file by setting the environment variable ``DATABASE_URL=sqlite:///readthedocs.db`` in ``docs/conf.py`` to avoid a dependency on PostgreSQL. Note: using Docker for documentation sets up a temporary SQLite file by setting the environment variable ``DATABASE_URL=sqlite:///readthedocs.db`` in ``docs/conf.py`` to avoid a dependency on PostgreSQL.
@ -36,7 +36,7 @@ To setup your documentation on `ReadTheDocs`_, you must
Additionally, you can auto-build Pull Request previews, but `you must enable it`_. Additionally, you can auto-build Pull Request previews, but `you must enable it`_.
.. _localhost: http://localhost:7000/ .. _localhost: http://localhost:9000/
.. _Sphinx: https://www.sphinx-doc.org/en/master/index.html .. _Sphinx: https://www.sphinx-doc.org/en/master/index.html
.. _develop locally: ./developing-locally.html .. _develop locally: ./developing-locally.html
.. _develop locally with docker: ./developing-locally-docker.html .. _develop locally with docker: ./developing-locally-docker.html

View File

@ -6,7 +6,7 @@ FAQ
Why is there a django.contrib.sites directory in Cookiecutter Django? Why is there a django.contrib.sites directory in Cookiecutter Django?
--------------------------------------------------------------------- ---------------------------------------------------------------------
It is there to add a migration so you don't have to manually change the ``sites.Site`` record from ``example.com`` to whatever your domain is. Instead, your ``{{cookiecutter.domain_name}}`` and {{cookiecutter.project_name}} value is placed by **Cookiecutter** in the domain and name fields respectively. It is there to add a migration so you don't have to manually change the ``sites.Site`` record from ``example.com`` to whatever your domain is. Instead, your ``{{cookiecutter.domain_name}}`` and ``{{cookiecutter.project_name}}`` value is placed by **Cookiecutter** in the domain and name fields respectively.
See `0003_set_site_domain_and_name.py`_. See `0003_set_site_domain_and_name.py`_.

View File

@ -55,17 +55,11 @@ use_docker:
postgresql_version: postgresql_version:
Select a PostgreSQL_ version to use. The choices are: Select a PostgreSQL_ version to use. The choices are:
1. 14.1 1. 14
2. 13.5 2. 13
3. 12.9 3. 12
4. 11.14 4. 11
5. 10.19 5. 10
js_task_runner:
Select a JavaScript task runner. The choices are:
1. None
2. Gulp_
cloud_provider: cloud_provider:
Select a cloud provider for static & media files. The choices are: Select a cloud provider for static & media files. The choices are:
@ -95,13 +89,12 @@ use_async:
use_drf: use_drf:
Indicates whether the project should be configured to use `Django Rest Framework`_. Indicates whether the project should be configured to use `Django Rest Framework`_.
custom_bootstrap_compilation: frontend_pipeline:
Indicates whether the project should support Bootstrap recompilation Select a pipeline to compile and optimise frontend assets (JS, CSS, ...):
via the selected JavaScript task runner's task. This can be useful
for real-time Bootstrap variable alteration.
use_compressor: 1. None
Indicates whether the project should be configured to use `Django Compressor`_. 2. `Django Compressor`_
3. `Gulp`_: support Bootstrap recompilation with real-time variables alteration.
use_celery: use_celery:
Indicates whether the project should be configured to use Celery_. Indicates whether the project should be configured to use Celery_.

View File

@ -1,2 +1,2 @@
sphinx==4.4.0 sphinx==5.3.0
sphinx-rtd-theme==1.0.0 sphinx-rtd-theme==1.0.0

View File

@ -46,6 +46,7 @@ DJANGO_AWS_SECRET_ACCESS_KEY AWS_SECRET_ACCESS_KEY n/a
DJANGO_AWS_STORAGE_BUCKET_NAME AWS_STORAGE_BUCKET_NAME n/a raises error DJANGO_AWS_STORAGE_BUCKET_NAME AWS_STORAGE_BUCKET_NAME n/a raises error
DJANGO_AWS_S3_REGION_NAME AWS_S3_REGION_NAME n/a None DJANGO_AWS_S3_REGION_NAME AWS_S3_REGION_NAME n/a None
DJANGO_AWS_S3_CUSTOM_DOMAIN AWS_S3_CUSTOM_DOMAIN n/a None DJANGO_AWS_S3_CUSTOM_DOMAIN AWS_S3_CUSTOM_DOMAIN n/a None
DJANGO_AWS_S3_MAX_MEMORY_SIZE AWS_S3_MAX_MEMORY_SIZE n/a 100_000_000
DJANGO_GCP_STORAGE_BUCKET_NAME GS_BUCKET_NAME n/a raises error DJANGO_GCP_STORAGE_BUCKET_NAME GS_BUCKET_NAME n/a raises error
GOOGLE_APPLICATION_CREDENTIALS n/a n/a raises error GOOGLE_APPLICATION_CREDENTIALS n/a n/a raises error
SENTRY_DSN SENTRY_DSN n/a raises error SENTRY_DSN SENTRY_DSN n/a raises error

View File

@ -10,7 +10,6 @@ TODO: restrict Cookiecutter Django project initialization to
""" """
from __future__ import print_function from __future__ import print_function
import json
import os import os
import random import random
import shutil import shutil
@ -92,6 +91,11 @@ def remove_gulp_files():
file_names = ["gulpfile.js"] file_names = ["gulpfile.js"]
for file_name in file_names: for file_name in file_names:
os.remove(file_name) os.remove(file_name)
remove_sass_files()
def remove_sass_files():
shutil.rmtree(os.path.join("{{cookiecutter.project_slug}}", "static", "sass"))
def remove_packagejson_file(): def remove_packagejson_file():
@ -100,16 +104,6 @@ def remove_packagejson_file():
os.remove(file_name) os.remove(file_name)
def remove_bootstrap_packages():
with open("package.json", mode="r") as fd:
content = json.load(fd)
for package_name in ["bootstrap", "gulp-concat", "@popperjs/core"]:
content["devDependencies"].pop(package_name)
with open("package.json", mode="w") as fd:
json.dump(content, fd, ensure_ascii=False, indent=2)
fd.write("\n")
def remove_celery_files(): def remove_celery_files():
file_names = [ file_names = [
os.path.join("config", "celery_app.py"), os.path.join("config", "celery_app.py"),
@ -329,7 +323,7 @@ def remove_drf_starter_files():
) )
os.remove( os.remove(
os.path.join( os.path.join(
"{{cookiecutter.project_slug}}", "users", "tests", "test_swagger_ui.py" "{{cookiecutter.project_slug}}", "users", "tests", "test_swagger.py"
) )
) )
@ -368,13 +362,13 @@ def main():
if ( if (
"{{ cookiecutter.use_docker }}".lower() == "y" "{{ cookiecutter.use_docker }}".lower() == "y"
and "{{ cookiecutter.cloud_provider}}".lower() != "aws" and "{{ cookiecutter.cloud_provider}}" != "AWS"
): ):
remove_aws_dockerfile() remove_aws_dockerfile()
if "{{ cookiecutter.use_heroku }}".lower() == "n": if "{{ cookiecutter.use_heroku }}".lower() == "n":
remove_heroku_files() remove_heroku_files()
elif "{{ cookiecutter.use_compressor }}".lower() == "n": elif "{{ cookiecutter.frontend_pipeline }}" != "Django Compressor":
remove_heroku_build_hooks() remove_heroku_build_hooks()
if ( if (
@ -394,13 +388,11 @@ def main():
if "{{ cookiecutter.keep_local_envs_in_vcs }}".lower() == "y": if "{{ cookiecutter.keep_local_envs_in_vcs }}".lower() == "y":
append_to_gitignore_file("!.envs/.local/") append_to_gitignore_file("!.envs/.local/")
if "{{ cookiecutter.js_task_runner}}".lower() == "none": if "{{ cookiecutter.frontend_pipeline }}" != "Gulp":
remove_gulp_files() remove_gulp_files()
remove_packagejson_file() remove_packagejson_file()
if "{{ cookiecutter.use_docker }}".lower() == "y": if "{{ cookiecutter.use_docker }}".lower() == "y":
remove_node_dockerfile() remove_node_dockerfile()
elif "{{ cookiecutter.custom_bootstrap_compilation }}" == "n":
remove_bootstrap_packages()
if ("{{ cookiecutter.cloud_provider}}".lower() == "none") and ( if ("{{ cookiecutter.cloud_provider}}".lower() == "none") and (
"{{ cookiecutter.use_nginx_for_serve_media_files}}".lower() == "n" "{{ cookiecutter.use_nginx_for_serve_media_files}}".lower() == "n"
@ -419,13 +411,13 @@ def main():
if "{{ cookiecutter.use_docker }}".lower() == "y": if "{{ cookiecutter.use_docker }}".lower() == "y":
remove_celery_compose_dirs() remove_celery_compose_dirs()
if "{{ cookiecutter.ci_tool }}".lower() != "travis": if "{{ cookiecutter.ci_tool }}" != "Travis":
remove_dottravisyml_file() remove_dottravisyml_file()
if "{{ cookiecutter.ci_tool }}".lower() != "gitlab": if "{{ cookiecutter.ci_tool }}" != "Gitlab":
remove_dotgitlabciyml_file() remove_dotgitlabciyml_file()
if "{{ cookiecutter.ci_tool }}".lower() != "github": if "{{ cookiecutter.ci_tool }}" != "Github":
remove_dotgithub_folder() remove_dotgithub_folder()
if "{{ cookiecutter.use_drf }}".lower() == "n": if "{{ cookiecutter.use_drf }}".lower() == "n":

View File

@ -42,7 +42,7 @@ if "{{ cookiecutter.use_docker }}".lower() == "n":
if python_major_version == 2: if python_major_version == 2:
print( print(
WARNING + "You're running cookiecutter under Python 2, but the generated " WARNING + "You're running cookiecutter under Python 2, but the generated "
"project requires Python 3.9+. Do you want to proceed (y/n)? " + TERMINATOR "project requires Python 3.10+. Do you want to proceed (y/n)? " + TERMINATOR
) )
yes_options, no_options = frozenset(["y"]), frozenset(["n"]) yes_options, no_options = frozenset(["y"]), frozenset(["n"])
while True: while True:

View File

@ -1,4 +1,3 @@
[pytest] [pytest]
addopts = -v --tb=short addopts = -v --tb=short
python_paths = .
norecursedirs = .tox .git */migrations/* */static/* docs venv */{{cookiecutter.project_slug}}/* norecursedirs = .tox .git */migrations/* */static/* docs venv */{{cookiecutter.project_slug}}/*

View File

@ -1,26 +1,26 @@
cookiecutter==1.7.3 cookiecutter==2.1.1
sh==1.14.2 sh==1.14.3; sys_platform != "win32"
binaryornot==0.4.4 binaryornot==0.4.4
# Code quality # Code quality
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
black==21.12b0 black==22.10.0
isort==5.10.1 isort==5.10.1
flake8==4.0.1 flake8==5.0.4
flake8-isort==4.1.1 flake8-isort==5.0.0
pre-commit==2.17.0 pre-commit==2.20.0
# Testing # Testing
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
tox==3.24.5 tox==3.26.0
pytest==6.2.5 pytest==7.1.3
pytest-cookies==0.6.1 pytest-cookies==0.6.1
pytest-instafail==0.4.2 pytest-instafail==0.4.2
pyyaml==6.0 pyyaml==6.0
# Scripting # Scripting
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
PyGithub==1.55 PyGithub==1.56
gitpython==3.1.26 gitpython==3.1.29
jinja2==3.0.3 jinja2==3.1.2
requests==2.27.1 requests==2.28.1

View File

@ -11,8 +11,9 @@ from __future__ import annotations
import os import os
import re import re
import sys import sys
from collections.abc import Iterable
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING, Any, Iterable, NamedTuple from typing import TYPE_CHECKING, Any, NamedTuple
import requests import requests
from github import Github from github import Github
@ -47,6 +48,11 @@ class DjVersion(NamedTuple):
major, minor, *_ = version_str.split(".") major, minor, *_ = version_str.split(".")
return cls(major=int(major), minor=int(minor)) return cls(major=int(major), minor=int(minor))
@classmethod
def parse_to_tuple(cls, version_str: str):
version = cls.parse(version_str=version_str)
return version.major, version.minor
def get_package_info(package: str) -> dict: def get_package_info(package: str) -> dict:
"""Get package metadata using PyPI API.""" """Get package metadata using PyPI API."""
@ -75,17 +81,22 @@ def get_name_and_version(requirements_line: str) -> tuple[str, ...]:
return name_without_extras, version return name_without_extras, version
def get_all_latest_django_versions() -> tuple[DjVersion, list[DjVersion]]: def get_all_latest_django_versions(
django_max_version: tuple[DjVersion] = None,
) -> tuple[DjVersion, list[DjVersion]]:
""" """
Grabs all Django versions that are worthy of a GitHub issue. Grabs all Django versions that are worthy of a GitHub issue.
Depends on Django versions having higher major version or minor version. Depends on Django versions having higher major version or minor version.
""" """
_django_max_version = (99, 99)
if django_max_version:
_django_max_version = django_max_version
print("Fetching all Django versions from PyPI") print("Fetching all Django versions from PyPI")
base_txt = REQUIREMENTS_DIR / "base.txt" base_txt = REQUIREMENTS_DIR / "base.txt"
with base_txt.open() as f: with base_txt.open() as f:
for line in f.readlines(): for line in f.readlines():
if "django==" in line: if "django==" in line.lower():
break break
else: else:
print(f"django not found in {base_txt}") # Huh...? print(f"django not found in {base_txt}") # Huh...?
@ -97,7 +108,7 @@ def get_all_latest_django_versions() -> tuple[DjVersion, list[DjVersion]]:
current_minor_version = DjVersion.parse(current_version_str) current_minor_version = DjVersion.parse(current_version_str)
newer_versions: set[DjVersion] = set() newer_versions: set[DjVersion] = set()
for django_version in get_django_versions(): for django_version in get_django_versions():
if django_version > current_minor_version: if current_minor_version < django_version <= _django_max_version:
newer_versions.add(django_version) newer_versions.add(django_version)
return current_minor_version, sorted(newer_versions, reverse=True) return current_minor_version, sorted(newer_versions, reverse=True)
@ -143,7 +154,13 @@ class GitHubManager:
for requirements_file in self.requirements_files: for requirements_file in self.requirements_files:
with (REQUIREMENTS_DIR / f"{requirements_file}.txt").open() as f: with (REQUIREMENTS_DIR / f"{requirements_file}.txt").open() as f:
for line in f.readlines(): for line in f.readlines():
if "==" in line and not line.startswith("{%"): if (
"==" in line
and not line.startswith("{%")
and not line.startswith(" #")
and not line.startswith("#")
and not line.startswith(" ")
):
name, version = get_name_and_version(line) name, version = get_name_and_version(line)
self.requirements[requirements_file][name] = ( self.requirements[requirements_file][name] = (
version, version,
@ -192,9 +209,9 @@ class GitHubManager:
# updated packages, or known releases that will happen but haven't yet # updated packages, or known releases that will happen but haven't yet
if issue := self.existing_issues.get(needed_dj_version): if issue := self.existing_issues.get(needed_dj_version):
if index := issue.body.find(package_name): if index := issue.body.find(package_name):
name, _current, prev_compat, ok = [ name, _current, prev_compat, ok = (
s.strip() for s in issue.body[index:].split("|", 4)[:4] s.strip() for s in issue.body[index:].split("|", 4)[:4]
] )
if ok in ("", "", "🕒"): if ok in ("", "", "🕒"):
return prev_compat, ok return prev_compat, ok
@ -251,11 +268,12 @@ class GitHubManager:
) )
requirements += ( requirements += (
f"| {self._get_md_home_page_url(info).format(package_name)} " f"| {self._get_md_home_page_url(info).format(package_name)} "
f"| {version} " f"| {version.strip()} "
f"| {compat_version} " f"| {compat_version.strip()} "
f"| {icon} " f"| {icon} "
f"|\n" f"|\n"
) )
return requirements return requirements
def create_or_edit_issue(self, needed_dj_version: DjVersion, description: str): def create_or_edit_issue(self, needed_dj_version: DjVersion, description: str):
@ -277,9 +295,11 @@ class GitHubManager:
self.create_or_edit_issue(version, md_content) self.create_or_edit_issue(version, md_content)
def main() -> None: def main(django_max_version=None) -> None:
# Check if there are any djs # Check if there are any djs
current_dj, latest_djs = get_all_latest_django_versions() current_dj, latest_djs = get_all_latest_django_versions(
django_max_version=django_max_version
)
if not latest_djs: if not latest_djs:
sys.exit(0) sys.exit(0)
manager = GitHubManager(current_dj, latest_djs) manager = GitHubManager(current_dj, latest_djs)
@ -292,4 +312,9 @@ if __name__ == "__main__":
raise RuntimeError( raise RuntimeError(
"No github repo, please set the environment variable GITHUB_REPOSITORY" "No github repo, please set the environment variable GITHUB_REPOSITORY"
) )
main() max_version = None
last_arg = sys.argv[-1]
if CURRENT_FILE.name not in last_arg:
max_version = DjVersion.parse_to_tuple(version_str=last_arg)
main(django_max_version=max_version)

View File

@ -1,8 +1,8 @@
import datetime as dt import datetime as dt
import os import os
import re import re
from collections.abc import Iterable
from pathlib import Path from pathlib import Path
from typing import Iterable
import git import git
import github.PullRequest import github.PullRequest

View File

@ -5,7 +5,7 @@ except ImportError:
from distutils.core import setup from distutils.core import setup
# We use calendar versioning # We use calendar versioning
version = "2022.01.27" version = "2022.10.24"
with open("README.rst") as readme_file: with open("README.rst") as readme_file:
long_description = readme_file.read() long_description = readme_file.read()
@ -27,13 +27,13 @@ setup(
classifiers=[ classifiers=[
"Development Status :: 4 - Beta", "Development Status :: 4 - Beta",
"Environment :: Console", "Environment :: Console",
"Framework :: Django :: 3.2", "Framework :: Django :: 4.0",
"Intended Audience :: Developers", "Intended Audience :: Developers",
"Natural Language :: English", "Natural Language :: English",
"License :: OSI Approved :: BSD License", "License :: OSI Approved :: BSD License",
"Programming Language :: Python", "Programming Language :: Python",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: CPython",
"Topic :: Software Development", "Topic :: Software Development",
], ],

View File

@ -47,11 +47,11 @@ SUPPORTED_COMBINATIONS = [
{"use_pycharm": "n"}, {"use_pycharm": "n"},
{"use_docker": "y"}, {"use_docker": "y"},
{"use_docker": "n"}, {"use_docker": "n"},
{"postgresql_version": "14.1"}, {"postgresql_version": "14"},
{"postgresql_version": "13.5"}, {"postgresql_version": "13"},
{"postgresql_version": "12.9"}, {"postgresql_version": "12"},
{"postgresql_version": "11.14"}, {"postgresql_version": "11"},
{"postgresql_version": "10.19"}, {"postgresql_version": "10"},
{"cloud_provider": "AWS", "use_whitenoise": "y"}, {"cloud_provider": "AWS", "use_whitenoise": "y"},
{"cloud_provider": "AWS", "use_whitenoise": "n"}, {"cloud_provider": "AWS", "use_whitenoise": "n"},
{"cloud_provider": "GCP", "use_whitenoise": "y"}, {"cloud_provider": "GCP", "use_whitenoise": "y"},
@ -87,12 +87,9 @@ SUPPORTED_COMBINATIONS = [
{"use_async": "n"}, {"use_async": "n"},
{"use_drf": "y"}, {"use_drf": "y"},
{"use_drf": "n"}, {"use_drf": "n"},
{"js_task_runner": "None"}, {"frontend_pipeline": "None"},
{"js_task_runner": "Gulp"}, {"frontend_pipeline": "Django Compressor"},
{"custom_bootstrap_compilation": "y"}, {"frontend_pipeline": "Gulp"},
{"custom_bootstrap_compilation": "n"},
{"use_compressor": "y"},
{"use_compressor": "n"},
{"use_celery": "y"}, {"use_celery": "y"},
{"use_celery": "n"}, {"use_celery": "n"},
{"use_mailhog": "y"}, {"use_mailhog": "y"},
@ -141,7 +138,7 @@ def check_paths(paths):
if is_binary(path): if is_binary(path):
continue continue
for line in open(path, "r"): for line in open(path):
match = RE_OBJ.search(line) match = RE_OBJ.search(line)
assert match is None, f"cookiecutter variable not replaced in {path}" assert match is None, f"cookiecutter variable not replaced in {path}"
@ -153,10 +150,10 @@ def test_project_generation(cookies, context, context_override):
result = cookies.bake(extra_context={**context, **context_override}) result = cookies.bake(extra_context={**context, **context_override})
assert result.exit_code == 0 assert result.exit_code == 0
assert result.exception is None assert result.exception is None
assert result.project.basename == context["project_slug"] assert result.project_path.name == context["project_slug"]
assert result.project.isdir() assert result.project_path.is_dir()
paths = build_files_list(str(result.project)) paths = build_files_list(str(result.project_path))
assert paths assert paths
check_paths(paths) check_paths(paths)
@ -167,7 +164,7 @@ def test_flake8_passes(cookies, context_override):
result = cookies.bake(extra_context=context_override) result = cookies.bake(extra_context=context_override)
try: try:
sh.flake8(_cwd=str(result.project)) sh.flake8(_cwd=str(result.project_path))
except sh.ErrorReturnCode as e: except sh.ErrorReturnCode as e:
pytest.fail(e.stdout.decode()) pytest.fail(e.stdout.decode())
@ -179,7 +176,12 @@ def test_black_passes(cookies, context_override):
try: try:
sh.black( sh.black(
"--check", "--diff", "--exclude", "migrations", _cwd=str(result.project) "--check",
"--diff",
"--exclude",
"migrations",
".",
_cwd=str(result.project_path),
) )
except sh.ErrorReturnCode as e: except sh.ErrorReturnCode as e:
pytest.fail(e.stdout.decode()) pytest.fail(e.stdout.decode())
@ -198,10 +200,10 @@ def test_travis_invokes_pytest(cookies, context, use_docker, expected_test_scrip
assert result.exit_code == 0 assert result.exit_code == 0
assert result.exception is None assert result.exception is None
assert result.project.basename == context["project_slug"] assert result.project_path.name == context["project_slug"]
assert result.project.isdir() assert result.project_path.is_dir()
with open(f"{result.project}/.travis.yml", "r") as travis_yml: with open(f"{result.project_path}/.travis.yml") as travis_yml:
try: try:
yml = yaml.safe_load(travis_yml)["jobs"]["include"] yml = yaml.safe_load(travis_yml)["jobs"]["include"]
assert yml[0]["script"] == ["flake8"] assert yml[0]["script"] == ["flake8"]
@ -225,10 +227,10 @@ def test_gitlab_invokes_flake8_and_pytest(
assert result.exit_code == 0 assert result.exit_code == 0
assert result.exception is None assert result.exception is None
assert result.project.basename == context["project_slug"] assert result.project_path.name == context["project_slug"]
assert result.project.isdir() assert result.project_path.is_dir()
with open(f"{result.project}/.gitlab-ci.yml", "r") as gitlab_yml: with open(f"{result.project_path}/.gitlab-ci.yml") as gitlab_yml:
try: try:
gitlab_config = yaml.safe_load(gitlab_yml) gitlab_config = yaml.safe_load(gitlab_yml)
assert gitlab_config["flake8"]["script"] == ["flake8"] assert gitlab_config["flake8"]["script"] == ["flake8"]
@ -252,10 +254,10 @@ def test_github_invokes_linter_and_pytest(
assert result.exit_code == 0 assert result.exit_code == 0
assert result.exception is None assert result.exception is None
assert result.project.basename == context["project_slug"] assert result.project_path.name == context["project_slug"]
assert result.project.isdir() assert result.project_path.is_dir()
with open(f"{result.project}/.github/workflows/ci.yml", "r") as github_yml: with open(f"{result.project_path}/.github/workflows/ci.yml") as github_yml:
try: try:
github_config = yaml.safe_load(github_yml) github_config = yaml.safe_load(github_yml)
linter_present = False linter_present = False
@ -306,6 +308,6 @@ def test_pycharm_docs_removed(cookies, context, use_pycharm, pycharm_docs_exist)
context.update({"use_pycharm": use_pycharm}) context.update({"use_pycharm": use_pycharm})
result = cookies.bake(extra_context=context) result = cookies.bake(extra_context=context)
with open(f"{result.project}/docs/index.rst", "r") as f: with open(f"{result.project_path}/docs/index.rst") as f:
has_pycharm_docs = "pycharm/configuration" in f.read() has_pycharm_docs = "pycharm/configuration" in f.read()
assert has_pycharm_docs is pycharm_docs_exist assert has_pycharm_docs is pycharm_docs_exist

View File

@ -1,6 +1,6 @@
[tox] [tox]
skipsdist = true skipsdist = true
envlist = py39,black-template envlist = py310,black-template
[testenv] [testenv]
deps = -rrequirements.txt deps = -rrequirements.txt

View File

@ -82,7 +82,7 @@ updates:
schedule: schedule:
interval: "daily" interval: "daily"
{%- if cookiecutter.js_task_runner != "None" %} {%- if cookiecutter.frontend_pipeline == 'Gulp' %}
# Enable version updates for javascript/npm # Enable version updates for javascript/npm
- package-ecosystem: "npm" - package-ecosystem: "npm"

View File

@ -14,6 +14,9 @@ on:
branches: [ "master", "main" ] branches: [ "master", "main" ]
paths-ignore: [ "docs/**" ] paths-ignore: [ "docs/**" ]
concurrency:
group: {% raw %}${{ github.head_ref || github.run_id }}{% endraw %}
cancel-in-progress: true
jobs: jobs:
linter: linter:
@ -21,12 +24,12 @@ jobs:
steps: steps:
- name: Checkout Code Repository - name: Checkout Code Repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v3
with: with:
python-version: "3.9" python-version: "3.10"
cache: pip cache: pip
cache-dependency-path: | cache-dependency-path: |
requirements/base.txt requirements/base.txt
@ -65,7 +68,7 @@ jobs:
steps: steps:
- name: Checkout Code Repository - name: Checkout Code Repository
uses: actions/checkout@v2 uses: actions/checkout@v3
{%- if cookiecutter.use_docker == 'y' %} {%- if cookiecutter.use_docker == 'y' %}
- name: Build the Stack - name: Build the Stack
@ -82,9 +85,9 @@ jobs:
{%- else %} {%- else %}
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v3
with: with:
python-version: "3.9" python-version: "3.10"
cache: pip cache: pip
cache-dependency-path: | cache-dependency-path: |
requirements/base.txt requirements/base.txt

View File

@ -338,7 +338,7 @@ MailHog
.ipython/ .ipython/
{%- endif %} {%- endif %}
{%- if cookiecutter.js_task_runner == 'Gulp' %} {%- if cookiecutter.frontend_pipeline == 'Gulp' %}
project.css project.css
project.min.css project.min.css
vendors.js vendors.js

View File

@ -13,7 +13,7 @@ variables:
flake8: flake8:
stage: lint stage: lint
image: python:3.9-alpine image: python:3.10-alpine
before_script: before_script:
- pip install -q flake8 - pip install -q flake8
script: script:
@ -22,7 +22,7 @@ flake8:
pytest: pytest:
stage: test stage: test
{% if cookiecutter.use_docker == 'y' -%} {% if cookiecutter.use_docker == 'y' -%}
image: docker/compose:latest image: docker/compose:1.29.2
tags: tags:
- docker - docker
services: services:
@ -35,7 +35,7 @@ pytest:
script: script:
- docker-compose -f local.yml run django pytest - docker-compose -f local.yml run django pytest
{%- else -%} {%- else -%}
image: python:3.9 image: python:3.10
tags: tags:
- python - python
services: services:

View File

@ -10,7 +10,7 @@
<option value="celeryworker"/> <option value="celeryworker"/>
<option value="celerybeat"/> <option value="celerybeat"/>
{%- endif %} {%- endif %}
{%- if cookiecutter.js_task_runner == 'Gulp' %} {%- if cookiecutter.frontend_pipeline == 'Gulp' %}
<option value="node"/> <option value="node"/>
{%- endif %} {%- endif %}
</list> </list>

View File

@ -13,7 +13,7 @@
</facet> </facet>
</component> </component>
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
{% if cookiecutter.js_task_runner != 'None' %} {% if cookiecutter.frontend_pipeline == 'Gulp' %}
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/node_modules" /> <excludeFolder url="file://$MODULE_DIR$/node_modules" />
</content> </content>

View File

@ -3,14 +3,20 @@ default_stages: [commit]
repos: repos:
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.1.0 rev: v4.3.0
hooks: hooks:
- id: trailing-whitespace - id: trailing-whitespace
- id: end-of-file-fixer - id: end-of-file-fixer
- id: check-yaml - id: check-yaml
- repo: https://github.com/asottile/pyupgrade
rev: v3.1.0
hooks:
- id: pyupgrade
args: [--py310-plus]
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: 21.12b0 rev: 22.10.0
hooks: hooks:
- id: black - id: black
@ -20,7 +26,7 @@ repos:
- id: isort - id: isort
- repo: https://github.com/PyCQA/flake8 - repo: https://github.com/PyCQA/flake8
rev: 4.0.1 rev: 5.0.4
hooks: hooks:
- id: flake8 - id: flake8
args: ["--config=setup.cfg"] args: ["--config=setup.cfg"]

View File

@ -1,6 +1,6 @@
[MASTER] [MASTER]
load-plugins=pylint_django{% if cookiecutter.use_celery == "y" %}, pylint_celery{% endif %} load-plugins=pylint_django{% if cookiecutter.use_celery == "y" %}, pylint_celery{% endif %}
django-settings-module=config.settings.base django-settings-module=config.settings.local
[FORMAT] [FORMAT]
max-line-length=120 max-line-length=120

View File

@ -7,6 +7,6 @@ build:
image: testing image: testing
python: python:
version: 3.9 version: 3.10
install: install:
- requirements: requirements/local.txt - requirements: requirements/local.txt

View File

@ -2,7 +2,7 @@ dist: focal
language: python language: python
python: python:
- "3.9" - "3.10"
services: services:
- {% if cookiecutter.use_docker == 'y' %}docker{% else %}postgresql{% endif %} - {% if cookiecutter.use_docker == 'y' %}docker{% else %}postgresql{% endif %}
@ -37,7 +37,7 @@ jobs:
- sudo apt-get install -qq libsqlite3-dev libxml2 libxml2-dev libssl-dev libbz2-dev wget curl llvm - sudo apt-get install -qq libsqlite3-dev libxml2 libxml2-dev libssl-dev libbz2-dev wget curl llvm
language: python language: python
python: python:
- "3.9" - "3.10"
install: install:
- pip install -r requirements/local.txt - pip install -r requirements/local.txt
script: script:

View File

@ -20,7 +20,7 @@ Moved to [settings](http://cookiecutter-django.readthedocs.io/en/latest/settings
- To create a **normal user account**, just go to Sign Up and fill out the form. Once you submit it, you'll see a "Verify Your E-mail Address" page. Go to your console to see a simulated email verification message. Copy the link into your browser. Now the user's email should be verified and ready to go. - To create a **normal user account**, just go to Sign Up and fill out the form. Once you submit it, you'll see a "Verify Your E-mail Address" page. Go to your console to see a simulated email verification message. Copy the link into your browser. Now the user's email should be verified and ready to go.
- To create an **superuser account**, use this command: - To create a **superuser account**, use this command:
$ python manage.py createsuperuser $ python manage.py createsuperuser
@ -46,7 +46,7 @@ To run the tests, check your test coverage, and generate an HTML coverage report
### Live reloading and Sass CSS compilation ### Live reloading and Sass CSS compilation
Moved to [Live reloading and SASS compilation](http://cookiecutter-django.readthedocs.io/en/latest/live-reloading-and-sass-compilation.html). Moved to [Live reloading and SASS compilation](https://cookiecutter-django.readthedocs.io/en/latest/developing-locally.html#sass-compilation-live-reloading).
{%- if cookiecutter.use_celery == "y" %} {%- if cookiecutter.use_celery == "y" %}
@ -128,7 +128,7 @@ See detailed [cookiecutter-django Heroku documentation](http://cookiecutter-djan
See detailed [cookiecutter-django Docker documentation](http://cookiecutter-django.readthedocs.io/en/latest/deployment-with-docker.html). See detailed [cookiecutter-django Docker documentation](http://cookiecutter-django.readthedocs.io/en/latest/deployment-with-docker.html).
{%- endif %} {%- endif %}
{%- if cookiecutter.custom_bootstrap_compilation == "y" %} {%- if cookiecutter.frontend_pipeline == 'Gulp' %}
### Custom Bootstrap Compilation ### Custom Bootstrap Compilation
The generated CSS is set up with automatic Bootstrap recompilation with variables of your choice. The generated CSS is set up with automatic Bootstrap recompilation with variables of your choice.
@ -136,8 +136,5 @@ Bootstrap v5 is installed using npm and customised by tweaking your variables in
You can find a list of available variables [in the bootstrap source](https://github.com/twbs/bootstrap/blob/main/scss/_variables.scss), or get explanations on them in the [Bootstrap docs](https://getbootstrap.com/docs/5.1/customize/sass/). You can find a list of available variables [in the bootstrap source](https://github.com/twbs/bootstrap/blob/main/scss/_variables.scss), or get explanations on them in the [Bootstrap docs](https://getbootstrap.com/docs/5.1/customize/sass/).
{%- if cookiecutter.js_task_runner == "Gulp" %}
Bootstrap's javascript as well as its dependencies is concatenated into a single file: `static/js/vendors.js`. Bootstrap's javascript as well as its dependencies is concatenated into a single file: `static/js/vendors.js`.
{%- endif %} {%- endif %}
{%- endif %}

View File

@ -1,4 +1,4 @@
ARG PYTHON_VERSION=3.9-slim-bullseye ARG PYTHON_VERSION=3.10-slim-bullseye
# define an alias for the specfic python version used in this file. # define an alias for the specfic python version used in this file.
FROM python:${PYTHON_VERSION} as python FROM python:${PYTHON_VERSION} as python

View File

@ -4,4 +4,4 @@ set -o errexit
set -o nounset set -o nounset
watchgod celery.__main__.main --args -A config.celery_app worker -l INFO watchfiles celery.__main__.main --args '-A config.celery_app worker -l INFO'

View File

@ -7,7 +7,7 @@ set -o nounset
python manage.py migrate python manage.py migrate
{%- if cookiecutter.use_async == 'y' %} {%- if cookiecutter.use_async == 'y' %}
uvicorn config.asgi:application --host 0.0.0.0 --reload uvicorn config.asgi:application --host 0.0.0.0 --reload --reload-include '*.html'
{%- else %} {%- else %}
python manage.py runserver_plus 0.0.0.0:8000 python manage.py runserver_plus 0.0.0.0:8000
{%- endif %} {%- endif %}

View File

@ -1,4 +1,4 @@
ARG PYTHON_VERSION=3.9-slim-bullseye ARG PYTHON_VERSION=3.10-slim-bullseye
# define an alias for the specfic python version used in this file. # define an alias for the specfic python version used in this file.
FROM python:${PYTHON_VERSION} as python FROM python:${PYTHON_VERSION} as python
@ -22,7 +22,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
COPY ./requirements /requirements COPY ./requirements /requirements
# create python dependency wheels # create python dependency wheels
RUN pip wheel --no-cache-dir --no-deps --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 \ -r /requirements/local.txt -r /requirements/production.txt \
&& rm -rf /requirements && rm -rf /requirements

View File

@ -1,6 +1,6 @@
ARG PYTHON_VERSION=3.9-slim-bullseye ARG PYTHON_VERSION=3.10-slim-bullseye
{% if cookiecutter.js_task_runner == 'Gulp' -%} {% if cookiecutter.frontend_pipeline == 'Gulp' -%}
FROM node:16-bullseye-slim as client-builder FROM node:16-bullseye-slim as client-builder
ARG APP_HOME=/app ARG APP_HOME=/app
@ -99,7 +99,7 @@ RUN chmod +x /start-flower
# copy application code to WORKDIR # copy application code to WORKDIR
{%- if cookiecutter.js_task_runner == 'Gulp' %} {%- if cookiecutter.frontend_pipeline == 'Gulp' %}
COPY --from=client-builder --chown=django:django ${APP_HOME} ${APP_HOME} COPY --from=client-builder --chown=django:django ${APP_HOME} ${APP_HOME}
{% else %} {% else %}
COPY --chown=django:django . ${APP_HOME} COPY --chown=django:django . ${APP_HOME}

View File

@ -16,13 +16,17 @@ if [ -z "${POSTGRES_USER}" ]; then
fi fi
export DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}" export DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
postgres_ready() {
python << END python << END
import sys import sys
import time
import psycopg2 import psycopg2
try: suggest_unrecoverable_after = 30
start = time.time()
while True:
try:
psycopg2.connect( psycopg2.connect(
dbname="${POSTGRES_DB}", dbname="${POSTGRES_DB}",
user="${POSTGRES_USER}", user="${POSTGRES_USER}",
@ -30,16 +34,16 @@ try:
host="${POSTGRES_HOST}", host="${POSTGRES_HOST}",
port="${POSTGRES_PORT}", port="${POSTGRES_PORT}",
) )
except psycopg2.OperationalError: break
sys.exit(-1) except psycopg2.OperationalError as error:
sys.exit(0) sys.stderr.write("Waiting for PostgreSQL to become available...\n")
if time.time() - start > suggest_unrecoverable_after:
sys.stderr.write(" This is taking longer than expected. The following exception may be indicative of an unrecoverable error: '{}'\n".format(error))
time.sleep(1)
END END
}
until postgres_ready; do
>&2 echo 'Waiting for PostgreSQL to become available...'
sleep 1
done
>&2 echo 'PostgreSQL is available' >&2 echo 'PostgreSQL is available'
exec "$@" exec "$@"

View File

@ -6,7 +6,7 @@ set -o nounset
python /app/manage.py collectstatic --noinput python /app/manage.py collectstatic --noinput
{% if cookiecutter.use_whitenoise == 'y' and cookiecutter.use_compressor == 'y' %} {% if cookiecutter.use_whitenoise == 'y' and cookiecutter.frontend_pipeline == 'Django Compressor' %}
compress_enabled() { compress_enabled() {
python << END python << END
import sys import sys

View File

@ -44,7 +44,10 @@ LOCALE_PATHS = [str(ROOT_DIR / "locale")]
DATABASES = {"default": env.db("DATABASE_URL")} DATABASES = {"default": env.db("DATABASE_URL")}
{%- else %} {%- else %}
DATABASES = { DATABASES = {
"default": env.db("DATABASE_URL", default="postgres://{% if cookiecutter.windows == 'y' %}localhost{% endif %}/{{cookiecutter.project_slug}}"), "default": env.db(
"DATABASE_URL",
default="postgres://{% if cookiecutter.windows == 'y' %}localhost{% endif %}/{{cookiecutter.project_slug}}",
),
} }
{%- endif %} {%- endif %}
DATABASES["default"]["ATOMIC_REQUESTS"] = True DATABASES["default"]["ATOMIC_REQUESTS"] = True
@ -274,25 +277,25 @@ LOGGING = {
# Celery # Celery
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
if USE_TZ: if USE_TZ:
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-timezone # https://docs.celeryq.dev/en/stable/userguide/configuration.html#std:setting-timezone
CELERY_TIMEZONE = TIME_ZONE CELERY_TIMEZONE = TIME_ZONE
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-broker_url # https://docs.celeryq.dev/en/stable/userguide/configuration.html#std:setting-broker_url
CELERY_BROKER_URL = env("CELERY_BROKER_URL") CELERY_BROKER_URL = env("CELERY_BROKER_URL")
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-result_backend # https://docs.celeryq.dev/en/stable/userguide/configuration.html#std:setting-result_backend
CELERY_RESULT_BACKEND = CELERY_BROKER_URL CELERY_RESULT_BACKEND = CELERY_BROKER_URL
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-accept_content # https://docs.celeryq.dev/en/stable/userguide/configuration.html#std:setting-accept_content
CELERY_ACCEPT_CONTENT = ["json"] CELERY_ACCEPT_CONTENT = ["json"]
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-task_serializer # https://docs.celeryq.dev/en/stable/userguide/configuration.html#std:setting-task_serializer
CELERY_TASK_SERIALIZER = "json" CELERY_TASK_SERIALIZER = "json"
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-result_serializer # https://docs.celeryq.dev/en/stable/userguide/configuration.html#std:setting-result_serializer
CELERY_RESULT_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json"
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#task-time-limit # https://docs.celeryq.dev/en/stable/userguide/configuration.html#task-time-limit
# TODO: set to whatever value is adequate in your circumstances # TODO: set to whatever value is adequate in your circumstances
CELERY_TASK_TIME_LIMIT = 5 * 60 CELERY_TASK_TIME_LIMIT = 5 * 60
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#task-soft-time-limit # https://docs.celeryq.dev/en/stable/userguide/configuration.html#task-soft-time-limit
# TODO: set to whatever value is adequate in your circumstances # TODO: set to whatever value is adequate in your circumstances
CELERY_TASK_SOFT_TIME_LIMIT = 60 CELERY_TASK_SOFT_TIME_LIMIT = 60
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#beat-scheduler # https://docs.celeryq.dev/en/stable/userguide/configuration.html#beat-scheduler
CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler" CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"
{%- endif %} {%- endif %}
@ -313,7 +316,7 @@ ACCOUNT_FORMS = {"signup": "{{cookiecutter.project_slug}}.users.forms.UserSignup
SOCIALACCOUNT_ADAPTER = "{{cookiecutter.project_slug}}.users.adapters.SocialAccountAdapter" SOCIALACCOUNT_ADAPTER = "{{cookiecutter.project_slug}}.users.adapters.SocialAccountAdapter"
# https://django-allauth.readthedocs.io/en/latest/forms.html # https://django-allauth.readthedocs.io/en/latest/forms.html
SOCIALACCOUNT_FORMS = {"signup": "{{cookiecutter.project_slug}}.users.forms.UserSocialSignupForm"} SOCIALACCOUNT_FORMS = {"signup": "{{cookiecutter.project_slug}}.users.forms.UserSocialSignupForm"}
{% if cookiecutter.use_compressor == 'y' -%} {% if cookiecutter.frontend_pipeline == 'Django Compressor' -%}
# django-compressor # django-compressor
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# https://django-compressor.readthedocs.io/en/latest/quickstart/#installation # https://django-compressor.readthedocs.io/en/latest/quickstart/#installation
@ -330,20 +333,21 @@ REST_FRAMEWORK = {
"rest_framework.authentication.TokenAuthentication", "rest_framework.authentication.TokenAuthentication",
), ),
"DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",), "DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",),
"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
} }
# django-cors-headers - https://github.com/adamchainz/django-cors-headers#setup # django-cors-headers - https://github.com/adamchainz/django-cors-headers#setup
CORS_URLS_REGEX = r"^/api/.*$" CORS_URLS_REGEX = r"^/api/.*$"
# By Default swagger ui is available only to admin user. You can change permission classs to change that # By Default swagger ui is available only to admin user(s). You can change permission classes to change that
# See more configuration options at https://drf-spectacular.readthedocs.io/en/latest/settings.html#settings # See more configuration options at https://drf-spectacular.readthedocs.io/en/latest/settings.html#settings
SPECTACULAR_SETTINGS = { SPECTACULAR_SETTINGS = {
"TITLE": "{{ cookiecutter.project_name }} API", "TITLE": "{{ cookiecutter.project_name }} API",
"DESCRIPTION": "Documentation of API endpoiints of {{ cookiecutter.project_name }}", "DESCRIPTION": "Documentation of API endpoints of {{ cookiecutter.project_name }}",
"VERSION": "1.0.0", "VERSION": "1.0.0",
"SERVE_PERMISSIONS": ["rest_framework.permissions.IsAdminUser"], "SERVE_PERMISSIONS": ["rest_framework.permissions.IsAdminUser"],
"SERVERS": [ "SERVERS": [
{"url": "https://127.0.0.1:8000", "description": "Local Development server"}, {"url": "http://127.0.0.1:8000", "description": "Local Development server"},
{"url": "https://{{ cookiecutter.domain_name }}", "description": "Production server"}, {"url": "https://{{ cookiecutter.domain_name }}", "description": "Production server"},
], ],
} }

View File

@ -69,7 +69,7 @@ if env("USE_DOCKER") == "yes":
hostname, _, ips = socket.gethostbyname_ex(socket.gethostname()) 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.js_task_runner == 'Gulp' %} {%- if cookiecutter.frontend_pipeline == 'Gulp' %}
try: try:
_, _, ips = socket.gethostbyname_ex("node") _, _, ips = socket.gethostbyname_ex("node")
INTERNAL_IPS.extend(ips) INTERNAL_IPS.extend(ips)
@ -88,10 +88,10 @@ INSTALLED_APPS += ["django_extensions"] # noqa F405
# Celery # Celery
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
{% if cookiecutter.use_docker == 'n' -%} {% if cookiecutter.use_docker == 'n' -%}
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#task-always-eager # https://docs.celeryq.dev/en/stable/userguide/configuration.html#task-always-eager
CELERY_TASK_ALWAYS_EAGER = True CELERY_TASK_ALWAYS_EAGER = True
{%- endif %} {%- endif %}
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#task-eager-propagates # https://docs.celeryq.dev/en/stable/userguide/configuration.html#task-eager-propagates
CELERY_TASK_EAGER_PROPAGATES = True CELERY_TASK_EAGER_PROPAGATES = True
{%- endif %} {%- endif %}

View File

@ -88,6 +88,11 @@ AWS_S3_OBJECT_PARAMETERS = {
"CacheControl": f"max-age={_AWS_EXPIRY}, s-maxage={_AWS_EXPIRY}, must-revalidate" "CacheControl": f"max-age={_AWS_EXPIRY}, s-maxage={_AWS_EXPIRY}, must-revalidate"
} }
# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings # https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings
AWS_S3_MAX_MEMORY_SIZE = env.int(
"DJANGO_AWS_S3_MAX_MEMORY_SIZE",
default=100_000_000, # 100MB
)
# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#settings
AWS_S3_REGION_NAME = env("DJANGO_AWS_S3_REGION_NAME", default=None) AWS_S3_REGION_NAME = env("DJANGO_AWS_S3_REGION_NAME", default=None)
# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#cloudfront # https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#cloudfront
AWS_S3_CUSTOM_DOMAIN = env("DJANGO_AWS_S3_CUSTOM_DOMAIN", default=None) AWS_S3_CUSTOM_DOMAIN = env("DJANGO_AWS_S3_CUSTOM_DOMAIN", default=None)
@ -167,7 +172,6 @@ EMAIL_BACKEND = "anymail.backends.mailjet.EmailBackend"
ANYMAIL = { ANYMAIL = {
"MAILJET_API_KEY": env("MAILJET_API_KEY"), "MAILJET_API_KEY": env("MAILJET_API_KEY"),
"MAILJET_SECRET_KEY": env("MAILJET_SECRET_KEY"), "MAILJET_SECRET_KEY": env("MAILJET_SECRET_KEY"),
"MAILJET_API_URL": env("MAILJET_API_URL", default="https://api.mailjet.com/v3"),
} }
{%- elif cookiecutter.mail_service == 'Mandrill' %} {%- elif cookiecutter.mail_service == 'Mandrill' %}
# https://anymail.readthedocs.io/en/stable/esps/mandrill/ # https://anymail.readthedocs.io/en/stable/esps/mandrill/
@ -190,8 +194,6 @@ ANYMAIL = {
EMAIL_BACKEND = "anymail.backends.sendgrid.EmailBackend" EMAIL_BACKEND = "anymail.backends.sendgrid.EmailBackend"
ANYMAIL = { ANYMAIL = {
"SENDGRID_API_KEY": env("SENDGRID_API_KEY"), "SENDGRID_API_KEY": env("SENDGRID_API_KEY"),
"SENDGRID_GENERATE_MESSAGE_ID": env("SENDGRID_GENERATE_MESSAGE_ID"),
"SENDGRID_MERGE_FIELD_FORMAT": env("SENDGRID_MERGE_FIELD_FORMAT"),
"SENDGRID_API_URL": env("SENDGRID_API_URL", default="https://api.sendgrid.com/v3/"), "SENDGRID_API_URL": env("SENDGRID_API_URL", default="https://api.sendgrid.com/v3/"),
} }
{%- elif cookiecutter.mail_service == 'SendinBlue' %} {%- elif cookiecutter.mail_service == 'SendinBlue' %}
@ -218,7 +220,7 @@ EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
ANYMAIL = {} ANYMAIL = {}
{%- endif %} {%- endif %}
{% if cookiecutter.use_compressor == 'y' -%} {% if cookiecutter.frontend_pipeline == 'Django Compressor' -%}
# django-compressor # django-compressor
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# https://django-compressor.readthedocs.io/en/latest/settings/#django.conf.settings.COMPRESS_ENABLED # https://django-compressor.readthedocs.io/en/latest/settings/#django.conf.settings.COMPRESS_ENABLED

View File

@ -25,5 +25,9 @@ PASSWORD_HASHERS = ["django.contrib.auth.hashers.MD5PasswordHasher"]
# https://docs.djangoproject.com/en/dev/ref/settings/#email-backend # https://docs.djangoproject.com/en/dev/ref/settings/#email-backend
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend" EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
# DEBUGING FOR TEMPLATES
# ------------------------------------------------------------------------------
TEMPLATES[0]["OPTIONS"]["debug"] = True # type: ignore # noqa F405
# Your stuff... # Your stuff...
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

View File

@ -24,7 +24,7 @@ livehtml:
sphinx-autobuild -b html sphinx-autobuild -b html
{%- if cookiecutter.use_docker == 'y' %} --host 0.0.0.0 {%- if cookiecutter.use_docker == 'y' %} --host 0.0.0.0
{%- else %} --open-browser {%- else %} --open-browser
{%- endif %} --port 7000 --watch $(APP) -c . $(SOURCEDIR) $(BUILDDIR)/html {%- endif %} --port 9000 --watch $(APP) -c . $(SOURCEDIR) $(BUILDDIR)/html
# Outputs rst files from django application code # Outputs rst files from django application code
apidocs: apidocs:

View File

@ -28,7 +28,7 @@ Docstrings to Documentation
The sphinx extension `apidoc <https://www.sphinx-doc.org/en/master/man/sphinx-apidoc.html/>`_ is used to automatically document code using signatures and docstrings. The sphinx extension `apidoc <https://www.sphinx-doc.org/en/master/man/sphinx-apidoc.html/>`_ is used to automatically document code using signatures and docstrings.
Numpy or Google style docstrings will be picked up from project files and availble for documentation. See the `Napoleon <https://sphinxcontrib-napoleon.readthedocs.io/en/latest/>`_ extension for details. Numpy or Google style docstrings will be picked up from project files and available for documentation. See the `Napoleon <https://sphinxcontrib-napoleon.readthedocs.io/en/latest/>`_ extension for details.
For an in-use example, see the `page source <_sources/users.rst.txt>`_ for :ref:`users`. For an in-use example, see the `page source <_sources/users.rst.txt>`_ for :ref:`users`.

View File

@ -32,7 +32,7 @@ if errorlevel 9009 (
goto end goto end
:livehtml :livehtml
sphinx-autobuild -b html --open-browser -p 7000 --watch %APP% -c . %SOURCEDIR% %BUILDDIR%/html sphinx-autobuild -b html --open-browser -p 9000 --watch %APP% -c . %SOURCEDIR% %BUILDDIR%/html
GOTO :EOF GOTO :EOF
:apidocs :apidocs

View File

@ -9,9 +9,7 @@ const pjson = require('./package.json')
// Plugins // Plugins
const autoprefixer = require('autoprefixer') const autoprefixer = require('autoprefixer')
const browserSync = require('browser-sync').create() const browserSync = require('browser-sync').create()
{% if cookiecutter.custom_bootstrap_compilation == 'y' %}
const concat = require('gulp-concat') const concat = require('gulp-concat')
{% endif %}
const cssnano = require ('cssnano') const cssnano = require ('cssnano')
const imagemin = require('gulp-imagemin') const imagemin = require('gulp-imagemin')
const pixrem = require('pixrem') const pixrem = require('pixrem')
@ -29,13 +27,11 @@ function pathsConfig(appName) {
const vendorsRoot = 'node_modules' const vendorsRoot = 'node_modules'
return { return {
{%- if cookiecutter.custom_bootstrap_compilation == 'y' %}
bootstrapSass: `${vendorsRoot}/bootstrap/scss`, bootstrapSass: `${vendorsRoot}/bootstrap/scss`,
vendorsJs: [ vendorsJs: [
`${vendorsRoot}/@popperjs/core/dist/umd/popper.js`, `${vendorsRoot}/@popperjs/core/dist/umd/popper.js`,
`${vendorsRoot}/bootstrap/dist/js/bootstrap.js`, `${vendorsRoot}/bootstrap/dist/js/bootstrap.js`,
], ],
{%- endif %}
app: this.app, app: this.app,
templates: `${this.app}/templates`, templates: `${this.app}/templates`,
css: `${this.app}/static/css`, css: `${this.app}/static/css`,
@ -46,7 +42,7 @@ function pathsConfig(appName) {
} }
} }
var paths = pathsConfig() const paths = pathsConfig()
//////////////////////////////// ////////////////////////////////
// Tasks // Tasks
@ -54,21 +50,19 @@ var paths = pathsConfig()
// Styles autoprefixing and minification // Styles autoprefixing and minification
function styles() { function styles() {
var processCss = [ const processCss = [
autoprefixer(), // adds vendor prefixes autoprefixer(), // adds vendor prefixes
pixrem(), // add fallbacks for rem units pixrem(), // add fallbacks for rem units
] ]
var minifyCss = [ const minifyCss = [
cssnano({ preset: 'default' }) // minify result cssnano({ preset: 'default' }) // minify result
] ]
return src(`${paths.sass}/project.scss`) return src(`${paths.sass}/project.scss`)
.pipe(sass({ .pipe(sass({
includePaths: [ includePaths: [
{%- if cookiecutter.custom_bootstrap_compilation == 'y' %}
paths.bootstrapSass, paths.bootstrapSass,
{%- endif %}
paths.sass paths.sass
] ]
}).on('error', sass.logError)) }).on('error', sass.logError))
@ -89,7 +83,6 @@ function scripts() {
.pipe(dest(paths.js)) .pipe(dest(paths.js))
} }
{%- if cookiecutter.custom_bootstrap_compilation == 'y' %}
// Vendor Javascript minification // Vendor Javascript minification
function vendorScripts() { function vendorScripts() {
return src(paths.vendorsJs) return src(paths.vendorsJs)
@ -100,7 +93,6 @@ function vendorScripts() {
.pipe(rename({ suffix: '.min' })) .pipe(rename({ suffix: '.min' }))
.pipe(dest(paths.js)) .pipe(dest(paths.js))
} }
{%- endif %}
// Image compression // Image compression
function imgCompression() { function imgCompression() {
@ -112,7 +104,7 @@ function imgCompression() {
{%- if cookiecutter.use_async == 'y' -%} {%- if cookiecutter.use_async == 'y' -%}
// Run django server // Run django server
function asyncRunServer() { function asyncRunServer() {
var cmd = spawn('gunicorn', [ const cmd = spawn('gunicorn', [
'config.asgi', '-k', 'uvicorn.workers.UvicornWorker', '--reload' 'config.asgi', '-k', 'uvicorn.workers.UvicornWorker', '--reload'
], {stdio: 'inherit'} ], {stdio: 'inherit'}
) )
@ -123,7 +115,7 @@ function asyncRunServer() {
{%- else %} {%- else %}
// Run django server // Run django server
function runServer(cb) { function runServer(cb) {
var cmd = spawn('python', ['manage.py', 'runserver'], {stdio: 'inherit'}) const cmd = spawn('python', ['manage.py', 'runserver'], {stdio: 'inherit'})
cmd.on('close', function(code) { cmd.on('close', function(code) {
console.log('runServer exited with code ' + code) console.log('runServer exited with code ' + code)
cb(code) cb(code)
@ -173,7 +165,7 @@ function watchPaths() {
const generateAssets = parallel( const generateAssets = parallel(
styles, styles,
scripts, scripts,
{%- if cookiecutter.custom_bootstrap_compilation == 'y' %}vendorScripts,{% endif %} vendorScripts,
imgCompression imgCompression
) )

View File

@ -11,6 +11,7 @@ services:
dockerfile: ./compose/local/django/Dockerfile dockerfile: ./compose/local/django/Dockerfile
image: {{ cookiecutter.project_slug }}_local_django image: {{ cookiecutter.project_slug }}_local_django
container_name: {{ cookiecutter.project_slug }}_local_django container_name: {{ cookiecutter.project_slug }}_local_django
platform: linux/x86_64
depends_on: depends_on:
- postgres - postgres
{%- if cookiecutter.use_celery == 'y' %} {%- if cookiecutter.use_celery == 'y' %}
@ -43,6 +44,7 @@ services:
docs: docs:
image: {{ cookiecutter.project_slug }}_local_docs image: {{ cookiecutter.project_slug }}_local_docs
container_name: {{ cookiecutter.project_slug }}_local_docs container_name: {{ cookiecutter.project_slug }}_local_docs
platform: linux/x86_64
build: build:
context: . context: .
dockerfile: ./compose/local/docs/Dockerfile dockerfile: ./compose/local/docs/Dockerfile
@ -53,7 +55,7 @@ services:
- ./config:/app/config:z - ./config:/app/config:z
- ./{{ cookiecutter.project_slug }}:/app/{{ cookiecutter.project_slug }}:z - ./{{ cookiecutter.project_slug }}:/app/{{ cookiecutter.project_slug }}:z
ports: ports:
- "7000:7000" - "9000:9000"
command: /start-docs command: /start-docs
{%- if cookiecutter.use_mailhog == 'y' %} {%- if cookiecutter.use_mailhog == 'y' %}
@ -105,7 +107,7 @@ services:
command: /start-flower command: /start-flower
{%- endif %} {%- endif %}
{%- if cookiecutter.js_task_runner == 'Gulp' %} {%- if cookiecutter.frontend_pipeline == 'Gulp' %}
node: node:
build: build:

View File

@ -1,6 +1,6 @@
import os import os
from collections.abc import Sequence
from pathlib import Path from pathlib import Path
from typing import Sequence
import pytest import pytest
@ -18,7 +18,7 @@ def merge(
) -> None: ) -> None:
with open(output_file_path, "w") as output_file: with open(output_file_path, "w") as output_file:
for merged_file_path in merged_file_paths: for merged_file_path in merged_file_paths:
with open(merged_file_path, "r") as merged_file: with open(merged_file_path) as merged_file:
merged_file_content = merged_file.read() merged_file_content = merged_file.read()
output_file.write(merged_file_content) output_file.write(merged_file_content)
if append_linesep: if append_linesep:
@ -41,7 +41,7 @@ def test_merge(tmpdir_factory, merged_file_count: int, append_linesep: bool):
for i in range(merged_file_count): for i in range(merged_file_count):
merged_file_ord = i + 1 merged_file_ord = i + 1
merged_filename = ".service{}".format(merged_file_ord) merged_filename = f".service{merged_file_ord}"
merged_file_path = tmp_dir_path / merged_filename merged_file_path = tmp_dir_path / merged_filename
merged_file_content = merged_filename * merged_file_ord merged_file_content = merged_filename * merged_file_ord
@ -57,7 +57,7 @@ def test_merge(tmpdir_factory, merged_file_count: int, append_linesep: bool):
merge(output_file_path, merged_file_paths, append_linesep) merge(output_file_path, merged_file_paths, append_linesep)
with open(output_file_path, "r") as output_file: with open(output_file_path) as output_file:
actual_output_file_content = output_file.read() actual_output_file_content = output_file.read()
assert actual_output_file_content == expected_output_file_content assert actual_output_file_content == expected_output_file_content

View File

@ -18,6 +18,7 @@ services:
volumes: volumes:
- production_nginx_media:/app/{{ cookiecutter.project_slug }}/media:z - production_nginx_media:/app/{{ cookiecutter.project_slug }}/media:z
{% endif %} {% endif %}
platform: linux/x86_64
depends_on: depends_on:
- postgres - postgres
- redis - redis

View File

@ -1,6 +1,6 @@
[pytest] [pytest]
addopts = --ds=config.settings.test --reuse-db addopts = --ds=config.settings.test --reuse-db
python_files = tests.py test_*.py python_files = tests.py test_*.py
{%- if cookiecutter.js_task_runner != 'None' %} {%- if cookiecutter.frontend_pipeline == 'Gulp' %}
norecursedirs = node_modules norecursedirs = node_modules
{%- endif %} {%- endif %}

View File

@ -1,7 +1,7 @@
pytz==2021.3 # https://github.com/stub42/pytz pytz==2022.5 # https://github.com/stub42/pytz
python-slugify==5.0.2 # https://github.com/un33k/python-slugify python-slugify==6.1.2 # https://github.com/un33k/python-slugify
Pillow==9.0.0 # https://github.com/python-pillow/Pillow Pillow==9.2.0 # https://github.com/python-pillow/Pillow
{%- if cookiecutter.use_compressor == "y" %} {%- if cookiecutter.frontend_pipeline == 'Django Compressor' %}
{%- if cookiecutter.windows == 'y' and cookiecutter.use_docker == 'n' %} {%- if cookiecutter.windows == 'y' and cookiecutter.use_docker == 'n' %}
rcssmin==1.1.0 --install-option="--without-c-extensions" # https://github.com/ndparker/rcssmin rcssmin==1.1.0 --install-option="--without-c-extensions" # https://github.com/ndparker/rcssmin
{%- else %} {%- else %}
@ -10,39 +10,39 @@ rcssmin==1.1.0 # https://github.com/ndparker/rcssmin
{%- endif %} {%- endif %}
argon2-cffi==21.3.0 # https://github.com/hynek/argon2_cffi argon2-cffi==21.3.0 # https://github.com/hynek/argon2_cffi
{%- if cookiecutter.use_whitenoise == 'y' %} {%- if cookiecutter.use_whitenoise == 'y' %}
whitenoise==5.3.0 # https://github.com/evansd/whitenoise whitenoise==6.2.0 # https://github.com/evansd/whitenoise
{%- endif %} {%- endif %}
redis==4.1.2 # https://github.com/redis/redis-py redis==4.3.4 # https://github.com/redis/redis-py
{%- if cookiecutter.use_docker == "y" or cookiecutter.windows == "n" %} {%- if cookiecutter.use_docker == "y" or cookiecutter.windows == "n" %}
hiredis==2.0.0 # https://github.com/redis/hiredis-py hiredis==2.0.0 # https://github.com/redis/hiredis-py
{%- endif %} {%- endif %}
{%- if cookiecutter.use_celery == "y" %} {%- if cookiecutter.use_celery == "y" %}
celery==5.2.3 # pyup: < 6.0 # https://github.com/celery/celery celery==5.2.7 # pyup: < 6.0 # https://github.com/celery/celery
django-celery-beat==2.2.1 # https://github.com/celery/django-celery-beat django-celery-beat==2.4.0 # https://github.com/celery/django-celery-beat
{%- if cookiecutter.use_docker == 'y' %} {%- if cookiecutter.use_docker == 'y' %}
flower==1.0.0 # https://github.com/mher/flower flower==1.2.0 # https://github.com/mher/flower
{%- endif %} {%- endif %}
{%- endif %} {%- endif %}
{%- if cookiecutter.use_async == 'y' %} {%- if cookiecutter.use_async == 'y' %}
uvicorn[standard]==0.17.0.post1 # https://github.com/encode/uvicorn uvicorn[standard]==0.18.3 # https://github.com/encode/uvicorn
{%- endif %} {%- endif %}
# Django # Django
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
django==3.2.11 # pyup: < 4.0 # https://www.djangoproject.com/ django==4.0.8 # pyup: < 4.1 # https://www.djangoproject.com/
django-environ==0.8.1 # https://github.com/joke2k/django-environ django-environ==0.9.0 # https://github.com/joke2k/django-environ
django-model-utils==4.2.0 # https://github.com/jazzband/django-model-utils django-model-utils==4.2.0 # https://github.com/jazzband/django-model-utils
django-allauth==0.47.0 # https://github.com/pennersr/django-allauth django-allauth==0.51.0 # https://github.com/pennersr/django-allauth
django-crispy-forms==1.14.0 # https://github.com/django-crispy-forms/django-crispy-forms django-crispy-forms==1.14.0 # https://github.com/django-crispy-forms/django-crispy-forms
crispy-bootstrap5==0.6 # https://github.com/django-crispy-forms/crispy-bootstrap5 crispy-bootstrap5==0.6 # https://github.com/django-crispy-forms/crispy-bootstrap5
{%- if cookiecutter.use_compressor == "y" %} {%- if cookiecutter.frontend_pipeline == 'Django Compressor' %}
django-compressor==3.1 # https://github.com/django-compressor/django-compressor django-compressor==4.1 # https://github.com/django-compressor/django-compressor
{%- endif %} {%- endif %}
django-redis==5.2.0 # https://github.com/jazzband/django-redis django-redis==5.2.0 # https://github.com/jazzband/django-redis
{%- if cookiecutter.use_drf == "y" %} {%- if cookiecutter.use_drf == 'y' %}
# Django REST Framework # Django REST Framework
djangorestframework==3.13.1 # https://github.com/encode/django-rest-framework djangorestframework==3.14.0 # https://github.com/encode/django-rest-framework
django-cors-headers==3.11.0 # https://github.com/adamchainz/django-cors-headers django-cors-headers==3.13.0 # https://github.com/adamchainz/django-cors-headers
# DRF-spectacular for api documentation # DRF-spectacular for api documentation
drf-spectacular==0.21.1 drf-spectacular==0.24.2 # https://github.com/tfranzel/drf-spectacular
{%- endif %} {%- endif %}

View File

@ -1,48 +1,48 @@
-r base.txt -r base.txt
Werkzeug[watchdog]==2.0.2 # https://github.com/pallets/werkzeug Werkzeug[watchdog]==2.2.2 # https://github.com/pallets/werkzeug
ipdb==0.13.9 # https://github.com/gotcha/ipdb ipdb==0.13.9 # https://github.com/gotcha/ipdb
{%- if cookiecutter.use_docker == 'y' %} {%- if cookiecutter.use_docker == 'y' %}
psycopg2==2.9.3 # https://github.com/psycopg/psycopg2 psycopg2==2.9.4 # https://github.com/psycopg/psycopg2
{%- else %} {%- else %}
psycopg2-binary==2.9.3 # https://github.com/psycopg/psycopg2 psycopg2-binary==2.9.5 # https://github.com/psycopg/psycopg2
{%- endif %} {%- endif %}
{%- if cookiecutter.use_async == 'y' or cookiecutter.use_celery == 'y' %} {%- if cookiecutter.use_async == 'y' or cookiecutter.use_celery == 'y' %}
watchgod==0.7 # https://github.com/samuelcolvin/watchgod watchfiles==0.18.0 # https://github.com/samuelcolvin/watchfiles
{%- endif %} {%- endif %}
# Testing # Testing
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
mypy==0.931 # https://github.com/python/mypy mypy==0.982 # https://github.com/python/mypy
django-stubs==1.9.0 # https://github.com/typeddjango/django-stubs django-stubs==1.12.0 # https://github.com/typeddjango/django-stubs
pytest==6.2.5 # https://github.com/pytest-dev/pytest pytest==7.1.3 # https://github.com/pytest-dev/pytest
pytest-sugar==0.9.4 # https://github.com/Frozenball/pytest-sugar pytest-sugar==0.9.5 # https://github.com/Frozenball/pytest-sugar
{%- if cookiecutter.use_drf == "y" %} {%- if cookiecutter.use_drf == "y" %}
djangorestframework-stubs==1.4.0 # https://github.com/typeddjango/djangorestframework-stubs djangorestframework-stubs==1.7.0 # https://github.com/typeddjango/djangorestframework-stubs
{%- endif %} {%- endif %}
# Documentation # Documentation
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
sphinx==4.4.0 # https://github.com/sphinx-doc/sphinx sphinx==5.3.0 # https://github.com/sphinx-doc/sphinx
sphinx-autobuild==2021.3.14 # https://github.com/GaretJax/sphinx-autobuild sphinx-autobuild==2021.3.14 # https://github.com/GaretJax/sphinx-autobuild
# Code quality # Code quality
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
flake8==4.0.1 # https://github.com/PyCQA/flake8 flake8==5.0.4 # https://github.com/PyCQA/flake8
flake8-isort==4.1.1 # https://github.com/gforcada/flake8-isort flake8-isort==5.0.0 # https://github.com/gforcada/flake8-isort
coverage==6.3 # https://github.com/nedbat/coveragepy coverage==6.5.0 # https://github.com/nedbat/coveragepy
black==21.12b0 # https://github.com/psf/black black==22.10.0 # https://github.com/psf/black
pylint-django==2.5.0 # https://github.com/PyCQA/pylint-django pylint-django==2.5.3 # https://github.com/PyCQA/pylint-django
{%- if cookiecutter.use_celery == 'y' %} {%- if cookiecutter.use_celery == 'y' %}
pylint-celery==0.3 # https://github.com/PyCQA/pylint-celery pylint-celery==0.3 # https://github.com/PyCQA/pylint-celery
{%- endif %} {%- endif %}
pre-commit==2.17.0 # https://github.com/pre-commit/pre-commit pre-commit==2.20.0 # https://github.com/pre-commit/pre-commit
# Django # Django
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
factory-boy==3.2.1 # https://github.com/FactoryBoy/factory_boy factory-boy==3.2.1 # https://github.com/FactoryBoy/factory_boy
django-debug-toolbar==3.2.4 # https://github.com/jazzband/django-debug-toolbar django-debug-toolbar==3.7.0 # https://github.com/jazzband/django-debug-toolbar
django-extensions==3.1.5 # https://github.com/django-extensions/django-extensions django-extensions==3.2.1 # https://github.com/django-extensions/django-extensions
django-coverage-plugin==2.0.2 # https://github.com/nedbat/django_coverage_plugin django-coverage-plugin==2.0.3 # https://github.com/nedbat/django_coverage_plugin
pytest-django==4.5.2 # https://github.com/pytest-dev/pytest-django pytest-django==4.5.2 # https://github.com/pytest-dev/pytest-django

View File

@ -3,12 +3,12 @@
-r base.txt -r base.txt
gunicorn==20.1.0 # https://github.com/benoitc/gunicorn gunicorn==20.1.0 # https://github.com/benoitc/gunicorn
psycopg2==2.9.3 # https://github.com/psycopg/psycopg2 psycopg2==2.9.4 # https://github.com/psycopg/psycopg2
{%- if cookiecutter.use_whitenoise == 'n' %} {%- if cookiecutter.use_whitenoise == 'n' %}
Collectfast==2.2.0 # https://github.com/antonagestam/collectfast Collectfast==2.2.0 # https://github.com/antonagestam/collectfast
{%- endif %} {%- endif %}
{%- if cookiecutter.use_sentry == "y" %} {%- if cookiecutter.use_sentry == "y" %}
sentry-sdk==1.5.4 # https://github.com/getsentry/sentry-python sentry-sdk==1.10.1 # https://github.com/getsentry/sentry-python
{%- endif %} {%- endif %}
{%- if cookiecutter.use_docker == "n" and cookiecutter.windows == "y" %} {%- if cookiecutter.use_docker == "n" and cookiecutter.windows == "y" %}
hiredis==2.0.0 # https://github.com/redis/hiredis-py hiredis==2.0.0 # https://github.com/redis/hiredis-py
@ -17,26 +17,26 @@ hiredis==2.0.0 # https://github.com/redis/hiredis-py
# Django # Django
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
{%- if cookiecutter.cloud_provider == 'AWS' %} {%- if cookiecutter.cloud_provider == 'AWS' %}
django-storages[boto3]==1.12.3 # https://github.com/jschneier/django-storages django-storages[boto3]==1.13.1 # https://github.com/jschneier/django-storages
{%- elif cookiecutter.cloud_provider == 'GCP' %} {%- elif cookiecutter.cloud_provider == 'GCP' %}
django-storages[google]==1.12.3 # https://github.com/jschneier/django-storages django-storages[google]==1.13.1 # https://github.com/jschneier/django-storages
{%- endif %} {%- endif %}
{%- if cookiecutter.mail_service == 'Mailgun' %} {%- if cookiecutter.mail_service == 'Mailgun' %}
django-anymail[mailgun]==8.5 # https://github.com/anymail/django-anymail django-anymail[mailgun]==8.6 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Amazon SES' %} {%- elif cookiecutter.mail_service == 'Amazon SES' %}
django-anymail[amazon_ses]==8.5 # https://github.com/anymail/django-anymail django-anymail[amazon_ses]==8.6 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Mailjet' %} {%- elif cookiecutter.mail_service == 'Mailjet' %}
django-anymail[mailjet]==8.5 # https://github.com/anymail/django-anymail django-anymail[mailjet]==8.6 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Mandrill' %} {%- elif cookiecutter.mail_service == 'Mandrill' %}
django-anymail[mandrill]==8.5 # https://github.com/anymail/django-anymail django-anymail[mandrill]==8.6 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Postmark' %} {%- elif cookiecutter.mail_service == 'Postmark' %}
django-anymail[postmark]==8.5 # https://github.com/anymail/django-anymail django-anymail[postmark]==8.6 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Sendgrid' %} {%- elif cookiecutter.mail_service == 'Sendgrid' %}
django-anymail[sendgrid]==8.5 # https://github.com/anymail/django-anymail django-anymail[sendgrid]==8.6 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'SendinBlue' %} {%- elif cookiecutter.mail_service == 'SendinBlue' %}
django-anymail[sendinblue]==8.5 # https://github.com/anymail/django-anymail django-anymail[sendinblue]==8.6 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'SparkPost' %} {%- elif cookiecutter.mail_service == 'SparkPost' %}
django-anymail[sparkpost]==8.5 # https://github.com/anymail/django-anymail django-anymail[sparkpost]==8.6 # https://github.com/anymail/django-anymail
{%- elif cookiecutter.mail_service == 'Other SMTP' %} {%- elif cookiecutter.mail_service == 'Other SMTP' %}
django-anymail==8.5 # https://github.com/anymail/django-anymail django-anymail==8.6 # https://github.com/anymail/django-anymail
{%- endif %} {%- endif %}

View File

@ -1 +1 @@
python-3.9.9 python-3.10.8

View File

@ -18,7 +18,7 @@ force_grid_wrap = 0
use_parentheses = true use_parentheses = true
[mypy] [mypy]
python_version = 3.9 python_version = 3.10
check_untyped_defs = True check_untyped_defs = True
ignore_missing_imports = True ignore_missing_imports = True
warn_unused_ignores = True warn_unused_ignores = True

View File

@ -1,7 +1,5 @@
__version__ = "{{ cookiecutter.version }}" __version__ = "{{ cookiecutter.version }}"
__version_info__ = tuple( __version_info__ = tuple(
[
int(num) if num.isdigit() else num int(num) if num.isdigit() else num
for num in __version__.replace("-", ".", 1).split(".") for num in __version__.replace("-", ".", 1).split(".")
]
) )

View File

@ -10,5 +10,5 @@ def media_storage(settings, tmpdir):
@pytest.fixture @pytest.fixture
def user() -> User: def user(db) -> User:
return UserFactory() return UserFactory()

View File

@ -1,8 +1,5 @@
{% if cookiecutter.custom_bootstrap_compilation == 'y' %}
@import "custom_bootstrap_vars"; @import "custom_bootstrap_vars";
@import "bootstrap"; @import "bootstrap";
{% endif %}
// project specific CSS goes here // project specific CSS goes here

View File

@ -1,4 +1,4 @@
{% raw %}{% load static i18n {% endraw %}{% if cookiecutter.use_compressor == "y" %}compress{% endif %}{% raw %}%}<!DOCTYPE html> {% raw %}{% load static i18n {% endraw %}{% if cookiecutter.frontend_pipeline == 'Django Compressor' %}compress{% endif %}{% raw %}%}<!DOCTYPE html>
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
<html lang="{{ LANGUAGE_CODE }}"> <html lang="{{ LANGUAGE_CODE }}">
<head> <head>
@ -12,30 +12,34 @@
<link rel="icon" href="{% static 'images/favicons/favicon.ico' %}"> <link rel="icon" href="{% static 'images/favicons/favicon.ico' %}">
{% block css %} {% block css %}
{%- endraw %}{% if cookiecutter.custom_bootstrap_compilation == "n" %}{% raw %} {%- endraw %}
{%- if cookiecutter.frontend_pipeline != 'Gulp' %}
{%- raw %}
<!-- Latest compiled and minified Bootstrap CSS --> <!-- Latest compiled and minified Bootstrap CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/css/bootstrap.min.css" integrity="sha512-GQGU0fMMi238uA+a/bdWJfpUGKUkBdgfFdgBm72SUQ6BeyWjoY/ton0tEjH+OSH9iP4Dfh+7HM0I9f5eR0L/4w==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/css/bootstrap.min.css" integrity="sha512-GQGU0fMMi238uA+a/bdWJfpUGKUkBdgfFdgBm72SUQ6BeyWjoY/ton0tEjH+OSH9iP4Dfh+7HM0I9f5eR0L/4w==" crossorigin="anonymous" referrerpolicy="no-referrer" />
{%- endraw %}{% endif %}{% raw %} {%- endraw %}
{%- endif %}
{%- raw %}
<!-- Your stuff: Third-party CSS libraries go here --> <!-- Your stuff: Third-party CSS libraries go here -->
{%- endraw %}{% if cookiecutter.use_compressor == "y" %}{% raw %}{% compress css %}{% endraw %}{% endif %}{% raw %}
<!-- This file stores project-specific CSS --> <!-- This file stores project-specific CSS -->
{%- endraw %}{% if cookiecutter.js_task_runner == "Gulp" and cookiecutter.use_compressor == "n" %}{% raw %} {%- endraw %}{% if cookiecutter.frontend_pipeline == 'None' %}{% raw %}
<link href="{% static 'css/project.min.css' %}" rel="stylesheet">
{%- endraw %}{% else %}{% raw %}
<link href="{% static 'css/project.css' %}" rel="stylesheet"> <link href="{% static 'css/project.css' %}" rel="stylesheet">
{%- endraw %}{% elif cookiecutter.frontend_pipeline == 'Django Compressor' %}{% raw %}
{% compress css %}
<link href="{% static 'css/project.css' %}" rel="stylesheet">
{% endcompress %}
{%- endraw %}{% elif cookiecutter.frontend_pipeline == 'Gulp' %}{% raw %}
<link href="{% static 'css/project.min.css' %}" rel="stylesheet">
{%- endraw %}{% endif %}{% raw %} {%- endraw %}{% endif %}{% raw %}
{%- endraw %}{% if cookiecutter.use_compressor == "y" %}{% raw %}{% endcompress %}{% endraw %}{% endif %}{% raw %}
{% endblock %} {% endblock %}
<!-- Le javascript <!-- Le javascript
================================================== --> ================================================== -->
{# Placed at the top of the document so pages load faster with defer #} {# Placed at the top of the document so pages load faster with defer #}
{% block javascript %} {% block javascript %}
{%- endraw %}{% if cookiecutter.custom_bootstrap_compilation == "y" and cookiecutter.js_task_runner == "Gulp" %}{% raw %} {%- endraw %}{% if cookiecutter.frontend_pipeline == 'Gulp' %}{% raw %}
<!-- Vendor dependencies bundled as one file--> <!-- Vendor dependencies bundled as one file-->
{%- endraw %}{% if cookiecutter.use_compressor == "y" %}{% raw %}{% compress js %}{% endraw %}{% endif %}{% raw %} <script defer src="{% static 'js/vendors.min.js' %}"></script>
<script defer src="{% static 'js/vendors.js' %}"></script>
{%- endraw %}{% if cookiecutter.use_compressor == "y" %}{% raw %}{% endcompress %}{% endraw %}{% endif %}{% raw %}
{%- endraw %}{% else %}{% raw %} {%- endraw %}{% else %}{% raw %}
<!-- Bootstrap JS --> <!-- Bootstrap JS -->
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/js/bootstrap.min.js" integrity="sha512-OvBgP9A2JBgiRad/mM36mkzXSXaJE9BEIENnVEmeZdITvwT09xnxLtT4twkCa8m/loMbPHsvPl0T8lRGVBwjlQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script defer src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/js/bootstrap.min.js" integrity="sha512-OvBgP9A2JBgiRad/mM36mkzXSXaJE9BEIENnVEmeZdITvwT09xnxLtT4twkCa8m/loMbPHsvPl0T8lRGVBwjlQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
@ -43,9 +47,15 @@
{%- endraw %}{% endif %}{% raw %} {%- endraw %}{% endif %}{% raw %}
<!-- place project specific Javascript in this file --> <!-- place project specific Javascript in this file -->
{%- endraw %}{% if cookiecutter.use_compressor == "y" %}{% raw %}{% compress js %}{% endraw %}{% endif %}{% raw %} {%- endraw %}{% if cookiecutter.frontend_pipeline == 'None' %}{% raw %}
<script defer src="{% static 'js/project.js' %}"></script> <script defer src="{% static 'js/project.js' %}"></script>
{%- endraw %}{% if cookiecutter.use_compressor == "y" %}{% raw %}{% endcompress %}{% endraw %}{% endif %}{% raw %} {%- endraw %}{% elif cookiecutter.frontend_pipeline == 'Django Compressor' %}{% raw %}
{% compress js %}
<script defer src="{% static 'js/project.js' %}"></script>
{% endcompress %}
{%- endraw %}{% elif cookiecutter.frontend_pipeline == 'Gulp' %}{% raw %}
<script defer src="{% static 'js/project.min.js' %}"></script>
{%- endraw %}{% endif %}{% raw %}
{% endblock javascript %} {% endblock javascript %}

View File

@ -1,4 +1,3 @@
# Generated by Django 3.2.9 on 2021-11-20 11:23
import django.contrib.auth.models import django.contrib.auth.models
import django.contrib.auth.validators import django.contrib.auth.validators
from django.db import migrations, models from django.db import migrations, models

View File

@ -1,4 +1,5 @@
from typing import Any, Sequence from collections.abc import Sequence
from typing import Any
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from factory import Faker, post_generation from factory import Faker, post_generation

View File

@ -1,10 +1,7 @@
import pytest
from django.urls import reverse from django.urls import reverse
from {{ cookiecutter.project_slug }}.users.models import User from {{ cookiecutter.project_slug }}.users.models import User
pytestmark = pytest.mark.django_db
class TestUserAdmin: class TestUserAdmin:
def test_changelist(self, admin_client): def test_changelist(self, admin_client):

View File

@ -1,10 +1,7 @@
import pytest
from django.urls import resolve, reverse from django.urls import resolve, reverse
from {{ cookiecutter.project_slug }}.users.models import User from {{ cookiecutter.project_slug }}.users.models import User
pytestmark = pytest.mark.django_db
def test_user_detail(user: User): def test_user_detail(user: User):
assert ( assert (

View File

@ -1,11 +1,8 @@
import pytest
from django.test import RequestFactory from django.test import RequestFactory
from {{ cookiecutter.project_slug }}.users.api.views import UserViewSet from {{ cookiecutter.project_slug }}.users.api.views import UserViewSet
from {{ cookiecutter.project_slug }}.users.models import User from {{ cookiecutter.project_slug }}.users.models import User
pytestmark = pytest.mark.django_db
class TestUserViewSet: class TestUserViewSet:
def test_get_queryset(self, user: User, rf: RequestFactory): def test_get_queryset(self, user: User, rf: RequestFactory):

View File

@ -1,14 +1,11 @@
""" """
Module for all Form Tests. Module for all Form Tests.
""" """
import pytest
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from {{ cookiecutter.project_slug }}.users.forms import UserAdminCreationForm from {{ cookiecutter.project_slug }}.users.forms import UserAdminCreationForm
from {{ cookiecutter.project_slug }}.users.models import User from {{ cookiecutter.project_slug }}.users.models import User
pytestmark = pytest.mark.django_db
class TestUserAdminCreationForm: class TestUserAdminCreationForm:
""" """

View File

@ -1,9 +1,5 @@
import pytest
from {{ cookiecutter.project_slug }}.users.models import User from {{ cookiecutter.project_slug }}.users.models import User
pytestmark = pytest.mark.django_db
def test_user_get_absolute_url(user: User): def test_user_get_absolute_url(user: User):
assert user.get_absolute_url() == f"/users/{user.username}/" assert user.get_absolute_url() == f"/users/{user.username}/"

View File

@ -1,8 +1,6 @@
import pytest import pytest
from django.urls import reverse from django.urls import reverse
pytestmark = pytest.mark.django_db
def test_swagger_accessible_by_admin(admin_client): def test_swagger_accessible_by_admin(admin_client):
url = reverse("api-docs") url = reverse("api-docs")
@ -10,7 +8,14 @@ def test_swagger_accessible_by_admin(admin_client):
assert response.status_code == 200 assert response.status_code == 200
@pytest.mark.django_db
def test_swagger_ui_not_accessible_by_normal_user(client): def test_swagger_ui_not_accessible_by_normal_user(client):
url = reverse("api-docs") url = reverse("api-docs")
response = client.get(url) response = client.get(url)
assert response.status_code == 403 assert response.status_code == 403
def test_api_schema_generated_successfully(admin_client):
url = reverse("api-schema")
response = admin_client.get(url)
assert response.status_code == 200

View File

@ -1,10 +1,7 @@
import pytest
from django.urls import resolve, reverse from django.urls import resolve, reverse
from {{ cookiecutter.project_slug }}.users.models import User from {{ cookiecutter.project_slug }}.users.models import User
pytestmark = pytest.mark.django_db
def test_detail(user: User): def test_detail(user: User):
assert ( assert (

View File

@ -63,7 +63,8 @@ class TestUserUpdateView:
# Initialize the form # Initialize the form
form = UserAdminChangeForm() form = UserAdminChangeForm()
form.cleaned_data = [] form.cleaned_data = {}
form.instance = user
view.form_valid(form) view.form_valid(form)
messages_sent = [m.message for m in messages.get_messages(request)] messages_sent = [m.message for m in messages.get_messages(request)]