From 0cace2eda4caf038b8283828e513941c60e7cb11 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Tue, 12 Jan 2016 11:44:58 -0800 Subject: [PATCH 01/10] Supporting filter_friendly_name --- tests/task_router/test_workflow_config.py | 51 +++++++++++++++++++++++ twilio/task_router/taskrouter_config.py | 23 +++++++++- twilio/task_router/workflow_rule.py | 2 +- twilio/task_router/workflow_ruletarget.py | 2 +- 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/tests/task_router/test_workflow_config.py b/tests/task_router/test_workflow_config.py index 458fecc045..724051ae9c 100644 --- a/tests/task_router/test_workflow_config.py +++ b/tests/task_router/test_workflow_config.py @@ -78,6 +78,57 @@ def test_from_json2(self): self.assertEqual(2, len(config.task_routing.filters)) self.assertEqual(4, len(config.task_routing.default_filter)) + def test_from_json_filter_friendly_name(self): + + data = { + 'task_routing': + { + 'filters': [ + { + 'expression': 'type == "sales"', + 'filter_friendly_name': 'Sales', + 'targets': [ + { + 'queue': 'WQec62de0e1148b8477f2e24579779c8b1', + 'expression': 'task.language IN worker.languages' + } + ] + }, + { + 'expression': 'type == "marketing"', + 'filter_friendly_name': 'Marketing', + 'targets': [ + { + 'queue': 'WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f', + 'expression': 'task.language IN worker.languages' + } + ] + }, + { + 'expression': 'type == "support"', + 'filter_friendly_name': 'Support', + 'targets': [ + { + 'queue': 'WQe5eb317eb23500ade45087ea6522896c', + 'expression': 'task.language IN worker.languages' + } + ] + } + ], + 'default_filter': + { + 'queue': 'WQ05f810d2d130344fd56e3c91ece2e594' + } + } + } + + config = WorkflowConfig.json2obj(json.dumps(data)) + self.assertEqual(3, len(config.task_routing.filters)) + self.assertEqual(1, len(config.task_routing.default_filter)) + self.assertEqual("Sales", config.task_routing.workflow_rules[0].friendly_name) + self.assertEqual("Marketing", config.task_routing.workflow_rules[1].friendly_name) + self.assertEqual("Support", config.task_routing.workflow_rules[2].friendly_name) + def is_json(self, myjson): try: json.loads(myjson) diff --git a/twilio/task_router/taskrouter_config.py b/twilio/task_router/taskrouter_config.py index b4e8eb7b55..522f02c5cd 100644 --- a/twilio/task_router/taskrouter_config.py +++ b/twilio/task_router/taskrouter_config.py @@ -10,8 +10,29 @@ class TaskRouterConfig: """ def __init__(self, rules, default_target): + self.filters = rules self.default_filter = default_target + self.workflow_rules = [] + + for rule in rules: + if isinstance(rule, WorkflowRule): + self.workflow_rules.append(rule) + else: + try: + name = rule['friendly_name'] + except KeyError: + name = rule['filter_friendly_name'] + self.workflow_rules.append( + WorkflowRule(rule['expression'], rule['targets'], name)) + + + def __repr__(self): - return self.__dict__ + + return str({ + 'workflow_rules': self.workflow_rules, + 'default': self.default_filter, + 'rules': self.rules + }) diff --git a/twilio/task_router/workflow_rule.py b/twilio/task_router/workflow_rule.py index 3cae68ec80..5c4c1fd71c 100644 --- a/twilio/task_router/workflow_rule.py +++ b/twilio/task_router/workflow_rule.py @@ -30,5 +30,5 @@ def __repr__(self): return str({ 'expression': self.expression, 'friendly_name': self.friendly_name, - 'target': self.target, + 'targets': self.targets, }) diff --git a/twilio/task_router/workflow_ruletarget.py b/twilio/task_router/workflow_ruletarget.py index 1cee506c30..9cf95a65f7 100644 --- a/twilio/task_router/workflow_ruletarget.py +++ b/twilio/task_router/workflow_ruletarget.py @@ -19,7 +19,7 @@ class WorkflowRuleTarget: The timeout before the reservation expires. """ - def __init__(self, queue, expression, priority, timeout): + def __init__(self, queue, expression, priority=None, timeout=None): self.queue = queue self.expression = expression From 3d79b5762911bfed480ce208fc42287d126d6b38 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Tue, 12 Jan 2016 12:09:48 -0800 Subject: [PATCH 02/10] Moving imports to beginning of init; removing excess blank lines --- twilio/task_router/__init__.py | 19 ++++--------------- twilio/task_router/taskrouter_config.py | 3 --- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/twilio/task_router/__init__.py b/twilio/task_router/__init__.py index c77feeca29..028b34f6a6 100644 --- a/twilio/task_router/__init__.py +++ b/twilio/task_router/__init__.py @@ -1,5 +1,9 @@ import time from .. import jwt +from .taskrouter_config import TaskRouterConfig +from .workflow_config import WorkflowConfig +from .workflow_ruletarget import WorkflowRuleTarget +from .workflow_rule import WorkflowRule import warnings warnings.simplefilter('always', DeprecationWarning) @@ -248,18 +252,3 @@ def __init__(self, account_sid, auth_token, workspace_sid): def setup_resource(self): self.resource_url = self.base_url - -from .taskrouter_config import ( - TaskRouterConfig -) - -from .workflow_config import ( - WorkflowConfig -) - -from .workflow_ruletarget import ( - WorkflowRuleTarget -) -from .workflow_rule import ( - WorkflowRule -) diff --git a/twilio/task_router/taskrouter_config.py b/twilio/task_router/taskrouter_config.py index 522f02c5cd..daa66922c6 100644 --- a/twilio/task_router/taskrouter_config.py +++ b/twilio/task_router/taskrouter_config.py @@ -26,9 +26,6 @@ def __init__(self, rules, default_target): self.workflow_rules.append( WorkflowRule(rule['expression'], rule['targets'], name)) - - - def __repr__(self): return str({ From 5500cba846e5b1784aaa6bed2e959981c5350855 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Sun, 17 Jan 2016 21:15:02 -0800 Subject: [PATCH 03/10] Using only filters instead of workflow_rules; added check for friendly_name when marshalling back --- tests/task_router/test_workflow_config.py | 61 +++++++++++++++++++++-- twilio/task_router/taskrouter_config.py | 26 ++++++---- twilio/task_router/workflow_rule.py | 3 +- 3 files changed, 75 insertions(+), 15 deletions(-) diff --git a/tests/task_router/test_workflow_config.py b/tests/task_router/test_workflow_config.py index 724051ae9c..05b6c4ab1f 100644 --- a/tests/task_router/test_workflow_config.py +++ b/tests/task_router/test_workflow_config.py @@ -14,7 +14,6 @@ def test_to_json(self): ] def_target = WorkflowRuleTarget("WQ9963154bf3122d0a0558f3763951d916", "1==1", None, None) config = WorkflowConfig(rules, def_target) - self.assertEqual(True, self.is_json(config.to_json())) def test_from_json(self): @@ -125,9 +124,59 @@ def test_from_json_filter_friendly_name(self): config = WorkflowConfig.json2obj(json.dumps(data)) self.assertEqual(3, len(config.task_routing.filters)) self.assertEqual(1, len(config.task_routing.default_filter)) - self.assertEqual("Sales", config.task_routing.workflow_rules[0].friendly_name) - self.assertEqual("Marketing", config.task_routing.workflow_rules[1].friendly_name) - self.assertEqual("Support", config.task_routing.workflow_rules[2].friendly_name) + self.assertEqual("Sales", config.task_routing.filters[0].friendly_name) + self.assertEqual("Marketing", config.task_routing.filters[1].friendly_name) + self.assertEqual("Support", config.task_routing.filters[2].friendly_name) + + # convert back to json; should marshal as friendly_name + config_json = config.to_json() + expected_config_data = { + "task_routing": { + "default_filter": { + "queue": "WQ05f810d2d130344fd56e3c91ece2e594" + }, + "filters": [ + { + "expression": "type == \"sales\"", + "friendly_name": "Sales", + "targets": [ + { + "expression": "task.language IN worker.languages", + "queue": "WQec62de0e1148b8477f2e24579779c8b1" + } + ] + }, + { + "expression": "type == \"marketing\"", + "friendly_name": "Marketing", + "targets": [ + { + "expression": "task.language IN worker.languages", + "queue": "WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f" + } + ] + }, + { + "expression": "type == \"support\"", + "friendly_name": "Support", + "targets": [ + { + "expression": "task.language IN worker.languages", + "queue": "WQe5eb317eb23500ade45087ea6522896c" + } + ] + } + ] + } + } + + expected_config_json = json.dumps(expected_config_data, + default=lambda o: o.__dict__, + sort_keys=True, + indent=4) + + self.assertEqual(config_json, expected_config_json) + def is_json(self, myjson): try: @@ -136,3 +185,7 @@ def is_json(self, myjson): print(e) return False return True + +if __name__ == '__main__': + unittest.main() + diff --git a/twilio/task_router/taskrouter_config.py b/twilio/task_router/taskrouter_config.py index daa66922c6..f0c4cfd0c5 100644 --- a/twilio/task_router/taskrouter_config.py +++ b/twilio/task_router/taskrouter_config.py @@ -1,5 +1,6 @@ from .workflow_rule import WorkflowRule from .workflow_ruletarget import WorkflowRuleTarget +import json class TaskRouterConfig: @@ -11,25 +12,30 @@ class TaskRouterConfig: def __init__(self, rules, default_target): - self.filters = rules self.default_filter = default_target - self.workflow_rules = [] + workflow_rules = [] for rule in rules: if isinstance(rule, WorkflowRule): - self.workflow_rules.append(rule) + workflow_rules.append(rule) else: try: name = rule['friendly_name'] except KeyError: name = rule['filter_friendly_name'] - self.workflow_rules.append( + workflow_rules.append( WorkflowRule(rule['expression'], rule['targets'], name)) + self.filters = workflow_rules - def __repr__(self): + def to_json(self): - return str({ - 'workflow_rules': self.workflow_rules, - 'default': self.default_filter, - 'rules': self.rules - }) + return json.dumps(self, + default=lambda o: o.__dict__, + sort_keys=True, + indent=4) + + @staticmethod + def json2obj(data): + + m = json.loads(data) + return TaskRouterConfig(m['filters'], m['default_filter']) diff --git a/twilio/task_router/workflow_rule.py b/twilio/task_router/workflow_rule.py index 5c4c1fd71c..3eabcc892f 100644 --- a/twilio/task_router/workflow_rule.py +++ b/twilio/task_router/workflow_rule.py @@ -1,4 +1,5 @@ from .workflow_ruletarget import WorkflowRuleTarget +import json class WorkflowRule: @@ -20,7 +21,7 @@ class WorkflowRule: The name of the filter """ - def __init__(self, expression, targets, friendly_name): + def __init__(self, expression, targets, friendly_name=None): self.expression = expression self.targets = targets From 3c0b395cde07f94165e9d4b4c5e79819bc17f649 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Sun, 17 Jan 2016 21:44:29 -0800 Subject: [PATCH 04/10] fixing indentations, fixed deletion of assertEqual --- tests/task_router/test_workflow_config.py | 90 +++++++++++------------ twilio-python.iml | 9 +++ twilio/task_router/taskrouter_config.py | 1 - 3 files changed, 53 insertions(+), 47 deletions(-) create mode 100644 twilio-python.iml diff --git a/tests/task_router/test_workflow_config.py b/tests/task_router/test_workflow_config.py index 05b6c4ab1f..3ec713ef8d 100644 --- a/tests/task_router/test_workflow_config.py +++ b/tests/task_router/test_workflow_config.py @@ -14,6 +14,7 @@ def test_to_json(self): ] def_target = WorkflowRuleTarget("WQ9963154bf3122d0a0558f3763951d916", "1==1", None, None) config = WorkflowConfig(rules, def_target) + self.assertEqual(True, self.is_json(config.to_json())) def test_from_json(self): @@ -85,7 +86,7 @@ def test_from_json_filter_friendly_name(self): 'filters': [ { 'expression': 'type == "sales"', - 'filter_friendly_name': 'Sales', + 'friendly_name': 'Sales', 'targets': [ { 'queue': 'WQec62de0e1148b8477f2e24579779c8b1', @@ -95,7 +96,7 @@ def test_from_json_filter_friendly_name(self): }, { 'expression': 'type == "marketing"', - 'filter_friendly_name': 'Marketing', + 'friendly_name': 'Marketing', 'targets': [ { 'queue': 'WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f', @@ -105,7 +106,7 @@ def test_from_json_filter_friendly_name(self): }, { 'expression': 'type == "support"', - 'filter_friendly_name': 'Support', + 'friendly_name': 'Support', 'targets': [ { 'queue': 'WQe5eb317eb23500ade45087ea6522896c', @@ -131,44 +132,46 @@ def test_from_json_filter_friendly_name(self): # convert back to json; should marshal as friendly_name config_json = config.to_json() expected_config_data = { - "task_routing": { - "default_filter": { - "queue": "WQ05f810d2d130344fd56e3c91ece2e594" - }, - "filters": [ - { - "expression": "type == \"sales\"", - "friendly_name": "Sales", - "targets": [ - { - "expression": "task.language IN worker.languages", - "queue": "WQec62de0e1148b8477f2e24579779c8b1" - } - ] - }, - { - "expression": "type == \"marketing\"", - "friendly_name": "Marketing", - "targets": [ - { - "expression": "task.language IN worker.languages", - "queue": "WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f" - } - ] - }, - { - "expression": "type == \"support\"", - "friendly_name": "Support", - "targets": [ - { - "expression": "task.language IN worker.languages", - "queue": "WQe5eb317eb23500ade45087ea6522896c" - } - ] - } - ] - } - } + "task_routing": + { + "default_filter": + { + "queue": "WQ05f810d2d130344fd56e3c91ece2e594" + }, + "filters": [ + { + "expression": "type == \"sales\"", + "friendly_name": "Sales", + "targets": [ + { + "expression": "task.language IN worker.languages", + "queue": "WQec62de0e1148b8477f2e24579779c8b1" + } + ] + }, + { + "expression": "type == \"marketing\"", + "friendly_name": "Marketing", + "targets": [ + { + "expression": "task.language IN worker.languages", + "queue": "WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f" + } + ] + }, + { + "expression": "type == \"support\"", + "friendly_name": "Support", + "targets": [ + { + "expression": "task.language IN worker.languages", + "queue": "WQe5eb317eb23500ade45087ea6522896c" + } + ] + } + ] + } + } expected_config_json = json.dumps(expected_config_data, default=lambda o: o.__dict__, @@ -177,7 +180,6 @@ def test_from_json_filter_friendly_name(self): self.assertEqual(config_json, expected_config_json) - def is_json(self, myjson): try: json.loads(myjson) @@ -185,7 +187,3 @@ def is_json(self, myjson): print(e) return False return True - -if __name__ == '__main__': - unittest.main() - diff --git a/twilio-python.iml b/twilio-python.iml new file mode 100644 index 0000000000..8021953ed9 --- /dev/null +++ b/twilio-python.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/twilio/task_router/taskrouter_config.py b/twilio/task_router/taskrouter_config.py index f0c4cfd0c5..c3bbe67b2f 100644 --- a/twilio/task_router/taskrouter_config.py +++ b/twilio/task_router/taskrouter_config.py @@ -1,5 +1,4 @@ from .workflow_rule import WorkflowRule -from .workflow_ruletarget import WorkflowRuleTarget import json From ee487bade53c95063696bad5a7d69dacef20a808 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Sun, 17 Jan 2016 21:48:16 -0800 Subject: [PATCH 05/10] removing .iml file --- twilio-python.iml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 twilio-python.iml diff --git a/twilio-python.iml b/twilio-python.iml deleted file mode 100644 index 8021953ed9..0000000000 --- a/twilio-python.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file From 79daa8dc2c80d75e5b30038688fbaf7b757defb0 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Tue, 19 Jan 2016 14:19:01 -0800 Subject: [PATCH 06/10] Reverting all changes; parsing user input for filter_friendly_name and changing to friendly_name --- tests/task_router/test_workflow_config.py | 23 +++++++---------- twilio/task_router/taskrouter_config.py | 30 +++-------------------- twilio/task_router/workflow_config.py | 3 +++ twilio/task_router/workflow_rule.py | 1 - 4 files changed, 16 insertions(+), 41 deletions(-) diff --git a/tests/task_router/test_workflow_config.py b/tests/task_router/test_workflow_config.py index 3ec713ef8d..a4a5000706 100644 --- a/tests/task_router/test_workflow_config.py +++ b/tests/task_router/test_workflow_config.py @@ -78,17 +78,17 @@ def test_from_json2(self): self.assertEqual(2, len(config.task_routing.filters)) self.assertEqual(4, len(config.task_routing.default_filter)) - def test_from_json_filter_friendly_name(self): - + def test_from_json_with_filter_friendly_name(self): data = { 'task_routing': { 'filters': [ { 'expression': 'type == "sales"', - 'friendly_name': 'Sales', + 'filter_friendly_name': 'Sales', 'targets': [ { + 'queue': 'WQec62de0e1148b8477f2e24579779c8b1', 'expression': 'task.language IN worker.languages' } @@ -96,7 +96,7 @@ def test_from_json_filter_friendly_name(self): }, { 'expression': 'type == "marketing"', - 'friendly_name': 'Marketing', + 'filter_friendly_name': 'Marketing', 'targets': [ { 'queue': 'WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f', @@ -106,7 +106,7 @@ def test_from_json_filter_friendly_name(self): }, { 'expression': 'type == "support"', - 'friendly_name': 'Support', + 'filter_friendly_name': 'Support', 'targets': [ { 'queue': 'WQe5eb317eb23500ade45087ea6522896c', @@ -121,16 +121,12 @@ def test_from_json_filter_friendly_name(self): } } } - + # marshal object config = WorkflowConfig.json2obj(json.dumps(data)) self.assertEqual(3, len(config.task_routing.filters)) self.assertEqual(1, len(config.task_routing.default_filter)) - self.assertEqual("Sales", config.task_routing.filters[0].friendly_name) - self.assertEqual("Marketing", config.task_routing.filters[1].friendly_name) - self.assertEqual("Support", config.task_routing.filters[2].friendly_name) - # convert back to json; should marshal as friendly_name - config_json = config.to_json() + # check that the configuration was marshaled to "friendly_name" and not "filter_friendly_name" expected_config_data = { "task_routing": { @@ -174,11 +170,10 @@ def test_from_json_filter_friendly_name(self): } expected_config_json = json.dumps(expected_config_data, - default=lambda o: o.__dict__, sort_keys=True, indent=4) - - self.assertEqual(config_json, expected_config_json) + # check that marshaling back stays as "friendly_name" + self.assertEqual(config.to_json(), expected_config_json) def is_json(self, myjson): try: diff --git a/twilio/task_router/taskrouter_config.py b/twilio/task_router/taskrouter_config.py index c3bbe67b2f..be17c8334c 100644 --- a/twilio/task_router/taskrouter_config.py +++ b/twilio/task_router/taskrouter_config.py @@ -1,4 +1,5 @@ from .workflow_rule import WorkflowRule +from .workflow_ruletarget import WorkflowRuleTarget import json @@ -10,31 +11,8 @@ class TaskRouterConfig: """ def __init__(self, rules, default_target): - + self.filters = rules self.default_filter = default_target - workflow_rules = [] - - for rule in rules: - if isinstance(rule, WorkflowRule): - workflow_rules.append(rule) - else: - try: - name = rule['friendly_name'] - except KeyError: - name = rule['filter_friendly_name'] - workflow_rules.append( - WorkflowRule(rule['expression'], rule['targets'], name)) - self.filters = workflow_rules - - def to_json(self): - - return json.dumps(self, - default=lambda o: o.__dict__, - sort_keys=True, - indent=4) - - @staticmethod - def json2obj(data): - m = json.loads(data) - return TaskRouterConfig(m['filters'], m['default_filter']) + def __repr__(self): + return self.__dict__ diff --git a/twilio/task_router/workflow_config.py b/twilio/task_router/workflow_config.py index e9c27aa378..8790559b7d 100644 --- a/twilio/task_router/workflow_config.py +++ b/twilio/task_router/workflow_config.py @@ -21,6 +21,9 @@ def to_json(self): @staticmethod def json2obj(data): + # replace instances of "filter_friendly_name" with "friendly_name" + data = data.replace("filter_friendly_name", "friendly_name") + m = json.loads(data) return WorkflowConfig(m['task_routing']['filters'], m['task_routing']['default_filter']) diff --git a/twilio/task_router/workflow_rule.py b/twilio/task_router/workflow_rule.py index 3eabcc892f..efe6bc1bbc 100644 --- a/twilio/task_router/workflow_rule.py +++ b/twilio/task_router/workflow_rule.py @@ -1,5 +1,4 @@ from .workflow_ruletarget import WorkflowRuleTarget -import json class WorkflowRule: From 3bb6b3f0be07c1c0911402f9bbe3edb835831f67 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Tue, 19 Jan 2016 14:20:18 -0800 Subject: [PATCH 07/10] Reverting optional param --- twilio/task_router/workflow_rule.py | 2 +- twilio/task_router/workflow_ruletarget.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/twilio/task_router/workflow_rule.py b/twilio/task_router/workflow_rule.py index efe6bc1bbc..5c4c1fd71c 100644 --- a/twilio/task_router/workflow_rule.py +++ b/twilio/task_router/workflow_rule.py @@ -20,7 +20,7 @@ class WorkflowRule: The name of the filter """ - def __init__(self, expression, targets, friendly_name=None): + def __init__(self, expression, targets, friendly_name): self.expression = expression self.targets = targets diff --git a/twilio/task_router/workflow_ruletarget.py b/twilio/task_router/workflow_ruletarget.py index 9cf95a65f7..1cee506c30 100644 --- a/twilio/task_router/workflow_ruletarget.py +++ b/twilio/task_router/workflow_ruletarget.py @@ -19,7 +19,7 @@ class WorkflowRuleTarget: The timeout before the reservation expires. """ - def __init__(self, queue, expression, priority=None, timeout=None): + def __init__(self, queue, expression, priority, timeout): self.queue = queue self.expression = expression From 11266b0d5bfc569f93d6dd7addf615a4d4e19530 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Tue, 19 Jan 2016 14:23:03 -0800 Subject: [PATCH 08/10] remove unnecessary import --- twilio/task_router/taskrouter_config.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/twilio/task_router/taskrouter_config.py b/twilio/task_router/taskrouter_config.py index be17c8334c..482967cff0 100644 --- a/twilio/task_router/taskrouter_config.py +++ b/twilio/task_router/taskrouter_config.py @@ -1,7 +1,5 @@ from .workflow_rule import WorkflowRule from .workflow_ruletarget import WorkflowRuleTarget -import json - class TaskRouterConfig: From 571563199050207db1b6076117aca71bdf2d7389 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Tue, 19 Jan 2016 14:25:52 -0800 Subject: [PATCH 09/10] fixed blank line --- twilio/task_router/taskrouter_config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/twilio/task_router/taskrouter_config.py b/twilio/task_router/taskrouter_config.py index 482967cff0..b4e8eb7b55 100644 --- a/twilio/task_router/taskrouter_config.py +++ b/twilio/task_router/taskrouter_config.py @@ -1,6 +1,7 @@ from .workflow_rule import WorkflowRule from .workflow_ruletarget import WorkflowRuleTarget + class TaskRouterConfig: """ From cba4bfbe6832e5074f193c16caeda50e78bbf610 Mon Sep 17 00:00:00 2001 From: Wanjun Li Date: Tue, 19 Jan 2016 19:18:59 -0800 Subject: [PATCH 10/10] Checking for filter_friendly_name in TaskrouterConfig --- tests/task_router/test_workflow_config.py | 100 ++++++++++++++++++++++ twilio/task_router/taskrouter_config.py | 6 ++ twilio/task_router/workflow_config.py | 3 - 3 files changed, 106 insertions(+), 3 deletions(-) diff --git a/tests/task_router/test_workflow_config.py b/tests/task_router/test_workflow_config.py index a4a5000706..4aa99213de 100644 --- a/tests/task_router/test_workflow_config.py +++ b/tests/task_router/test_workflow_config.py @@ -175,6 +175,106 @@ def test_from_json_with_filter_friendly_name(self): # check that marshaling back stays as "friendly_name" self.assertEqual(config.to_json(), expected_config_json) + def test_from_json_with_both_filter_and_friendly_name(self): + data = { + 'task_routing': + { + 'filters': [ + { + 'expression': 'type == "sales"', + 'filter_friendly_name': "Sales", + 'friendly_name': 'Sales2', + 'targets': [ + { + + 'queue': 'WQec62de0e1148b8477f2e24579779c8b1', + 'expression': 'task.language IN worker.languages' + } + ] + }, + { + 'expression': 'type == "marketing"', + 'filter_friendly_name': 'Marketing', + 'friendly_name': 'Marketing2', + 'targets': [ + { + 'queue': 'WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f', + 'expression': 'task.language IN worker.languages' + } + ] + }, + { + 'expression': 'type == "support"', + 'filter_friendly_name': 'Support', + 'friendly_name': 'Support2', + 'targets': [ + { + 'queue': 'WQe5eb317eb23500ade45087ea6522896c', + 'expression': 'task.language IN worker.languages' + } + ] + } + ], + 'default_filter': + { + 'queue': 'WQ05f810d2d130344fd56e3c91ece2e594' + } + } + } + # marshal object + config = WorkflowConfig.json2obj(json.dumps(data)) + self.assertEqual(3, len(config.task_routing.filters)) + self.assertEqual(1, len(config.task_routing.default_filter)) + + # check that the configuration was marshaled to "friendly_name" and not "filter_friendly_name" + expected_config_data = { + "task_routing": + { + "default_filter": + { + "queue": "WQ05f810d2d130344fd56e3c91ece2e594" + }, + "filters": [ + { + "expression": "type == \"sales\"", + "friendly_name": "Sales", + "targets": [ + { + "expression": "task.language IN worker.languages", + "queue": "WQec62de0e1148b8477f2e24579779c8b1" + } + ] + }, + { + "expression": "type == \"marketing\"", + "friendly_name": "Marketing", + "targets": [ + { + "expression": "task.language IN worker.languages", + "queue": "WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f" + } + ] + }, + { + "expression": "type == \"support\"", + "friendly_name": "Support", + "targets": [ + { + "expression": "task.language IN worker.languages", + "queue": "WQe5eb317eb23500ade45087ea6522896c" + } + ] + } + ] + } + } + + expected_config_json = json.dumps(expected_config_data, + sort_keys=True, + indent=4) + # check that marshaling back stays as "friendly_name" + self.assertEqual(config.to_json(), expected_config_json) + def is_json(self, myjson): try: json.loads(myjson) diff --git a/twilio/task_router/taskrouter_config.py b/twilio/task_router/taskrouter_config.py index b4e8eb7b55..22c04f1913 100644 --- a/twilio/task_router/taskrouter_config.py +++ b/twilio/task_router/taskrouter_config.py @@ -13,5 +13,11 @@ def __init__(self, rules, default_target): self.filters = rules self.default_filter = default_target + for rule in self.filters: + if not isinstance(rule, WorkflowRule): + filter_friendly_name = rule.pop('filter_friendly_name', None) + if filter_friendly_name is not None: + rule['friendly_name'] = filter_friendly_name + def __repr__(self): return self.__dict__ diff --git a/twilio/task_router/workflow_config.py b/twilio/task_router/workflow_config.py index 8790559b7d..e9c27aa378 100644 --- a/twilio/task_router/workflow_config.py +++ b/twilio/task_router/workflow_config.py @@ -21,9 +21,6 @@ def to_json(self): @staticmethod def json2obj(data): - # replace instances of "filter_friendly_name" with "friendly_name" - data = data.replace("filter_friendly_name", "friendly_name") - m = json.loads(data) return WorkflowConfig(m['task_routing']['filters'], m['task_routing']['default_filter'])