diff --git a/api/chalicelib/core/custom_metrics.py b/api/chalicelib/core/custom_metrics.py index c6c93a7b1..a43de6903 100644 --- a/api/chalicelib/core/custom_metrics.py +++ b/api/chalicelib/core/custom_metrics.py @@ -309,24 +309,27 @@ def get(metric_id, project_id, user_id, flatten=True): return helper.dict_to_camel_case(row) -def get_with_template(metric_id, project_id, user_id): +def get_with_template(metric_id, project_id, user_id, include_dashboard=True): with pg_client.PostgresClient() as cur: + sub_query="" + if include_dashboard: + sub_query="""LEFT JOIN LATERAL (SELECT COALESCE(jsonb_agg(connected_dashboards.* ORDER BY is_public,name),'[]'::jsonb) AS dashboards + FROM (SELECT dashboard_id, name, is_public + FROM dashboards + WHERE deleted_at ISNULL + AND project_id = %(project_id)s + AND ((user_id = %(user_id)s OR is_public))) AS connected_dashboards + ) AS connected_dashboards ON (TRUE)""" cur.execute( cur.mogrify( - """SELECT * + f"""SELECT * FROM metrics LEFT JOIN LATERAL (SELECT COALESCE(jsonb_agg(metric_series.* ORDER BY index),'[]'::jsonb) AS series FROM metric_series WHERE metric_series.metric_id = metrics.metric_id AND metric_series.deleted_at ISNULL ) AS metric_series ON (TRUE) - LEFT JOIN LATERAL (SELECT COALESCE(jsonb_agg(connected_dashboards.* ORDER BY is_public,name),'[]'::jsonb) AS dashboards - FROM (SELECT dashboard_id, name, is_public - FROM dashboards - WHERE deleted_at ISNULL - AND project_id = %(project_id)s - AND ((user_id = %(user_id)s OR is_public))) AS connected_dashboards - ) AS connected_dashboards ON (TRUE) + {sub_query} WHERE (metrics.project_id = %(project_id)s OR metrics.project_id ISNULL) AND metrics.deleted_at ISNULL AND (metrics.user_id = %(user_id)s OR metrics.is_public) diff --git a/api/chalicelib/core/dashboards2.py b/api/chalicelib/core/dashboards2.py index ed9a17d76..aa188bb1f 100644 --- a/api/chalicelib/core/dashboards2.py +++ b/api/chalicelib/core/dashboards2.py @@ -256,12 +256,14 @@ def get_predefined_metric(key: schemas.TemplatePredefinedKeys, project_id: int, def make_chart_metrics(project_id, user_id, metric_id, data: schemas.CustomMetricChartPayloadSchema): - raw_metric = custom_metrics.get_with_template(metric_id=metric_id, project_id=project_id, user_id=user_id) + raw_metric = custom_metrics.get_with_template(metric_id=metric_id, project_id=project_id, user_id=user_id, + include_dashboard=False) if raw_metric is None: return None + print(raw_metric) metric = schemas.CustomMetricAndTemplate = schemas.CustomMetricAndTemplate.parse_obj(raw_metric) if metric.is_template: - return get_predefined_metric(key=metric.key, project_id=project_id, data=data.dict()) + return get_predefined_metric(key=metric.predefined_key, project_id=project_id, data=data.dict()) else: return custom_metrics.make_chart(project_id=project_id, user_id=user_id, metric_id=metric_id, data=data, metric=raw_metric) @@ -273,7 +275,7 @@ def make_chart_widget(dashboard_id, project_id, user_id, widget_id, data: schema return None metric = schemas.CustomMetricAndTemplate = schemas.CustomMetricAndTemplate.parse_obj(raw_metric) if metric.is_template: - return get_predefined_metric(key=metric.key, project_id=project_id, data=data.dict()) + return get_predefined_metric(key=metric.predefined_key, project_id=project_id, data=data.dict()) else: return custom_metrics.make_chart(project_id=project_id, user_id=user_id, metric_id=raw_metric["metricId"], data=data, metric=raw_metric) diff --git a/api/schemas.py b/api/schemas.py index 7dd7774ba..e518b9914 100644 --- a/api/schemas.py +++ b/api/schemas.py @@ -939,7 +939,7 @@ class TemplatePredefinedKeys(str, Enum): class CustomMetricAndTemplate(BaseModel): is_template: bool = Field(...) project_id: Optional[int] = Field(...) - key: Optional[TemplatePredefinedKeys] = Field(...) + predefined_key: Optional[TemplatePredefinedKeys] = Field(...) class Config: alias_generator = attribute_to_camel_case