Skip to content

Commit c53d711

Browse files
committed
Helper libs for workflow construction
1 parent 689562e commit c53d711

8 files changed

Lines changed: 588 additions & 2 deletions

File tree

docs/usage/taskrouter.rst

Lines changed: 367 additions & 2 deletions
Large diffs are not rendered by default.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import unittest
2+
import json
3+
4+
from mock import patch, Mock
5+
6+
7+
8+
9+
from tests.tools import create_mock_json
10+
from twilio.rest.resources.task_router.workflow_config import WorkflowConfig
11+
from twilio.rest.resources.task_router.workflow_rule import WorkflowRule
12+
from twilio.rest.resources.task_router.workflow_ruletarget import WorkflowRuleTarget
13+
14+
class WorkflowConfigTest(unittest.TestCase):
15+
def test_to_json(self):
16+
rules =[]
17+
ruleTargets=[]
18+
ruleTargets1=[]
19+
ruleTarget = WorkflowRuleTarget("WQeae4fc2f4db7f377c5d3758fb08b79b7","1==1",1,20)
20+
ruleTarget1 = WorkflowRuleTarget("WQ19ebe92fb33522f018b5a31d805d94da","1==1",1,210)
21+
ruleTargets.append(ruleTarget);
22+
ruleTargets1.append(ruleTarget1);
23+
rule = WorkflowRule("1==1",ruleTargets,"SomeQ")
24+
rules.append(rule)
25+
rule1 = WorkflowRule("1==1",ruleTargets1,"SomeOtherQ")
26+
rules.append(rule1)
27+
deftarget = WorkflowRuleTarget("WQ9963154bf3122d0a0558f3763951d916","1==1",None,None)
28+
29+
30+
config = WorkflowConfig(rules,deftarget)
31+
self.assertEqual(self.is_json(config.toJson()),True)
32+
33+
34+
35+
36+
def test_from_Json(self):
37+
38+
data="{\"task_routing\": { \"filters\": [ { \"targets\": [ { \"queue\": \"WQec62de0e1148b8477f2e24579779c8b1\", \"expression\": \"task.language IN worker.languages\" } ], \"friendly_name\": \"Sales\", \"expression\": \"type == \\\"sales\\\"\" }, { \"targets\": [ { \"queue\": \"WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f\", \"expression\": \"task.language IN worker.languages\" } ], \"friendly_name\": \"Marketing\", \"expression\": \"type == \\\"marketing\\\"\" }, { \"targets\": [ { \"queue\": \"WQe5eb317eb23500ade45087ea6522896c\", \"expression\": \"task.language IN worker.languages\" } ], \"friendly_name\": \"Support\", \"expression\": \"type == \\\"support\\\"\" } ], \"default_filter\": { \"queue\": \"WQ05f810d2d130344fd56e3c91ece2e594\" } }}"
39+
config = WorkflowConfig.json2obj(data)
40+
self.assertEqual(len(config.task_routing.filters),3)
41+
self.assertEqual(len(config.task_routing.default_filter),1)
42+
43+
44+
45+
def test_from_json2(self):
46+
data ="{ \"task_routing\": { \"default_filter\": { \"expression\": null, \"priority\": null, \"queue\": \"WQYYYYY\", \"timeout\": null }, \"filters\": [ { \"expression\": \"1==1\", \"friendly_name\": \"SomeQ\", \"targets\": [ { \"expression\": \"1==1\", \"priority\": 1, \"queue\": \"WQXXXX\", \"timeout\": 20 } ] }, { \"expression\": \"1==1\", \"friendly_name\": \"SomeOtherQ\", \"targets\": [ { \"expression\": \"1==1\", \"priority\": 1, \"queue\": \"WQXXXX\", \"timeout\": 20 } ] } ] }}"
47+
config = WorkflowConfig.json2obj(data)
48+
self.assertEqual(len(config.task_routing.filters),2)
49+
self.assertEqual(len(config.task_routing.default_filter),4)
50+
51+
52+
53+
def is_json(self,myjson):
54+
try:
55+
json_object = json.loads(myjson)
56+
except ValueError, e:
57+
return False
58+
return True
59+

twilio/rest/resources/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,16 @@
5555
Reservations,
5656
Task,
5757
Tasks,
58+
TaskRouterConfig,
5859
TaskQueue,
5960
TaskQueues,
6061
Worker,
6162
Workers,
6263
Workflow,
6364
Workflows,
65+
WorkflowConfig,
66+
WorkflowRule,
67+
WorkflowRuleTarget,
6468
Workspace,
6569
Workspaces,
6670
)

