Start work on HTML UI

master
Dustin 2015-02-15 16:37:12 -06:00
parent 0c5237c1a9
commit 4f5aa00041
2 changed files with 48 additions and 3 deletions

View File

@ -1,10 +1,17 @@
from . import model
import jinja2
import json
import milla
class XHTMLResponse(milla.Response):
default_content_type = 'application/xhtml+xml'
class BaseController(milla.controllers.Controller):
TMPL_LOADER = jinja2.PackageLoader(__name__.rsplit('.', 1)[0])
def __init__(self):
# allowed_methods must be set on the instance rather than the
# class because of how Milla does attribute copying to the
@ -18,6 +25,28 @@ class BaseController(milla.controllers.Controller):
super(BaseController, self).__before__(request)
self.session = model.Session()
offers = [
'application/json',
'application/xhtml+xml',
'text/html',
]
default_format = request.ResponseClass.default_content_type
want_fmt = request.accept.best_match(offers, default_format)
if want_fmt == 'application/json':
request.want = 'json'
elif want_fmt == 'text/html':
request.want = 'html'
else:
request.ResponseClass = XHTMLResponse
request.want = 'xhtml'
env = jinja2.Environment(loader=self.TMPL_LOADER)
env.globals.update(
url=request.create_href,
static=request.static_resource,
)
self.render = lambda t, **k: env.get_template(t).render(**k)
def __after__(self, request):
self.session.rollback()
self.session.bind.dispose()
@ -37,9 +66,12 @@ class ZoneListController(BaseController):
def GET(self, request):
response = request.ResponseClass()
response.content_type = 'application/json'
zones = map(model.Zone.as_dict, self.session.query(model.Zone))
json.dump(list(zones), response.body_file)
zones = self.session.query(model.Zone)
if request.want == 'json':
response.content_type = 'application/json'
json.dump(list(map(model.Zone.as_dict, zones)), response.body_file)
else:
response.text = self.render('index.html.j2', zones=zones)
return response
HEAD = GET

View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta charset="UTF-8" />
<title>Zones</title>
</head>
<body>
<h1>Zones</h1>
{% for zone in zones -%}
<div><a href="{{ zone.name }}">{{ zone.name }}</a></div>
{% endfor -%}
</body>
</html>