diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index 33f4b5780a..5ef640349f 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -90,12 +90,16 @@ class AjaxMixin(object): class AjaxView(AjaxMixin, View): """ Bare-bones AjaxView """ + # By default, point to the modal_form template + # (this can be overridden by a child class) + ajax_template_name = 'modal_form.html' + def post(self, request, *args, **kwargs): return JsonResponse('', safe=False) def get(self, request, *args, **kwargs): - return self.renderJsonResponse(request, **kwargs) + return self.renderJsonResponse(request) class AjaxCreateView(AjaxMixin, CreateView): @@ -151,13 +155,16 @@ class AjaxUpdateView(AjaxMixin, UpdateView): """ def get(self, request, *args, **kwargs): + + html_response = super(UpdateView, self).get(request, *args, **kwargs) + if request.is_ajax(): form = self.form_class(instance=self.get_object()) return self.renderJsonResponse(request, form) else: - return super(UpdateView, self).post(request, *args, **kwargs) + return html_response def post(self, request, *args, **kwargs): @@ -177,7 +184,7 @@ class AjaxUpdateView(AjaxMixin, UpdateView): return response else: - return response + return super(UpdateView, self).post(request, *args, **kwargs) diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index 3bb19f27a5..5ebff2dc83 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -19,8 +19,9 @@ part_detail_urls = [ url(r'^edit/?', views.PartEdit.as_view(), name='part-edit'), url(r'^delete/?', views.PartDelete.as_view(), name='part-delete'), url(r'^track/?', views.PartDetail.as_view(template_name='part/track.html'), name='part-track'), + url(r'^bom-export/?', views.BomExport.as_view(), name='bom-export'), + url(r'^bom-download/?', views.BomDownload.as_view(), name='bom-download'), url(r'^bom/?', views.PartDetail.as_view(template_name='part/bom.html'), name='part-bom'), - url(r'^export-bom/?', views.BomExport.as_view(), name='bom-export'), url(r'^build/?', views.PartDetail.as_view(template_name='part/build.html'), name='part-build'), url(r'^stock/?', views.PartDetail.as_view(template_name='part/stock.html'), name='part-stock'), url(r'^used/?', views.PartDetail.as_view(template_name='part/used_in.html'), name='part-used-in'), diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 7147e4282b..f611b908bb 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -3,8 +3,8 @@ from __future__ import unicode_literals from django.shortcuts import get_object_or_404 -from django.urls import reverse_lazy - +from django.template.loader import render_to_string +from django.urls import reverse_lazy, reverse from django.views.generic import DetailView, ListView from company.models import Company @@ -19,7 +19,7 @@ from .forms import BomExportForm from .forms import EditSupplierPartForm -from InvenTree.views import AjaxView, AjaxCreateView, AjaxUpdateView, AjaxDeleteView +from InvenTree.views import AjaxMixin, AjaxView, AjaxCreateView, AjaxUpdateView, AjaxDeleteView from InvenTree.helpers import DownloadFile @@ -117,20 +117,70 @@ class PartImage(AjaxUpdateView): class PartEdit(AjaxUpdateView): model = Part - form_class = EditPartForm template_name = 'part/edit.html' + form_class = EditPartForm ajax_template_name = 'modal_form.html' ajax_form_title = 'Edit Part Properties' + context_object_name = 'part' class BomExport(AjaxView): + + model = Part + ajax_form_title = 'Export BOM' + template_name = 'part/bom_export.html' + #template_name = 'modal_form.html' + context_object_name = 'part' + form_class = BomExportForm + + def get(self, request, *args, **kwargs): + form = self.form_class() + + part = get_object_or_404(Part, pk=self.kwargs['pk']) + + context = { + 'part': part + } + + return self.renderJsonResponse(request, form, context=context) + + def post(self, request, *args, **kwargs): + + return super(AjaxView, self).post(request, *args, **kwargs) + + """ + def get(self, request, *args, **kwargs): + + data = { + 'title': 'Export BOM', + 'html_data': render_to_string(self.getAjaxTemplate(), + self.get_context_data(), + request=request) + } + + return JsonResponse(data) + """ + + def get_data(self): + return { + #'form_valid': True, + #'redirect': '/' + #'redirect': reverse('bom-download', kwargs={'pk': self.request.GET.get('pk')}) + } + + +class BomDownload(AjaxView): + """ + Provide raw download of a BOM file. + - File format should be passed as a query param e.g. ?format=csv + """ + # TODO - This should no longer extend an AjaxView! model = Part #form_class = BomExportForm #template_name = 'part/bom_export.html' #ajax_form_title = 'Export Bill of Materials' - #ajax_submit_text = 'Export' #context_object_name = 'part' def get(self, request, *args, **kwargs): @@ -157,6 +207,7 @@ class PartDelete(AjaxDeleteView): template_name = 'part/delete.html' ajax_template_name = 'part/partial_delete.html' ajax_form_title = 'Confirm Part Deletion' + context_object_name = 'part' success_url = '/part/' @@ -241,7 +292,6 @@ class BomItemCreate(AjaxCreateView): template_name = 'part/bom-create.html' ajax_template_name = 'modal_form.html' ajax_form_title = 'Create BOM item' - ajax_submit_text = 'Create' def get_initial(self): # Look for initial values diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index ca432f8540..d4c0de3994 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -82,7 +82,7 @@ class StockItemEdit(AjaxUpdateView): form_class = EditStockItemForm template_name = 'stock/item_edit.html' context_object_name = 'item' - ajax_template_name = 'modal_form.html' + #ajax_template_name = 'modal_form.html' ajax_form_title = 'Edit Stock Item'