Aula 42 - Loja Online - Django - Gerência do carrinho - Cart Manager

Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no Facebook

Esse é o link do código fluente no Pinterest

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Melhore seu NETWORKING

Participe de comunidades de desenvolvedores:

Fiquem a vontade para me adicionar ao linkedin.

E também para me seguir no https://github.com/toticavalcanti.

Código final da aula:

https://github.com/toticavalcanti

Aula 42 - Loja Online - Django - Gerência do carrinho - Cart Manager

Vamos construir a classe CartManager, resposável por gerenciar o carrinho.

Gerentes

Classe Manager

Um Manager é a interface por meio da qual as operações de consulta ao banco de dados são fornecidas aos modelos Django. Por padrão, o Django adiciona um Manager com o nome de objetos para cada classe de modelo Django. Mas, se quiser usar objetos como um nome de campo ou se quiser usar um nome diferente de objetos para o gerenciador, você pode renomeá-lo por modelo. Para renomear o gerenciador de uma determinada classe, defina um atributo de classe do tipo models.Manager().

E é isso que faremos no nosso models.py do carts.

A classe CartManager é criada recebendo como parâmetro o models.Manager, porque a gente tá extendendomodels.Manager na CartManager. Em seguida definimos o método new_or_get() que recebe a instância de si mesmo ( self ) em memória e a request. A linha: cart_id = request.session.get("cart_id", None) Essa linha pega o cart_id caso exista, senão, retorna None. Em seguida é feita uma consulta filtrando pelo id do carrinho guardando o resultado da consulta em qs. qs = self.get_queryset().filter(id = cart_id)  Como estamos consultando pelo id do carrinho, o retorno será um e somente um carrinho, caso ele exista.

A linha do if:

if qs.count == 1: Testa pra ver se o carrinho foi retornado. Em seguida, temos uma variável booleana chamada new_obj. Ela é usada tanto dentro do if, como também dentro do else. Ela é só pra indicar se um novo objeto carrinho foi criado ou não. Então, se entrou no if é porque foi retornado o carrinho com o id pego pelo session.get(). Aí então não precisamos criar um outro objeto carrinho, por isso: new_obj = False Se cair no else, é o porque o session.get() não retornou um carrinho, então é preciso criar um: new_obj = True Seguindo dentro do if, como o carrinho foi retornado pelo session.get(), ou seja, já existe, pegamos esse carrinho e atribuímos a variável cart_obj. cart_obj = qs.first() Temos agora um if interno. if request.user.is_authenticated and cart_obj.user is None:     cart_obj.user = request.user     cart_obj.save()  Esse trecho acima testa se o usuário está autenticado e se o carrinho não está associado a ele, se isso tudo for verdade, o carrinho é associado a esse usuário autenticado e a associação é salva no banco. Esse if interno não tem else.

Else

A parte do else é quando o carrinho não existe, então um carrinho é criado e associado ao usuário logado. cart_obj = Cart.objects.new(user=request.user) O new, falaremos mais abaixo. E como foi criado um novo objeto carrinho, colocamos new_obj como True: new_obj = True Em seguida é atribuido a chave cart_id do dicionário session, o id do carrinho que acabou de ser criado: request.session['cart_id'] = cart_obj.id E por fim é retornado o cart_obj, que é o carrinho, e o new_obj, a variável booleana, que nos informa se o carrinho teve que ser criado ou não. return cart_obj, new_obj 

Agora o método new

def new(self, user=None):     user_obj = None     if user is not None:         if user.is_authenticated:             user_obj = user     return self.model.objects.create(user=user_obj)  Nesse método, verificamos se o usuário existe e se está autenticado, se isso for verdade, atribuimos ao usuário que chegou a esse método, a variável user_obj. No final, é retornado o objeto criado associado ao usuário se ele existir ou None caso contrário.

django_ecommerce/carts/models.py


from django.conf import settings
from django.db import models

from products.models import Product

User = settings.AUTH_USER_MODEL

class CartManager(models.Manager):
    def new_or_get(self, request):
        cart_id = request.session.get("cart_id", None)
        qs = self.get_queryset().filter(id = cart_id)
        if qs.count() == 1:
            new_obj = False
            cart_obj = qs.first()
            if request.user.is_authenticate and cart_obj.user is None:
                cart_obj.user = request.user
                cart_obj.save()
        else:
            cart_obj = Cart.objects.new(user = request.user)
            new_obj = True
            request.session['cart_id'] = cart_obj.id
        return cart_obj, new_obj

    def new(self, user = None):
        user_obj = None
        if user is not None:
            if user.is_authenticate:
                user_obj = user
        return self.model.objects.create(user = user_obj)

class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null = True, blank = True)
    products = models.ManyToManyField(Product, blank = True)
    total = models.DecimalField(default = 0.00, max_digits=100, decimal_places = 2)
    updated = models.DateTimeField(auto_now = True)
    timestamp = models.DateTimeField(auto_now_add = True)

    objects = CartManager()

    def __str__(self):
        return str(self.id)

Views

Temos o import do model Cart. from .models import Cart  dentro do cart_home() chamamos o método new_or_get() do gerente de carrinho que criamos e atribuimos a variável cart_obj. cart_obj = Cart.objects.new_or_get(request)

Veja os códigos completos.

django_ecommerce/carts/views.py


from django.shortcuts import render
from .models import Cart

def cart_home(request):
    cart_obj = Cart.objects.new_or_get(request)
    return render(request, "carts/home.html", {})

Certifique-se que o seu servidor está rodando e acesse a página de admin.

Veja que temos alguns carrinhos criados.

Faça o logout na página de admin e como usuário também, em seguida dê um refresh na página http://127.0.0.1:8000/cart. Entre na página na http://127.0.0.1:8000/admin e acesse carts, veja que ele criou um carrinho, mas não associou a nenhum usuário, porque não tinha nenhum usuário logado na sessão. Agora faça o login como usuário comum e acesse novamente a página http://127.0.0.1:8000/cart. Agora na admin acesse carts e veja que foi criado um novo carrinho associado ao usuário logado.

É isso pessoal, nos vemos na próxima!

Código final da aula:

https://github.com/toticavalcanti

Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no Facebook

Link do código fluente no Pinterest

Novamente deixo meus link de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado, até a próxima e bons estudos. ;)