1+ from collections import defaultdict
2+
13from django .contrib .auth import get_user_model
24from django .utils import timezone
35from django .utils .translation import gettext as _
46from django_rq import get_queue
57
6- from core .models import Job
78from netbox .config import get_config
89from netbox .constants import RQ_QUEUE_DEFAULT
910from utilities .rqworker import get_rq_retry
10- from extras .choices import EventRuleActionChoices , ObjectChangeActionChoices
11+ from extras .choices import EventRuleActionChoices
1112from 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