qmsk/pngtile/pngtile.py
author Tero Marttila <terom@qmsk.net>
Sat, 04 Oct 2014 15:14:22 +0300
changeset 238 2c62e4d70619
parent 236 4ca68e4eb386
child 115 ac2608e5a0b6
permissions -rw-r--r--
qmsk.pngtile: views.index: show tree in nav, and items in content
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):
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    18
    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
    19
        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
    20
        
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    21
        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
    22
        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
    23
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    24
    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
    25
        if name:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    26
            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
    27
        else:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    28
            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
    29
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    30
    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
    31
        """
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    32
            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
    33
        """
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
        path = [ ]
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
        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
    38
            path.append(part)
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
            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
    41
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    42
    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
    43
        """
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    44
            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
    45
        """
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
        # 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
    48
        parts = []
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
        if name:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    51
            # 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
    52
            name += '/'
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    53
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    54
        # 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
    55
        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
    56
            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
    57
            
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    58
            dirs = [ ]
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    59
            items = [ ]
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
            # 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
    62
            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
    63
                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
    64
                    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
    65
                else:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    66
                    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
    67
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    68
                if type:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    69
                    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
    70
                else:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    71
                    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
    72
            
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    73
            # 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
    74
            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
    75
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    76
            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
    77
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    78
    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
    79
        """
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    80
            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
    81
        """
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
        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
    84
            if name:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    85
                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
    86
            else:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    87
                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
    88
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    89
            if type:
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
    90
                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
    91
236
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    92
    def tiles_url (self, name, **query):
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    93
        """
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
    94
            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
    95
        """
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
        url = self.tileserver
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
        if name:
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   100
            url += name
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 query:
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   103
            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
   104
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   105
        return url
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   106
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   107
STORE = Store(
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   108
    # PNGTileStore
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   109
    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
   110
    
4ca68e4eb386 qmsk.pngtile: django app for pngtile index/viewer; very raw index view
Tero Marttila <terom@qmsk.net>
parents:
diff changeset
   111
    # Store
238
2c62e4d70619 qmsk.pngtile: views.index: show tree in nav, and items in content
Tero Marttila <terom@qmsk.net>
parents: 236
diff changeset
   112
    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
   113
    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
   114
)