5
5
6
6
from typing import Any , Generator , List
7
7
8
- from c8y_api .model ._base import CumulocityResource
8
+ from c8y_api .model ._base import CumulocityResource , get_all_by_path
9
9
from c8y_api .model ._util import _QueryUtil
10
10
from c8y_api .model .managedobjects import ManagedObjectUtil , ManagedObject , Device , Availability , DeviceGroup
11
11
@@ -61,6 +61,7 @@ def get_all(
61
61
reverse : bool = None ,
62
62
limit : int = None ,
63
63
page_size : int = 1000 ,
64
+ as_tuples : list [str ] | dict [str , Any ] = None ,
64
65
** kwargs ) -> List [ManagedObject ]:
65
66
""" Query the database for managed objects and return the results
66
67
as list.
@@ -93,6 +94,7 @@ def get_all(
93
94
reverse = reverse ,
94
95
limit = limit ,
95
96
page_size = page_size ,
97
+ as_tuples = as_tuples ,
96
98
** kwargs ))
97
99
98
100
def get_count (
@@ -154,6 +156,7 @@ def select(
154
156
limit : int = None ,
155
157
page_size : int = 1000 ,
156
158
page_number : int = None ,
159
+ as_tuples : list [str ] | dict [str , Any ] = None ,
157
160
** kwargs ) -> Generator [ManagedObject ]:
158
161
""" Query the database for managed objects and iterate over the
159
162
results.
@@ -205,6 +208,10 @@ def select(
205
208
parsed in one chunk). This is a performance related setting.
206
209
page_number (int): Pull a specific page; this effectively disables
207
210
automatic follow-up page retrieval.
211
+ as_tuples: (list[str] or dict[str, Any]): Don't parse ManagedObjects,
212
+ but extract the values at certain JSON paths as tuples; If the path
213
+ is not defined in a result, None is used; Specify a dictionary to
214
+ define proper default values for each path.
208
215
209
216
Returns:
210
217
Generator for ManagedObject instances
@@ -234,6 +241,7 @@ def select(
234
241
limit = limit ,
235
242
page_size = page_size ,
236
243
page_number = page_number ,
244
+ as_tuples = as_tuples ,
237
245
** kwargs )
238
246
239
247
def _prepare_inventory_query (
@@ -336,10 +344,14 @@ def filter_none(**xs):
336
344
337
345
return {query_key : query , ** kwargs }
338
346
339
- def _select (self , parse_fun , device_mode : bool , page_number , limit , ** kwargs ) -> Generator [Any ]:
347
+ def _select (self , parse_fun , device_mode : bool , page_number , limit , as_tuples , ** kwargs ) -> Generator [Any ]:
340
348
"""Generic select function to be used by derived classes as well."""
341
349
base_query = self ._prepare_inventory_query (device_mode , ** kwargs )
342
- return super ()._iterate (base_query , page_number , limit , parse_fun )
350
+ return super ()._iterate (
351
+ base_query ,
352
+ page_number ,
353
+ limit ,
354
+ parse_fun if not as_tuples else (lambda x : get_all_by_path (x , as_tuples )))
343
355
344
356
def create (self , * objects : ManagedObject ):
345
357
"""Create managed objects within the database.
@@ -489,6 +501,7 @@ def select( # noqa (order)
489
501
limit : int = None ,
490
502
page_size : int = 100 ,
491
503
page_number : int = None ,
504
+ as_tuples : list [str ] | dict [str , Any ] = None ,
492
505
** kwargs ,) -> Generator [Device ]:
493
506
# pylint: disable=arguments-differ, arguments-renamed
494
507
""" Query the database for devices and iterate over the results.
@@ -543,6 +556,10 @@ def select( # noqa (order)
543
556
parsed in one chunk). This is a performance related setting.
544
557
page_number (int): Pull a specific page; this effectively disables
545
558
automatic follow-up page retrieval.
559
+ as_tuples: (list[str] or dict[str, Any]): Don't parse Device objects,
560
+ but extract the values at certain JSON paths as tuples; If the path
561
+ is not defined in a result, None is used; Specify a dictionary to
562
+ define proper default values for each path.
546
563
547
564
Returns:
548
565
Generator for Device objects
@@ -571,6 +588,7 @@ def select( # noqa (order)
571
588
limit = limit ,
572
589
page_size = page_size ,
573
590
page_number = page_number ,
591
+ as_tuples = as_tuples ,
574
592
** kwargs )
575
593
576
594
def get_all ( # noqa (changed signature)
@@ -596,6 +614,7 @@ def get_all( # noqa (changed signature)
596
614
limit : int = None ,
597
615
page_size : int = 100 ,
598
616
page_number : int = None ,
617
+ as_tuples : list [str ] | dict [str , Any ] = None ,
599
618
** kwargs ) -> List [Device ]:
600
619
# pylint: disable=arguments-differ, arguments-renamed
601
620
""" Query the database for devices and return the results as list.
@@ -628,6 +647,7 @@ def get_all( # noqa (changed signature)
628
647
limit = limit ,
629
648
page_size = page_size ,
630
649
page_number = page_number ,
650
+ as_tuples = as_tuples ,
631
651
** kwargs ))
632
652
633
653
def get_count ( # noqa (changed signature)
@@ -734,6 +754,7 @@ def select( # noqa (changed signature)
734
754
limit : int = None ,
735
755
page_size : int = 100 ,
736
756
page_number : int = None ,
757
+ as_tuples : list [str ] | dict [str , Any ] = None ,
737
758
** kwargs ) -> Generator [DeviceGroup ]:
738
759
# pylint: disable=arguments-differ, arguments-renamed
739
760
""" Select device groups by various parameters.
@@ -791,6 +812,11 @@ def select( # noqa (changed signature)
791
812
parsed in one chunk). This is a performance related setting.
792
813
page_number (int): Pull a specific page; this effectively disables
793
814
automatic follow-up page retrieval.
815
+ as_tuples: (list[str] or dict[str, Any]): Don't parse DeviceGroup
816
+ objects, but extract the values at certain JSON paths as
817
+ tuples; If the path is not defined in a result, None is used;
818
+ Specify a dictionary to define proper default values for each
819
+ path.
794
820
795
821
Returns:
796
822
Generator of DeviceGroup instances
@@ -827,6 +853,7 @@ def select( # noqa (changed signature)
827
853
limit = limit ,
828
854
page_size = page_size ,
829
855
page_number = page_number ,
856
+ as_tuples = as_tuples ,
830
857
** kwargs )
831
858
832
859
def get_count ( # noqa (changed signature)
@@ -896,7 +923,8 @@ def get_all( # noqa (changed signature)
896
923
limit : int = None ,
897
924
page_size : int = 100 ,
898
925
page_number : int = None ,
899
- ** kwargs ) -> List [DeviceGroup ]:
926
+ as_tuples : list [str ] | dict [str , Any ] = None ,
927
+ ** kwargs ) -> List [DeviceGroup ]:
900
928
# pylint: disable=arguments-differ, arguments-renamed
901
929
""" Select managed objects by various parameters.
902
930
@@ -927,6 +955,7 @@ def get_all( # noqa (changed signature)
927
955
limit = limit ,
928
956
page_size = page_size ,
929
957
page_number = page_number ,
958
+ as_tuples = as_tuples ,
930
959
** kwargs ))
931
960
932
961
def create (self , * groups ):
0 commit comments