pngtile/image.py
author Tero Marttila <terom@qmsk.net>
Sat, 04 Oct 2014 15:13:56 +0300
changeset 176 ad32cf3a25fa
parent 172 73380dd6a816
permissions -rw-r--r--
pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Image handling.
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
from werkzeug import Request, Response, exceptions
153
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
     7
from werkzeug.utils import html, redirect
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
     8
import werkzeug.urls
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import pngtile.tile
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    11
import pngtile.application
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
import pypngtile
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
import json
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    15
import os, os.path
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    16
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    17
class ImageApplication (pngtile.application.PNGTileApplication):
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
    STYLESHEETS = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
        'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
        'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
        'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css',
142
9b316e83e9e3 pngtile.image: split out javascript and rename js/css to map
Tero Marttila <terom@paivola.fi>
parents: 141
diff changeset
    23
        '/static/pngtile/map.css',
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
    SCRIPTS = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
        'https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
        'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js',
142
9b316e83e9e3 pngtile.image: split out javascript and rename js/css to map
Tero Marttila <terom@paivola.fi>
parents: 141
diff changeset
    30
        '/static/pngtile/map.js',
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    33
    def __init__ (self, tiles_server=None, **opts):
153
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
    34
        """
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
    35
            http://.../ path to tileserver root
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
    36
        """
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
    37
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    38
        super(ImageApplication, self).__init__(**opts)
153
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
    39
                
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    40
        self.tiles_server = tiles_server
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    41
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    42
    def tiles_url (self, name, **args):
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    43
        return werkzeug.urls.Href(self.tiles_server)(name, **args)
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    44
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    45
    def render_html (self, title, body, stylesheets=None, scripts=None, end=()):
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    46
        if stylesheets is None:
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    47
            stylesheets = self.STYLESHEETS
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    48
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    49
        if scripts is None:
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    50
            scripts = self.SCRIPTS
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    51
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    52
        return html.html(lang='en', *[
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    53
            html.head(
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    54
                html.title(title),
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    55
                *[
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    56
                    html.link(rel='stylesheet', href=href) for href in stylesheets
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    57
                ]
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    58
            ),
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    59
            html.body(
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    60
                *(body + tuple(
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    61
                    html.script(src=src) for src in scripts
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    62
                ) + end)
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    63
            ),
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    64
        ])
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    65
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    67
    def render_dir_breadcrumb (self, name):
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    68
        href = werkzeug.urls.Href('/')
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    69
        path = []
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    70
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    71
        yield html.li(html.a(href='/', *[u"Index"]))
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    72
        
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    73
        if name:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    74
            for part in name.split('/'):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    75
                path.append(part)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    76
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
    77
                yield html.li(html.a(href=href(*path), *[part]))
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    78
176
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    79
    def render_dir_item (self, name, type):
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    80
        if type:
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    81
            return html.a(href=name, *[name])
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    82
        else:
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    83
            dir = name + '/'
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    84
            return html.a(href=dir, *[dir])
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    85
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    86
    def render_dir (self, request, name, items):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    87
        """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    88
            request:    werkzeug.Request
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    89
            name:       /.../... url to dir
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    90
            items:      [...] items in dir
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    91
        """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    92
        
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    93
        if name:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    94
            title = name
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    95
        else:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    96
            title = "Index"
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    97
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    98
        return self.render_html(
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    99
            title       = name,
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   100
            body        = (
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   101
                html.div(class_='container', *[
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   102
                    html.h1(title),
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   103
                    html.div(*[
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   104
                        html.ol(class_='breadcrumb', *self.render_dir_breadcrumb(name)),
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   105
                    ]),
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   106
                    html.div(class_='list', *[
176
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
   107
                        html.ul(class_='list-group', *[
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
   108
                            html.li(class_='list-group-item', *[
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
   109
                                self.render_dir_item(name, type) for name, type in items
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
   110
                            ]) for name, type in items
ad32cf3a25fa pngtile.store: change list() to yield name, type tuples rather than appending / to dirs
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
   111
                        ]),
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   112
                    ]),
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   113
                ]),
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   114
            ),
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   115
        )
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   116
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
    def render_image (self, request, image, name):
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        """
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
            request:    werkzeug.Request
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
            image:      pypngtile.Image
153
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   121
            name:       request path for .../.../*.png image
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
        """
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
        image_info = image.info()
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
142
9b316e83e9e3 pngtile.image: split out javascript and rename js/css to map
Tero Marttila <terom@paivola.fi>
parents: 141
diff changeset
   126
        map_config = dict(
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   127
            tiles_url       = self.tiles_url(name),
172
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 168
diff changeset
   128
            tiles_mtime     = image_info['cache_mtime'],
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
172
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 168
diff changeset
   130
            tile_url        = '{tiles_url}?t={tiles_mtime}&x={x}&y={y}&zoom={z}',
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
            tile_size       = pngtile.tile.TILE_SIZE,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
            tile_zoom       = pngtile.tile.MAX_ZOOM,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
            
172
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 168
diff changeset
   134
            # do NOT include a mtime in these urls.. we should always revalidate them
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   135
            image_url       = '{tiles_url}?w={w}&h={h}&x={x}&y={y}&zoom={z}',
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
            image_width     = image_info['img_width'],
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
            image_height    = image_info['img_height'],
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
        )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
        return self.render_html(
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
            title       = name,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
            body        = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
                html.div(id='wrapper', *[
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
                    html.div(id='map')
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
                ]),
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
            ),
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
            end         = (
142
9b316e83e9e3 pngtile.image: split out javascript and rename js/css to map
Tero Marttila <terom@paivola.fi>
parents: 141
diff changeset
   148
                html.script("""$(function() {{ map_init({map_config}); }});""".format(map_config=json.dumps(map_config))),
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
            ),
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
        )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   152
    def handle_dir (self, request, name, path):
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
        """
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   154
            Generate response for directory listing.
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
        """
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   156
153
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   157
        if not request.path.endswith('/'):
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   158
            # we generate HTML with relative links
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   159
            return redirect(request.path + '/')
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   160
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   161
        items = sorted(self.list(request.path))
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   162
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   163
        html = self.render_dir(request, name, items)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   164
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   165
        return Response(html, content_type="text/html")
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   166
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   167
    def handle_image (self, request, name, path):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   168
        """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   169
            Generate Response for image request.
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   170
        """
