diff --git a/src/backend/InvenTree/common/models.py b/src/backend/InvenTree/common/models.py index 931630922c55..4eacf7b04f8f 100644 --- a/src/backend/InvenTree/common/models.py +++ b/src/backend/InvenTree/common/models.py @@ -3421,11 +3421,11 @@ def save(self, *args, **kwargs): objects = NoDeleteManager() - def delete(self, *kwargs): + def delete(self, *args, **kwargs): """Delete entry - if not protected.""" if get_global_setting('INVENTREE_PROTECT_EMAIL_LOG'): raise ValidationError(del_error_msg) - return super().delete(*kwargs) + return super().delete(*args, **kwargs) class EmailThread(InvenTree.models.InvenTreeMetadataModel): diff --git a/src/backend/InvenTree/importer/admin.py b/src/backend/InvenTree/importer/admin.py index 45579ab44c6f..e5bf95800087 100644 --- a/src/backend/InvenTree/importer/admin.py +++ b/src/backend/InvenTree/importer/admin.py @@ -27,7 +27,7 @@ def formfield_for_dbfield(self, db_field, request, **kwargs): session = queryset.first().session db_field.choices = [(col, col) for col in session.columns] - return super().formfield_for_choice_field(db_field, request, **kwargs) + return super().formfield_for_dbfield(db_field, request, **kwargs) @admin.register(importer.models.DataImportSession) diff --git a/src/backend/InvenTree/machine/registry.py b/src/backend/InvenTree/machine/registry.py index f72e7c9dd451..3f90cbef23fb 100644 --- a/src/backend/InvenTree/machine/registry.py +++ b/src/backend/InvenTree/machine/registry.py @@ -432,7 +432,7 @@ def _calculate_registry_hash(self): data.update(str(pk).encode()) try: data.update(str(machine.machine_config.active).encode()) - except: + except Exception: # machine does not exist anymore, hash will be different pass diff --git a/src/backend/InvenTree/order/admin.py b/src/backend/InvenTree/order/admin.py index 0a9d4028786b..3e264dd85963 100644 --- a/src/backend/InvenTree/order/admin.py +++ b/src/backend/InvenTree/order/admin.py @@ -149,6 +149,15 @@ class SalesOrderAllocationAdmin(admin.ModelAdmin): list_display = ('line', 'item', 'quantity') + search_fields = [ + 'line__order__reference', + 'line__order__customer__name', + 'line__part__name', + 'item__part__name', + 'item__part__IPN', + 'item__serial', + ] + autocomplete_fields = ('line', 'shipment', 'item') @@ -171,6 +180,14 @@ class ReturnOrderLineItemAdmin(admin.ModelAdmin): list_display = ['order', 'item', 'reference'] + search_fields = [ + 'order__reference', + 'order__customer__name', + 'item__part__name', + 'item__serial', + 'reference', + ] + autocomplete_fields = ['item', 'order'] diff --git a/src/backend/InvenTree/order/serializers.py b/src/backend/InvenTree/order/serializers.py index 027d2e994dd8..d94fe7ec6d11 100644 --- a/src/backend/InvenTree/order/serializers.py +++ b/src/backend/InvenTree/order/serializers.py @@ -191,10 +191,10 @@ def validate_status_custom_key(self, value): custom_status = get_logical_value( value, model=self.Meta.model._meta.model_name ) - except: + except Exception: raise ValidationError(_('Invalid custom status key')) - if custom_status.logical_key is not self.instance.status: + if custom_status.logical_key != self.instance.status: raise ValidationError(_('Invalid custom status key for this order status')) return value diff --git a/src/backend/InvenTree/order/tests.py b/src/backend/InvenTree/order/tests.py index 74f35a5c85f2..ed4a32bd697b 100644 --- a/src/backend/InvenTree/order/tests.py +++ b/src/backend/InvenTree/order/tests.py @@ -730,11 +730,21 @@ def test_updated_at_on_line_item_delete(self): self.assertGreaterEqual(self._refresh(instance).updated_at, before) def test_po_lineitem_admin_search(self): - """Test search fields for PurchaseOrderLineItemAdmin.""" - from order.admin import PurchaseOrderLineItemAdmin - - admin_class = PurchaseOrderLineItemAdmin - self.assertIn('part__part__name', admin_class.search_fields) - self.assertIn('part__SKU', admin_class.search_fields) - self.assertIn('order__reference', admin_class.search_fields) - self.assertIn('order__supplier__name', admin_class.search_fields) + """Test search fields for PurchaseOrderLineItemAdmin, SalesOrderAllocationAdmin, and ReturnOrderLineItemAdmin.""" + from order.admin import ( + PurchaseOrderLineItemAdmin, + ReturnOrderLineItemAdmin, + SalesOrderAllocationAdmin, + ) + + self.assertIn('part__part__name', PurchaseOrderLineItemAdmin.search_fields) + self.assertIn('part__SKU', PurchaseOrderLineItemAdmin.search_fields) + self.assertIn('order__reference', PurchaseOrderLineItemAdmin.search_fields) + self.assertIn('order__supplier__name', PurchaseOrderLineItemAdmin.search_fields) + + self.assertIn('line__order__reference', SalesOrderAllocationAdmin.search_fields) + self.assertIn('line__part__name', SalesOrderAllocationAdmin.search_fields) + self.assertIn('item__part__name', SalesOrderAllocationAdmin.search_fields) + + self.assertIn('order__reference', ReturnOrderLineItemAdmin.search_fields) + self.assertIn('item__part__name', ReturnOrderLineItemAdmin.search_fields) diff --git a/src/backend/InvenTree/part/admin.py b/src/backend/InvenTree/part/admin.py index d1e0398952cf..b6d3003a8f78 100644 --- a/src/backend/InvenTree/part/admin.py +++ b/src/backend/InvenTree/part/admin.py @@ -38,6 +38,8 @@ class PartPricingAdmin(admin.ModelAdmin): list_display = ('part', 'overall_min', 'overall_max') + search_fields = ['part__name', 'part__IPN', 'part__description'] + autocomplete_fields = ['part'] @@ -47,6 +49,8 @@ class PartStocktakeAdmin(admin.ModelAdmin): list_display = ['part', 'date', 'quantity'] + search_fields = ['part__name', 'part__IPN'] + @admin.register(models.PartCategory) class PartCategoryAdmin(admin.ModelAdmin): @@ -63,6 +67,8 @@ class PartCategoryAdmin(admin.ModelAdmin): class PartRelatedAdmin(admin.ModelAdmin): """Class to manage PartRelated objects.""" + search_fields = ['part_1__name', 'part_2__name'] + autocomplete_fields = ('part_1', 'part_2') @@ -73,6 +79,8 @@ class PartTestTemplateAdmin(admin.ModelAdmin): list_display = ('part', 'test_name', 'required') readonly_fields = ['key'] + search_fields = ['part__name', 'test_name', 'description'] + autocomplete_fields = ('part',) diff --git a/src/backend/InvenTree/part/test_part.py b/src/backend/InvenTree/part/test_part.py index a30bddb86498..da618d94760b 100644 --- a/src/backend/InvenTree/part/test_part.py +++ b/src/backend/InvenTree/part/test_part.py @@ -995,3 +995,21 @@ def test_stock_history(self): N_STOCKTAKE = PartStocktake.objects.count() perform_stocktake() self.assertEqual(PartStocktake.objects.count(), N_STOCKTAKE) + + +class PartAdminTest(TestCase): + """Tests for part app admin functionality.""" + + def test_part_admin_search_fields(self): + """Test search fields on part admin classes.""" + from part.admin import ( + PartPricingAdmin, + PartRelatedAdmin, + PartStocktakeAdmin, + PartTestTemplateAdmin, + ) + + self.assertIn('part__name', PartPricingAdmin.search_fields) + self.assertIn('part__name', PartStocktakeAdmin.search_fields) + self.assertIn('part_1__name', PartRelatedAdmin.search_fields) + self.assertIn('test_name', PartTestTemplateAdmin.search_fields) diff --git a/src/backend/InvenTree/plugin/base/barcodes/mixins.py b/src/backend/InvenTree/plugin/base/barcodes/mixins.py index 298cbaeb3924..1d9510b8c5dd 100644 --- a/src/backend/InvenTree/plugin/base/barcodes/mixins.py +++ b/src/backend/InvenTree/plugin/base/barcodes/mixins.py @@ -64,7 +64,7 @@ def has_barcode_generation(self): except NotImplementedError: # If a NotImplementedError is raised, then barcode generation is not supported return False - except: + except Exception: pass return True diff --git a/src/backend/InvenTree/stock/admin.py b/src/backend/InvenTree/stock/admin.py index d72e844cb77b..a607ba782cab 100644 --- a/src/backend/InvenTree/stock/admin.py +++ b/src/backend/InvenTree/stock/admin.py @@ -81,6 +81,12 @@ class StockTrackingAdmin(admin.ModelAdmin): list_display = ('item', 'date', 'label') + search_fields = [ + 'item__part__name', + 'item__serial', + 'notes', + ] + autocomplete_fields = ['item'] def has_add_permission(self, request): @@ -102,4 +108,12 @@ class StockItemTestResultAdmin(admin.ModelAdmin): list_display = ('stock_item', 'test_name', 'result', 'value') + search_fields = [ + 'stock_item__part__name', + 'stock_item__serial', + 'template__test_name', + 'value', + 'notes', + ] + autocomplete_fields = ['stock_item'] diff --git a/src/backend/InvenTree/stock/tests.py b/src/backend/InvenTree/stock/tests.py index fe8d3926bb11..b8f6e1b81486 100644 --- a/src/backend/InvenTree/stock/tests.py +++ b/src/backend/InvenTree/stock/tests.py @@ -1972,6 +1972,15 @@ def test_admin(self): """Test the admin URL.""" self.helper(model=StockLocationType) + def test_stock_admin_search_fields(self): + """Test search fields for StockTrackingAdmin and StockItemTestResultAdmin.""" + from stock.admin import StockItemTestResultAdmin, StockTrackingAdmin + + self.assertIn('item__part__name', StockTrackingAdmin.search_fields) + self.assertIn('item__serial', StockTrackingAdmin.search_fields) + self.assertIn('stock_item__part__name', StockItemTestResultAdmin.search_fields) + self.assertIn('template__test_name', StockItemTestResultAdmin.search_fields) + @skipUnlessDBFeature('has_select_for_update') class StockItemSerialConcurrencyTest(TransactionTestCase):