2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-07-18 02:36:31 +00:00

Logic fix for plugin.is_active (#10026)

* Logic fix for plugin.is_active

- Previously were not considering the "mandatory" attribute

* Fix unit tests

* Allow more queries

* Fix unit tests
This commit is contained in:
Oliver
2025-07-15 23:23:05 +10:00
committed by GitHub
parent d99ec3e1a1
commit b7d3da59c0
4 changed files with 27 additions and 9 deletions

View File

@@ -582,7 +582,7 @@ class GeneralApiTests(InvenTreeAPITestCase):
"""Test that we can read the 'info-view' endpoint.""" """Test that we can read the 'info-view' endpoint."""
url = reverse('api-inventree-info') url = reverse('api-inventree-info')
response = self.get(url) response = self.get(url, max_query_count=275, expected_code=200)
data = response.json() data = response.json()
self.assertIn('server', data) self.assertIn('server', data)

View File

@@ -52,7 +52,11 @@ class LabelMixinTests(PrintTestMixins, InvenTreeAPITestCase):
# But, it is not 'active' # But, it is not 'active'
plugins = registry.with_mixin(PluginMixinEnum.LABELS, active=True) plugins = registry.with_mixin(PluginMixinEnum.LABELS, active=True)
self.assertEqual(len(plugins), 3)
self.assertEqual(len(plugins), 2)
slugs = [p.slug for p in plugins]
self.assertIn('inventreelabel', slugs)
self.assertIn('inventreelabelmachine', slugs)
def test_api(self): def test_api(self):
"""Test that we can filter the API endpoint by mixin.""" """Test that we can filter the API endpoint by mixin."""
@@ -110,6 +114,7 @@ class LabelMixinTests(PrintTestMixins, InvenTreeAPITestCase):
self.assertIn('list may not be empty', str(response.data['items'])) self.assertIn('list may not be empty', str(response.data['items']))
# Plugin is not a label plugin # Plugin is not a label plugin
registry.set_plugin_state('digikeyplugin', True)
no_valid_plg = registry.get_plugin('digikeyplugin').plugin_config() no_valid_plg = registry.get_plugin('digikeyplugin').plugin_config()
response = self.post( response = self.post(

View File

@@ -15,16 +15,17 @@ class SupplierBarcodeTests(InvenTreeAPITestCase):
SCAN_URL = reverse('api-barcode-scan') SCAN_URL = reverse('api-barcode-scan')
def setUp(self):
"""Ensure the digikey plugin is enabled."""
super().setUp()
registry.set_plugin_state('digikeyplugin', True)
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
"""Create supplier parts for barcodes.""" """Create supplier parts for barcodes."""
super().setUpTestData() super().setUpTestData()
# Enable the plugins
registry.set_plugin_state('digikeyplugin', True)
registry.set_plugin_state('mouserplugin', True)
registry.set_plugin_state('lcscplugin', True)
registry.set_plugin_state('tmeplugin', True)
part = Part.objects.create(name='Test Part', description='Test Part') part = Part.objects.create(name='Test Part', description='Test Part')
manufacturer = Company.objects.create( manufacturer = Company.objects.create(
@@ -59,9 +60,11 @@ class SupplierBarcodeTests(InvenTreeAPITestCase):
# Assign supplier information to the plugins # Assign supplier information to the plugins
# Add supplier information to each custom plugin # Add supplier information to each custom plugin
registry.set_plugin_state('digikeyplugin', True)
digikey_plugin = registry.get_plugin('digikeyplugin') digikey_plugin = registry.get_plugin('digikeyplugin')
digikey_plugin.set_setting('SUPPLIER_ID', digikey_supplier.pk) digikey_plugin.set_setting('SUPPLIER_ID', digikey_supplier.pk)
registry.set_plugin_state('mouserplugin', True)
mouser_plugin = registry.get_plugin('mouserplugin') mouser_plugin = registry.get_plugin('mouserplugin')
mouser_plugin.set_setting('SUPPLIER_ID', mouser_supplier.pk) mouser_plugin.set_setting('SUPPLIER_ID', mouser_supplier.pk)
@@ -223,9 +226,11 @@ class SupplierBarcodePOReceiveTests(InvenTreeAPITestCase):
self.purchase_order2.add_line_item(supplier_part, 5, destination=self.loc_2) self.purchase_order2.add_line_item(supplier_part, 5, destination=self.loc_2)
# Add supplier information to each custom plugin # Add supplier information to each custom plugin
registry.set_plugin_state('digikeyplugin', True)
digikey_plugin = registry.get_plugin('digikeyplugin') digikey_plugin = registry.get_plugin('digikeyplugin')
digikey_plugin.set_setting('SUPPLIER_ID', digikey_supplier.pk) digikey_plugin.set_setting('SUPPLIER_ID', digikey_supplier.pk)
registry.set_plugin_state('mouserplugin', True)
mouser_plugin = registry.get_plugin('mouserplugin') mouser_plugin = registry.get_plugin('mouserplugin')
mouser_plugin.set_setting('SUPPLIER_ID', mouser.pk) mouser_plugin.set_setting('SUPPLIER_ID', mouser.pk)

View File

@@ -131,14 +131,15 @@ class MetaBase:
def is_active(self): def is_active(self):
"""Return True if this plugin is currently active.""" """Return True if this plugin is currently active."""
# Builtin plugins are always considered "active" # Mandatory plugins are always considered "active"
if self.is_builtin: if self.is_builtin and self.is_mandatory:
return True return True
config = self.plugin_config() config = self.plugin_config()
if config: if config:
return config.active return config.active
return False # pragma: no cover return False # pragma: no cover
@@ -367,6 +368,13 @@ class InvenTreePlugin(VersionMixin, MixinBase, MetaBase):
"""Is this plugin is builtin.""" """Is this plugin is builtin."""
return self.check_is_builtin() return self.check_is_builtin()
@property
def is_mandatory(self) -> bool:
"""Is this plugin mandatory (always forced to be active)."""
from plugin.registry import registry
return self.slug in registry.MANDATORY_PLUGINS
@classmethod @classmethod
def check_package_path(cls): def check_package_path(cls):
"""Path to the plugin.""" """Path to the plugin."""