Skip to content

Commit 0eb4dbc

Browse files
committed
update process_event_queue
1 parent 7ef6fae commit 0eb4dbc

File tree

3 files changed

+48
-34
lines changed

3 files changed

+48
-34
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ EVENTS_PIPELINE = ('netbox_scripthelper.events.process_event_queue', )
161161
3. In the script handler, refer to the additional attributes:
162162
```
163163
def run(self, data, commit):
164+
if 'snapshots' not in data:
165+
return
164166
postchange = data['snapshots']['postchange']
165167
prechange = data['snapshots']['prechange']
166168
event = data['event']

netbox_scripthelper/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ class ScriptHelperConfig(PluginConfig):
1616
required_settings = []
1717
default_settings = {}
1818
django_apps = []
19-
min_version = '3.3.0'
20-
max_version = '4.2.99'
19+
min_version = '4.2.0'
20+
max_version = '4.3.99'
2121

2222

2323
config = ScriptHelperConfig

netbox_scripthelper/events.py

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1+
from collections import defaultdict
2+
13
from django.contrib.auth import get_user_model
24
from django.utils import timezone
35
from django.utils.translation import gettext as _
46
from django_rq import get_queue
57

6-
from core.models import Job
78
from netbox.config import get_config
89
from netbox.constants import RQ_QUEUE_DEFAULT
910
from utilities.rqworker import get_rq_retry
10-
from extras.choices import EventRuleActionChoices, ObjectChangeActionChoices
11+
from extras.choices import EventRuleActionChoices
1112
from extras.models import EventRule
1213

1314

14-
def process_event_rules(event_rules, model_name, event, data, username=None, snapshots=None, request_id=None):
15+
def process_event_rules(event_rules, object_type, event_type, data, username=None, snapshots=None, request_id=None):
1516
if username:
1617
user = get_user_model().objects.get(username=username)
1718
else:
@@ -23,6 +24,10 @@ def process_event_rules(event_rules, model_name, event, data, username=None, sna
2324
if not event_rule.eval_conditions(data):
2425
continue
2526

27+
# Compile event data
28+
event_data = event_rule.action_data or {}
29+
event_data.update(data)
30+
2631
# Webhooks
2732
if event_rule.action_type == EventRuleActionChoices.WEBHOOK:
2833

@@ -33,9 +38,9 @@ def process_event_rules(event_rules, model_name, event, data, username=None, sna
3338
# Compile the task parameters
3439
params = {
3540
"event_rule": event_rule,
36-
"model_name": model_name,
37-
"event": event,
38-
"data": data,
41+
"model_name": object_type.model,
42+
"event_type": event_type,
43+
"data": event_data,
3944
"snapshots": snapshots,
4045
"timestamp": timezone.now().isoformat(),
4146
"username": username,
@@ -57,17 +62,27 @@ def process_event_rules(event_rules, model_name, event, data, username=None, sna
5762
# Resolve the script from action parameters
5863
script = event_rule.action_object.python_class()
5964
# a little trick for https://github.com/netbox-community/netbox/issues/14896
60-
data['snapshots'] = snapshots
61-
data['event'] = event
62-
data['username'] = username
65+
event_data['snapshots'] = snapshots
66+
event_data['event'] = event_type
67+
event_data['username'] = username
6368

6469
# Enqueue a Job to record the script's execution
65-
Job.enqueue(
66-
"extras.scripts.run_script",
70+
from extras.jobs import ScriptJob
71+
ScriptJob.enqueue(
6772
instance=event_rule.action_object,
6873
name=script.name,
6974
user=user,
70-
data=data
75+
data=event_data
76+
)
77+
78+
# Notification groups
79+
elif event_rule.action_type == EventRuleActionChoices.NOTIFICATION:
80+
# Bulk-create notifications for all members of the notification group
81+
event_rule.action_object.notify(
82+
object_type=object_type,
83+
object_id=event_data['id'],
84+
object_repr=event_data.get('display'),
85+
event_type=event_type
7186
)
7287

7388
else:
@@ -80,30 +95,27 @@ def process_event_queue(events):
8095
"""
8196
Flush a list of object representation to RQ for EventRule processing.
8297
"""
83-
events_cache = {
84-
'type_create': {},
85-
'type_update': {},
86-
'type_delete': {},
87-
}
88-
89-
for data in events:
90-
action_flag = {
91-
ObjectChangeActionChoices.ACTION_CREATE: 'type_create',
92-
ObjectChangeActionChoices.ACTION_UPDATE: 'type_update',
93-
ObjectChangeActionChoices.ACTION_DELETE: 'type_delete',
94-
}[data['event']]
95-
content_type = data['content_type']
98+
events_cache = defaultdict(dict)
99+
100+
for event in events:
101+
event_type = event['event_type']
102+
object_type = event['object_type']
96103

97104
# Cache applicable Event Rules
98-
if content_type not in events_cache[action_flag]:
99-
events_cache[action_flag][content_type] = EventRule.objects.filter(
100-
**{action_flag: True},
101-
object_types=content_type,
105+
if object_type not in events_cache[event_type]:
106+
events_cache[event_type][object_type] = EventRule.objects.filter(
107+
event_types__contains=[event['event_type']],
108+
object_types=object_type,
102109
enabled=True
103110
)
104-
event_rules = events_cache[action_flag][content_type]
111+
event_rules = events_cache[event_type][object_type]
105112

106113
process_event_rules(
107-
event_rules, content_type.model, data['event'], data['data'], data['username'],
108-
snapshots=data['snapshots'], request_id=data['request_id']
114+
event_rules=event_rules,
115+
object_type=object_type,
116+
event_type=event['event_type'],
117+
data=event['data'],
118+
username=event['username'],
119+
snapshots=event['snapshots'],
120+
request_id=event['request_id']
109121
)

0 commit comments

Comments
 (0)