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.
- {gooddata_sdk-1.30.1.dev2/gooddata_sdk.egg-info → gooddata_sdk-1.31.1.dev1}/PKG-INFO +4 -4
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/README.md +1 -1
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/__init__.py +2 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/identifier.py +13 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/workspace.py +65 -12
- gooddata_sdk-1.31.1.dev1/gooddata_sdk/catalog/workspace/entity_model/filter_view.py +146 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/user_data_filter.py +2 -2
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/service.py +176 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1/gooddata_sdk.egg-info}/PKG-INFO +4 -4
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk.egg-info/SOURCES.txt +1 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk.egg-info/requires.txt +1 -1
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/setup.py +3 -3
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/LICENSE.txt +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/MANIFEST.in +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/bin/gdc +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/_version.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/base.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/catalog_service_base.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/requests/__init__.py +0 -0
- {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
- {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
- {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
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/responses/__init__.py +0 -0
- {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
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/action_model/sql_column.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/declarative_model/data_source.py +0 -0
- {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
- {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
- {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
- {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
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/entity_model/__init__.py +0 -0
- {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
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/entity_model/data_source.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/service.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/validation/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/validation/data_source.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/depends_on.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/entity.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/export/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/export/request.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/export/service.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/filter_by.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/directive.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/jwk.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/organization.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/entity_model/setting.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/layout/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/layout/notification_channel.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/service.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/parameter.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/dashboard_assignees.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/dashboard_permissions.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/manage_dashboard_permissions.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/declarative_model/permission.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/service.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/rule.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/setting.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/types.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/declarative_model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/declarative_model/user.py +0 -0
- {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
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/declarative_model/user_group.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/entity_model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/entity_model/api_token.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/entity_model/user.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/entity_model/user_group.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/management_model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/management_model/management.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/service.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/validate_by_item.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/content_service.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/declarative_model/workspace/automation.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/dataset.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/content_objects/metric.py +0 -0
- {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
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/graph_objects/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/graph_objects/graph.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/entity_model/workspace.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/model_container.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/clone.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/constants.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/deploy.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/gdc_core.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/package.json +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/cli/utils.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/client.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/compute_to_sdk_converter.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/__init__.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/attribute.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/base.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/execution.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/filter.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/metric.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/service.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/config.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/py.typed +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/sdk.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/support.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/table.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/type_converter.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/utils.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/visualization.py +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk.egg-info/dependency_links.txt +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk.egg-info/top_level.txt +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/setup.cfg +0 -0
- {gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/tests/test_client.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
:
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
:
|
|
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
|
-
:
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
:
|
|
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
|
|
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
|
|
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
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/service.py
RENAMED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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=[
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/catalog_service_base.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/data_source/service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/export/__init__.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/export/request.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/export/service.py
RENAMED
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/organization/service.py
RENAMED
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/permission/service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/user/entity_model/user.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/validate_by_item.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/catalog/workspace/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/__init__.py
RENAMED
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/attribute.py
RENAMED
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk/compute/model/execution.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_sdk-1.30.1.dev2 → gooddata_sdk-1.31.1.dev1}/gooddata_sdk.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|