From c6cee86649587fa6507438d53d6586dd19190a6d Mon Sep 17 00:00:00 2001 From: bdunleavy22 <160290912+bdunleavy22@users.noreply.github.com> Date: Wed, 27 Aug 2025 10:46:07 -0500 Subject: [PATCH 1/4] Update ViewService.py Added `get_element_names` parameter to `get_native_view` function --- TM1py/Services/ViewService.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/TM1py/Services/ViewService.py b/TM1py/Services/ViewService.py index 7647cb9b..8101d9c1 100644 --- a/TM1py/Services/ViewService.py +++ b/TM1py/Services/ViewService.py @@ -71,7 +71,7 @@ def get(self, cube_name: str, view_name: str, private: bool = False, **kwargs) - else: return self.get_native_view(cube_name=cube_name, view_name=view_name, private=private) - def get_native_view(self, cube_name: str, view_name: str, private=False, **kwargs) -> NativeView: + def get_native_view(self, cube_name: str, view_name: str, private=False, get_element_names: bool = True, **kwargs) -> NativeView: """ Get a NativeView from TM1 Server :param cube_name: string, name of the cube @@ -81,19 +81,20 @@ def get_native_view(self, cube_name: str, view_name: str, private=False, **kwarg :return: instance of TM1py.NativeView """ view_type = "PrivateViews" if private else "Views" + expand_elements = ',Elements($select=Name)' if get_element_names else '' url = format_url( "/Cubes('{}')/{}('{}')?$expand=" "tm1.NativeView/Rows/Subset($expand=Hierarchy($select=Name;" - "$expand=Dimension($select=Name)),Elements($select=Name);" + "$expand=Dimension($select=Name)){};" "$select=Expression,UniqueName,Name, Alias), " "tm1.NativeView/Columns/Subset($expand=Hierarchy($select=Name;" - "$expand=Dimension($select=Name)),Elements($select=Name);" + "$expand=Dimension($select=Name)){};" "$select=Expression,UniqueName,Name,Alias), " "tm1.NativeView/Titles/Subset($expand=Hierarchy($select=Name;" - "$expand=Dimension($select=Name)),Elements($select=Name);" + "$expand=Dimension($select=Name)){};" "$select=Expression,UniqueName,Name,Alias), " "tm1.NativeView/Titles/Selected($select=Name)", - cube_name, view_type, view_name) + cube_name, view_type, view_name, expand_elements, expand_elements, expand_elements) response = self._rest.GET(url, **kwargs) native_view = NativeView.from_json(response.text, cube_name) return native_view From 75f0493ac92e3c85f449b4b5ab5e0f363dd5195e Mon Sep 17 00:00:00 2001 From: bdunleavy22 <160290912+bdunleavy22@users.noreply.github.com> Date: Wed, 27 Aug 2025 15:26:19 -0500 Subject: [PATCH 2/4] Update ViewService.py --- TM1py/Services/ViewService.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/TM1py/Services/ViewService.py b/TM1py/Services/ViewService.py index 8101d9c1..00327f14 100644 --- a/TM1py/Services/ViewService.py +++ b/TM1py/Services/ViewService.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import collections -from typing import List, Tuple, Union +from typing import List, Tuple, Union, Iterable, Optional from requests import Response @@ -71,7 +71,7 @@ def get(self, cube_name: str, view_name: str, private: bool = False, **kwargs) - else: return self.get_native_view(cube_name=cube_name, view_name=view_name, private=private) - def get_native_view(self, cube_name: str, view_name: str, private=False, get_element_names: bool = True, **kwargs) -> NativeView: + def get_native_view(self, cube_name: str, view_name: str, private=False, element_properties: Optional[Iterable[str]] = ('Name',), **kwargs) -> NativeView: """ Get a NativeView from TM1 Server :param cube_name: string, name of the cube @@ -81,7 +81,13 @@ def get_native_view(self, cube_name: str, view_name: str, private=False, get_ele :return: instance of TM1py.NativeView """ view_type = "PrivateViews" if private else "Views" - expand_elements = ',Elements($select=Name)' if get_element_names else '' + + if element_properties: + element_properties = ",".join(element_properties) + element_properties = f',Elements($select={element_properties})' + else: + element_properties = '' + url = format_url( "/Cubes('{}')/{}('{}')?$expand=" "tm1.NativeView/Rows/Subset($expand=Hierarchy($select=Name;" @@ -94,7 +100,7 @@ def get_native_view(self, cube_name: str, view_name: str, private=False, get_ele "$expand=Dimension($select=Name)){};" "$select=Expression,UniqueName,Name,Alias), " "tm1.NativeView/Titles/Selected($select=Name)", - cube_name, view_type, view_name, expand_elements, expand_elements, expand_elements) + cube_name, view_type, view_name, element_properties, element_properties, element_properties) response = self._rest.GET(url, **kwargs) native_view = NativeView.from_json(response.text, cube_name) return native_view From eab601482927807ebfb512ebef5d4041a8178e80 Mon Sep 17 00:00:00 2001 From: bdunleavy22 <160290912+bdunleavy22@users.noreply.github.com> Date: Wed, 3 Sep 2025 08:00:50 -0500 Subject: [PATCH 3/4] Update ViewService_test.py Added test cases for retrieving different element properties --- Tests/ViewService_test.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/Tests/ViewService_test.py b/Tests/ViewService_test.py index 98283fcb..125cdf1a 100644 --- a/Tests/ViewService_test.py +++ b/Tests/ViewService_test.py @@ -148,23 +148,24 @@ def test_get_all_views(self): self.assertEqual(len(private_views), len(private_view_names)) def test_get_native_view(self): - for private in (True, False): - # generic get - view = self.tm1.views.get( - cube_name=self.cube_name, - view_name=self.native_view_name, - private=private) - - # get native view - native_view = self.tm1.views.get_native_view( - cube_name=self.cube_name, - view_name=self.native_view_name, - private=private) - - self.assertIsInstance(view, NativeView) - self.assertEqual(view.name, self.native_view_name) - self.assertIsInstance(native_view, NativeView) - self.assertEqual(view, native_view) + for element_properties in [(), ('Name',), ('Name', 'Index')]: + for private in (True, False): + # generic get + view = self.tm1.views.get( + cube_name=self.cube_name, + view_name=self.native_view_name, + private=private) + + # get native view + native_view = self.tm1.views.get_native_view( + cube_name=self.cube_name, + view_name=self.native_view_name, + private=private) + + self.assertIsInstance(view, NativeView) + self.assertEqual(view.name, self.native_view_name) + self.assertIsInstance(native_view, NativeView) + self.assertEqual(view, native_view) def test_get_mdx_view(self): for private in (True, False): From ebf096f4cacec226623fd535993d976d78f62fd8 Mon Sep 17 00:00:00 2001 From: bdunleavy22 <160290912+bdunleavy22@users.noreply.github.com> Date: Wed, 3 Sep 2025 08:02:13 -0500 Subject: [PATCH 4/4] Update ViewService.py Added element_properties argument to the generic "get" function. For MDXViews, it is ignored --- TM1py/Services/ViewService.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TM1py/Services/ViewService.py b/TM1py/Services/ViewService.py index 00327f14..75a795dc 100644 --- a/TM1py/Services/ViewService.py +++ b/TM1py/Services/ViewService.py @@ -61,7 +61,7 @@ def exists(self, cube_name: str, view_name: str, private: bool = None, **kwargs) raise e return tuple(view_types.values()) - def get(self, cube_name: str, view_name: str, private: bool = False, **kwargs) -> View: + def get(self, cube_name: str, view_name: str, private: bool = False, element_properties: Optional[Iterable[str]] = ('Name',), **kwargs) -> View: view_type = "PrivateViews" if private else "Views" url = format_url("/Cubes('{}')/{}('{}')?$expand=*", cube_name, view_type, view_name) response = self._rest.GET(url, **kwargs) @@ -69,7 +69,7 @@ def get(self, cube_name: str, view_name: str, private: bool = False, **kwargs) - if "MDX" in view_as_dict: return MDXView(cube_name=cube_name, view_name=view_name, MDX=view_as_dict["MDX"]) else: - return self.get_native_view(cube_name=cube_name, view_name=view_name, private=private) + return self.get_native_view(cube_name=cube_name, view_name=view_name, element_properties=element_properties, private=private) def get_native_view(self, cube_name: str, view_name: str, private=False, element_properties: Optional[Iterable[str]] = ('Name',), **kwargs) -> NativeView: """ Get a NativeView from TM1 Server