pngtile/image.py
author Tero Marttila <terom@paivola.fi>
Mon, 15 Sep 2014 01:23:01 +0300
changeset 147 77330e43c855
parent 145 51908b0cc3a1
child 153 55f3d3bc95d3
permissions -rw-r--r--
pngtile.image: handle dir indexes
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
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
from werkzeug.utils import html
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import pngtile.tile
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
from pngtile.application import BaseApplication
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
import pypngtile
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
import json
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    14
import os, os.path
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    15
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    16
def dir_url (prefix, name, item):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    17
    """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    18
        Join together an absolute URL prefix, an optional directory name, and a directory item
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    19
    """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    20
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    21
    url = prefix
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    22
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    23
    if name:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    24
        url += '/' + name
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    25
    
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    26
    url += '/' + item
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    27
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    28
    return url
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    29
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    30
def dir_list (root):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    31
    """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    32
        Yield a series of directory items to show for the given dir
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    33
    """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    34
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    35
    for name in os.listdir(root):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    36
        path = os.path.join(root, name)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    37
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    38
        # skip dotfiles
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    39
        if name.startswith('.'):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    40
            continue
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    41
        
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    42
        # show dirs
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    43
        if os.path.isdir(path):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    44
            yield name
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    45
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    46
        # examine ext
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    47
        if '.' in name:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    48
            name_base, name_type = name.rsplit('.', 1)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    49
        else:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    50
            name_base = name
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    51
            name_type = None
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    52
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    53
        # show .png files with a .cache file
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    54
        if name_type in ImageApplication.IMAGE_TYPES and os.path.exists(os.path.join(root, name_base + '.cache')):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    55
            yield name
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
class ImageApplication (BaseApplication):
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
    STYLESHEETS = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        '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
    61
        '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
    62
        '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
    63
        '/static/pngtile/map.css',
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
    SCRIPTS = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        '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
    68
        '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
    69
        '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
    70
        '/static/pngtile/map.js',
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
    )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
    def __init__ (self, **opts):
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        BaseApplication.__init__(self, **opts)
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    76
    def render_dir_breadcrumb (self, name):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    77
        path = []
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    78
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    79
        yield html.li(html.a(href='/', *[u"Index"]))
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    80
        
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    81
        if name:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    82
            for part in name.split('/'):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    83
                path.append(part)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    84
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    85
                yield html.li(html.a(href='/'.join(path), *[part]))
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    86
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    87
    def render_dir (self, request, name, items):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    88
        """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    89
            request:    werkzeug.Request
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    90
            name:       /.../... url to dir
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    91
            items:      [...] items in dir
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
        
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    94
        if name:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    95
            title = name
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    96
        else:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    97
            title = "Index"
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    98
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
    99
        return self.render_html(
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   100
            title       = name,
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   101
            body        = (
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   102
                html.div(class_='container', *[
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   103
                    html.h1(title),
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   104
                    html.div(*[
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   105
                        html.ol(class_='breadcrumb', *self.render_dir_breadcrumb(name)),
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   106
                    ]),
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   107
                    html.div(class_='list', *[
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   108
                        html.ul(class_='list-group', *[html.li(class_='list-group-item', *[
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   109
                                html.a(href=dir_url('', name, item), *[item])
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   110
                            ]) for item in items]
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   111
                        ),
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
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
            name:       request path for .png image
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(
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
            tile_url        = 'http://zovoweix.qmsk.net:8080/{name}?x={x}&y={y}&zoom={z}',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
            tile_name       = name,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
            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
   131
            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
   132
            
145
51908b0cc3a1 pngtile.image: render map link
Tero Marttila <terom@paivola.fi>
parents: 142
diff changeset
   133
            image_url       = 'http://zovoweix.qmsk.net:8080/{name}?w={w}&h={h}&x={x}&y={y}&zoom={z}',
51908b0cc3a1 pngtile.image: render map link
Tero Marttila <terom@paivola.fi>
parents: 142
diff changeset
   134
            image_name      = name,
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
            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
   136
            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
   137
        )
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
        return self.render_html(
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
            title       = name,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
            body        = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
                html.div(id='wrapper', *[
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
                    html.div(id='map')
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
                ]),
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
            end         = (
142
9b316e83e9e3 pngtile.image: split out javascript and rename js/css to map
Tero Marttila <terom@paivola.fi>
parents: 141
diff changeset
   147
                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
   148
            ),
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
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   151
    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
   152
        """
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   153
            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
   154
        """
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   155
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   156
        items = sorted(dir_list(path))
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   157
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   158
        html = self.render_dir(request, name, items)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   159
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   160
        return Response(html, content_type="text/html")
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   161
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   162
    def handle_image (self, request, name, path):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   163
        """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   164
            Generate Response for image request.
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   165
        """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   166
        
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        try:
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
            image, name = self.get_image(request.path)
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
        except pypngtile.Error as error:
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
            raise exceptions.BadRequest(str(error))
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
        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
   173
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
        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
   175
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   176
    def handle (self, request):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   177
        """
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   178
            Handle request for an image
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   179
        """
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
147
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   181
        name, path = self.lookup_path(request.path)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   182
        
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   183
        # determine type
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   184
        if '/' in name:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   185
            _, name_base = name.rsplit('/', 1)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   186
        else:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   187
            name_base = name
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   188
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   189
        if '.' in name_base:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   190
            name_base, name_type = name_base.rsplit('.', 1)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   191
        else:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   192
            name_type = None
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   193
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   194
        # determine handler
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   195
        if os.path.isdir(path):
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   196
            return self.handle_dir(request, name, path)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   197
        
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   198
        elif name_type and name_type in self.IMAGE_TYPES:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   199
            return self.handle_image(request, name, path)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   200
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   201
        else:
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   202
            raise exceptions.NotFound(path)
77330e43c855 pngtile.image: handle dir indexes
Tero Marttila <terom@paivola.fi>
parents: 145
diff changeset
   203