122 lines
3.0 KiB
Python
122 lines
3.0 KiB
Python
import uuid
|
|
import transaction
|
|
from pyramid.response import Response
|
|
from pyramid.view import view_config
|
|
|
|
from barker.models import Device
|
|
from barker.models.validation_exception import ValidationError
|
|
|
|
|
|
@view_config(
|
|
request_method="POST",
|
|
route_name="v1_devices_new",
|
|
renderer="json",
|
|
permission="Tables",
|
|
trans=True,
|
|
)
|
|
def save(request):
|
|
json = request.json_body
|
|
name = json.get("name", "").strip()
|
|
if name == "":
|
|
raise ValidationError("Name cannot be blank")
|
|
section = json.get("section", None)
|
|
if section is None:
|
|
raise ValidationError("please choose a section")
|
|
section_id = uuid.UUID(section["id"])
|
|
item = Device(name, section_id)
|
|
request.dbsession.add(item)
|
|
transaction.commit()
|
|
return device_info(item.id, request.dbsession)
|
|
|
|
|
|
@view_config(
|
|
request_method="PUT",
|
|
route_name="v1_devices_id",
|
|
renderer="json",
|
|
permission="Tables",
|
|
trans=True,
|
|
)
|
|
def update(request):
|
|
json = request.json_body
|
|
item = (
|
|
request.dbsession.query(Device)
|
|
.filter(Device.id == uuid.UUID(request.matchdict["id"]))
|
|
.first()
|
|
)
|
|
if item.is_fixture:
|
|
raise ValidationError(
|
|
"{0} is a fixture and cannot be edited or deleted.".format(item.full_name)
|
|
)
|
|
item.name = json["name"].strip()
|
|
item.section_id = uuid.UUID(json["section"]["id"])
|
|
transaction.commit()
|
|
return device_info(item.id, request.dbsession)
|
|
|
|
|
|
@view_config(
|
|
request_method="DELETE",
|
|
route_name="v1_devices_id",
|
|
renderer="json",
|
|
permission="Tables",
|
|
trans=True,
|
|
)
|
|
def delete(request):
|
|
item = (
|
|
request.dbsession.query(Device)
|
|
.filter(Device.id == uuid.UUID(request.matchdict["id"]))
|
|
.first()
|
|
)
|
|
if item is None:
|
|
response = Response("Device not Found")
|
|
response.status_int = 500
|
|
return response
|
|
else:
|
|
response = Response("Device deletion not implemented")
|
|
response.status_int = 500
|
|
return response
|
|
|
|
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_devices_new",
|
|
renderer="json",
|
|
permission="Tables",
|
|
)
|
|
def show_blank(request):
|
|
return device_info(None, request.dbsession)
|
|
|
|
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_devices_id",
|
|
renderer="json",
|
|
permission="Tables",
|
|
)
|
|
def show_id(request):
|
|
return device_info(uuid.UUID(request.matchdict["id"]), request.dbsession)
|
|
|
|
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_devices_list",
|
|
renderer="json",
|
|
permission="Authenticated",
|
|
)
|
|
def show_list(request):
|
|
return [
|
|
device_info(item, request.dbsession)
|
|
for item in request.dbsession.query(Device).order_by(Device.name).all()
|
|
]
|
|
|
|
|
|
def device_info(item, dbsession):
|
|
if item is None:
|
|
return {"name": "", "section": {}}
|
|
if type(item) is uuid.UUID:
|
|
item = dbsession.query(Device).filter(Device.id == item).first()
|
|
return {
|
|
"id": item.id,
|
|
"name": item.name,
|
|
"section": {"id": item.section_id, "name": item.section.name},
|
|
}
|