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:
Melhore seu NETWORKING
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
Código final da aula:
Toti:
Backing track / Play-along:
Código Fluente
Putz!
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)
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.
Código final da aula:
Outros canais
Toti:
Backing track / Play-along:
Código Fluente
Putz!
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:
Nos vemos na próxima então, \o/ 😉 Bons Estudos!