From 86b2dd804c35c6054f85d29b342fcea33d42b32a Mon Sep 17 00:00:00 2001 From: vgrem Date: Wed, 3 Apr 2024 19:40:14 +0300 Subject: [PATCH] Model updates for OneDrive API --- examples/sharepoint/lists/clear.py | 2 +- examples/sharepoint/sites/get_basic_props.py | 2 +- examples/sharepoint/webs/get_props.py | 2 +- .../onlinemeetings/online_meeting.py | 17 +++++- office365/onedrive/driveitems/driveItem.py | 12 ++++ .../onedrive/driveitems/retention_label.py | 25 ++++++++ office365/onedrive/workbooks/charts/chart.py | 13 ++++ office365/onedrive/workbooks/icon.py | 5 ++ .../onedrive/workbooks/names/named_item.py | 6 ++ office365/onedrive/workbooks/ranges/font.py | 5 ++ office365/onedrive/workbooks/ranges/format.py | 60 +++++++++++++++++++ office365/onedrive/workbooks/ranges/range.py | 12 ++++ .../onedrive/workbooks/ranges/reference.py | 6 ++ office365/onedrive/workbooks/sort_field.py | 26 ++++++++ .../tables/pivot_table_collection.py | 16 +++++ .../worksheets/protection_options.py | 3 + .../workbooks/worksheets/worksheet.py | 9 +-- office365/sharepoint/comments/collection.py | 2 +- office365/sharepoint/features/collection.py | 2 + .../permissions/securable_object.py | 2 + .../sharing/object_sharing_information.py | 2 + .../sharing/shared_document_info.py | 9 +++ office365/sharepoint/views/view.py | 2 + office365/sharepoint/webs/web.py | 43 +++++++++++++ tests/communications/test_onlinemeetings.py | 10 +++- 25 files changed, 280 insertions(+), 13 deletions(-) create mode 100644 office365/onedrive/driveitems/retention_label.py create mode 100644 office365/onedrive/workbooks/icon.py create mode 100644 office365/onedrive/workbooks/ranges/font.py create mode 100644 office365/onedrive/workbooks/sort_field.py create mode 100644 office365/onedrive/workbooks/tables/pivot_table_collection.py diff --git a/examples/sharepoint/lists/clear.py b/examples/sharepoint/lists/clear.py index 8e363d1a4..26d1a121a 100644 --- a/examples/sharepoint/lists/clear.py +++ b/examples/sharepoint/lists/clear.py @@ -1,5 +1,5 @@ """ -This example deletes a SharePoint all the list items. +This example deletes all the list items in a list. """ from office365.sharepoint.client_context import ClientContext from tests import test_client_credentials, test_team_site_url diff --git a/examples/sharepoint/sites/get_basic_props.py b/examples/sharepoint/sites/get_basic_props.py index f95ed51a6..6795cd19c 100644 --- a/examples/sharepoint/sites/get_basic_props.py +++ b/examples/sharepoint/sites/get_basic_props.py @@ -2,7 +2,7 @@ Gets site basic properties """ from office365.sharepoint.client_context import ClientContext -from tests import test_client_credentials, test_site_url, test_team_site_url +from tests import test_client_credentials, test_team_site_url client = ClientContext(test_team_site_url).with_credentials(test_client_credentials) site = client.site.get().execute_query() diff --git a/examples/sharepoint/webs/get_props.py b/examples/sharepoint/webs/get_props.py index fca422827..1b14fdc50 100644 --- a/examples/sharepoint/webs/get_props.py +++ b/examples/sharepoint/webs/get_props.py @@ -11,4 +11,4 @@ client = ClientContext(test_site_url).with_credentials(test_client_credentials) web = client.web.get().expand(["Author"]).execute_query() -print(web.author.user_principal_name) +print(web.author) diff --git a/office365/communications/onlinemeetings/online_meeting.py b/office365/communications/onlinemeetings/online_meeting.py index 3f08525e3..641509a91 100644 --- a/office365/communications/onlinemeetings/online_meeting.py +++ b/office365/communications/onlinemeetings/online_meeting.py @@ -4,6 +4,8 @@ from office365.communications.onlinemeetings.participants import MeetingParticipants from office365.entity import Entity from office365.outlook.mail.item_body import ItemBody +from office365.runtime.client_result import ClientResult +from office365.runtime.queries.function import FunctionQuery from office365.runtime.types.collections import StringCollection @@ -13,6 +15,17 @@ class OnlineMeeting(Entity): the attendees list, and the description. """ + def get_virtual_appointment_join_web_url(self): + """Get a join web URL for a Microsoft Virtual Appointment. This web URL includes enhanced + business-to-customer experiences such as mobile browser join and virtual lobby rooms. + With Teams Premium, you can configure a custom lobby room experience for attendees by adding your company + logo and access the Virtual Appointments usage report for organizational analytics. + """ + return_type = ClientResult(self.context, str()) + qry = FunctionQuery(self, "getVirtualAppointmentJoinWebUrl", None, return_type) + self.context.add_query(qry) + return return_type + @property def allow_attendee_to_enable_camera(self): # type: () -> Optional[bool] @@ -74,9 +87,7 @@ def start_datetime(self): @start_datetime.setter def start_datetime(self, value): # type: (datetime) -> None - """ - Sets the meeting start time in UTC. - """ + """Sets the meeting start time in UTC.""" self.set_property("startDateTime", value.isoformat()) @property diff --git a/office365/onedrive/driveitems/driveItem.py b/office365/onedrive/driveitems/driveItem.py index 7c852c553..9aa07082b 100644 --- a/office365/onedrive/driveitems/driveItem.py +++ b/office365/onedrive/driveitems/driveItem.py @@ -22,6 +22,7 @@ from office365.onedrive.driveitems.photo import Photo from office365.onedrive.driveitems.publication_facet import PublicationFacet from office365.onedrive.driveitems.remote_item import RemoteItem +from office365.onedrive.driveitems.retention_label import ItemRetentionLabel from office365.onedrive.driveitems.special_folder import SpecialFolder from office365.onedrive.driveitems.thumbnail_set import ThumbnailSet from office365.onedrive.driveitems.uploadable_properties import ( @@ -785,6 +786,17 @@ def permissions(self): ), ) + @property + def retention_label(self): + # type: () -> ItemRetentionLabel + """Information about retention label and settings enforced on the driveItem.""" + return self.properties.get( + "retentionLabel", + ItemRetentionLabel( + self.context, ResourcePath("retentionLabel", self.resource_path) + ), + ) + @property def publication(self): # type: () -> PublicationFacet diff --git a/office365/onedrive/driveitems/retention_label.py b/office365/onedrive/driveitems/retention_label.py new file mode 100644 index 000000000..8ff365a28 --- /dev/null +++ b/office365/onedrive/driveitems/retention_label.py @@ -0,0 +1,25 @@ +from typing import Optional + +from office365.directory.permissions.identity_set import IdentitySet +from office365.entity import Entity + + +class ItemRetentionLabel(Entity): + """ + Groups retention and compliance-related properties on an item into a single structure. + Currently, supported only for driveItem. + """ + + @property + def is_label_applied_explicitly(self): + # type: () -> Optional[bool] + """Specifies whether the label is applied explicitly on the item. + True indicates that the label is applied explicitly; otherwise, the label is inherited from its parent. + Read-only.""" + return self.properties.get("isLabelAppliedExplicitly", None) + + @property + def label_applied_by(self): + # type: () -> Optional[IdentitySet] + """Identity of the user who applied the label. Read-only.""" + return self.properties.get("labelAppliedBy", IdentitySet()) diff --git a/office365/onedrive/workbooks/charts/chart.py b/office365/onedrive/workbooks/charts/chart.py index fab9fab79..cfcba43d3 100644 --- a/office365/onedrive/workbooks/charts/chart.py +++ b/office365/onedrive/workbooks/charts/chart.py @@ -2,11 +2,24 @@ from office365.onedrive.workbooks.charts.axes import WorkbookChartAxes from office365.onedrive.workbooks.charts.data_labels import WorkbookChartDataLabels from office365.runtime.paths.resource_path import ResourcePath +from office365.runtime.queries.service_operation import ServiceOperationQuery class WorkbookChart(Entity): """Represents a chart object in a workbook.""" + def set_position(self, startCell, endCell): + """Positions the chart relative to cells on the worksheet. + :param str startCell: The start cell. It is where the chart is moved to. The start cell is the top-left or + top-right cell, depending on the user's right-to-left display settings. + :param str endCell: The end cell. If specified, the chart's width and height is set to fully cover up + this cell/range. + """ + payload = {"startCell": startCell, "endCell": endCell} + qry = ServiceOperationQuery(self, "setPosition", None, payload) + self.context.add_query(qry) + return self + @property def axes(self): """Represents chart axes.""" diff --git a/office365/onedrive/workbooks/icon.py b/office365/onedrive/workbooks/icon.py new file mode 100644 index 000000000..84f274bde --- /dev/null +++ b/office365/onedrive/workbooks/icon.py @@ -0,0 +1,5 @@ +from office365.runtime.client_value import ClientValue + + +class WorkbookIcon(ClientValue): + """Represents a cell icon.""" diff --git a/office365/onedrive/workbooks/names/named_item.py b/office365/onedrive/workbooks/names/named_item.py index 0609b6044..fffb3cb2d 100644 --- a/office365/onedrive/workbooks/names/named_item.py +++ b/office365/onedrive/workbooks/names/named_item.py @@ -33,6 +33,12 @@ def comment(self): """Represents the comment associated with this name.""" return self.properties.get("comment", None) + @property + def scope(self): + # type: () -> Optional[str] + """Indicates whether the name is scoped to the workbook or to a specific worksheet.""" + return self.properties.get("scope", None) + @property def worksheet(self): """Returns the worksheet on which the named item is scoped to. Available only if the item is scoped diff --git a/office365/onedrive/workbooks/ranges/font.py b/office365/onedrive/workbooks/ranges/font.py new file mode 100644 index 000000000..7147ab6c8 --- /dev/null +++ b/office365/onedrive/workbooks/ranges/font.py @@ -0,0 +1,5 @@ +from office365.entity import Entity + + +class WorkbookRangeFont(Entity): + """This object represents the font attributes (font name, font size, color, etc.) for an object.""" diff --git a/office365/onedrive/workbooks/ranges/format.py b/office365/onedrive/workbooks/ranges/format.py index a4404b3b1..8b7c45f27 100644 --- a/office365/onedrive/workbooks/ranges/format.py +++ b/office365/onedrive/workbooks/ranges/format.py @@ -1,5 +1,10 @@ +from typing import Optional + from office365.entity import Entity +from office365.entity_collection import EntityCollection +from office365.onedrive.workbooks.ranges.border import WorkbookRangeBorder from office365.onedrive.workbooks.ranges.fill import WorkbookRangeFill +from office365.onedrive.workbooks.ranges.font import WorkbookRangeFont from office365.onedrive.workbooks.ranges.format_protection import ( WorkbookFormatProtection, ) @@ -9,6 +14,53 @@ class WorkbookRangeFormat(Entity): """A format object encapsulating the range's font, fill, borders, alignment, and other properties.""" + @property + def column_width(self): + # type: () -> Optional[float] + """Gets or sets the width of all columns within the range. If the column widths aren't uniform, + null will be returned.""" + return self.properties.get("columnWidth", None) + + @property + def horizontal_alignment(self): + # type: () -> Optional[str] + """Represents the horizontal alignment for the specified object""" + return self.properties.get("horizontalAlignment", None) + + @property + def row_height(self): + # type: () -> Optional[float] + """Gets or sets the height of all rows in the range. If the row heights aren't uniform null will be returned.""" + return self.properties.get("rowHeight", None) + + @property + def vertical_alignment(self): + # type: () -> Optional[str] + """Represents the vertical alignment for the specified object. + Possible values are: Top, Center, Bottom, Justify, Distributed.""" + return self.properties.get("verticalAlignment", None) + + @property + def wrap_text(self): + # type: () -> Optional[bool] + """Indicates if Excel wraps the text in the object. + A null value indicates that the entire range doesn't have uniform wrap setting + """ + return self.properties.get("wrapText", None) + + @property + def borders(self): + # type: () -> EntityCollection[WorkbookRangeBorder] + """Collection of border objects that apply to the overall range selected.""" + return self.properties.get( + "borders", + EntityCollection( + self.context, + WorkbookRangeBorder, + ResourcePath("borders", self.resource_path), + ), + ) + @property def fill(self): """Returns the fill object defined on the overall range""" @@ -17,6 +69,14 @@ def fill(self): WorkbookRangeFill(self.context, ResourcePath("fill", self.resource_path)), ) + @property + def font(self): + """Returns the font object defined on the overall range selected""" + return self.properties.get( + "font", + WorkbookRangeFont(self.context, ResourcePath("font", self.resource_path)), + ) + @property def protection(self): """Returns the format protection object for a range""" diff --git a/office365/onedrive/workbooks/ranges/range.py b/office365/onedrive/workbooks/ranges/range.py index c355f963c..53e15b7a9 100644 --- a/office365/onedrive/workbooks/ranges/range.py +++ b/office365/onedrive/workbooks/ranges/range.py @@ -82,6 +82,18 @@ def column_count(self): """Represents the total number of columns in the range. Read-only.""" return self.properties.get("columnCount", None) + @property + def column_hidden(self): + # type: () -> Optional[bool] + """Represents if all columns of the current range are hidden.""" + return self.properties.get("columnHidden", None) + + @property + def column_index(self): + # type: () -> Optional[int] + """Represents the column number of the first cell in the range. Zero-indexed. Read-only.""" + return self.properties.get("columnIndex", None) + @property def format(self): """Returns a format object, encapsulating the range's font, fill, borders, alignment, and other properties""" diff --git a/office365/onedrive/workbooks/ranges/reference.py b/office365/onedrive/workbooks/ranges/reference.py index a03d3d36f..548ac9843 100644 --- a/office365/onedrive/workbooks/ranges/reference.py +++ b/office365/onedrive/workbooks/ranges/reference.py @@ -3,3 +3,9 @@ class WorkbookRangeReference(ClientValue): """""" + + def __init__(self, address=None): + """ + :param str address: + """ + self.address = address diff --git a/office365/onedrive/workbooks/sort_field.py b/office365/onedrive/workbooks/sort_field.py new file mode 100644 index 000000000..53125251b --- /dev/null +++ b/office365/onedrive/workbooks/sort_field.py @@ -0,0 +1,26 @@ +from office365.onedrive.workbooks.icon import WorkbookIcon +from office365.runtime.client_value import ClientValue + + +class WorkbookSortField(ClientValue): + """Represents a condition in a sorting operation.""" + + def __init__( + self, ascending=None, color=None, dataOption=None, icon=WorkbookIcon(), key=None + ): + """ + :param bool ascending: Represents whether the sorting is done in an ascending fashion. + :param str color: Represents the color that is the target of the condition if the sorting is on font + or cell color. + :param str dataOption: Represents additional sorting options for this field. + Possible values are: Normal, TextAsNumber. + :param WorkbookIcon icon: Represents the icon that is the target of the condition if the sorting + is on the cell's icon. + :param str key: Represents the column (or row, depending on the sort orientation) that the condition is on. + Represented as an offset from the first column (or row). + """ + self.ascending = ascending + self.color = color + self.dataOption = dataOption + self.icon = icon + self.key = key diff --git a/office365/onedrive/workbooks/tables/pivot_table_collection.py b/office365/onedrive/workbooks/tables/pivot_table_collection.py new file mode 100644 index 000000000..85e990ab0 --- /dev/null +++ b/office365/onedrive/workbooks/tables/pivot_table_collection.py @@ -0,0 +1,16 @@ +from office365.entity_collection import EntityCollection +from office365.onedrive.workbooks.tables.pivot_table import WorkbookPivotTable +from office365.runtime.queries.service_operation import ServiceOperationQuery + + +class WorkbookPivotTableCollection(EntityCollection[WorkbookPivotTable]): + def __init__(self, context, resource_path=None): + super(WorkbookPivotTableCollection, self).__init__( + context, WorkbookPivotTable, resource_path + ) + + def refresh_all(self): + """Refreshes the PivotTable.""" + qry = ServiceOperationQuery(self, "refreshAll") + self.context.add_query(qry) + return self diff --git a/office365/onedrive/workbooks/worksheets/protection_options.py b/office365/onedrive/workbooks/worksheets/protection_options.py index 1e0cfcf8a..913a460cf 100644 --- a/office365/onedrive/workbooks/worksheets/protection_options.py +++ b/office365/onedrive/workbooks/worksheets/protection_options.py @@ -7,6 +7,9 @@ class WorkbookWorksheetProtectionOptions(ClientValue): def __init__( self, allowAutoFilter=None, allowDeleteColumns=None, allowDeleteRows=None ): + """ + :param bool allowAutoFilter: + """ self.allowAutoFilter = allowAutoFilter self.allowDeleteColumns = allowDeleteColumns self.allowDeleteRows = allowDeleteRows diff --git a/office365/onedrive/workbooks/worksheets/worksheet.py b/office365/onedrive/workbooks/worksheets/worksheet.py index ae7e74a6b..45e9952c7 100644 --- a/office365/onedrive/workbooks/worksheets/worksheet.py +++ b/office365/onedrive/workbooks/worksheets/worksheet.py @@ -6,7 +6,9 @@ from office365.onedrive.workbooks.names.named_item import WorkbookNamedItem from office365.onedrive.workbooks.ranges.range import WorkbookRange from office365.onedrive.workbooks.tables.collection import WorkbookTableCollection -from office365.onedrive.workbooks.tables.pivot_table import WorkbookPivotTable +from office365.onedrive.workbooks.tables.pivot_table_collection import ( + WorkbookPivotTableCollection, +) from office365.onedrive.workbooks.worksheets.protection import ( WorkbookWorksheetProtection, ) @@ -94,13 +96,12 @@ def tables(self): @property def pivot_tables(self): - # type: () -> EntityCollection[WorkbookPivotTable] + # type: () -> WorkbookPivotTableCollection """Collection of PivotTables that are part of the worksheet.""" return self.properties.get( "pivotTables", - EntityCollection( + WorkbookPivotTableCollection( self.context, - WorkbookPivotTable, ResourcePath("pivotTables", self.resource_path), ), ) diff --git a/office365/sharepoint/comments/collection.py b/office365/sharepoint/comments/collection.py index c1c888805..46ce3ed76 100644 --- a/office365/sharepoint/comments/collection.py +++ b/office365/sharepoint/comments/collection.py @@ -4,7 +4,7 @@ from office365.sharepoint.entity_collection import EntityCollection -class CommentCollection(EntityCollection): +class CommentCollection(EntityCollection[Comment]): def __init__(self, context, resource_path=None): super(CommentCollection, self).__init__(context, Comment, resource_path) diff --git a/office365/sharepoint/features/collection.py b/office365/sharepoint/features/collection.py index dbb779d3e..e473ba524 100644 --- a/office365/sharepoint/features/collection.py +++ b/office365/sharepoint/features/collection.py @@ -11,6 +11,7 @@ def __init__(self, context, resource_path=None, parent=None): super(FeatureCollection, self).__init__(context, Feature, resource_path, parent) def add(self, feature_id, force, featdef_scope, verify_if_activated=False): + # type: (str, bool, int, bool) -> Feature """ Adds the feature to the collection of activated features and returns the added feature. @@ -43,6 +44,7 @@ def _create_if_not_activated(f): return return_type def get_by_id(self, feature_id): + # type: (str) -> Feature """Returns the feature for the given feature identifier. Returns NULL if no feature is available for the given feature identifier. diff --git a/office365/sharepoint/permissions/securable_object.py b/office365/sharepoint/permissions/securable_object.py index 6104dada1..f4263a34e 100644 --- a/office365/sharepoint/permissions/securable_object.py +++ b/office365/sharepoint/permissions/securable_object.py @@ -162,6 +162,7 @@ def has_unique_role_assignments(self): @property def first_unique_ancestor_securable_object(self): + # type: () -> SecurableObject """Specifies the object where role assignments for this object are defined""" return self.properties.get( "FirstUniqueAncestorSecurableObject", @@ -173,6 +174,7 @@ def first_unique_ancestor_securable_object(self): @property def role_assignments(self): + # type: () -> RoleAssignmentCollection """The role assignments for the securable object.""" return self.properties.get( "RoleAssignments", diff --git a/office365/sharepoint/sharing/object_sharing_information.py b/office365/sharepoint/sharing/object_sharing_information.py index e53c54dcb..7eccf3879 100644 --- a/office365/sharepoint/sharing/object_sharing_information.py +++ b/office365/sharepoint/sharing/object_sharing_information.py @@ -241,6 +241,7 @@ def has_permission_levels(self): @property def sharing_links(self): + # type: () -> ClientValueCollection[SharingLinkInfo] """Indicates the collection of all available sharing links for the securable object.""" return self.properties.get( "SharingLinks", ClientValueCollection(SharingLinkInfo) @@ -248,6 +249,7 @@ def sharing_links(self): @property def shared_with_users_collection(self): + # type: () -> EntityCollection[ObjectSharingInformationUser] """A collection of shared with users.""" return self.properties.get( "SharedWithUsersCollection", diff --git a/office365/sharepoint/sharing/shared_document_info.py b/office365/sharepoint/sharing/shared_document_info.py index 3b9b2ce04..5a6d4a44d 100644 --- a/office365/sharepoint/sharing/shared_document_info.py +++ b/office365/sharepoint/sharing/shared_document_info.py @@ -1,3 +1,5 @@ +from typing import Optional + from office365.sharepoint.entity import Entity from office365.sharepoint.sharing.principal import Principal @@ -7,6 +9,7 @@ class SharedDocumentInfo(Entity): @property def activity(self): + # type: () -> Optional[str] """""" return self.properties.get("Activity", None) @@ -15,6 +18,12 @@ def author(self): """""" return self.properties.get("Author", Principal()) + @property + def caller_stack(self): + # type: () -> Optional[str] + """""" + return self.properties.get("CallerStack", None) + @property def entity_type_name(self): return "SP.Sharing.SharedDocumentInfo" diff --git a/office365/sharepoint/views/view.py b/office365/sharepoint/views/view.py index 8e221c004..d9acaa81e 100644 --- a/office365/sharepoint/views/view.py +++ b/office365/sharepoint/views/view.py @@ -172,6 +172,7 @@ def default_view_for_content_type(self): @property def view_fields(self): + # type: () -> ViewFieldCollection """Gets a value that specifies the collection of fields in the list view.""" return self.properties.get( "ViewFields", @@ -199,6 +200,7 @@ def read_only_view(self): @property def server_relative_path(self): + # type: () -> Optional[SPResPath] """Gets the server-relative Path of the View.""" return self.properties.get("ServerRelativePath", SPResPath()) diff --git a/office365/sharepoint/webs/web.py b/office365/sharepoint/webs/web.py index 182a47c9a..e0334a19d 100644 --- a/office365/sharepoint/webs/web.py +++ b/office365/sharepoint/webs/web.py @@ -89,6 +89,7 @@ SiteScriptSerializationResult, ) from office365.sharepoint.sitescripts.utility import SiteScriptUtility +from office365.sharepoint.translation.resource_entry import SPResourceEntry from office365.sharepoint.translation.user_resource import UserResource from office365.sharepoint.types.resource_path import ResourcePath as SPResPath from office365.sharepoint.ui.applicationpages.peoplepicker.web_service_interface import ( @@ -1858,12 +1859,52 @@ def custom_site_actions_disabled(self): # type: () -> Optional[bool] return self.properties.get("CustomSiteActionsDisabled", None) + @property + def description_translations(self): + """""" + return self.properties.get( + "DescriptionTranslations", ClientValueCollection(SPResourceEntry) + ) + + @property + def design_package_id(self): + # type: () -> Optional[str] + """Gets or sets the ID of the Design Package used in this SP.Web. + + A value of Guid.Empty will mean that the default Design Package will be used for this SP.Web. + The default is determined by the SP.WebTemplate of this SP.Web.""" + return self.properties.get("DesignPackageId", None) + + @property + def disable_app_views(self): + # type: () -> Optional[bool] + """""" + return self.properties.get("DisableAppViews", None) + + @property + def disable_flows(self): + # type: () -> Optional[bool] + """""" + return self.properties.get("DisableFlows", None) + @property def id(self): # type: () -> Optional[str] """Specifies the site identifier for the site""" return self.properties.get("Id", None) + @property + def language(self): + # type: () -> Optional[int] + """Specifies the language code identifier (LCID) for the language that is used on the site""" + return self.properties.get("Language", None) + + @property + def last_item_modified_date(self): + # type: () -> Optional[int] + """Specifies when an item was last modified in the site""" + return self.properties.get("LastItemModifiedDate", datetime.datetime.min) + @property def access_requests_list(self): """""" @@ -2421,9 +2462,11 @@ def get_property(self, name, default_value=None): "ClientWebParts": self.client_web_parts, "CurrentUser": self.current_user, "DescriptionResource": self.description_resource, + "DescriptionTranslations": self.description_translations, "EffectiveBasePermissions": self.effective_base_permissions, "EventReceivers": self.event_receivers, "HostedApps": self.hosted_apps, + "LastItemModifiedDate": self.last_item_modified_date, "ListTemplates": self.list_templates, "MultilingualSettings": self.multilingual_settings, "OneDriveSharedItems": self.onedrive_shared_items, diff --git a/tests/communications/test_onlinemeetings.py b/tests/communications/test_onlinemeetings.py index 153b32f2a..9ce338f57 100644 --- a/tests/communications/test_onlinemeetings.py +++ b/tests/communications/test_onlinemeetings.py @@ -31,7 +31,13 @@ def test2_get_meeting(self): ) self.assertIsNotNone(existing_meeting.resource_path) - def test3_update_meeting(self): + # def test3_get_virtual_appointment_join_web_url(self): + # result = ( + # self.__class__.target_meeting.get_virtual_appointment_join_web_url().execute_query() + # ) + # self.assertIsNotNone(result.value) + + def test4_update_meeting(self): now = datetime.now(pytz.utc) update_meeting = self.__class__.target_meeting update_meeting.subject = "Patch Meeting Subject" @@ -39,5 +45,5 @@ def test3_update_meeting(self): update_meeting.end_datetime = now + timedelta(hours=1) update_meeting.update().execute_query() - def test4_delete_meeting(self): + def test5_delete_meeting(self): self.__class__.target_meeting.delete_object().execute_query()