From df8252ea98030fa5159cfebdb92d15254c2cd085 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 26 Dec 2024 15:31:31 +0100 Subject: [PATCH] feature(chalice): store card's compare-to --- api/chalicelib/core/metrics/custom_metrics.py | 28 +++++++++++++++---- api/schemas/schemas.py | 5 ++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/api/chalicelib/core/metrics/custom_metrics.py b/api/chalicelib/core/metrics/custom_metrics.py index c6bf82b61b..0065c1a479 100644 --- a/api/chalicelib/core/metrics/custom_metrics.py +++ b/api/chalicelib/core/metrics/custom_metrics.py @@ -208,11 +208,15 @@ def get_issues(project: schemas.ProjectContext, user_id: int, data: schemas.Card return supported.get(data.metric_type, not_supported)() +def __get_global_card_info(data: schemas.CardSchema): + r = {"hideExcess": data.hide_excess, "compareTo": data.compare_to} + return r + + def __get_path_analysis_card_info(data: schemas.CardPathAnalysis): r = {"start_point": [s.model_dump() for s in data.start_point], "start_type": data.start_type, - "excludes": [e.model_dump() for e in data.excludes], - "hideExcess": data.hide_excess} + "excludes": [e.model_dump() for e in data.excludes]} return r @@ -237,8 +241,10 @@ def create_card(project: schemas.ProjectContext, user_id, data: schemas.CardSche series_len = len(data.series) params = {"user_id": user_id, "project_id": project.project_id, **data.model_dump(), **_data, "default_config": json.dumps(data.default_config.model_dump()), "card_info": None} + params["card_info"] = __get_global_card_info(data=data) if data.metric_type == schemas.MetricType.PATH_ANALYSIS: - params["card_info"] = json.dumps(__get_path_analysis_card_info(data=data)) + params["card_info"] = {**params["card_info"], **__get_path_analysis_card_info(data=data)} + params["card_info"] = json.dumps(params["card_info"]) query = """INSERT INTO metrics (project_id, user_id, name, is_public, view_type, metric_type, metric_of, metric_value, @@ -298,16 +304,18 @@ def update_card(metric_id, user_id, project_id, data: schemas.CardSchema): if i not in u_series_ids: d_series_ids.append(i) params["d_series_ids"] = tuple(d_series_ids) - params["card_info"] = None params["session_data"] = json.dumps(metric["data"]) + params["card_info"] = __get_global_card_info(data=data) if data.metric_type == schemas.MetricType.PATH_ANALYSIS: - params["card_info"] = json.dumps(__get_path_analysis_card_info(data=data)) + params["card_info"] = {**params["card_info"], **__get_path_analysis_card_info(data=data)} elif data.metric_type == schemas.MetricType.HEAT_MAP: if data.session_id is not None: params["session_data"] = json.dumps({"sessionId": data.session_id}) elif metric.get("data") and metric["data"].get("sessionId"): params["session_data"] = json.dumps({"sessionId": metric["data"]["sessionId"]}) + params["card_info"] = json.dumps(params["card_info"]) + with pg_client.PostgresClient() as cur: sub_queries = [] if len(n_series) > 0: @@ -442,8 +450,14 @@ def delete_card(project_id, metric_id, user_id): return {"state": "success"} +def __get_global_attributes(row): + card_info = row.get("cardInfo", {}) + row["compareTo"] = card_info.get("compareTo", []) + return row + + def __get_path_analysis_attributes(row): - card_info = row.pop("cardInfo") + card_info = row.get("cardInfo", {}) row["excludes"] = card_info.get("excludes", []) row["startPoint"] = card_info.get("startPoint", []) row["startType"] = card_info.get("startType", "start") @@ -496,6 +510,8 @@ def get_card(metric_id, project_id, user_id, flatten: bool = True, include_data: row = helper.dict_to_camel_case(row) if row["metricType"] == schemas.MetricType.PATH_ANALYSIS: row = __get_path_analysis_attributes(row=row) + row = __get_global_attributes(row=row) + row.pop("cardInfo") return row diff --git a/api/schemas/schemas.py b/api/schemas/schemas.py index 3935841cd5..cbe3312217 100644 --- a/api/schemas/schemas.py +++ b/api/schemas/schemas.py @@ -933,6 +933,8 @@ class CardSessionsSchema(_TimedSchema, _PaginatedSchema): # events: List[SessionSearchEventSchema2] = Field(default=[], doc_hidden=True) filters: List[GroupedFilterType] = Field(default=[]) + compare_to: Optional[List[str]] = Field(default=None) + # Used mainly for PathAnalysis, and could be used by other cards hide_excess: Optional[bool] = Field(default=False, description="Hide extra values") @@ -1237,8 +1239,7 @@ def __validator(self): # Union of cards-schemas that doesn't change between FOSS and EE __cards_union_base = Union[ CardTimeSeries, CardTable, CardFunnel, - CardErrors, - CardWebVital, CardHeatMap, + CardErrors, CardWebVital, CardHeatMap, CardPathAnalysis] CardSchema = ORUnion(__cards_union_base, discriminator='metric_type')