Skip to content

Commit ada6cb0

Browse files
committed
feat: add support for ExportDefinition
JIRA: PSDK-209 risk: low
1 parent c23e0cb commit ada6cb0

File tree

6 files changed

+128
-42
lines changed

6 files changed

+128
-42
lines changed

docker-compose.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ services:
2020
GDC_FEATURES_VALUES_ENABLE_ANALYTICAL_DASHBOARD_PERMISSIONS: "true"
2121
GDC_FEATURES_VALUES_ENABLE_METRIC_SQL_AND_DATA_EXPLAIN: 'ENABLED'
2222
GDC_FEATURES_VALUES_ENABLE_ROLLUP_TOTALS: "true"
23+
GDC_FEATURES_VALUES_ENABLE_ROLLUP_TOTALS_FOR_METRICS: "true"
24+
GDC_FEATURES_VALUES_ENABLE_SCHEDULING: "true"
25+
GDC_FEATURES_VALUES_ENABLE_ALERTING: "true"
26+
GDC_FEATURES_VALUES_ENABLE_SMTP: "true"
2327
# In the case of failing tests (HTTP 500), you can increase the memory for the metadata API
2428
# METADATA_API_JAVA_OPTS: "-Xmx1024m -Xms512m"
2529
gooddata-fdw:

gooddata-sdk/gooddata_sdk/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@
135135
CatalogDeclarativeAnalytics,
136136
CatalogDeclarativeMetric,
137137
)
138+
from gooddata_sdk.catalog.workspace.declarative_model.workspace.analytics_model.export_definition import (
139+
CatalogDeclarativeExportDefinition,
140+
CatalogDeclarativeExportDefinitionRequestPayload,
141+
)
138142
from gooddata_sdk.catalog.workspace.declarative_model.workspace.logical_model.data_filter_references import (
139143
CatalogDeclarativeWorkspaceDataFilterReferences,
140144
)

