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 %}
-
-
-
+
@@ -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 @@
-
\ No newline at end of file