From 70e283f1c6489171318757abc015439baa186ae9 Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Thu, 31 Dec 2015 21:42:13 -0600 Subject: [PATCH] web: hosts: Implement host list controller --- src/rouse/web/__init__.py | 3 +++ src/rouse/web/hosts.py | 41 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/rouse/web/hosts.py diff --git a/src/rouse/web/__init__.py b/src/rouse/web/__init__.py index 29f8c41..f683a9a 100644 --- a/src/rouse/web/__init__.py +++ b/src/rouse/web/__init__.py @@ -1,4 +1,5 @@ from __future__ import unicode_literals +from . import hosts from milla.dispatch import routing import functools import jinja2 @@ -73,6 +74,8 @@ class Application(milla.Application): def setup_routes(self): self.dispatcher = r = routing.Router() + r.add_route('/', hosts.HostListController()) + def make_request(self, environ): request = super(Application, self).make_request(environ) default_format = VariedResponse.default_content_type diff --git a/src/rouse/web/hosts.py b/src/rouse/web/hosts.py new file mode 100644 index 0000000..0636dd4 --- /dev/null +++ b/src/rouse/web/hosts.py @@ -0,0 +1,41 @@ +from __future__ import unicode_literals +from . import controllers, model +import logging +import milla +import six + + +log = logging.getLogger(__name__) + + +class HostListController(controllers.BaseController): + + def GET(self, request): + response = request.ResponseClass() + response.set_payload(None, request.db.query(model.Host).all()) + return response + + def POST(self, request): + if request.content_type == 'application/json': + data = request.json + else: + data = request.POST.copy() + + if 'macaddr' not in data: + raise milla.HTTPBadRequest('MAC address is required') + host = model.Host() + for key, value in six.iteritems(data): + if value and hasattr(host, key): + try: + setattr(host, key, value.strip().lower()) + except ValueError as e: + raise milla.HTTPBadRequest('{}'.format(e)) + request.db.add(host) + request.db.commit() + log.info('Successfully created host {}'.format(host.macaddr)) + + response = request.ResponseClass() + response.status_int = milla.HTTPCreated.code + response.location = request.create_href('/{}'.format(host.id)) + response.set_payload(None, host) + return response