Warning
This document is for an in-development version of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.web.framework.helpers.grids
import logging
from typing import (
List,
Optional,
)
from markupsafe import escape
from galaxy.util import (
string_as_bool,
unicodify,
)
log = logging.getLogger(__name__)
[docs]class GridColumn:
[docs] def __init__(
self,
label,
key=None,
model_class=None,
method=None,
format=None,
escape=True,
):
"""Create a grid column."""
self.label = label
self.key = key
self.model_class = model_class
self.method = method
self.format = format
self.escape = escape
[docs] def get_value(self, trans, grid, item):
if self.method:
value = getattr(grid, self.method)(trans, item)
elif self.key and hasattr(item, self.key):
value = getattr(item, self.key)
else:
value = None
if self.format:
value = self.format(value)
if self.escape:
return escape(unicodify(value))
else:
return value
[docs] def sort(self, trans, query, ascending, column_name=None):
"""Sort query using this column."""
if column_name is None:
column_name = self.key
column = getattr(self.model_class, column_name)
if column is None:
column = self.model_class.__table__.c.get(column_name)
if ascending:
query = query.order_by(column.asc())
else:
query = query.order_by(column.desc())
return query
[docs]class GridData:
"""
Specifies the content a grid (data table).
"""
model_class: Optional[type] = None
columns: List[GridColumn] = []
default_limit: int = 1000
[docs] def __init__(self):
# If a column does not have a model class, set the column's model class
# to be the grid's model class.
for column in self.columns:
if not column.model_class:
column.model_class = self.model_class
def __call__(self, trans, **kwargs):
limit = kwargs.get("limit", self.default_limit)
offset = kwargs.get("offset", 0)
# Build initial query
query = trans.sa_session.query(self.model_class)
query = self.apply_query_filter(query, **kwargs)
# Process sort arguments.
sort_by = kwargs.get("sort_by", self.default_sort_key)
sort_desc = string_as_bool(kwargs.get("sort_desc", True))
for column in self.columns:
if column.key == sort_by:
query = column.sort(trans, query, not sort_desc, column_name=sort_by)
break
# Process limit and offset.
rows_total = query.count()
query = query.limit(limit).offset(offset)
# Populate and return response
grid_config = {
"rows": [],
"rows_total": rows_total,
}
for row in query:
row_dict = {
"id": trans.security.encode_id(row.id),
}
for column in self.columns:
value = column.get_value(trans, self, row)
row_dict[column.key] = value
grid_config["rows"].append(row_dict)
return grid_config