qe-api-client 2.8.0__py3-none-any.whl → 3.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
qe_api_client/engine.py CHANGED
@@ -12,6 +12,8 @@ import qe_api_client.structs as structs
12
12
  import math
13
13
  import pandas as pd
14
14
  import numpy as np
15
+ from datetime import datetime, timezone
16
+ import time
15
17
 
16
18
 
17
19
  class QixEngine:
@@ -451,6 +453,266 @@ class QixEngine:
451
453
  return chart
452
454
 
453
455
 
456
+ def create_snapshot(self, app_handle: int, object_id: str, snapshot_title: str = "", snapshot_description: str = "",
457
+ show_titles: bool = True, object_width: float = 1280, object_height: float = 720, bounding_client_width: float = 1280,
458
+ bounding_client_height: float = 720, rtl: bool = False, parent_width: float = 1280, parent_height: float = 720,
459
+ content_width: float = 1280, content_height: float = 720, chart_data_scroll_offset_start: int = 0,
460
+ chart_data_scroll_offset_end: int = 53, chart_data_legend_scroll_offset: int = 0, chart_data_zoom_min = 0,
461
+ chart_data_zoom_max = 0):
462
+ """
463
+ Creates a snapshot object.
464
+
465
+ Parameters:
466
+ app_handle (int): The handle of the app.
467
+ object_id (str): The id of the object.
468
+ snapshot_title (str): The title of the snapshot.
469
+ snapshot_description (str): The description of the snapshot.
470
+ show_titles (bool): Enables / disables chart title.
471
+ object_width (float): The width of the snapshot object.
472
+ object_height (float): The height of the snapshot object.
473
+ bounding_client_width (float): The width of the bounding client.
474
+ bounding_client_height (float): The height of the bounding client.
475
+ rtl (bool): Controls the rendering of content with right-to-left (RTL) language support.
476
+ parent_width (float): The width of the parent object.
477
+ parent_height (float): The height of the parent object.
478
+ content_width (float): The width of the content object.
479
+ content_height (float): The height of the content object.
480
+ chart_data_scroll_offset_start (int): Scroll offset start.
481
+ chart_data_scroll_offset_end (int): Scroll offset end.
482
+ chart_data_legend_scroll_offset (int): Legend scroll offset.
483
+ chart_data_zoom_min: Minimum chart data zoom.
484
+ chart_data_zoom_max: Maximum chart data zoom.
485
+
486
+ Returns:
487
+ dict: The handle and Id of the created snapshot.
488
+ """
489
+ # Get chart object
490
+ chart_obj = self.eaa.get_object(app_handle=app_handle, object_id=object_id)
491
+ chart_obj_handle = self.get_handle(chart_obj)
492
+
493
+ # Get sheet object
494
+ sheet_obj = self.get_object_sheet(app_handle=app_handle, obj_id=object_id)
495
+ sheet_id = self.get_id(sheet_obj)
496
+
497
+ # Get the visualization type
498
+ chart_obj_layout = self.egoa.get_layout(handle=chart_obj_handle)
499
+ visualization = chart_obj_layout["visualization"]
500
+
501
+ # Attribut "qInfo" changed
502
+ chart_obj_layout["qInfo"] = {"qType": "snapshot"}
503
+
504
+ # Attribut "showTitles" changed
505
+ chart_obj_layout["showTitles"] = show_titles
506
+
507
+ # Attribut "qMetaDef" added
508
+ chart_obj_layout["qMetaDef"] = {"title": snapshot_title, "description": snapshot_description}
509
+
510
+ # Attribut "creationDate" added
511
+ chart_obj_layout["creationDate"] = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
512
+
513
+ # Attribut "permissions" added
514
+ chart_obj_layout["permissions"] = {"update": True, "publish": False, "export": False, "exportData": True,
515
+ "changeOwner": False, "remove": True}
516
+
517
+ # Attribut "visualizationType" added
518
+ chart_obj_layout["visualizationType"] = visualization
519
+
520
+ # Attribut "sourceObjectId" added
521
+ chart_obj_layout["sourceObjectId"] = object_id
522
+
523
+ # Attribut "sheetId" added
524
+ chart_obj_layout["sheetId"] = sheet_id
525
+
526
+ # Attribut "timestamp" added
527
+ chart_obj_layout["timestamp"] = int(time.time() * 1000)
528
+
529
+ # Attribut "isClone" added
530
+ chart_obj_layout["isClone"] = False
531
+
532
+ # Attribut "supportExport" added
533
+ chart_obj_layout["supportExport"] = True
534
+
535
+ # Attribut "qIncludeVariables" added
536
+ chart_obj_layout["qIncludeVariables"] = True
537
+
538
+ # Build the special snapshot parameters for the different chart types.
539
+ if visualization in ["pivot-table"]:
540
+ # Attribut "snapshotData" added
541
+ chart_obj_layout["snapshotData"] = {
542
+ "object": {
543
+ "size": {
544
+ "w": object_width,
545
+ "h": object_height,
546
+ "boundingClientWidth": bounding_client_width,
547
+ "boundingClientHeight": bounding_client_height
548
+ }
549
+ },
550
+ "rtl": rtl,
551
+ "parent": {
552
+ "h": parent_height,
553
+ "w": parent_width
554
+ }
555
+ }
556
+
557
+ elif visualization in ["sn-table"]:
558
+ # Attribut "snapshotData" added
559
+ chart_obj_layout["snapshotData"] = {
560
+ "object": {
561
+ "size": {
562
+ "w": object_width,
563
+ "h": object_height,
564
+ "boundingClientWidth": bounding_client_width,
565
+ "boundingClientHeight": bounding_client_height
566
+ }
567
+ },
568
+ "rtl": rtl,
569
+ "content": {
570
+ "scrollLeft": 0,
571
+ "visibleLeft": 0,
572
+ "visibleWidth": 6,
573
+ "visibleTop": 0,
574
+ "visibleHeight": 18,
575
+ "rowsPerPage": 18,
576
+ "page": 0,
577
+ "size": {
578
+ "width": object_width,
579
+ "height": object_height
580
+ },
581
+ "estimatedRowHeight": 25
582
+ },
583
+ "parent": {
584
+ "h": parent_height,
585
+ "w": parent_width
586
+ }
587
+ }
588
+
589
+ elif visualization in ["sn-pivot-table"]:
590
+ # Attribut "snapshotData" added
591
+ chart_obj_layout["snapshotData"] = {
592
+ "object": {
593
+ "size": {
594
+ "w": object_width,
595
+ "h": object_height,
596
+ "boundingClientWidth": bounding_client_width,
597
+ "boundingClientHeight": bounding_client_height
598
+ }
599
+ },
600
+ "rtl": rtl,
601
+ "content": {
602
+ "qPivotDataPages": chart_obj_layout["qHyperCube"]["qPivotDataPages"],
603
+ "scrollTop": 0,
604
+ "scrollLeft": 0,
605
+ "leftGridScrollLeft": 0,
606
+ "topGridScrollTop": 0,
607
+ "page": 0,
608
+ "rowsPerPage": 15000
609
+ },
610
+ "parent": {
611
+ "h": parent_height,
612
+ "w": parent_width
613
+ }
614
+ }
615
+
616
+ elif visualization in ["combochart", "barchart"]:
617
+ # Attribut "snapshotData" added
618
+ chart_obj_layout["snapshotData"] = {
619
+ "object": {
620
+ "size": {
621
+ "w": object_width,
622
+ "h": object_height,
623
+ "boundingClientWidth": bounding_client_width,
624
+ "boundingClientHeight": bounding_client_height
625
+ }
626
+ },
627
+ "rtl": rtl,
628
+ "content": {
629
+ "size": {
630
+ "w": content_width,
631
+ "h": content_height
632
+ },
633
+ "chartData": {
634
+ "scrollOffset": {
635
+ "start": chart_data_scroll_offset_start,
636
+ "end": chart_data_scroll_offset_end
637
+ },
638
+ "legendScrollOffset": chart_data_legend_scroll_offset
639
+ }
640
+ },
641
+ "parent": {
642
+ "h": parent_height,
643
+ "w": parent_width
644
+ }
645
+ }
646
+
647
+ elif visualization in ["linechart"]:
648
+ # Attribut "snapshotData" added
649
+ chart_obj_layout["snapshotData"] = {
650
+ "object": {
651
+ "size": {
652
+ "w": object_width,
653
+ "h": object_height,
654
+ "boundingClientWidth": bounding_client_width,
655
+ "boundingClientHeight": bounding_client_height
656
+ }
657
+ },
658
+ "rtl": rtl,
659
+ "content": {
660
+ "size": {
661
+ "w": content_width,
662
+ "h": content_height
663
+ },
664
+ "chartData": {
665
+ "zoom": {
666
+ "min": chart_data_zoom_min,
667
+ "max": chart_data_zoom_max
668
+ }
669
+ }
670
+ },
671
+ "parent": {
672
+ "h": parent_height,
673
+ "w": parent_width
674
+ }
675
+ }
676
+
677
+ else:
678
+ print("Chart type not supported.")
679
+
680
+ # Create snapshot
681
+ snapshot = self.eaa.create_bookmark(doc_handle=app_handle, prop=chart_obj_layout)
682
+ snapshot.update({"visualization": visualization})
683
+
684
+ return snapshot
685
+
686
+
687
+ def embed_snapshot(self, app_handle: int, snapshot_id: str, slide_id: str):
688
+ """
689
+ Embeds a created snapshot object on a slide.
690
+
691
+ Parameters:
692
+ app_handle (int): The handle of the app.
693
+ snapshot_id (str): The id of the snapshot.
694
+ slide_id (str): The id of the slide to embed.
695
+ """
696
+ # Get the slide, where the snapshot should be embeded.
697
+ slide = self.eaa.get_object(app_handle=app_handle, object_id=slide_id)
698
+ slide_handle = self.get_handle(slide)
699
+
700
+ # Get the visualization type of the snapshot
701
+ snapshot = self.eaa.get_bookmark(app_handle=app_handle, bookmark_id=snapshot_id)
702
+ snapshot_handle = self.get_handle(snapshot)
703
+ snapshot_layout = self.egoa.get_layout(handle=snapshot_handle)
704
+ visualization_type = snapshot_layout["visualizationType"]
705
+
706
+ # create the snapshot
707
+ slideitem_snapshot_properties = self.structs.slideitem_snapshot_properties(snapshot_id=snapshot_id,
708
+ visualization_type=visualization_type)
709
+ slideitem_snapshot = self.egoa.create_child(handle=slide_handle, prop=slideitem_snapshot_properties)
710
+ slideitem_snapshot_handle = self.get_handle(slideitem_snapshot)
711
+
712
+ slideitem_snapshot_embeded = self.egoa.embed_snapshot_object(handle=slideitem_snapshot_handle,
713
+ snapshot_id=snapshot_id)
714
+
715
+
454
716
  def get_app_lineage_info(self, app_handle):
