Skip to content

Commit

Permalink
Avoid serializer, switch over to using schema only
Browse files Browse the repository at this point in the history
  • Loading branch information
guerler committed Nov 7, 2023
1 parent 27a756c commit e54778f
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 99 deletions.
4 changes: 2 additions & 2 deletions client/src/components/Grid/GridList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,8 @@ watch(operationMessage, () => {
@execute="onOperation($event, rowData)" />
<GridText v-else-if="fieldEntry.type == 'text'" :text="rowData[fieldEntry.key]" />
<SharingIndicators
v-else-if="fieldEntry.type == 'sharing' && rowData.sharing_status"
:object="rowData.sharing_status"
v-else-if="fieldEntry.type == 'sharing'"
:object="rowData"
@filter="(filter) => applyFilter(filter, true)" />
<UtcDate v-else-if="fieldEntry.type == 'date'" :date="rowData[fieldEntry.key]" mode="elapsed" />
<StatelessTags
Expand Down
2 changes: 1 addition & 1 deletion client/src/components/Grid/configs/visualizations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { errorMessageAsString, rethrowSimple } from "@/utils/simple-error";
/**
* Api endpoint handlers
*/
const getDetailedVisualizations = fetcher.path("/api/visualizations/detailed").method("get").create();
const getDetailedVisualizations = fetcher.path("/api/visualizations").method("get").create();
const updateTags = fetcher.path("/api/tags").method("put").create();

/**
Expand Down
21 changes: 2 additions & 19 deletions lib/galaxy/managers/visualizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,25 +182,8 @@ def __init__(self, app: MinimalManagerApp):
self.visualization_manager = self.manager

self.default_view = "summary"
self.add_view(
"summary",
[
"id",
"title",
"type",
"dbkey",
],
)
self.add_view(
"detailed",
[
"create_time",
"deleted",
"tags",
"update_time",
],
include_keys_from="summary",
)
self.add_view("summary", [])
self.add_view("detailed", [])

def add_serializers(self):
super().add_serializers()
Expand Down
19 changes: 18 additions & 1 deletion lib/galaxy/model/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9787,7 +9787,7 @@ class PageUserShareAssociation(Base, UserShareAssociation):
page = relationship("Page", back_populates="users_shared_with")


class Visualization(Base, HasTags, RepresentById):
class Visualization(Base, HasTags, Dictifiable, RepresentById):
__tablename__ = "visualization"
__table_args__ = (
Index("ix_visualization_dbkey", "dbkey", mysql_length=200),
Expand Down Expand Up @@ -9846,6 +9846,19 @@ class Visualization(Base, HasTags, RepresentById):
# returns a list of users that visualization is shared with.
users_shared_with_dot_users = association_proxy("users_shared_with", "user")

dict_element_visible_keys = [
"id",
"create_time",
"db_key",
"deleted",
"importable",
"published",
"tags",
"title",
"type",
"update_time",
]

def __init__(self, **kwd):
super().__init__(**kwd)
if self.latest_revision:
Expand All @@ -9872,6 +9885,10 @@ def copy(self, user=None, title=None):
copy_viz.latest_revision = copy_revision
return copy_viz

def to_dict(self, view="element"):
rval = super().to_dict(view=view)
return rval


class VisualizationRevision(Base, RepresentById):
__tablename__ = "visualization_revision"
Expand Down
50 changes: 27 additions & 23 deletions lib/galaxy/schema/visualization.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,45 +42,49 @@ class VisualizationSummary(Model):
title="ID",
description="Encoded ID of the Visualization.",
)
title: str = Field(
title="Title",
description="The name of the visualization.",
)
type: str = Field(
...,
title="Type",
description="The type of the visualization.",
)
dbkey: Optional[str] = Field(
default=None,
title="DbKey",
description="The database key of the visualization.",
)


class VisualizationSummaryList(Model):
__root__: List[VisualizationSummary] = Field(
default=[],
title="List with detailed information of Visualizations.",
deleted: bool = Field(
..., # Required
title="Deleted",
description="Whether this Visualization has been deleted.",
)
importable: bool = Field(
..., # Required
title="Importable",
description="Whether this Visualization can be imported.",
)
published: bool = Field(
..., # Required
title="Published",
description="Whether this Visualization has been published.",
)


class VisualizationDetails(VisualizationSummary):
create_time: Optional[datetime] = CreateTimeField
update_time: Optional[datetime] = UpdateTimeField
sharing_status: Optional[SharingStatus]
tags: Optional[TagCollection] = Field(
...,
title="Tags",
description="A list of tags to add to this item.",
)
title: str = Field(
title="Title",
description="The name of the visualization.",
)
type: str = Field(
...,
title="Type",
description="The type of the visualization.",
)
create_time: Optional[datetime] = CreateTimeField
update_time: Optional[datetime] = UpdateTimeField

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


class VisualizationDetailsList(Model):
__root__: List[VisualizationDetails] = Field(
class VisualizationSummaryList(Model):
__root__: List[VisualizationSummary] = Field(
default=[],
title="List with detailed information of Visualizations.",
)
38 changes: 2 additions & 36 deletions lib/galaxy/webapps/galaxy/api/visualizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
SharingStatus,
)
from galaxy.schema.visualization import (
VisualizationDetailsList,
VisualizationIndexQueryPayload,
VisualizationSortByEnum,
VisualizationSummaryList,
Expand Down Expand Up @@ -116,7 +115,7 @@ class FastAPIVisualizations:
"/api/visualizations",
summary="Returns visualizations for the current user.",
)
def index(
async def index(
self,
response: Response,
trans: ProvidesUserContext = DependsOnTrans,
Expand All @@ -143,40 +142,7 @@ def index(
)
entries, total_matches = self.service.index(trans, payload, include_total_count=True)
response.headers["total_matches"] = str(total_matches)
return VisualizationSummaryList.construct(__root__=entries)

@router.get(
"/api/visualizations/detailed",
summary="Returns visualizations for the current user with detailed resolution.",
)
def index_detailed(
self,
response: Response,
trans: ProvidesUserContext = DependsOnTrans,
deleted: bool = DeletedQueryParam,
limit: Optional[int] = LimitQueryParam,
offset: Optional[int] = OffsetQueryParam,
user_id: Optional[DecodedDatabaseIdField] = UserIdQueryParam,
show_published: bool = ShowPublishedQueryParam,
show_shared: bool = ShowSharedQueryParam,
sort_by: VisualizationSortByEnum = SortByQueryParam,
sort_desc: bool = SortDescQueryParam,
search: Optional[str] = SearchQueryParam,
) -> VisualizationDetailsList:
payload = VisualizationIndexQueryPayload.construct(
deleted=deleted,
user_id=user_id,
show_published=show_published,
show_shared=show_shared,
sort_by=sort_by,
sort_desc=sort_desc,
limit=limit,
offset=offset,
search=search,
)
entries, total_matches = self.service.index(trans, payload, detailed=True, include_total_count=True)
response.headers["total_matches"] = str(total_matches)
return VisualizationDetailsList.construct(__root__=entries)
return entries

@router.get(
"/api/visualizations/{id}/sharing",
Expand Down
23 changes: 6 additions & 17 deletions lib/galaxy/webapps/galaxy/services/visualizations.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import logging
from typing import (
Any,
List,
Tuple,
)

Expand All @@ -15,7 +13,7 @@
from galaxy.security.idencoding import IdEncodingHelper
from galaxy.webapps.galaxy.services.base import ServiceBase
from galaxy.webapps.galaxy.services.sharable import ShareableService

from galaxy.schema.visualization import VisualizationSummaryList
log = logging.getLogger(__name__)


Expand Down Expand Up @@ -44,9 +42,8 @@ def index(
self,
trans,
payload: VisualizationIndexQueryPayload,
detailed: bool = False,
include_total_count: bool = False,
) -> Tuple[List[Any], int]:
) -> Tuple[VisualizationSummaryList, int]:
"""Return a list of Visualizations viewable by the user
:rtype: list
Expand All @@ -58,17 +55,9 @@ 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 = []
for content in entries:
view = "detailed" if detailed else "summary"
serialized_content = self.serializer.serialize_to_view(content, user=trans.user, trans=trans, view=view)
if detailed and content.deleted is False:
sharing_dict = self.shareable_service.sharing(trans, content.id)
serialized_content["sharing_status"] = sharing_dict
results.append(serialized_content)

return (
results,
VisualizationSummaryList.construct(
__root__=[trans.security.encode_all_ids(entry.to_dict(), recursive=True) for entry in entries]
),
total_matches,
)
)

0 comments on commit e54778f

Please sign in to comment.