from django.shortcuts import get_object_or_404 from django.http.response import HttpResponse from django.views.decorators.http import require_http_methods from shop.models import Product, CartItem from web.utils import get_or_create_cart from web.settings import ANONYMOUS_CART_ID_COOKIE_NAME from django.contrib.auth import login as login_user from django.contrib.auth import logout as logout_user from django.shortcuts import redirect, render, reverse from django.views.generic import TemplateView, View from users.forms import LoginForm 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()) login_form = self.login_form_class() return render(request, self.template_name, {"form": login_form}) 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 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 RegisterView(TemplateView): template_name = "web/register.html" class ResetPasswordView(TemplateView): template_name = "web/reset-password.html" class IndexView(TemplateView): template_name = "web/index.html" def get_context_data(self, **kwargs): return { "title": "Shoppy", } class ProductDetail(TemplateView): template_name = "web/product_detail.html" def get_context_data(self, pk, slug, **kwargs): product = get_object_or_404(Product, pk=pk) return { "product": product, "title": product.name, "description": product.description, "image": product.images.first(), } @require_http_methods( [ "POST", ] ) def add_cart_item(request, *args, **kwargs): product = get_object_or_404(Product, pk=request.POST.get("product")) cart, created = get_or_create_cart(request) response = HttpResponse(status=201, headers={"HX-Trigger": "updated-cart"}) if created and request.user.is_anonymous: response.set_cookie(ANONYMOUS_CART_ID_COOKIE_NAME, cart.uuid) # Comprobamos si existe una línea de carrito para ese carrito de ese producto existing_cart_item = CartItem.objects.filter(cart=cart, product=product).first() # Si existe, simplemente le sumamos la cantidad a la línea ya existente if existing_cart_item is not None: existing_cart_item.quantity += int(request.POST.get("quantity")) existing_cart_item.save() # Si no, lo creamos else: CartItem.objects.create( cart=cart, quantity=request.POST.get("quantity"), product=product, ) return response @require_http_methods( [ "POST", ] ) def delete_cart_item(request, pk, *args, **kwargs): cart, created = get_or_create_cart(request) cart_item = get_object_or_404(CartItem, pk=pk, cart=cart) cart_item.delete() return HttpResponse(status=204, headers={"HX-Trigger": "updated-cart"}) index = IndexView.as_view() product_detail = ProductDetail.as_view() login = LoginView.as_view() logout = LogoutView.as_view() register = RegisterView.as_view() reset_password = ResetPasswordView.as_view()