degal/folder.py
author Tero Marttila <terom@fixme.fi>
Thu, 11 Jun 2009 21:26:05 +0300
branchthreaded-tasks
changeset 89 4b254a90d6d0
parent 85 7da934333469
child 90 606bae04f79b
permissions -rw-r--r--
add task_threads config setting
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
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    52
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    53
        return (Folder(node) for node in self.subnodes if isinstance(node, filesystem.Directory))
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    54
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    55
    @lazy_load_iter
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    56
    def images (self) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    57
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    58
            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
    59
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    60
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    61
        prev = None
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    62
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    63
        for node in self.subnodes :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    64
            # skip non-relevant ones
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    65
            # XXX: node should need to be a File
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    66
            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
    67
                continue
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
            # 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
    70
            img = image.Image(node)
64
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
            # link up
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    73
            if prev :
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    74
                img.prev = prev
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    75
                prev.next = img
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    76
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    77
                # yield the linked-up prev
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    78
                yield prev
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    79
            
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    80
            # continue
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    81
            prev = img
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    82
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    83
        # and the last one
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    84
        if prev :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    85
            yield prev
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
    @property
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    88
    def page_count (self) :
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
            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
    91
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    92
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    93
        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
    94
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    95
    def images_for_page (self, page) :
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
            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
    98
        """
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
        # offset to first image
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   101
        offset = page * self.config.images_per_page
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   102
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   103
        # slice
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   104
        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
   105
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   106
    def html_file (self, page=0) :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   107
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   108
            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
   109
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   110
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   111
        if page :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   112
            return self.subfile("index_%d.html" % page)
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   113
        
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   114
        else :
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   115
            return self.subfile("index.html")
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   116
    
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
   117
    def index_images (self, for_update=True) :
64
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   118
        """
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
   119
            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
   120
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
   121
            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
   122
        """
4ebd563214d2 begin implementation of folder, gallery
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   123
        
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
   124
        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
   125
            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
   126
                # 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
   127
                continue
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
            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
   130