qmsk/pngtile/pngtile.py
author Tero Marttila <terom@qmsk.net>
Sat, 04 Oct 2014 15:54:06 +0300
changeset 241 8456a554fab9
parent 238 2c62e4d70619
child 117 f18280afafd2
permissions -rw-r--r--
qmsk.pngtile: image view
236
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
     1
from __future__ import absolute_import
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
     2
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
     3
from django.conf import settings
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
     4
import django.utils.http
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
     5
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
     6
# the top-level pngtile package
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
     7
from pngtile.store import (
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
     8
        Error,
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
     9
        NotFound,
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    10
        InvalidImage,
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    11
        UncachedImage,
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    12
        PNGTileStore,
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    13
)
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    14
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    15
import os.path
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    16
236
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    17
class Store (PNGTileStore):
241
8456a554fab9 qmsk.pngtile: image view
Tero Marttila <terom@qmsk.net>
parents: 238
diff changeset
    18
    TILE_SIZE = 256
8456a554fab9 qmsk.pngtile: image view
Tero Marttila <terom@qmsk.net>
parents: 238
diff changeset
    19
    TILE_ZOOM = 4
8456a554fab9 qmsk.pngtile: image view
Tero Marttila <terom@qmsk.net>
parents: 238
diff changeset
    20
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    21
    def __init__ (self, title, tileserver, **opts):
236
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    22
        super(Store, self).__init__(**opts)
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    23
        
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    24
        self._title = title
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    25
        self.tileserver = tileserver
236
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    26
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    27
    def title (self, name):
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    28
        if name:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    29
            return os.path.basename(name)
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    30
        else:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    31
            return self._title
236
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    32
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    33
    def breadcrumb (self, name):
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    34
        """
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    35
            Yield (name, title) tuples for breadcrumb to name
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    36
        """
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    37
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    38
        path = [ ]
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    39
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    40
        for part in name.split('/'):
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    41
            path.append(part)
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    42
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    43
            yield '/'.join(path), part
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    44
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    45
    def tree (self, name):
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    46
        """
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    47
            Yield [(item, name)] lists for given path.
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    48
        """
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    49
        
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    50
        # always, starting from root
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    51
        parts = []
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    52
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    53
        if name:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    54
            # also including the dir itself... but not the root twice
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    55
            name += '/'
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    56
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    57
        # walk up the tree from root the dir itself
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    58
        for tree_item in name.split('/'):
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    59
            tree_name = '/'.join(parts)
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    60
            
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    61
            dirs = [ ]
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    62
            items = [ ]
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    63
            
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    64
            # walk through the items within this tree node
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    65
            for item, type in self.list(tree_name):
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    66
                if tree_name:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    67
                    item_name = tree_name + '/' + item
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    68
                else:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    69
                    item_name = item
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    70
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    71
                if type:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    72
                    items.append((item, item_name))
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    73
                else:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    74
                    dirs.append((item, item_name))
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    75
            
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    76
            # tree of parent + item within parent
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    77
            yield sorted(dirs), tree_item
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    78
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    79
            parts.append(tree_item)
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    80
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    81
    def items (self, name):
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    82
        """
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    83
            Yield (item, name) for given path.
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    84
        """
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    85
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    86
        for item, type in self.list(name):
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    87
            if name:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    88
                item_name = name + '/' + item
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    89
            else:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    90
                item_name = item
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    91
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    92
            if type:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    93
                yield item, item_name
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    94
241
8456a554fab9 qmsk.pngtile: image view
Tero Marttila <terom@qmsk.net>
parents: 238
diff changeset
    95
    def tiles_url (self, name=None, **query):
236
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    96
        """
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    97
            Return a tileserver URL.
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    98
        """
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    99
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   100
        url = self.tileserver
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   101
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   102
        if name:
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   103
            url += name
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   104
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   105
        if query:
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   106
            url += '?' + django.utils.http.urlencode(query)
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   107
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   108
        return url
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   109
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   110
STORE = Store(
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   111
    # PNGTileStore
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   112
    image_root  = settings.QMSK_PNGTILE_ROOT,
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   113
    
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   114
    # Store
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
   115
    title       = settings.QMSK_PNGTILE_TITLE,
236
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   116
    tileserver  = settings.QMSK_PNGTILE_SERVER,
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   117
)