Просмотр исходного кода

Fixes #11459 - Allow using null in conditions (#11722)

* Fixes #11459 - Allow using null in conditions
- Update docs to reflect this
- Change docs example from primary_ip to primary_ip4 as computed properties are not serialized when queuing webhooks

* Update netbox/extras/conditions.py

---------

Co-authored-by: Simon Toft <SITO@telenor.dk>
Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
kkthxbye 3 лет назад
Родитель
Сommit
df499ea8ac

+ 3 - 3
docs/reference/conditions.md

@@ -97,7 +97,7 @@ Multiple conditions can be combined into nested sets using AND or OR logic. This
 
 ### Examples
 
-`status` is "active" and `primary_ip` is defined _or_ the "exempt" tag is applied.
+`status` is "active" and `primary_ip4` is defined _or_ the "exempt" tag is applied.
 
 ```json
 {
@@ -109,8 +109,8 @@ Multiple conditions can be combined into nested sets using AND or OR logic. This
           "value": "active"
         },
         {
-          "attr": "primary_ip",
-          "value": "",
+          "attr": "primary_ip4",
+          "value": null,
           "negate": true
         }
       ]

+ 2 - 1
netbox/extras/conditions.py

@@ -44,7 +44,8 @@ class Condition:
         bool: (EQ, CONTAINS),
         int: (EQ, GT, GTE, LT, LTE, CONTAINS),
         float: (EQ, GT, GTE, LT, LTE, CONTAINS),
-        list: (EQ, IN, CONTAINS)
+        list: (EQ, IN, CONTAINS),
+        type(None): (EQ,)
     }
 
     def __init__(self, attr, value, op=EQ, negate=False):

+ 10 - 0
netbox/extras/tests/test_conditions.py

@@ -126,6 +126,16 @@ class ConditionSetTest(TestCase):
         with self.assertRaises(ValueError):
             ConditionSet({'foo': []})
 
+    def test_null_value(self):
+        cs = ConditionSet({
+            'and': [
+                {'attr': 'a', 'value': None, 'op': 'eq', 'negate': True},
+            ]
+        })
+        self.assertFalse(cs.eval({'a': None}))
+        self.assertTrue(cs.eval({'a': "string"}))
+        self.assertTrue(cs.eval({'a': {"key": "value"}}))
+
     def test_and_single_depth(self):
         cs = ConditionSet({
             'and': [