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