153
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   171
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   172
        # backwards-compat redirect from frontend -> tile-server
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   173
        if all(attr in request.args for attr in ('cx', 'cy', 'w', 'h', 'zl')):
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   174
            return redirect(self.tiles_url(name,
153
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   175
                w       = request.args['w'],
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   176
                h       = request.args['h'],
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   177
                x       = request.args['cx'],
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   178
                y       = request.args['cy'],
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   179
                zoom    = request.args['zl'],
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   180
            ))
55f3d3bc95d3 pngtile.image: use --tile-server as url, fix render_dir href's, support legacy urls
Tero Marttila <terom@qmsk.net>
parents: 147
diff changeset
   181
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   182
        image, name = self.open(request.path)
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
        html = self.render_image(request, image, name)
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
        return Response(html, content_type="text/html")
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   188
    def handle (self, request):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   189
        """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   190
            Handle request for an image
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   191
        """
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   193
        name, path, type = self.lookup(request.path)
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   194
        
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   195
        # determine handler
164
e1e0c8099c8b pngtile.image: have BaseApplication.lookup_image() return type as well
Tero Marttila <terom@qmsk.net>
parents: 154
diff changeset
   196
        if not type:
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   197
            return self.handle_dir(request, name, path)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   198
        
164
e1e0c8099c8b pngtile.image: have BaseApplication.lookup_image() return type as well
Tero Marttila <terom@qmsk.net>
parents: 154
diff changeset
   199
        else:
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   200
            return self.handle_image(request, name, path)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   201
168
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   202
    @Request.application
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   203
    def __call__ (self, request):
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   204
        """
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   205
            WSGI entry point.
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   206
        """
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   207
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   208
        try:
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   209
            return self.handle(request)
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   210
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   211
        except exceptions.HTTPException as error:
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   212
            return error
260aa4a05e82 pngtile.image: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 164
diff changeset
   213