diff --git a/api/chalicelib/core/dashboards2.py b/api/chalicelib/core/dashboards2.py index 215a4f9ea..adb7884fe 100644 --- a/api/chalicelib/core/dashboards2.py +++ b/api/chalicelib/core/dashboards2.py @@ -27,11 +27,20 @@ def create_dashboard(project_id, user_id, data: schemas.CreateDashboardSchema): with pg_client.PostgresClient() as cur: pg_query = f"""INSERT INTO dashboards(project_id, user_id, name, is_public, is_pinned) VALUES(%(projectId)s, %(userId)s, %(name)s, %(is_public)s, %(is_pinned)s) - RETURNING *;""" + RETURNING *""" params = {"userId": user_id, "projectId": project_id, **data.dict()} + if data.metrics is not None and len(data.metrics) > 0: + pg_query = f"""WITH dash AS ({pg_query}) + INSERT INTO dashboard_widgets(dashboard_id, metric_id, user_id) + VALUES {",".join([f"((SELECT dashboard_id FROM dash),%(metric_id_{i})s, %(userId)s)" for i in range(len(data.metrics))])} + RETURNING (SELECT dashboard_id FROM dash)""" + for i, m in enumerate(data.metrics): + params[f"metric_id_{i}"] = m cur.execute(cur.mogrify(pg_query, params)) row = cur.fetchone() - return helper.dict_to_camel_case(row) + if row is None: + return {"errors": ["something went wrong while creating the dashboard"]} + return {"data": get_dashboard(project_id=project_id, user_id=user_id, dashboard_id=row["dashboard_id"])} def get_dashboards(project_id, user_id): @@ -87,10 +96,10 @@ def delete_dashboard(project_id, user_id, dashboard_id): return {"data": {"success": True}} -def update_dashboard(project_id, user_id, dashboard_id, data: schemas.CreateDashboardSchema): +def update_dashboard(project_id, user_id, dashboard_id, data: schemas.EditDashboardSchema): with pg_client.PostgresClient() as cur: pg_query = """UPDATE dashboards - SET name = %(name)s, is_pinned = %(is_pinned)s, is_public = %(is_public)s + SET name = %(name)s, is_public = %(is_public)s WHERE dashboards.project_id = %(projectId)s AND dashboard_id = %(dashboard_id)s AND (dashboards.user_id = %(userId)s OR is_public) diff --git a/api/routers/subs/metrics.py b/api/routers/subs/metrics.py index 2d3c116d3..88cfd3937 100644 --- a/api/routers/subs/metrics.py +++ b/api/routers/subs/metrics.py @@ -12,7 +12,7 @@ public_app, app, app_apikey = get_routers() @app.put('/{projectId}/dashboards', tags=["dashboard"]) def create_dashboards(projectId: int, data: schemas.CreateDashboardSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): - return {"data": dashboards2.create_dashboard(project_id=projectId, user_id=context.user_id, data=data)} + return dashboards2.create_dashboard(project_id=projectId, user_id=context.user_id, data=data) @app.get('/{projectId}/dashboards', tags=["dashboard"]) @@ -27,7 +27,7 @@ def get_dashboard(projectId: int, dashboardId: int, context: schemas.CurrentCont @app.post('/{projectId}/dashboards/{dashboardId}', tags=["dashboard"]) @app.put('/{projectId}/dashboards/{dashboardId}', tags=["dashboard"]) -def update_dashboard(projectId: int, dashboardId: int, data: schemas.CreateDashboardSchema = Body(...), +def update_dashboard(projectId: int, dashboardId: int, data: schemas.EditDashboardSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): return {"data": dashboards2.update_dashboard(project_id=projectId, user_id=context.user_id, dashboard_id=dashboardId, data=data)} diff --git a/api/schemas.py b/api/schemas.py index ef1972d98..0135aafc0 100644 --- a/api/schemas.py +++ b/api/schemas.py @@ -881,23 +881,25 @@ class CreateDashboardSchema(BaseModel): name: str = Field(..., min_length=1) is_public: bool = Field(default=False) is_pinned: bool = Field(default=False) + metrics: Optional[List[int]] = Field(default=[]) + + class Config: + alias_generator = attribute_to_camel_case + + +class EditDashboardSchema(BaseModel): + name: str = Field(..., min_length=1) + is_public: bool = Field(default=False) class Config: alias_generator = attribute_to_camel_case class AddWidgetToDashboardPayloadSchema(BaseModel): - metric_id: Optional[int] = Field(default=None) + metric_id: int = Field(default=None) name: Optional[str] = Field(default=None) config: dict = Field(default={}) - @root_validator - def validator(cls, values): - assert bool(values.get("template_id") is not None) != bool(values.get("metric_id") is not None), \ - f"templateId or metricId should be provided, but not both at the same time" - - return values - class Config: alias_generator = attribute_to_camel_case