Aula 60 – Loja Online – Gerenciador de perfil de pagamento
Aula 60 – Loja Online – Gerenciador de perfil de pagamento
Voltar para página principal do blog
Todas as aulas desse curso
Aula 59 Aula 61
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
Quer aprender python3 de graça e com certificado? Acesse então:
https://workover.com.br/python-codigo-fluente
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 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)