10000 add get_meeting_info to TeamsInfo (#1704) · marmikreal/botbuilder-python@f5f8c2e · GitHub
[go: up one dir, main page]

Skip to content

Commit f5f8c2e

Browse files
add get_meeting_info to TeamsInfo (microsoft#1704)
* add get_meeting_info to TeamsInfo * black compliance Co-authored-by: tracyboehrer <tracyboehrer@users.noreply.github.com>
1 parent 3612c05 commit f5f8c2e

File tree

5 files changed

+176
-0
lines changed

5 files changed

+176
-0
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from botbuilder.core.turn_context import Activity, TurnContext
1414
from botbuilder.schema.teams import (
1515
ChannelInfo,
16+
MeetingInfo,
1617
TeamDetails,
1718
TeamsChannelData,
1819
TeamsChannelAccount,
@@ -225,6 +226,24 @@ async def get_meeting_participant(
225226
meeting_id, participant_id, tenant_id
226227
)
227228

229+
@staticmethod
230+
async def get_meeting_info(
231+
turn_context: TurnContext, meeting_id: str = None
232+
) -> MeetingInfo:
233+
meeting_id = (
234+
meeting_id
235+
if meeting_id
236+
else teams_get_meeting_info(turn_context.activity).id
237+
)
238+
if meeting_id is None:
239+
raise TypeError(
240+
"TeamsInfo._get_meeting_participant: method requires a meeting_id or "
241+
"TurnContext that contains a meeting id"
242+
)
243+
244+
connector_client = await TeamsInfo.get_teams_connector_client(turn_context)
245+
return connector_client.teams.fetch_meeting(meeting_id)
246+
228247
@staticmethod
229248
async def get_teams_connector_client(
230249
turn_context: TurnContext,

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,22 @@ async def test_get_participant(self):
218218
handler = TeamsActivityHandler()
219219
await handler.on_turn(turn_context)
220220

221+
async def test_get_meeting_info(self):
222+
adapter = SimpleAdapterWithCreateConversation()
223+
224+
activity = Activity(
225+
type="message",
226+
text="Test-get_meeting_info",
227+
channel_id=Channels.ms_teams,
228+
from_property=ChannelAccount(aad_object_id="participantId-1"),
229+
channel_data={"meeting": {"id": "meetingId-1"}},
230+
service_url="https://test.coffee",
231+
)
232+
233+
turn_context = TurnContext(adapter, activity)
234+
handler = TeamsActivityHandler()
235+
await handler.on_turn(turn_context)
236+
221237

222238
class TestTeamsActivityHandler(TeamsActivityHandler):
223239
async def on_turn(self, turn_context: TurnContext):

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from ._models_py3 import FileDownloadInfo
1010
from ._models_py3 import FileInfoCard
1111
from ._models_py3 import FileUploadInfo
12+
from ._models_py3 import MeetingDetails
13+
from ._models_py3 import MeetingInfo
1214
from ._models_py3 import MessageActionsPayload
1315
from ._models_py3 import MessageActionsPayloadApp
1416
from ._models_py3 import MessageActionsPayloadAttachment
@@ -83,6 +85,8 @@
8385
"FileDownloadInfo",
8486
"FileInfoCard",
8587
"FileUploadInfo",
88+
"MeetingDetails",
89+
"MeetingInfo",
8690
"MessageActionsPayload",
8791
"MessageActionsPayloadApp",
8892
"MessageActionsPayloadAttachment",

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

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2370,3 +2370,85 @@ def __init__(self, *, value=None, **kwargs) -> None:
23702370

23712371
def _custom_init(self):
23722372
return
2373+
2374+
2375+
class MeetingDetails(Model):
2376+
"""Specific details of a Teams meeting.
2377+
2378+
:param id: The meeting's Id, encoded as a BASE64 string.
2379+
:type id: str
2380+
:param ms_graph_resource_id: The MsGraphResourceId, used specifically for MS Graph API calls.
2381+
:type ms_graph_resource_id: str
2382+
:param scheduled_start_time: The meeting's scheduled start time, in UTC.
2383+
:type scheduled_start_time: str
2384+
:param scheduled_end_time: The meeting's scheduled end time, in UTC.
2385+
:type scheduled_end_time: str
2386+
:param join_url: The URL used to join the meeting.
2387+
:type join_url: str
2388+
:param title: The title of the meeting.
2389+
:type title: str
2390+
:param type: The meeting's type.
2391+
:type type: str
2392+
"""
2393+
2394+
_attribute_map = {
2395+
"id": {"key": "uniqueId", "type": "str"},
2396+
"ms_graph_resource_id": {"key": "msGraphResourceId", "type": "str"},
2397+
"scheduled_start_time": {"key": "scheduledStartTime", "type": "str"},
2398+
"scheduled_end_time": {"key": "scheduledEndTime", "type": "str"},
2399+
"join_url": {"key": "joinUrl", "type": "str"},
2400+
"title": {"key": "title", "type": "str"},
2401+
"type": {"key": "type", "type": "str"},
2402+
}
2403+
2404+
def __init__(
2405+
self,
2406+
*,
2407+
id: str = None,
2408+
ms_graph_resource_id: str = None,
2409+
scheduled_start_time: str = None,
2410+
scheduled_end_time: str = None,
2411+
join_url: str = None,
2412+
title: str = None,
2413+
type: str = None,
2414+
**kwargs
2415+
) -> None:
2416+
super(MeetingDetails, self).__init__(**kwargs)
2417+
self.id = id
2418+
self.ms_graph_resource_id = ms_graph_resource_id
2419+
self.scheduled_start_time = scheduled_start_time
2420+
self.scheduled_end_time = scheduled_end_time
2421+
self.join_url = join_url
2422+
self.title = title
2423+
self.type = type
2424+
2425+
2426+
class MeetingInfo(Model):
2427+
"""General information about a Teams meeting.
2428+
2429+
:param details: The specific details of a Teams meeting.
2430+
:type details: ~botframework.connector.teams.models.MeetingDetails
2431+
:param conversation: The Conversation Account for the meeting.
2432+
:type conversation: ~botbuilder.schema.models.ConversationAccount
2433+
:param organizer: The meeting's scheduled start time, in UTC.
2434+
:type organizer: ~botbuilder.schema.models.TeamsChannelAccount
2435+
"""
2436+
2437+
_attribute_map = {
2438+
"details": {"key": "details", "type": "object"},
2439+
"conversation": {"key": "conversation", "type": "object"},
2440+
"organizer": {"key": "organizer", "type": "object"},
2441+
}
2442+
2443+
def __init__(
2444+
self,
2445+
*,
2446+
details: MeetingDetails = None,
2447+
conversation: ConversationAccount = None,
2448+
organizer: TeamsChannelAccount = None,
2449+
**kwargs
2450+
) -> None:
2451+
super(MeetingInfo, self).__init__(**kwargs)
2452+
self.details = details
2453+
self.conversation = conversation
2454+
self.organizer = organizer

libraries/botframework-connector/botframework/connector/teams/operations/teams_operations.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,58 @@ def fetch_participant(
212212
fetch_participant.metadata = {
213213
"url": "/v1/meetings/{meetingId}/participants/{participantId}?tenantId={tenantId}"
214214
}
215+
216+
def fetch_meeting(
217+
self, meeting_id: str, custom_headers=None, raw=False, **operation_config
218+
):
219+
"""Fetch meeting information.
220+
221+
:param meeting_id: Meeting Id, encoded as a BASE64 string.
222+
:type meeting_id: str
223+
:param dict custom_headers: headers that will be added to the request
224+
:param bool raw: returns the direct response alongside the
225+
deserialized response
226+
:param operation_config: :ref:`Operation configuration
227+
overrides<msrest:optionsforoperations>`.
228+
:return: MeetingInfo or ClientRawResponse if raw=true
229+
:rtype: ~botframework.connector.teams.models.MeetingInfo or
230+
~msrest.pipeline.ClientRawResponse
231+
:raises:
232+
:class:`HttpOperationError<msrest.exceptions.HttpOperationError>`
233+
"""
234+
235+
# Construct URL
236+
url = self.fetch_participant.metadata["url"]
237+
path_format_arguments = {
238+
"meetingId": self._serialize.url("meeting_id", meeting_id, "str")
239+
}
240+
url = self._client.format_url(url, **path_format_arguments)
241+
242+
# Construct parameters
243+
query_parameters = {}
244+
245+
# Construct headers
246+
header_parameters = {}
247+
header_parameters["Accept"] = "application/json"
248+
if custom_headers:
249+
header_parameters.update(custom_headers)
250+
251+
# Construct and send request
252+
request = self._client.get(url, query_parameters, header_parameters)
253+
response = self._client.send(request, stream=False, **operation_config)
254+
255+
if response.status_code not in [200]:
256+
raise HttpOperationError(self._deserialize, response)
257+
258+
deserialized = None
259+
260+
if response.status_code == 200:
261+
deserialized = self._deserialize("MeetingInfo", response)
262+
263+
if raw:
264+
client_raw_response = ClientRawResponse(deserialized, response)
265+
return client_raw_response
266+
267+
return deserialized
268+
269+
fetch_participant.metadata = {"url": "/v1/meetings/{meetingId}"}

0 commit comments

Comments
 (0)
0