mirror of
https://github.com/cookiecutter/cookiecutter-django.git
synced 2025-04-25 02:43:46 +03:00
Merge branch 'master' into fix_django_31
This commit is contained in:
commit
26540f4cc9
2
.github/workflows/pre-commit-autoupdate.yml
vendored
2
.github/workflows/pre-commit-autoupdate.yml
vendored
|
@ -26,7 +26,7 @@ jobs:
|
|||
run: pre-commit autoupdate
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v3.8.0
|
||||
uses: peter-evans/create-pull-request@v3.8.2
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
branch: update/pre-commit-autoupdate
|
||||
|
|
31
CHANGELOG.md
31
CHANGELOG.md
|
@ -3,6 +3,37 @@ All enhancements and patches to Cookiecutter Django will be documented in this f
|
|||
|
||||
<!-- GENERATOR_PLACEHOLDER -->
|
||||
|
||||
## [2021-02-16]
|
||||
### Updated
|
||||
- Update sentry-sdk to 0.20.2 ([#3054](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3054))
|
||||
- Update sphinx to 3.5.0 ([#3053](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3053))
|
||||
|
||||
## [2021-02-13]
|
||||
### Updated
|
||||
- Update sentry-sdk to 0.20.1 ([#3052](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3052))
|
||||
|
||||
## [2021-02-12]
|
||||
### Updated
|
||||
- Update pre-commit to 2.10.1 ([#3045](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3045))
|
||||
- Update sentry-sdk to 0.20.0 ([#3051](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3051))
|
||||
|
||||
## [2021-02-10]
|
||||
### Updated
|
||||
- Bump peter-evans/create-pull-request from v3.8.1 to v3.8.2 ([#3049](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3049))
|
||||
|
||||
## [2021-02-08]
|
||||
### Updated
|
||||
- Update django-extensions to 3.1.1 ([#3047](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3047))
|
||||
- Bump peter-evans/create-pull-request from v3.8.0 to v3.8.1 ([#3046](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3046))
|
||||
|
||||
## [2021-02-06]
|
||||
### Changed
|
||||
- Removed Redundant test_case_sensitivity() and made test_not_authenticated() get the LOGIN_URL dynamically. ([#3041](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3041))
|
||||
- Refactored users.forms to make the code more readeable ([#3029](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3029))
|
||||
- Update django to 3.0.12 ([#3037](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3037))
|
||||
### Updated
|
||||
- Update tox to 3.21.4 ([#3044](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3044))
|
||||
|
||||
## [2021-02-01]
|
||||
### Updated
|
||||
- Update pytz to 2021.1 ([#3035](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/3035))
|
||||
|
|
|
@ -11,7 +11,7 @@ flake8-isort==4.0.0
|
|||
|
||||
# Testing
|
||||
# ------------------------------------------------------------------------------
|
||||
tox==3.21.3
|
||||
tox==3.21.4
|
||||
pytest==5.4.3 # pyup: <6 # https://github.com/hackebrot/pytest-cookies/issues/51
|
||||
pytest-cookies==0.5.1
|
||||
pytest-instafail==0.4.2
|
||||
|
|
2
setup.py
2
setup.py
|
@ -10,7 +10,7 @@ except ImportError:
|
|||
|
||||
# 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.
|
||||
version = "3.0.11"
|
||||
version = "3.0.12"
|
||||
|
||||
if sys.argv[-1] == "tag":
|
||||
os.system(f'git tag -a {version} -m "version {version}"')
|
||||
|
|
|
@ -20,7 +20,7 @@ pytest-sugar==0.9.4 # https://github.com/Frozenball/pytest-sugar
|
|||
|
||||
# Documentation
|
||||
# ------------------------------------------------------------------------------
|
||||
sphinx==3.4.3 # https://github.com/sphinx-doc/sphinx
|
||||
sphinx==3.5.0 # https://github.com/sphinx-doc/sphinx
|
||||
sphinx-autobuild==2020.9.1 # https://github.com/GaretJax/sphinx-autobuild
|
||||
|
||||
# Code quality
|
||||
|
@ -33,13 +33,13 @@ pylint-django==2.4.2 # https://github.com/PyCQA/pylint-django
|
|||
{%- if cookiecutter.use_celery == 'y' %}
|
||||
pylint-celery==0.3 # https://github.com/PyCQA/pylint-celery
|
||||
{%- endif %}
|
||||
pre-commit==2.10.0 # https://github.com/pre-commit/pre-commit
|
||||
pre-commit==2.10.1 # https://github.com/pre-commit/pre-commit
|
||||
|
||||
# Django
|
||||
# ------------------------------------------------------------------------------
|
||||
factory-boy==3.2.0 # https://github.com/FactoryBoy/factory_boy
|
||||
|
||||
django-debug-toolbar==3.2 # https://github.com/jazzband/django-debug-toolbar
|
||||
django-extensions==3.1.0 # https://github.com/django-extensions/django-extensions
|
||||
django-extensions==3.1.1 # https://github.com/django-extensions/django-extensions
|
||||
django-coverage-plugin==1.8.0 # https://github.com/nedbat/django_coverage_plugin
|
||||
pytest-django==4.1.0 # https://github.com/pytest-dev/pytest-django
|
||||
|
|
|
@ -8,7 +8,7 @@ psycopg2==2.8.6 # https://github.com/psycopg/psycopg2
|
|||
Collectfast==2.2.0 # https://github.com/antonagestam/collectfast
|
||||
{%- endif %}
|
||||
{%- if cookiecutter.use_sentry == "y" %}
|
||||
sentry-sdk==0.19.5 # https://github.com/getsentry/sentry-python
|
||||
sentry-sdk==0.20.2 # https://github.com/getsentry/sentry-python
|
||||
{%- endif %}
|
||||
{%- if cookiecutter.use_docker == "n" and cookiecutter.windows == "y" %}
|
||||
hiredis==1.1.0 # https://github.com/redis/hiredis-py
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
from django.contrib.auth import forms as admin_forms
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
User = get_user_model()
|
||||
|
@ -12,20 +11,9 @@ class UserChangeForm(admin_forms.UserChangeForm):
|
|||
|
||||
|
||||
class UserCreationForm(admin_forms.UserCreationForm):
|
||||
|
||||
error_message = admin_forms.UserCreationForm.error_messages.update(
|
||||
{"duplicate_username": _("This username has already been taken.")}
|
||||
)
|
||||
|
||||
class Meta(admin_forms.UserCreationForm.Meta):
|
||||
model = User
|
||||
|
||||
def clean_username(self):
|
||||
username = self.cleaned_data["username"]
|
||||
|
||||
try:
|
||||
User.objects.get(username=username)
|
||||
except User.DoesNotExist:
|
||||
return username
|
||||
|
||||
raise ValidationError(self.error_messages["duplicate_username"])
|
||||
error_messages = {
|
||||
"username": {"unique": _("This username has already been taken.")}
|
||||
}
|
||||
|
|
|
@ -1,40 +1,39 @@
|
|||
"""
|
||||
Module for all Form Tests.
|
||||
"""
|
||||
import pytest
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from {{ cookiecutter.project_slug }}.users.forms import UserCreationForm
|
||||
from {{ cookiecutter.project_slug }}.users.tests.factories import UserFactory
|
||||
from {{ cookiecutter.project_slug }}.users.models import User
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
||||
class TestUserCreationForm:
|
||||
def test_clean_username(self):
|
||||
# A user with proto_user params does not exist yet.
|
||||
proto_user = UserFactory.build()
|
||||
"""
|
||||
Test class for all tests related to the UserCreationForm
|
||||
"""
|
||||
|
||||
form = UserCreationForm(
|
||||
{
|
||||
"username": proto_user.username,
|
||||
"password1": proto_user._password,
|
||||
"password2": proto_user._password,
|
||||
}
|
||||
)
|
||||
def test_username_validation_error_msg(self, user: User):
|
||||
"""
|
||||
Tests UserCreation Form's unique validator functions correctly by testing:
|
||||
1) A new user with an existing username cannot be added.
|
||||
2) Only 1 error is raised by the UserCreation Form
|
||||
3) The desired error message is raised
|
||||
"""
|
||||
|
||||
assert form.is_valid()
|
||||
assert form.clean_username() == proto_user.username
|
||||
|
||||
# Creating a user.
|
||||
form.save()
|
||||
|
||||
# The user with proto_user params already exists,
|
||||
# The user already exists,
|
||||
# hence cannot be created.
|
||||
form = UserCreationForm(
|
||||
{
|
||||
"username": proto_user.username,
|
||||
"password1": proto_user._password,
|
||||
"password2": proto_user._password,
|
||||
"username": user.username,
|
||||
"password1": user.password,
|
||||
"password2": user.password,
|
||||
}
|
||||
)
|
||||
|
||||
assert not form.is_valid()
|
||||
assert len(form.errors) == 1
|
||||
assert "username" in form.errors
|
||||
assert form.errors["username"][0] == _("This username has already been taken.")
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
import pytest
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.models import AnonymousUser
|
||||
from django.contrib.messages.middleware import MessageMiddleware
|
||||
from django.contrib.sessions.middleware import SessionMiddleware
|
||||
from django.http.response import Http404
|
||||
from django.test import RequestFactory
|
||||
from django.urls import reverse
|
||||
|
||||
from {{ cookiecutter.project_slug }}.users.forms import UserChangeForm
|
||||
from {{ cookiecutter.project_slug }}.users.models import User
|
||||
|
@ -90,13 +91,7 @@ class TestUserDetailView:
|
|||
request.user = AnonymousUser()
|
||||
|
||||
response = user_detail_view(request, username=user.username)
|
||||
login_url = reverse(settings.LOGIN_URL)
|
||||
|
||||
assert response.status_code == 302
|
||||
assert response.url == "/accounts/login/?next=/fake-url/"
|
||||
|
||||
def test_case_sensitivity(self, rf: RequestFactory):
|
||||
request = rf.get("/fake-url/")
|
||||
request.user = UserFactory(username="UserName")
|
||||
|
||||
with pytest.raises(Http404):
|
||||
user_detail_view(request, username="username")
|
||||
assert response.url == f"{login_url}?next=/fake-url/"
|
||||
|
|
Loading…
Reference in New Issue
Block a user