gooddata-sdk/gooddata_sdk/catalog/export/request.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ class ExportRequest(Base):
6363
"""
6464

6565
format: str
66-
execution_result: str
6766
file_name: str
67+
execution_result: Optional[str] = None
6868
settings: Optional[ExportSettings] = None
6969
custom_override: Optional[ExportCustomOverride] = None
7070

gooddata-sdk/gooddata_sdk/catalog/workspace/declarative_model/workspace/analytics_model/analytics_model.py

+35-41
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
from __future__ import annotations
33

44
from pathlib import Path
5-
from typing import Any, Optional, TypeVar, Union
5+
from typing import Any, Optional, Union
66

77
import attr
8+
from attrs import define
89
from cattrs import global_converter, structure
910
from gooddata_api_client.model.declarative_analytical_dashboard import DeclarativeAnalyticalDashboard
1011
from gooddata_api_client.model.declarative_analytical_dashboard_extension import DeclarativeAnalyticalDashboardExtension
@@ -17,14 +18,19 @@
1718
from gooddata_api_client.model.declarative_visualization_object import DeclarativeVisualizationObject
1819

1920
from gooddata_sdk.catalog.base import Base
20-
from gooddata_sdk.catalog.identifier import CatalogUserIdentifier
2121
from gooddata_sdk.catalog.permission.declarative_model.permission import (
2222
CatalogDeclarativeDashboardPermissionsForAssignee,
2323
CatalogDeclarativeDashboardPermissionsForAssigneeRule,
2424
)
25-
from gooddata_sdk.utils import create_directory, get_sorted_yaml_files, read_layout_from_file, write_layout_to_file
25+
from gooddata_sdk.catalog.workspace.declarative_model.workspace.analytics_model.base import (
26+
CatalogAnalyticsBase,
27+
CatalogAnalyticsObjectBase,
28+
)
29+
from gooddata_sdk.catalog.workspace.declarative_model.workspace.analytics_model.export_definition import (
30+
CatalogDeclarativeExportDefinition,
31+
)
32+
from gooddata_sdk.utils import create_directory, get_sorted_yaml_files
2633

27-
T = TypeVar("T", bound="CatalogAnalyticsObjectBase")
2834
AnalyticsObjects = Union[
2935
DeclarativeAnalyticalDashboard,
3036
DeclarativeDashboardPlugin,
@@ -41,6 +47,7 @@
4147
LAYOUT_METRICS_DIR = "metrics"
4248
LAYOUT_VISUALIZATION_OBJECTS_DIR = "visualization_objects"
4349
ATTRIBUTE_HIERARCHY_OBJECTS_DIR = "attribute_hierarchy_objects"
50+
EXPORT_DEFINITION_DIR = "export_definitions"
4451

4552

4653
@attr.s(auto_attribs=True, kw_only=True)
@@ -70,7 +77,7 @@ class CatalogDeclarativeAnalyticsLayer(Base):
7077
filter_contexts: list[CatalogDeclarativeFilterContext] = attr.field(factory=list)
7178
metrics: list[CatalogDeclarativeMetric] = attr.field(factory=list)
7279
visualization_objects: list[CatalogDeclarativeVisualizationObject] = attr.field(factory=list)
73-
export_definitions: list[dict] = attr.field(factory=list)
80+
export_definitions: list[CatalogDeclarativeExportDefinition] = attr.field(factory=list)
7481

7582
@staticmethod
7683
def client_class() -> type[DeclarativeAnalyticsLayer]:
@@ -124,6 +131,12 @@ def get_attribute_hierarchy_folder(analytics_model_folder: Path) -> Path:
124131
create_directory(folder)
125132
return folder
126133

134+
@staticmethod
135+
def get_export_definition_dif(analytics_model_folder: Path) -> Path:
136+
folder = analytics_model_folder / EXPORT_DEFINITION_DIR
137+
create_directory(folder)
138+
return folder
139+
127140
def store_to_disk(self, workspace_folder: Path) -> None:
128141
analytics_model_folder = self.get_analytics_model_folder(workspace_folder)
129142

@@ -134,6 +147,7 @@ def store_to_disk(self, workspace_folder: Path) -> None:
134147
metrics_folder = self.get_metrics_folder(analytics_model_folder)
135148
visualization_objects_folder = self.get_visualization_objects_folder(analytics_model_folder)
136149
attribute_hierarchy_folder = self.get_attribute_hierarchy_folder(analytics_model_folder)
150+
export_definition_folder = self.get_export_definition_dif(analytical_dashboards_folder)
137151

138152
for analytical_dashboard in self.analytical_dashboards:
139153
analytical_dashboard.store_to_disk(analytical_dashboards_folder)
@@ -156,6 +170,9 @@ def store_to_disk(self, workspace_folder: Path) -> None:
156170
for attribute_hierarchy in self.attribute_hierarchies:
157171
attribute_hierarchy.store_to_disk(attribute_hierarchy_folder)
158172

173+
for export_definition in self.export_definitions:
174+
export_definition.store_to_disk(export_definition_folder)
175+
159176
@classmethod
160177
def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLayer:
161178
analytics_model_folder = cls.get_analytics_model_folder(workspace_folder)
@@ -166,6 +183,7 @@ def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLa
166183
metrics_folder = cls.get_metrics_folder(analytics_model_folder)
167184
visualization_objects_folder = cls.get_visualization_objects_folder(analytics_model_folder)
168185
attribute_hierarchy_folder = cls.get_attribute_hierarchy_folder(analytics_model_folder)
186+
export_definition_folder = cls.get_export_definition_dif(analytical_dashboards_folder)
169187

170188
analytical_dashboard_files = get_sorted_yaml_files(analytical_dashboards_folder)
171189
analytical_dashboard_extension_files = get_sorted_yaml_files(analytical_dashboard_extensions_folder)
@@ -174,6 +192,7 @@ def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLa
174192
metric_files = get_sorted_yaml_files(metrics_folder)
175193
visualization_object_files = get_sorted_yaml_files(visualization_objects_folder)
176194
attribute_hierarchy_files = get_sorted_yaml_files(attribute_hierarchy_folder)
195+
export_definition_files = get_sorted_yaml_files(export_definition_folder)
177196

178197
analytical_dashboards = [
179198
CatalogDeclarativeAnalyticalDashboard.load_from_disk(analytical_dashboard_file)
@@ -200,6 +219,10 @@ def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLa
200219
CatalogDeclarativeAttributeHierarchy.load_from_disk(attribute_hierarchy_file)
201220
for attribute_hierarchy_file in attribute_hierarchy_files
202221
]
222+
export_definitions = [
223+
CatalogDeclarativeExportDefinition.load_from_disk(export_definition_file)
224+
for export_definition_file in export_definition_files
225+
]
203226
return cls(
204227
analytical_dashboards=analytical_dashboards,
205228
analytical_dashboard_extensions=analytical_dashboard_extensions,
@@ -208,41 +231,12 @@ def load_from_disk(cls, workspace_folder: Path) -> CatalogDeclarativeAnalyticsLa
208231
filter_contexts=filter_contexts,
209232
metrics=metrics,
210233
visualization_objects=visualization_objects,
234+
export_definitions=export_definitions,
211235
)
212236

213237

214-
@attr.s(auto_attribs=True, kw_only=True)
215-
class CatalogAnalyticsObjectBase(Base):
216-
id: str
217-
218-
def store_to_disk(self, analytics_folder: Path) -> None:
219-
analytics_file = analytics_folder / f"{self.id}.yaml"
220-
write_layout_to_file(analytics_file, self.to_api().to_dict(camel_case=True))
221-
222-
@classmethod
223-
def load_from_disk(cls: type[T], analytics_file: Path) -> T:
224-
analytics_layout = read_layout_from_file(analytics_file)
225-
return cls.from_dict(analytics_layout)
226-
227-
228-
@attr.s(auto_attribs=True, kw_only=True)
229-
class CatalogAnalyticsBase(CatalogAnalyticsObjectBase):
230-
title: str
231-
content: dict[str, Any]
232-
description: Optional[str] = None
233-
tags: Optional[list[str]] = None
234-
235-
236-
@attr.s(auto_attribs=True, kw_only=True)
237-
class CatalogAnalyticsBaseMeta(CatalogAnalyticsBase):
238-
created_at: Optional[str] = None
239-
created_by: Optional[CatalogUserIdentifier] = None
240-
modified_at: Optional[str] = None
241-
modified_by: Optional[CatalogUserIdentifier] = None
242-
243-
244-
@attr.s(auto_attribs=True, kw_only=True)
245-
class CatalogDeclarativeAnalyticalDashboard(CatalogAnalyticsBaseMeta):
238+
@define(auto_attribs=True, kw_only=True)
239+
class CatalogDeclarativeAnalyticalDashboard(CatalogAnalyticsBase):
246240
permissions: Optional[
247241
list[
248242
Union[
@@ -274,7 +268,7 @@ def structure_permissions(
274268

275269

276270
@attr.s(auto_attribs=True, kw_only=True)
277-
class CatalogDeclarativeDashboardPlugin(CatalogAnalyticsBaseMeta):
271+
class CatalogDeclarativeDashboardPlugin(CatalogAnalyticsBase):
278272
@staticmethod
279273
def client_class() -> type[DeclarativeDashboardPlugin]:
280274
return DeclarativeDashboardPlugin
@@ -299,21 +293,21 @@ def client_class() -> type[DeclarativeFilterContext]:
299293

300294

301295
@attr.s(auto_attribs=True, kw_only=True)
302-
class CatalogDeclarativeMetric(CatalogAnalyticsBaseMeta):
296+
class CatalogDeclarativeMetric(CatalogAnalyticsBase):
303297
@staticmethod
304298
def client_class() -> type[DeclarativeMetric]:
305299
return DeclarativeMetric
306300

307301

308302
@attr.s(auto_attribs=True, kw_only=True)
309-
class CatalogDeclarativeVisualizationObject(CatalogAnalyticsBaseMeta):
303+
class CatalogDeclarativeVisualizationObject(CatalogAnalyticsBase):
310304
@staticmethod
311305
def client_class() -> type[DeclarativeVisualizationObject]:
312306
return DeclarativeVisualizationObject
313307

314308

315309
@attr.s(auto_attribs=True, kw_only=True)
316-
class CatalogDeclarativeAttributeHierarchy(CatalogAnalyticsBaseMeta):
310+
class CatalogDeclarativeAttributeHierarchy(CatalogAnalyticsBase):
317311
@staticmethod
318312
def client_class() -> type[DeclarativeAttributeHierarchy]:
319313
return DeclarativeAttributeHierarchy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# (C) 2024 GoodData Corporation
2+
from pathlib import Path
3+
from typing import Any, Optional, TypeVar
4+
5+
from attrs import define
6+
7+
from gooddata_sdk.catalog.base import Base
8+
from gooddata_sdk.catalog.identifier import CatalogUserIdentifier
9+
from gooddata_sdk.utils import read_layout_from_file, write_layout_to_file
10+
11+
T = TypeVar("T", bound="CatalogAnalyticsObjectBase")
12+
13+
14+
@define(auto_attribs=True, kw_only=True)
15+
class CatalogAnalyticsObjectBase(Base):
16+
id: str
17+
18+
def store_to_disk(self, analytics_folder: Path) -> None:
19+
analytics_file = analytics_folder / f"{self.id}.yaml"
20+
write_layout_to_file(analytics_file, self.to_api().to_dict(camel_case=True))
21+
22+
@classmethod
23+
def load_from_disk(cls: type[T], analytics_file: Path) -> T:
24+
analytics_layout = read_layout_from_file(analytics_file)
25+
return cls.from_dict(analytics_layout)
26+
27+
28+
@define(auto_attribs=True, kw_only=True)
29+
class CatalogAnalyticsBaseMeta(CatalogAnalyticsObjectBase):
30+
created_at: Optional[str] = None
31+
created_by: Optional[CatalogUserIdentifier] = None
32+
modified_at: Optional[str] = None
33+
modified_by: Optional[CatalogUserIdentifier] = None
34+
35+
36+
@define(auto_attribs=True, kw_only=True)
37+
class CatalogAnalyticsBase(CatalogAnalyticsBaseMeta):
38+
title: str
39+
content: dict[str, Any]
40+
description: Optional[str] = None
41+
tags: Optional[list[str]] = None
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# (C) 2024 GoodData Corporation
2+
from typing import Optional
3+
4+
from attrs import define
5+
from gooddata_api_client.model.declarative_export_definition import DeclarativeExportDefinition
6+
from gooddata_api_client.model.declarative_export_definition_request_payload import (
7+
DeclarativeExportDefinitionRequestPayload,
8+
)
9+
10+
from gooddata_sdk import ExportCustomOverride, ExportSettings
11+
from gooddata_sdk.catalog.base import Base
12+
from gooddata_sdk.catalog.workspace.declarative_model.workspace.analytics_model.base import CatalogAnalyticsBaseMeta
13+
14+
15+
@define(auto_attribs=True, kw_only=True)
16+
class CatalogDeclarativeExportDefinitionRequestPayload(Base):
17+
custom_override: Optional[ExportCustomOverride] = None
18+
execution_result: Optional[str] = None
19+
metadata: Optional[dict] = None
20+
related_dashboard_id: Optional[str] = None
21+
settings: Optional[ExportSettings] = None
22+
visualization_object: Optional[str] = None
23+
visualization_object_custom_filters: Optional[list[dict]] = None
24+
file_name: Optional[str] = None
25+
format: Optional[str] = None
26+
dashboard_id: Optional[str] = None
27+
28+
@staticmethod
29+
def client_class() -> type[DeclarativeExportDefinitionRequestPayload]:
30+
return DeclarativeExportDefinitionRequestPayload
31+
32+
33+
@define(auto_attribs=True, kw_only=True)
34+
class CatalogDeclarativeExportDefinition(CatalogAnalyticsBaseMeta):
35+
id: str
36+
title: str
37+
request_payload: CatalogDeclarativeExportDefinitionRequestPayload
38+
description: Optional[str] = None
39+
tags: Optional[list[str]] = None
40+
41+
@staticmethod
42+
def client_class() -> type[DeclarativeExportDefinition]:
43+
return DeclarativeExportDefinition

0 commit comments

Comments
 (0)