mirror of
https://github.com/cookiecutter/cookiecutter-django.git
synced 2025-08-15 09:24:52 +03:00
Merge branch 'master' into add_selinux_z_to_volumes
This commit is contained in:
commit
87bae85988
56
.github/CONTRIBUTORS-template.md
vendored
Normal file
56
.github/CONTRIBUTORS-template.md
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# Contributors
|
||||||
|
|
||||||
|
## Core Developers
|
||||||
|
|
||||||
|
These contributors have commit flags for the repository, and are able to
|
||||||
|
accept and merge pull requests.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Github</th>
|
||||||
|
<th>Twitter</th>
|
||||||
|
</tr>
|
||||||
|
{%- for contributor in core_contributors %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ contributor.name }}</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/{{ contributor.github_login }}">{{ contributor.github_login }}</a>
|
||||||
|
</td>
|
||||||
|
<td>{{ contributor.twitter_username }}</td>
|
||||||
|
</tr>
|
||||||
|
{%- endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
*Audrey is also the creator of Cookiecutter. Audrey and Daniel are on
|
||||||
|
the Cookiecutter core team.*
|
||||||
|
|
||||||
|
## Other Contributors
|
||||||
|
|
||||||
|
Listed in alphabetical order.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Github</th>
|
||||||
|
<th>Twitter</th>
|
||||||
|
</tr>
|
||||||
|
{%- for contributor in other_contributors %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ contributor.name }}</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/{{ contributor.github_login }}">{{ contributor.github_login }}</a>
|
||||||
|
</td>
|
||||||
|
<td>{{ contributor.twitter_username }}</td>
|
||||||
|
</tr>
|
||||||
|
{%- endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
### Special Thanks
|
||||||
|
|
||||||
|
The following haven't provided code directly, but have provided
|
||||||
|
guidance and advice.
|
||||||
|
|
||||||
|
- Jannis Leidel
|
||||||
|
- Nate Aune
|
||||||
|
- Barry Morrison
|
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
[//]: # (Before you proceed:)
|
[//]: # (Before you proceed:)
|
||||||
|
|
||||||
[//]: # (1. Make sure to add yourself to `CONTRIBUTORS.rst` through this PR provided you're contributing here for the first time)
|
[//]: # (- Don't forget to update the `docs/` presuming others would benefit from a concise description of whatever that you're proposing)
|
||||||
[//]: # (2. Don't forget to update the `docs/` presuming others would benefit from a concise description of whatever that you're proposing)
|
[//]: # (- If you're adding a new option, please make sure that tests/test_cookiecutter_generation.py is updated accordingly)
|
||||||
|
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
@ -11,15 +11,11 @@
|
||||||
[//]: # (What's it you're proposing?)
|
[//]: # (What's it you're proposing?)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Rationale
|
## Rationale
|
||||||
|
|
||||||
[//]: # (Why does the project need that?)
|
[//]: # (Why does the project need that?)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Use case(s) / visualization(s)
|
## Use case(s) / visualization(s)
|
||||||
|
|
||||||
[//]: # ("Better to see something once than to hear about it a thousand times.")
|
[//]: # ("Better to see something once than to hear about it a thousand times.")
|
||||||
|
|
1031
.github/contributors.json
vendored
Normal file
1031
.github/contributors.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
62
.github/workflows/issue-manager.yml
vendored
Normal file
62
.github/workflows/issue-manager.yml
vendored
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
# Automatically close issues that have a keyword mark (an HTML comment)
|
||||||
|
# in the last comment in the issue, by a group of predefined users, after a custom delay.
|
||||||
|
# https://github.com/tiangolo/issue-manager
|
||||||
|
|
||||||
|
# Default config:
|
||||||
|
# <!-- issue-manager: answered -->
|
||||||
|
# Wait 10 days and comment: "Assuming the original issue was solved, it will be automatically closed now"
|
||||||
|
|
||||||
|
# Extra config:
|
||||||
|
# '<!-- issue-manager: waiting -->'
|
||||||
|
# Wait 10 days and comment: "Automatically closing. To re-open, please provide the additional information requested"
|
||||||
|
|
||||||
|
name: Issue Manager
|
||||||
|
|
||||||
|
on:
|
||||||
|
# Every day at midnight
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * *"
|
||||||
|
# Manual trigger
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
issue-manager:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: tiangolo/issue-manager@0.3.0
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
config: >
|
||||||
|
{
|
||||||
|
"answered": {
|
||||||
|
"delay": 864000,
|
||||||
|
"message": "Assuming the original issue was solved, it will be automatically closed now.",
|
||||||
|
"users": [
|
||||||
|
"pydanny",
|
||||||
|
"audreyr",
|
||||||
|
"luzfcb",
|
||||||
|
"theskumar",
|
||||||
|
"jayfk",
|
||||||
|
"burhan",
|
||||||
|
"webyneter",
|
||||||
|
"browniebroke",
|
||||||
|
"sfdye"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"waiting": {
|
||||||
|
"delay": 864000,
|
||||||
|
"message": "Automatically closing. To re-open, please provide the additional information requested.",
|
||||||
|
"users": [
|
||||||
|
"pydanny",
|
||||||
|
"audreyr",
|
||||||
|
"luzfcb",
|
||||||
|
"theskumar",
|
||||||
|
"jayfk",
|
||||||
|
"burhan",
|
||||||
|
"webyneter",
|
||||||
|
"browniebroke",
|
||||||
|
"sfdye"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
36
.github/workflows/pre-commit-autoupdate.yml
vendored
Normal file
36
.github/workflows/pre-commit-autoupdate.yml
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# Run pre-commit autoupdate every day at midnight
|
||||||
|
# and create a pull request if any changes
|
||||||
|
|
||||||
|
|
||||||
|
name: Pre-commit auto-update
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * *"
|
||||||
|
workflow_dispatch: # to trigger manually
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
auto-update:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2.1.1
|
||||||
|
with:
|
||||||
|
python-version: 3.8
|
||||||
|
|
||||||
|
- name: Install pre-commit
|
||||||
|
run: pip install pre-commit
|
||||||
|
|
||||||
|
- name: Run pre-commit autoupdate
|
||||||
|
working-directory: "{{cookiecutter.project_slug}}"
|
||||||
|
run: pre-commit autoupdate
|
||||||
|
|
||||||
|
- name: Create Pull Request
|
||||||
|
uses: peter-evans/create-pull-request@v2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
branch: update/pre-commit-autoupdate
|
||||||
|
title: Auto-update pre-commit hooks
|
||||||
|
commit-message: Auto-update pre-commit hooks
|
||||||
|
body: Update versions of tools in pre-commit configs to latest version
|
||||||
|
labels: update
|
30
.github/workflows/update-contributors.yml
vendored
Normal file
30
.github/workflows/update-contributors.yml
vendored
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
name: Update Contributors
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: "3.8"
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
pip install -r requirements.txt
|
||||||
|
- name: Update list
|
||||||
|
run: python scripts/update_contributors.py
|
||||||
|
|
||||||
|
- name: Commit changes
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@v4
|
||||||
|
with:
|
||||||
|
commit_message: Update Contributors
|
||||||
|
file_pattern: CONTRIBUTORS.md .github/contributors.json
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -214,7 +214,6 @@ tags
|
||||||
[Ii]nclude
|
[Ii]nclude
|
||||||
[Ll]ib
|
[Ll]ib
|
||||||
[Ll]ib64
|
[Ll]ib64
|
||||||
[Ss]cripts
|
|
||||||
pyvenv.cfg
|
pyvenv.cfg
|
||||||
pip-selfcheck.json
|
pip-selfcheck.json
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ Getting your pull request merged in
|
||||||
|
|
||||||
#. Keep it small. The smaller the pull request the more likely I'll pull it in.
|
#. Keep it small. The smaller the pull request the more likely I'll pull it in.
|
||||||
#. Pull requests that fix a current issue get priority for review.
|
#. Pull requests that fix a current issue get priority for review.
|
||||||
#. If you're not already in the `CONTRIBUTORS.rst` file, add yourself!
|
|
||||||
|
|
||||||
Testing
|
Testing
|
||||||
-------
|
-------
|
||||||
|
|
1466
CONTRIBUTORS.md
Normal file
1466
CONTRIBUTORS.md
Normal file
File diff suppressed because it is too large
Load Diff
420
CONTRIBUTORS.rst
420
CONTRIBUTORS.rst
|
@ -1,420 +0,0 @@
|
||||||
Contributors
|
|
||||||
============
|
|
||||||
|
|
||||||
Core Developers
|
|
||||||
---------------
|
|
||||||
|
|
||||||
These contributors have commit flags for the repository,
|
|
||||||
and are able to accept and merge pull requests.
|
|
||||||
|
|
||||||
=========================== ================= ===========
|
|
||||||
Name Github Twitter
|
|
||||||
=========================== ================= ===========
|
|
||||||
Daniel Roy Greenfeld `@pydanny`_ @pydanny
|
|
||||||
Audrey Roy Greenfeld* `@audreyr`_ @audreyr
|
|
||||||
Fábio C. Barrionuevo da Luz `@luzfcb`_ @luzfcb
|
|
||||||
Saurabh Kumar `@theskumar`_ @_theskumar
|
|
||||||
Jannis Gebauer `@jayfk`_
|
|
||||||
Burhan Khalid `@burhan`_ @burhan
|
|
||||||
Nikita Shupeyko `@webyneter`_ @webyneter
|
|
||||||
Bruno Alla `@browniebroke`_ @_BrunoAlla
|
|
||||||
Wan Liuyang `@sfdye`_ @sfdye
|
|
||||||
=========================== ================= ===========
|
|
||||||
|
|
||||||
*Audrey is also the creator of Cookiecutter. Audrey and
|
|
||||||
Daniel are on the Cookiecutter core team.*
|
|
||||||
|
|
||||||
.. _@pydanny: https://github.com/pydanny
|
|
||||||
.. _@luzfcb: https://github.com/luzfcb
|
|
||||||
.. _@theskumar: https://github.com/theskumar
|
|
||||||
.. _@audreyr: https://github.com/audreyr
|
|
||||||
.. _@jayfk: https://github.com/jayfk
|
|
||||||
.. _@webyneter: https://github.com/webyneter
|
|
||||||
.. _@browniebroke: https://github.com/browniebroke
|
|
||||||
.. _@sfdye: https://github.com/sfdye
|
|
||||||
|
|
||||||
Other Contributors
|
|
||||||
------------------
|
|
||||||
|
|
||||||
Listed in alphabetical order.
|
|
||||||
|
|
||||||
========================== ============================ ==============
|
|
||||||
Name Github Twitter
|
|
||||||
========================== ============================ ==============
|
|
||||||
18 `@dezoito`_
|
|
||||||
2O4 `@2O4`_
|
|
||||||
a7p `@a7p`_
|
|
||||||
Aaron Eikenberry `@aeikenberry`_
|
|
||||||
Adam Bogdał `@bogdal`_
|
|
||||||
Adam Dobrawy `@ad-m`_
|
|
||||||
Adam Steele `@adammsteele`_
|
|
||||||
Agam Dua
|
|
||||||
Agustín Scaramuzza `@scaramagus`_ @scaramagus
|
|
||||||
Alberto Sanchez `@alb3rto`_
|
|
||||||
Alex Tsai `@caffodian`_
|
|
||||||
Alvaro [Andor] `@andor-pierdelacabeza`_
|
|
||||||
Amjith Ramanujam `@amjith`_
|
|
||||||
Andreas Meistad `@ameistad`_
|
|
||||||
Andres Gonzalez `@andresgz`_
|
|
||||||
Andrew Mikhnevich `@zcho`_
|
|
||||||
Andrew Chen Wang `@Andrew-Chen-Wang`_
|
|
||||||
Andy Rose
|
|
||||||
Anna Callahan `@jazztpt`_
|
|
||||||
Anna Sidwell `@takkaria`_
|
|
||||||
Antonia Blair `@antoniablair`_ @antoniablairart
|
|
||||||
Anuj Bansal `@ahhda`_
|
|
||||||
Arcuri Davide `@dadokkio`_
|
|
||||||
Areski Belaid `@areski`_
|
|
||||||
AsheKR `@ashekr`_
|
|
||||||
Ashley Camba
|
|
||||||
Barclay Gauld `@yunti`_
|
|
||||||
Bartek `@btknu`_
|
|
||||||
Ben Lopatin
|
|
||||||
Ben Warren `@bwarren2`_
|
|
||||||
Benjamin Abel
|
|
||||||
Bert de Miranda `@bertdemiranda`_
|
|
||||||
Bo Lopker `@blopker`_
|
|
||||||
Bo Peng `@BoPeng`_
|
|
||||||
Bouke Haarsma
|
|
||||||
Brent Payne `@brentpayne`_ @brentpayne
|
|
||||||
Bruce Olivier `@bolivierjr`_
|
|
||||||
Burhan Khalid `@burhan`_ @burhan
|
|
||||||
Caio Ariede `@caioariede`_ @caioariede
|
|
||||||
Carl Johnson `@carlmjohnson`_ @carlmjohnson
|
|
||||||
Catherine Devlin `@catherinedevlin`_
|
|
||||||
Cédric Gaspoz `@cgaspoz`_
|
|
||||||
Charlie Smith `@chuckus`_
|
|
||||||
Chris Curvey `@ccurvey`_
|
|
||||||
Chris Franklin
|
|
||||||
Chris Franklin `@hairychris`_
|
|
||||||
Chris Pappalardo `@ChrisPappalardo`_
|
|
||||||
Christopher Clarke `@chrisdev`_
|
|
||||||
Cole Mackenzie `@cmackenzie1`_
|
|
||||||
Cole Maclean `@cole`_ @cole
|
|
||||||
Collederas `@Collederas`_
|
|
||||||
Craig Margieson `@cmargieson`_
|
|
||||||
Cristian Vargas `@cdvv7788`_
|
|
||||||
Cullen Rhodes `@c-rhodes`_
|
|
||||||
Curtis St Pierre `@curtisstpierre`_ @cstpierre1388
|
|
||||||
Dan Shultz `@shultz`_
|
|
||||||
Dani Hodovic `@danihodovic`_
|
|
||||||
Daniel Hepper `@dhepper`_ @danielhepper
|
|
||||||
Daniel Hillier `@danifus`_
|
|
||||||
Daniel Sears `@highpost`_ @highpost
|
|
||||||
Daniele Tricoli `@eriol`_
|
|
||||||
David Díaz `@ddiazpinto`_ @DavidDiazPinto
|
|
||||||
Davit Tovmasyan `@davitovmasyan`_
|
|
||||||
Davur Clementsen `@dsclementsen`_ @davur
|
|
||||||
Delio Castillo `@jangeador`_ @jangeador
|
|
||||||
Demetris Stavrou `@demestav`_
|
|
||||||
Denis Bobrov `@delneg`_
|
|
||||||
Denis Orehovsky `@apirobot`_
|
|
||||||
Denis Savran `@blaxpy`_
|
|
||||||
Diane Chen `@purplediane`_ @purplediane88
|
|
||||||
Dónal Adams `@epileptic-fish`_
|
|
||||||
Dong Huynh `@trungdong`_
|
|
||||||
Duda Nogueira `@dudanogueira`_ @dudanogueira
|
|
||||||
Emanuel Calso `@bloodpet`_ @bloodpet
|
|
||||||
Eraldo Energy `@eraldo`_
|
|
||||||
Eric Groom `@ericgroom`_
|
|
||||||
Ernesto Cedeno `@codnee`_
|
|
||||||
Eyad Al Sibai `@eyadsibai`_
|
|
||||||
Felipe Arruda `@arruda`_
|
|
||||||
Florian Idelberger `@step21`_ @windrush
|
|
||||||
Gabriel Mejia `@elgartoinf`_ @elgartoinf
|
|
||||||
Garry Cairns `@garry-cairns`_
|
|
||||||
Garry Polley `@garrypolley`_
|
|
||||||
Gilbishkosma `@Gilbishkosma`_
|
|
||||||
Glenn Wiskur `@gwiskur`_
|
|
||||||
Guilherme Guy `@guilherme1guy`_
|
|
||||||
Hamish Durkin `@durkode`_
|
|
||||||
Hana Quadara `@hanaquadara`_
|
|
||||||
Hannah Lazarus `@hanhanhan`_
|
|
||||||
Harry Moreno `@morenoh149`_ @morenoh149
|
|
||||||
Harry Percival `@hjwp`_
|
|
||||||
Hendrik Schneider `@hendrikschneider`_
|
|
||||||
Henrique G. G. Pereira `@ikkebr`_
|
|
||||||
Howie Zhao `@howiezhao`_
|
|
||||||
Ian Lee `@IanLee1521`_
|
|
||||||
Irfan Ahmad `@erfaan`_ @erfaan
|
|
||||||
Isaac12x `@Isaac12x`_
|
|
||||||
Ivan Khomutov `@ikhomutov`_
|
|
||||||
James Williams `@jameswilliams1`_
|
|
||||||
Jan Van Bruggen `@jvanbrug`_
|
|
||||||
Jelmer Draaijer `@foarsitter`_
|
|
||||||
Jerome Caisip `@jeromecaisip`_
|
|
||||||
Jens Nilsson `@phiberjenz`_
|
|
||||||
Jerome Leclanche `@jleclanche`_ @Adys
|
|
||||||
Jimmy Gitonga `@afrowave`_ @afrowave
|
|
||||||
John Cass `@jcass77`_ @cass_john
|
|
||||||
Jonathan Thompson `@nojanath`_
|
|
||||||
Jules Cheron `@jules-ch`_
|
|
||||||
Julien Almarcha `@sladinji`_
|
|
||||||
Julio Castillo `@juliocc`_
|
|
||||||
Kaido Kert `@kaidokert`_
|
|
||||||
kappataumu `@kappataumu`_ @kappataumu
|
|
||||||
Kaveh `@ka7eh`_
|
|
||||||
Keith Bailey `@keithjeb`_
|
|
||||||
Keith Webber `@townie`_
|
|
||||||
Kevin A. Stone
|
|
||||||
Kevin Ndung'u `@kevgathuku`_
|
|
||||||
Keyvan Mosharraf `@keyvanm`_
|
|
||||||
Krzysztof Szumny `@noisy`_
|
|
||||||
Krzysztof Żuraw `@krzysztofzuraw`_
|
|
||||||
Leo won `@leollon`_
|
|
||||||
Leo Zhou `@glasslion`_
|
|
||||||
Leon Kim `@PilhwanKim`_
|
|
||||||
Leonardo Jimenez `@xpostudio4`_
|
|
||||||
Lin Xianyi `@iynaix`_
|
|
||||||
Luis Nell `@originell`_
|
|
||||||
Lukas Klein
|
|
||||||
Lyla Fischer
|
|
||||||
Malik Sulaimanov `@flyudvik`_ @flyudvik
|
|
||||||
Martin Blech
|
|
||||||
Martin Saizar `@msaizar`_
|
|
||||||
Mateusz Ostaszewski `@mostaszewski`_
|
|
||||||
Mathijs Hoogland `@MathijsHoogland`_
|
|
||||||
Matt Braymer-Hayes `@mattayes`_ @mattayes
|
|
||||||
Matt Knapper `@mknapper1`_
|
|
||||||
Matt Linares
|
|
||||||
Matt Menzenski `@menzenski`_
|
|
||||||
Matt Warren `@mfwarren`_
|
|
||||||
Matthew Sisley `@mjsisley`_
|
|
||||||
Meghan Heintz `@dot2dotseurat`_
|
|
||||||
Mesut Yılmaz `@myilmaz`_
|
|
||||||
Michael Gecht `@mimischi`_ @_mischi
|
|
||||||
Michael Samoylov `@msamoylov`_
|
|
||||||
Min ho Kim `@minho42`_
|
|
||||||
mozillazg `@mozillazg`_
|
|
||||||
Nico Stefani `@nicolas471`_ @moby_dick91
|
|
||||||
Oleg Russkin `@rolep`_
|
|
||||||
Pablo `@oubiga`_
|
|
||||||
Parbhat Puri `@parbhat`_
|
|
||||||
Pawan Chaurasia `@rjsnh1522`_
|
|
||||||
Peter Bittner `@bittner`_
|
|
||||||
Peter Coles `@mrcoles`_
|
|
||||||
Philipp Matthies `@canonnervio`_
|
|
||||||
Pierre Chiquet `@pchiquet`_
|
|
||||||
Raony Guimarães Corrêa `@raonyguimaraes`_
|
|
||||||
Raphael Pierzina `@hackebrot`_
|
|
||||||
Reggie Riser `@reggieriser`_
|
|
||||||
René Muhl `@rm--`_
|
|
||||||
Richard Hajdu `@Tusky`_
|
|
||||||
Roman Afanaskin `@siauPatrick`_
|
|
||||||
Roman Osipenko `@romanosipenko`_
|
|
||||||
Russell Davies
|
|
||||||
Sam Collins `@MightySCollins`_
|
|
||||||
Sascha `@saschalalala`_ @saschalalala
|
|
||||||
Shupeyko Nikita `@webyneter`_
|
|
||||||
Sławek Ehlert `@slafs`_
|
|
||||||
Sorasful `@sorasful`_
|
|
||||||
Srinivas Nyayapati `@shireenrao`_
|
|
||||||
stepmr `@stepmr`_
|
|
||||||
Steve Steiner `@ssteinerX`_
|
|
||||||
Sudarshan Wadkar `@wadkar`_
|
|
||||||
Sule Marshall `@suledev`_
|
|
||||||
Tano Abeleyra `@tanoabeleyra`_
|
|
||||||
Taylor Baldwin
|
|
||||||
Théo Segonds `@show0k`_
|
|
||||||
Tim Claessens `@timclaessens`_
|
|
||||||
Tim Freund `@timfreund`_
|
|
||||||
Tom Atkins `@knitatoms`_
|
|
||||||
Tom Offermann
|
|
||||||
Travis McNeill `@Travistock`_ @tavistock_esq
|
|
||||||
Tubo Shi `@Tubo`_
|
|
||||||
Umair Ashraf `@umrashrf`_ @fabumair
|
|
||||||
Vadim Iskuchekov `@Egregors`_ @egregors
|
|
||||||
Vicente G. Reyes `@reyesvicente`_ @highcenburg
|
|
||||||
Vitaly Babiy
|
|
||||||
Vivian Guillen `@viviangb`_
|
|
||||||
Vlad Doster `@vladdoster`_
|
|
||||||
Will Farley `@goldhand`_ @g01dhand
|
|
||||||
William Archinal `@archinal`_
|
|
||||||
Xaver Y.R. Chen `@yrchen`_ @yrchen
|
|
||||||
Yaroslav Halchenko
|
|
||||||
Yuchen Xie `@mapx`_
|
|
||||||
========================== ============================ ==============
|
|
||||||
|
|
||||||
.. _@a7p: https://github.com/a7p
|
|
||||||
.. _@2O4: https://github.com/2O4
|
|
||||||
.. _@ad-m: https://github.com/ad-m
|
|
||||||
.. _@adammsteele: https://github.com/adammsteele
|
|
||||||
.. _@aeikenberry: https://github.com/aeikenberry
|
|
||||||
.. _@afrowave: https://github.com/afrowave
|
|
||||||
.. _@ahhda: https://github.com/ahhda
|
|
||||||
.. _@alb3rto: https://github.com/alb3rto
|
|
||||||
.. _@ameistad: https://github.com/ameistad
|
|
||||||
.. _@amjith: https://github.com/amjith
|
|
||||||
.. _@andor-pierdelacabeza: https://github.com/andor-pierdelacabeza
|
|
||||||
.. _@andresgz: https://github.com/andresgz
|
|
||||||
.. _@antoniablair: https://github.com/antoniablair
|
|
||||||
.. _@Andrew-Chen-Wang: https://github.com/Andrew-Chen-Wang
|
|
||||||
.. _@apirobot: https://github.com/apirobot
|
|
||||||
.. _@archinal: https://github.com/archinal
|
|
||||||
.. _@areski: https://github.com/areski
|
|
||||||
.. _@arruda: https://github.com/arruda
|
|
||||||
.. _@ashekr: https://github.com/ashekr
|
|
||||||
.. _@bertdemiranda: https://github.com/bertdemiranda
|
|
||||||
.. _@bittner: https://github.com/bittner
|
|
||||||
.. _@blaxpy: https://github.com/blaxpy
|
|
||||||
.. _@bloodpet: https://github.com/bloodpet
|
|
||||||
.. _@blopker: https://github.com/blopker
|
|
||||||
.. _@bogdal: https://github.com/bogdal
|
|
||||||
.. _@bolivierjr: https://github.com/bolivierjr
|
|
||||||
.. _@BoPeng: https://github.com/BoPeng
|
|
||||||
.. _@brentpayne: https://github.com/brentpayne
|
|
||||||
.. _@btknu: https://github.com/btknu
|
|
||||||
.. _@burhan: https://github.com/burhan
|
|
||||||
.. _@bwarren2: https://github.com/bwarren2
|
|
||||||
.. _@c-rhodes: https://github.com/c-rhodes
|
|
||||||
.. _@caffodian: https://github.com/caffodian
|
|
||||||
.. _@canonnervio: https://github.com/canonnervio
|
|
||||||
.. _@caioariede: https://github.com/caioariede
|
|
||||||
.. _@carlmjohnson: https://github.com/carlmjohnson
|
|
||||||
.. _@catherinedevlin: https://github.com/catherinedevlin
|
|
||||||
.. _@ccurvey: https://github.com/ccurvey
|
|
||||||
.. _@cdvv7788: https://github.com/cdvv7788
|
|
||||||
.. _@cgaspoz: https://github.com/cgaspoz
|
|
||||||
.. _@chrisdev: https://github.com/chrisdev
|
|
||||||
.. _@ChrisPappalardo: https://github.com/ChrisPappalardo
|
|
||||||
.. _@chuckus: https://github.com/chuckus
|
|
||||||
.. _@cmackenzie1: https://github.com/cmackenzie1
|
|
||||||
.. _@cmargieson: https://github.com/cmargieson
|
|
||||||
.. _@codnee: https://github.com/codnee
|
|
||||||
.. _@cole: https://github.com/cole
|
|
||||||
.. _@Collederas: https://github.com/Collederas
|
|
||||||
.. _@curtisstpierre: https://github.com/curtisstpierre
|
|
||||||
.. _@dadokkio: https://github.com/dadokkio
|
|
||||||
.. _@danihodovic: https://github.com/danihodovic
|
|
||||||
.. _@danifus: https://github.com/danifus
|
|
||||||
.. _@davitovmasyan: https://github.com/davitovmasyan
|
|
||||||
.. _@ddiazpinto: https://github.com/ddiazpinto
|
|
||||||
.. _@delneg: https://github.com/delneg
|
|
||||||
.. _@demestav: https://github.com/demestav
|
|
||||||
.. _@dezoito: https://github.com/dezoito
|
|
||||||
.. _@dhepper: https://github.com/dhepper
|
|
||||||
.. _@dot2dotseurat: https://github.com/dot2dotseurat
|
|
||||||
.. _@dudanogueira: https://github.com/dudanogueira
|
|
||||||
.. _@dsclementsen: https://github.com/dsclementsen
|
|
||||||
.. _@guilherme1guy: https://github.com/guilherme1guy
|
|
||||||
.. _@durkode: https://github.com/durkode
|
|
||||||
.. _@Egregors: https://github.com/Egregors
|
|
||||||
.. _@elgartoinf: https://gihub.com/elgartoinf
|
|
||||||
.. _@epileptic-fish: https://gihub.com/epileptic-fish
|
|
||||||
.. _@eraldo: https://github.com/eraldo
|
|
||||||
.. _@erfaan: https://github.com/erfaan
|
|
||||||
.. _@ericgroom: https://github.com/ericgroom
|
|
||||||
.. _@eriol: https://github.com/eriol
|
|
||||||
.. _@eyadsibai: https://github.com/eyadsibai
|
|
||||||
.. _@flyudvik: https://github.com/flyudvik
|
|
||||||
.. _@foarsitter: https://github.com/foarsitter
|
|
||||||
.. _@garry-cairns: https://github.com/garry-cairns
|
|
||||||
.. _@garrypolley: https://github.com/garrypolley
|
|
||||||
.. _@Gilbishkosma: https://github.com/Gilbishkosma
|
|
||||||
.. _@gwiskur: https://github.com/gwiskur
|
|
||||||
.. _@glasslion: https://github.com/glasslion
|
|
||||||
.. _@goldhand: https://github.com/goldhand
|
|
||||||
.. _@hackebrot: https://github.com/hackebrot
|
|
||||||
.. _@hairychris: https://github.com/hairychris
|
|
||||||
.. _@hanaquadara: https://github.com/hanaquadara
|
|
||||||
.. _@hanhanhan: https://github.com/hanhanhan
|
|
||||||
.. _@hendrikschneider: https://github.com/hendrikschneider
|
|
||||||
.. _@highpost: https://github.com/highpost
|
|
||||||
.. _@hjwp: https://github.com/hjwp
|
|
||||||
.. _@howiezhao: https://github.com/howiezhao
|
|
||||||
.. _@IanLee1521: https://github.com/IanLee1521
|
|
||||||
.. _@ikhomutov: https://github.com/ikhomutov
|
|
||||||
.. _@jameswilliams1: https://github.com/jameswilliams1
|
|
||||||
.. _@ikkebr: https://github.com/ikkebr
|
|
||||||
.. _@Isaac12x: https://github.com/Isaac12x
|
|
||||||
.. _@iynaix: https://github.com/iynaix
|
|
||||||
.. _@jangeador: https://github.com/jangeador
|
|
||||||
.. _@jazztpt: https://github.com/jazztpt
|
|
||||||
.. _@jcass77: https://github.com/jcass77
|
|
||||||
.. _@jeromecaisip: https://github.com/jeromecaisip
|
|
||||||
.. _@jleclanche: https://github.com/jleclanche
|
|
||||||
.. _@jules-ch: https://github.com/jules-ch
|
|
||||||
.. _@juliocc: https://github.com/juliocc
|
|
||||||
.. _@jvanbrug: https://github.com/jvanbrug
|
|
||||||
.. _@ka7eh: https://github.com/ka7eh
|
|
||||||
.. _@kaidokert: https://github.com/kaidokert
|
|
||||||
.. _@kappataumu: https://github.com/kappataumu
|
|
||||||
.. _@keithjeb: https://github.com/keithjeb
|
|
||||||
.. _@kevgathuku: https://github.com/kevgathuku
|
|
||||||
.. _@keyvanm: https://github.com/keyvanm
|
|
||||||
.. _@knitatoms: https://github.com/knitatoms
|
|
||||||
.. _@krzysztofzuraw: https://github.com/krzysztofzuraw
|
|
||||||
.. _@leollon: https://github.com/leollon
|
|
||||||
.. _@MathijsHoogland: https://github.com/MathijsHoogland
|
|
||||||
.. _@mapx: https://github.com/mapx
|
|
||||||
.. _@mattayes: https://github.com/mattayes
|
|
||||||
.. _@menzenski: https://github.com/menzenski
|
|
||||||
.. _@mfwarren: https://github.com/mfwarren
|
|
||||||
.. _@MightySCollins: https://github.com/MightySCollins
|
|
||||||
.. _@mimischi: https://github.com/mimischi
|
|
||||||
.. _@minho42: https://github.com/minho42
|
|
||||||
.. _@mjsisley: https://github.com/mjsisley
|
|
||||||
.. _@mknapper1: https://github.com/mknapper1
|
|
||||||
.. _@morenoh149: https://github.com/morenoh149
|
|
||||||
.. _@mostaszewski: https://github.com/mostaszewski
|
|
||||||
.. _@mozillazg: https://github.com/mozillazg
|
|
||||||
.. _@mrcoles: https://github.com/mrcoles
|
|
||||||
.. _@msaizar: https://github.com/msaizar
|
|
||||||
.. _@msamoylov: https://github.com/msamoylov
|
|
||||||
.. _@myilmaz: https://github.com/myilmaz
|
|
||||||
.. _@nicolas471: https://github.com/nicolas471
|
|
||||||
.. _@noisy: https://github.com/noisy
|
|
||||||
.. _@nojanath: https://github.com/nojanath
|
|
||||||
.. _@originell: https://github.com/originell
|
|
||||||
.. _@oubiga: https://github.com/oubiga
|
|
||||||
.. _@parbhat: https://github.com/parbhat
|
|
||||||
.. _@rjsnh1522: https://github.com/rjsnh1522
|
|
||||||
.. _@pchiquet: https://github.com/pchiquet
|
|
||||||
.. _@phiberjenz: https://github.com/phiberjenz
|
|
||||||
.. _@PilhwanKim: https://github.com/PilhwanKim
|
|
||||||
.. _@purplediane: https://github.com/purplediane
|
|
||||||
.. _@raonyguimaraes: https://github.com/raonyguimaraes
|
|
||||||
.. _@reggieriser: https://github.com/reggieriser
|
|
||||||
.. _@reyesvicente: https://github.com/reyesvicente
|
|
||||||
.. _@rm--: https://github.com/rm--
|
|
||||||
.. _@Tusky: https://github.com/Tusky
|
|
||||||
.. _@rolep: https://github.com/rolep
|
|
||||||
.. _@romanosipenko: https://github.com/romanosipenko
|
|
||||||
.. _@saschalalala: https://github.com/saschalalala
|
|
||||||
.. _@scaramagus: https://github.com/scaramagus
|
|
||||||
.. _@shireenrao: https://github.com/shireenrao
|
|
||||||
.. _@show0k: https://github.com/show0k
|
|
||||||
.. _@shultz: https://github.com/shultz
|
|
||||||
.. _@siauPatrick: https://github.com/siauPatrick
|
|
||||||
.. _@sladinji: https://github.com/sladinji
|
|
||||||
.. _@slafs: https://github.com/slafs
|
|
||||||
.. _@sorasful:: https://github.com/sorasful
|
|
||||||
.. _@ssteinerX: https://github.com/ssteinerx
|
|
||||||
.. _@step21: https://github.com/step21
|
|
||||||
.. _@stepmr: https://github.com/stepmr
|
|
||||||
.. _@suledev: https://github.com/suledev
|
|
||||||
.. _@takkaria: https://github.com/takkaria
|
|
||||||
.. _@tanoabeleyra: https://github.com/tanoabeleyra
|
|
||||||
.. _@timclaessens: https://github.com/timclaessens
|
|
||||||
.. _@timfreund: https://github.com/timfreund
|
|
||||||
.. _@townie: https://github.com/townie
|
|
||||||
.. _@Travistock: https://github.com/Tavistock
|
|
||||||
.. _@trungdong: https://github.com/trungdong
|
|
||||||
.. _@Tubo: https://github.com/tubo
|
|
||||||
.. _@umrashrf: https://github.com/umrashrf
|
|
||||||
.. _@viviangb: https://github.com/viviangb
|
|
||||||
.. _@vladdoster: https://github.com/vladdoster
|
|
||||||
.. _@wadkar: https://github.com/wadkar
|
|
||||||
.. _@xpostudio4: https://github.com/xpostudio4
|
|
||||||
.. _@yrchen: https://github.com/yrchen
|
|
||||||
.. _@yunti: https://github.com/yunti
|
|
||||||
.. _@zcho: https://github.com/zcho
|
|
||||||
|
|
||||||
Special Thanks
|
|
||||||
~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The following haven't provided code directly, but have provided guidance and advice.
|
|
||||||
|
|
||||||
* Jannis Leidel
|
|
||||||
* Nate Aune
|
|
||||||
* Barry Morrison
|
|
12
README.rst
12
README.rst
|
@ -96,7 +96,7 @@ Constraints
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
* Only maintained 3rd party libraries are used.
|
* Only maintained 3rd party libraries are used.
|
||||||
* Uses PostgreSQL everywhere (9.4 - 11.3)
|
* Uses PostgreSQL everywhere (9.4 - 12.3)
|
||||||
* Environment variables for configuration (This won't work with Apache/mod_wsgi).
|
* Environment variables for configuration (This won't work with Apache/mod_wsgi).
|
||||||
|
|
||||||
Support this Project!
|
Support this Project!
|
||||||
|
@ -176,11 +176,11 @@ Answer the prompts with your own desired options_. For example::
|
||||||
use_heroku [n]: y
|
use_heroku [n]: y
|
||||||
use_compressor [n]: y
|
use_compressor [n]: y
|
||||||
Select postgresql_version:
|
Select postgresql_version:
|
||||||
1 - 11.3
|
1 - 12.3
|
||||||
2 - 10.8
|
2 - 11.8
|
||||||
3 - 9.6
|
3 - 10.8
|
||||||
4 - 9.5
|
4 - 9.6
|
||||||
5 - 9.4
|
5 - 9.5
|
||||||
Choose from 1, 2, 3, 4, 5 [1]: 1
|
Choose from 1, 2, 3, 4, 5 [1]: 1
|
||||||
Select js_task_runner:
|
Select js_task_runner:
|
||||||
1 - None
|
1 - None
|
||||||
|
|
|
@ -18,11 +18,11 @@
|
||||||
"use_pycharm": "n",
|
"use_pycharm": "n",
|
||||||
"use_docker": "n",
|
"use_docker": "n",
|
||||||
"postgresql_version": [
|
"postgresql_version": [
|
||||||
"11.3",
|
"12.3",
|
||||||
|
"11.8",
|
||||||
"10.8",
|
"10.8",
|
||||||
"9.6",
|
"9.6",
|
||||||
"9.5",
|
"9.5"
|
||||||
"9.4"
|
|
||||||
],
|
],
|
||||||
"js_task_runner": [
|
"js_task_runner": [
|
||||||
"None",
|
"None",
|
||||||
|
|
|
@ -116,7 +116,7 @@ Consider the aforementioned ``.envs/.local/.postgres``: ::
|
||||||
|
|
||||||
The three envs we are presented with here are ``POSTGRES_DB``, ``POSTGRES_USER``, and ``POSTGRES_PASSWORD`` (by the way, their values have also been generated for you). You might have figured out already where these definitions will end up; it's all the same with ``django`` service container envs.
|
The three envs we are presented with here are ``POSTGRES_DB``, ``POSTGRES_USER``, and ``POSTGRES_PASSWORD`` (by the way, their values have also been generated for you). You might have figured out already where these definitions will end up; it's all the same with ``django`` service container envs.
|
||||||
|
|
||||||
One final touch: should you ever need to merge ``.envs/production/*`` in a single ``.env`` run the ``merge_production_dotenvs_in_dotenv.py``: ::
|
One final touch: should you ever need to merge ``.envs/.production/*`` in a single ``.env`` run the ``merge_production_dotenvs_in_dotenv.py``: ::
|
||||||
|
|
||||||
$ python merge_production_dotenvs_in_dotenv.py
|
$ python merge_production_dotenvs_in_dotenv.py
|
||||||
|
|
||||||
|
@ -178,8 +178,7 @@ When developing locally you can go with MailHog_ for email testing provided ``us
|
||||||
|
|
||||||
Celery tasks in local development
|
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
|
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.
|
||||||
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.
|
||||||
|
|
||||||
|
@ -200,3 +199,96 @@ Prerequisites:
|
||||||
By default, it's enabled both in local and production environments (``local.yml`` and ``production.yml`` Docker Compose configs, respectively) through a ``flower`` service. For added security, ``flower`` requires its clients to provide authentication credentials specified as the corresponding environments' ``.envs/.local/.django`` and ``.envs/.production/.django`` ``CELERY_FLOWER_USER`` and ``CELERY_FLOWER_PASSWORD`` environment variables. Check out ``localhost:5555`` and see for yourself.
|
By default, it's enabled both in local and production environments (``local.yml`` and ``production.yml`` Docker Compose configs, respectively) through a ``flower`` service. For added security, ``flower`` requires its clients to provide authentication credentials specified as the corresponding environments' ``.envs/.local/.django`` and ``.envs/.production/.django`` ``CELERY_FLOWER_USER`` and ``CELERY_FLOWER_PASSWORD`` environment variables. Check out ``localhost:5555`` and see for yourself.
|
||||||
|
|
||||||
.. _`Flower`: https://github.com/mher/flower
|
.. _`Flower`: https://github.com/mher/flower
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
On order to create a secure environment, we need to have a trusted SSL certficate installed in our Docker application.
|
||||||
|
|
||||||
|
#. **Let's Encrypt**
|
||||||
|
|
||||||
|
The official line from Let’s Encrypt is:
|
||||||
|
|
||||||
|
[For local development section] ... The best option: Generate your own certificate, either self-signed or signed by a local root, and trust it in your operating system’s trust store. Then use that certificate in your local web server. See below for details.
|
||||||
|
|
||||||
|
See `letsencrypt.org - certificates-for-localhost`_
|
||||||
|
|
||||||
|
.. _`letsencrypt.org - certificates-for-localhost`: https://letsencrypt.org/docs/certificates-for-localhost/
|
||||||
|
|
||||||
|
#. **mkcert: Valid Https Certificates For Localhost**
|
||||||
|
|
||||||
|
`mkcert`_ is a simple by design tool that hides all the arcane knowledge required to generate valid TLS certificates. It works for any hostname or IP, including localhost. It supports macOS, Linux, and Windows, and Firefox, Chrome and Java. It even works on mobile devices with a couple manual steps.
|
||||||
|
|
||||||
|
See https://blog.filippo.io/mkcert-valid-https-certificates-for-localhost/
|
||||||
|
|
||||||
|
.. _`mkcert`: https://github.com/FiloSottile/mkcert/blob/master/README.md#supported-root-stores
|
||||||
|
|
||||||
|
After installing a trusted TLS certificate, configure your docker installation. We are going to configure an ``nginx`` reverse-proxy server. This makes sure that it does not interfere with our ``traefik`` configuration that is reserved for production environements.
|
||||||
|
|
||||||
|
These are the places that you should configure to secure your local environment.
|
||||||
|
|
||||||
|
certs
|
||||||
|
~~~~~
|
||||||
|
|
||||||
|
Take the certificates that you generated and place them in a folder called ``certs`` on the projects root folder. Assuming that you registered your local hostname as ``my-dev-env.local``, the certificates you will put in the folder should have the names ``my-dev-env.local.crt`` and ``my-dev-env.local.key``.
|
||||||
|
|
||||||
|
local.yml
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
#. Add the ``nginx-proxy`` service. ::
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
nginx-proxy:
|
||||||
|
image: jwilder/nginx-proxy:alpine
|
||||||
|
container_name: nginx-proxy
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
- "443:443"
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/tmp/docker.sock:ro
|
||||||
|
- ./certs:/etc/nginx/certs
|
||||||
|
restart: always
|
||||||
|
depends_on:
|
||||||
|
- django
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
#. Link the ``nginx-proxy`` to ``django`` through environmental variables.
|
||||||
|
|
||||||
|
``django`` already has an ``.env`` file connected to it. Add the following variables. You should do this especially if you are working with a team and you want to keep your local environment details to yourself.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
# HTTPS
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
VIRTUAL_HOST=my-dev-env.local
|
||||||
|
VIRTUAL_PORT=8000
|
||||||
|
|
||||||
|
The services run behind the reverse proxy.
|
||||||
|
|
||||||
|
config/settings/local.py
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
You should allow the new hostname. ::
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = ["localhost", "0.0.0.0", "127.0.0.1", "my-dev-env.local"]
|
||||||
|
|
||||||
|
Rebuild your ``docker`` application. ::
|
||||||
|
|
||||||
|
$ docker-compose -f local.yml up -d --build
|
||||||
|
|
||||||
|
Go to your browser and type in your URL bar ``https://my-dev-env.local``
|
||||||
|
|
||||||
|
See `https with nginx`_ for more information on this configuration.
|
||||||
|
|
||||||
|
.. _`https with nginx`: https://codewithhugo.com/docker-compose-local-https/
|
||||||
|
|
||||||
|
.gitignore
|
||||||
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
Add ``certs/*`` to the ``.gitignore`` file. This allows the folder to be included in the repo but its contents to be ignored.
|
||||||
|
|
||||||
|
*This configuration is for local development environments only. Do not use this for production since you might expose your local* ``rootCA-key.pem``.
|
||||||
|
|
|
@ -24,9 +24,9 @@ First things first.
|
||||||
|
|
||||||
$ source <virtual env path>/bin/activate
|
$ source <virtual env path>/bin/activate
|
||||||
|
|
||||||
#. Install cookiecutter-django
|
#. Install cookiecutter-django: ::
|
||||||
|
|
||||||
$ cookiecutter gh:pydanny/cookiecutter-django ::
|
$ cookiecutter gh:pydanny/cookiecutter-django
|
||||||
|
|
||||||
#. Install development requirements: ::
|
#. Install development requirements: ::
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ Navigate to port 7000 on your host to see the documentation. This will be opened
|
||||||
Generate API documentation
|
Generate API documentation
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
Edit the docs/_source files and project application docstrings to create your documentation.
|
Edit the ``docs/_source`` files and project application docstrings to create your documentation.
|
||||||
|
|
||||||
Sphinx can automatically include class and function signatures and docstrings in generated documentation.
|
Sphinx can automatically include class and function signatures and docstrings in generated documentation.
|
||||||
See the generated project documentation for more examples.
|
See the generated project documentation for more examples.
|
||||||
|
|
|
@ -19,7 +19,7 @@ The config for flake8 is located in setup.cfg. It specifies:
|
||||||
pylint
|
pylint
|
||||||
------
|
------
|
||||||
|
|
||||||
This is included in flake8's checks, but you can also run it separately to see a more detailed report: ::
|
To run pylint: ::
|
||||||
|
|
||||||
$ pylint <python files that you wish to lint>
|
$ pylint <python files that you wish to lint>
|
||||||
|
|
||||||
|
|
|
@ -49,11 +49,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. 11.3
|
1. 12.3
|
||||||
2. 10.8
|
2. 11.8
|
||||||
3. 9.6
|
3. 10.8
|
||||||
4. 9.5
|
4. 9.6
|
||||||
5. 9.4
|
5. 9.5
|
||||||
|
|
||||||
js_task_runner:
|
js_task_runner:
|
||||||
Select a JavaScript task runner. The choices are:
|
Select a JavaScript task runner. The choices are:
|
||||||
|
|
|
@ -49,6 +49,8 @@ DJANGO_AWS_S3_CUSTOM_DOMAIN AWS_S3_CUSTOM_DOMAIN n/a
|
||||||
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
|
||||||
|
SENTRY_ENVIRONMENT n/a n/a production
|
||||||
|
SENTRY_TRACES_SAMPLE_RATE n/a n/a 0.0
|
||||||
DJANGO_SENTRY_LOG_LEVEL SENTRY_LOG_LEVEL n/a logging.INFO
|
DJANGO_SENTRY_LOG_LEVEL SENTRY_LOG_LEVEL n/a logging.INFO
|
||||||
MAILGUN_API_KEY MAILGUN_API_KEY n/a raises error
|
MAILGUN_API_KEY MAILGUN_API_KEY n/a raises error
|
||||||
MAILGUN_DOMAIN MAILGUN_SENDER_DOMAIN n/a raises error
|
MAILGUN_DOMAIN MAILGUN_SENDER_DOMAIN n/a raises error
|
||||||
|
|
|
@ -1,18 +1,23 @@
|
||||||
cookiecutter==1.7.2
|
cookiecutter==1.7.2
|
||||||
sh==1.13.1
|
sh==1.14.0
|
||||||
binaryornot==0.4.4
|
binaryornot==0.4.4
|
||||||
|
|
||||||
# Code quality
|
# Code quality
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
black==19.10b0
|
black==20.8b1
|
||||||
isort==4.3.21
|
isort==5.4.2
|
||||||
flake8==3.8.3
|
flake8==3.8.3
|
||||||
flake8-isort==3.0.0
|
flake8-isort==4.0.0
|
||||||
|
|
||||||
# Testing
|
# Testing
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
tox==3.16.1
|
tox==3.20.0
|
||||||
pytest==5.4.3
|
pytest==6.0.1
|
||||||
pytest-cookies==0.5.1
|
pytest-cookies==0.5.1
|
||||||
pytest-instafail==0.4.2
|
pytest-instafail==0.4.2
|
||||||
pyyaml==5.3.1
|
pyyaml==5.3.1
|
||||||
|
|
||||||
|
# Scripting
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
PyGithub==1.53
|
||||||
|
jinja2==2.11.2
|
||||||
|
|
1
scripts/__init__.py
Normal file
1
scripts/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
104
scripts/update_contributors.py
Normal file
104
scripts/update_contributors.py
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from github import Github
|
||||||
|
from github.NamedUser import NamedUser
|
||||||
|
from jinja2 import Template
|
||||||
|
|
||||||
|
CURRENT_FILE = Path(__file__)
|
||||||
|
ROOT = CURRENT_FILE.parents[1]
|
||||||
|
BOT_LOGINS = ["pyup-bot"]
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
"""
|
||||||
|
Script entry point.
|
||||||
|
|
||||||
|
1. Fetch recent contribtors from the Github API
|
||||||
|
2. Add missing ones to the JSON file
|
||||||
|
3. Generate Markdown from JSON file
|
||||||
|
"""
|
||||||
|
recent_authors = set(iter_recent_authors())
|
||||||
|
|
||||||
|
# Add missing users to the JSON file
|
||||||
|
contrib_file = ContributorsJSONFile()
|
||||||
|
for author in recent_authors:
|
||||||
|
print(f"Checking if {author.login} should be added")
|
||||||
|
if author.login not in contrib_file:
|
||||||
|
contrib_file.add_contributor(author)
|
||||||
|
print(f"Added {author.login} to contributors")
|
||||||
|
contrib_file.save()
|
||||||
|
|
||||||
|
# Generate MD file from JSON file
|
||||||
|
write_md_file(contrib_file.content)
|
||||||
|
|
||||||
|
|
||||||
|
def iter_recent_authors():
|
||||||
|
"""
|
||||||
|
Fetch users who opened recently merged pull requests.
|
||||||
|
|
||||||
|
Use Github API to fetch recent authors rather than
|
||||||
|
git CLI to work with Github usernames.
|
||||||
|
"""
|
||||||
|
repo = Github(per_page=5).get_repo("pydanny/cookiecutter-django")
|
||||||
|
recent_pulls = repo.get_pulls(
|
||||||
|
state="closed", sort="updated", direction="desc"
|
||||||
|
).get_page(0)
|
||||||
|
for pull in recent_pulls:
|
||||||
|
if (
|
||||||
|
pull.merged
|
||||||
|
and pull.user.type == "User"
|
||||||
|
and pull.user.login not in BOT_LOGINS
|
||||||
|
):
|
||||||
|
yield pull.user
|
||||||
|
|
||||||
|
|
||||||
|
class ContributorsJSONFile:
|
||||||
|
"""Helper to interact with the JSON file."""
|
||||||
|
|
||||||
|
file_path = ROOT / ".github" / "contributors.json"
|
||||||
|
content = None
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
"""Read initial content."""
|
||||||
|
self.content = json.loads(self.file_path.read_text())
|
||||||
|
|
||||||
|
def __contains__(self, github_login: str):
|
||||||
|
"""Provide a nice API to do: `username in file`."""
|
||||||
|
return any(
|
||||||
|
# Github usernames are case insensitive
|
||||||
|
github_login.lower() == contrib["github_login"].lower()
|
||||||
|
for contrib in self.content
|
||||||
|
)
|
||||||
|
|
||||||
|
def add_contributor(self, user: NamedUser):
|
||||||
|
"""Append the contributor data we care about at the end."""
|
||||||
|
contributor_data = {
|
||||||
|
"name": user.name or user.login,
|
||||||
|
"github_login": user.login,
|
||||||
|
"twitter_username": user.twitter_username or "",
|
||||||
|
}
|
||||||
|
self.content.append(contributor_data)
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
"""Write the file to disk with indentation."""
|
||||||
|
text_content = json.dumps(self.content, indent=2, ensure_ascii=False)
|
||||||
|
self.file_path.write_text(text_content)
|
||||||
|
|
||||||
|
|
||||||
|
def write_md_file(contributors):
|
||||||
|
"""Generate markdown file from Jinja template."""
|
||||||
|
contributors_template = ROOT / ".github" / "CONTRIBUTORS-template.md"
|
||||||
|
template = Template(contributors_template.read_text(), autoescape=True)
|
||||||
|
core_contributors = [c for c in contributors if c.get("is_core", False)]
|
||||||
|
other_contributors = (c for c in contributors if not c.get("is_core", False))
|
||||||
|
other_contributors = sorted(other_contributors, key=lambda c: c["name"].lower())
|
||||||
|
content = template.render(
|
||||||
|
core_contributors=core_contributors, other_contributors=other_contributors
|
||||||
|
)
|
||||||
|
|
||||||
|
file_path = ROOT / "CONTRIBUTORS.md"
|
||||||
|
file_path.write_text(content)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
2
setup.py
2
setup.py
|
@ -10,7 +10,7 @@ except ImportError:
|
||||||
|
|
||||||
# Our version ALWAYS matches the version of Django we support
|
# Our version ALWAYS matches the version of Django we support
|
||||||
# If Django has a new release, we branch, tag, then update this setting after the tag.
|
# If Django has a new release, we branch, tag, then update this setting after the tag.
|
||||||
version = "3.0.8"
|
version = "3.0.10"
|
||||||
|
|
||||||
if sys.argv[-1] == "tag":
|
if sys.argv[-1] == "tag":
|
||||||
os.system(f'git tag -a {version} -m "version {version}"')
|
os.system(f'git tag -a {version} -m "version {version}"')
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
|
|
||||||
set -o errexit
|
set -o errexit
|
||||||
|
|
||||||
|
# Install modern pip to use new resolver:
|
||||||
|
# https://blog.python.org/2020/07/upgrade-pip-20-2-changes-20-3.html
|
||||||
|
pip install 'pip>=20.2'
|
||||||
|
|
||||||
# install test requirements
|
# install test requirements
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
@ -20,7 +24,7 @@ cd my_awesome_project
|
||||||
sudo utility/install_os_dependencies.sh install
|
sudo utility/install_os_dependencies.sh install
|
||||||
|
|
||||||
# Install Python deps
|
# Install Python deps
|
||||||
pip install -r requirements/local.txt
|
pip install --use-feature=2020-resolver -r requirements/local.txt
|
||||||
|
|
||||||
# run the project's tests
|
# run the project's tests
|
||||||
pytest
|
pytest
|
||||||
|
|
|
@ -37,11 +37,11 @@ SUPPORTED_COMBINATIONS = [
|
||||||
{"use_pycharm": "n"},
|
{"use_pycharm": "n"},
|
||||||
{"use_docker": "y"},
|
{"use_docker": "y"},
|
||||||
{"use_docker": "n"},
|
{"use_docker": "n"},
|
||||||
{"postgresql_version": "11.3"},
|
{"postgresql_version": "12.3"},
|
||||||
|
{"postgresql_version": "11.8"},
|
||||||
{"postgresql_version": "10.8"},
|
{"postgresql_version": "10.8"},
|
||||||
{"postgresql_version": "9.6"},
|
{"postgresql_version": "9.6"},
|
||||||
{"postgresql_version": "9.5"},
|
{"postgresql_version": "9.5"},
|
||||||
{"postgresql_version": "9.4"},
|
|
||||||
{"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"},
|
||||||
|
@ -175,7 +175,10 @@ def test_black_passes(cookies, context_override):
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
["use_docker", "expected_test_script"],
|
["use_docker", "expected_test_script"],
|
||||||
[("n", "pytest"), ("y", "docker-compose -f local.yml run django pytest"),],
|
[
|
||||||
|
("n", "pytest"),
|
||||||
|
("y", "docker-compose -f local.yml run django pytest"),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
def test_travis_invokes_pytest(cookies, context, use_docker, expected_test_script):
|
def test_travis_invokes_pytest(cookies, context, use_docker, expected_test_script):
|
||||||
context.update({"ci_tool": "Travis", "use_docker": use_docker})
|
context.update({"ci_tool": "Travis", "use_docker": use_docker})
|
||||||
|
@ -197,7 +200,10 @@ def test_travis_invokes_pytest(cookies, context, use_docker, expected_test_scrip
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
["use_docker", "expected_test_script"],
|
["use_docker", "expected_test_script"],
|
||||||
[("n", "pytest"), ("y", "docker-compose -f local.yml run django pytest"),],
|
[
|
||||||
|
("n", "pytest"),
|
||||||
|
("y", "docker-compose -f local.yml run django pytest"),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
def test_gitlab_invokes_flake8_and_pytest(
|
def test_gitlab_invokes_flake8_and_pytest(
|
||||||
cookies, context, use_docker, expected_test_script
|
cookies, context, use_docker, expected_test_script
|
||||||
|
|
2
tox.ini
2
tox.ini
|
@ -8,4 +8,4 @@ commands = pytest {posargs:./tests}
|
||||||
|
|
||||||
[testenv:black-template]
|
[testenv:black-template]
|
||||||
deps = black
|
deps = black
|
||||||
commands = black --check hooks tests setup.py docs
|
commands = black --check hooks tests setup.py docs scripts
|
||||||
|
|
|
@ -4,17 +4,22 @@ fail_fast: true
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: master
|
rev: v3.2.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/psf/black
|
- repo: https://github.com/psf/black
|
||||||
rev: 19.10b0
|
rev: 20.8b1
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
|
|
||||||
|
- repo: https://github.com/timothycrosley/isort
|
||||||
|
rev: 5.4.2
|
||||||
|
hooks:
|
||||||
|
- id: isort
|
||||||
|
|
||||||
- repo: https://gitlab.com/pycqa/flake8
|
- repo: https://gitlab.com/pycqa/flake8
|
||||||
rev: 3.8.3
|
rev: 3.8.3
|
||||||
hooks:
|
hooks:
|
||||||
|
|
|
@ -80,6 +80,7 @@ THIRD_PARTY_APPS = [
|
||||||
{%- if cookiecutter.use_drf == "y" %}
|
{%- if cookiecutter.use_drf == "y" %}
|
||||||
"rest_framework",
|
"rest_framework",
|
||||||
"rest_framework.authtoken",
|
"rest_framework.authtoken",
|
||||||
|
"corsheaders",
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -134,6 +135,9 @@ AUTH_PASSWORD_VALIDATORS = [
|
||||||
# https://docs.djangoproject.com/en/dev/ref/settings/#middleware
|
# https://docs.djangoproject.com/en/dev/ref/settings/#middleware
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
"django.middleware.security.SecurityMiddleware",
|
"django.middleware.security.SecurityMiddleware",
|
||||||
|
{%- if cookiecutter.use_drf == 'y' %}
|
||||||
|
"corsheaders.middleware.CorsMiddleware",
|
||||||
|
{%- endif %}
|
||||||
{%- if cookiecutter.use_whitenoise == 'y' %}
|
{%- if cookiecutter.use_whitenoise == 'y' %}
|
||||||
"whitenoise.middleware.WhiteNoiseMiddleware",
|
"whitenoise.middleware.WhiteNoiseMiddleware",
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
@ -321,6 +325,10 @@ REST_FRAMEWORK = {
|
||||||
),
|
),
|
||||||
"DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",),
|
"DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# django-cors-headers - https://github.com/adamchainz/django-cors-headers#setup
|
||||||
|
CORS_URLS_REGEX = r"^/api/.*$"
|
||||||
|
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
# Your stuff...
|
# Your stuff...
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
|
@ -34,7 +34,7 @@ CACHES = {
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
||||||
# Mimicing memcache behavior.
|
# Mimicing memcache behavior.
|
||||||
# http://jazzband.github.io/django-redis/latest/#_memcached_exceptions_behavior
|
# https://github.com/jazzband/django-redis#memcached-exceptions-behavior
|
||||||
"IGNORE_EXCEPTIONS": True,
|
"IGNORE_EXCEPTIONS": True,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -87,8 +87,6 @@ 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_DEFAULT_ACL = None
|
|
||||||
# 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)
|
||||||
|
@ -235,13 +233,12 @@ ANYMAIL = {}
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# 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
|
||||||
COMPRESS_ENABLED = env.bool("COMPRESS_ENABLED", default=True)
|
COMPRESS_ENABLED = env.bool("COMPRESS_ENABLED", default=True)
|
||||||
|
{%- if cookiecutter.cloud_provider == 'None' %}
|
||||||
# https://django-compressor.readthedocs.io/en/latest/settings/#django.conf.settings.COMPRESS_STORAGE
|
# https://django-compressor.readthedocs.io/en/latest/settings/#django.conf.settings.COMPRESS_STORAGE
|
||||||
{%- if cookiecutter.cloud_provider == 'AWS' %}
|
|
||||||
COMPRESS_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
|
|
||||||
{%- elif cookiecutter.cloud_provider == 'GCP' %}
|
|
||||||
COMPRESS_STORAGE = "storages.backends.gcloud.GoogleCloudStorage"
|
|
||||||
{%- elif cookiecutter.cloud_provider == 'None' %}
|
|
||||||
COMPRESS_STORAGE = "compressor.storage.GzipCompressorFileStorage"
|
COMPRESS_STORAGE = "compressor.storage.GzipCompressorFileStorage"
|
||||||
|
{%- elif cookiecutter.cloud_provider in ('AWS', 'GCP') and cookiecutter.use_whitenoise == 'n' %}
|
||||||
|
# https://django-compressor.readthedocs.io/en/latest/settings/#django.conf.settings.COMPRESS_STORAGE
|
||||||
|
COMPRESS_STORAGE = STATICFILES_STORAGE
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
# https://django-compressor.readthedocs.io/en/latest/settings/#django.conf.settings.COMPRESS_URL
|
# https://django-compressor.readthedocs.io/en/latest/settings/#django.conf.settings.COMPRESS_URL
|
||||||
COMPRESS_URL = STATIC_URL{% if cookiecutter.use_whitenoise == 'y' or cookiecutter.cloud_provider == 'None' %} # noqa F405{% endif %}
|
COMPRESS_URL = STATIC_URL{% if cookiecutter.use_whitenoise == 'y' or cookiecutter.cloud_provider == 'None' %} # noqa F405{% endif %}
|
||||||
|
@ -354,13 +351,17 @@ sentry_logging = LoggingIntegration(
|
||||||
)
|
)
|
||||||
|
|
||||||
{%- if cookiecutter.use_celery == 'y' %}
|
{%- if cookiecutter.use_celery == 'y' %}
|
||||||
|
integrations = [sentry_logging, DjangoIntegration(), CeleryIntegration()]
|
||||||
|
{% else %}
|
||||||
|
integrations = [sentry_logging, DjangoIntegration()]
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
sentry_sdk.init(
|
sentry_sdk.init(
|
||||||
dsn=SENTRY_DSN,
|
dsn=SENTRY_DSN,
|
||||||
integrations=[sentry_logging, DjangoIntegration(), CeleryIntegration()],
|
integrations=integrations,
|
||||||
|
environment=env("SENTRY_ENVIRONMENT", default="production"),
|
||||||
|
traces_sample_rate=env.float("SENTRY_TRACES_SAMPLE_RATE", default=0.0),
|
||||||
)
|
)
|
||||||
{% else %}
|
|
||||||
sentry_sdk.init(dsn=SENTRY_DSN, integrations=[sentry_logging, DjangoIntegration()])
|
|
||||||
{% endif -%}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
# Your stuff...
|
# Your stuff...
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
|
@ -10,35 +10,36 @@ rcssmin==1.0.6 # https://github.com/ndparker/rcssmin
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
argon2-cffi==20.1.0 # https://github.com/hynek/argon2_cffi
|
argon2-cffi==20.1.0 # https://github.com/hynek/argon2_cffi
|
||||||
{%- if cookiecutter.use_whitenoise == 'y' %}
|
{%- if cookiecutter.use_whitenoise == 'y' %}
|
||||||
whitenoise==5.1.0 # https://github.com/evansd/whitenoise
|
whitenoise==5.2.0 # https://github.com/evansd/whitenoise
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
redis==3.5.3 # https://github.com/andymccurdy/redis-py
|
redis==3.5.3 # https://github.com/andymccurdy/redis-py
|
||||||
{%- if cookiecutter.use_docker == "y" or cookiecutter.windows == "n" %}
|
{%- if cookiecutter.use_docker == "y" or cookiecutter.windows == "n" %}
|
||||||
hiredis==1.0.1 # https://github.com/redis/hiredis-py
|
hiredis==1.1.0 # https://github.com/redis/hiredis-py
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- if cookiecutter.use_celery == "y" %}
|
{%- if cookiecutter.use_celery == "y" %}
|
||||||
celery==4.4.6 # pyup: < 5.0 # https://github.com/celery/celery
|
celery==4.4.7 # pyup: < 5.0 # https://github.com/celery/celery
|
||||||
django-celery-beat==2.0.0 # https://github.com/celery/django-celery-beat
|
django-celery-beat==2.0.0 # https://github.com/celery/django-celery-beat
|
||||||
{%- if cookiecutter.use_docker == 'y' %}
|
{%- if cookiecutter.use_docker == 'y' %}
|
||||||
flower==0.9.5 # https://github.com/mher/flower
|
flower==0.9.5 # https://github.com/mher/flower
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- if cookiecutter.use_async == 'y' %}
|
{%- if cookiecutter.use_async == 'y' %}
|
||||||
uvicorn==0.11.5 # https://github.com/encode/uvicorn
|
uvicorn==0.11.8 # https://github.com/encode/uvicorn
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
# Django
|
# Django
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
django==3.0.8 # pyup: < 3.1 # https://www.djangoproject.com/
|
django==3.0.10 # pyup: < 3.1 # https://www.djangoproject.com/
|
||||||
django-environ==0.4.5 # https://github.com/joke2k/django-environ
|
django-environ==0.4.5 # https://github.com/joke2k/django-environ
|
||||||
django-model-utils==4.0.0 # https://github.com/jazzband/django-model-utils
|
django-model-utils==4.0.0 # https://github.com/jazzband/django-model-utils
|
||||||
django-allauth==0.42.0 # https://github.com/pennersr/django-allauth
|
django-allauth==0.42.0 # https://github.com/pennersr/django-allauth
|
||||||
django-crispy-forms==1.9.1 # https://github.com/django-crispy-forms/django-crispy-forms
|
django-crispy-forms==1.9.2 # https://github.com/django-crispy-forms/django-crispy-forms
|
||||||
{%- if cookiecutter.use_compressor == "y" %}
|
{%- if cookiecutter.use_compressor == "y" %}
|
||||||
django-compressor==2.4 # https://github.com/django-compressor/django-compressor
|
django-compressor==2.4 # https://github.com/django-compressor/django-compressor
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
django-redis==4.12.1 # https://github.com/jazzband/django-redis
|
django-redis==4.12.1 # https://github.com/jazzband/django-redis
|
||||||
{%- if cookiecutter.use_drf == "y" %}
|
{%- if cookiecutter.use_drf == "y" %}
|
||||||
# Django REST Framework
|
# Django REST Framework
|
||||||
djangorestframework==3.11.0 # https://github.com/encode/django-rest-framework
|
djangorestframework==3.11.1 # https://github.com/encode/django-rest-framework
|
||||||
|
django-cors-headers==3.5.0 # https://github.com/adamchainz/django-cors-headers
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
-r ./base.txt
|
-r base.txt
|
||||||
|
|
||||||
Werkzeug==1.0.1 # https://github.com/pallets/werkzeug
|
Werkzeug==1.0.1 # https://github.com/pallets/werkzeug
|
||||||
ipdb==0.13.3 # https://github.com/gotcha/ipdb
|
ipdb==0.13.3 # https://github.com/gotcha/ipdb
|
||||||
|
@ -13,33 +13,33 @@ watchgod==0.6 # https://github.com/samuelcolvin/watchgod
|
||||||
|
|
||||||
# Testing
|
# Testing
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
mypy==0.782 # https://github.com/python/mypy
|
mypy==0.770 # https://github.com/python/mypy
|
||||||
django-stubs==1.5.0 # https://github.com/typeddjango/django-stubs
|
django-stubs==1.5.0 # https://github.com/typeddjango/django-stubs
|
||||||
pytest==5.4.3 # https://github.com/pytest-dev/pytest
|
pytest==6.0.1 # https://github.com/pytest-dev/pytest
|
||||||
pytest-sugar==0.9.3 # https://github.com/Frozenball/pytest-sugar
|
pytest-sugar==0.9.4 # https://github.com/Frozenball/pytest-sugar
|
||||||
|
|
||||||
# Documentation
|
# Documentation
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
sphinx==3.1.2 # https://github.com/sphinx-doc/sphinx
|
sphinx==3.2.1 # https://github.com/sphinx-doc/sphinx
|
||||||
sphinx-autobuild==0.7.1 # https://github.com/GaretJax/sphinx-autobuild
|
sphinx-autobuild==2020.9.1 # https://github.com/GaretJax/sphinx-autobuild
|
||||||
|
|
||||||
# Code quality
|
# Code quality
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
flake8==3.8.3 # https://github.com/PyCQA/flake8
|
flake8==3.8.3 # https://github.com/PyCQA/flake8
|
||||||
flake8-isort==3.0.0 # https://github.com/gforcada/flake8-isort
|
flake8-isort==4.0.0 # https://github.com/gforcada/flake8-isort
|
||||||
coverage==5.2 # https://github.com/nedbat/coveragepy
|
coverage==5.2.1 # https://github.com/nedbat/coveragepy
|
||||||
black==19.10b0 # https://github.com/ambv/black
|
black==20.8b1 # https://github.com/ambv/black
|
||||||
pylint-django==2.0.15 # https://github.com/PyCQA/pylint-django
|
pylint-django==2.3.0 # 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.6.0 # https://github.com/pre-commit/pre-commit
|
pre-commit==2.7.1 # https://github.com/pre-commit/pre-commit
|
||||||
|
|
||||||
# Django
|
# Django
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
factory-boy==2.12.0 # https://github.com/FactoryBoy/factory_boy
|
factory-boy==3.0.1 # https://github.com/FactoryBoy/factory_boy
|
||||||
|
|
||||||
django-debug-toolbar==2.2 # https://github.com/jazzband/django-debug-toolbar
|
django-debug-toolbar==2.2 # https://github.com/jazzband/django-debug-toolbar
|
||||||
django-extensions==3.0.2 # https://github.com/django-extensions/django-extensions
|
django-extensions==3.0.7 # https://github.com/django-extensions/django-extensions
|
||||||
django-coverage-plugin==1.8.0 # https://github.com/nedbat/django_coverage_plugin
|
django-coverage-plugin==1.8.0 # https://github.com/nedbat/django_coverage_plugin
|
||||||
pytest-django==3.9.0 # https://github.com/pytest-dev/pytest-django
|
pytest-django==3.9.0 # https://github.com/pytest-dev/pytest-django
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# PRECAUTION: avoid production dependencies that aren't in development
|
# PRECAUTION: avoid production dependencies that aren't in development
|
||||||
|
|
||||||
-r ./base.txt
|
-r base.txt
|
||||||
|
|
||||||
gunicorn==20.0.4 # https://github.com/benoitc/gunicorn
|
gunicorn==20.0.4 # https://github.com/benoitc/gunicorn
|
||||||
psycopg2==2.8.5 --no-binary psycopg2 # https://github.com/psycopg/psycopg2
|
psycopg2==2.8.5 --no-binary psycopg2 # https://github.com/psycopg/psycopg2
|
||||||
|
@ -8,35 +8,35 @@ psycopg2==2.8.5 --no-binary psycopg2 # https://github.com/psycopg/psycopg2
|
||||||
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==0.16.0 # https://github.com/getsentry/sentry-python
|
sentry-sdk==0.17.3 # 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==1.0.1 # https://github.com/redis/hiredis-py
|
hiredis==1.1.0 # https://github.com/redis/hiredis-py
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
# Django
|
# Django
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
{%- if cookiecutter.cloud_provider == 'AWS' %}
|
{%- if cookiecutter.cloud_provider == 'AWS' %}
|
||||||
django-storages[boto3]==1.9.1 # https://github.com/jschneier/django-storages
|
django-storages[boto3]==1.10 # https://github.com/jschneier/django-storages
|
||||||
{%- elif cookiecutter.cloud_provider == 'GCP' %}
|
{%- elif cookiecutter.cloud_provider == 'GCP' %}
|
||||||
django-storages[google]==1.9.1 # https://github.com/jschneier/django-storages
|
django-storages[google]==1.10 # https://github.com/jschneier/django-storages
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- if cookiecutter.mail_service == 'Mailgun' %}
|
{%- if cookiecutter.mail_service == 'Mailgun' %}
|
||||||
django-anymail[mailgun]==7.1.0 # https://github.com/anymail/django-anymail
|
django-anymail[mailgun]==7.2.1 # https://github.com/anymail/django-anymail
|
||||||
{%- elif cookiecutter.mail_service == 'Amazon SES' %}
|
{%- elif cookiecutter.mail_service == 'Amazon SES' %}
|
||||||
django-anymail[amazon_ses]==7.1.0 # https://github.com/anymail/django-anymail
|
django-anymail[amazon_ses]==7.2.1 # https://github.com/anymail/django-anymail
|
||||||
{%- elif cookiecutter.mail_service == 'Mailjet' %}
|
{%- elif cookiecutter.mail_service == 'Mailjet' %}
|
||||||
django-anymail[mailjet]==7.1.0 # https://github.com/anymail/django-anymail
|
django-anymail[mailjet]==7.2.1 # https://github.com/anymail/django-anymail
|
||||||
{%- elif cookiecutter.mail_service == 'Mandrill' %}
|
{%- elif cookiecutter.mail_service == 'Mandrill' %}
|
||||||
django-anymail[mandrill]==7.1.0 # https://github.com/anymail/django-anymail
|
django-anymail[mandrill]==7.2.1 # https://github.com/anymail/django-anymail
|
||||||
{%- elif cookiecutter.mail_service == 'Postmark' %}
|
{%- elif cookiecutter.mail_service == 'Postmark' %}
|
||||||
django-anymail[postmark]==7.1.0 # https://github.com/anymail/django-anymail
|
django-anymail[postmark]==7.2.1 # https://github.com/anymail/django-anymail
|
||||||
{%- elif cookiecutter.mail_service == 'Sendgrid' %}
|
{%- elif cookiecutter.mail_service == 'Sendgrid' %}
|
||||||
django-anymail[sendgrid]==7.1.0 # https://github.com/anymail/django-anymail
|
django-anymail[sendgrid]==7.2.1 # https://github.com/anymail/django-anymail
|
||||||
{%- elif cookiecutter.mail_service == 'SendinBlue' %}
|
{%- elif cookiecutter.mail_service == 'SendinBlue' %}
|
||||||
django-anymail[sendinblue]==7.1.0 # https://github.com/anymail/django-anymail
|
django-anymail[sendinblue]==7.2.1 # https://github.com/anymail/django-anymail
|
||||||
{%- elif cookiecutter.mail_service == 'SparkPost' %}
|
{%- elif cookiecutter.mail_service == 'SparkPost' %}
|
||||||
django-anymail[sparkpost]==7.1.0 # https://github.com/anymail/django-anymail
|
django-anymail[sparkpost]==7.2.1 # https://github.com/anymail/django-anymail
|
||||||
{%- elif cookiecutter.mail_service == 'Other SMTP' %}
|
{%- elif cookiecutter.mail_service == 'Other SMTP' %}
|
||||||
django-anymail==7.1.0 # https://github.com/anymail/django-anymail
|
django-anymail==7.2.1 # https://github.com/anymail/django-anymail
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
python-3.8.3
|
python-3.8.5
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
[flake8]
|
[flake8]
|
||||||
max-line-length = 120
|
max-line-length = 120
|
||||||
exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules
|
exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules,venv
|
||||||
|
|
||||||
[pycodestyle]
|
[pycodestyle]
|
||||||
max-line-length = 120
|
max-line-length = 120
|
||||||
exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules
|
exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules,venv
|
||||||
|
|
||||||
[mypy]
|
[mypy]
|
||||||
python_version = 3.8
|
python_version = 3.8
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
||||||
<title>{% block title %}{% endraw %}{{ cookiecutter.project_name }}{% raw %}{% endblock title %}</title>
|
<title>{% block title %}{% endraw %}{{ cookiecutter.project_name }}{% raw %}{% endblock title %}</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="description" content="">
|
<meta name="description" content="{% endraw %}{{ cookiecutter.description }}{% raw %}">
|
||||||
<meta name="author" content="">
|
<meta name="author" content="{% endraw %}{{ cookiecutter.author_name }}{% raw %}">
|
||||||
|
|
||||||
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
||||||
<!--[if lt IE 9]>
|
<!--[if lt IE 9]>
|
||||||
|
|
|
@ -5,8 +5,7 @@ from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class User(AbstractUser):
|
class User(AbstractUser):
|
||||||
"""Default user for {{cookiecutter.project_name}}.
|
"""Default user for {{cookiecutter.project_name}}."""
|
||||||
"""
|
|
||||||
|
|
||||||
#: First and last name do not cover name patterns around the globe
|
#: First and last name do not cover name patterns around the globe
|
||||||
name = CharField(_("Name of User"), blank=True, max_length=255)
|
name = CharField(_("Name of User"), blank=True, max_length=255)
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
from typing import Any, Sequence
|
from typing import Any, Sequence
|
||||||
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from factory import DjangoModelFactory, Faker, post_generation
|
from factory import Faker, post_generation
|
||||||
|
from factory.django import DjangoModelFactory
|
||||||
|
|
||||||
|
|
||||||
class UserFactory(DjangoModelFactory):
|
class UserFactory(DjangoModelFactory):
|
||||||
|
|
|
@ -2,4 +2,7 @@ from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
def settings_context(_request):
|
def settings_context(_request):
|
||||||
return {"settings": settings}
|
"""Settings available by default to the templates context."""
|
||||||
|
# Note: we intentionally do NOT expose the entire settings
|
||||||
|
# to prevent accidental leaking of sensitive information
|
||||||
|
return {"DEBUG": settings.DEBUG}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user