gooddata-sdk 1.30.1.dev2__tar.gz → 1.31.1.dev1__tar.gz

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.
Files changed (136) hide show
  1. {gooddata_sdk-1.30.1.dev2/gooddata_sdk.egg-info → gooddata_sdk-1.31.1.dev1}/PKG-INFO +4 -4
  2. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/README.md +1 -1
  3. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/__init__.py +2 -0
  4. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/identifier.py +13 -0
  5. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/workspace.py +65 -12
  6. gooddata_sdk-1.31.1.dev1/gooddata_sdk/catalog/workspace/entity_model/filter_view.py +146 -0
  7. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/user_data_filter.py +2 -2
  8. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/service.py +176 -0
  9. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1/gooddata_sdk.egg-info}/PKG-INFO +4 -4
  10. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk.egg-info/SOURCES.txt +1 -0
  11. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk.egg-info/requires.txt +1 -1
  12. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/setup.py +3 -3
  13. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/LICENSE.txt +0 -0
  14. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/MANIFEST.in +0 -0
  15. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/bin/gdc +0 -0
  16. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/_version.py +0 -0
  17. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/__init__.py +0 -0
  18. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/base.py +0 -0
  19. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/catalog_service_base.py +0 -0
  20. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/__init__.py +0 -0
  21. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/__init__.py +0 -0
  22. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/requests/__init__.py +0 -0
  23. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/requests/ldm_request.py +0 -0
  24. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/requests/scan_model_request.py +0 -0
  25. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/requests/scan_sql_request.py +0 -0
  26. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/responses/__init__.py +0 -0
  27. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/responses/scan_sql_response.py +0 -0
  28. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/sql_column.py +0 -0
  29. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/__init__.py +0 -0
  30. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/data_source.py +0 -0
  31. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/__init__.py +0 -0
  32. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/column.py +0 -0
  33. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/pdm.py +0 -0
  34. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/physical_model/table.py +0 -0
  35. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/entity_model/__init__.py +0 -0
  36. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/entity_model/content_objects/__init__.py +0 -0
  37. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/entity_model/data_source.py +0 -0
  38. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/service.py +0 -0
  39. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/validation/__init__.py +0 -0
  40. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/validation/data_source.py +0 -0
  41. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/depends_on.py +0 -0
  42. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/entity.py +0 -0
  43. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/export/__init__.py +0 -0
  44. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/export/request.py +0 -0
  45. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/export/service.py +0 -0
  46. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/filter_by.py +0 -0
  47. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/__init__.py +0 -0
  48. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/__init__.py +0 -0
  49. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/directive.py +0 -0
  50. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/jwk.py +0 -0
  51. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/organization.py +0 -0
  52. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/setting.py +0 -0
  53. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/layout/__init__.py +0 -0
  54. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/layout/notification_channel.py +0 -0
  55. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/service.py +0 -0
  56. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/parameter.py +0 -0
  57. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/__init__.py +0 -0
  58. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/__init__.py +0 -0
  59. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/dashboard_assignees.py +0 -0
  60. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/dashboard_permissions.py +0 -0
  61. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/manage_dashboard_permissions.py +0 -0
  62. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/permission.py +0 -0
  63. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/service.py +0 -0
  64. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/rule.py +0 -0
  65. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/setting.py +0 -0
  66. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/types.py +0 -0
  67. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/__init__.py +0 -0
  68. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/declarative_model/__init__.py +0 -0
  69. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/declarative_model/user.py +0 -0
  70. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/declarative_model/user_and_user_groups.py +0 -0
  71. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/declarative_model/user_group.py +0 -0
  72. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/entity_model/__init__.py +0 -0
  73. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/entity_model/api_token.py +0 -0
  74. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/entity_model/user.py +0 -0
  75. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/entity_model/user_group.py +0 -0
  76. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/management_model/__init__.py +0 -0
  77. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/management_model/management.py +0 -0
  78. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/service.py +0 -0
  79. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/validate_by_item.py +0 -0
  80. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/__init__.py +0 -0
  81. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/content_service.py +0 -0
  82. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/__init__.py +0 -0
  83. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/__init__.py +0 -0
  84. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/__init__.py +0 -0
  85. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/analytics_model.py +0 -0
  86. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/base.py +0 -0
  87. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/export_definition.py +0 -0
  88. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/automation.py +0 -0
  89. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/__init__.py +0 -0
  90. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/data_filter_references.py +0 -0
  91. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset/__init__.py +0 -0
  92. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset/dataset.py +0 -0
  93. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset_extensions/__init__.py +0 -0
  94. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset_extensions/dataset_extension.py +0 -0
  95. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/date_dataset/__init__.py +0 -0
  96. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/date_dataset/date_dataset.py +0 -0
  97. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/ldm.py +0 -0
  98. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/__init__.py +0 -0
  99. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/__init__.py +0 -0
  100. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/dataset.py +0 -0
  101. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/metric.py +0 -0
  102. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/workspace_setting.py +0 -0
  103. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/graph_objects/__init__.py +0 -0
  104. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/graph_objects/graph.py +0 -0
  105. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/workspace.py +0 -0
  106. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/model_container.py +0 -0
  107. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/__init__.py +0 -0
  108. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/clone.py +0 -0
  109. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/constants.py +0 -0
  110. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/deploy.py +0 -0
  111. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/gdc_core.py +0 -0
  112. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/package.json +0 -0
  113. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/utils.py +0 -0
  114. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/client.py +0 -0
  115. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/__init__.py +0 -0
  116. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/compute_to_sdk_converter.py +0 -0
  117. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/__init__.py +0 -0
  118. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/attribute.py +0 -0
  119. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/base.py +0 -0
  120. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/execution.py +0 -0
  121. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/filter.py +0 -0
  122. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/metric.py +0 -0
  123. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/service.py +0 -0
  124. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/config.py +0 -0
  125. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/py.typed +0 -0
  126. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/sdk.py +0 -0
  127. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/support.py +0 -0
  128. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/table.py +0 -0
  129. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/type_converter.py +0 -0
  130. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/utils.py +0 -0
  131. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/visualization.py +0 -0
  132. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk.egg-info/dependency_links.txt +0 -0
  133. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk.egg-info/top_level.txt +0 -0
  134. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/setup.cfg +0 -0
  135. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/tests/test_client.py +0 -0
  136. {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/tests/test_type_converter.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gooddata-sdk
3
- Version: 1.30.1.dev2
3
+ Version: 1.31.1.dev1
4
4
  Summary: GoodData Cloud Python SDK
5
5
  Author: GoodData
6
6
  Author-email: support@gooddata.com
7
7
  License: MIT
8
- Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.30.1.dev2
8
+ Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.31.1.dev1
9
9
  Project-URL: Source, https://github.com/gooddata/gooddata-python-sdk
10
10
  Keywords: gooddata,sdk,api,analytics,headless,business,intelligence,headless-bi,cloud,native,semantic,layer,sql,metrics
11
11
  Classifier: Development Status :: 5 - Production/Stable
@@ -22,7 +22,7 @@ Classifier: Typing :: Typed
22
22
  Requires-Python: >=3.9.0
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE.txt
25
- Requires-Dist: gooddata-api-client~=1.30.1.dev2
25
+ Requires-Dist: gooddata-api-client~=1.31.1.dev1
26
26
  Requires-Dist: python-dateutil>=2.5.3
27
27
  Requires-Dist: pyyaml>=5.1
28
28
  Requires-Dist: attrs<=24.2.0,>=21.4.0
@@ -46,7 +46,7 @@ At the moment the SDK provides services to inspect and interact with the Semanti
46
46
  * Compute Service
47
47
  * Table Service
48
48
 
49
- See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.30.1.dev2) for more details.
49
+ See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.31.1.dev1) for more details.
50
50
 
