Add UserSignupForm and UserSocialSignupForm (#3515)

Co-authored-by: Bruno Alla <browniebroke@users.noreply.github.com>
This commit is contained in:
mpoli 2022-01-13 15:38:35 -03:00 committed by GitHub
parent 36c6e5e0c1
commit 9f8820241f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 44 additions and 13 deletions

View File

@ -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
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

View File

@ -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")}),

View File

@ -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.
"""

View File

@ -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)

View File

@ -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,

View File

@ -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)