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, RegisterForm from web.models import WebSettings User = get_user_model() class RedirectionMixin: redirect_to = "" def get_redirection(self): return reverse(self.redirect_to) class LoginView(View, RedirectionMixin): template_name = "users/login.html" redirect_to = "web:index" login_form_class = LoginForm def get_login_form(self, request): return self.login_form_class(data=request.POST) def get(self, request, *args, **kwargs): if request.user.is_authenticated: return redirect(self.get_redirection()) settings = WebSettings.load() login_form = self.login_form_class() return render( request, self.template_name, { "form": login_form, "title": settings.web_title, "description": _("inicio de sesión"), }, ) def post(self, request, *args, **kwargs): login_form = self.get_login_form(request) if login_form.is_valid(): login_user(request, login_form.get_user()) if not login_form.cleaned_data.get("remember_me"): request.session.set_expiry(0) return redirect(self.get_redirection()) 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" def get(self, request, *args, **kwargs): logout_user(request) return redirect(self.get_redirection()) def post(self, request, *args, **kwargs): logout_user(request) return redirect(self.get_redirection()) class ResetPasswordView(TemplateView): template_name = "web/reset-password.html" class MyAccountView(TemplateView): template_name = "users/user_details.html" def get_context_data(self, **kwargs): addresses = CustomerAddress.objects.filter(user=self.request.user) settings = WebSettings.load() return { "web_title": settings.web_title, "customer_addresses": addresses, } login = LoginView.as_view() logout = LogoutView.as_view() register = RegisterView.as_view() reset_password = ResetPasswordView.as_view() my_account = MyAccountView.as_view()