From 2fef9044e10176f87d57b2ebaa75ebad06a2b605 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 3 Mar 2022 17:06:47 +0100 Subject: [PATCH] feat(api): drill down custom_metrics by merged filters --- api/chalicelib/core/custom_metrics.py | 24 +++++++++++++++++++++--- api/schemas.py | 10 +++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/api/chalicelib/core/custom_metrics.py b/api/chalicelib/core/custom_metrics.py index 785324591..05d729dbe 100644 --- a/api/chalicelib/core/custom_metrics.py +++ b/api/chalicelib/core/custom_metrics.py @@ -1,4 +1,5 @@ import json +from typing import Union import schemas from chalicelib.core import sessions @@ -43,11 +44,28 @@ def merged_live(project_id, data: schemas.CreateCustomMetricsSchema): return results -def make_chart(project_id, user_id, metric_id, data: schemas.CustomMetricChartPayloadSchema): +def __get_merged_metric(project_id, user_id, metric_id, + data: Union[schemas.CustomMetricChartPayloadSchema, + schemas.CustomMetricSessionsPayloadSchema]) \ + -> Union[schemas.CreateCustomMetricsSchema, None]: metric = get(metric_id=metric_id, project_id=project_id, user_id=user_id, flatten=False) if metric is None: return None metric: schemas.CreateCustomMetricsSchema = schemas.CreateCustomMetricsSchema.parse_obj({**data.dict(), **metric}) + if len(data.filters) > 0 or len(data.events) > 0: + for s in metric.series: + if len(data.filters) > 0: + s.filter.filters += data.filters + if len(data.events) > 0: + s.filter.events += data.events + return metric + + +def make_chart(project_id, user_id, metric_id, data: schemas.CustomMetricChartPayloadSchema): + metric: schemas.CreateCustomMetricsSchema = __get_merged_metric(project_id=project_id, user_id=user_id, + metric_id=metric_id, data=data) + if metric is None: + return None series_charts = __try_live(project_id=project_id, data=metric) if metric.view_type == schemas.MetricTimeseriesViewType.progress: return series_charts @@ -60,10 +78,10 @@ def make_chart(project_id, user_id, metric_id, data: schemas.CustomMetricChartPa def get_sessions(project_id, user_id, metric_id, data: schemas.CustomMetricSessionsPayloadSchema): - metric = get(metric_id=metric_id, project_id=project_id, user_id=user_id, flatten=False) + metric: schemas.CreateCustomMetricsSchema = __get_merged_metric(project_id=project_id, user_id=user_id, + metric_id=metric_id, data=data) if metric is None: return None - metric: schemas.CreateCustomMetricsSchema = schemas.CreateCustomMetricsSchema.parse_obj({**data.dict(), **metric}) results = [] for s in metric.series: s.filter.startDate = data.startDate diff --git a/api/schemas.py b/api/schemas.py index 1b0ab9ac5..e4dc7f1e7 100644 --- a/api/schemas.py +++ b/api/schemas.py @@ -428,7 +428,7 @@ class FilterType(str, Enum): duration = "DURATION" platform = "PLATFORM" metadata = "METADATA" - issue = "ISSUE" + issue = "ISSUES" events_count = "EVENTS_COUNT" utm_source = "UTM_SOURCE" utm_medium = "UTM_MEDIUM" @@ -619,7 +619,7 @@ class SessionsSearchPayloadSchema(BaseModel): alias_generator = attribute_to_camel_case -class FlatSessionsSearchPayloadSchema(SessionsSearchPayloadSchema): +class FlatSessionsSearch(BaseModel): events: Optional[List[_SessionSearchEventSchema]] = Field([]) filters: List[Union[SessionSearchFilterSchema, _SessionSearchEventSchema]] = Field([]) @@ -645,6 +645,10 @@ class FlatSessionsSearchPayloadSchema(SessionsSearchPayloadSchema): return values +class FlatSessionsSearchPayloadSchema(FlatSessionsSearch, SessionsSearchPayloadSchema): + pass + + class SessionsSearchCountSchema(FlatSessionsSearchPayloadSchema): # class SessionsSearchCountSchema(SessionsSearchPayloadSchema): sort: Optional[str] = Field(default=None) @@ -765,7 +769,7 @@ class TimeseriesMetricOfType(str, Enum): session_count = "sessionCount" -class CustomMetricSessionsPayloadSchema(BaseModel): +class CustomMetricSessionsPayloadSchema(FlatSessionsSearch): startDate: int = Field(TimeUTC.now(-7)) endDate: int = Field(TimeUTC.now())