--- a/qmsk/pngtile/pngtile.py Sat Oct 04 14:36:02 2014 +0300
+++ b/qmsk/pngtile/pngtile.py Sat Oct 04 15:14:22 2014 +0300
@@ -12,11 +12,20 @@
PNGTileStore,
)
+import os.path
+
class Store (PNGTileStore):
- def __init__ (self, tileserver, **opts):
+ def __init__ (self, title, tileserver, **opts):
super(Store, self).__init__(**opts)
+
+ self._title = title
+ self.tileserver = tileserver
- self.tileserver = tileserver
+ def title (self, name):
+ if name:
+ return os.path.basename(name)
+ else:
+ return self._title
def breadcrumb (self, name):
"""
@@ -30,6 +39,56 @@
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.
@@ -50,5 +109,6 @@
image_root = settings.QMSK_PNGTILE_ROOT,
# Store
+ title = settings.QMSK_PNGTILE_TITLE,
tileserver = settings.QMSK_PNGTILE_SERVER,
)
--- a/qmsk/pngtile/templates/qmsk.pngtile/index.html Sat Oct 04 14:36:02 2014 +0300
+++ b/qmsk/pngtile/templates/qmsk.pngtile/index.html Sat Oct 04 15:14:22 2014 +0300
@@ -4,7 +4,7 @@
{% block header %}
<h1 class="page-header-title">
- <a href="{% url 'index' '' %}">{{ site_name }}</a>
+ <a href="{% url 'index' '' %}">{{ title }}</a>
</h1>
{% endblock %}
@@ -17,17 +17,30 @@
{% endblock %}
{% block nav %}
+{% for tree_items, tree_item in index_tree %}
+ {% if not forloop.first %}
+ <hr />
+ {% endif %}
<ul class="nav">
- {% for item in index_list %}
- <li>
- <a href="{{item}}">{{item}}</a>
+ {% for item, item_name in tree_items %}
+ <li
+ {% if item == tree_item %}
+ class="active"
+ {% endif %}
+ >
+ <a href="{% url 'index' item_name %}">{{item}}</a>
</li>
{% endfor %}
</ul>
+{% endfor %}
{% endblock %}
{% block content %}
-
+{% for item, item_name in index_items %}
+ <div>
+ <a href="{% url 'image' item_name %}">{{item}}</a>
+ </div>
+{% endfor %}
{% endblock %}
{% block footer %}
--- a/qmsk/pngtile/views.py Sat Oct 04 14:36:02 2014 +0300
+++ b/qmsk/pngtile/views.py Sat Oct 04 15:14:22 2014 +0300
@@ -6,8 +6,11 @@
import pypngtile
def index (request, name):
+ store = pngtile.STORE
+
try:
- items = pngtile.STORE.list(name)
+ tree = store.tree(name)
+ items = store.items(name)
except pngtile.NotFound:
raise http.Http404
except pngtile.InvalidImage:
@@ -22,8 +25,10 @@
return render(request, 'qmsk.pngtile/index.html', dict(
site_name = u"...",
name = name,
- breadcrumb = pngtile.STORE.breadcrumb(name),
- index_list = items,
+ title = store.title(name),
+ breadcrumb = store.breadcrumb(name),
+ index_tree = tree,
+ index_items = sorted(items),
))
def image (request, name):
--- a/qmsk_pngtile/settings/pngtile.py Sat Oct 04 14:36:02 2014 +0300
+++ b/qmsk_pngtile/settings/pngtile.py Sat Oct 04 15:14:22 2014 +0300
@@ -1,4 +1,5 @@
## Settings for qmsk.pngtile
+QMSK_PNGTILE_TITLE = "pngtile.qmsk.net"
QMSK_PNGTILE_ROOT = '/srv/pngtile'
QMSK_PNGTILE_SERVER = 'http://0.pngtile.qmsk.net/'