mirror of
https://github.com/cookiecutter/cookiecutter-django.git
synced 2025-02-09 08:00:50 +03:00
Add UserSignupForm and UserSocialSignupForm (#3515)
Co-authored-by: Bruno Alla <browniebroke@users.noreply.github.com>
This commit is contained in:
parent
36c6e5e0c1
commit
9f8820241f
|
@ -306,8 +306,12 @@ ACCOUNT_EMAIL_REQUIRED = True
|
||||||
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
|
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
|
||||||
# https://django-allauth.readthedocs.io/en/latest/configuration.html
|
# https://django-allauth.readthedocs.io/en/latest/configuration.html
|
||||||
ACCOUNT_ADAPTER = "{{cookiecutter.project_slug}}.users.adapters.AccountAdapter"
|
ACCOUNT_ADAPTER = "{{cookiecutter.project_slug}}.users.adapters.AccountAdapter"
|
||||||
|
# https://django-allauth.readthedocs.io/en/latest/forms.html
|
||||||
|
ACCOUNT_FORMS = {"signup": "{{cookiecutter.project_slug}}.users.forms.UserSignupForm"}
|
||||||
# https://django-allauth.readthedocs.io/en/latest/configuration.html
|
# https://django-allauth.readthedocs.io/en/latest/configuration.html
|
||||||
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
|
||||||
|
SOCIALACCOUNT_FORMS = {"signup": "{{cookiecutter.project_slug}}.users.forms.UserSocialSignupForm"}
|
||||||
{% if cookiecutter.use_compressor == 'y' -%}
|
{% if cookiecutter.use_compressor == 'y' -%}
|
||||||
# django-compressor
|
# django-compressor
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
|
@ -3,7 +3,7 @@ from django.contrib.auth import admin as auth_admin
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from {{ cookiecutter.project_slug }}.users.forms import UserChangeForm, UserCreationForm
|
from {{ cookiecutter.project_slug }}.users.forms import UserAdminChangeForm, UserAdminCreationForm
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
|
@ -11,8 +11,8 @@ User = get_user_model()
|
||||||
@admin.register(User)
|
@admin.register(User)
|
||||||
class UserAdmin(auth_admin.UserAdmin):
|
class UserAdmin(auth_admin.UserAdmin):
|
||||||
|
|
||||||
form = UserChangeForm
|
form = UserAdminChangeForm
|
||||||
add_form = UserCreationForm
|
add_form = UserAdminCreationForm
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, {"fields": ("username", "password")}),
|
(None, {"fields": ("username", "password")}),
|
||||||
(_("Personal info"), {"fields": ("name", "email")}),
|
(_("Personal info"), {"fields": ("name", "email")}),
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
from allauth.account.forms import SignupForm
|
||||||
|
from allauth.socialaccount.forms import SignupForm as SocialSignupForm
|
||||||
from django.contrib.auth import forms as admin_forms
|
from django.contrib.auth import forms as admin_forms
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
@ -5,15 +7,36 @@ from django.utils.translation import gettext_lazy as _
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
class UserChangeForm(admin_forms.UserChangeForm):
|
class UserAdminChangeForm(admin_forms.UserChangeForm):
|
||||||
class Meta(admin_forms.UserChangeForm.Meta):
|
class Meta(admin_forms.UserChangeForm.Meta):
|
||||||
model = User
|
model = User
|
||||||
|
|
||||||
|
|
||||||
class UserCreationForm(admin_forms.UserCreationForm):
|
class UserAdminCreationForm(admin_forms.UserCreationForm):
|
||||||
|
"""
|
||||||
|
Form for User Creation in the Admin Area.
|
||||||
|
To change user signup, see UserSignupForm and UserSocialSignupForm.
|
||||||
|
"""
|
||||||
|
|
||||||
class Meta(admin_forms.UserCreationForm.Meta):
|
class Meta(admin_forms.UserCreationForm.Meta):
|
||||||
model = User
|
model = User
|
||||||
|
|
||||||
error_messages = {
|
error_messages = {
|
||||||
"username": {"unique": _("This username has already been taken.")}
|
"username": {"unique": _("This username has already been taken.")}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class UserSignupForm(SignupForm):
|
||||||
|
"""
|
||||||
|
Form that will be rendered on a user sign up section/screen.
|
||||||
|
Default fields will be added automatically.
|
||||||
|
Check UserSocialSignupForm for accounts created from social.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class UserSocialSignupForm(SocialSignupForm):
|
||||||
|
"""
|
||||||
|
Renders the form when user has signed up using social accounts.
|
||||||
|
Default fields will be added automatically.
|
||||||
|
See UserSignupForm otherwise.
|
||||||
|
"""
|
||||||
|
|
|
@ -5,7 +5,11 @@ from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class User(AbstractUser):
|
class User(AbstractUser):
|
||||||
"""Default user for {{cookiecutter.project_name}}."""
|
"""
|
||||||
|
Default custom user model for {{cookiecutter.project_name}}.
|
||||||
|
If adding fields that need to be filled at user signup,
|
||||||
|
check forms.SignupForm and forms.SocialSignupForms accordingly.
|
||||||
|
"""
|
||||||
|
|
||||||
#: 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)
|
||||||
|
|
|
@ -4,20 +4,20 @@ Module for all Form Tests.
|
||||||
import pytest
|
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 UserCreationForm
|
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
|
pytestmark = pytest.mark.django_db
|
||||||
|
|
||||||
|
|
||||||
class TestUserCreationForm:
|
class TestUserAdminCreationForm:
|
||||||
"""
|
"""
|
||||||
Test class for all tests related to the UserCreationForm
|
Test class for all tests related to the UserAdminCreationForm
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def test_username_validation_error_msg(self, user: User):
|
def test_username_validation_error_msg(self, user: User):
|
||||||
"""
|
"""
|
||||||
Tests UserCreation Form's unique validator functions correctly by testing:
|
Tests UserAdminCreation Form's unique validator functions correctly by testing:
|
||||||
1) A new user with an existing username cannot be added.
|
1) A new user with an existing username cannot be added.
|
||||||
2) Only 1 error is raised by the UserCreation Form
|
2) Only 1 error is raised by the UserCreation Form
|
||||||
3) The desired error message is raised
|
3) The desired error message is raised
|
||||||
|
@ -25,7 +25,7 @@ class TestUserCreationForm:
|
||||||
|
|
||||||
# The user already exists,
|
# The user already exists,
|
||||||
# hence cannot be created.
|
# hence cannot be created.
|
||||||
form = UserCreationForm(
|
form = UserAdminCreationForm(
|
||||||
{
|
{
|
||||||
"username": user.username,
|
"username": user.username,
|
||||||
"password1": user.password,
|
"password1": user.password,
|
||||||
|
|
|
@ -8,7 +8,7 @@ from django.http import HttpRequest, HttpResponseRedirect
|
||||||
from django.test import RequestFactory
|
from django.test import RequestFactory
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from {{ cookiecutter.project_slug }}.users.forms import UserChangeForm
|
from {{ cookiecutter.project_slug }}.users.forms import UserAdminChangeForm
|
||||||
from {{ cookiecutter.project_slug }}.users.models import User
|
from {{ cookiecutter.project_slug }}.users.models import User
|
||||||
from {{ cookiecutter.project_slug }}.users.tests.factories import UserFactory
|
from {{ cookiecutter.project_slug }}.users.tests.factories import UserFactory
|
||||||
from {{ cookiecutter.project_slug }}.users.views import (
|
from {{ cookiecutter.project_slug }}.users.views import (
|
||||||
|
@ -62,7 +62,7 @@ class TestUserUpdateView:
|
||||||
view.request = request
|
view.request = request
|
||||||
|
|
||||||
# Initialize the form
|
# Initialize the form
|
||||||
form = UserChangeForm()
|
form = UserAdminChangeForm()
|
||||||
form.cleaned_data = []
|
form.cleaned_data = []
|
||||||
view.form_valid(form)
|
view.form_valid(form)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user