more work on shop

This commit is contained in:
Thomas Steen Rasmussen 2016-05-12 19:08:54 +02:00
parent 5b279ff493
commit 82ae2b8c23
10 changed files with 117 additions and 126 deletions

View file

@ -2,8 +2,8 @@ from django import forms
from .models import Order
class PaymentMethodForm(forms.ModelForm):
class CheckoutForm(forms.ModelForm):
class Meta:
model = Order
fields = ['payment_method']
fields = None

View file

@ -47,7 +47,7 @@ class Order(CreatedUpdatedModel):
payment_method = models.CharField(
max_length=50,
choices=PAYMENT_METHODS,
default=CREDIT_CARD
default=BLOCKCHAIN
)

View file

@ -0,0 +1,14 @@
{% extends 'base.html' %}
{% load bootstrap3 %}
{% block content %}
<form method="POST">
{% csrf_token %}
{% bootstrap_button "Pay with credit card" name="credit_card" button_type="submit" button_class="btn-primary" %}
{% bootstrap_button "Pay with blockchain" name="blockchain" button_type="submit" button_class="btn-primary" %}
{% bootstrap_button "Pay with bank transfer" name="bank_transfer" button_type="submit" button_class="btn-primary" %}
</form>
{% endblock %}

View file

@ -2,6 +2,6 @@
{% block content %}
{{ ticket }}
<b>details for order {{ order.id }}</b>
{% endblock %}

View file

@ -0,0 +1,7 @@
{% extends 'base.html' %}
{% block content %}
<b>details for product {{ product.id }}</b>
{% endblock %}

View file

@ -1,13 +0,0 @@
{% extends 'base.html' %}
{% load bootstrap3 %}
{% block content %}
<form method="POST">
{% csrf_token %}
{% bootstrap_form form %}
{% bootstrap_button "Buy" button_type="submit" button_class="btn-primary" %}
</form>
{% endblock %}

View file

@ -1,76 +0,0 @@
{% extends 'base.html' %}
{% block content %}
<h2>Tickets</h2>
<p class="lead">
Here you can see the different ticket types, their prices and availability.
</p>
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>
Description
<th>
Price
<th>
Availability
<th>
Buy
<tbody>
{% for product in tickets %}
<tr {% if not product.is_available %}style="color: lightgrey"{%endif%}>
<td>
{{ product.name }}
<td>
{{ product.price }} DKK
<td>
{{ product.available_in.lower }}
{% if product.available_in.upper %}
- {{ product.available_in.upper }}
{% endif %}
<td>
{% if product.is_available %}
<a href="">
Order
</a>
{% else %}
N/A
{% endif %}
{% endfor %}
</table>
{% comment %}
{% if user.is_authenticated %}
<hr />
<h3>Your tickets</h3>
<table class="table table-hover">
{% for ticket in user.tickets.all %}
<tr>
<td>
{{ ticket.ticket_type.name }}
<td>
{% if ticket.paid %} Paid {% else %} Not paid {% endif %}
{% empty %}
<tr>
<td colspan=3>
You don't have a ticket! Why don't buy one and join the fun?
{% endfor %}
</table>
<a href="{% url 'tickets:order' %}" class="btn btn-success">Order tickets</a>
{% else %}
<a href="{% url 'account_signup' %}?next={% url 'tickets:index' %}">Sign up</a> or
<a href="{% url 'account_login' %}?next={% url 'tickets:index' %}">login</a> to buy tickets.
{% endif %}
{% endcomment %}
{% endblock %}

View file

@ -0,0 +1,45 @@
{% extends 'base.html' %}
{% block content %}
<h2>Shop</h2>
<p class="lead">
Here you can see the different products and prices.
</p>
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>Description</th>
<th>Price</th>
<th>Availability</th>
<th>Buy</th>
</tr>
</thead>
<tbody>
{% for product in product_list %}
<tr {% if not product.is_available %}style="color: lightgrey"{%endif%}>
<td>{{ product.name }}</td>
<td>{{ product.price }} DKK</td>
<td>{{ product.available_in.lower }}
{% if product.available_in.upper %}
- {{ product.available_in.upper }}
{% endif %}
</td>
<td>
{% if product.is_available %}
<a href="">
Add to order
</a>
{% else %}
N/A
{% endif %}
</td>
</tr>
</tbody>
{% endfor %}
</table>
{% endblock %}

