Aula 51 - Loja Online - Django - Total do Pedido

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

https://digitalinnovation.one/

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

Toti:

https://www.youtube.com/channel/UCUEtjLuDpcOvR3mIUr-viOA

Backing track / Play-along:

https://www.youtube.com/channel/UCT3TryVMqTqYBjf5g5WAHfA

Código Fluente

https://www.youtube.com/channel/UCgn-O-88XBAwdG9gUWkkb0w

Putz!

https://www.youtube.com/channel/UCZXop2-CECwyFYmHbhnAkAw

Aula 51 - Loja Online - Django - Total do Pedido

Na verdade o cálculo já está sendo efetuado em parte no carrinho, o que precisamos é uma forma de quando o carrinho for salvo, salvar o total no Order. Não podemos importar o Order no models.py do Cart, porque já estamos importando o Cart no models do Order. Isso geraria um ciclo reverso sem fim. Então o que vamos fazer é: no models.py do Orders, importar o Model signals post_save. O módulo  Model signals define um conjunto de sinais enviados pelo modelo.

Seguindo

Vamos criar uma função chamada post_save_cart_total() que vai receber uma instância de Cart em cart_obj. A partir da instância do Cart, pegamos o total daquele Cart instanciado e a função update_total() faz a soma do total que recebeu da instância do Cart e soma com shipping_total. O shipping_total você pode pensar em alguma taxa a mais, além do que foi calculado no carrinho, no caso aqui, a gente definiu um valor padrão de 5.99. O método update_total() é chamado quando o Cart muda e quando o Order é criado pela primeira vez. Então, toda vez que o carrinho for alterado e salvo, o update_total() do Order é chamado. A post_save_cart_total() só executa quando o Order ainda não tiver sido criado. E a post_save_order() quando o Order já tiver sido criado. Lembrando que o sinal pre_save é enviado antes que um modelo seja salvo e o pos_save o inverso.

from django.db import models
from django.db.models.signals import pre_save, post_save
from carts.models import Cart
from e_commerce.utils import unique_order_id_generator

ORDER_STATUS_CHOICES = (
    ('created', 'Criado'),
    ('paid', 'Pago'),
    ('shipped', 'Enviado'),
    ('refunded', 'Devolvido'),
)

class Order(models.Model):
    order_id = models.CharField(max_length = 120, blank = True)
    # billing_profile = ?
    # shipping_address = ?
    # billing_address
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE, null = True)
    status = models.CharField(max_length = 120, default = 'created', choices = ORDER_STATUS_CHOICES )
    shipping_total = models.DecimalField(default = 5.99, max_digits = 100, decimal_places = 2)
    total = models.DecimalField(default = 0.00, max_digits = 100, decimal_places = 2)

    def __str__(self):
        return self.order_id
    def update_total(self):
        cart_total = self.cart.total
        shipping_total = self.shipping_total
        new_total = cart_total + shipping_total
        self.total = new_total
        self.save()
        return new_total

def pre_save_create_order_id(sender, instance, *args, **kwargs):
    if not instance.order_id:
        instance.order_id = unique_order_id_generator(instance)

pre_save.connect(pre_save_create_order_id, sender = Order)

def post_save_cart_total(sender, instance, created, *args, **kwargs):
    if not created:
        cart_obj = instance
        cart_total = cart_obj.total
        cart_id = cart_obj.id
        qs = Order.objects.filter(cart__id=cart_id)
        if qs.count() == 1:
            order_obj = qs.first()
            order_obj.update_total()

post_save.connect(post_save_cart_total, sender=Cart)

def post_save_order(sender, instance, created, *args, **kwargs):
    print("Executando")
    if created:
        print("Atualizando")
        instance.update_total()

post_save.connect(post_save_order, sender=Order)

Agora acesse http://127.0.0.1:8000/admin

Clique em Orders no painel admin e ligue um Order a um carrinho e salve. Altere o carrinho associado ao Order, adicione itens, depois volte no Order e veja se tá calculando certinho, inclusive se tá adicionando o 5.99 do shipping_total ao total do Order.

Por essa aula é só, nos vemos na próxima.

Voltar para página principal do blog

Código final da aula:

https://github.com/toticavalcanti

Outros canais

Toti:

https://www.youtube.com/channel/UCUEtjLuDpcOvR3mIUr-viOA

Backing track / Play-along:

https://www.youtube.com/channel/UCT3TryVMqTqYBjf5g5WAHfA

Código Fluente

https://www.youtube.com/channel/UCgn-O-88XBAwdG9gUWkkb0w

Putz!

https://www.youtube.com/channel/UCZXop2-CECwyFYmHbhnAkAw

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

Nos vemos na próxima então, \o/  😉 Bons Estudos!