Aula 51 – Loja Online – Django – Total do Pedido

Aula 51 – Loja Online – Django – Total do Pedido

Total do Pedido

Total do Pedido

Voltar para página principal do blog

Todas as aulas desse curso

Aula 50               Aula 52

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

Todas as aulas desse curso

Aula 50               Aula 52

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!

About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>