--- a/degal/folder.py Fri Jun 05 21:50:33 2009 +0300
+++ b/degal/folder.py Fri Jun 05 21:50:49 2009 +0300
@@ -1,19 +1,128 @@
-import os, os.path
+"""
+ Per-directory gallery state
+"""
-import settings, image, utils, helpers, log
-from template import gallery as gallery_tpl
-from helpers import url_for_page
+import filesystem, image, html
-def dirUp (count=1) :
+from utils import lazy_load
+
+class Folder (filesyste.Directory) :
"""
- Returns a relative path to the directly count levels above the current one
+ A Folder is a filesystem Directory that contains any number of other Folders and Images.
"""
- if not count :
- return '.'
+ def __init__ (self, node) :
+ super(Folder, self).__init__(node)
- return os.path.join(*(['..']*count))
+ # info
+ self.title = None
+ self.description = None
+
+ @lazy_load
+ def preview_dir (self) :
+ """
+ Load and return the Directory for previews
+ """
+
+ return self.subdir(self.config.preview_dir, create=True)
+ @lazy_load
+ def thumb_dir (self) :
+ """
+ Load and return the Directory for thumbs
+ """
+
+ return self.subdir(self.config.thumb_dir, create=True)
+
+ @lazy_load_iter
+ def subnodes (self) :
+ """
+ Load and return an ordered list of child-Nodes
+ """
+
+ return super(Folder, self).subnodes(skip_dotfiles=True, sorted=True)
+
+ @lazy_load_iter
+ def subfolders (self) :
+ """
+ Load and return an ordered list of sub-Folders
+ """
+
+ return (Folder(node) for node in self.subnodes if isinstance(node, filesystem.Directory))
+
+ @lazy_load_iter
+ def images (self) :
+ """
+ Load and return an ordered/linked list of sub-Images
+ """
+
+ prev = None
+
+ for node in self.subnodes :
+ # skip non-relevant ones
+ # XXX: node should need to be a File
+ if not isinstance(node, filesystem.File) or not self.config.is_image(node) :
+ continue
+
+ # create new
+ img = image.Image(node, prev)
+
+ # link up
+ if prev :
+ prev.next = img
+
+ # yield the linked-up prev
+ yield prev
+
+ # continue
+ prev = img
+
+ # and the last one
+ if prev :
+ yield prev
+
+ @property
+ def page_count (self) :
+ """
+ Returns the number of pages needed to show this folder's images
+ """
+
+ return math.ceil(len(self.images) / float(self.config.images_per_page))
+
+ def images_for_page (self, page) :
+ """
+ Returns the list of Images to be displayed for the given page, if any
+ """
+
+ # offset to first image
+ offset = page * self.config.images_per_page
+
+ # slice
+ return self.images[offset : offset + self.config.images_per_page]
+
+ def html_file (self, page=0) :
+ """
+ Returns the File representing the .html for the given page
+ """
+
+ if page :
+ return self.subfile("index_%d.html" % page)
+
+ else :
+ return self.subfile("index.html")
+
+ def index (self) :
+ """
+ Recursively index this Folder, yielding a series of all Folder objects inside.
+ """
+
+ # and subfolders
+ for subfolder in self.subfolders :
+ yield subfolder
+
+ for item in subfolder.index_subfolders() :
+ yield item
+
class Folder (object) :
def __init__ (self, name='.', parent=None) :
# the directory name, no trailing /