mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-31 13:15:43 +00:00 
			
		
		
		
	Merge pull request #1283 from SchrodingersGat/filter-validation
Wrap custom filter validation in try/except blocks
This commit is contained in:
		| @@ -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,15 +120,22 @@ class StockItemLabelList(LabelListView, StockItemLabelMixin): | ||||
|                 matches = True | ||||
|  | ||||
|                 # Filter string defined for the StockItemLabel object | ||||
|                 try: | ||||
|                     filters = InvenTree.helpers.validateFilterString(label.filters) | ||||
|                 except ValidationError: | ||||
|                     continue | ||||
|  | ||||
|                 for item in items: | ||||
|  | ||||
|                     item_query = StockItem.objects.filter(pk=item.pk) | ||||
|  | ||||
|                     try: | ||||
|                         if not item_query.filter(**filters).exists(): | ||||
|                             matches = False | ||||
|                             break | ||||
|                     except FieldError: | ||||
|                         matches = False | ||||
|                         break | ||||
|  | ||||
|                 # Matched all items | ||||
|                 if matches: | ||||
| @@ -273,15 +281,23 @@ class StockLocationLabelList(LabelListView, StockLocationLabelMixin): | ||||
|                 matches = True | ||||
|  | ||||
|                 # Filter string defined for the StockLocationLabel object | ||||
|                 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) | ||||
|  | ||||
|                     try: | ||||
|                         if not loc_query.filter(**filters).exists(): | ||||
|                             matches = False | ||||
|                             break | ||||
|                     except FieldError: | ||||
|                         matches = False | ||||
|                         break | ||||
|  | ||||
|                 # Matched all items | ||||
|                 if matches: | ||||
|   | ||||
| @@ -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 | ||||
|         """ | ||||
|  | ||||
|         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 | ||||
|         """ | ||||
|  | ||||
|         try: | ||||
|             filters = validateFilterString(self.filters) | ||||
|  | ||||
|             locs = stock.models.StockLocation.objects.filter(**filters) | ||||
|         except (ValidationError, FieldError): | ||||
|             return False | ||||
|  | ||||
|         locs = locs.filter(pk=location.pk) | ||||
|  | ||||
|   | ||||
| @@ -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,14 +115,21 @@ class StockItemTestReportList(ReportListView, StockItemReportMixin): | ||||
|                 matches = True | ||||
|  | ||||
|                 # Filter string defined for the report object | ||||
|                 try: | ||||
|                     filters = InvenTree.helpers.validateFilterString(report.filters) | ||||
|                 except: | ||||
|                     continue | ||||
|  | ||||
|                 for item in items: | ||||
|                     item_query = StockItem.objects.filter(pk=item.pk) | ||||
|  | ||||
|                     try: | ||||
|                         if not item_query.filter(**filters).exists(): | ||||
|                             matches = False | ||||
|                             break | ||||
|                     except FieldError: | ||||
|                         matches = False | ||||
|                         break | ||||
|  | ||||
|                 if matches: | ||||
|                     valid_report_ids.add(report.pk) | ||||
|   | ||||
| @@ -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 | ||||
|         """ | ||||
|  | ||||
|         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) | ||||
|   | ||||
| @@ -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): | ||||
|  | ||||
|             # 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): | ||||
|  | ||||
|             try: | ||||
|                 filters = helpers.validateFilterString(lbl.filters) | ||||
|  | ||||
|                 if item_query.filter(**filters).exists(): | ||||
|                     labels.append(lbl) | ||||
|             except (ValidationError, FieldError): | ||||
|                 continue | ||||
|  | ||||
|         return labels | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user