Fix #26
This commit is contained in:
parent
7eae1b79ec
commit
267a9e4986
|
@ -45,6 +45,7 @@ class OrderAdmin(admin.ModelAdmin):
|
||||||
'camp',
|
'camp',
|
||||||
'payment_method',
|
'payment_method',
|
||||||
'paid',
|
'paid',
|
||||||
|
'cancelled',
|
||||||
]
|
]
|
||||||
|
|
||||||
list_filter = [
|
list_filter = [
|
||||||
|
|
|
@ -11,3 +11,21 @@ class ProductQuerySet(QuerySet):
|
||||||
return self.filter(
|
return self.filter(
|
||||||
available_in__contains=DateTimeTZRange(now, None)
|
available_in__contains=DateTimeTZRange(now, None)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class OrderQuerySet(QuerySet):
|
||||||
|
|
||||||
|
def not_cancelled(self):
|
||||||
|
return self.filter(cancelled=False)
|
||||||
|
|
||||||
|
def open(self):
|
||||||
|
return self.filter(open__isnull=True)
|
||||||
|
|
||||||
|
def paid(self):
|
||||||
|
return self.filter(paid=True)
|
||||||
|
|
||||||
|
def unpaid(self):
|
||||||
|
return self.filter(paid=False)
|
||||||
|
|
||||||
|
def cancelled(self):
|
||||||
|
return self.filter(cancelled=True)
|
||||||
|
|
20
shop/migrations/0023_order_cancelled.py
Normal file
20
shop/migrations/0023_order_cancelled.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.6 on 2016-06-01 08:53
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('shop', '0022_auto_20160530_2301'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='order',
|
||||||
|
name='cancelled',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
|
@ -8,7 +8,7 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.core.urlresolvers import reverse_lazy
|
from django.core.urlresolvers import reverse_lazy
|
||||||
from utils.models import UUIDModel, CreatedUpdatedModel
|
from utils.models import UUIDModel, CreatedUpdatedModel
|
||||||
from .managers import ProductQuerySet
|
from .managers import ProductQuerySet, OrderQuerySet
|
||||||
import hashlib, io, base64, qrcode
|
import hashlib, io, base64, qrcode
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
@ -72,6 +72,10 @@ class Order(CreatedUpdatedModel):
|
||||||
default=BLOCKCHAIN
|
default=BLOCKCHAIN
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cancelled = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
objects = OrderQuerySet.as_manager()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return 'order id #%s' % self.pk
|
return 'order id #%s' % self.pk
|
||||||
|
|
||||||
|
@ -160,6 +164,11 @@ class Order(CreatedUpdatedModel):
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def mark_as_cancelled(self):
|
||||||
|
self.cancelled = True
|
||||||
|
self.open = None
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
|
||||||
class ProductCategory(CreatedUpdatedModel, UUIDModel):
|
class ProductCategory(CreatedUpdatedModel, UUIDModel):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<h1>Order #{{ order.id }}</h1>
|
<h1>Order #{{ order.id }}</h1>
|
||||||
|
|
||||||
{% if not order.open == None %}
|
{% if not order.paid %}
|
||||||
<form method="POST" class="form-inline">
|
<form method="POST" class="form-inline">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -67,7 +67,10 @@
|
||||||
|
|
||||||
{% if not order.open == None %}
|
{% if not order.open == None %}
|
||||||
{% bootstrap_button "Update order" button_type="submit" button_class="btn-primary" name="update_order" %}
|
{% bootstrap_button "Update order" button_type="submit" button_class="btn-primary" name="update_order" %}
|
||||||
{% bootstrap_button "Cancel order" button_type="submit" button_class="btn-danger pull-right" name="cancel_order" %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if not order.paid %}
|
||||||
|
{% bootstrap_button "Cancel order" button_type="submit" button_class="btn-danger" name="cancel_order" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
|
@ -106,6 +106,22 @@ class EnsureOrderHasProductsMixin(SingleObjectMixin):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class EnsureOrderIsNotCancelledMixin(SingleObjectMixin):
|
||||||
|
model = Order
|
||||||
|
|
||||||
|
def dispatch(self, request, *args, **kwargs):
|
||||||
|
if self.get_object().cancelled:
|
||||||
|
messages.error(
|
||||||
|
request,
|
||||||
|
'Order #{} is cancelled!'.format(self.get_object().id)
|
||||||
|
)
|
||||||
|
return HttpResponseRedirect(reverse_lazy('shop:index'))
|
||||||
|
|
||||||
|
return super(EnsureOrderHasProductsMixin, self).dispatch(
|
||||||
|
request, *args, **kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class EnsureOrderHasInvoicePDFMixin(SingleObjectMixin):
|
class EnsureOrderHasInvoicePDFMixin(SingleObjectMixin):
|
||||||
model = Order
|
model = Order
|
||||||
|
|
||||||
|
@ -217,14 +233,20 @@ class ProductDetailView(FormView, DetailView):
|
||||||
class OrderListView(LoginRequiredMixin, ListView):
|
class OrderListView(LoginRequiredMixin, ListView):
|
||||||
model = Order
|
model = Order
|
||||||
template_name = "order_list.html"
|
template_name = "order_list.html"
|
||||||
|
context_object_name = 'orders'
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_queryset(self):
|
||||||
context = super(OrderListView, self).get_context_data(**kwargs)
|
queryset = super(OrderListView, self).get_queryset()
|
||||||
context['orders'] = Order.objects.filter(user=self.request.user)
|
return queryset.filter(user=self.request.user).not_cancelled()
|
||||||
return context
|
|
||||||
|
|
||||||
|
|
||||||
class OrderDetailView(LoginRequiredMixin, EnsureUserOwnsOrderMixin, EnsureOrderHasProductsMixin, DetailView):
|
class OrderDetailView(
|
||||||
|
LoginRequiredMixin,
|
||||||
|
EnsureUserOwnsOrderMixin,
|
||||||
|
EnsureOrderHasProductsMixin,
|
||||||
|
EnsureOrderIsNotCancelledMixin,
|
||||||
|
DetailView
|
||||||
|
):
|
||||||
model = Order
|
model = Order
|
||||||
template_name = 'order_detail.html'
|
template_name = 'order_detail.html'
|
||||||
context_object_name = 'order'
|
context_object_name = 'order'
|
||||||
|
@ -269,12 +291,12 @@ class OrderDetailView(LoginRequiredMixin, EnsureUserOwnsOrderMixin, EnsureOrderH
|
||||||
if product_remove:
|
if product_remove:
|
||||||
order.orderproductrelation_set.filter(pk=product_remove).delete()
|
order.orderproductrelation_set.filter(pk=product_remove).delete()
|
||||||
if not order.products.count() > 0:
|
if not order.products.count() > 0:
|
||||||
order.delete()
|
order.mark_as_cancelled()
|
||||||
messages.info(request, 'Order cancelled!')
|
messages.info(request, 'Order cancelled!')
|
||||||
return HttpResponseRedirect(reverse_lazy('shop:index'))
|
return HttpResponseRedirect(reverse_lazy('shop:index'))
|
||||||
|
|
||||||
if 'cancel_order' in request.POST:
|
if 'cancel_order' in request.POST:
|
||||||
order.delete()
|
order.mark_as_cancelled()
|
||||||
messages.info(request, 'Order cancelled!')
|
messages.info(request, 'Order cancelled!')
|
||||||
return HttpResponseRedirect(reverse_lazy('shop:index'))
|
return HttpResponseRedirect(reverse_lazy('shop:index'))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue