diff --git a/users/forms/login.py b/users/forms/login.py index e969454..c5c1b0d 100644 --- a/users/forms/login.py +++ b/users/forms/login.py @@ -5,7 +5,7 @@ from django.utils.text import gettext_lazy as _ class LoginForm(AuthenticationForm): username = UsernameField( - widget=forms.TextInput( + widget=forms.EmailInput( attrs={ "autofocus": True, "class": "my-2 bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-primary-600 " @@ -20,9 +20,10 @@ class LoginForm(AuthenticationForm): widget=forms.PasswordInput( attrs={ "autocomplete": "current-password", - "class": "my-2 bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-primary-600 " - "focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 " - "dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500", + "class": "my-2 bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg " + "focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 " + "dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 " + "dark:focus:border-primary-500", } ), ) diff --git a/users/forms/register.py b/users/forms/register.py index e69de29..d31067a 100644 --- a/users/forms/register.py +++ b/users/forms/register.py @@ -0,0 +1,33 @@ +from django import forms +from django.contrib.auth.forms import SetPasswordMixin, BaseUserCreationForm +from django.contrib.auth.models import User +from django.forms import EmailField + + +class RegisterForm(BaseUserCreationForm, SetPasswordMixin): + password1, password2 = SetPasswordMixin.create_password_fields() + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + for field_name in self.fields.keys(): + self.fields[field_name].widget.attrs.update( + { + "class": "my-2 bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg " + "focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 " + "dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 " + "dark:focus:border-primary-500" + } + ) + + class Meta: + model = User + fields = ( + "email", + "first_name", + "last_name", + ) + field_classes = { + "email": EmailField, + "first_name": forms.CharField, + "last_name": forms.CharField, + } diff --git a/web/templates/users/login.html b/web/templates/users/login.html index 89e8412..980dc30 100644 --- a/web/templates/users/login.html +++ b/web/templates/users/login.html @@ -34,7 +34,6 @@ {{ field }} - {% endif %} {% endfor %} @@ -44,7 +43,7 @@

{% translate '¿Aún no tienes cuenta?' %} - {% translate 'Regístrate aquí' %} + {% translate 'Regístrate aquí' %}

diff --git a/web/templates/users/register.html b/web/templates/users/register.html index 586604c..8298dcf 100644 --- a/web/templates/users/register.html +++ b/web/templates/users/register.html @@ -1,45 +1,54 @@ -{% extends 'base/base.html' %} +{% extends 'theme/base.html' %} +{% load i18n %} -{% block content %} -
-
- - logo - Flowbite +{% block main %} +
+
+ + + logo + {{ title }} -
-
-

- Create and account -

-
-
- - -
-
- - -
-
- - -
-
-
- -
-
- -
-
- -

- Already have an account? Login here -

-
-
+ +
+
+

+ {% translate 'Crea tu cuenta' %} +

+
+ {% csrf_token %} + {% for field in form %} +
+ + + {{ field }} +
+ + {% endfor %} + + {% if errors %} + {% for error in errors %} + {{ error }} + {% endfor %} + {% endif %} + + +

+ {% translate '¿Ya tienes cuenta?' %} + {% translate 'Inicia sesión aquí' %} +

+
+
-
-
-{% endblock %} \ No newline at end of file +
+
+ +{% endblock %} diff --git a/web/tests/test_register.py b/web/tests/test_register.py new file mode 100644 index 0000000..7fb1eb0 --- /dev/null +++ b/web/tests/test_register.py @@ -0,0 +1,100 @@ +from django.contrib.auth import get_user_model +from django.shortcuts import reverse +from django.test import TestCase + +User = get_user_model() + + +class TestRegister(TestCase): + def setUp(self) -> None: + self.password = "theonering" + self.email = "sauron@mordor.middleearth" + self.first_name = "Sauron" + self.last_name = "The Lord of the Rings" + + def test_create_user_account(self): + response = self.client.post( + reverse("web:register"), + { + "email": self.email, + "password1": self.password, + "password2": self.password, + "first_name": self.first_name, + "last_name": self.last_name, + }, + ) + + user = User.objects.filter( + username=self.email, + email=self.email, + first_name=self.first_name, + last_name=self.last_name, + ).first() + + assert user is not None + + assert response.status_code == 302 + assert response.url == reverse("web:index") + + def test_create_user_account_distinct_password(self): + response = self.client.post( + reverse("web:register"), + { + "email": self.email, + "password1": self.password, + "password2": "otherpassword", + "first_name": self.first_name, + "last_name": self.last_name, + }, + ) + + assert not User.objects.filter( + username=self.email, + email=self.email, + first_name=self.first_name, + last_name=self.last_name, + ).exists() + + assert response.status_code == 400 + + def test_create_user_account_no_first_name(self): + response = self.client.post( + reverse("web:register"), + { + "email": self.email, + "password1": self.password, + "password2": "otherpassword", + "first_name": "", + "last_name": self.last_name, + }, + ) + + assert not User.objects.filter( + username=self.email, + email=self.email, + first_name="", + last_name=self.last_name, + ).exists() + + assert response.status_code == 400 + + def test_create_user_account_no_last_name(self): + response = self.client.post( + reverse("web:register"), + { + "email": self.email, + "password1": self.password, + "password2": "otherpassword", + "first_name": self.first_name, + "last_name": "", + }, + ) + + assert not User.objects.filter( + username=self.email, + email=self.email, + first_name=self.first_name, + last_name="", + ).exists() + + assert response.status_code == 400 diff --git a/web/views/users.py b/web/views/users.py index d972662..10b9801 100644 --- a/web/views/users.py +++ b/web/views/users.py @@ -1,14 +1,19 @@ -from django.contrib.auth import login as login_user +from django.contrib.auth import login as login_user, authenticate from django.contrib.auth import logout as logout_user +from django.contrib.auth import get_user_model +from django.db import IntegrityError from django.shortcuts import redirect, render, reverse from django.utils.text import gettext_lazy as _ from django.views.generic import TemplateView, View from shop.models import CustomerAddress -from users.forms import LoginForm +from users.forms import LoginForm, RegisterForm from web.models import WebSettings +User = get_user_model() + + class RedirectionMixin: redirect_to = "" @@ -55,6 +60,54 @@ class LoginView(View, RedirectionMixin): return render(request, self.template_name, {"form": login_form}, status=400) +class RegisterView(TemplateView, RedirectionMixin): + template_name = "users/register.html" + redirect_to = "web:index" + form_class = RegisterForm + + def get_context_data(self, **kwargs): + settings = WebSettings.load() + + return { + "form": self.form_class(), + "title": settings.web_title, + "description": _("crear cuenta"), + } + + def post(self, request, *args, **kwargs): + settings = WebSettings.load() + form = self.form_class(request.POST) + errors = [] + + try: + if form.is_valid(): + user = form.save() + + user.username = user.email + user.first_name = form.cleaned_data.get("first_name") + user.last_name = form.cleaned_data.get("last_name") + user.save() + + login(request, user) + return redirect(self.get_redirection()) + else: + errors = form.errors + except IntegrityError as e: + errors = [_("Ya existe un usuario con ese correo electrónico"), ] + + return render( + request, + self.template_name, + { + "form": form, + "title": settings.web_title, + "description": _("Crear cuenta"), + "errors": errors, + }, + status=400, + ) + + class LogoutView(View, RedirectionMixin): redirect_to = "web:index" @@ -67,10 +120,6 @@ class LogoutView(View, RedirectionMixin): return redirect(self.get_redirection()) -class RegisterView(TemplateView): - template_name = "web/register.html" - - class ResetPasswordView(TemplateView): template_name = "web/reset-password.html"