diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py new file mode 100644 index 0000000000..5293c8b0ad --- /dev/null +++ b/InvenTree/InvenTree/views.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.template.loader import render_to_string +from django.http import JsonResponse + +from django.views.generic import UpdateView, CreateView, DeleteView + + +class AjaxView(object): + + ajax_form_action = '' + ajax_form_title = '' + ajax_submit_text = 'Submit' + + def getAjaxTemplate(self): + if hasattr(self, 'ajax_template_name'): + return self.ajax_template_name + else: + return self.template_name + + + def renderJsonResponse(self, request, form): + + context = {'form': form, + 'form_action': self.ajax_form_action, + 'form_title': self.ajax_form_title, + 'submit_text': self.ajax_submit_text, + } + + data = {'form_valid': form.is_valid()} + + data['html_form'] = render_to_string( + self.getAjaxTemplate(), + context, + request=request + ) + + return JsonResponse(data) + + +class AjaxCreateView(AjaxView, CreateView): + + def post(self, request): + + if request.is_ajax(): + form = self.form_class(request.POST) + + if form.is_valid(): + form.save() + + return self.renderJsonResponse(request, form) + + else: + return super(CreateView, self).post(request) + + def get(self, request): + + if request.is_ajax(): + form = self.form_class() + + return self.renderJsonResponse(request, form) + + else: + return super(CreateView, self).post(request) diff --git a/InvenTree/part/templates/part/index.html b/InvenTree/part/templates/part/index.html index d0bda70df7..df51ce51f2 100644 --- a/InvenTree/part/templates/part/index.html +++ b/InvenTree/part/templates/part/index.html @@ -12,11 +12,6 @@ - - {% if children.all|length > 0 %}

Part Categories

{% include "part/category_subcategories.html" with children=children %} @@ -26,9 +21,9 @@ {% include "part/category_parts.html" with parts=parts %}
- - - + @@ -49,7 +44,17 @@ $(document).ready(function () { $("#modal-cat").modal("show"); }, success: function (data) { - $("#modal-cat .modal-content").html(data.html_form); + if (data.html_form) { + $("#modal-cat .modal-content").html(data.html_form); + } + else { + alert('JSON response missing form data'); + $("#modal-cat").modal("hide"); + } + }, + error: function (xhr, ajaxOptions, thrownError) { + alert("Error requesting form data:\n" + thrownError); + $("#modal-cat").modal("hide"); } }); }); @@ -63,12 +68,15 @@ $(document).ready(function () { type: form.attr('method'), dataType: 'json', success: function (data) { - if (data.form_valid) { - alert("Success!"); - } - else { + if (data.html_form) { $("#modal-cat .modal-content").html(data.html_form); } + else { + alert('No form data!'); + } + }, + error: function (xhr, ajaxOptions, thrownError) { + alert("Error submitting form data:\n" + thrownError); } }); diff --git a/InvenTree/part/templates/part/partial_category_new.html b/InvenTree/part/templates/part/partial_category_new.html deleted file mode 100644 index acec8357bd..0000000000 --- a/InvenTree/part/templates/part/partial_category_new.html +++ /dev/null @@ -1 +0,0 @@ -{% include 'modal_form.html' with title='Create new Part Catagory' %} \ No newline at end of file diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index 51ee0736a4..31129ad529 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -48,7 +48,7 @@ part_bom_urls = [ part_urls = [ # Create a new category - url(r'^category/new/?', views.CategoryCreateJson.as_view(), name='category-create'), + url(r'^category/new/?', views.CategoryCreate.as_view(), name='category-create'), # Create a new part url(r'^new/?', views.PartCreate.as_view(), name='part-create'), diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index fa571d343c..b7ed0c11ef 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.template.loader import render_to_string - from django.shortcuts import get_object_or_404 from django.http import HttpResponseRedirect -from django.http import JsonResponse + +from django.urls import reverse_lazy from django.views.generic import DetailView, ListView from django.views.generic.edit import UpdateView, DeleteView, CreateView @@ -20,6 +19,7 @@ from .forms import EditBomItemForm from .forms import EditSupplierPartForm +from InvenTree.views import AjaxCreateView class PartIndex(ListView): model = Part @@ -133,45 +133,12 @@ class CategoryDelete(DeleteView): return HttpResponseRedirect(self.get_object().get_absolute_url()) -class CategoryCreateJson(CreateView): +class CategoryCreate(AjaxCreateView): model = PartCategory - template_name = 'part/partial_category_new.html' - form_class = EditCategoryForm - - def renderJsonResponse(self, request, form, data): - - context = {'form': form} - - data['html_form'] = render_to_string(self.template_name, - context, - request=request) - - return JsonResponse(data) - - def post(self, request): - form = self.form_class(request.POST) - - data = {} - - if form.is_valid(): - form.save() - data['form_valid'] = True - else: - data['form_valid'] = False - - return self.renderJsonResponse(request, form, data) - - def get(self, request, *args, **kwargs): - form = self.form_class() - - data = {} - - return self.renderJsonResponse(request, form, data) - - -class CategoryCreate(CreateView): - model = PartCategory - template_name = 'part/partial_category_new.html' + ajax_form_action = reverse_lazy('category-create') + ajax_form_title = 'Create new part category' + ajax_template_name = 'modal_form.html' + template_name = 'part/category_new.html' form_class = EditCategoryForm def get_context_data(self, **kwargs): diff --git a/InvenTree/templates/modal_form.html b/InvenTree/templates/modal_form.html index d5d4a8bad5..5140c08a86 100644 --- a/InvenTree/templates/modal_form.html +++ b/InvenTree/templates/modal_form.html @@ -1,10 +1,10 @@ -
+ {% csrf_token %}
\ No newline at end of file