feat(api): create dashboard with widgets at the same time

This commit is contained in:
Taha Yassine Kraiem 2022-03-30 20:29:22 +02:00
parent 7d18c093eb
commit af1c88a573
3 changed files with 25 additions and 14 deletions

View file

@ -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)

View file

@ -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)}

View file

@ -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