qmsk/pngtile/pngtile.py
author Tero Marttila <terom@qmsk.net>
Sat, 04 Oct 2014 16:47:04 +0300
changeset 119 9a7d584349fb
parent 117 f18280afafd2
child 121 8c336a1970b3
permissions -rw-r--r--
qmsk.pngtile: views.index: render item previews
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):
    TILE_SIZE = 256
    TILE_ZOOM = 4

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

    def title (self, name):
        if not name:
            return self._title
        
        if '/'  in name:
            _, name = name.rsplit('/', 1)

        if '.' in name:
            name, ext = name.split('.', 1)

        return name

    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 not type:
                # skip dirs
                continue

            if name:
                item_name = name + '/' + item
            else:
                item_name = item
            
            # open Image
            image, image_name = self.open(item_name)
            image_info = image.info()
            
            # preview <img>
            x = image_info['img_width'] / 2
            y = image_info['img_height'] / 2
            zoom = 2

            img_src = self.tiles_url(image_name, w=640, h=320,
                    t       = image_info['cache_mtime'],
                    x       = x >> zoom,
                    y       = y >> zoom,
                    zoom    = zoom,
            )

            # overlay title
            item_title = self.title(item_name)

            yield item_title, item_name, img_src

    def tiles_url (self, name=None, **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,
)