Skip to content
Snippets Groups Projects

SWS-31: Capability REST API update

Merged Nathan Hertz requested to merge SWS-31-capability-rest-api-update into main
Files
7
import json
from pyramid.httpexceptions import HTTPNotFound
from pyramid.httpexceptions import HTTPBadRequest, HTTPNotFound, HTTPPreconditionFailed
from pyramid.request import Request
from pyramid.response import Response
from pyramid.view import view_config
from workspaces.capability.schema import Capability
@view_config(route_name="view_capability", renderer="json")
def view_capability(request):
def view_capability(request: Request) -> Response:
"""
Pyramid view that accepts a request to view a capability and responds with the requested capability's
info, if it exists
URL: capability/{capability_name}
:param request: GET request
:return: Response with JSON-formatted capability info if found or 404 response (HTTPNotFound)
"""
capability = request.capability_info.lookup_capability(request.matchdict["capability_name"])
if capability:
body = capability.__json__()
return Response(body=body, charset="UTF-8", content_type="test/json")
return Response(json_body=capability.__json__())
else:
return HTTPNotFound(detail=f"Capability {request.matchdict['capability_name']} not found.")
@view_config(route_name="create_capability", renderer="json")
def create_capability(request: Request) -> Response:
"""
Pyramid view that accepts a request to create a capability
URL: capability/create
:param request: POST request, expecting JSON parameters ["capability_name", "steps", "max_jobs"]
:return: Response with JSON-formatted capability info of newly created capability
or 400 response (HTTPBadRequest) if expected parameters not given
or 412 response (HTTPPreconditionFailed) if capability with given name already exists
"""
expected_params = ["capability_name", "steps", "max_jobs"]
params = request.json_body
if not all([expected in params for expected in expected_params]):
# JSON params do not contain all expected params
params_not_given_msg = (
f"Expected JSON parameters {expected_params}. Received only {params}."
)
return HTTPBadRequest(detail=params_not_given_msg)
elif request.capability_info.lookup_capability(params["capability_name"]):
# Capability with given name already exists
already_exists_msg = (
f"Capability {params['capability_name']} already exists.",
f"To instead edit existing capability, use capability/{params['capability_name']}/edit",
)
return HTTPPreconditionFailed(detail=already_exists_msg)
else:
return HTTPNotFound(
detail=f"Capability with ID {request.matchdict['capability_name']} not found."
new_capability = Capability(
name=params["capability_name"],
steps=params["steps"],
max_jobs=params["max_jobs"],
)
request.capability_info.save_entity(new_capability)
return Response(json_body=new_capability.__json__())
Loading