Warning
This document is for an old release 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 tool_shed.webapp.api.categories
import logging
from typing import (
Any,
Callable,
Dict,
)
import tool_shed.util.shed_util_common as suc
from galaxy import (
exceptions,
util,
web,
)
from galaxy.model.base import transaction
from galaxy.web import (
expose_api,
expose_api_anonymous_and_sessionless,
require_admin,
)
from galaxy.webapps.base.controller import BaseAPIController
from tool_shed.util import repository_util
log = logging.getLogger(__name__)
[docs]class CategoriesController(BaseAPIController):
"""RESTful controller for interactions with categories in the Tool Shed."""
def __get_value_mapper(self, trans) -> Dict[str, Callable]:
value_mapper = {"id": trans.security.encode_id}
return value_mapper
[docs] @expose_api
@require_admin
def create(self, trans, payload, **kwd):
"""
POST /api/categories
Return a dictionary of information about the created category.
The following parameters are included in the payload:
:param name (required): the name of the category
:param description (optional): the description of the category (if not provided, the name will be used)
Example: POST /api/categories/?key=XXXYYYXXXYYY
Content-Disposition: form-data; name="name" Category_Name
Content-Disposition: form-data; name="description" Category_Description
"""
category_dict = dict(message="", status="ok")
name = payload.get("name", "")
if name:
description = payload.get("description", "")
if not description:
# Default the description to the name.
description = name
if suc.get_category_by_name(self.app, name):
raise exceptions.Conflict("A category with that name already exists.")
else:
# Create the category
category = self.app.model.Category(name=name, description=description)
trans.sa_session.add(category)
with transaction(trans.sa_session):
trans.sa_session.commit()
category_dict = category.to_dict(view="element", value_mapper=self.__get_value_mapper(trans))
category_dict["message"] = f"Category '{str(category.name)}' has been created"
category_dict["url"] = web.url_for(
controller="categories", action="show", id=trans.security.encode_id(category.id)
)
else:
raise exceptions.RequestParameterMissingException('Missing required parameter "name".')
return category_dict
[docs] @expose_api_anonymous_and_sessionless
def get_repositories(self, trans, category_id, **kwd):
"""
GET /api/categories/{encoded_category_id}/repositories
Return information about the provided category and the repositories in that category.
:param id: the encoded id of the Category object
:param sort_key: the field by which the repositories should be sorted
:param sort_order: ascending or descending sort
:param page: the page number to return
Example: GET localhost:9009/api/categories/f9cad7b01a472135/repositories
"""
installable = util.asbool(kwd.get("installable", "false"))
sort_key = kwd.get("sort_key", "name")
sort_order = kwd.get("sort_order", "asc")
page = kwd.get("page", None)
category = suc.get_category(self.app, category_id)
category_dict: Dict[str, Any]
if category is None:
category_dict = dict(message=f"Unable to locate category record for id {str(id)}.", status="error")
return category_dict
category_dict = category.to_dict(view="element", value_mapper=self.__get_value_mapper(trans))
category_dict["repository_count"] = suc.count_repositories_in_category(self.app, category_id)
category_dict["url"] = web.url_for(
controller="categories", action="show", id=trans.security.encode_id(category.id)
)
repositories = repository_util.get_repositories_by_category(
self.app, category.id, installable=installable, sort_order=sort_order, sort_key=sort_key, page=page
)
category_dict["repositories"] = repositories
return category_dict
[docs] @expose_api_anonymous_and_sessionless
def index(self, trans, deleted=False, **kwd):
"""
GET /api/categories
Return a list of dictionaries that contain information about each Category.
:param deleted: flag used to include deleted categories
Example: GET localhost:9009/api/categories
"""
category_dicts = []
deleted = util.asbool(deleted)
if deleted and not trans.user_is_admin:
raise exceptions.AdminRequiredException("Only administrators can query deleted categories.")
for category in (
trans.sa_session.query(self.app.model.Category)
.filter(self.app.model.Category.table.c.deleted == deleted)
.order_by(self.app.model.Category.table.c.name)
):
category_dict = category.to_dict(view="collection", value_mapper=self.__get_value_mapper(trans))
category_dict["url"] = web.url_for(
controller="categories", action="show", id=trans.security.encode_id(category.id)
)
category_dict[
"repositories"
] = self.app.repository_registry.viewable_repositories_and_suites_by_category.get(category.name, 0)
category_dicts.append(category_dict)
return category_dicts
[docs] @expose_api_anonymous_and_sessionless
def show(self, trans, id, **kwd):
"""
GET /api/categories/{encoded_category_id}
Return a dictionary of information about a category.
:param id: the encoded id of the Category object
Example: GET localhost:9009/api/categories/f9cad7b01a472135
"""
category = suc.get_category(self.app, id)
if category is None:
category_dict = dict(message=f"Unable to locate category record for id {str(id)}.", status="error")
return category_dict
category_dict = category.to_dict(view="element", value_mapper=self.__get_value_mapper(trans))
category_dict["url"] = web.url_for(
controller="categories", action="show", id=trans.security.encode_id(category.id)
)
return category_dict