qmsk.pngtile: views.index: show tree in nav, and items in content
authorTero Marttila <terom@qmsk.net>
Sat, 04 Oct 2014 15:14:22 +0300
changeset 238 2c62e4d70619
parent 237 6698dabcc425
child 239 cf7a46725ce5
qmsk.pngtile: views.index: show tree in nav, and items in content
qmsk/pngtile/pngtile.py
qmsk/pngtile/templates/qmsk.pngtile/index.html
qmsk/pngtile/views.py
qmsk_pngtile/settings/pngtile.py
--- 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/'