jeremystretch 4 лет назад
Родитель
Сommit
0d84338e28
2 измененных файлов с 19 добавлено и 2 удалено
  1. 9 2
      netbox/extras/conditions.py
  2. 10 0
      netbox/extras/tests/test_conditions.py

+ 9 - 2
netbox/extras/conditions.py

@@ -1,4 +1,5 @@
 import functools
 import functools
+import re
 
 
 __all__ = (
 __all__ = (
     'Condition',
     'Condition',
@@ -32,13 +33,14 @@ class Condition:
     LTE = 'lte'
     LTE = 'lte'
     IN = 'in'
     IN = 'in'
     CONTAINS = 'contains'
     CONTAINS = 'contains'
+    REGEX = 'regex'
 
 
     OPERATORS = (
     OPERATORS = (
-        EQ, GT, GTE, LT, LTE, IN, CONTAINS
+        EQ, GT, GTE, LT, LTE, IN, CONTAINS, REGEX
     )
     )
 
 
     TYPES = {
     TYPES = {
-        str: (EQ, CONTAINS),
+        str: (EQ, CONTAINS, REGEX),
         bool: (EQ, CONTAINS),
         bool: (EQ, CONTAINS),
         int: (EQ, GT, GTE, LT, LTE, CONTAINS),
         int: (EQ, GT, GTE, LT, LTE, CONTAINS),
         float: (EQ, GT, GTE, LT, LTE, CONTAINS),
         float: (EQ, GT, GTE, LT, LTE, CONTAINS),
@@ -99,6 +101,11 @@ class Condition:
     def eval_contains(self, value):
     def eval_contains(self, value):
         return self.value in value
         return self.value in value
 
 
+    # Regular expressions
+
+    def eval_regex(self, value):
+        return re.match(self.value, value) is not None
+
 
 
 class ConditionSet:
 class ConditionSet:
     """
     """

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

@@ -95,6 +95,16 @@ class ConditionTestCase(TestCase):
         self.assertFalse(c.eval({'x': [1, 2, 3]}))
         self.assertFalse(c.eval({'x': [1, 2, 3]}))
         self.assertTrue(c.eval({'x': [2, 3, 4]}))
         self.assertTrue(c.eval({'x': [2, 3, 4]}))
 
 
+    def test_regex(self):
+        c = Condition('x', '[a-z]+', 'regex')
+        self.assertTrue(c.eval({'x': 'abc'}))
+        self.assertFalse(c.eval({'x': '123'}))
+
+    def test_regex_negated(self):
+        c = Condition('x', '[a-z]+', 'regex', negate=True)
+        self.assertFalse(c.eval({'x': 'abc'}))
+        self.assertTrue(c.eval({'x': '123'}))
+
 
 
 class ConditionSetTest(TestCase):
 class ConditionSetTest(TestCase):