Merge pull request #1283 from SchrodingersGat/filter-validation

Wrap custom filter validation in try/except blocks
This commit is contained in:
Oliver 2021-02-10 21:20:03 +11:00 committed by GitHub
commit 89adac49f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 62 additions and 23 deletions

View File

@ -5,6 +5,7 @@ import sys
from django.utils.translation import ugettext as _
from django.conf.urls import url, include
from django.core.exceptions import ValidationError, FieldError
from django_filters.rest_framework import DjangoFilterBackend
@ -119,13 +120,20 @@ class StockItemLabelList(LabelListView, StockItemLabelMixin):
matches = True
# Filter string defined for the StockItemLabel object
filters = InvenTree.helpers.validateFilterString(label.filters)
try:
filters = InvenTree.helpers.validateFilterString(label.filters)
except ValidationError:
continue
for item in items:
item_query = StockItem.objects.filter(pk=item.pk)
if not item_query.filter(**filters).exists():
try:
if not item_query.filter(**filters).exists():
matches = False
break
except FieldError:
matches = False
break
@ -273,13 +281,21 @@ class StockLocationLabelList(LabelListView, StockLocationLabelMixin):
matches = True
# Filter string defined for the StockLocationLabel object
filters = InvenTree.helpers.validateFilterString(label.filters)
try:
filters = InvenTree.helpers.validateFilterString(label.filters)
except:
# Skip if there was an error validating the filters...
continue
for loc in locations:
loc_query = StockLocation.objects.filter(pk=loc.pk)
if not loc_query.filter(**filters).exists():
try:
if not loc_query.filter(**filters).exists():
matches = False
break
except FieldError:
matches = False
break

View File

@ -12,6 +12,7 @@ from blabel import LabelWriter
from django.db import models
from django.core.validators import FileExtensionValidator
from django.core.exceptions import ValidationError, FieldError
from django.utils.translation import gettext_lazy as _
@ -145,9 +146,12 @@ class StockItemLabel(LabelTemplate):
Test if this label template matches a given StockItem object
"""
filters = validateFilterString(self.filters)
items = stock.models.StockItem.objects.filter(**filters)
try:
filters = validateFilterString(self.filters)
items = stock.models.StockItem.objects.filter(**filters)
except (ValidationError, FieldError):
# If an error exists with the "filters" field, return False
return False
items = items.filter(pk=item.pk)
@ -198,9 +202,11 @@ class StockLocationLabel(LabelTemplate):
Test if this label template matches a given StockLocation object
"""
filters = validateFilterString(self.filters)
locs = stock.models.StockLocation.objects.filter(**filters)
try:
filters = validateFilterString(self.filters)
locs = stock.models.StockLocation.objects.filter(**filters)
except (ValidationError, FieldError):
return False
locs = locs.filter(pk=location.pk)

View File

@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext as _
from django.conf.urls import url, include
from django.core.exceptions import FieldError
from django.http import HttpResponse
from django_filters.rest_framework import DjangoFilterBackend
@ -114,12 +115,19 @@ class StockItemTestReportList(ReportListView, StockItemReportMixin):
matches = True
# Filter string defined for the report object
filters = InvenTree.helpers.validateFilterString(report.filters)
try:
filters = InvenTree.helpers.validateFilterString(report.filters)
except:
continue
for item in items:
item_query = StockItem.objects.filter(pk=item.pk)
if not item_query.filter(**filters).exists():
try:
if not item_query.filter(**filters).exists():
matches = False
break
except FieldError:
matches = False
break

View File

@ -13,6 +13,7 @@ import datetime
from django.db import models
from django.conf import settings
from django.core.exceptions import ValidationError, FieldError
from django.template.loader import render_to_string
@ -262,9 +263,11 @@ class TestReport(ReportTemplateBase):
Test if this report template matches a given StockItem objects
"""
filters = validateFilterString(self.filters)
items = stock.models.StockItem.objects.filter(**filters)
try:
filters = validateFilterString(self.filters)
items = stock.models.StockItem.objects.filter(**filters)
except (ValidationError, FieldError):
return False
# Ensure the provided StockItem object matches the filters
items = items.filter(pk=item.pk)

View File

@ -9,7 +9,7 @@ from __future__ import unicode_literals
import os
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError
from django.core.exceptions import ValidationError, FieldError
from django.urls import reverse
from django.db import models, transaction
@ -1365,10 +1365,13 @@ class StockItem(MPTTModel):
for test_report in report.models.TestReport.objects.filter(enabled=True):
filters = helpers.validateFilterString(test_report.filters)
if item_query.filter(**filters).exists():
reports.append(test_report)
# Attempt to validate report filter (skip if invalid)
try:
filters = helpers.validateFilterString(test_report.filters)
if item_query.filter(**filters).exists():
reports.append(test_report)
except (ValidationError, FieldError):
continue
return reports
@ -1391,10 +1394,13 @@ class StockItem(MPTTModel):
for lbl in label.models.StockItemLabel.objects.filter(enabled=True):
filters = helpers.validateFilterString(lbl.filters)
try:
filters = helpers.validateFilterString(lbl.filters)
if item_query.filter(**filters).exists():
labels.append(lbl)
if item_query.filter(**filters).exists():
labels.append(lbl)
except (ValidationError, FieldError):
continue
return labels