From d6cacc1768700b31929c51147282456e8e0a5f1f Mon Sep 17 00:00:00 2001 From: tracyboehrer Date: Mon, 19 Oct 2020 12:32:54 -0500 Subject: [PATCH 1/5] Support for meeting APIs --- .../core/teams/teams_activity_extensions.py | 23 ++++- .../botbuilder/core/teams/teams_info.py | 46 +++++++++ .../tests/teams/test_teams_extension.py | 11 +++ .../tests/teams/test_teams_info.py | 21 +++- .../botbuilder/schema/teams/__init__.py | 4 + .../botbuilder/schema/teams/_models_py3.py | 97 ++++++++++++++++++- .../teams/operations/teams_operations.py | 71 ++++++++++++++ 7 files changed, 270 insertions(+), 3 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_extensions.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_extensions.py index 23d907e09..cb4ba9cfc 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_extensions.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_extensions.py @@ -2,7 +2,17 @@ # Licensed under the MIT License. from botbuilder.schema import Activity -from botbuilder.schema.teams import NotificationInfo, TeamsChannelData, TeamInfo +from botbuilder.schema.teams import NotificationInfo, TeamsChannelData, TeamInfo, TeamsMeetingInfo + + +def teams_get_channel_data(activity: Activity) -> TeamsChannelData: + if not activity: + return None + + if activity.channel_data: + return TeamsChannelData().deserialize(activity.channel_data) + + return None def teams_get_channel_id(activity: Activity) -> str: @@ -37,3 +47,14 @@ def teams_notify_user(activity: Activity): channel_data = TeamsChannelData().deserialize(activity.channel_data) channel_data.notification = NotificationInfo(alert=True) activity.channel_data = channel_data + + +def teams_get_meeting_info(activity: Activity) -> TeamsMeetingInfo: + if not activity: + return None + + if activity.channel_data: + channel_data = TeamsChannelData().deserialize(activity.channel_data) + return channel_data.meeting + + return None diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index e781f4696..6ec654a70 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -3,6 +3,11 @@ from typing import List, Tuple from botbuilder.schema import ConversationParameters, ConversationReference + +from botbuilder.core.teams.teams_activity_extensions import ( + teams_get_meeting_info, + teams_get_channel_data, +) from botbuilder.core.turn_context import Activity, TurnContext from botbuilder.schema.teams import ( ChannelInfo, @@ -10,6 +15,7 @@ TeamsChannelData, TeamsChannelAccount, TeamsPagedMembersResult, + TeamsParticipantChannelAccount, ) from botframework.connector.aio import ConnectorClient from botframework.connector.teams.teams_connector_client import TeamsConnectorClient @@ -177,6 +183,46 @@ async def get_member( return await TeamsInfo.get_team_member(turn_context, team_id, member_id) + @staticmethod + async def get_meeting_participant( + turn_context: TurnContext, + meeting_id: str = None, + participant_id: str = None, + tenant_id: str = None, + ) -> TeamsParticipantChannelAccount: + meeting_id = ( + meeting_id + if meeting_id + else teams_get_meeting_info(turn_context.activity).id + ) + if meeting_id is None: + raise TypeError( + "TeamsInfo._get_meeting_participant: method requires a meeting_id" + ) + + participant_id = ( + participant_id + if participant_id + else turn_context.activity.from_property.aad_object_id + ) + if participant_id is None: + raise TypeError( + "TeamsInfo._get_meeting_participant: method requires a participant_id" + ) + + tenant_id = ( + tenant_id + if tenant_id + else teams_get_channel_data(turn_context.activity).tenant.id + ) + if tenant_id is None: + raise TypeError( + "TeamsInfo._get_meeting_participant: method requires a tenant_id" + ) + + connector_client = await TeamsInfo.get_teams_connector_client(turn_context) + return connector_client.teams.fetch_participant(meeting_id, participant_id, tenant_id) + @staticmethod async def get_teams_connector_client( turn_context: TurnContext, diff --git a/libraries/botbuilder-core/tests/teams/test_teams_extension.py b/libraries/botbuilder-core/tests/teams/test_teams_extension.py index e4ebb4449..98c1ee829 100644 --- a/libraries/botbuilder-core/tests/teams/test_teams_extension.py +++ b/libraries/botbuilder-core/tests/teams/test_teams_extension.py @@ -10,6 +10,7 @@ teams_get_team_info, teams_notify_user, ) +from botbuilder.core.teams.teams_activity_extensions import teams_get_meeting_info class TestTeamsActivityHandler(aiounittest.AsyncTestCase): @@ -149,3 +150,13 @@ def test_teams_notify_user_with_no_channel_data(self): # Assert assert activity.channel_data.notification.alert assert activity.id == "id123" + + def test_teams_meeting_info(self): + # Arrange + activity = Activity(channel_data={"meeting": {"id": "meeting123"}}) + + # Act + meeting_id = teams_get_meeting_info(activity).id + + # Assert + assert meeting_id == "meeting123" diff --git a/libraries/botbuilder-core/tests/teams/test_teams_info.py b/libraries/botbuilder-core/tests/teams/test_teams_info.py index 9ddc5662c..d0693b930 100644 --- a/libraries/botbuilder-core/tests/teams/test_teams_info.py +++ b/libraries/botbuilder-core/tests/teams/test_teams_info.py @@ -2,7 +2,8 @@ # Licensed under the MIT License. import aiounittest - +from botbuilder.schema.teams import TeamsChannelData, TeamsMeetingInfo, TenantInfo +from botframework.connector import Channels from botbuilder.core import TurnContext, MessageFactory from botbuilder.core.teams import TeamsInfo, TeamsActivityHandler @@ -199,6 +200,24 @@ def create_conversation(): else: assert False, "should have raise TypeError" + async def test_get_participant(self): + adapter = SimpleAdapterWithCreateConversation() + + activity = Activity( + type="message", + text="Test-get_participant", + channel_id=Channels.ms_teams, + from_property=ChannelAccount( + aad_object_id="participantId-1" + ), + channel_data={"meeting": {"id": "meetingId-1"}, "tenant": {"id": "tenantId-1"}}, + service_url="https://test.coffee" + ) + + turn_context = TurnContext(adapter, activity) + handler = TeamsActivityHandler() + await handler.on_turn(turn_context) + class TestTeamsActivityHandler(TeamsActivityHandler): async def on_turn(self, turn_context: TurnContext): diff --git a/libraries/botbuilder-schema/botbuilder/schema/teams/__init__.py b/libraries/botbuilder-schema/botbuilder/schema/teams/__init__.py index a6d384feb..99e4771e7 100644 --- a/libraries/botbuilder-schema/botbuilder/schema/teams/__init__.py +++ b/libraries/botbuilder-schema/botbuilder/schema/teams/__init__.py @@ -58,6 +58,8 @@ from ._models_py3 import TeamsChannelData from ._models_py3 import TeamsPagedMembersResult from ._models_py3 import TenantInfo +from ._models_py3 import TeamsMeetingInfo +from ._models_py3 import TeamsParticipantChannelAccount __all__ = [ "AppBasedLinkQuery", @@ -117,4 +119,6 @@ "TeamsChannelData", "TeamsPagedMembersResult", "TenantInfo", + "TeamsMeetingInfo", + "TeamsParticipantChannelAccount", ] diff --git a/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py b/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py index 3a27e5c51..b75eb70fd 100644 --- a/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py +++ b/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. from msrest.serialization import Model -from botbuilder.schema import Activity, Attachment, ChannelAccount, PagedMembersResult +from botbuilder.schema import Activity, Attachment, ChannelAccount, PagedMembersResult, ConversationAccount class TaskModuleRequest(Model): @@ -1887,6 +1887,8 @@ class TeamsChannelData(Model): :type notification: ~botframework.connector.teams.models.NotificationInfo :param tenant: Information about the tenant in which the message was sent :type tenant: ~botframework.connector.teams.models.TenantInfo + :param meeting: Information about the meeting in which the message was sent + :type meeting: ~botframework.connector.teams.models.TeamsMeetingInfo """ _attribute_map = { @@ -1895,6 +1897,7 @@ class TeamsChannelData(Model): "team": {"key": "team", "type": "TeamInfo"}, "notification": {"key": "notification", "type": "NotificationInfo"}, "tenant": {"key": "tenant", "type": "TenantInfo"}, + "meeting": {"key": "meeting", "type": "TeamsMeetingInfo"}, } def __init__( @@ -1905,6 +1908,7 @@ def __init__( team=None, notification=None, tenant=None, + meeting=None, **kwargs ) -> None: super(TeamsChannelData, self).__init__(**kwargs) @@ -1914,6 +1918,7 @@ def __init__( self.team = team self.notification = notification self.tenant = tenant + self.meeting = meeting class TenantInfo(Model): @@ -1930,3 +1935,93 @@ class TenantInfo(Model): def __init__(self, *, id: str = None, **kwargs) -> None: super(TenantInfo, self).__init__(**kwargs) self.id = id + + +class TeamsMeetingInfo(Model): + """Describes a Teams Meeting. + + :param id: Unique identifier representing a meeting + :type id: str + """ + + _attribute_map = { + "id": {"key": "id", "type": "str"}, + } + + def __init__(self, *, id: str = None, **kwargs) -> None: + super(TeamsMeetingInfo, self).__init__(**kwargs) + self.id = id + + +class TeamsParticipantChannelAccount(TeamsChannelAccount): + """Teams participant channel account detailing user Azure Active Directory and meeting participant details. + + :param id: Channel id for the user or bot on this channel. + :type id: str + :param name: Display friendly name. + :type name: str + :param given_name: Given name part of the user name. + :type given_name: str + :param surname: Surname part of the user name. + :type surname: str + :param email: Email of the user. + :type email: str + :param user_principal_name: Unique user principal name. + :type user_principal_name: str + :param tenant_id: TenantId of the user. + :type tenant_id: str + :param user_role: UserRole of the user. + :type user_role: str + :param meeting_role: Role of the participant in the current meeting. + :type meeting_role: str + :param in_meeting: True, if the participant is in the meeting. + :type in_meeting: str + :param conversation: Conversation Account for the meeting. + :type conversation: str + """ + + _attribute_map = { + "id": {"key": "id", "type": "str"}, + "name": {"key": "name", "type": "str"}, + "given_name": {"key": "givenName", "type": "str"}, + "surname": {"key": "surname", "type": "str"}, + "email": {"key": "email", "type": "str"}, + "aad_object_id": {"key": "objectId", "type": "str"}, + "user_principal_name": {"key": "userPrincipalName", "type": "str"}, + "tenant_id": {"key": "tenantId", "type": "str"}, + "user_role": {"key": "userRole", "type": "str"}, + "meeting_role": {"key": "meetingRole", "type": "str"}, + "in_meeting": {"key": "inMeeting", "type": "bool"}, + "conversation": {"key": "conversation", "type": "ConversationAccount"}, + } + + def __init__( + self, + *, + id: str = None, + name: str = None, + given_name: str = None, + surname: str = None, + email: str = None, + aad_object_id: str = None, + user_principal_name: str = None, + tenant_id: str = None, + user_role: str = None, + meeting_role: str = None, + in_meeting: bool = None, + conversation: ConversationAccount = None, + **kwargs + ) -> None: + super(TeamsParticipantChannelAccount, self).__init__(**kwargs) + self.id = id + self.name = name + self.given_name = given_name + self.surname = surname + self.email = email + self.aad_object_id = aad_object_id + self.user_principal_name = user_principal_name + self.tenant_id = tenant_id + self.user_role = user_role + self.meeting_role = meeting_role + self.in_meeting = in_meeting + self.conversation = conversation diff --git a/libraries/botframework-connector/botframework/connector/teams/operations/teams_operations.py b/libraries/botframework-connector/botframework/connector/teams/operations/teams_operations.py index e6a2d909d..29238a6fd 100644 --- a/libraries/botframework-connector/botframework/connector/teams/operations/teams_operations.py +++ b/libraries/botframework-connector/botframework/connector/teams/operations/teams_operations.py @@ -145,3 +145,74 @@ def get_team_details( return deserialized get_team_details.metadata = {"url": "/v3/teams/{teamId}"} + + def fetch_participant( + self, + meeting_id: str, + participant_id: str, + tenant_id: str, + custom_headers=None, + raw=False, + **operation_config + ): + """Fetches Teams meeting participant details. + + :param meeting_id: Teams meeting id + :type meeting_id: str + :param participant_id: Teams meeting participant id + :type participant_id: str + :param tenant_id: Teams meeting tenant id + :type tenant_id: str + :param dict custom_headers: headers that will be added to the request + :param bool raw: returns the direct response alongside the + deserialized response + :param operation_config: :ref:`Operation configuration + overrides`. + :return: TeamsParticipantChannelAccount or ClientRawResponse if raw=true + :rtype: ~botframework.connector.teams.models.TeamsParticipantChannelAccount or + ~msrest.pipeline.ClientRawResponse + :raises: + :class:`HttpOperationError` + """ + + # Construct URL + url = self.fetch_participant.metadata["url"] + path_format_arguments = { + "meetingId": self._serialize.url("meeting_id", meeting_id, "str"), + "participantId": self._serialize.url( + "participant_id", participant_id, "str" + ), + "tenantId": self._serialize.url("tenant_id", tenant_id, "str"), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + + # Construct headers + header_parameters = {} + header_parameters["Accept"] = "application/json" + if custom_headers: + header_parameters.update(custom_headers) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + response = self._client.send(request, stream=False, **operation_config) + + if response.status_code not in [200]: + raise HttpOperationError(self._deserialize, response) + + deserialized = None + + if response.status_code == 200: + deserialized = self._deserialize("TeamsParticipantChannelAccount", response) + + if raw: + client_raw_response = ClientRawResponse(deserialized, response) + return client_raw_response + + return deserialized + + fetch_participant.metadata = { + "url": "/v1/meetings/{meetingId}/participants/{participantId}?tenantId={tenantId}" + } From 6c4e1dfe463e21341023510ee045c902af314b57 Mon Sep 17 00:00:00 2001 From: tracyboehrer Date: Mon, 19 Oct 2020 12:44:44 -0500 Subject: [PATCH 2/5] black --- .../core/teams/teams_activity_extensions.py | 7 ++++++- .../botbuilder/core/teams/teams_info.py | 4 +++- .../botbuilder-core/tests/teams/test_teams_info.py | 11 ++++++----- .../botbuilder/schema/teams/_models_py3.py | 8 +++++++- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_extensions.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_extensions.py index cb4ba9cfc..54aac62be 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_extensions.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_extensions.py @@ -2,7 +2,12 @@ # Licensed under the MIT License. from botbuilder.schema import Activity -from botbuilder.schema.teams import NotificationInfo, TeamsChannelData, TeamInfo, TeamsMeetingInfo +from botbuilder.schema.teams import ( + NotificationInfo, + TeamsChannelData, + TeamInfo, + TeamsMeetingInfo, +) def teams_get_channel_data(activity: Activity) -> TeamsChannelData: diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index 6ec654a70..280e817b2 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -221,7 +221,9 @@ async def get_meeting_participant( ) connector_client = await TeamsInfo.get_teams_connector_client(turn_context) - return connector_client.teams.fetch_participant(meeting_id, participant_id, tenant_id) + return connector_client.teams.fetch_participant( + meeting_id, participant_id, tenant_id + ) @staticmethod async def get_teams_connector_client( diff --git a/libraries/botbuilder-core/tests/teams/test_teams_info.py b/libraries/botbuilder-core/tests/teams/test_teams_info.py index d0693b930..bcf59f1c6 100644 --- a/libraries/botbuilder-core/tests/teams/test_teams_info.py +++ b/libraries/botbuilder-core/tests/teams/test_teams_info.py @@ -207,11 +207,12 @@ async def test_get_participant(self): type="message", text="Test-get_participant", channel_id=Channels.ms_teams, - from_property=ChannelAccount( - aad_object_id="participantId-1" - ), - channel_data={"meeting": {"id": "meetingId-1"}, "tenant": {"id": "tenantId-1"}}, - service_url="https://test.coffee" + from_property=ChannelAccount(aad_object_id="participantId-1"), + channel_data={ + "meeting": {"id": "meetingId-1"}, + "tenant": {"id": "tenantId-1"}, + }, + service_url="https://test.coffee", ) turn_context = TurnContext(adapter, activity) diff --git a/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py b/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py index b75eb70fd..2c6bedc1f 100644 --- a/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py +++ b/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py @@ -2,7 +2,13 @@ # Licensed under the MIT License. from msrest.serialization import Model -from botbuilder.schema import Activity, Attachment, ChannelAccount, PagedMembersResult, ConversationAccount +from botbuilder.schema import ( + Activity, + Attachment, + ChannelAccount, + PagedMembersResult, + ConversationAccount, +) class TaskModuleRequest(Model): From 899a325e0c301a73f5819a74fdc547a8692ca5d9 Mon Sep 17 00:00:00 2001 From: tracyboehrer Date: Mon, 19 Oct 2020 13:16:23 -0500 Subject: [PATCH 3/5] pylint --- .../botbuilder-core/botbuilder/core/teams/teams_info.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index 280e817b2..3bbfd60af 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -2,8 +2,10 @@ # Licensed under the MIT License. from typing import List, Tuple -from botbuilder.schema import ConversationParameters, ConversationReference +from botframework.connector.aio import ConnectorClient +from botframework.connector.teams.teams_connector_client import TeamsConnectorClient +from botbuilder.schema import ConversationParameters, ConversationReference from botbuilder.core.teams.teams_activity_extensions import ( teams_get_meeting_info, teams_get_channel_data, @@ -17,8 +19,6 @@ TeamsPagedMembersResult, TeamsParticipantChannelAccount, ) -from botframework.connector.aio import ConnectorClient -from botframework.connector.teams.teams_connector_client import TeamsConnectorClient class TeamsInfo: From 07948f4bf7ebd6edf5beeb0ed7b9dcb62450caf4 Mon Sep 17 00:00:00 2001 From: tracyboehrer Date: Mon, 19 Oct 2020 13:30:11 -0500 Subject: [PATCH 4/5] More pylint --- libraries/botbuilder-core/tests/teams/test_teams_info.py | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/botbuilder-core/tests/teams/test_teams_info.py b/libraries/botbuilder-core/tests/teams/test_teams_info.py index bcf59f1c6..5c044e6ca 100644 --- a/libraries/botbuilder-core/tests/teams/test_teams_info.py +++ b/libraries/botbuilder-core/tests/teams/test_teams_info.py @@ -2,7 +2,6 @@ # Licensed under the MIT License. import aiounittest -from botbuilder.schema.teams import TeamsChannelData, TeamsMeetingInfo, TenantInfo from botframework.connector import Channels from botbuilder.core import TurnContext, MessageFactory From 7f482393ca25eb2658c551d4275cf91dc7036e63 Mon Sep 17 00:00:00 2001 From: tracyboehrer Date: Wed, 21 Oct 2020 13:36:25 -0500 Subject: [PATCH 5/5] Latest meeting participant API --- .../botbuilder/core/teams/teams_info.py | 4 +- .../botbuilder/schema/teams/__init__.py | 6 +- .../botbuilder/schema/teams/_models_py3.py | 90 +++++++------------ .../teams/operations/teams_operations.py | 4 +- 4 files changed, 41 insertions(+), 63 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py index 3bbfd60af..6533f38d6 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_info.py @@ -17,7 +17,7 @@ TeamsChannelData, TeamsChannelAccount, TeamsPagedMembersResult, - TeamsParticipantChannelAccount, + TeamsMeetingParticipant, ) @@ -189,7 +189,7 @@ async def get_meeting_participant( meeting_id: str = None, participant_id: str = None, tenant_id: str = None, - ) -> TeamsParticipantChannelAccount: + ) -> TeamsMeetingParticipant: meeting_id = ( meeting_id if meeting_id diff --git a/libraries/botbuilder-schema/botbuilder/schema/teams/__init__.py b/libraries/botbuilder-schema/botbuilder/schema/teams/__init__.py index 99e4771e7..75a454851 100644 --- a/libraries/botbuilder-schema/botbuilder/schema/teams/__init__.py +++ b/libraries/botbuilder-schema/botbuilder/schema/teams/__init__.py @@ -59,7 +59,8 @@ from ._models_py3 import TeamsPagedMembersResult from ._models_py3 import TenantInfo from ._models_py3 import TeamsMeetingInfo -from ._models_py3 import TeamsParticipantChannelAccount +from ._models_py3 import TeamsMeetingParticipant +from ._models_py3 import MeetingParticipantInfo __all__ = [ "AppBasedLinkQuery", @@ -120,5 +121,6 @@ "TeamsPagedMembersResult", "TenantInfo", "TeamsMeetingInfo", - "TeamsParticipantChannelAccount", + "TeamsMeetingParticipant", + "MeetingParticipantInfo", ] diff --git a/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py b/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py index 0ad27d5ba..98214bbd6 100644 --- a/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py +++ b/libraries/botbuilder-schema/botbuilder/schema/teams/_models_py3.py @@ -3,7 +3,6 @@ from msrest.serialization import Model from botbuilder.schema import ( - Activity, Attachment, ChannelAccount, PagedMembersResult, @@ -1970,75 +1969,52 @@ def __init__(self, *, id: str = None, **kwargs) -> None: self.id = id -class TeamsParticipantChannelAccount(TeamsChannelAccount): - """Teams participant channel account detailing user Azure Active Directory and meeting participant details. +class MeetingParticipantInfo(Model): + """Teams meeting participant details. - :param id: Channel id for the user or bot on this channel. - :type id: str - :param name: Display friendly name. - :type name: str - :param given_name: Given name part of the user name. - :type given_name: str - :param surname: Surname part of the user name. - :type surname: str - :param email: Email of the user. - :type email: str - :param user_principal_name: Unique user principal name. - :type user_principal_name: str - :param tenant_id: TenantId of the user. - :type tenant_id: str - :param user_role: UserRole of the user. - :type user_role: str - :param meeting_role: Role of the participant in the current meeting. - :type meeting_role: str + :param role: Role of the participant in the current meeting. + :type role: str :param in_meeting: True, if the participant is in the meeting. - :type in_meeting: str - :param conversation: Conversation Account for the meeting. - :type conversation: str + :type in_meeting: bool """ _attribute_map = { - "id": {"key": "id", "type": "str"}, - "name": {"key": "name", "type": "str"}, - "given_name": {"key": "givenName", "type": "str"}, - "surname": {"key": "surname", "type": "str"}, - "email": {"key": "email", "type": "str"}, - "aad_object_id": {"key": "objectId", "type": "str"}, - "user_principal_name": {"key": "userPrincipalName", "type": "str"}, - "tenant_id": {"key": "tenantId", "type": "str"}, - "user_role": {"key": "userRole", "type": "str"}, - "meeting_role": {"key": "meetingRole", "type": "str"}, + "role": {"key": "role", "type": "str"}, "in_meeting": {"key": "inMeeting", "type": "bool"}, + } + + def __init__(self, *, role: str = None, in_meeting: bool = None, **kwargs) -> None: + super(MeetingParticipantInfo, self).__init__(**kwargs) + self.role = role + self.in_meeting = in_meeting + + +class TeamsMeetingParticipant(Model): + """Teams participant channel account detailing user Azure Active Directory and meeting participant details. + + :param user: Teams Channel Account information for this meeting participant + :type user: TeamsChannelAccount + :param meeting: >Information specific to this participant in the specific meeting. + :type meeting: MeetingParticipantInfo + :param conversation: Conversation Account for the meeting. + :type conversation: ConversationAccount + """ + + _attribute_map = { + "user": {"key": "user", "type": "TeamsChannelAccount"}, + "meeting": {"key": "meeting", "type": "MeetingParticipantInfo"}, "conversation": {"key": "conversation", "type": "ConversationAccount"}, } def __init__( self, *, - id: str = None, - name: str = None, - given_name: str = None, - surname: str = None, - email: str = None, - aad_object_id: str = None, - user_principal_name: str = None, - tenant_id: str = None, - user_role: str = None, - meeting_role: str = None, - in_meeting: bool = None, + user: TeamsChannelAccount = None, + meeting: MeetingParticipantInfo = None, conversation: ConversationAccount = None, **kwargs ) -> None: - super(TeamsParticipantChannelAccount, self).__init__(**kwargs) - self.id = id - self.name = name - self.given_name = given_name - self.surname = surname - self.email = email - self.aad_object_id = aad_object_id - self.user_principal_name = user_principal_name - self.tenant_id = tenant_id - self.user_role = user_role - self.meeting_role = meeting_role - self.in_meeting = in_meeting + super(TeamsMeetingParticipant, self).__init__(**kwargs) + self.user = user + self.meeting = meeting self.conversation = conversation diff --git a/libraries/botframework-connector/botframework/connector/teams/operations/teams_operations.py b/libraries/botframework-connector/botframework/connector/teams/operations/teams_operations.py index 29238a6fd..5c61086b0 100644 --- a/libraries/botframework-connector/botframework/connector/teams/operations/teams_operations.py +++ b/libraries/botframework-connector/botframework/connector/teams/operations/teams_operations.py @@ -168,7 +168,7 @@ def fetch_participant( deserialized response :param operation_config: :ref:`Operation configuration overrides`. - :return: TeamsParticipantChannelAccount or ClientRawResponse if raw=true + :return: TeamsMeetingParticipant or ClientRawResponse if raw=true :rtype: ~botframework.connector.teams.models.TeamsParticipantChannelAccount or ~msrest.pipeline.ClientRawResponse :raises: @@ -205,7 +205,7 @@ def fetch_participant( deserialized = None if response.status_code == 200: - deserialized = self._deserialize("TeamsParticipantChannelAccount", response) + deserialized = self._deserialize("TeamsMeetingParticipant", response) if raw: client_raw_response = ClientRawResponse(deserialized, response)