mirror of
https://github.com/inventree/InvenTree.git
synced 2025-05-01 13:06:45 +00:00
Require certain headers to be present in the file
This commit is contained in:
parent
2831ac55c4
commit
65c7454124
@ -44,10 +44,20 @@ class BomImportForm(HelperForm):
|
|||||||
|
|
||||||
bom_file = forms.FileField(label='BOM file', required=True, help_text="Select BOM file to upload")
|
bom_file = forms.FileField(label='BOM file', required=True, help_text="Select BOM file to upload")
|
||||||
|
|
||||||
|
starting_row = forms.IntegerField(
|
||||||
|
required=True,
|
||||||
|
initial=2,
|
||||||
|
help_text='First row containing valid BOM data',
|
||||||
|
validators=[
|
||||||
|
MinValueValidator(1)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Part
|
model = Part
|
||||||
fields = [
|
fields = [
|
||||||
'bom_file',
|
'bom_file',
|
||||||
|
'starting_row',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -620,7 +620,7 @@ class BomValidate(AjaxUpdateView):
|
|||||||
return self.renderJsonResponse(request, form, data, context=self.get_context())
|
return self.renderJsonResponse(request, form, data, context=self.get_context())
|
||||||
|
|
||||||
|
|
||||||
class BomUpload(AjaxView):
|
class BomUpload(AjaxView, FormMixin):
|
||||||
""" View for uploading a BOM file, and handling BOM data importing.
|
""" View for uploading a BOM file, and handling BOM data importing.
|
||||||
|
|
||||||
The BOM upload process is as follows:
|
The BOM upload process is as follows:
|
||||||
@ -648,14 +648,15 @@ class BomUpload(AjaxView):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
ajax_form_title = 'Upload Bill of Materials'
|
ajax_form_title = 'Upload Bill of Materials'
|
||||||
|
ajax_template_name = 'part/bom_upload.html'
|
||||||
|
form_class = part_forms.BomImportForm
|
||||||
|
|
||||||
def get_form(self):
|
def get_context_data(self):
|
||||||
""" Return the correct form for the given step in the upload process """
|
ctx = {
|
||||||
|
'part': self.part
|
||||||
|
}
|
||||||
|
|
||||||
if 1 or self.request.method == 'GET':
|
return ctx
|
||||||
form = part_forms.BomImportForm()
|
|
||||||
|
|
||||||
return form
|
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
""" Perform the initial 'GET' request.
|
""" Perform the initial 'GET' request.
|
||||||
@ -665,16 +666,14 @@ class BomUpload(AjaxView):
|
|||||||
self.request = request
|
self.request = request
|
||||||
|
|
||||||
# A valid Part object must be supplied. This is the 'parent' part for the BOM
|
# A valid Part object must be supplied. This is the 'parent' part for the BOM
|
||||||
part = get_object_or_404(Part, pk=self.kwargs['pk'])
|
self.part = get_object_or_404(Part, pk=self.kwargs['pk'])
|
||||||
|
|
||||||
form = self.get_form()
|
self.form = self.get_form()
|
||||||
|
|
||||||
return self.renderJsonResponse(request, form)
|
return self.renderJsonResponse(request, self.form)
|
||||||
|
|
||||||
def handleBomFileUpload(self, bom_file):
|
def handleBomFileUpload(self, bom_file):
|
||||||
|
|
||||||
form = part_forms.BomImportForm()
|
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
# TODO - Validate the form if there isn't actually an error!
|
# TODO - Validate the form if there isn't actually an error!
|
||||||
'form_valid': False
|
'form_valid': False
|
||||||
@ -689,20 +688,28 @@ class BomUpload(AjaxView):
|
|||||||
elif ext in ['.xls', '.xlsx']:
|
elif ext in ['.xls', '.xlsx']:
|
||||||
raw_data = bom_file.read()
|
raw_data = bom_file.read()
|
||||||
else:
|
else:
|
||||||
form.errors['bom_file'] = ['Unsupported file format: ' + ext]
|
self.form.errors['bom_file'] = ['Unsupported file format: ' + ext]
|
||||||
return self.renderJsonResponse(self.request, form, data)
|
return self.renderJsonResponse(self.request, self.form, data)
|
||||||
|
|
||||||
# Now try to read the data
|
# Now try to read the data
|
||||||
try:
|
try:
|
||||||
bom_data = tablib.Dataset().load(raw_data)
|
bom_data = tablib.Dataset().load(raw_data)
|
||||||
print(bom_data)
|
|
||||||
|
headers = [h.lower() for h in bom_data.headers]
|
||||||
|
|
||||||
|
# Minimal set of required fields
|
||||||
|
for header in ['part', 'quantity', 'reference']:
|
||||||
|
if not header in headers:
|
||||||
|
self.form.errors['bom_file'] = [_("Missing required field '{f}'".format(f=header))]
|
||||||
|
break
|
||||||
|
|
||||||
except tablib.UnsupportedFormat:
|
except tablib.UnsupportedFormat:
|
||||||
valid = False
|
valid = False
|
||||||
form.errors['bom_file'] = [
|
self.form.errors['bom_file'] = [
|
||||||
"Error reading '{f}' (Unsupported file format)".format(f=str(bom_file)),
|
"Error reading '{f}' (Unsupported file format)".format(f=str(bom_file)),
|
||||||
]
|
]
|
||||||
|
|
||||||
return self.renderJsonResponse(self.request, form, data=data)
|
return self.renderJsonResponse(self.request, self.form, data=data)
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
""" Perform the various 'POST' requests required.
|
""" Perform the various 'POST' requests required.
|
||||||
@ -710,11 +717,12 @@ class BomUpload(AjaxView):
|
|||||||
|
|
||||||
self.request = request
|
self.request = request
|
||||||
|
|
||||||
|
self.part = get_object_or_404(Part, pk=self.kwargs['pk'])
|
||||||
|
self.form = self.get_form()
|
||||||
|
|
||||||
# Did the user POST a file named bom_file?
|
# Did the user POST a file named bom_file?
|
||||||
bom_file = request.FILES.get('bom_file', None)
|
bom_file = request.FILES.get('bom_file', None)
|
||||||
|
|
||||||
form = self.get_form()
|
|
||||||
|
|
||||||
if bom_file:
|
if bom_file:
|
||||||
return self.handleBomFileUpload(bom_file)
|
return self.handleBomFileUpload(bom_file)
|
||||||
|
|
||||||
@ -722,7 +730,9 @@ class BomUpload(AjaxView):
|
|||||||
'form_valid': False,
|
'form_valid': False,
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.renderJsonResponse(request, form, data=data)
|
return self.renderJsonResponse(request, self.form, data=data)
|
||||||
|
|
||||||
|
|
||||||
class BomUploadTemplate(AjaxView):
|
class BomUploadTemplate(AjaxView):
|
||||||
"""
|
"""
|
||||||
Provide a BOM upload template file for download.
|
Provide a BOM upload template file for download.
|
||||||
@ -742,8 +752,6 @@ class BomDownload(AjaxView):
|
|||||||
- File format should be passed as a query param e.g. ?format=csv
|
- File format should be passed as a query param e.g. ?format=csv
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# TODO - This should no longer extend an AjaxView!
|
|
||||||
|
|
||||||
model = Part
|
model = Part
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user