2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-17 20:45:44 +00:00

Let plugins decide if events should be processed or not (#5618)

* add wants_process_event to EventMixin

in register_event this function get called and the task is just offload if the plugin returns true

* add tests for wants_process_event

* fix comments for register_event after code changes

* add documentation for EventMixin.wants_process_event

* avoid pre-formatting log messages

---------

Co-authored-by: Oliver Lippert <oliver@lipperts-web.de>
This commit is contained in:
Oliver Lippert
2023-10-01 12:10:26 +02:00
committed by GitHub
parent 7fa0c6d280
commit 46b0d77418
5 changed files with 144 additions and 18 deletions

View File

@ -65,27 +65,32 @@ def register_event(event, *args, **kwargs):
with transaction.atomic():
for slug, plugin in registry.plugins.items():
if not plugin.mixin_enabled('events'):
continue
if plugin.mixin_enabled('events'):
# Only allow event registering for 'active' plugins
if not plugin.is_active():
continue
if plugin.is_active():
# Only allow event registering for 'active' plugins
# Let the plugin decide if it wants to process this event
if not plugin.wants_process_event(event):
continue
logger.debug("Registering callback for plugin '%s'", slug)
logger.debug("Registering callback for plugin '%s'", slug)
# This task *must* be processed by the background worker,
# unless we are running CI tests
if 'force_async' not in kwargs and not settings.PLUGIN_TESTING_EVENTS:
kwargs['force_async'] = True
# This task *must* be processed by the background worker,
# unless we are running CI tests
if 'force_async' not in kwargs and not settings.PLUGIN_TESTING_EVENTS:
kwargs['force_async'] = True
# Offload a separate task for each plugin
offload_task(
process_event,
slug,
event,
*args,
**kwargs
)
# Offload a separate task for each plugin
offload_task(
process_event,
slug,
event,
*args,
**kwargs
)
def process_event(plugin_slug, event, *args, **kwargs):

View File

@ -9,6 +9,15 @@ class EventMixin:
Implementing classes must provide a "process_event" function:
"""
def wants_process_event(self, event):
"""Function to subscribe to events.
Return true if you're interested in the given event, false if not.
"""
# Default implementation always returns true (backwards compatibility)
return True
def process_event(self, event, *args, **kwargs):
"""Function to handle events.

View File

@ -0,0 +1,32 @@
"""Sample plugin which responds to events."""
import logging
from django.conf import settings
from plugin import InvenTreePlugin
from plugin.mixins import EventMixin
logger = logging.getLogger('inventree')
class FilteredEventPluginSample(EventMixin, InvenTreePlugin):
"""A sample plugin which provides supports for triggered events."""
NAME = "FilteredEventPlugin"
SLUG = "filteredsampleevent"
TITLE = "Triggered by test.event only"
def wants_process_event(self, event):
"""Return whether given event should be processed or not."""
return event == "test.event"
def process_event(self, event, *args, **kwargs):
"""Custom event processing."""
print(f"Processing triggered event: '{event}'")
print("args:", str(args))
print("kwargs:", str(kwargs))
# Issue warning that we can test for
if settings.PLUGIN_TESTING:
logger.debug('Event `%s` triggered in sample plugin', event)

View File

@ -0,0 +1,52 @@
"""Unit tests for event_sample sample plugins."""
from django.conf import settings
from django.test import TestCase
from common.models import InvenTreeSetting
from plugin import registry
from plugin.base.event.events import trigger_event
from .filtered_event_sample import logger
class FilteredEventPluginSampleTests(TestCase):
"""Tests for EventPluginSample."""
def test_run_event(self):
"""Check if the event is issued."""
# Activate plugin
config = registry.get_plugin('filteredsampleevent').plugin_config()
config.active = True
config.save()
InvenTreeSetting.set_setting('ENABLE_PLUGINS_EVENTS', True, change_user=None)
# Enable event testing
settings.PLUGIN_TESTING_EVENTS = True
# Check that an event is issued
with self.assertLogs(logger=logger, level="DEBUG") as cm:
trigger_event('test.event')
self.assertIn('DEBUG:inventree:Event `test.event` triggered in sample plugin', cm[1])
# Disable again
settings.PLUGIN_TESTING_EVENTS = False
def test_ignore_event(self):
"""Check if the event is issued."""
# Activate plugin
config = registry.get_plugin('filteredsampleevent').plugin_config()
config.active = True
config.save()
InvenTreeSetting.set_setting('ENABLE_PLUGINS_EVENTS', True, change_user=None)
# Enable event testing
settings.PLUGIN_TESTING_EVENTS = True
# Check that an event is issued
with self.assertLogs(logger=logger, level="DEBUG") as cm:
trigger_event('test.some.other.event')
self.assertNotIn('DEBUG:inventree:Event `test.some.other.event` triggered in sample plugin', cm[1])
# Disable again
settings.PLUGIN_TESTING_EVENTS = False