Skip to content
4 changes: 2 additions & 2 deletions src/backend/InvenTree/common/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
2 changes: 1 addition & 1 deletion src/backend/InvenTree/importer/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion src/backend/InvenTree/machine/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
17 changes: 17 additions & 0 deletions src/backend/InvenTree/order/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')


Expand All @@ -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']


Expand Down
4 changes: 2 additions & 2 deletions src/backend/InvenTree/order/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Has this been verified? There is a difference between these comparison methods

raise ValidationError(_('Invalid custom status key for this order status'))

return value
Expand Down
26 changes: 18 additions & 8 deletions src/backend/InvenTree/order/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
8 changes: 8 additions & 0 deletions src/backend/InvenTree/part/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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']


Expand All @@ -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):
Expand All @@ -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')


Expand All @@ -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',)


Expand Down
18 changes: 18 additions & 0 deletions src/backend/InvenTree/part/test_part.py

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the actual benefit of this? This seems to be coverage for coverage sake.

Original file line number Diff line number Diff line change
Expand Up @@ -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)
2 changes: 1 addition & 1 deletion src/backend/InvenTree/plugin/base/barcodes/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions src/backend/InvenTree/stock/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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']
9 changes: 9 additions & 0 deletions src/backend/InvenTree/stock/tests.py

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above; why are you checking if Django admin is working correctly in 20 different asserts? This seems like bad prompting imo and puts your competence into question

Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
Loading