2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-07-18 10:46: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."""
url = reverse('api-inventree-info')
response = self.get(url)
response = self.get(url, max_query_count=275, expected_code=200)
data = response.json()
self.assertIn('server', data)

View File

@@ -52,7 +52,11 @@ class LabelMixinTests(PrintTestMixins, InvenTreeAPITestCase):
# But, it is not 'active'
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):
"""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']))
# Plugin is not a label plugin
registry.set_plugin_state('digikeyplugin', True)
no_valid_plg = registry.get_plugin('digikeyplugin').plugin_config()
response = self.post(

View File

@@ -15,16 +15,17 @@ class SupplierBarcodeTests(InvenTreeAPITestCase):
SCAN_URL = reverse('api-barcode-scan')
def setUp(self):
"""Ensure the digikey plugin is enabled."""
super().setUp()
registry.set_plugin_state('digikeyplugin', True)
@classmethod
def setUpTestData(cls):
"""Create supplier parts for barcodes."""
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')
manufacturer = Company.objects.create(
@@ -59,9 +60,11 @@ class SupplierBarcodeTests(InvenTreeAPITestCase):
# Assign supplier information to the plugins
# Add supplier information to each custom plugin
registry.set_plugin_state('digikeyplugin', True)
digikey_plugin = registry.get_plugin('digikeyplugin')
digikey_plugin.set_setting('SUPPLIER_ID', digikey_supplier.pk)
registry.set_plugin_state('mouserplugin', True)
mouser_plugin = registry.get_plugin('mouserplugin')
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)
# Add supplier information to each custom plugin
registry.set_plugin_state('digikeyplugin', True)
digikey_plugin = registry.get_plugin('digikeyplugin')
digikey_plugin.set_setting('SUPPLIER_ID', digikey_supplier.pk)
registry.set_plugin_state('mouserplugin', True)
mouser_plugin = registry.get_plugin('mouserplugin')
mouser_plugin.set_setting('SUPPLIER_ID', mouser.pk)

View File

@@ -131,14 +131,15 @@ class MetaBase:
def is_active(self):
"""Return True if this plugin is currently active."""
# Builtin plugins are always considered "active"
if self.is_builtin:
# Mandatory plugins are always considered "active"
if self.is_builtin and self.is_mandatory:
return True
config = self.plugin_config()
if config:
return config.active
return False # pragma: no cover
@@ -367,6 +368,13 @@ class InvenTreePlugin(VersionMixin, MixinBase, MetaBase):
"""Is this plugin 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
def check_package_path(cls):
"""Path to the plugin."""