Skip to content

Commit 4533425

Browse files
authored
Adaptive Card Tabs (#1486)
* Some teams models ported * Teams AH changes and schema updates * Adding unit tests and bug fixing * fixing formatting * Fixed returning Not Implemented on base methods * Fix for TabRequest serializer * Fixed suggestions on teams schema * fixed serialization for TabSubmitData
1 parent fbd73de commit 4533425

File tree

4 files changed

+407
-1
lines changed

4 files changed

+407
-1
lines changed

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
O365ConnectorCardActionQuery,
2424
TaskModuleRequest,
2525
TaskModuleResponse,
26+
TabRequest,
27+
TabSubmit,
2628
)
2729
from botframework.connector import Channels
2830
from ..serializer_helper import deserializer_helper
@@ -163,6 +165,22 @@ async def on_invoke_activity(self, turn_context: TurnContext) -> InvokeResponse:
163165
)
164166
)
165167

168+
if turn_context.activity.name == "tab/fetch":
169+
return self._create_invoke_response(
170+
await self.on_teams_tab_fetch(
171+
turn_context,
172+
deserializer_helper(TabRequest, turn_context.activity.value),
173+
)
174+
)
175+
176+
if turn_context.activity.name == "tab/submit":
177+
return self._create_invoke_response(
178+
await self.on_teams_tab_submit(
179+
turn_context,
180+
deserializer_helper(TabSubmit, turn_context.activity.value),
181+
)
182+
)
183+
166184
return await super().on_invoke_activity(turn_context)
167185

168186
except _InvokeResponseException as invoke_exception:
@@ -466,6 +484,32 @@ async def on_teams_task_module_submit( # pylint: disable=unused-argument
466484
"""
467485
raise _InvokeResponseException(status_code=HTTPStatus.NOT_IMPLEMENTED)
468486

487+
async def on_teams_tab_fetch( # pylint: disable=unused-argument
488+
self, turn_context: TurnContext, tab_request: TabRequest
489+
):
490+
"""
491+
Override this in a derived class to provide logic for when a tab is fetched.
492+
493+
:param turn_context: A context object for this turn.
494+
:param tab_request: The tab invoke request value payload.
495+
496+
:returns: A Tab Response for the request.
497+
"""
498+
raise _InvokeResponseException(status_code=HTTPStatus.NOT_IMPLEMENTED)
499+
500+
async def on_teams_tab_submit( # pylint: disable=unused-argument
501+
self, turn_context: TurnContext, tab_submit: TabSubmit
502+
):
503+
"""
504+
Override this in a derived class to provide logic for when a tab is submitted.
505+
506+
:param turn_context: A context object for this turn.
507+
:param tab_submit: The tab submit invoke request value payload.
508+
509+
:returns: A Tab Response for the request.
510+
"""
511+
raise _InvokeResponseException(status_code=HTTPStatus.NOT_IMPLEMENTED)
512+
469513
async def on_conversation_update_activity(self, turn_context: TurnContext):
470514
"""
471515
Invoked when a conversation update activity is received from the channel.

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
TaskModuleRequestContext,
2828
TeamInfo,
2929
TeamsChannelAccount,
30+
TabRequest,
31+
TabSubmit,
32+
TabContext,
3033
)
3134
from botframework.connector import Channels
3235
from simple_adapter import SimpleAdapter
@@ -294,6 +297,18 @@ async def on_teams_task_module_submit( # pylint: disable=unused-argument
294297
turn_context, task_module_request
295298
)
296299

300+
async def on_teams_tab_fetch(
301+
self, turn_context: TurnContext, tab_request: TabRequest
302+
):
303+
self.record.append("on_teams_tab_fetch")
304+
return await super().on_teams_tab_fetch(turn_context, tab_request)
305+
306+
async def on_teams_tab_submit(
307+
self, turn_context: TurnContext, tab_submit: TabSubmit
308+
):
309+
self.record.append("on_teams_tab_submit")
310+
return await super().on_teams_tab_submit(turn_context, tab_submit)
311+
297312

298313
class NotImplementedAdapter(BotAdapter):
299314
async def delete_activity(
@@ -988,6 +1003,44 @@ async def test_on_teams_task_module_submit(self):
9881003
assert bot.record[0] == "on_invoke_activity"
9891004
assert bot.record[1] == "on_teams_task_module_submit"
9901005

1006+
async def test_on_teams_tab_fetch(self):
1007+
# Arrange
1008+
activity = Activity(
1009+
type=ActivityTypes.invoke,
1010+
name="tab/fetch",
1011+
value={"data": {"key": "value"}, "context": TabContext().serialize(),},
1012+
)
1013+
1014+
turn_context = TurnContext(SimpleAdapter(), activity)
1015+
1016+
# Act
1017+
bot = TestingTeamsActivityHandler()
1018+
await bot.on_turn(turn_context)
1019+
1020+
# Assert
1021+
assert len(bot.record) == 2
1022+
assert bot.record[0] == "on_invoke_activity"
1023+
assert bot.record[1] == "on_teams_tab_fetch"
1024+
1025+
async def test_on_teams_tab_submit(self):
1026+
# Arrange
1027+
activity = Activity(
1028+
type=ActivityTypes.invoke,
1029+
name="tab/submit",
1030+
value={"data": {"key": "value"}, "context": TabContext().serialize(),},
1031+
)
1032+
1033+
turn_context = TurnContext(SimpleAdapter(), activity)
1034+
1035+
# Act
1036+
bot = TestingTeamsActivityHandler()
1037+
await bot.on_turn(turn_context)
1038+
1039+
# Assert
1040+
assert len(bot.record) == 2
1041+
assert bot.record[0] == "on_invoke_activity"
1042+
assert bot.record[1] == "on_teams_tab_submit"
1043+
9911044
async def test_on_end_of_conversation_activity(self):
9921045
activity = Activity(type=ActivityTypes.end_of_conversation)
9931046

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@
6262
from ._models_py3 import TeamsMeetingParticipant
6363
from ._models_py3 import MeetingParticipantInfo
6464
from ._models_py3 import CacheInfo
65+
from ._models_py3 import TabContext
66+
from ._models_py3 import TabRequest
67+
from ._models_py3 import TabResponseCard
68+
from ._models_py3 import TabResponseCards
69+
from ._models_py3 import TabResponsePayload
70+
from ._models_py3 import TabSubmit
71+
from ._models_py3 import TabSubmitData
72+
from ._models_py3 import TabSuggestedActions
73+
from ._models_py3 import TaskModuleCardResponse
6574

6675
__all__ = [
6776
"AppBasedLinkQuery",
@@ -125,4 +134,13 @@
125134
"TeamsMeetingParticipant",
126135
"MeetingParticipantInfo",
127136
"CacheInfo",
137+
"TabContext",
138+
"TabRequest",
139+
"TabResponseCard",
140+
"TabResponseCards",
141+
"TabResponsePayload",
142+
"TabSubmit",
143+
"TabSubmitData",
144+
"TabSuggestedActions",
145+
"TaskModuleCardResponse",
128146
]

0 commit comments

Comments
 (0)