diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py index c7942e3549..4844ef4344 100644 --- a/InvenTree/order/forms.py +++ b/InvenTree/order/forms.py @@ -6,6 +6,7 @@ Django Forms for interacting with Order objects from __future__ import unicode_literals from django import forms +from django.utils.translation import ugettext as _ from InvenTree.forms import HelperForm @@ -14,7 +15,7 @@ from .models import PurchaseOrder, PurchaseOrderLineItem class IssuePurchaseOrderForm(HelperForm): - confirm = forms.BooleanField(required=False, help_text='Place order') + confirm = forms.BooleanField(required=False, help_text=_('Place order')) class Meta: model = PurchaseOrder @@ -23,6 +24,17 @@ class IssuePurchaseOrderForm(HelperForm): ] +class CancelPurchaseOrderForm(HelperForm): + + confirm = forms.BooleanField(required=False, help_text=_('Cancel order')) + + class Meta: + model = PurchaseOrder + fields = [ + 'confirm', + ] + + class EditPurchaseOrderForm(HelperForm): """ Form for editing a PurchaseOrder object """ diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 9eff4d11c3..de0ac86bad 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -98,6 +98,13 @@ class Order(models.Model): self.complete_date = datetime.now().date() self.save() + def cancel_order(self): + """ Marks the order as CANCELLED. """ + + if self.status in [OrderStatus.PLACED, OrderStatus.PENDING]: + self.status = OrderStatus.CANCELLED + self.save() + class PurchaseOrder(Order): """ A PurchaseOrder represents goods shipped inwards from an external supplier. diff --git a/InvenTree/order/templates/order/order_cancel.html b/InvenTree/order/templates/order/order_cancel.html new file mode 100644 index 0000000000..3c71028b06 --- /dev/null +++ b/InvenTree/order/templates/order/order_cancel.html @@ -0,0 +1,7 @@ +{% extends "modal_form.html" %} + +{% block pre_form_content %} + +Cancelling this order means that the order will no longer be editable. + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/order/templates/order/purchase_order_detail.html b/InvenTree/order/templates/order/purchase_order_detail.html index 2ddbdc3052..29336b18db 100644 --- a/InvenTree/order/templates/order/purchase_order_detail.html +++ b/InvenTree/order/templates/order/purchase_order_detail.html @@ -43,6 +43,11 @@ InvenTree | {{ order }} {% endif %} + {% if order.status == OrderStatus.PENDING or order.status == OrderStatus.PLACED %} + + {% endif %}

@@ -176,6 +181,12 @@ $("#edit-order").click(function() { ); }); +$("#cancel-order").click(function() { + launchModalForm("{% url 'purchase-order-cancel' order.id %}", { + reload: true, + }); +}); + $("#receive-order").click(function() { launchModalForm("{% url 'purchase-order-receive' order.id %}", { reload: true, diff --git a/InvenTree/order/urls.py b/InvenTree/order/urls.py index 38687342c2..994e6b054d 100644 --- a/InvenTree/order/urls.py +++ b/InvenTree/order/urls.py @@ -11,6 +11,7 @@ from . import views purchase_order_detail_urls = [ + url(r'^cancel/?', views.PurchaseOrderCancel.as_view(), name='purchase-order-cancel'), url(r'^edit/?', views.PurchaseOrderEdit.as_view(), name='purchase-order-edit'), url(r'^issue/?', views.PurchaseOrderIssue.as_view(), name='purchase-order-issue'), url(r'^receive/?', views.PurchaseOrderReceive.as_view(), name='purchase-order-receive'), diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 86a231075e..49d2ed01ed 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -112,6 +112,39 @@ class PurchaseOrderEdit(AjaxUpdateView): return form +class PurchaseOrderCancel(AjaxUpdateView): + """ View for cancelling a purchase order """ + + model = PurchaseOrder + ajax_form_title = 'Cancel Order' + ajax_template_name = 'order/order_cancel.html' + form_class = order_forms.CancelPurchaseOrderForm + + def post(self, request, *args, **kwargs): + """ Mark the PO as 'CANCELLED' """ + + order = self.get_object() + form = self.get_form() + + confirm = str2bool(request.POST.get('confirm', False)) + + valid = False + + if not confirm: + form.errors['confirm'] = [_('Confirm order cancellation')] + else: + valid = True + + data = { + 'form_valid': valid + } + + if valid: + order.cancel_order() + + return self.renderJsonResponse(request, form, data) + + class PurchaseOrderIssue(AjaxUpdateView): """ View for changing a purchase order from 'PENDING' to 'ISSUED' """