Fix dashboards

This commit is contained in:
phil 2024-03-24 11:21:11 +05:30
parent d539a72e6a
commit 5434c7d6ef
6 changed files with 330 additions and 74 deletions

View file

@ -1,6 +1,7 @@
import logging
from pathlib import Path
from json import dumps
from typing import Annotated
from fastapi import Depends, APIRouter, HTTPException, status, responses
from sqlalchemy.orm import selectinload
@ -14,8 +15,8 @@ from gisaf.database import fastapi_db_session as db_session
from gisaf.models.authentication import User
from gisaf.models.dashboard import (
DashboardPage, DashboardPageSection,
DashboadPageSectionType, DashboardPage_,
DashboardGroup, DashboardHome,
DashboardPageMetaData,
DashboardGroup, DashboardHome, Dashboard, DashboardSection
)
from gisaf.models.misc import NotADataframeError
from gisaf.security import get_current_active_user
@ -46,10 +47,12 @@ async def get_groups(
) -> list[DashboardGroup]:
query = select(DashboardPage)
data = await db_session.exec(query)
groups: dict[str, DashboardPage_] = {}
groups: dict[str, DashboardPageMetaData] = {}
for page in data.all():
page_field = DashboardPage_(name=page.name, group=page.group,
description=page.description)
page_field = DashboardPageMetaData(name=page.name, group=page.group,
description=page.description,
viewable_role=page.viewable_role
)
group = groups.get(page.group)
if group is None:
group = DashboardGroup(name=page.group, pages=[page_field])
@ -80,9 +83,10 @@ async def get_home() -> DashboardHome:
async def get_dashboard_page(group: str, name: str,
db_session: db_session,
user: User = Depends(get_current_active_user),
) -> DashboardPage_:
query1 = select(DashboardPage).where((DashboardPage.name==name)
& (DashboardPage.group==group))
) -> Dashboard:
query1 = select(DashboardPage).\
options(selectinload(DashboardPage.sections)).\
where((DashboardPage.name==name) & (DashboardPage.group==group))
data1 = await db_session.exec(query1)
page = data1.one_or_none()
if not page:
@ -98,7 +102,7 @@ async def get_dashboard_page(group: str, name: str,
username = user.username if user is not None else "Anonymous"
logger.info(f'{username} tried to access dashboard page {name}')
raise HTTPException(status.HTTP_401_UNAUTHORIZED)
dp = DashboardPage_(
dp = Dashboard(
name=page.name,
group=page.group,
description=page.description,
@ -111,7 +115,7 @@ async def get_dashboard_page(group: str, name: str,
for p in page.expanded_panes.split(',')
] if page.expanded_panes else [],
sections=[
DashboadPageSectionType(
DashboardSection(
name=dps.name,
plot=dps.get_plot_url()
)
@ -126,7 +130,7 @@ async def get_dashboard_page(group: str, name: str,
if isinstance(df, gpd.GeoDataFrame):
gdf = pd.DataFrame(df.drop(columns=['geometry']))
df = gdf
dp.dfData = df.to_json(orient='table', double_precision=2)
dp.dfData = df.reset_index().to_dict(orient='records')
except NotADataframeError:
logger.warning(f'Dashboard: cannot read dataframe for page {page.name}')
except Exception as err:

View file

@ -21,7 +21,7 @@ from gisaf.models.info import (LegendItem, ModelAction, ModelInfo,
TagActions)
from gisaf.models.measures import MeasuresItem
from gisaf.models.survey import Equipment, SurveyMeta, Surveyor
from gisaf.config import Survey, conf
from gisaf.config import conf
from gisaf.models.bootstrap import BootstrapData
from gisaf.models.store import Store, StoreNameOnly
from gisaf.models.project import Project
@ -29,14 +29,12 @@ from gisaf.models.authentication import UserRoleLink #, ACL
from gisaf.database import pandas_query, fastapi_db_session as db_session
from gisaf.security import (
Token,
authenticate_user, get_current_user, create_access_token,
authenticate_user, get_current_active_user, create_access_token,
)
from gisaf.registry import registry, NotInRegistry
from gisaf.custom_store_base import BaseStore
from gisaf.redis_tools import store as redis_store
from gisaf.models.info import (
FeatureInfo, InfoItem, Attachment, InfoCategory
)
from gisaf.models.info import FeatureInfo
from gisaf.live_utils import get_live_feature_info
from gisaf.plugins import manager as plugin_manager, NoSuchAction
from gisaf.utils import gisTypeSymbolMap
@ -53,7 +51,7 @@ api = APIRouter(
@api.get('/bootstrap')
async def bootstrap(
user: Annotated[UserRead, Depends(get_current_user)]) -> BootstrapData:
user: Annotated[UserRead, Depends(get_current_active_user)]) -> BootstrapData:
return BootstrapData(user=user)
@ -78,7 +76,7 @@ async def login_for_access_token(
@api.get('/logout')
async def logout(
user: Annotated[UserRead, Depends(get_current_user)]):
user: Annotated[UserRead, Depends(get_current_active_user)]):
logger.info(f'{user.username} ({user.id}) logged out')
@ -100,7 +98,7 @@ async def get_roles(
@api.get('/acls')
async def get_acls(db_session: db_session,
user: Annotated[User, Depends(get_current_user)]) -> list[UserRoleLink]:
user: Annotated[User, Depends(get_current_active_user)]) -> list[UserRoleLink]:
"""New: ACLs returned as UserRoleLink"""
if not user or not user.has_role('manager'):
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)