pvl/verkko/web.py
author Tero Marttila <terom@paivola.fi>
Wed, 10 Oct 2012 22:45:50 +0300
changeset 3 5990b188c54b
parent 1 731d2df704f0
child 4 b09436772d46
permissions -rw-r--r--
web.Handler
# encoding: utf-8

from werkzeug.wrappers import Response

# view
from pvl.html import tags as html

# errors
from werkzeug.exceptions import (
        HTTPException, 
        BadRequest,         # 400
        NotFound,           # 404
)

class Handler (object) :
    """
        Per-Request controller/view, containing the request context and generating the response.
    """
    
    TITLE = None
    CSS = (
        #"/static/layout.css", 
        "/static/style.css", 
    )

    def __init__ (self, app, request, path) :
        """
            app     - wsgi.Application
            request - werkzeug.Request
        """

        self.app = app
        self.db = app.db
        self.request = request
        
        # TODO
        self.path = path
    
    @property
    def title (self) :
        """
            Render site/page title as text.
        """
        
        if self.TITLE :
            return u"Päivölä Verkko :: {title}".format(title=self.TITLE)
        else :
            return u"Päivölä Verkko"

    def render (self) :
        """
            Render page content (as <body>...</body>).
        """

        raise NotImplementedError()

    def render_html (self) :
        """
            Render page layout (as <html>).
        """

        return html.html(
            html.head(
                html.title(self.title),
                (
                    html.link(rel='Stylesheet', type="text/css", href=src) for src in self.CSS
                ),
            ),
            html.body(
                html.h1(self.title),
                self.render() 
            )
        )

    def process (self) :
        """
            TODO: process request args to build internal state
        """

        pass

    def respond (self) :
        """
            Generate a response.

            Does an HTML layout'd response per default.
        """
        
        try :
            # XXX: returning e.g. redirect? args?
            self.process()

            return Response(unicode(html.document(self.render_html())), mimetype='text/html')
        
        except HTTPException as ex :
            return ex

class Index (Handler) :
    def render (self) :
        return (
            html.ul(
                html.a(href='/hosts')("DHCP Hosts"),
            )
        )