455
717
  """
456
718
  Gets the lineage information of the app. The lineage information includes the LOAD and STORE statements from
@@ -500,19 +762,60 @@ class QixEngine:
500
762
 
501
763
  Parameters:
502
764
  obj : dict
503
- The object containing the handle.
765
+ The object containing the id.
504
766
 
505
767
  Returns:
506
- int: The handle value.
768
+ int: The id value.
507
769
 
508
770
  Raises:
509
- ValueError: If the handle value is invalid.
771
+ ValueError: If the id value is invalid.
510
772
  """
511
773
  try:
512
774
  return obj["qGenericId"]
513
775
  except ValueError:
514
776
  return "Bad id value in " + obj
515
777
 
778
+ @staticmethod
779
+ def get_type(obj):
780
+ """
781
+ Retrieves the type from a given object.
782
+
783
+ Parameters:
784
+ obj : dict
785
+ The object containing the type.
786
+
787
+ Returns:
788
+ int: The type value.
789
+
790
+ Raises:
791
+ ValueError: If the type value is invalid.
792
+ """
793
+ try:
794
+ return obj["qGenericType"]
795
+ except ValueError:
796
+ return "Bad type value in " + obj
797
+
798
+
799
+ def get_object_sheet(self, app_handle: int, obj_id: str):
800
+ """
801
+ Retrieves the sheet from a given chart object.
802
+
803
+ Parameters:
804
+ app_handle (int): The handle of the app.
805
+ obj_id (str): The ID of the object.
806
+
807
+ Returns:
808
+ dict: The sheet object with handle and id.
809
+ """
810
+ parent_obj = self.eaa.get_object(app_handle=app_handle, object_id=obj_id)
811
+ while self.get_type(parent_obj) != "sheet":
812
+ obj = parent_obj
813
+ obj_handle = self.get_handle(obj)
814
+ parent_obj = self.egoa.get_parent(handle=obj_handle)
815
+
816
+ return parent_obj
817
+
818
+
516
819
  def get_chart_data(self, app_handle, obj_id):
