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 %}
-
-
-
-
- Flowbite
+{% block main %}
+
+
+
+
+
+ {{ title }}
-
-
-
- Create and account
-
-
-
+
+
+
+
+ {% translate 'Crea tu cuenta' %}
+
+
+
-
-
-{% 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"