From f7cc6691424fff4f08f37b2457247fbe3006bf54 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Oct 2025 23:10:22 +0000 Subject: [PATCH 1/5] Initial plan From 390264822043dacc4afd06d165f059a7ba121f47 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Oct 2025 23:17:53 +0000 Subject: [PATCH 2/5] Change AttachmentLayout from carousel to grid Co-authored-by: heyitsaamir <48929123+heyitsaamir@users.noreply.github.com> --- .../teams/api/activities/message/message.py | 2 +- .../models/attachment/attachment_layout.py | 2 +- .../api/tests/unit/test_attachment_layout.py | 35 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 packages/api/tests/unit/test_attachment_layout.py diff --git a/packages/api/src/microsoft/teams/api/activities/message/message.py b/packages/api/src/microsoft/teams/api/activities/message/message.py index 01af550c..9981bf28 100644 --- a/packages/api/src/microsoft/teams/api/activities/message/message.py +++ b/packages/api/src/microsoft/teams/api/activities/message/message.py @@ -208,7 +208,7 @@ def with_attachment_layout(self, attachment_layout: AttachmentLayout) -> Self: Set the layout hint for multiple attachments. Args: - attachment_layout: Attachment layout (list, carousel) + attachment_layout: Attachment layout (list, grid) Returns: Self for method chaining diff --git a/packages/api/src/microsoft/teams/api/models/attachment/attachment_layout.py b/packages/api/src/microsoft/teams/api/models/attachment/attachment_layout.py index b57a728f..c7a190dc 100644 --- a/packages/api/src/microsoft/teams/api/models/attachment/attachment_layout.py +++ b/packages/api/src/microsoft/teams/api/models/attachment/attachment_layout.py @@ -10,4 +10,4 @@ class AttachmentLayout(str, Enum): """Enum for attachment layout types.""" LIST = "list" - CAROUSEL = "carousel" + GRID = "grid" diff --git a/packages/api/tests/unit/test_attachment_layout.py b/packages/api/tests/unit/test_attachment_layout.py new file mode 100644 index 00000000..05700b4a --- /dev/null +++ b/packages/api/tests/unit/test_attachment_layout.py @@ -0,0 +1,35 @@ +""" +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the MIT License. +""" + +import pytest + +from microsoft.teams.api.models.attachment import AttachmentLayout + + +class TestAttachmentLayout: + """Test suite for AttachmentLayout enum.""" + + def test_attachment_layout_has_list(self): + """Test that AttachmentLayout has LIST value.""" + assert hasattr(AttachmentLayout, "LIST") + assert AttachmentLayout.LIST == "list" + + def test_attachment_layout_has_grid(self): + """Test that AttachmentLayout has GRID value.""" + assert hasattr(AttachmentLayout, "GRID") + assert AttachmentLayout.GRID == "grid" + + def test_attachment_layout_values(self): + """Test that AttachmentLayout has the correct values.""" + values = [layout.value for layout in AttachmentLayout] + assert "list" in values + assert "grid" in values + assert len(values) == 2 + + def test_attachment_layout_does_not_have_carousel(self): + """Test that AttachmentLayout no longer has CAROUSEL value.""" + assert not hasattr(AttachmentLayout, "CAROUSEL") + values = [layout.value for layout in AttachmentLayout] + assert "carousel" not in values From 247f695e247b14a0743d0bd4c8f63d3abf0e1790 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Oct 2025 23:18:58 +0000 Subject: [PATCH 3/5] Format test file with ruff Co-authored-by: heyitsaamir <48929123+heyitsaamir@users.noreply.github.com> --- packages/api/tests/unit/test_attachment_layout.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/api/tests/unit/test_attachment_layout.py b/packages/api/tests/unit/test_attachment_layout.py index 05700b4a..5a6c9184 100644 --- a/packages/api/tests/unit/test_attachment_layout.py +++ b/packages/api/tests/unit/test_attachment_layout.py @@ -3,8 +3,6 @@ Licensed under the MIT License. """ -import pytest - from microsoft.teams.api.models.attachment import AttachmentLayout From 1509aa2118d9eea2c5fb086314e95eebcfd2886a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Oct 2025 23:33:35 +0000 Subject: [PATCH 4/5] Remove test_attachment_layout.py as requested Co-authored-by: heyitsaamir <48929123+heyitsaamir@users.noreply.github.com> --- .../api/tests/unit/test_attachment_layout.py | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 packages/api/tests/unit/test_attachment_layout.py diff --git a/packages/api/tests/unit/test_attachment_layout.py b/packages/api/tests/unit/test_attachment_layout.py deleted file mode 100644 index 5a6c9184..00000000 --- a/packages/api/tests/unit/test_attachment_layout.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the MIT License. -""" - -from microsoft.teams.api.models.attachment import AttachmentLayout - - -class TestAttachmentLayout: - """Test suite for AttachmentLayout enum.""" - - def test_attachment_layout_has_list(self): - """Test that AttachmentLayout has LIST value.""" - assert hasattr(AttachmentLayout, "LIST") - assert AttachmentLayout.LIST == "list" - - def test_attachment_layout_has_grid(self): - """Test that AttachmentLayout has GRID value.""" - assert hasattr(AttachmentLayout, "GRID") - assert AttachmentLayout.GRID == "grid" - - def test_attachment_layout_values(self): - """Test that AttachmentLayout has the correct values.""" - values = [layout.value for layout in AttachmentLayout] - assert "list" in values - assert "grid" in values - assert len(values) == 2 - - def test_attachment_layout_does_not_have_carousel(self): - """Test that AttachmentLayout no longer has CAROUSEL value.""" - assert not hasattr(AttachmentLayout, "CAROUSEL") - values = [layout.value for layout in AttachmentLayout] - assert "carousel" not in values From 37a6a70d0e03aa3268d18bedf37de355a10f9b5b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Oct 2025 03:43:16 +0000 Subject: [PATCH 5/5] Revert AttachmentLayout and create MessagingExtensionAttachmentLayout Co-authored-by: heyitsaamir <48929123+heyitsaamir@users.noreply.github.com> --- .../teams/api/activities/message/message.py | 2 +- .../models/attachment/attachment_layout.py | 2 +- .../models/messaging_extension/__init__.py | 2 ++ .../messaging_extension_attachment_layout.py | 13 ++++++++++ .../messaging_extension_result.py | 4 +-- tests/message-extensions/src/main.py | 26 ++++++++++++++----- 6 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 packages/api/src/microsoft/teams/api/models/messaging_extension/messaging_extension_attachment_layout.py diff --git a/packages/api/src/microsoft/teams/api/activities/message/message.py b/packages/api/src/microsoft/teams/api/activities/message/message.py index 9981bf28..01af550c 100644 --- a/packages/api/src/microsoft/teams/api/activities/message/message.py +++ b/packages/api/src/microsoft/teams/api/activities/message/message.py @@ -208,7 +208,7 @@ def with_attachment_layout(self, attachment_layout: AttachmentLayout) -> Self: Set the layout hint for multiple attachments. Args: - attachment_layout: Attachment layout (list, grid) + attachment_layout: Attachment layout (list, carousel) Returns: Self for method chaining diff --git a/packages/api/src/microsoft/teams/api/models/attachment/attachment_layout.py b/packages/api/src/microsoft/teams/api/models/attachment/attachment_layout.py index c7a190dc..b57a728f 100644 --- a/packages/api/src/microsoft/teams/api/models/attachment/attachment_layout.py +++ b/packages/api/src/microsoft/teams/api/models/attachment/attachment_layout.py @@ -10,4 +10,4 @@ class AttachmentLayout(str, Enum): """Enum for attachment layout types.""" LIST = "list" - GRID = "grid" + CAROUSEL = "carousel" diff --git a/packages/api/src/microsoft/teams/api/models/messaging_extension/__init__.py b/packages/api/src/microsoft/teams/api/models/messaging_extension/__init__.py index a478a446..7a7e1e71 100644 --- a/packages/api/src/microsoft/teams/api/models/messaging_extension/__init__.py +++ b/packages/api/src/microsoft/teams/api/models/messaging_extension/__init__.py @@ -6,6 +6,7 @@ from .messaging_extension_action import MessagingExtensionAction from .messaging_extension_action_response import MessagingExtensionActionResponse from .messaging_extension_attachment import MessagingExtensionAttachment +from .messaging_extension_attachment_layout import MessagingExtensionAttachmentLayout from .messaging_extension_parameter import MessagingExtensionParameter from .messaging_extension_query import MessagingExtensionQuery, MessagingExtensionQueryOptions from .messaging_extension_response import MessagingExtensionResponse @@ -17,6 +18,7 @@ "MessagingExtensionAction", "MessagingExtensionActionResponse", "MessagingExtensionAttachment", + "MessagingExtensionAttachmentLayout", "MessagingExtensionParameter", "MessagingExtensionQuery", "MessagingExtensionQueryOptions", diff --git a/packages/api/src/microsoft/teams/api/models/messaging_extension/messaging_extension_attachment_layout.py b/packages/api/src/microsoft/teams/api/models/messaging_extension/messaging_extension_attachment_layout.py new file mode 100644 index 00000000..81e09782 --- /dev/null +++ b/packages/api/src/microsoft/teams/api/models/messaging_extension/messaging_extension_attachment_layout.py @@ -0,0 +1,13 @@ +""" +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the MIT License. +""" + +from enum import Enum + + +class MessagingExtensionAttachmentLayout(str, Enum): + """Enum for messaging extension attachment layout types.""" + + LIST = "list" + GRID = "grid" diff --git a/packages/api/src/microsoft/teams/api/models/messaging_extension/messaging_extension_result.py b/packages/api/src/microsoft/teams/api/models/messaging_extension/messaging_extension_result.py index 990ebe38..bd0e4d6b 100644 --- a/packages/api/src/microsoft/teams/api/models/messaging_extension/messaging_extension_result.py +++ b/packages/api/src/microsoft/teams/api/models/messaging_extension/messaging_extension_result.py @@ -8,9 +8,9 @@ from typing import List, Optional from ...models.activity import Activity as ActivityBase -from ..attachment.attachment_layout import AttachmentLayout from ..custom_base_model import CustomBaseModel from .messaging_extension_attachment import MessagingExtensionAttachment +from .messaging_extension_attachment_layout import MessagingExtensionAttachmentLayout from .messaging_extension_result_type import MessagingExtensionResultType from .messaging_extension_suggested_action import MessagingExtensionSuggestedAction @@ -20,7 +20,7 @@ class MessagingExtensionResult(CustomBaseModel): Messaging extension result """ - attachment_layout: Optional[AttachmentLayout] = None + attachment_layout: Optional[MessagingExtensionAttachmentLayout] = None "Hint for how to deal with multiple attachments." type: Optional[MessagingExtensionResultType] = None diff --git a/tests/message-extensions/src/main.py b/tests/message-extensions/src/main.py index 1ae46178..9e570a2f 100644 --- a/tests/message-extensions/src/main.py +++ b/tests/message-extensions/src/main.py @@ -29,12 +29,12 @@ card_attachment, ) from microsoft.teams.api.models import ( - AttachmentLayout, CardAction, CardActionType, CardTaskModuleTaskInfo, MessagingExtensionActionInvokeResponse, MessagingExtensionAttachment, + MessagingExtensionAttachmentLayout, MessagingExtensionInvokeResponse, MessagingExtensionResult, MessagingExtensionResultType, @@ -87,7 +87,9 @@ async def handle_message_ext_query_link(ctx: ActivityContext[MessageExtensionQue ) result = MessagingExtensionResult( - type=MessagingExtensionResultType.RESULT, attachment_layout=AttachmentLayout.LIST, attachments=[attachment] + type=MessagingExtensionResultType.RESULT, + attachment_layout=MessagingExtensionAttachmentLayout.LIST, + attachments=[attachment], ) return MessagingExtensionInvokeResponse(compose_extension=result) @@ -110,7 +112,9 @@ async def handle_message_ext_submit(ctx: ActivityContext[MessageExtensionSubmitA ) result = MessagingExtensionResult( - type=MessagingExtensionResultType.RESULT, attachment_layout=AttachmentLayout.LIST, attachments=[attachment] + type=MessagingExtensionResultType.RESULT, + attachment_layout=MessagingExtensionAttachmentLayout.LIST, + attachments=[attachment], ) return MessagingExtensionActionInvokeResponse(compose_extension=result) @@ -154,7 +158,9 @@ async def handle_message_ext_query(ctx: ActivityContext[MessageExtensionQueryInv attachments.append(attachment) result = MessagingExtensionResult( - type=MessagingExtensionResultType.RESULT, attachment_layout=AttachmentLayout.LIST, attachments=attachments + type=MessagingExtensionResultType.RESULT, + attachment_layout=MessagingExtensionAttachmentLayout.LIST, + attachments=attachments, ) return MessagingExtensionInvokeResponse(compose_extension=result) @@ -168,7 +174,9 @@ async def handle_message_ext_select_item(ctx: ActivityContext[MessageExtensionSe await ctx.send(f"Selected item: {option}") result = MessagingExtensionResult( - type=MessagingExtensionResultType.RESULT, attachment_layout=AttachmentLayout.LIST, attachments=[] + type=MessagingExtensionResultType.RESULT, + attachment_layout=MessagingExtensionAttachmentLayout.LIST, + attachments=[], ) return MessagingExtensionInvokeResponse(compose_extension=result) @@ -200,7 +208,9 @@ async def handle_message_ext_setting(ctx: ActivityContext[MessageExtensionSettin if state == "CancelledByUser": result = MessagingExtensionResult( - type=MessagingExtensionResultType.RESULT, attachment_layout=AttachmentLayout.LIST, attachments=[] + type=MessagingExtensionResultType.RESULT, + attachment_layout=MessagingExtensionAttachmentLayout.LIST, + attachments=[], ) return MessagingExtensionInvokeResponse(compose_extension=result) @@ -208,7 +218,9 @@ async def handle_message_ext_setting(ctx: ActivityContext[MessageExtensionSettin await ctx.send(f"Selected option: {selected_option}") result = MessagingExtensionResult( - type=MessagingExtensionResultType.RESULT, attachment_layout=AttachmentLayout.LIST, attachments=[] + type=MessagingExtensionResultType.RESULT, + attachment_layout=MessagingExtensionAttachmentLayout.LIST, + attachments=[], ) return MessagingExtensionInvokeResponse(compose_extension=result)