517
820
  """
518
821
  Retrieves the data from a given chart object.
@@ -569,7 +872,7 @@ class QixEngine:
569
872
  # Retrieves the hypercube data in a loop (because of limitation from 10.000 cells per call)
570
873
  while no_of_rows > page * height:
571
874
  nx_page = self.structs.nx_page(left=0, top=page * height, width=width, height=height)
572
- hc_data = self.egoa.get_hypercube_data(obj_handle, '/qHyperCubeDef', nx_page)[
875
+ hc_data = self.egoa.get_hypercube_data(handle=obj_handle, path='/qHyperCubeDef', pages=[nx_page])[
573
876
  'qDataPages'][0]['qMatrix']
574
877
  data_values.extend(hc_data)
575
878
  page += 1
@@ -613,7 +916,7 @@ class QixEngine:
613
916
 
614
917
  col_headers = []
615
918
  nx_page_top = self.structs.nx_page(left=0, top=0, width=width, height=1)
616
- hc_top = self.egoa.get_hypercube_pivot_data(obj_handle, '/qHyperCubeDef', nx_page_top)['qDataPages'][0]['qTop']
919
+ hc_top = self.egoa.get_hypercube_pivot_data(handle=obj_handle, path='/qHyperCubeDef', pages=[nx_page_top])['qDataPages'][0]['qTop']
617
920
  for top_node in hc_top:
618
921
  col_headers.extend(get_column_paths(top_node))
619
922
 
@@ -627,13 +930,13 @@ class QixEngine:
627
930
  nx_page = self.structs.nx_page(left=0, top=page * height, width=width, height=height)
628
931
 
629
932
  # Retrieves the row headers for the pivot table
630
- hc_left = self.egoa.get_hypercube_pivot_data(obj_handle, '/qHyperCubeDef', nx_page)[
933
+ hc_left = self.egoa.get_hypercube_pivot_data(handle=obj_handle, path='/qHyperCubeDef', pages=[nx_page])[
631
934
  'qDataPages'][0]['qLeft']
632
935
  for left_node in hc_left:
633
936
  row_headers.extend(get_all_dimensions(left_node))
634
937
 
635
938
  # Retrieves the data for the pivot table
636
- hc_data = self.egoa.get_hypercube_pivot_data(obj_handle, '/qHyperCubeDef', nx_page)[
939
+ hc_data = self.egoa.get_hypercube_pivot_data(handle=obj_handle, path='/qHyperCubeDef', pages=[nx_page])[
637
940
  'qDataPages'][0]['qData']
638
941
  for row in hc_data:
639
942
  data_values.append([cell['qText'] for cell in row])
@@ -654,7 +957,7 @@ class QixEngine:
654
957
  elif obj_layout['qInfo']['qType'] in ['barchart'] and obj_layout['qHyperCube']['qStackedDataPages'] != []:
655
958
  max_no_cells = no_of_columns * no_of_rows
656
959
  nx_page = self.structs.nx_page(left=0, top=0, width=no_of_columns, height=no_of_rows)
657
- hc_data = self.egoa.get_hypercube_stack_data(obj_handle, '/qHyperCubeDef', nx_page, max_no_cells)[
960
+ hc_data = self.egoa.get_hypercube_stack_data(handle=obj_handle, path='/qHyperCubeDef', pages=[nx_page], max_no_cells=max_no_cells)[
658
961
  'qDataPages'][0]['qData'][0]['qSubNodes']
659
962
 
660
963
  # Transform the nested structure into a flat DataFrame
@@ -740,7 +1043,7 @@ class QixEngine:
740
1043
  # Retrieves the hypercube data in a loop (because of limitation from 10.000 cells per call)
741
1044
  while no_of_rows > page * height:
742
1045
  nx_page = self.structs.nx_page(left=0, top=page * height, width=width, height=height)
743
- hc_data = self.egoa.get_hypercube_data(hc_obj_handle, '/qHyperCubeDef', nx_page)['qDataPages'][0]['qMatrix']
1046
+ hc_data = self.egoa.get_hypercube_data(handle=hc_obj_handle, path='/qHyperCubeDef', pages=[nx_page])['qDataPages'][0]['qMatrix']
744
1047
  data_values.extend(hc_data)
745
1048
  page += 1
746
1049
 
@@ -1138,6 +1441,950 @@ class QixEngine:
1138
1441
  return df_sheet_list
1139
1442
 
1140
1443
 
1444
+ # def get_object_properties(self, app_handle: int, obj_type: str):
1445
+ # """
1446
+ # Retrieves a list with all metadata of given object.
1447
+ #
1448
+ # Parameters:
1449
+ # app_handle (int): The handle of the app.
1450
+ # obj_type (str): The type of the given object.
1451
+ #
1452
+ # Returns:
1453
+ # DataFrame: A table with all metadata of given object.
1454
+ # """
1455
+ #
1456
+ # # Define the DataFrame structure of filterpane
1457
+ # if obj_type in ["filterpane"]:
1458
+ # df_obj_list = pd.DataFrame(
1459
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "showTitles", "title", "subtitle", "footnote",
1460
+ # "disableNavMenu", "showDetails", "showDetailsExpression", "visualization", "version",
1461
+ # "qChildren"])
1462
+ # # Define the DataFrame structure of listbox
1463
+ # elif obj_type in ["listbox"]:
1464
+ # df_obj_list = pd.DataFrame(
1465
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "qListObjectDef", "showTitles", "title",
1466
+ # "subtitle", "footnote", "disableNavMenu", "showDetails", "showDetailsExpression",
1467
+ # "visualization", "qChildren"])
1468
+ # # Define the DataFrame structure of table
1469
+ # elif obj_type in ["table"]:
1470
+ # df_obj_list = pd.DataFrame(
1471
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "qHyperCubeDef", "script", "search", "showTitles", "title",
1472
+ # "subtitle", "footnote", "disableNavMenu", "showDetails", "showDetailsExpression", "totals",
1473
+ # "scrolling", "multiline", "visualization", "qChildren"])
1474
+ # else:
1475
+ # return "Chart type not supported."
1476
+ #
1477
+ # # Get object data
1478
+ # options = self.structs.options(types=[obj_type])
1479
+ # obj_list = self.eaa.get_objects(app_handle=app_handle, options=options)
1480
+ #
1481
+ # for obj in obj_list:
1482
+ # # Get filterpane ID
1483
+ # obj_id = obj["qInfo"]["qId"]
1484
+ # # Get filterpane object
1485
+ # obj = self.eaa.get_object(app_handle=app_handle, object_id=obj_id)
1486
+ # # Get filterpane handle
1487
+ # obj_handle = self.get_handle(obj)
1488
+ # # Get filterpane full property tree
1489
+ # obj_full_property_tree = self.egoa.get_full_property_tree(handle=obj_handle)
1490
+ #
1491
+ # # Get filterpane properties
1492
+ # obj_props = obj_full_property_tree["qProperty"]
1493
+ # obj_children = obj_full_property_tree["qChildren"]
1494
+ # obj_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in obj_children]
1495
+ # obj_props["qChildren"] = obj_children_ids
1496
+ #
1497
+ # # Concatenate the filterpane metadata to the DataFrame structure
1498
+ # df_obj_list.loc[len(df_obj_list)] = obj_props
1499
+ #
1500
+ #
1501
+ # # Resolve the dictionary structure of attribute "qInfo"
1502
+ # df_obj_list_expanded = (df_obj_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
1503
+ # df_obj_list = df_obj_list.drop(columns=["qInfo"]).join(df_obj_list_expanded)
1504
+ #
1505
+ # if obj_type in ["listbox"]:
1506
+ # # Resolve the dictionary structure of attribute "title"
1507
+ # df_obj_list_expanded = (
1508
+ # df_obj_list["title"].dropna()
1509
+ # # .apply(lambda x: x if isinstance(x, dict) else {})
1510
+ # .apply(pd.Series).add_prefix("title_"))
1511
+ # # df_obj_list_expanded = (
1512
+ # # df_obj_list["title"].dropna()
1513
+ # # .apply(lambda x: x.get("qStringExpression", {}).get("qExpr") if isinstance(x, dict) else x)
1514
+ # # .to_frame("title_qStringExpression")
1515
+ # # )
1516
+ # df_obj_list = df_obj_list.drop(columns=["title"]).join(df_obj_list_expanded)
1517
+ #
1518
+ # # Resolve the dictionary structure of attribute "title_qStringExpression"
1519
+ # df_obj_list_expanded = (
1520
+ # df_obj_list["title_qStringExpression"].dropna()
1521
+ # .apply(pd.Series).add_prefix("title_qStringExpression_"))
1522
+ # df_obj_list = df_obj_list.drop(columns=["title_qStringExpression"]).join(df_obj_list_expanded)
1523
+ #
1524
+ # # Resolve the dictionary structure of attribute "qListObjectDef"
1525
+ # df_obj_list_expanded = (
1526
+ # df_obj_list["qListObjectDef"].dropna().apply(pd.Series).add_prefix("qListObjectDef_"))
1527
+ # df_obj_list = df_obj_list.drop(columns=["qListObjectDef"]).join(df_obj_list_expanded)
1528
+ #
1529
+ # # Resolve the dictionary structure of attribute "qListObjectDef_qDef"
1530
+ # df_obj_list_expanded = (
1531
+ # df_obj_list["qListObjectDef_qDef"].dropna().apply(pd.Series).add_prefix("qListObjectDef_qDef_"))
1532
+ # df_obj_list = df_obj_list.drop(columns=["qListObjectDef_qDef"]).join(df_obj_list_expanded)
1533
+ #
1534
+ # if obj_type in ["table"]:
1535
+ # # Resolve the dictionary structure of attribute "qHyperCubeDef"
1536
+ # df_obj_list_expanded = (
1537
+ # df_obj_list["qHyperCubeDef"].dropna().apply(pd.Series).add_prefix("qHyperCubeDef_"))
1538
+ # df_obj_list = df_obj_list.drop(columns=["qHyperCubeDef"]).join(df_obj_list_expanded)
1539
+ #
1540
+ # # Resolve the dictionary structure of attribute "search"
1541
+ # df_obj_list_expanded = (
1542
+ # df_obj_list["search"].dropna().apply(pd.Series).add_prefix("search_"))
1543
+ # df_obj_list = df_obj_list.drop(columns=["search"]).join(df_obj_list_expanded)
1544
+ #
1545
+ # return df_obj_list
1546
+
1547
+
1548
+ def get_object_type_properties(self, app_obj: dict, obj_type: str):
1549
+ """
1550
+ Retrieves a list with all metadata of given type of objects.
1551
+
1552
+ Parameters:
1553
+ app_obj (dict): The response od the opened app.
1554
+ obj_type (str): The type of the given object.
1555
+
1556
+ Returns:
1557
+ List: A list with all metadata of given type of objects.
1558
+ """
1559
+
1560
+ # Get app handle
1561
+ app_handle = self.get_handle(app_obj)
1562
+ # Get app ID
1563
+ app_id = self.get_id(app_obj)
1564
+ # Get objects structure
1565
+ options = self.structs.options(types=[obj_type])
1566
+ # Get objects per type
1567
+ obj_list = self.eaa.get_objects(app_handle=app_handle, options=options)
1568
+ # Define list variable
1569
+ obj_props_list = []
1570
+
1571
+ # Loop objects from the list
1572
+ for obj in obj_list:
1573
+ # Get object ID
1574
+ obj_id = obj["qInfo"]["qId"]
1575
+ # Get object
1576
+ obj = self.eaa.get_object(app_handle=app_handle, object_id=obj_id)
1577
+ # Get object handle
1578
+ obj_handle = self.get_handle(obj)
1579
+ # Get object full property tree
1580
+ obj_props = self.egoa.get_full_property_tree(handle=obj_handle)
1581
+ # Insert app id
1582
+ obj_props["qDocId"] = app_id
1583
+ # Concatenate object properties to the list
1584
+ obj_props_list.append(obj_props)
1585
+
1586
+ return obj_props_list
1587
+
1588
+
1589
+ # def get_objects_properties(self, app_obj: dict):
1590
+ # """
1591
+ # Retrieves a list with all metadata of all app objects.
1592
+ #
1593
+ # Parameters:
1594
+ # app_obj (dict): The response od the opened app.
1595
+ #
1596
+ # Returns:
1597
+ # List: A list with all metadata of all app objects.
1598
+ # """
1599
+ # app_handle = self.get_handle(app_obj)
1600
+ # app_id = self.get_id(app_obj)
1601
+ #
1602
+ # app_infos = self.eaa.get_all_infos(app_handle=app_handle)
1603
+ #
1604
+ # # Extrahiere alle qId-Werte in eine Liste
1605
+ # obj_id_list = [item["qId"] for item in app_infos]
1606
+ #
1607
+ # obj_props_list = []
1608
+ #
1609
+ # for obj_id in obj_id_list:
1610
+ # obj = self.eaa.get_object(app_handle=app_handle, object_id=obj_id)
1611
+ # obj_handle = self.get_handle(obj)
1612
+ # obj_props = self.egoa.get_full_property_tree(handle=obj_handle)
1613
+ # obj_props["appId"] = app_id
1614
+ # obj_props_list.append(obj_props)
1615
+ #
1616
+ # return obj_props_list
1617
+
1618
+
1619
+ # def get_app_properties(self, app_handle):
1620
+ # """
1621
+ # Retrieves a list with all app property metadata.
1622
+ #
1623
+ # Parameters:
1624
+ # app_handle (int): The handle of the app.
1625
+ #
1626
+ # Returns:
1627
+ # DataFrame: A table with all app property metadata.
1628
+ # """
1629
+ #
1630
+ # # Define the DataFrame structure
1631
+ # df_app_property_list = pd.DataFrame(
1632
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "sheetTitleBgColor", "sheetTitleGradientColor",
1633
+ # "sheetTitleColor", "sheetLogoThumbnail", "sheetLogoPosition", "rtl", "theme", "disableCellNavMenu",
1634
+ # "defaultBookmarkId", "qChildren"])
1635
+ #
1636
+ # # Get app property object data
1637
+ # options = self.structs.options(types=["appprops"])
1638
+ # app_property_list = self.eaa.get_objects(app_handle=app_handle, options=options)
1639
+ #
1640
+ # for app_property in app_property_list:
1641
+ # # Get app property ID
1642
+ # app_property_id = app_property["qInfo"]["qId"]
1643
+ # # Get app property object
1644
+ # app_property_obj = self.eaa.get_object(app_handle=app_handle, object_id=app_property_id)
1645
+ # # Get app property handle
1646
+ # app_property_handle = self.get_handle(app_property_obj)
1647
+ # # Get app property full property tree
1648
+ # app_property_full_property_tree = self.egoa.get_full_property_tree(handle=app_property_handle)
1649
+ #
1650
+ # # Get app property properties
1651
+ # app_property_props = app_property_full_property_tree["qProperty"]
1652
+ # app_property_children = app_property_full_property_tree["qChildren"]
1653
+ # app_property_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in app_property_children]
1654
+ # app_property_props["qChildren"] = app_property_children_ids
1655
+ #
1656
+ # # Concatenate the app property metadata to the DataFrame structure
1657
+ # df_app_property_list.loc[len(df_app_property_list)] = app_property_props
1658
+ #
1659
+ #
1660
+ # # Resolve the dictionary structure of attribute "qInfo"
1661
+ # df_app_property_list_expanded = (df_app_property_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
1662
+ # df_app_property_list = df_app_property_list.drop(columns=["qInfo"]).join(df_app_property_list_expanded)
1663
+ #
1664
+ # # Resolve the dictionary structure of attribute "sheetTitleBgColor"
1665
+ # df_app_property_list_expanded = (df_app_property_list["sheetTitleBgColor"].dropna().apply(pd.Series).add_prefix("sheetTitleBgColor_"))
1666
+ # df_app_property_list = df_app_property_list.drop(columns=["sheetTitleBgColor"]).join(df_app_property_list_expanded)
1667
+ #
1668
+ # # Resolve the dictionary structure of attribute "sheetTitleGradientColor"
1669
+ # df_app_property_list_expanded = (
1670
+ # df_app_property_list["sheetTitleGradientColor"].dropna().apply(pd.Series).add_prefix("sheetTitleGradientColor_"))
1671
+ # df_app_property_list = df_app_property_list.drop(columns=["sheetTitleGradientColor"]).join(
1672
+ # df_app_property_list_expanded)
1673
+ #
1674
+ # # Resolve the dictionary structure of attribute "sheetLogoThumbnail"
1675
+ # df_app_property_list_expanded = (
1676
+ # df_app_property_list["sheetLogoThumbnail"].dropna().apply(pd.Series).add_prefix("sheetLogoThumbnail_"))
1677
+ # df_app_property_list = df_app_property_list.drop(columns=["sheetLogoThumbnail"]).join(
1678
+ # df_app_property_list_expanded)
1679
+ #
1680
+ # return df_app_property_list
1681
+ #
1682
+ #
1683
+ # def get_app_sheet_groups(self, app_handle):
1684
+ # """
1685
+ # Retrieves a list with all app sheet group metadata.
1686
+ #
1687
+ # Parameters:
1688
+ # app_handle (int): The 0handle of the app.
1689
+ #
1690
+ # Returns:
1691
+ # DataFrame: A table with all sheet group metadata from an app.
1692
+ # """
1693
+ #
1694
+ # # Define the DataFrame structure
1695
+ # df_sheet_group_list = pd.DataFrame(
1696
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "rank", "qChildren", "qEmbeddedSnapshotRef"])
1697
+ #
1698
+ # # Get sheet group object data
1699
+ # options = self.structs.options(types=["sheetgroup"])
1700
+ # sheet_group_list = self.eaa.get_objects(app_handle=app_handle, options=options)
1701
+ #
1702
+ # for sheet_group in sheet_group_list:
1703
+ # # Get sheet group ID
1704
+ # sheet_group_id = sheet_group["qInfo"]["qId"]
1705
+ # # Get sheet group object
1706
+ # sheet_group_obj = self.eaa.get_object(app_handle=app_handle, object_id=sheet_group_id)
1707
+ # # Get sheet group handle
1708
+ # sheet_group_handle = self.get_handle(sheet_group_obj)
1709
+ # # Get sheet group full property tree
1710
+ # sheet_group_full_property_tree = self.egoa.get_full_property_tree(handle=sheet_group_handle)
1711
+ #
1712
+ # # Get sheet group properties
1713
+ # sheet_group_props = sheet_group_full_property_tree["qProperty"]
1714
+ # sheet_group_children = sheet_group_full_property_tree["qChildren"]
1715
+ # sheet_group_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in sheet_group_children]
1716
+ # sheet_group_props["qChildren"] = sheet_group_children_ids
1717
+ #
1718
+ # # Concatenate the sheet group metadata to the DataFrame structure
1719
+ # df_sheet_group_list.loc[len(df_sheet_group_list)] = sheet_group_props
1720
+ #
1721
+ #
1722
+ # # Resolve the dictionary structure of attribute "qInfo"
1723
+ # df_sheet_group_list_expanded = (df_sheet_group_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
1724
+ # df_sheet_group_list = df_sheet_group_list.drop(columns=["qInfo"]).join(df_sheet_group_list_expanded)
1725
+ #
1726
+ # # Resolve the dictionary structure of attribute "qMetaDef"
1727
+ # df_sheet_group_list_expanded = (df_sheet_group_list["qMetaDef"].dropna().apply(pd.Series).add_prefix("qMetaDef_"))
1728
+ # df_sheet_group_list = df_sheet_group_list.drop(columns=["qMetaDef"]).join(df_sheet_group_list_expanded)
1729
+ #
1730
+ # return df_sheet_group_list
1731
+ #
1732
+ #
1733
+ # def get_app_sheets(self, app_handle):
1734
+ # """
1735
+ # Retrieves a list with all app sheet metadata.
1736
+ #
1737
+ # Parameters:
1738
+ # app_handle (int): The 0handle of the app.
1739
+ #
1740
+ # Returns:
1741
+ # DataFrame: A table with all sheet metadata from an app.
1742
+ # """
1743
+ #
1744
+ # # Define the DataFrame structure
1745
+ # df_sheet_list = pd.DataFrame(
1746
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "creationDate", "rank", "thumbnail", "columns",
1747
+ # "rows", "cells", "qChildListDef", "customRowBase", "gridResolution", "layoutOptions", "gridMode",
1748
+ # "groupId", "labelExpression", "qChildren"])
1749
+ #
1750
+ # # Get sheet object data
1751
+ # options = self.structs.options(types=["sheet"])
1752
+ # sheet_list = self.eaa.get_objects(app_handle=app_handle, options=options)
1753
+ #
1754
+ # for sheet in sheet_list:
1755
+ # # Get sheet ID
1756
+ # sheet_id = sheet["qInfo"]["qId"]
1757
+ # # Get sheet object
1758
+ # sheet_obj = self.eaa.get_object(app_handle=app_handle, object_id=sheet_id)
1759
+ # # Get sheet handle
1760
+ # sheet_handle = self.get_handle(sheet_obj)
1761
+ # # Get sheet full property tree
1762
+ # sheet_full_property_tree = self.egoa.get_full_property_tree(handle=sheet_handle)
1763
+ #
1764
+ # # Get sheet properties
1765
+ # sheet_props = sheet_full_property_tree["qProperty"]
1766
+ # sheet_children = sheet_full_property_tree["qChildren"]
1767
+ # sheet_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in sheet_children]
1768
+ # sheet_props["qChildren"] = sheet_children_ids
1769
+ #
1770
+ # # Concatenate the sheet metadata to the DataFrame structure
1771
+ # df_sheet_list.loc[len(df_sheet_list)] = sheet_props
1772
+ #
1773
+ #
1774
+ # # Resolve the dictionary structure of attribute "qInfo"
1775
+ # df_sheet_list_expanded = (df_sheet_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
1776
+ # df_sheet_list = df_sheet_list.drop(columns=["qInfo"]).join(df_sheet_list_expanded)
1777
+ #
1778
+ # # Resolve the dictionary structure of attribute "qMetaDef"
1779
+ # df_sheet_list_expanded = (df_sheet_list["qMetaDef"].dropna().apply(pd.Series).add_prefix("qMetaDef_"))
1780
+ # df_sheet_list = df_sheet_list.drop(columns=["qMetaDef"]).join(df_sheet_list_expanded)
1781
+ #
1782
+ # # Resolve the dictionary structure of attribute "thumbnail"
1783
+ # df_sheet_list_expanded = (df_sheet_list["thumbnail"].dropna().apply(pd.Series).add_prefix("thumbnail_"))
1784
+ # df_sheet_list = df_sheet_list.drop(columns=["thumbnail"]).join(df_sheet_list_expanded)
1785
+ #
1786
+ # # Resolve the dictionary structure of attribute "thumbnail_qStaticContentUrlDef"
1787
+ # df_sheet_list_expanded = (df_sheet_list["thumbnail_qStaticContentUrlDef"].dropna().apply(pd.Series).add_prefix("thumbnail_qStaticContentUrlDef_"))
1788
+ # df_sheet_list = df_sheet_list.drop(columns=["thumbnail_qStaticContentUrlDef"]).join(df_sheet_list_expanded)
1789
+ #
1790
+ # # Resolve the dictionary structure of attribute "qChildListDef"
1791
+ # df_sheet_list_expanded = (df_sheet_list["qChildListDef"].dropna().apply(pd.Series).add_prefix("qChildListDef_"))
1792
+ # df_sheet_list = df_sheet_list.drop(columns=["qChildListDef"]).join(df_sheet_list_expanded)
1793
+ #
1794
+ # # Resolve the dictionary structure of attribute "qChildListDef_qData"
1795
+ # df_sheet_list_expanded = (df_sheet_list["qChildListDef_qData"].dropna().apply(pd.Series).add_prefix("qChildListDef_qData_"))
1796
+ # df_sheet_list = df_sheet_list.drop(columns=["qChildListDef_qData"]).join(df_sheet_list_expanded)
1797
+ #
1798
+ # # Resolve the dictionary structure of attribute "layoutOptions"
1799
+ # df_sheet_list_expanded = (df_sheet_list["layoutOptions"].dropna().apply(pd.Series).add_prefix("layoutOptions_"))
1800
+ # df_sheet_list = df_sheet_list.drop(columns=["layoutOptions"]).join(df_sheet_list_expanded)
1801
+ #
1802
+ # return df_sheet_list
1803
+ #
1804
+ #
1805
+ # def get_app_layout_containers(self, app_handle):
1806
+ # """
1807
+ # Retrieves a list with all app layout container metadata.
1808
+ #
1809
+ # Parameters:
1810
+ # app_handle (int): The handle of the app.
1811
+ #
1812
+ # Returns:
1813
+ # DataFrame: A table with all layout container metadata from an app.
1814
+ # """
1815
+ #
1816
+ # # Define the DataFrame structure
1817
+ # df_layout_container_list = pd.DataFrame(
1818
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "objects", "showTitles", "title", "subtitle",
1819
+ # "footnote", "disableNavMenu", "showDetails", "showDetailsExpression", "components",
1820
+ # "constrainToContainer", "showGridLines", "gridRowCount", "gridColumnCount", "snapToGrid",
1821
+ # "visualization", "qChildListDef", "version", "extensionMeta"
1822
+ # "qChildren", "qEmbeddedSnapshotRef"])
1823
+ #
1824
+ # # Get layout container object data
1825
+ # options = self.structs.options(types=["sn-layout-container"])
1826
+ # layout_container_list = self.eaa.get_objects(app_handle=app_handle, options=options)
1827
+ #
1828
+ # for layout_container in layout_container_list:
1829
+ # # Get layout container ID
1830
+ # layout_container_id = layout_container["qInfo"]["qId"]
1831
+ # # Get layout container object
1832
+ # layout_container_obj = self.eaa.get_object(app_handle=app_handle, object_id=layout_container_id)
1833
+ # # Get layout container handle
1834
+ # layout_container_handle = self.get_handle(layout_container_obj)
1835
+ # # Get layout container full property tree
1836
+ # layout_container_full_property_tree = self.egoa.get_full_property_tree(handle=layout_container_handle)
1837
+ #
1838
+ # # Get layout container properties
1839
+ # layout_container_props = layout_container_full_property_tree["qProperty"]
1840
+ # layout_container_children = layout_container_full_property_tree["qChildren"]
1841
+ # layout_container_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in layout_container_children]
1842
+ # layout_container_props["qChildren"] = layout_container_children_ids
1843
+ #
1844
+ # # Concatenate the layout container metadata to the DataFrame structure
1845
+ # df_layout_container_list.loc[len(df_layout_container_list)] = layout_container_props
1846
+ #
1847
+ #
1848
+ # # Resolve the dictionary structure of attribute "qInfo"
1849
+ # df_layout_container_list_expanded = (df_layout_container_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
1850
+ # df_layout_container_list = df_layout_container_list.drop(columns=["qInfo"]).join(df_layout_container_list_expanded)
1851
+ #
1852
+ # # Resolve the dictionary structure of attribute "qChildListDef"
1853
+ # df_layout_container_list_expanded = (
1854
+ # df_layout_container_list["qChildListDef"].dropna().apply(pd.Series).add_prefix("qChildListDef_"))
1855
+ # df_layout_container_list = df_layout_container_list.drop(columns=["qChildListDef"]).join(
1856
+ # df_layout_container_list_expanded)
1857
+ #
1858
+ # # Resolve the dictionary structure of attribute "qChildListDef_qData"
1859
+ # df_layout_container_list_expanded = (
1860
+ # df_layout_container_list["qChildListDef_qData"].dropna().apply(pd.Series).add_prefix("qChildListDef_qData_"))
1861
+ # df_layout_container_list = df_layout_container_list.drop(columns=["qChildListDef_qData"]).join(
1862
+ # df_layout_container_list_expanded)
1863
+ #
1864
+ # return df_layout_container_list
1865
+ #
1866
+ #
1867
+ # def get_app_tabbed_containers(self, app_handle):
1868
+ # """
1869
+ # Retrieves a list with all app tabbed container metadata.
1870
+ #
1871
+ # Parameters:
1872
+ # app_handle (int): The handle of the app.
1873
+ #
1874
+ # Returns:
1875
+ # DataFrame: A table with all tabbed container metadata from an app.
1876
+ # """
1877
+ #
1878
+ # # Define the DataFrame structure
1879
+ # df_tabbed_container_list = pd.DataFrame(
1880
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "objects", "showTitles", "title", "subtitle",
1881
+ # "footnote", "disableNavMenu", "showDetails", "showDetailsExpression", "showTabs", "useDropdown",
1882
+ # "useScrollButton", "showIcons", "orientation", "defaultTabId", "visualization", "qChildListDef",
1883
+ # "components", "fontsUsed", "qChildren", "qEmbeddedSnapshotRef"])
1884
+ #
1885
+ # # Get tabbed container object data
1886
+ # options = self.structs.options(types=["sn-tabbed-container"])
1887
+ # tabbed_container_list = self.eaa.get_objects(app_handle=app_handle, options=options)
1888
+ #
1889
+ # for tabbed_container in tabbed_container_list:
1890
+ # # Get tabbed container ID
1891
+ # tabbed_container_id = tabbed_container["qInfo"]["qId"]
1892
+ # # Get tabbed container object
1893
+ # tabbed_container_obj = self.eaa.get_object(app_handle=app_handle, object_id=tabbed_container_id)
1894
+ # # Get tabbed container handle
1895
+ # tabbed_container_handle = self.get_handle(tabbed_container_obj)
1896
+ # # Get tabbed container full property tree
1897
+ # tabbed_container_full_property_tree = self.egoa.get_full_property_tree(handle=tabbed_container_handle)
1898
+ #
1899
+ # # Get tabbed container properties
1900
+ # tabbed_container_props = tabbed_container_full_property_tree["qProperty"]
1901
+ # tabbed_container_children = tabbed_container_full_property_tree["qChildren"]
1902
+ # tabbed_container_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in tabbed_container_children]
1903
+ # tabbed_container_props["qChildren"] = tabbed_container_children_ids
1904
+ #
1905
+ # # Concatenate the tabbed container metadata to the DataFrame structure
1906
+ # df_tabbed_container_list.loc[len(df_tabbed_container_list)] = tabbed_container_props
1907
+ #
1908
+ #
1909
+ # # Resolve the dictionary structure of attribute "qInfo"
1910
+ # df_tabbed_container_list_expanded = (df_tabbed_container_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
1911
+ # df_tabbed_container_list = df_tabbed_container_list.drop(columns=["qInfo"]).join(df_tabbed_container_list_expanded)
1912
+ #
1913
+ # # Resolve the dictionary structure of attribute "qChildListDef"
1914
+ # df_tabbed_container_list_expanded = (
1915
+ # df_tabbed_container_list["qChildListDef"].dropna().apply(pd.Series).add_prefix("qChildListDef_"))
1916
+ # df_tabbed_container_list = df_tabbed_container_list.drop(columns=["qChildListDef"]).join(
1917
+ # df_tabbed_container_list_expanded)
1918
+ #
1919
+ # # Resolve the dictionary structure of attribute "qChildListDef"
1920
+ # df_tabbed_container_list_expanded = (
1921
+ # df_tabbed_container_list["qChildListDef_qData"].dropna().apply(pd.Series).add_prefix("qChildListDef_qData_"))
1922
+ # df_tabbed_container_list = df_tabbed_container_list.drop(columns=["qChildListDef_qData"]).join(
1923
+ # df_tabbed_container_list_expanded)
1924
+ #
1925
+ # return df_tabbed_container_list
1926
+ #
1927
+ #
1928
+ # def get_app_containers(self, app_handle):
1929
+ # """
1930
+ # Retrieves a list with all app container metadata.
1931
+ #
1932
+ # Parameters:
1933
+ # app_handle (int): The handle of the app.
1934
+ #
1935
+ # Returns:
1936
+ # DataFrame: A table with all container metadata from an app.
1937
+ # """
1938
+ #
1939
+ # # Define the DataFrame structure
1940
+ # df_container_list = pd.DataFrame(
1941
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "children", "showTitles", "title", "subtitle",
1942
+ # "footnote", "disableNavMenu", "showDetails", "showDetailsExpression", "borders", "showTabs", "useDropdown",
1943
+ # "useScrollButton", "showIcons", "activeTab", "defaultTab", "visualization", "qChildListDef",
1944
+ # "supportRefresh", "hasExternalChildren", "qChildren", "qEmbeddedSnapshotRef"])
1945
+ #
1946
+ # # Get container object data
1947
+ # options = self.structs.options(types=["container"])
1948
+ # container_list = self.eaa.get_objects(app_handle=app_handle, options=options)
1949
+ #
1950
+ # for container in container_list:
1951
+ # # Get container ID
1952
+ # container_id = container["qInfo"]["qId"]
1953
+ # # Get container object
1954
+ # container_obj = self.eaa.get_object(app_handle=app_handle, object_id=container_id)
1955
+ # # Get container handle
1956
+ # container_handle = self.get_handle(container_obj)
1957
+ # # Get container full property tree
1958
+ # container_full_property_tree = self.egoa.get_full_property_tree(handle=container_handle)
1959
+ #
1960
+ # # Get container properties
1961
+ # container_props = container_full_property_tree["qProperty"]
1962
+ # container_children = container_full_property_tree["qChildren"]
1963
+ # container_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in container_children]
1964
+ # container_props["qChildren"] = container_children_ids
1965
+ #
1966
+ # # Concatenate the container metadata to the DataFrame structure
1967
+ # df_container_list.loc[len(df_container_list)] = container_props
1968
+ #
1969
+ #
1970
+ # # Resolve the dictionary structure of attribute "qInfo"
1971
+ # df_container_list_expanded = (df_container_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
1972
+ # df_container_list = df_container_list.drop(columns=["qInfo"]).join(df_container_list_expanded)
1973
+ #
1974
+ # # Resolve the dictionary structure of attribute "qChildListDef"
1975
+ # df_container_list_expanded = (
1976
+ # df_container_list["qChildListDef"].dropna().apply(pd.Series).add_prefix("qChildListDef_"))
1977
+ # df_container_list = df_container_list.drop(columns=["qChildListDef"]).join(
1978
+ # df_container_list_expanded)
1979
+ #
1980
+ # # Resolve the dictionary structure of attribute "qChildListDef"
1981
+ # df_container_list_expanded = (
1982
+ # df_container_list["qChildListDef_qData"].dropna().apply(pd.Series).add_prefix("qChildListDef_qData_"))
1983
+ # df_container_list = df_container_list.drop(columns=["qChildListDef_qData"]).join(
1984
+ # df_container_list_expanded)
1985
+ #
1986
+ # return df_container_list
1987
+ #
1988
+ #
1989
+ # def get_app_filterpanes(self, app_handle):
1990
+ # """
1991
+ # Retrieves a list with all app filterpane metadata.
1992
+ #
1993
+ # Parameters:
1994
+ # app_handle (int): The handle of the app.
1995
+ #
1996
+ # Returns:
1997
+ # DataFrame: A table with all filterpane metadata from an app.
1998
+ # """
1999
+ #
2000
+ # # Define the DataFrame structure
2001
+ # df_filterpane_list = pd.DataFrame(
2002
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "showTitles", "title", "subtitle", "footnote",
2003
+ # "disableNavMenu", "showDetails", "showDetailsExpression", "visualization", "version", "qChildren"])
2004
+ #
2005
+ # # Get filterpane object data
2006
+ # options = self.structs.options(types=["filterpane"])
2007
+ # filterpane_list = self.eaa.get_objects(app_handle=app_handle, options=options)
2008
+ #
2009
+ # for filterpane in filterpane_list:
2010
+ # # Get filterpane ID
2011
+ # filterpane_id = filterpane["qInfo"]["qId"]
2012
+ # # Get filterpane object
2013
+ # filterpane_obj = self.eaa.get_object(app_handle=app_handle, object_id=filterpane_id)
2014
+ # # Get filterpane handle
2015
+ # filterpane_handle = self.get_handle(filterpane_obj)
2016
+ # # Get filterpane full property tree
2017
+ # filterpane_full_property_tree = self.egoa.get_full_property_tree(handle=filterpane_handle)
2018
+ #
2019
+ # # Get filterpane properties
2020
+ # filterpane_props = filterpane_full_property_tree["qProperty"]
2021
+ # filterpane_children = filterpane_full_property_tree["qChildren"]
2022
+ # filterpane_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in filterpane_children]
2023
+ # filterpane_props["qChildren"] = filterpane_children_ids
2024
+ #
2025
+ # # Concatenate the filterpane metadata to the DataFrame structure
2026
+ # df_filterpane_list.loc[len(df_filterpane_list)] = filterpane_props
2027
+ #
2028
+ #
2029
+ # # Resolve the dictionary structure of attribute "qInfo"
2030
+ # df_filterpane_list_expanded = (df_filterpane_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
2031
+ # df_filterpane_list = df_filterpane_list.drop(columns=["qInfo"]).join(df_filterpane_list_expanded)
2032
+ #
2033
+ # return df_filterpane_list
2034
+ #
2035
+ #
2036
+ # def get_app_listboxes(self, app_handle):
2037
+ # """
2038
+ # Retrieves a list with all app listbox metadata.
2039
+ #
2040
+ # Parameters:
2041
+ # app_handle (int): The handle of the app.
2042
+ #
2043
+ # Returns:
2044
+ # DataFrame: A table with all listbox metadata from an app.
2045
+ # """
2046
+ #
2047
+ # # Define the DataFrame structure
2048
+ # df_listbox_list = pd.DataFrame(
2049
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "qListObjectDef", "showTitles", "title", "subtitle", "footnote",
2050
+ # "disableNavMenu", "showDetails", "showDetailsExpression", "visualization", "qChildren"])
2051
+ #
2052
+ # # Get listbox object data
2053
+ # options = self.structs.options(types=["listbox"])
2054
+ # listbox_list = self.eaa.get_objects(app_handle=app_handle, options=options)
2055
+ #
2056
+ # for listbox in listbox_list:
2057
+ # # Get listbox ID
2058
+ # listbox_id = listbox["qInfo"]["qId"]
2059
+ # # Get listbox object
2060
+ # listbox_obj = self.eaa.get_object(app_handle=app_handle, object_id=listbox_id)
2061
+ # # Get listbox handle
2062
+ # listbox_handle = self.get_handle(listbox_obj)
2063
+ # # Get listbox full property tree
2064
+ # listbox_full_property_tree = self.egoa.get_full_property_tree(handle=listbox_handle)
2065
+ #
2066
+ # # Get listbox properties
2067
+ # listbox_props = listbox_full_property_tree["qProperty"]
2068
+ # listbox_children = listbox_full_property_tree["qChildren"]
2069
+ # listbox_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in listbox_children]
2070
+ # listbox_props["qChildren"] = listbox_children_ids
2071
+ #
2072
+ # # Concatenate the listbox metadata to the DataFrame structure
2073
+ # df_listbox_list.loc[len(df_listbox_list)] = listbox_props
2074
+ #
2075
+ #
2076
+ # # Resolve the dictionary structure of attribute "qInfo"
2077
+ # df_listbox_list_expanded = (df_listbox_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
2078
+ # df_listbox_list = df_listbox_list.drop(columns=["qInfo"]).join(df_listbox_list_expanded)
2079
+ #
2080
+ # # Resolve the dictionary structure of attribute "qListObjectDef"
2081
+ # df_listbox_list_expanded = (df_listbox_list["qListObjectDef"].dropna().apply(pd.Series).add_prefix("qListObjectDef_"))
2082
+ # df_listbox_list = df_listbox_list.drop(columns=["qListObjectDef"]).join(df_listbox_list_expanded)
2083
+ #
2084
+ # # Resolve the dictionary structure of attribute "qListObjectDef_qDef"
2085
+ # df_listbox_list_expanded = (
2086
+ # df_listbox_list["qListObjectDef_qDef"].dropna().apply(pd.Series).add_prefix("qListObjectDef_qDef_"))
2087
+ # df_listbox_list = df_listbox_list.drop(columns=["qListObjectDef_qDef"]).join(df_listbox_list_expanded)
2088
+ #
2089
+ # return df_listbox_list
2090
+ #
2091
+ #
2092
+ # def get_app_tables(self, app_handle):
2093
+ # """
2094
+ # Retrieves a list with all app table metadata.
2095
+ #
2096
+ # Parameters:
2097
+ # app_handle (int): The handle of the app.
2098
+ #
2099
+ # Returns:
2100
+ # DataFrame: A table with all table metadata from an app.
2101
+ # """
2102
+ #
2103
+ # # Define the DataFrame structure
2104
+ # df_table_list = pd.DataFrame(
2105
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "qHyperCubeDef", "script", "filter", "search",
2106
+ # "showTitles", "title", "subtitle", "footnote", "disableNavMenu", "showDetails",
2107
+ # "showDetailsExpression", "totals", "scrolling", "multiline", "visualization", "qChildren",
2108
+ # "qEmbeddedSnapshotRef"])
2109
+ #
2110
+ # # Get table object data
2111
+ # options = self.structs.options(types=["table"])
2112
+ # table_list = self.eaa.get_objects(app_handle=app_handle, options=options)
2113
+ #
2114
+ # for table in table_list:
2115
+ # # Get table ID
2116
+ # table_id = table["qInfo"]["qId"]
2117
+ # # Get table object
2118
+ # table_obj = self.eaa.get_object(app_handle=app_handle, object_id=table_id)
2119
+ # # Get table handle
2120
+ # table_handle = self.get_handle(table_obj)
2121
+ # # Get table full property tree
2122
+ # table_full_property_tree = self.egoa.get_full_property_tree(handle=table_handle)
2123
+ #
2124
+ # # Get table properties
2125
+ # table_props = table_full_property_tree["qProperty"]
2126
+ # table_children = table_full_property_tree["qChildren"]
2127
+ # table_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in table_children]
2128
+ # table_props["qChildren"] = table_children_ids
2129
+ #
2130
+ # # Concatenate the table metadata to the DataFrame structure
2131
+ # df_table_list.loc[len(df_table_list)] = table_props
2132
+ #
2133
+ #
2134
+ # # Resolve the dictionary structure of attribute "qInfo"
2135
+ # df_table_list_expanded = (df_table_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
2136
+ # df_table_list = df_table_list.drop(columns=["qInfo"]).join(df_table_list_expanded)
2137
+ #
2138
+ # # Resolve the dictionary structure of attribute "qHyperCubeDef"
2139
+ # df_table_list_expanded = (df_table_list["qHyperCubeDef"].dropna().apply(pd.Series).add_prefix("qHyperCubeDef_"))
2140
+ # df_table_list = df_table_list.drop(columns=["qHyperCubeDef"]).join(df_table_list_expanded)
2141
+ #
2142
+ # # Resolve the dictionary structure of attribute "search"
2143
+ # df_table_list_expanded = (df_table_list["search"].dropna().apply(pd.Series).add_prefix("search_"))
2144
+ # df_table_list = df_table_list.drop(columns=["search"]).join(df_table_list_expanded)
2145
+ #
2146
+ # # Resolve the dictionary structure of attribute "totals"
2147
+ # df_table_list_expanded = (df_table_list["totals"].dropna().apply(pd.Series).add_prefix("totals_"))
2148
+ # df_table_list = df_table_list.drop(columns=["totals"]).join(df_table_list_expanded)
2149
+ #
2150
+ # # Resolve the dictionary structure of attribute "scrolling"
2151
+ # df_table_list_expanded = (df_table_list["scrolling"].dropna().apply(pd.Series).add_prefix("scrolling_"))
2152
+ # df_table_list = df_table_list.drop(columns=["scrolling"]).join(df_table_list_expanded)
2153
+ #
2154
+ # # Resolve the dictionary structure of attribute "multiline"
2155
+ # df_table_list_expanded = (df_table_list["multiline"].dropna().apply(pd.Series).add_prefix("multiline_"))
2156
+ # df_table_list = df_table_list.drop(columns=["multiline"]).join(df_table_list_expanded)
2157
+ #
2158
+ # return df_table_list
2159
+ #
2160
+ #
2161
+ # def get_app_pivot_tables(self, app_handle):
2162
+ # """
2163
+ # Retrieves a list with all app pivot table metadata.
2164
+ #
2165
+ # Parameters:
2166
+ # app_handle (int): The handle of the app.
2167
+ #
2168
+ # Returns:
2169
+ # DataFrame: A table with all pivot table metadata from an app.
2170
+ # """
2171
+ #
2172
+ # # Define the DataFrame structure
2173
+ # df_pivot_table_list = pd.DataFrame(
2174
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "qHyperCubeDef", "search", "showTitles", "title",
2175
+ # "subtitle", "footnote", "disableNavMenu", "showDetails", "showDetailsExpression", "visualization",
2176
+ # "qLayoutExclude", "components", "containerChildId", "qChildren", "qEmbeddedSnapshotRef"])
2177
+ #
2178
+ # # Get table object data
2179
+ # options = self.structs.options(types=["pivot-table"])
2180
+ # pivot_table_list = self.eaa.get_objects(app_handle=app_handle, options=options)
2181
+ #
2182
+ # for pivot_table in pivot_table_list:
2183
+ # # Get table ID
2184
+ # pivot_table_id = pivot_table["qInfo"]["qId"]
2185
+ # # Get table object
2186
+ # pivot_table_obj = self.eaa.get_object(app_handle=app_handle, object_id=pivot_table_id)
2187
+ # # Get table handle
2188
+ # pivot_table_handle = self.get_handle(pivot_table_obj)
2189
+ # # Get table full property tree
2190
+ # pivot_table_full_property_tree = self.egoa.get_full_property_tree(handle=pivot_table_handle)
2191
+ #
2192
+ # # Get table properties
2193
+ # pivot_table_props = pivot_table_full_property_tree["qProperty"]
2194
+ # pivot_table_children = pivot_table_full_property_tree["qChildren"]
2195
+ # pivot_table_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in pivot_table_children]
2196
+ # pivot_table_props["qChildren"] = pivot_table_children_ids
2197
+ #
2198
+ # # Concatenate the table metadata to the DataFrame structure
2199
+ # df_pivot_table_list.loc[len(df_pivot_table_list)] = pivot_table_props
2200
+ #
2201
+ #
2202
+ # # Resolve the dictionary structure of attribute "qInfo"
2203
+ # df_pivot_table_list_expanded = (df_pivot_table_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
2204
+ # df_pivot_table_list = df_pivot_table_list.drop(columns=["qInfo"]).join(df_pivot_table_list_expanded)
2205
+ #
2206
+ # # Resolve the dictionary structure of attribute "qHyperCubeDef"
2207
+ # df_pivot_table_list_expanded = (df_pivot_table_list["qHyperCubeDef"].dropna().apply(pd.Series).add_prefix("qHyperCubeDef_"))
2208
+ # df_pivot_table_list = df_pivot_table_list.drop(columns=["qHyperCubeDef"]).join(df_pivot_table_list_expanded)
2209
+ #
2210
+ # # Resolve the dictionary structure of attribute "search"
2211
+ # df_pivot_table_list_expanded = (
2212
+ # df_pivot_table_list["search"].dropna().apply(pd.Series).add_prefix("search_"))
2213
+ # df_pivot_table_list = df_pivot_table_list.drop(columns=["search"]).join(df_pivot_table_list_expanded)
2214
+ #
2215
+ # # Resolve the dictionary structure of attribute "qLayoutExclude"
2216
+ # df_pivot_table_list_expanded = (
2217
+ # df_pivot_table_list["qLayoutExclude"].dropna().apply(pd.Series).add_prefix("qLayoutExclude_"))
2218
+ # df_pivot_table_list = df_pivot_table_list.drop(columns=["qLayoutExclude"]).join(df_pivot_table_list_expanded)
2219
+ #
2220
+ # return df_pivot_table_list
2221
+ #
2222
+ #
2223
+ # def get_app_straight_tables(self, app_handle):
2224
+ # """
2225
+ # Retrieves a list with all app straight table metadata.
2226
+ #
2227
+ # Parameters:
2228
+ # app_handle (int): The handle of the app.
2229
+ #
2230
+ # Returns:
2231
+ # DataFrame: A table with all straight table metadata from an app.
2232
+ # """
2233
+ #
2234
+ # # Define the DataFrame structure
2235
+ # df_straight_table_list = pd.DataFrame(
2236
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "qHyperCubeDef", "showTitles", "title",
2237
+ # "subtitle", "footnote", "disableNavMenu", "showDetails", "showDetailsExpression", "components",
2238
+ # "totals", "usePagination", "enableChartExploration", "chartExploration", "visualization",
2239
+ # "version", "qLayoutExclude", "extensionMeta", "containerChildId", "insideContainer", "childRefId",
2240
+ # "nullValueRepresentation", "qChildren", "qEmbeddedSnapshotRef"])
2241
+ #
2242
+ # # Get table object data
2243
+ # options = self.structs.options(types=["sn-table"])
2244
+ # straight_table_list = self.eaa.get_objects(app_handle=app_handle, options=options)
2245
+ #
2246
+ # for straight_table in straight_table_list:
2247
+ # # Get table ID
2248
+ # straight_table_id = straight_table["qInfo"]["qId"]
2249
+ # # Get table object
2250
+ # straight_table_obj = self.eaa.get_object(app_handle=app_handle, object_id=straight_table_id)
2251
+ # # Get table handle
2252
+ # straight_table_handle = self.get_handle(straight_table_obj)
2253
+ # # Get table full property tree
2254
+ # straight_table_full_property_tree = self.egoa.get_full_property_tree(handle=straight_table_handle)
2255
+ #
2256
+ # # Get table properties
2257
+ # straight_table_props = straight_table_full_property_tree["qProperty"]
2258
+ # straight_table_children = straight_table_full_property_tree["qChildren"]
2259
+ # straight_table_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in straight_table_children]
2260
+ # straight_table_props["qChildren"] = straight_table_children_ids
2261
+ #
2262
+ # # Concatenate the table metadata to the DataFrame structure
2263
+ # df_straight_table_list.loc[len(df_straight_table_list)] = straight_table_props
2264
+ #
2265
+ #
2266
+ # # Resolve the dictionary structure of attribute "qInfo"
2267
+ # df_straight_table_list_expanded = (df_straight_table_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
2268
+ # df_straight_table_list = df_straight_table_list.drop(columns=["qInfo"]).join(df_straight_table_list_expanded)
2269
+ #
2270
+ # # Resolve the dictionary structure of attribute "qHyperCubeDef"
2271
+ # df_straight_table_list_expanded = (df_straight_table_list["qHyperCubeDef"].dropna().apply(pd.Series).add_prefix("qHyperCubeDef_"))
2272
+ # df_straight_table_list = df_straight_table_list.drop(columns=["qHyperCubeDef"]).join(df_straight_table_list_expanded)
2273
+ #
2274
+ # # Resolve the dictionary structure of attribute "footnote"
2275
+ # df_straight_table_list_expanded = (df_straight_table_list["footnote"].dropna().apply(pd.Series).add_prefix("footnote_"))
2276
+ # df_straight_table_list = df_straight_table_list.drop(columns=["footnote"]).join(df_straight_table_list_expanded)
2277
+ #
2278
+ # # Resolve the dictionary structure of attribute "totals"
2279
+ # df_straight_table_list_expanded = (
2280
+ # df_straight_table_list["totals"].dropna().apply(pd.Series).add_prefix("totals_"))
2281
+ # df_straight_table_list = df_straight_table_list.drop(columns=["totals"]).join(df_straight_table_list_expanded)
2282
+ #
2283
+ # # Resolve the dictionary structure of attribute "chartExploration"
2284
+ # df_straight_table_list_expanded = (
2285
+ # df_straight_table_list["chartExploration"].dropna().apply(pd.Series).add_prefix("chartExploration_"))
2286
+ # df_straight_table_list = df_straight_table_list.drop(columns=["chartExploration"]).join(df_straight_table_list_expanded)
2287
+ #
2288
+ # # Resolve the dictionary structure of attribute "qLayoutExclude"
2289
+ # df_straight_table_list_expanded = (df_straight_table_list["qLayoutExclude"].dropna().apply(pd.Series).add_prefix("qLayoutExclude_"))
2290
+ # df_straight_table_list = df_straight_table_list.drop(columns=["qLayoutExclude"]).join(df_straight_table_list_expanded)
2291
+ #
2292
+ # # Resolve the dictionary structure of attribute "extensionMeta"
2293
+ # df_straight_table_list_expanded = (
2294
+ # df_straight_table_list["extensionMeta"].dropna().apply(pd.Series).add_prefix("extensionMeta_"))
2295
+ # df_straight_table_list = df_straight_table_list.drop(columns=["extensionMeta"]).join(
2296
+ # df_straight_table_list_expanded)
2297
+ #
2298
+ # return df_straight_table_list
2299
+ #
2300
+ #
2301
+ # def get_app_new_pivot_tables(self, app_handle):
2302
+ # """
2303
+ # Retrieves a list with all app new pivot table metadata.
2304
+ #
2305
+ # Parameters:
2306
+ # app_handle (int): The handle of the app.
2307
+ #
2308
+ # Returns:
2309
+ # DataFrame: A table with all new pivot table metadata from an app.
2310
+ # """
2311
+ #
2312
+ # # Define the DataFrame structure
2313
+ # df_new_pivot_table_list = pd.DataFrame(
2314
+ # columns=["qInfo", "qExtendsId", "qMetaDef", "qStateName", "qHyperCubeDef", "search", "showTitles", "title",
2315
+ # "subtitle", "footnote", "disableNavMenu", "showDetails", "showDetailsExpression", "visualization",
2316
+ # "qLayoutExclude", "components", "nullValueRepresentation", "version", "extensionMeta",
2317
+ # "containerChildId", "qChildren", "qEmbeddedSnapshotRef"])
2318
+ #
2319
+ # # Get table object data
2320
+ # options = self.structs.options(types=["sn-pivot-table"])
2321
+ # new_pivot_table_list = self.eaa.get_objects(app_handle=app_handle, options=options)
2322
+ #
2323
+ # for new_pivot_table in new_pivot_table_list:
2324
+ # # Get table ID
2325
+ # new_pivot_table_id = new_pivot_table["qInfo"]["qId"]
2326
+ # # Get table object
2327
+ # new_pivot_table_obj = self.eaa.get_object(app_handle=app_handle, object_id=new_pivot_table_id)
2328
+ # # Get table handle
2329
+ # new_pivot_table_handle = self.get_handle(new_pivot_table_obj)
2330
+ # # Get table full property tree
2331
+ # new_pivot_table_full_property_tree = self.egoa.get_full_property_tree(handle=new_pivot_table_handle)
2332
+ #
2333
+ # # Get table properties
2334
+ # new_pivot_table_props = new_pivot_table_full_property_tree["qProperty"]
2335
+ # new_pivot_table_children = new_pivot_table_full_property_tree["qChildren"]
2336
+ # new_pivot_table_children_ids = [child["qProperty"]["qInfo"]["qId"] for child in new_pivot_table_children]
2337
+ # new_pivot_table_props["qChildren"] = new_pivot_table_children_ids
2338
+ #
2339
+ # # Concatenate the table metadata to the DataFrame structure
2340
+ # df_new_pivot_table_list.loc[len(df_new_pivot_table_list)] = new_pivot_table_props
2341
+ #
2342
+ #
2343
+ # # Resolve the dictionary structure of attribute "qInfo"
2344
+ # df_new_pivot_table_list_expanded = (df_new_pivot_table_list["qInfo"].dropna().apply(pd.Series).add_prefix("qInfo_"))
2345
+ # df_new_pivot_table_list = df_new_pivot_table_list.drop(columns=["qInfo"]).join(df_new_pivot_table_list_expanded)
2346
+ #
2347
+ # # Resolve the dictionary structure of attribute "qHyperCubeDef"
2348
+ # df_new_pivot_table_list_expanded = (
2349
+ # df_new_pivot_table_list["qHyperCubeDef"].dropna().apply(pd.Series).add_prefix("qHyperCubeDef_"))
2350
+ # df_new_pivot_table_list = df_new_pivot_table_list.drop(columns=["qHyperCubeDef"]).join(df_new_pivot_table_list_expanded)
2351
+ #
2352
+ # # Resolve the dictionary structure of attribute "footnote"
2353
+ # df_new_pivot_table_list_expanded = (
2354
+ # df_new_pivot_table_list["footnote"].dropna().apply(pd.Series).add_prefix("footnote_"))
2355
+ # df_new_pivot_table_list = df_new_pivot_table_list.drop(columns=["footnote"]).join(
2356
+ # df_new_pivot_table_list_expanded)
2357
+ #
2358
+ # # Resolve the dictionary structure of attribute "footnote_qStringExpression"
2359
+ # df_new_pivot_table_list_expanded = (
2360
+ # df_new_pivot_table_list["footnote_qStringExpression"].dropna().apply(pd.Series).add_prefix("footnote_qStringExpression_"))
2361
+ # df_new_pivot_table_list = df_new_pivot_table_list.drop(columns=["footnote_qStringExpression"]).join(
2362
+ # df_new_pivot_table_list_expanded)
2363
+ #
2364
+ # # Resolve the dictionary structure of attribute "qLayoutExclude"
2365
+ # df_new_pivot_table_list_expanded = (
2366
+ # df_new_pivot_table_list["qLayoutExclude"].dropna().apply(pd.Series).add_prefix(
2367
+ # "qLayoutExclude_"))
2368
+ # df_new_pivot_table_list = df_new_pivot_table_list.drop(columns=["qLayoutExclude"]).join(
2369
+ # df_new_pivot_table_list_expanded)
2370
+ #
2371
+ # # Resolve the dictionary structure of attribute "nullValueRepresentation"
2372
+ # df_new_pivot_table_list_expanded = (
2373
+ # df_new_pivot_table_list["nullValueRepresentation"].dropna().apply(pd.Series).add_prefix(
2374
+ # "nullValueRepresentation_"))
2375
+ # df_new_pivot_table_list = df_new_pivot_table_list.drop(columns=["nullValueRepresentation"]).join(
2376
+ # df_new_pivot_table_list_expanded)
2377
+ #
2378
+ # # Resolve the dictionary structure of attribute "extensionMeta"
2379
+ # df_new_pivot_table_list_expanded = (
2380
+ # df_new_pivot_table_list["extensionMeta"].dropna().apply(pd.Series).add_prefix(
2381
+ # "extensionMeta_"))
2382
+ # df_new_pivot_table_list = df_new_pivot_table_list.drop(columns=["extensionMeta"]).join(
2383
+ # df_new_pivot_table_list_expanded)
2384
+ #
2385
+ # return df_new_pivot_table_list
2386
+
2387
+
1141
2388
  def get_app_variables(self, app_handle):
1142
2389
  """
1143
2390
  Retrieves a list with all app variables containing metadata.