Skip to content

Commit d166d4d

Browse files
Virtual-Joshaxelsrz
authored andcommitted
Adding deserializer helper (#472)
* adding deserializer, updating teams activity handler to use new deserializer * black updates
1 parent 59ff0f2 commit d166d4d

File tree

7 files changed

+119
-30
lines changed

7 files changed

+119
-30
lines changed

libraries/botbuilder-core/botbuilder/core/teams/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77

88
from .teams_activity_handler import TeamsActivityHandler
99
from .teams_info import TeamsInfo
10+
from .teams_helper import deserializer_helper
1011
from .teams_activity_extensions import (
1112
teams_get_channel_id,
1213
teams_get_team_info,
1314
teams_notify_user,
1415
)
1516

1617
__all__ = [
18+
"deserializer_helper",
1719
"TeamsActivityHandler",
1820
"TeamsInfo",
1921
"teams_get_channel_id",

libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from http import HTTPStatus
55
from botbuilder.schema import Activity, ActivityTypes, ChannelAccount
66
from botbuilder.core.turn_context import TurnContext
7+
from botbuilder.core.teams.teams_helper import deserializer_helper
78
from botbuilder.core import ActivityHandler, InvokeResponse, BotFrameworkAdapter
89
from botbuilder.schema.teams import (
910
AppBasedLinkQuery,
@@ -62,14 +63,16 @@ async def on_invoke_activity(self, turn_context: TurnContext):
6263
if turn_context.activity.name == "fileConsent/invoke":
6364
return await self.on_teams_file_consent(
6465
turn_context,
65-
FileConsentCardResponse().deserialize(turn_context.activity.value),
66+
deserializer_helper(
67+
FileConsentCardResponse, turn_context.activity.value
68+
),
6669
)
6770

6871
if turn_context.activity.name == "actionableMessage/executeAction":
6972
await self.on_teams_o365_connector_card_action(
7073
turn_context,
71-
O365ConnectorCardActionQuery().deserialize(
72-
turn_context.activity.value
74+
deserializer_helper(
75+
O365ConnectorCardActionQuery, turn_context.activity.value
7376
),
7477
)
7578
return self._create_invoke_response()
@@ -78,16 +81,18 @@ async def on_invoke_activity(self, turn_context: TurnContext):
7881
return self._create_invoke_response(
7982
await self.on_teams_app_based_link_query(
8083
turn_context,
81-
AppBasedLinkQuery().deserialize(turn_context.activity.value),
84+
deserializer_helper(
85+
AppBasedLinkQuery, turn_context.activity.value
86+
),
8287
)
8388
)
8489

8590
if turn_context.activity.name == "composeExtension/query":
8691
return self._create_invoke_response(
8792
await self.on_teams_messaging_extension_query(
8893
turn_context,
89-
MessagingExtensionQuery().deserialize(
90-
turn_context.activity.value
94+
deserializer_helper(
95+
MessagingExtensionQuery, turn_context.activity.value
9196
),
9297
)
9398
)
@@ -103,24 +108,28 @@ async def on_invoke_activity(self, turn_context: TurnContext):
103108
return self._create_invoke_response(
104109
await self.on_teams_messaging_extension_submit_action_dispatch(
105110
turn_context,
106-
MessagingExtensionAction(**turn_context.activity.value),
111+
deserializer_helper(
112+
MessagingExtensionAction, turn_context.activity.value
113+
),
107114
)
108115
)
109116

110117
if turn_context.activity.name == "composeExtension/fetchTask":
111118
return self._create_invoke_response(
112119
await self.on_teams_messaging_extension_fetch_task(
113120
turn_context,
114-
MessagingExtensionAction(**turn_context.activity.value),
121+
deserializer_helper(
122+
MessagingExtensionAction, turn_context.activity.value,
123+
),
115124
)
116125
)
117126

118127
if turn_context.activity.name == "composeExtension/querySettingUrl":
119128
return self._create_invoke_response(
120129
await self.on_teams_messaging_extension_configuration_query_settings_url(
121130
turn_context,
122-
MessagingExtensionQuery().deserialize(
123-
turn_context.activity.value
131+
deserializer_helper(
132+
MessagingExtensionQuery, turn_context.activity.value
124133
),
125134
)
126135
)
@@ -141,15 +150,19 @@ async def on_invoke_activity(self, turn_context: TurnContext):
141150
return self._create_invoke_response(
142151
await self.on_teams_task_module_fetch(
143152
turn_context,
144-
TaskModuleRequest().deserialize(turn_context.activity.value),
153+
deserializer_helper(
154+
TaskModuleRequest, turn_context.activity.value
155+
),
145156
)
146157
)
147158

148159
if turn_context.activity.name == "task/submit":
149160
return self._create_invoke_response(
150161
await self.on_teams_task_module_submit(
151162
turn_context,
152-
TaskModuleRequest().deserialize(turn_context.activity.value),
163+
deserializer_helper(
164+
TaskModuleRequest, turn_context.activity.value
165+
),
153166
)
154167
)
155168

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from inspect import getmembers
2+
from typing import Type
3+
from enum import Enum
4+
5+
from msrest.serialization import Model, Deserializer
6+
7+
import botbuilder.schema as schema
8+
import botbuilder.schema.teams as teams_schema
9+
10+
11+
def deserializer_helper(msrest_cls: Type[Model], dict_to_deserialize: dict) -> Model:
12+
dependencies = [
13+
schema_cls
14+
for key, schema_cls in getmembers(schema)
15+
if isinstance(schema_cls, type) and issubclass(schema_cls, (Model, Enum))
16+
]
17+
dependencies += [
18+
schema_cls
19+
for key, schema_cls in getmembers(teams_schema)
20+
if isinstance(schema_cls, type) and issubclass(schema_cls, (Model, Enum))
21+
]
22+
dependencies_dict = {dependency.__name__: dependency for dependency in dependencies}
23+
deserializer = Deserializer(dependencies_dict)
24+
return deserializer(msrest_cls.__name__, dict_to_deserialize)

libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -517,11 +517,11 @@ async def test_on_teams_messaging_extension_bot_message_preview_edit_activity(se
517517
value={
518518
"data": {"key": "value"},
519519
"context": {"theme": "dark"},
520-
"comamndId": "test_command",
520+
"commandId": "test_command",
521521
"commandContext": "command_context_test",
522522
"botMessagePreviewAction": "edit",
523-
"botActivityPreview": [Activity().serialize()],
524-
"messagePayload": MessageActionsPayload().serialize(),
523+
"botActivityPreview": [{"id": "activity123"}],
524+
"messagePayload": {"id": "payloadid"},
525525
},
526526
)
527527

@@ -548,11 +548,11 @@ async def test_on_teams_messaging_extension_bot_message_send_activity(self):
548548
value={
549549
"data": {"key": "value"},
550550
"context": {"theme": "dark"},
551-
"comamndId": "test_command",
551+
"commandId": "test_command",
552552
"commandContext": "command_context_test",
553553
"botMessagePreviewAction": "send",
554-
"botActivityPreview": [Activity().serialize()],
555-
"messagePayload": MessageActionsPayload().serialize(),
554+
"botActivityPreview": [{"id": "123"}],
555+
"messagePayload": {"id": "abc"},
556556
},
557557
)
558558

@@ -578,11 +578,11 @@ async def test_on_teams_messaging_extension_bot_message_send_activity_with_none(
578578
value={
579579
"data": {"key": "value"},
580580
"context": {"theme": "dark"},
581-
"comamndId": "test_command",
581+
"commandId": "test_command",
582582
"commandContext": "command_context_test",
583583
"botMessagePreviewAction": None,
584-
"botActivityPreview": [Activity().serialize()],
585-
"messagePayload": MessageActionsPayload().serialize(),
584+
"botActivityPreview": [{"id": "test123"}],
585+
"messagePayload": {"id": "payloadid123"},
586586
},
587587
)
588588

@@ -608,7 +608,7 @@ async def test_on_teams_messaging_extension_bot_message_send_activity_with_empty
608608
value={
609609
"data": {"key": "value"},
610610
"context": {"theme": "dark"},
611-
"comamndId": "test_command",
611+
"commandId": "test_command",
612612
"commandContext": "command_context_test",
613613
"botMessagePreviewAction": "",
614614
"botActivityPreview": [Activity().serialize()],
@@ -636,14 +636,13 @@ async def test_on_teams_messaging_extension_fetch_task(self):
636636
value={
637637
"data": {"key": "value"},
638638
"context": {"theme": "dark"},
639-
"comamndId": "test_command",
639+
"commandId": "test_command",
640640
"commandContext": "command_context_test",
641641
"botMessagePreviewAction": "message_action",
642-
"botActivityPreview": [Activity().serialize()],
643-
"messagePayload": MessageActionsPayload().serialize(),
642+
"botActivityPreview": [{"id": "123"}],
643+
"messagePayload": {"id": "abc123"},
644644
},
645645
)
646-
647646
turn_context = TurnContext(SimpleAdapter(), activity)
648647

649648
# Act
@@ -661,7 +660,7 @@ async def test_on_teams_messaging_extension_configuration_query_settings_url(sel
661660
type=ActivityTypes.invoke,
662661
name="composeExtension/querySettingUrl",
663662
value={
664-
"comamndId": "test_command",
663+
"commandId": "test_command",
665664
"parameters": [],
666665
"messagingExtensionQueryOptions": {"skip": 1, "count": 1},
667666
"state": "state_string",
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import aiounittest
2+
3+
from botbuilder.core.teams.teams_helper import deserializer_helper
4+
from botbuilder.schema import Activity, ChannelAccount, Mention
5+
from botbuilder.schema.teams import (
6+
MessageActionsPayload,
7+
MessagingExtensionAction,
8+
TaskModuleRequestContext,
9+
)
10+
11+
12+
class TestTeamsActivityHandler(aiounittest.AsyncTestCase):
13+
def test_teams_helper_teams_schema(self):
14+
# Arrange
15+
data = {
16+
"data": {"key": "value"},
17+
"context": {"theme": "dark"},
18+
"commandId": "test_command",
19+
"commandContext": "command_context_test",
20+
"botMessagePreviewAction": "edit",
21+
"botActivityPreview": [{"id": "activity123"}],
22+
"messagePayload": {"id": "payloadid"},
23+
}
24+
25+
# Act
26+
result = deserializer_helper(MessagingExtensionAction, data)
27+
28+
# Assert
29+
assert result.data == {"key": "value"}
30+
assert result.context == TaskModuleRequestContext(theme="dark")
31+
assert result.command_id == "test_command"
32+
assert result.bot_message_preview_action == "edit"
33+
assert len(result.bot_activity_preview) == 1
34+
assert result.bot_activity_preview[0] == Activity(id="activity123")
35+
assert result.message_payload == MessageActionsPayload(id="payloadid")
36+
37+
def test_teams_helper_schema(self):
38+
# Arrange
39+
data = {
40+
"mentioned": {"id": "123", "name": "testName"},
41+
"text": "Hello <at>testName</at>",
42+
"type": "mention",
43+
}
44+
45+
# Act
46+
result = deserializer_helper(Mention, data)
47+
48+
# Assert
49+
assert result.mentioned == ChannelAccount(id="123", name="testName")
50+
assert result.text == "Hello <at>testName</at>"
51+
assert result.type == "mention"

libraries/botbuilder-schema/botbuilder/schema/teams/_models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ def __init__(self, **kwargs):
560560
super(MessagingExtensionAction, self).__init__(**kwargs)
561561
self.command_id = kwargs.get("command_id", None)
562562
self.command_context = kwargs.get("command_context", None)
563-
self.bot_message_preview_action = kwargs.get("botMessagePreviewAction", None)
563+
self.bot_message_preview_action = kwargs.get("bot_message_preview_action", None)
564564
self.bot_activity_preview = kwargs.get("bot_activity_preview", None)
565565
self.message_payload = kwargs.get("message_payload", None)
566566

libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ def __init__(
670670
context=None,
671671
command_id: str = None,
672672
command_context=None,
673-
botMessagePreviewAction=None,
673+
bot_message_preview_action=None,
674674
bot_activity_preview=None,
675675
message_payload=None,
676676
**kwargs
@@ -680,7 +680,7 @@ def __init__(
680680
)
681681
self.command_id = command_id
682682
self.command_context = command_context
683-
self.bot_message_preview_action = botMessagePreviewAction
683+
self.bot_message_preview_action = bot_message_preview_action
684684
self.bot_activity_preview = bot_activity_preview
685685
self.message_payload = message_payload
686686

0 commit comments

Comments
 (0)