51
51
  ## Requirements
52
52
 
@@ -13,7 +13,7 @@ At the moment the SDK provides services to inspect and interact with the Semanti
13
13
  * Compute Service
14
14
  * Table Service
15
15
 
16
- See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.30.1.dev2) for more details.
16
+ See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.31.1.dev1) for more details.
17
17
 
18
18
  ## Requirements
19
19
 
@@ -71,6 +71,7 @@ from gooddata_sdk.catalog.filter_by import CatalogFilterBy
71
71
  from gooddata_sdk.catalog.identifier import (
72
72
  CatalogAssigneeIdentifier,
73
73
  CatalogDatasetWorkspaceDataFilterIdentifier,
74
+ CatalogDeclarativeAnalyticalDashboardIdentifier,
74
75
  CatalogExportDefinitionIdentifier,
75
76
  CatalogNotificationChannelIdentifier,
76
77
  CatalogUserIdentifier,
@@ -175,6 +176,7 @@ from gooddata_sdk.catalog.workspace.declarative_model.workspace.logical_model.ld
175
176
  CatalogDeclarativeModel,
176
177
  )
177
178
  from gooddata_sdk.catalog.workspace.declarative_model.workspace.workspace import (
179
+ CatalogDeclarativeFilterView,
178
180
  CatalogDeclarativeUserDataFilter,
179
181
  CatalogDeclarativeUserDataFilters,
180
182
  CatalogDeclarativeWorkspace,
@@ -7,6 +7,9 @@ import attr
7
7
  from attrs import define
8
8
  from gooddata_api_client.model.assignee_identifier import AssigneeIdentifier
9
9
  from gooddata_api_client.model.dataset_workspace_data_filter_identifier import DatasetWorkspaceDataFilterIdentifier
10
+ from gooddata_api_client.model.declarative_analytical_dashboard_identifier import (
11
+ DeclarativeAnalyticalDashboardIdentifier,
12
+ )
10
13
  from gooddata_api_client.model.declarative_export_definition_identifier import DeclarativeExportDefinitionIdentifier
11
14
  from gooddata_api_client.model.declarative_notification_channel_identifier import (
12
15
  DeclarativeNotificationChannelIdentifier,
@@ -114,3 +117,13 @@ class CatalogNotificationChannelIdentifier(Base):
114
117
  @staticmethod
115
118
  def client_class() -> builtins.type[DeclarativeNotificationChannelIdentifier]:
116
119
  return DeclarativeNotificationChannelIdentifier
120
+
121
+
122
+ @attr.s(auto_attribs=True, kw_only=True)
123
+ class CatalogDeclarativeAnalyticalDashboardIdentifier(Base):
124
+ id: str
125
+ type: str = attr.field(validator=value_in_allowed)
126
+
127
+ @staticmethod
128
+ def client_class() -> builtins.type[DeclarativeAnalyticalDashboardIdentifier]:
129
+ return DeclarativeAnalyticalDashboardIdentifier
@@ -6,6 +6,7 @@ from pathlib import Path
6
6
  from typing import Any, Optional
7
7
 
8
8
  import attr
9
+ from gooddata_api_client.model.declarative_filter_view import DeclarativeFilterView
9
10
  from gooddata_api_client.model.declarative_user_data_filter import DeclarativeUserDataFilter
10
11
  from gooddata_api_client.model.declarative_user_data_filters import DeclarativeUserDataFilters
11
12
  from gooddata_api_client.model.declarative_workspace import DeclarativeWorkspace
@@ -17,6 +18,7 @@ from gooddata_api_client.model.declarative_workspaces import DeclarativeWorkspac
17
18
 
18
19
  from gooddata_sdk.catalog.base import Base
19
20
  from gooddata_sdk.catalog.identifier import (
21
+ CatalogDeclarativeAnalyticalDashboardIdentifier,
20
22
  CatalogDeclarativeUserGroupIdentifier,
21
23
  CatalogUserIdentifier,
22
24
  CatalogWorkspaceIdentifier,
@@ -36,6 +38,7 @@ from gooddata_sdk.utils import create_directory, get_sorted_yaml_files, read_lay
36
38
  LAYOUT_WORKSPACES_DIR = "workspaces"
37
39
  LAYOUT_WORKSPACES_DATA_FILTERS_DIR = "workspaces_data_filters"
38
40
  LAYOUT_USER_DATA_FILTERS_DIR = "user_data_filters"
41
+ LAYOUT_FILTER_VIEWS_DIR = "filter_views"
39
42
 
40
43
 
41
44
  def get_workspace_folder(workspace_id: str, layout_organization_folder: Path) -> Path:
@@ -85,6 +88,7 @@ class CatalogDeclarativeWorkspace(Base):
85
88
  user_data_filters: list[CatalogDeclarativeUserDataFilter] = attr.field(factory=list)
86
89
  custom_application_settings: list[CatalogDeclarativeCustomApplicationSetting] = attr.field(factory=list)
87
90
  automations: list[CatalogDeclarativeAutomation] = attr.field(factory=list)
91
+ filter_views: list[CatalogDeclarativeFilterView] = attr.field(factory=list)
88
92
 
89
93
  @staticmethod
90
94
  def client_class() -> type[DeclarativeWorkspace]:
@@ -211,12 +215,13 @@ class CatalogDeclarativeWorkspaceDataFilter(Base):
211
215
  @classmethod
212
216
  def from_dict(cls, data: dict[str, Any], camel_case: bool = True) -> CatalogDeclarativeWorkspaceDataFilter:
213
217
  """
214
- :param data: Data loaded for example from the file.
215
- :param camel_case: True if the variable names in the input
216
- data are serialized names as specified in the OpenAPI document.
217
- False if the variables names in the input data are python
218
- variable names in PEP-8 snake case.
219
- :return: CatalogDeclarativeWorkspaceDataFilter object.
218
+ Args:
219
+ data (dict[str, Any]): Data loaded, for example, from a file.
220
+ camel_case (bool): True if the variable names in the input data are serialized names as specified in the OpenAPI document.
221
+ False if the variable names in the input data are Python variable names in PEP-8 snake case.
222
+
223
+ Returns:
224
+ CatalogDeclarativeWorkspaceDataFilter: CatalogDeclarativeWorkspaceDataFilter object.
220
225
  """
221
226
  declarative_workspace_data_filter = DeclarativeWorkspaceDataFilter.from_dict(data, camel_case)
222
227
  return cls.from_api(declarative_workspace_data_filter)
@@ -273,17 +278,61 @@ class CatalogDeclarativeUserDataFilter(Base):
273
278
  @classmethod
274
279
  def from_dict(cls, data: dict[str, Any], camel_case: bool = True) -> CatalogDeclarativeUserDataFilter:
275
280
  """
276
- :param data: Data loaded for example from the file.
277
- :param camel_case: True if the variable names in the input
278
- data are serialized names as specified in the OpenAPI document.
279
- False if the variables names in the input data are python
280
- variable names in PEP-8 snake case.
281
- :return: CatalogDeclarativeUserDataFilter object.
281
+ Args:
282
+ data (dict[str, Any]): Data loaded, for example, from a file.
283
+ camel_case (bool): True if the variable names in the input data are serialized names as specified in the OpenAPI document.
284
+ False if the variable names in the input data are Python variable names in PEP-8 snake case.
285
+
286
+ Returns:
287
+ CatalogDeclarativeUserDataFilter: CatalogDeclarativeUserDataFilter object.
282
288
  """
283
289
  declarative_user_data_filter = DeclarativeUserDataFilter.from_dict(data, camel_case)
284
290
  return cls.from_api(declarative_user_data_filter)
285
291
 
286
292
 
293
+ @attr.s(auto_attribs=True, kw_only=True)
294
+ class CatalogDeclarativeFilterView(Base):
295
+ id: str
296
+ title: str
297
+ analytical_dashboard: Optional[CatalogDeclarativeAnalyticalDashboardIdentifier] = None
298
+ content: Optional[dict[str, Any]] = None
299
+ description: Optional[str] = None
300
+ is_default: Optional[bool] = None
301
+ tags: Optional[list[str]] = None
302
+ user: Optional[CatalogUserIdentifier] = None
303
+
304
+ @staticmethod
305
+ def client_class() -> type[DeclarativeFilterView]:
306
+ return DeclarativeFilterView
307
+
308
+ def store_to_disk(self, filter_views_folder: Path) -> None:
309
+ filter_view_file = filter_views_folder / f"{self.id}.yaml"
310
+ write_layout_to_file(filter_view_file, self.to_api().to_dict(camel_case=True))
311
+
312
+ @classmethod
313
+ def load_from_disk(cls, filter_view_file: Path) -> CatalogDeclarativeFilterView:
314
+ filter_view = read_layout_from_file(filter_view_file)
315
+ return CatalogDeclarativeFilterView.from_dict(filter_view, camel_case=True)
316
+
317
+ @classmethod
318
+ def store_filter_views_to_disk(
319
+ cls, filter_views: list[CatalogDeclarativeFilterView], layout_organization_folder: Path
320
+ ) -> None:
321
+ filter_views_folder = CatalogDeclarativeWorkspaces.filter_views_folder(layout_organization_folder)
322
+ create_directory(filter_views_folder)
323
+ for filter_view in filter_views:
324
+ filter_view.store_to_disk(filter_views_folder)
325
+
326
+ @classmethod
327
+ def load_filter_views_from_disk(cls, layout_organization_folder: Path) -> list[CatalogDeclarativeFilterView]:
328
+ filter_views_files = get_sorted_yaml_files(
329
+ CatalogDeclarativeWorkspaces.filter_views_folder(layout_organization_folder)
330
+ )
331
+ return [
332
+ CatalogDeclarativeFilterView.load_from_disk(filter_views_file) for filter_views_file in filter_views_files
333
+ ]
334
+
335
+
287
336
  @attr.s(auto_attribs=True, kw_only=True)
288
337
  class CatalogDeclarativeWorkspaces(Base):
289
338
  workspaces: list[CatalogDeclarativeWorkspace]
@@ -305,6 +354,10 @@ class CatalogDeclarativeWorkspaces(Base):
305
354
  def user_data_filters_folder(layout_organization_folder: Path) -> Path:
306
355
  return layout_organization_folder / LAYOUT_USER_DATA_FILTERS_DIR
307
356
 
357
+ @staticmethod
358
+ def filter_views_folder(layout_organization_folder: Path) -> Path:
359
+ return layout_organization_folder / LAYOUT_FILTER_VIEWS_DIR
360
+
308
361
  def store_to_disk(self, layout_organization_folder: Path) -> None:
309
362
  workspaces_folder = self.workspaces_folder(layout_organization_folder)
310
363
  workspaces_data_filters_folder = self.workspace_data_filters_folder(layout_organization_folder)
@@ -0,0 +1,146 @@
1
+ # (C) 2024 GoodData Corporation
2
+ from __future__ import annotations
3
+
4
+ from typing import Any, Optional, Union
5
+
6
+ import attr
7
+ from gooddata_api_client.model.json_api_filter_view_in import JsonApiFilterViewIn
8
+ from gooddata_api_client.model.json_api_filter_view_in_attributes import JsonApiFilterViewInAttributes
9
+ from gooddata_api_client.model.json_api_filter_view_in_document import JsonApiFilterViewInDocument
10
+ from gooddata_api_client.model.json_api_filter_view_in_relationships import JsonApiFilterViewInRelationships
11
+
12
+ from gooddata_sdk.catalog.base import Base
13
+ from gooddata_sdk.catalog.identifier import CatalogDeclarativeAnalyticalDashboardIdentifier, CatalogUserIdentifier
14
+
15
+
16
+ @attr.s(auto_attribs=True, kw_only=True)
17
+ class CatalogFilterViewDocument(Base):
18
+ data: CatalogFilterView
19
+
20
+ @staticmethod
21
+ def client_class() -> type[JsonApiFilterViewInDocument]:
22
+ return JsonApiFilterViewInDocument
23
+
24
+ def to_api(self) -> JsonApiFilterViewInDocument:
25
+ return JsonApiFilterViewInDocument(data=self.data.to_api())
26
+
27
+
28
+ def _data_entity(value: Any) -> dict[str, Any]:
29
+ return {"data": value}
30
+
31
+
32
+ @attr.s(auto_attribs=True, kw_only=True)
33
+ class CatalogFilterView(Base):
34
+ id: Optional[str] = None
35
+ attributes: CatalogFilterViewAttributes
36
+ relationships: Optional[CatalogFilterViewRelationships] = None
37
+
38
+ @staticmethod
39
+ def client_class() -> type[JsonApiFilterViewIn]:
40
+ return JsonApiFilterViewIn
41
+
42
+ @classmethod
43
+ def init(
44
+ cls,
45
+ filter_view_id: str,
46
+ content: dict[str, Any],
47
+ title: str,
48
+ are_relations_valid: Optional[bool] = None,
49
+ description: Optional[str] = None,
50
+ is_default: Optional[bool] = None,
51
+ tags: Optional[list[str]] = None,
52
+ user_id: Optional[str] = None,
53
+ analytical_dashboard_id: Optional[str] = None,
54
+ ) -> CatalogFilterView:
55
+ attributes = CatalogFilterViewAttributes(
56
+ content=content,
57
+ title=title,
58
+ are_relations_valid=are_relations_valid,
59
+ description=description,
60
+ is_default=is_default,
61
+ tags=tags,
62
+ )
63
+ relationships = CatalogFilterViewRelationships.create_user_analytical_dashboard_relationship(
64
+ user_id=user_id, analytical_dashboard_id=analytical_dashboard_id
65
+ )
66
+ return cls(id=filter_view_id, attributes=attributes, relationships=relationships)
67
+
68
+ def to_api(self) -> JsonApiFilterViewIn:
69
+ attributes = self.attributes.to_api()
70
+ relationships = self.relationships.to_api() if self.relationships is not None else None
71
+ return JsonApiFilterViewIn(id=self.id, attributes=attributes, relationships=relationships)
72
+
73
+ @property
74
+ def user_id(self) -> Union[str, None]:
75
+ if self.relationships and self.relationships.user:
76
+ return self.relationships.user["data"].id
77
+ return None
78
+
79
+ @property
80
+ def analytical_dashboard_id(self) -> Union[str, None]:
81
+ if self.relationships and self.relationships.analytical_dashboard:
82
+ return self.relationships.analytical_dashboard["data"].id
83
+ return None
84
+
85
+ def assign_user(self, user_id: str) -> None:
86
+ if self.relationships is None:
87
+ self.relationships = CatalogFilterViewRelationships.create_user_analytical_dashboard_relationship(
88
+ user_id=user_id
89
+ )
90
+ else:
91
+ self.relationships.user = _data_entity(CatalogUserIdentifier(id=user_id, type="user"))
92
+
93
+ def assign_analytical_dashboard(self, analytical_dashboard_id: str) -> None:
94
+ if self.relationships is None:
95
+ self.relationships = CatalogFilterViewRelationships.create_user_analytical_dashboard_relationship(
96
+ analytical_dashboard_id=analytical_dashboard_id
97
+ )
98
+ else:
99
+ self.relationships.analytical_dashboard = _data_entity(
100
+ CatalogDeclarativeAnalyticalDashboardIdentifier(id=analytical_dashboard_id, type="analyticalDashboard")
101
+ )
102
+
103
+ def clean_relationships(self) -> None:
104
+ if self.relationships is not None:
105
+ self.relationships.user = None
106
+ self.relationships.analytical_dashboard = None
107
+
108
+
109
+ @attr.s(auto_attribs=True, kw_only=True)
110
+ class CatalogFilterViewAttributes(Base):
111
+ content: dict[str, Any]
112
+ title: str
113
+ are_relations_valid: Optional[bool] = None
114
+ description: Optional[str] = None
115
+ is_default: Optional[bool] = None
116
+ tags: Optional[list[str]] = None
117
+
118
+ @staticmethod
119
+ def client_class() -> type[JsonApiFilterViewInAttributes]:
120
+ return JsonApiFilterViewInAttributes
121
+
122
+
123
+ @attr.s(auto_attribs=True, kw_only=True)
124
+ class CatalogFilterViewRelationships(Base):
125
+ user: Optional[dict[str, CatalogUserIdentifier]] = None
126
+ analytical_dashboard: Optional[dict[str, CatalogDeclarativeAnalyticalDashboardIdentifier]] = None
127
+
128
+ @staticmethod
129
+ def client_class() -> type[JsonApiFilterViewInRelationships]:
130
+ return JsonApiFilterViewInRelationships
131
+
132
+ @classmethod
133
+ def create_user_analytical_dashboard_relationship(
134
+ cls, user_id: Optional[str] = None, analytical_dashboard_id: Optional[str] = None
135
+ ) -> CatalogFilterViewRelationships | None:
136
+ if user_id is None and analytical_dashboard_id is None:
137
+ return None
138
+ assignee_user = _data_entity(CatalogUserIdentifier(id=user_id, type="user")) if user_id else None
139
+ assignee_analytical_dashboard = (
140
+ _data_entity(
141
+ CatalogDeclarativeAnalyticalDashboardIdentifier(id=analytical_dashboard_id, type="analyticalDashboard")
142
+ )
143
+ if analytical_dashboard_id
144
+ else None
145
+ )
146
+ return cls(user=assignee_user, analytical_dashboard=assignee_analytical_dashboard)
@@ -91,13 +91,13 @@ class CatalogUserDataFilter(Base):
91
91
  return JsonApiUserDataFilterIn(id=self.id, attributes=attributes, relationships=relationships)
92
92
 
93
93
  @property
94
- def user_id(self) -> str | None:
94
+ def user_id(self) -> Union[str, None]:
95
95
  if self.relationships and self.relationships.user:
96
96
  return self.relationships.user["data"].id
97
97
  return None
98
98
 
99
99
  @property
100
- def user_group_id(self) -> str | None:
100
+ def user_group_id(self) -> Union[str, None]:
101
101
  if self.relationships and self.relationships.user_group:
102
102
  return self.relationships.user_group["data"].id
103
103
  return None
@@ -21,6 +21,7 @@ from gooddata_sdk import CatalogDeclarativeAutomation
21
21
  from gooddata_sdk.catalog.catalog_service_base import CatalogServiceBase
22
22
  from gooddata_sdk.catalog.permission.service import CatalogPermissionService
23
23
  from gooddata_sdk.catalog.workspace.declarative_model.workspace.workspace import (
24
+ CatalogDeclarativeFilterView,
24
25
  CatalogDeclarativeUserDataFilters,
25
26
  CatalogDeclarativeWorkspaceDataFilters,
26
27
  CatalogDeclarativeWorkspaceModel,
@@ -28,6 +29,10 @@ from gooddata_sdk.catalog.workspace.declarative_model.workspace.workspace import
28
29
  get_workspace_folder,
29
30
  )
30
31
  from gooddata_sdk.catalog.workspace.entity_model.content_objects.workspace_setting import CatalogWorkspaceSetting
32
+ from gooddata_sdk.catalog.workspace.entity_model.filter_view import (
33
+ CatalogFilterView,
34
+ CatalogFilterViewDocument,
35
+ )
31
36
  from gooddata_sdk.catalog.workspace.entity_model.user_data_filter import (
32
37
  CatalogUserDataFilter,
33
38
  CatalogUserDataFilterDocument,
@@ -1263,3 +1268,174 @@ class CatalogWorkspaceService(CatalogServiceBase):
1263
1268
  """
1264
1269
  api_automations = [automation.to_api() for automation in automations]
1265
1270
  self._layout_api.set_automations(workspace_id, api_automations)
1271
+
1272
+ def list_filters_views(self, workspace_id: str) -> list[CatalogFilterView]:
1273
+ """list all filter views.
1274
+
1275
+ Args:
1276
+ workspace_id (str):
1277
+ String containing id of the workspace.
1278
+
1279
+ Returns:
1280
+ list[CatalogFilterView]:
1281
+ List of filter view entities.
1282
+ """
1283
+ get_filter_views = functools.partial(
1284
+ self._entities_api.get_all_entities_filter_views,
1285
+ workspace_id,
1286
+ _check_return_type=False,
1287
+ include=["ALL"],
1288
+ )
1289
+ filter_views = load_all_entities_dict(get_filter_views, camel_case=False)
1290
+ return [CatalogFilterView.from_dict(v, camel_case=False) for v in filter_views["data"]]
1291
+
1292
+ def create_or_update_filter_view(self, workspace_id: str, filter_view: CatalogFilterView) -> None:
1293
+ """Create a new filter view or overwrite an existing one.
1294
+
1295
+ Args:
1296
+ workspace_id (str):
1297
+ String containing id of the workspace.
1298
+ filter_view (CatalogFilterView):
1299
+ FilterView entity object.
1300
+
1301
+ Returns:
1302
+ None
1303
+ """
1304
+ filter_view_document = CatalogFilterViewDocument(data=filter_view)
1305
+ if filter_view.id is None:
1306
+ self._entities_api.create_entity_filter_views(
1307
+ workspace_id=workspace_id,
1308
+ json_api_filter_view_in_document=filter_view_document.to_api(),
1309
+ )
1310
+ else:
1311
+ try:
1312
+ self.get_filter_view(workspace_id=workspace_id, filter_view_id=filter_view.id)
1313
+ self._entities_api.update_entity_filter_views(
1314
+ workspace_id=workspace_id,
1315
+ object_id=filter_view.id,
1316
+ json_api_filter_view_in_document=filter_view_document.to_api(),
1317
+ )
1318
+ except NotFoundException:
1319
+ self._entities_api.create_entity_filter_views(
1320
+ workspace_id=workspace_id,
1321
+ json_api_filter_view_in_document=filter_view_document.to_api(),
1322
+ )
1323
+
1324
+ def get_filter_view(self, workspace_id: str, filter_view_id: str) -> CatalogFilterView:
1325
+ """Get filter view by its id.
1326
+
1327
+ Args:
1328
+ workspace_id (str):
1329
+ String containing id of the workspace.
1330
+ filter_view_id (str):
1331
+ String containing id of the filter view.
1332
+
1333
+ Returns:
1334
+ CatalogFilterView:
1335
+ FilterView entity object.
1336
+ """
1337
+ filter_view_dict = self._entities_api.get_entity_filter_views(
1338
+ workspace_id=workspace_id,
1339
+ object_id=filter_view_id,
1340
+ include=["ALL"],
1341
+ _check_return_type=False,
1342
+ ).data
1343
+
1344
+ return CatalogFilterView.from_dict(filter_view_dict, camel_case=True)
1345
+
1346
+ def delete_filter_view(self, workspace_id: str, filter_view_id: str) -> None:
1347
+ """Delete filter view.
1348
+
1349
+ Args:
1350
+ workspace_id (str):
1351
+ String containing id of the workspace.
1352
+ filter_view_id (str):
1353
+ String containing id of the deleting filter view.
1354
+
1355
+ Returns:
1356
+ None
1357
+ """
1358
+ self._entities_api.delete_entity_filter_views(workspace_id=workspace_id, object_id=filter_view_id)
1359
+
1360
+ def get_declarative_filter_views(self, workspace_id: str) -> list[CatalogDeclarativeFilterView]:
1361
+ """Retrieve a list of declarative filter views.
1362
+
1363
+ Args:
1364
+ workspace_id (str):
1365
+ Workspace identification string e.g. "demo"
1366
+
1367
+ Returns:
1368
+ list[CatalogDeclarativeFilterView]:
1369
+ List of declarative filter views.
1370
+ """
1371
+ return [
1372
+ CatalogDeclarativeFilterView.from_dict(filter_view.to_dict(), camel_case=False)
1373
+ for filter_view in self._layout_api.get_filter_views(workspace_id)
1374
+ ]
1375
+
1376
+ def put_declarative_filter_views(self, workspace_id: str, filter_views: list[CatalogDeclarativeFilterView]) -> None:
1377
+ """Set filter views for the workspace.
1378
+
1379
+ Args:
1380
+ workspace_id (str):
1381
+ Workspace identification string e.g. "demo"
1382
+ filter_views (list[CatalogDeclarativeFilterView]):
1383
+ List of declarative filter views.
1384
+
1385
+ Returns:
1386
+ None
1387
+ """
1388
+ api_filter_views = [filter_view.to_api() for filter_view in filter_views]
1389
+ self._layout_api.set_filter_views(workspace_id=workspace_id, declarative_filter_view=api_filter_views)
1390
+
1391
+ def store_declarative_filter_views(self, workspace_id: str, layout_root_path: Path = Path.cwd()) -> None:
1392
+ """Store filter views layout in a directory hierarchy.
1393
+
1394
+ Args:
1395
+ workspace_id (str):
1396
+ id of the related workspace
1397
+ layout_root_path (Path, optional):
1398
+ Path to the root of the layout directory. Defaults to Path.cwd().
1399
+
1400
+ Returns:
1401
+ None
1402
+ """
1403
+ filter_views = self.get_declarative_filter_views(workspace_id)
1404
+ CatalogDeclarativeFilterView.store_filter_views_to_disk(
1405
+ filter_views, self.layout_organization_folder(layout_root_path)
1406
+ )
1407
+
1408
+ def load_declarative_filter_views(self, layout_root_path: Path = Path.cwd()) -> list[CatalogDeclarativeFilterView]:
1409
+ """Loads filter views layout, which was stored using `store_declarative_filter_views`.
1410
+
1411
+ Args:
1412
+ layout_root_path (Path, optional):
1413
+ Path to the root of the layout directory. Defaults to Path.cwd().
1414
+
1415
+ Returns:
1416
+ list[CatalogDeclarativeFilterView]:
1417
+ List of declarative filter views.
1418
+ """
1419
+ return CatalogDeclarativeFilterView.load_filter_views_from_disk(
1420
+ self.layout_organization_folder(layout_root_path)
1421
+ )
1422
+
1423
+ def load_and_put_declarative_filter_views(self, workspace_id: str, layout_root_path: Path = Path.cwd()) -> None:
1424
+ """Loads and sets the layouts stored using `store_declarative_filter_views`.
1425
+
1426
+ This method combines `load_declarative_filter_views` and `put_declarative_filter_views`
1427
+ methods to load and set layouts stored using `store_declarative_filter_views`.
1428
+
1429
+ Args:
1430
+ workspace_id (str):
1431
+ String containing id of the workspace
1432
+ layout_root_path (Path, optional):
1433
+ Path to the root of the layout directory. Defaults to Path.cwd().
1434
+
1435
+ Returns:
1436
+ None
1437
+ """
1438
+ declarative_filter_views = CatalogDeclarativeFilterView.load_filter_views_from_disk(
1439
+ self.layout_organization_folder(layout_root_path)
1440
+ )
1441
+ self.put_declarative_filter_views(workspace_id, declarative_filter_views)
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gooddata-sdk
3
- Version: 1.30.1.dev2
3
+ Version: 1.31.1.dev1
4
4
  Summary: GoodData Cloud Python SDK
5
5
  Author: GoodData
6
6
  Author-email: support@gooddata.com
7
7
  License: MIT
8
- Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.30.1.dev2
8
+ Project-URL: Documentation, https://www.gooddata.com/docs/python-sdk/1.31.1.dev1
9
9
  Project-URL: Source, https://github.com/gooddata/gooddata-python-sdk
10
10
  Keywords: gooddata,sdk,api,analytics,headless,business,intelligence,headless-bi,cloud,native,semantic,layer,sql,metrics
11
11
  Classifier: Development Status :: 5 - Production/Stable
@@ -22,7 +22,7 @@ Classifier: Typing :: Typed
22
22
  Requires-Python: >=3.9.0
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE.txt
25
- Requires-Dist: gooddata-api-client~=1.30.1.dev2
25
+ Requires-Dist: gooddata-api-client~=1.31.1.dev1
26
26
  Requires-Dist: python-dateutil>=2.5.3
27
27
  Requires-Dist: pyyaml>=5.1
28
28
  Requires-Dist: attrs<=24.2.0,>=21.4.0
@@ -46,7 +46,7 @@ At the moment the SDK provides services to inspect and interact with the Semanti
46
46
  * Compute Service
47
47
  * Table Service
48
48
 
49
- See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.30.1.dev2) for more details.
49
+ See [DOCUMENTATION](https://www.gooddata.com/docs/python-sdk/1.31.1.dev1) for more details.
50
50
 
51
51
  ## Requirements
52
52
 
@@ -105,6 +105,7 @@ gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/dataset
105
105
  gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/date_dataset/__init__.py
106
106
  gooddata_sdk/catalog/workspace/declarative_model/workspace/logical_model/date_dataset/date_dataset.py
107
107
  gooddata_sdk/catalog/workspace/entity_model/__init__.py
108
+ gooddata_sdk/catalog/workspace/entity_model/filter_view.py
108
109
  gooddata_sdk/catalog/workspace/entity_model/user_data_filter.py
109
110
  gooddata_sdk/catalog/workspace/entity_model/workspace.py
110
111
  gooddata_sdk/catalog/workspace/entity_model/content_objects/__init__.py
@@ -1,4 +1,4 @@
1
- gooddata-api-client~=1.30.1.dev2
1
+ gooddata-api-client~=1.31.1.dev1
2
2
  python-dateutil>=2.5.3
3
3
  pyyaml>=5.1
4
4
  attrs<=24.2.0,>=21.4.0
@@ -7,7 +7,7 @@ this_directory = Path(__file__).parent
7
7
  long_description = (this_directory / "README.md").read_text(encoding="utf-8")
8
8
 
9
9
  REQUIRES = [
10
- "gooddata-api-client~=1.30.1.dev2",
10
+ "gooddata-api-client~=1.31.1.dev1",
11
11
  "python-dateutil>=2.5.3",
12
12
  "pyyaml>=5.1",
13
13
  "attrs>=21.4.0,<=24.2.0",
@@ -22,7 +22,7 @@ setup(
22
22
  description="GoodData Cloud Python SDK",
23
23
  long_description=long_description,
24
24
  long_description_content_type="text/markdown",
25
- version="1.30.1.dev2",
25
+ version="1.31.1.dev1",
26
26
  author="GoodData",
27
27
  author_email="support@gooddata.com",
28
28
  license="MIT",
@@ -36,7 +36,7 @@ setup(
36
36
  "bin/gdc",
37
37
  ],
38
38
  project_urls={
39
- "Documentation": "https://www.gooddata.com/docs/python-sdk/1.30.1.dev2",
39
+ "Documentation": "https://www.gooddata.com/docs/python-sdk/1.31.1.dev1",
40
40
  "Source": "https://github.com/gooddata/gooddata-python-sdk",
41
41
  },
42
42
  classifiers=[