degal/image.py
changeset 77 2a53c5ade434
parent 76 e22d9f699081
child 85 7da934333469
--- a/degal/image.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/image.py	Fri Jun 05 23:59:14 2009 +0300
@@ -4,7 +4,7 @@
 
 from __future__ import with_statement
 
-import filesystem, render, html
+import filesystem, render, html, format
 from utils import lazy_load
 
 import PIL.Image
@@ -20,7 +20,7 @@
             Initialize as an Image based on the given Node, linked with the given previous node
         """
 
-        super(Image, self).__init__(node)
+        super(Image, self).__init__(*args, **kwargs)
 
         # links
         self.prev = None
@@ -33,77 +33,65 @@
         self.title = self.name
         self.description = None
 
-        # lazy-loading
-        self.img = None
-        self.exif = None
-        self.metadata = None
-        self.stat_data = None
-
-    def load_stat (self) :
+    @lazy_load
+    def stat (self) :
         """
             Load and return the os.stat info for this file
         """
 
-        if not self.stat_data :
-            self.stat_data = self.stat()
-
-        return self.stat_data
-
-    def load_image (self) :
+        return super(Image, self).stat()
+    
+    @lazy_load
+    def image (self) :
         """
             Loads the image as a PIL.Image
         """
         
-        if not self.img :
-            # open it up
-            self.img = PIL.Image.open(self.path)
+        # open it up
+        return PIL.Image.open(self.path)
 
-        return self.img
-
-    def load_exif (self) :
+    @lazy_load
+    def exif (self) :
         """
             Loads the EXIF data for the image and returns as a dict of EXIF tag names -> values.
 
             Returns None if no exif data was found
         """
 
-        if self.exif is None :
-            # load
-            with self.open('rb') as fh :
-                # XXX: details=False?
-                self.exif = EXIF.process_file(fh)
+        # load
+        with self.open('rb') as fh :
+            # XXX: details=False?
+            exif = EXIF.process_file(fh)
             
         # empty dict -> no exif data
-        if self.exif :
-            return self.exif
+        if exif :
+            return exif
 
         else :
             return None
-
-    def load_metadata (self) :
+    
+    @lazy_load
+    def metadata (self) :
         """
             Load and return the metadata for the image as a dictionary
         """
 
-        if not self.metadata :
-            # load stuff
-            stat = self.load_stat()
-            exif = self.load_exif()
+        # load stuff
+        stat = self.stat
+        exif = self.exif
 
-            # XXX: avoid having to open the image?
-            size = self.load_image().size
-            
-            # build
-            self.metadata = dict({
-                "File name":        self.name,
-                "Resolution":       "%dx%d" % size,
-                "File size":        format.filesize(stat.st_size),
-                "Last modified":    format.filetime(stat.st_mtime),
-            }, **dict(
-                (name, exif[tag]) for tag, name in self.config.exif_tags if exif and tag in exif
-            ))
-
-        return self.metadata
+        # XXX: avoid having to open the image?
+        size = self.image.size
+        
+        # build
+        return dict({
+            "File name":        self.name,
+            "Resolution":       "%dx%d" % size,
+            "File size":        format.filesize(stat.st_size),
+            "Last modified":    format.filetime(stat.st_mtime),
+        }, **dict(
+            (name, exif[tag]) for tag, name in self.config.exif_tags if exif and tag in exif
+        ))
     
     @lazy_load
     def thumb (self) :
@@ -117,7 +105,7 @@
 
         # render if needed
         return render_machine.render_lazy(self,
-            self.config.thumb_size, self.parent.load_thumb_dir.subnode(self.name)
+            self.config.thumb_size, self.parent.thumb_dir.subnode(self.name)
         )
     
     @lazy_load
@@ -131,6 +119,6 @@
         render_machine = self.config.get_renderer()
 
         return render_machine.render_lazy(self, 
-            self.config.preview_size, self.parent.load_preview_dir.subnode(self.name)
+            self.config.preview_size, self.parent.preview_dir.subnode(self.name)
         )