degal/folder.py
author Tero Marttila <terom@fixme.fi>
Thu, 11 Jun 2009 22:50:21 +0300
changeset 96 d9cf1e272e90
parent 90 606bae04f79b
child 99 2ea929b45a14
permissions -rw-r--r--
fix LazyProperty to not inherit from property, so as to act as a non-data descriptor, which can then be overriden by per-instance __dict__ values
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     1
"""
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     2
    Per-directory gallery state
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     3
"""
12
c2d8e9a754a1 Major code restructuring. Version is now 0.5, templates use Mako, and the code is split off into several files under lib/
terom
parents:
diff changeset
     4
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     5
import filesystem, image, html
12
c2d8e9a754a1 Major code restructuring. Version is now 0.5, templates use Mako, and the code is split off into several files under lib/
terom
parents:
diff changeset
     6
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
     7
from utils import lazy_load, lazy_load_iter
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     8
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
     9
import math
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    10
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    11
class Folder (filesystem.Directory) :
12
c2d8e9a754a1 Major code restructuring. Version is now 0.5, templates use Mako, and the code is split off into several files under lib/
terom
parents:
diff changeset
    12
    """
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    13
        A Folder is a filesystem Directory that contains any number of other Folders and Images.
12
c2d8e9a754a1 Major code restructuring. Version is now 0.5, templates use Mako, and the code is split off into several files under lib/
terom
parents:
diff changeset
    14
    """
c2d8e9a754a1 Major code restructuring. Version is now 0.5, templates use Mako, and the code is split off into several files under lib/
terom
parents:
diff changeset
    15
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    16
    def __init__ (self, *args, **kwargs) :
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    17
        super(Folder, self).__init__(*args, **kwargs)
12
c2d8e9a754a1 Major code restructuring. Version is now 0.5, templates use Mako, and the code is split off into several files under lib/
terom
parents:
diff changeset
    18
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    19
        # info
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    20
        self.title = None
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    21
        self.description = None
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
    22
        
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    23
    @lazy_load
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    24
    def preview_dir (self) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    25
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    26
            Load and return the Directory for previews
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    27
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    28
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    29
        return self.subdir(self.config.preview_dir, create=True)
12
c2d8e9a754a1 Major code restructuring. Version is now 0.5, templates use Mako, and the code is split off into several files under lib/
terom
parents:
diff changeset
    30
    
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    31
    @lazy_load
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    32
    def thumb_dir (self) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    33
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    34
            Load and return the Directory for thumbs
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    35
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    36
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    37
        return self.subdir(self.config.thumb_dir, create=True)
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    38
   
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    39
    @lazy_load_iter
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    40
    def subnodes (self) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    41
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    42
            Load and return an ordered list of child-Nodes
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    43
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    44
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    45
        return super(Folder, self).subnodes(skip_dotfiles=True, sort=True)
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    46
    
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    47
    @lazy_load_iter
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    48
    def subfolders (self) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    49
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    50
            Load and return an ordered list of sub-Folders
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    51
        """
90
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    52
        
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    53
        # filter out valid subfolders
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    54
        for node in self.subnodes :
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    55
            # skip non-dirs
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    56
            if not node.is_dir() :
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    57
                continue
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    58
90
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    59
            # skip the previews/thumbs dirs
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    60
            if node.name in (self.config.preview_dir, self.config.thumb_dir) :
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    61
                continue
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    62
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    63
            # ok
606bae04f79b fix Folder.subdirs
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    64
            yield Folder(node)
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    65
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    66
    @lazy_load_iter
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    67
    def images (self) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    68
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    69
            Load and return an ordered/linked list of sub-Images
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    70
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    71
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    72
        prev = None
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    73
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    74
        for node in self.subnodes :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    75
            # skip non-relevant ones
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    76
            if not node.is_file() or not self.config.is_image(filesystem.File(node)) :
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    77
                continue
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    78
            
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    79
            # create new
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    80
            img = image.Image(node)
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    81
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    82
            # link up
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    83
            if prev :
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    84
                img.prev = prev
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    85
                prev.next = img
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    86
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    87
                # yield the linked-up prev
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    88
                yield prev
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    89
            
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    90
            # continue
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    91
            prev = img
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    92
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    93
        # and the last one
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    94
        if prev :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    95
            yield prev
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    96
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    97
    @property
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    98
    def page_count (self) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    99
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   100
            Returns the number of pages needed to show this folder's images
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   101
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   102
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
   103
        return int(math.ceil(len(self.images) / float(self.config.images_per_page)))
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   104
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   105
    def images_for_page (self, page) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   106
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   107
            Returns the list of Images to be displayed for the given page, if any
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   108
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   109
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   110
        # offset to first image
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   111
        offset = page * self.config.images_per_page
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   112
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   113
        # slice
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   114
        return self.images[offset : offset + self.config.images_per_page]
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   115
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   116
    def html_file (self, page=0) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   117
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   118
            Returns the File representing the .html for the given page
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   119
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   120
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   121
        if page :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   122
            return self.subfile("index_%d.html" % page)
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   123
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   124
        else :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   125
            return self.subfile("index.html")
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   126
    
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   127
    def index_images (self, for_update=True) :
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   128
        """
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   129
            Return a series of Images inside of this folder.
70
67dd32adf159 remove old Folder, Image code, wrap up both
Tero Marttila <terom@fixme.fi>
parents: 64
diff changeset
   130
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   131
            If `for_update` is given, only images that are stale will be returned.
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   132
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   133
        
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   134
        for image in self.images :
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   135
            if for_update and not image.stale() :
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   136
                # skip 
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   137
                continue
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   138
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   139
            yield image
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   140