Skip to content

Commit

Permalink
Add separate api endpoint for detailed visualization indexing
Browse files Browse the repository at this point in the history
  • Loading branch information
guerler committed Oct 19, 2023
1 parent 2b86d71 commit 7c0ab18
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 81 deletions.
2 changes: 1 addition & 1 deletion client/src/components/Grid/configs/visualizations.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { withPrefix } from "@/utils/redirect";
import { errorMessageAsString, rethrowSimple } from "@/utils/simple-error";

export const VisualizationsGrid = {
url: "/api/visualizations?view=detailed&sharing=true",
url: "/api/visualizations/detailed?sharing=true",
resource: "visualizations",
item: "visualization",
plural: "Visualizations",
Expand Down
2 changes: 1 addition & 1 deletion lib/galaxy/managers/visualizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
text_column_filter,
)

from galaxy.schema.schema import (
from galaxy.schema.visualization import (
VisualizationIndexQueryPayload,
)

Expand Down
57 changes: 0 additions & 57 deletions lib/galaxy/schema/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -572,63 +572,6 @@ class Config:
extra = Extra.allow # Allow any fields temporarily until the model is annotated


VisualizationSortByEnum = Literal["update_time", "title", "username"]


class VisualizationIndexQueryPayload(Model):
deleted: bool = False
show_published: Optional[bool] = None
show_shared: Optional[bool] = None
user_id: Optional[DecodedDatabaseIdField] = None
sort_by: VisualizationSortByEnum = Field("update_time", title="Sort By", description="Sort pages by this attribute.")
sort_desc: Optional[bool] = Field(default=False, title="Sort descending", description="Sort in descending order.")
search: Optional[str] = Field(default=None, title="Filter text", description="Freetext to search.")
limit: Optional[int] = Field(default=100, lt=1000, title="Limit", description="Maximum number of pages to return.")
offset: Optional[int] = Field(default=0, title="Offset", description="Number of pages to skip.")


class VisualizationSummary(Model):
id: DecodedDatabaseIdField = Field(
..., # Required
title="ID",
description="Encoded ID of the Visualization.",
)
title: str = Field(
title="Title",
description="The name of the visualization.",
)
type: str = Field(
..., # Required
title="Type",
description="The type of the visualization.",
)
dbkey: str = Field(
default=None,
title="DbKey",
description="The database key of the visualization.",
)


class VisualizationDetails(VisualizationSummary):
create_time: Optional[datetime] = CreateTimeField
update_time: Optional[datetime] = UpdateTimeField
tags: Optional[TagCollection] = Field(
..., # Required
title="Tags",
description="A list of tags to add to this item.",
)

class Config:
extra = Extra.allow # Allow any other extra fields


class VisualizationDetailsList(Model):
__root__: List[VisualizationDetails] = Field(
default=[],
title="List with detailed information of Visualizations.",
)


class HistoryItemBase(Model):
"""Basic information provided by items contained in a History."""

Expand Down
80 changes: 80 additions & 0 deletions lib/galaxy/schema/visualization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
from datetime import datetime
from typing import (
List,
Optional,
)

from pydantic import (
Extra,
Field,
)
from typing_extensions import (
Literal,
)

from galaxy.schema.fields import (
DecodedDatabaseIdField,
)
from galaxy.schema.schema import (
CreateTimeField,
TagCollection,
UpdateTimeField,
Model,
)


VisualizationSortByEnum = Literal["update_time", "title", "username"]


class VisualizationIndexQueryPayload(Model):
deleted: bool = False
show_published: Optional[bool] = None
show_shared: Optional[bool] = None
user_id: Optional[DecodedDatabaseIdField] = None
sort_by: VisualizationSortByEnum = Field("update_time", title="Sort By", description="Sort pages by this attribute.")
sort_desc: Optional[bool] = Field(default=True, title="Sort descending", description="Sort in descending order.")
search: Optional[str] = Field(default=None, title="Filter text", description="Freetext to search.")
limit: Optional[int] = Field(default=100, lt=1000, title="Limit", description="Maximum number of pages to return.")
offset: Optional[int] = Field(default=0, title="Offset", description="Number of pages to skip.")


class VisualizationSummary(Model):
id: DecodedDatabaseIdField = Field(
..., # Required
title="ID",
description="Encoded ID of the Visualization.",
)
title: str = Field(
title="Title",
description="The name of the visualization.",
)
type: str = Field(
..., # Required
title="Type",
description="The type of the visualization.",
)
dbkey: str = Field(
default=None,
title="DbKey",
description="The database key of the visualization.",
)


class VisualizationDetails(VisualizationSummary):
create_time: Optional[datetime] = CreateTimeField
update_time: Optional[datetime] = UpdateTimeField
tags: Optional[TagCollection] = Field(
..., # Required
title="Tags",
description="A list of tags to add to this item.",
)

class Config:
extra = Extra.allow # Allow any other extra fields


class VisualizationDetailsList(Model):
__root__: List[VisualizationDetails] = Field(
default=[],
title="List with detailed information of Visualizations.",
)
16 changes: 5 additions & 11 deletions lib/galaxy/webapps/galaxy/api/visualizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,11 @@
import logging

from typing import (
Any,
List,
Optional,
)

from fastapi import (
Body,
Depends,
Path,
Query,
Response,
Expand All @@ -30,15 +27,14 @@
from galaxy.managers.context import ProvidesUserContext
from galaxy.model.base import transaction
from galaxy.model.item_attrs import UsesAnnotations
from galaxy.schema import (
SerializationParams,
)
from galaxy.schema.fields import DecodedDatabaseIdField
from galaxy.schema.schema import (
SetSlugPayload,
ShareWithPayload,
ShareWithStatus,
SharingStatus,
)
from galaxy.schema.visualization import (
VisualizationDetailsList,
VisualizationIndexQueryPayload,
VisualizationSortByEnum,
Expand All @@ -56,7 +52,6 @@
search_query_param,
)
from galaxy.webapps.galaxy.api.common import (
query_serialization_params,
LimitQueryParam,
OffsetQueryParam,
)
Expand Down Expand Up @@ -118,17 +113,16 @@ class FastAPIVisualizations:
service: VisualizationsService = depends(VisualizationsService)

@router.get(
"/api/visualizations",
"/api/visualizations/detailed",
summary="Returns visualizations for the current user.",
)
def index(
def index_detailed(
self,
response: Response,
trans: ProvidesUserContext = DependsOnTrans,
deleted: bool = DeletedQueryParam,
limit: int = LimitQueryParam,
offset: int = OffsetQueryParam,
serialization_params: SerializationParams = Depends(query_serialization_params),
sharing: bool = SharingQueryParam,
user_id: Optional[DecodedDatabaseIdField] = UserIdQueryParam,
show_published: bool = ShowPublishedQueryParam,
Expand All @@ -149,7 +143,7 @@ def index(
offset=offset,
search=search,
)
entries, total_matches = self.service.index(trans, serialization_params, payload, include_total_count=True)
entries, total_matches = self.service.index_detailed(trans, payload, include_total_count=True, sharing=sharing)
response.headers["total_matches"] = str(total_matches)
return entries

Expand Down
25 changes: 14 additions & 11 deletions lib/galaxy/webapps/galaxy/services/visualizations.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import logging

from typing import (
List,
Tuple,
)

Expand All @@ -14,10 +13,7 @@
)
from galaxy.security.idencoding import IdEncodingHelper

from galaxy.schema import (
SerializationParams,
)
from galaxy.schema.schema import (
from galaxy.schema.visualization import (
VisualizationDetailsList,
VisualizationIndexQueryPayload,
)
Expand Down Expand Up @@ -48,12 +44,12 @@ def __init__(

# TODO: add the rest of the API actions here and call them directly from the API controller

def index(
def index_detailed(
self,
trans,
serialization_params: SerializationParams,
payload: VisualizationIndexQueryPayload,
include_total_count: bool = False
include_total_count: bool = False,
sharing: bool = False,
) -> Tuple[VisualizationDetailsList, int]:
"""Return a list of Visualizations viewable by the user
Expand All @@ -66,9 +62,16 @@ def index(
raise exceptions.AdminRequiredException("Only admins can index the visualizations of others")

entries, total_matches = self.manager.index_query(trans, payload, include_total_count)
results = [self.serializer.serialize_to_view(
content, user=trans.user, trans=trans, view="detailed"
) for content in entries]

results = []
for content in entries:
serialized_content = self.serializer.serialize_to_view(
content, user=trans.user, trans=trans, view="detailed"
)
if content.deleted is False and sharing:
sharing_dict = self.shareable_service.sharing(trans, content.id)
serialized_content.update(sharing_dict)
results.append(serialized_content)

return (
VisualizationDetailsList.construct(__root__=results),
Expand Down

0 comments on commit 7c0ab18

Please sign in to comment.