mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Remove operation and legacy filtering logic from grid controller
This commit is contained in:
@@ -1068,89 +1068,12 @@ class GridData:
|
||||
limit = kwargs.get("limit", 1000)
|
||||
offset = kwargs.get("offset", 0)
|
||||
|
||||
# Build a base filter and sort key that is the combination of the saved state and defaults.
|
||||
# Saved state takes preference over defaults.
|
||||
base_filter = {}
|
||||
if self.default_filter:
|
||||
# default_filter is a dictionary that provides a default set of filters based on the grid's columns.
|
||||
base_filter = self.default_filter.copy()
|
||||
base_sort_key = self.default_sort_key
|
||||
|
||||
# Build initial query
|
||||
query = self.build_initial_query(trans, **kwargs)
|
||||
query = self.apply_query_filter(trans, query, **kwargs)
|
||||
|
||||
# Determine whether use_default_filter flag is set.
|
||||
use_default_filter_str = kwargs.get("use_default_filter")
|
||||
use_default_filter = False
|
||||
if use_default_filter_str:
|
||||
use_default_filter = use_default_filter_str.lower() == "true"
|
||||
|
||||
# Process filtering arguments to (a) build a query that represents the filter and (b) build a
|
||||
# dictionary that denotes the current filter.
|
||||
for column in self.columns:
|
||||
if column.key:
|
||||
# Get the filter criterion for the column. Precedence is (a) if using default filter, only look there; otherwise,
|
||||
# (b) look in kwargs; and (c) look in base filter.
|
||||
column_filter = None
|
||||
if use_default_filter:
|
||||
if self.default_filter:
|
||||
column_filter = self.default_filter.get(column.key)
|
||||
elif f"f-{column.model_class.__name__}.{column.key}" in kwargs:
|
||||
# Queries that include table joins cannot guarantee unique column names. This problem is
|
||||
# handled by setting the column_filter value to <TableName>.<ColumnName>.
|
||||
column_filter = kwargs.get(f"f-{column.model_class.__name__}.{column.key}")
|
||||
elif f"f-{column.key}" in kwargs:
|
||||
column_filter = kwargs.get(f"f-{column.key}")
|
||||
elif column.key in base_filter:
|
||||
column_filter = base_filter.get(column.key)
|
||||
|
||||
# Method (1) combines a mix of strings and lists of strings into a single string and (2) attempts to de-jsonify all strings.
|
||||
def loads_recurse(item):
|
||||
decoded_list = []
|
||||
if isinstance(item, str):
|
||||
try:
|
||||
# Not clear what we're decoding, so recurse to ensure that we catch everything.
|
||||
decoded_item = loads(item)
|
||||
if isinstance(decoded_item, list):
|
||||
decoded_list = loads_recurse(decoded_item)
|
||||
else:
|
||||
decoded_list = [str(decoded_item)]
|
||||
except ValueError:
|
||||
decoded_list = [str(item)]
|
||||
elif isinstance(item, list):
|
||||
for element in item:
|
||||
a_list = loads_recurse(element)
|
||||
decoded_list = decoded_list + a_list
|
||||
return decoded_list
|
||||
|
||||
# If column filter found, apply it.
|
||||
if column_filter is not None:
|
||||
# TextColumns may have a mix of json and strings.
|
||||
if isinstance(column, TextColumn):
|
||||
column_filter = loads_recurse(column_filter)
|
||||
if len(column_filter) == 1:
|
||||
column_filter = column_filter[0]
|
||||
# Interpret ',' as a separator for multiple terms.
|
||||
if isinstance(column_filter, str) and column_filter.find(",") != -1:
|
||||
column_filter = column_filter.split(",")
|
||||
|
||||
# Check if filter is empty
|
||||
if isinstance(column_filter, list):
|
||||
# Remove empty strings from filter list
|
||||
column_filter = [x for x in column_filter if x != ""]
|
||||
if len(column_filter) == 0:
|
||||
continue
|
||||
elif isinstance(column_filter, str):
|
||||
# If filter criterion is empty, do nothing.
|
||||
if column_filter == "":
|
||||
continue
|
||||
|
||||
# Update query.
|
||||
query = column.filter(trans, trans.user, query, column_filter)
|
||||
|
||||
# Process sort arguments.
|
||||
sort_by = kwargs.get("sort_by", base_sort_key)
|
||||
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:
|
||||
|
||||
@@ -130,71 +130,17 @@ class UserListGrid(grids.GridData):
|
||||
model_class = model.User
|
||||
default_sort_key = "email"
|
||||
columns = [
|
||||
EmailColumn(
|
||||
"Email",
|
||||
key="email",
|
||||
link=(lambda item: dict(controller="user", action="information", id=item.id, webapp="galaxy")),
|
||||
attach_popup=True,
|
||||
filterable="advanced",
|
||||
target="top",
|
||||
),
|
||||
UserNameColumn("User Name", key="username", attach_popup=False, filterable="advanced"),
|
||||
LastLoginColumn("Last Login", format=time_ago, key="last_login", sortable=True),
|
||||
DiskUsageColumn("Disk Usage", key="disk_usage", attach_popup=False),
|
||||
StatusColumn("Status", attach_popup=False, key="status"),
|
||||
TimeCreatedColumn("Created", attach_popup=False, key="create_time"),
|
||||
ActivatedColumn("Activated", attach_popup=False, key="active"),
|
||||
GroupsColumn("Groups", attach_popup=False, key="groups"),
|
||||
RolesColumn("Roles", attach_popup=False, key="roles"),
|
||||
ExternalColumn("External", attach_popup=False, key="external"),
|
||||
# Columns that are valid for filtering but are not visible.
|
||||
grids.DeletedColumn("Deleted", key="deleted", visible=False, filterable="advanced"),
|
||||
grids.PurgedColumn("Purged", key="purged", visible=False, filterable="advanced"),
|
||||
EmailColumn("Email", key="email"),
|
||||
UserNameColumn("User Name", key="username"),
|
||||
LastLoginColumn("Last Login", key="last_login", format=time_ago),
|
||||
DiskUsageColumn("Disk Usage", key="disk_usage"),
|
||||
StatusColumn("Status", key="status"),
|
||||
TimeCreatedColumn("Created", key="create_time"),
|
||||
ActivatedColumn("Activated", key="active"),
|
||||
GroupsColumn("Groups", key="groups"),
|
||||
RolesColumn("Roles", key="roles"),
|
||||
ExternalColumn("External", key="external"),
|
||||
]
|
||||
columns.append(
|
||||
grids.MulticolFilterColumn(
|
||||
"Search",
|
||||
cols_to_filter=[columns[0], columns[1]],
|
||||
key="free-text-search",
|
||||
visible=False,
|
||||
filterable="standard",
|
||||
)
|
||||
)
|
||||
global_actions = [grids.GridAction("Create new user", url_args=dict(action="users/create"))]
|
||||
operations = [
|
||||
grids.GridOperation(
|
||||
"Manage Information",
|
||||
condition=(lambda item: not item.deleted),
|
||||
allow_multiple=False,
|
||||
url_args=dict(controller="user", action="information", webapp="galaxy"),
|
||||
),
|
||||
grids.GridOperation(
|
||||
"Manage Roles and Groups",
|
||||
condition=(lambda item: not item.deleted),
|
||||
allow_multiple=False,
|
||||
url_args=dict(action="form/manage_roles_and_groups_for_user"),
|
||||
),
|
||||
grids.GridOperation(
|
||||
"Reset Password",
|
||||
condition=(lambda item: not item.deleted),
|
||||
allow_multiple=True,
|
||||
url_args=dict(action="form/reset_user_password"),
|
||||
target="top",
|
||||
),
|
||||
grids.GridOperation("Recalculate Disk Usage", condition=(lambda item: not item.deleted), allow_multiple=False),
|
||||
grids.GridOperation("Generate New API Key", allow_multiple=False, async_compatible=True),
|
||||
]
|
||||
|
||||
standard_filters = [
|
||||
grids.GridColumnFilter("Active", args=dict(deleted=False)),
|
||||
grids.GridColumnFilter("Deleted", args=dict(deleted=True, purged=False)),
|
||||
grids.GridColumnFilter("Purged", args=dict(purged=True)),
|
||||
grids.GridColumnFilter("All", args=dict(deleted="All")),
|
||||
]
|
||||
num_rows_per_page = 50
|
||||
use_paging = True
|
||||
default_filter = dict(purged="False")
|
||||
use_default_filter = True
|
||||
|
||||
def get_current_item(self, trans, **kwargs):
|
||||
return trans.user
|
||||
|
||||
Reference in New Issue
Block a user