twilio/rest/resources/task_router/__init__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,19 @@
3636
Workspace,
3737
Workspaces
3838
)
39+
40+
41+
from .taskrouter_config import (
42+
TaskRouterConfig
43+
)
44+
45+
from .workflow_config import (
46+
WorkflowConfig
47+
)
48+
49+
from .workflow_ruletarget import (
50+
WorkflowRuleTarget
51+
)
52+
from .workflow_rule import (
53+
WorkflowRule
54+
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from .workflow_rule import WorkflowRule
2+
from .workflow_ruletarget import WorkflowRuleTarget
3+
class TaskRouterConfig:
4+
5+
"""
6+
TaskRouterConfig represents the filter and default_filter
7+
of a workflow configuration of taskrouter
8+
"""
9+
10+
def __init__(self, rules, defaultTarget):
11+
self.filters = rules
12+
self.default_filter = defaultTarget
13+
14+
@property
15+
def filters(self):
16+
return self.filters
17+
18+
@property
19+
def defaultFilter(self):
20+
return self.default_filter
21+
22+
def __repr__(self):
23+
out = self.__dict__
24+
return out
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from .taskrouter_config import TaskRouterConfig
2+
import json
3+
from collections import namedtuple, Iterable, OrderedDict
4+
import numpy as np
5+
from twilio.rest.resources.task_router.workflow_rule import WorkflowRule
6+
7+
8+
class WorkflowConfig:
9+
10+
"""
11+
WorkflowConfig represents the whole workflow config json which contains
12+
filters and default_filter.
13+
"""
14+
15+
def __init__(self, workflowRules, defaultTarget):
16+
#filters and default_filters
17+
self.task_routing = TaskRouterConfig(workflowRules, defaultTarget)
18+
19+
20+
@property
21+
def taskrouterConfig(self):
22+
return self.task_routing
23+
24+
def toJson(self):
25+
return json.dumps(self, default=lambda o: o.__dict__,
26+
sort_keys=True, indent=4)
27+
28+
29+
@staticmethod
30+
def json2obj(data):
31+
m=json.loads(data)
32+
return WorkflowConfig(m['task_routing']['filters'],m['task_routing']['default_filter'])
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from .workflow_ruletarget import WorkflowRuleTarget
2+
class WorkflowRule:
3+
"""
4+
WorkflowRule represents the top level filter
5+
which contains a 1 or more targets
6+
7+
..attribute::expression
8+
9+
The expression at the top level filter
10+
11+
..attribute::targets
12+
13+
The list of targets under the filter
14+
15+
..attribute::friendlyName
16+
17+
The name of the filter
18+
"""
19+
_targets = list()
20+
def __init__(self, expression, targets, friendlyName):
21+
22+
self.expression = expression
23+
self.targets = targets
24+
self.friendly_name = friendlyName
25+
26+
@property
27+
def expression(self):
28+
return self.expression
29+
30+
@property
31+
def targets(self):
32+
return self.targets
33+
34+
@property
35+
def friendlyName(self):
36+
return self.friendly_name
37+
38+
def __repr__(self):
39+
out = dict()
40+
out['expression'] = self.expression
41+
out['friendlyName'] = self.friendly_name
42+
out['target'] = self.targets
43+
return str(out)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
class WorkflowRuleTarget:
2+
"""
3+
Workflow Rule target which is encompassed
4+
inside targets
5+
6+
..attribute::queue
7+
8+
The queue which will handle the task matching this filter target
9+
10+
..attribute::expression
11+
12+
The dynamic expression if any for this matching
13+
14+
..attribute::priority
15+
16+
The priority for the target
17+
18+
..attribute::timeout
19+
20+
The timeout before the reservation expires.
21+
"""
22+
def __init__(self, queue, expression, priority, timeout):
23+
24+
self.queue = queue
25+
self.expression = expression
26+
self.priority = priority
27+
self.timeout = timeout
28+
29+
@property
30+
def queue(self):
31+
return self.queue
32+
33+
@property
34+
def expression(self):
35+
return self.expression
36+
37+
@property
38+
def priority(self):
39+
return self.priority
40+
41+
@property
42+
def timeout(self):
43+
return self.timeout

0 commit comments

Comments
 (0)