Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save alisonamerico/bb3c8e8fb5d4aea1719b74948a1aafd0 to your computer and use it in GitHub Desktop.
Save alisonamerico/bb3c8e8fb5d4aea1719b74948a1aafd0 to your computer and use it in GitHub Desktop.
views.py - checkout
# coding=utf-8
from pagseguro import PagSeguro
from django.shortcuts import get_object_or_404, redirect
from django.views.generic import (
RedirectView, TemplateView, ListView, DetailView
)
from django.forms import modelformset_factory
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.urlresolvers import reverse
from catalog.models import Product
from .models import CartItem, Order
class CreateCartItemView(RedirectView):
def get_redirect_url(self, *args, **kwargs):
product = get_object_or_404(Product, slug=self.kwargs['slug'])
if self.request.session.session_key is None:
self.request.session.save()
cart_item, created = CartItem.objects.add_item(
self.request.session.session_key, product
)
if created:
messages.success(self.request, 'Produto adicionado com sucesso')
else:
messages.success(self.request, 'Produto atualizado com sucesso')
return reverse('checkout:cart_item')
class CartItemView(TemplateView):
template_name = 'checkout/cart.html'
def get_formset(self, clear=False):
CartItemFormSet = modelformset_factory(
CartItem, fields=('quantity',), can_delete=True, extra=0
)
session_key = self.request.session.session_key
if session_key:
if clear:
formset = CartItemFormSet(
queryset=CartItem.objects.filter(cart_key=session_key)
)
else:
formset = CartItemFormSet(
queryset=CartItem.objects.filter(cart_key=session_key),
data=self.request.POST or None
)
else:
formset = CartItemFormSet(queryset=CartItem.objects.none())
return formset
def get_context_data(self, **kwargs):
context = super(CartItemView, self).get_context_data(**kwargs)
context['formset'] = self.get_formset()
return context
def post(self, request, *args, **kwargs):
formset = self.get_formset()
context = self.get_context_data(**kwargs)
if formset.is_valid():
formset.save()
messages.success(request, 'Carrinho atualizado com sucesso')
context['formset'] = self.get_formset(clear=True)
return self.render_to_response(context)
class CheckoutView(LoginRequiredMixin, TemplateView):
template_name = 'checkout/checkout.html'
def get(self, request, *args, **kwargs):
session_key = request.session.session_key
if session_key and CartItem.objects.filter(cart_key=session_key).exists():
cart_itens = CartItem.objects.filter(cart_key=session_key)
order = Order.objects.create_order(
user=request.user, cart_itens=cart_itens
)
else:
messages.info(request, 'Não há itens no carrinho de compras')
return redirect('checkout:cart_item')
response = super(CheckoutView, self).get(request, *args, **kwargs)
response.context_data['order'] = order
return response
class OrderListView(LoginRequiredMixin, ListView):
template_name = 'checkout/order_list.html'
paginate_by = 10
def get_queryset(self):
return Order.objects.filter(user=self.request.user)
class OrderDetailView(LoginRequiredMixin, DetailView):
template_name = 'checkout/order_detail.html'
def get_queryset(self):
return Order.objects.filter(user=self.request.user)
class PagSeguroView(LoginRequiredMixin, RedirectView):
def get_redirect_url(self, *args, **kwargs):
order_pk = self.kwargs.get('pk')
order = get_object_or_404(
Order.objects.filter(user=self.request.user), pk=order_pk
)
pg = order.pagseguro()
pg.redirect_url = self.request.build_absolute_uri(
reverse('checkout:order_detail', args=[order.pk])
)
response = pg.checkout()
return response.payment_url
create_cartitem = CreateCartItemView.as_view()
cart_item = CartItemView.as_view()
checkout = CheckoutView.as_view()
order_list = OrderListView.as_view()
order_detail = OrderDetailView.as_view()
pagseguro_view = PagSeguroView.as_view()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment