Aula 55 - Loja Online - Django - Perfil de Pagamento - Billing Profile
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 55 - Loja Online - Django - Perfil de Pagamento - Billing Profile
Vamos criar mais um
componente da nosso
e-commerce, isto é, vamos criar mais um
app dentro do projeto pai que é o
e-commerce.
Em Django: APP = COMPONENT
O
Billing Profile vai ser associado a um usuário convidado ou um usuário autenticado.
Um
e-mail pode ter vários perfis de cobrança, enquanto um usuário autenticado só pode ter um
Billing Profile, por causa do
token do processo de pagamento.
Podemos então associar um
perfil de fatura (
Billing Profile) com o
e-mail.
Mas, toda vez que esse usuário começar o processo de
checkout de novo, ele vai precisar digitar o
e-mail e provavelmente o
endereço.
Da perspectiva de um usuário convidado, ele não deve se lembrar de nada.
Agora, da nossa perspectiva de desenvolvedor, precisamos lembrar dessas coisas.
Além disso, se um usuário convidado se registrar e logar, ou seja, um usuário autenticado, os pedidos anteriores serão enviados a ele, associando ao e-mail específico que ele usa.
Mãos a obra
Criando o app billing
python manage.py startapp billing
A ideia é que cada app, ou seja, cada componente seja responsável por uma parte do processo todo que envolve a construção de um e-commerce.
Em outras palavras, cada app deve ser especialista em fazer uma coisa específica, da melhor e mais eficiente forma possível.
O
Order por exemplo, lida muito bem com todos os pedidos.
Você poderia colocar um
Order no
Billing, mas, para ficar melhor, vamos deixar o
Billing cuidar da conta de pagamento ligada a um usuário e deixa
Order cuidar dos pedidos, ele é especialista nisso.
Abra o arquivo
models.py do
Billing e coloque o conteúdo abaixo:
e_commerce/billing/models.py
from django.conf import settings
from django.db import models
from django.db.models.signals import post_save
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 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 ...
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)
django_ecommerce/e_commerce/e_commerce/settings.py
"""
Django settings for e_commerce project.
Generated by 'django-admin startproject' using Django 2.1.4.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'xjmv-0^l__duq4-xp54m94bsf02lx4&1xka_ykd_(7(5#9^1o^'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#our apps
'billing',
'accounts',
'carts',
'orders',
'products',
'search',
'tags',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
LOGOUT_REDIRECT_URL = '/login/'
ROOT_URLCONF = 'e_commerce.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'e_commerce.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static_local")
]
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn", "static_root")
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn", "media_root")
e_commerce/billing/admin.py
from django.contrib import admin
from .models import BillingProfile
admin.site.register(BillingProfile)
Fico por aqui, na próxima seguimos na construção do billing.
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!