View file

@ -1,52 +1,42 @@
import hashlib
from django.http import HttpResponseRedirect, Http404
from django.views.generic import CreateView, TemplateView, DetailView, View, FormView
from django.views.generic import CreateView, TemplateView, ListView, DetailView, View, FormView
from django.core.urlresolvers import reverse_lazy
from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponse
from django.contrib import messages
from .models import Order, Product, EpayCallback, EpayPayment
from .forms import PaymentMethodForm
from .forms import CheckoutForm
class ShopIndexView(TemplateView):
template_name = "shop/index.html"
def get_context_data(self, **kwargs):
context = super(ShopIndexView, self).get_context_data(**kwargs)
context['tickets'] = Product.objects.filter(category__name='Tickets')
return context
class ShopIndexView(ListView):
model = Product
template_name = "shop_index.html"
class ProductDetailView(LoginRequiredMixin, DetailView):
model = Product
template_name = 'product/detail.html'
template_name = 'product_detail.html'
context_object_name = 'product'
class CheckoutView(LoginRequiredMixin, DetailView):
"""
Shows a summary of all products contained in an order,
total price, VAT, and a button to go to the payment
"""
model = Order
template_name = 'shop/order_detail.html'
class OrderDetailView(LoginRequiredMixin, DetailView):
model = Product
template_name = 'order_detail.html'
context_object_name = 'order'
def get(self, request, *args, **kwargs):
if self.get_object().user != request.user:
raise Http404("Order not found")
return self.render_to_response(self.get_context_data())
class PaymentView(LoginRequiredMixin, FormView):
class CheckoutView(LoginRequiredMixin, FormView):
"""
Select payment method and goto payment
Shows a summary of all products contained in an order,
total price, VAT info, and a button to finalize order and go to payment
"""
template_name = 'shop/payment.html'
form_class = PaymentMethodForm
model = Order
template_name = 'checkout.html'
context_object_name = 'order'
def get(self, request, *args, **kwargs):
if self.get_object().user != request.user:
@ -62,15 +52,39 @@ class PaymentView(LoginRequiredMixin, FormView):
return self.render_to_response(self.get_context_data())
def get_context_data(self, **kwargs):
order = Order.objects.get(pk=kwargs.get('order_id'))
context = super(CheckoutView, self).get_context_data(**kwargs)
context['order'] = order
return context
def form_valid(self, form):
### mark order as finalizedredirect user to payment
form.instance.finalized=True
### set payment_method based on submit button used
if 'credit_card' in form.data:
form.instance.payment_method=='credit_card'
elif 'blockchain' in form.data:
form.instance.payment_method=='blockchain'
elif 'bank_transfer' in form.data:
form.instance.payment_method=='bank_transfer'
else:
### unknown submit button
messages.error(request, 'Unknown submit button :(')
return reverse('shop:checkout', kwargs={'orderid': self.get_object.id})
return super(CheckoutView, self).form_valid(form)
def get_success_url(self):
if self.get_object.payment_method == 'credit_card':
return reverse('shop:epay_form', kwargs={'orderid': self.get_object.id})
elif self.get_object.payment_method == 'blockchain':
return reverse('shop:coinify_pay', kwargs={'orderid': self.get_object.id})
elif self.get_object.payment_method == 'bank_transfer':
return reverse('shop:bank_transfer', kwargs={'orderid': self.get_object.id})
else:
### unknown payment method
messages.error(request, 'Unknown payment method :(')
return reverse('shop:checkout', kwargs={'orderid': self.get_object.id})
class CoinifyView(TemplateView):
template_name = 'shop/coinify_form.html'
class CoinifyRedirectView(TemplateView):
template_name = 'coinify_redirect.html'
def get_context_data(self, **kwargs):
order = Order.objects.get(pk=kwargs.get('order_id'))