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
from __future__ import absolute_import

from django.conf import settings
import django.utils.http

# the top-level pngtile package
from pngtile.store import (
        Error,
        NotFound,
        InvalidImage,
        UncachedImage,
        PNGTileStore,
)

import os.path

class Store (PNGTileStore):
    def __init__ (self, title, tileserver, **opts):
        super(Store, self).__init__(**opts)
        
        self._title = title
        self.tileserver = tileserver

    def title (self, name):
        if name:
            return os.path.basename(name)
        else:
            return self._title

    def breadcrumb (self, name):
        """
            Yield (name, title) tuples for breadcrumb to name
        """

        path = [ ]

        for part in name.split('/'):
            path.append(part)

            yield '/'.join(path), part

    def tree (self, name):
        """
            Yield [(item, name)] lists for given path.
        """
        
        # always, starting from root
        parts = []

        if name:
            # also including the dir itself... but not the root twice
            name += '/'

        # walk up the tree from root the dir itself
        for tree_item in name.split('/'):
            tree_name = '/'.join(parts)
            
            dirs = [ ]
            items = [ ]
            
            # walk through the items within this tree node
            for item, type in self.list(tree_name):
                if tree_name:
                    item_name = tree_name + '/' + item
                else:
                    item_name = item

                if type:
                    items.append((item, item_name))
                else:
                    dirs.append((item, item_name))
            
            # tree of parent + item within parent
            yield sorted(dirs), tree_item

            parts.append(tree_item)

    def items (self, name):
        """
            Yield (item, name) for given path.
        """

        for item, type in self.list(name):
            if name:
                item_name = name + '/' + item
            else:
                item_name = item

            if type:
                yield item, item_name

    def tiles_url (self, name, **query):
        """
            Return a tileserver URL.
        """

        url = self.tileserver

        if name:
            url += name

        if query:
            url += '?' + django.utils.http.urlencode(query)

        return url

STORE = Store(
    # PNGTileStore
    image_root  = settings.QMSK_PNGTILE_ROOT,
    
    # Store
    title       = settings.QMSK_PNGTILE_TITLE,
    tileserver  = settings.QMSK_PNGTILE_SERVER,
)