Aula 60 - Loja Online - Gerenciador de perfil de pagamento
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:
Quer aprender python3 de graça e com certificado? Acesse então:
Toti:
Backing track / Play-along:
Código Fluente
Putz!
Aula 60 - Loja Online - Gerenciador de perfil de pagamento
Temos então um carrinho (
Cart), um pedido (
Order) e um perfil de faturamento (
Billing Profile).
Precisamos do endereço para envio (
Shipping Address) e das informações de pagamento (
Billing Information).
As informações de pagamento são: endereço residencial e/ou cartão de crédito.
No
views.py do
carts temos essa parte de código:
if user.is_authenticated:
billing_profile, billing_profile_created = BillingProfile.objects.get_or_create(
user=user, email=user.email)
elif guest_email_id is not None:
guest_email_obj = GuestEmail.objects.get(id=guest_email_id)
billing_profile, billing_guest_profile_created = BillingProfile.objects.get_or_create(
email=guest_email_obj.email)
else:
pass
Essa parte podemos passar para o gerenciador de
billing profile que é o que iremos fazer nessa aula.
Fazendo isso, fica mais fácil usar o
billing profile em qualquer outro lugar do código.
O
cart pega a
request, manda para o gerenciador de
billing profile e espera o retorno.
Vamos começar então.
No
models.py do
billing, crie o
BillingProfileManager:
e_commerce/billing/models.py
from django.conf import settings
from django.db import models
from django.db.models.signals import post_save
from accounts.models import GuestEmail
User = settings.AUTH_USER_MODEL
# fulano@mail.com -> pode ter 1.000.000.000 billing profiles
# user fulano@mail.com -> pode ter apenas 1 billing profile
class BillingProfileManager(models.Manager):
def new_or_get(self, request):
user = request.user
guest_email_id = request.session.get('guest_email_id')
created = False
obj = None
if user.is_authenticated:
'logged in user checkout; remember payment stuff'
obj, created = self.model.objects.get_or_create(
user=user, email=user.email)
elif guest_email_id is not None:
'guest user checkout; auto reloads payment stuff'
guest_email_obj = GuestEmail.objects.get(id=guest_email_id)
obj, created = self.model.objects.get_or_create(
email=guest_email_obj.email)
else:
pass
return obj, created
class BillingProfile(models.Model):
user = models.OneToOneField(User, null = True, blank = True, on_delete = models.CASCADE)
email = models.EmailField()
active = models.BooleanField(default = True)
update = models.DateTimeField(auto_now = True)
timestamp = models.DateTimeField(auto_now_add = True)
# customer_id no Stripe ou Braintree ou ...
objects = BillingProfileManager()
def __str__(self):
return self.email
def user_created_receiver(sender, instance, created, *args, **kwargs):
if created and instance.email:
BillingProfile.objects.get_or_create(user = instance, email = instance.email)
post_save.connect(user_created_receiver, sender = User)
Agora podemos tirar do
views.py do
carts essa parte:
e_commerce/carts/views.py
if user.is_authenticated:
billing_profile, billing_profile_created = BillingProfile.objects.get_or_create(
user=user, email=user.email)
elif guest_email_id is not None:
guest_email_obj = GuestEmail.objects.get(id=guest_email_id)
billing_profile, billing_guest_profile_created = BillingProfile.objects.get_or_create(
email=guest_email_obj.email)
else:
pass
E substituir por:
billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(request)
Então o
e_commerce/carts/views.py
from django.shortcuts import render, redirect
from accounts.forms import LoginForm, GuestForm
from accounts.models import GuestEmail
from billing.models import BillingProfile
from orders.models import Order
from products.models import Product
from .models import Cart
def cart_home(request):
cart_obj, new_obj = Cart.objects.new_or_get(request)
return render(request, "carts/home.html", {"cart": cart_obj})
def cart_update(request):
print(request.POST)
product_id = request.POST.get('product_id')
if product_id is not None:
try:
product_obj = Product.objects.get(id = product_id)
except Product.DoesNotExist:
print("Mostrar mensagem ao usuário, esse produto acabou!")
return redirect("cart:home")
cart_obj, new_obj = Cart.objects.new_or_get(request)
if product_obj in cart_obj.products.all():
cart_obj.products.remove(product_obj)
else:
cart_obj.products.add(product_obj)
request.session['cart_items'] = cart_obj.products.count()
return redirect("cart:home")
def checkout_home(request):
#aqui a gente pega o carrinho
cart_obj, cart_created= Cart.objects.new_or_get(request)
order_obj = None
#se o carrinho acabou de ser criado, ele tá zerado
#ou se o carrinho já existir mas não tiver nada dentro
if cart_created or cart_obj.products.count() == 0:
return redirect("cart:home")
login_form = LoginForm()
guest_form = GuestForm()
billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(request)
if billing_profile is not None:
order_obj, order_obj_created = Order.objects.new_or_get(billing_profile, cart_obj)
context = {
"object": order_obj,
"billing_profile": billing_profile,
"login_form": login_form,
"guest_form": guest_form
}
return render(request, "carts/checkout.html", context)
É isso, ficamos por aqui e até a 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!