pvl/verkko/web.py
author Tero Marttila <terom@paivola.fi>
Wed, 10 Oct 2012 23:36:23 +0300
changeset 6 0f243c59d5d1
parent 5 91970ce3fc6b
child 7 7baf4cccb4a9
permissions -rw-r--r--
build urls
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
     1
# encoding: utf-8
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
     2
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
     3
# response types
1
731d2df704f0 fixup index + non-chunked response (?) + hosts + evil hardcoded db url
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
     4
from werkzeug.wrappers import Response
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
     5
from werkzeug.exceptions import (
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
     6
        HTTPException, 
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
     7
        BadRequest,         # 400
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
     8
        NotFound,           # 404
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
     9
)
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    10
from werkzeug.utils import redirect
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    11
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    12
# view
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    13
from pvl.html import tags as html
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    14
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    15
class Handler (object) :
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    16
    """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    17
        Per-Request controller/view, containing the request context and generating the response.
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    18
    """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    19
    
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    20
    TITLE = None
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    21
    CSS = (
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    22
        #"/static/layout.css", 
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
        "/static/style.css", 
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    24
    )
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    26
    def __init__ (self, app, request, urls) :
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    27
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    28
            app     - wsgi.Application
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    29
            request - werkzeug.Request
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    30
            urls    - werkzeug.routing.MapAdapter
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    31
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    32
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    33
        self.app = app
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    34
        self.db = app.db
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    35
        self.request = request
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    36
        self.urlmap = urls
6
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    37
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    38
    def url (self, handler=None, **params) :
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    39
        """
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    40
            Return an URL for given endpoint, with parameters,
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    41
        """
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    42
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    43
        if not handler :
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    44
            handler = self.__class__
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    45
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
    46
        return self.urlmap.build(handler, params)
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    47
        
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    48
    def title (self) :
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    49
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    50
            Render site/page title as text.
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    51
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    52
        
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    53
        if self.TITLE :
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    54
            return u"Päivölä Verkko :: {title}".format(title=self.TITLE)
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    55
        else :
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    56
            return u"Päivölä Verkko"
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    57
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    58
    def render (self) :
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    59
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    60
            Render page content (as <body>...</body>).
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    61
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    62
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    63
        raise NotImplementedError()
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    64
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    65
    def render_html (self) :
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    66
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    67
            Render page layout (as <html>).
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    68
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    69
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    70
        title = self.title()
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    71
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    72
        return html.html(
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    73
            html.head(
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    74
                html.title(title),
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    75
                (
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    76
                    html.link(rel='Stylesheet', type="text/css", href=src) for src in self.CSS
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    77
                ),
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
            ),
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    79
            html.body(
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    80
                html.h1(title),
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    81
                self.render() 
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    82
            )
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        )
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    85
    def process (self, **params) :
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    86
        """
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    87
            Process request args to build internal request state.
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    88
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    89
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    90
        pass
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    91
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    92
    def respond (self, **params) :
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    93
        """
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    94
            Generate a response, or raise an HTTPException
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    95
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    96
            Does an HTML layout'd response per default.
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    97
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
    98
                **params    - url-mapped parameters
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    99
        """
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   100
        
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   101
        # XXX: returning e.g. redirect?
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   102
        self.process(**params)
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   103
        
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   104
        # render as html per default
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   105
        text = unicode(html.document(self.render_html()))
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   106
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   107
        return Response(text, mimetype='text/html')
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   108
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   109
class Index (Handler) :
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   110
    def render (self) :
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   111
        return (
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   112
            html.ul(
6
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   113
                # TODO: self.url
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   114
                html.a(href='/hosts')("DHCP Hosts"),
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   115
            )
1
731d2df704f0 fixup index + non-chunked response (?) + hosts + evil hardcoded db url
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
   116
        )
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117