annotate montage/formatters.py @ 31:d98c9e7415c3

better importing
author Jeff Hammel <jhammel@mozilla.com>
date Tue, 28 Aug 2012 22:03:34 -0700
parents ca43a7f71985
children 529598840f4b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
1 """
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
2 formatter for decoupage
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
3 """
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
4
2
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
5 import mimetypes
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
6 import os
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
7 from cropresize import crop_resize
5
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
8 from decoupage.formatters import FormatterBase
0
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
9
31
d98c9e7415c3 better importing
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
10 # PIL
d98c9e7415c3 better importing
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
11 try:
d98c9e7415c3 better importing
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
12 import Image
d98c9e7415c3 better importing
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
13 except:
d98c9e7415c3 better importing
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
14 from PIL import Image
d98c9e7415c3 better importing
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
15
5
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
16 class Images(FormatterBase):
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
17 """display images with thumbnails"""
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
18
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
19 defaults = { 'size': 'x',
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
20 'columns': None,
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
21 'thumb_dir': 'thumbs',
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
22 'thumb_prefix': 'thumb_'}
0
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
23
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
24 def __init__(self, arg):
5
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
25 FormatterBase.__init__(self, arg)
0
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
26
5
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
27 # get image size for display
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
28 width, height = [ i.strip() for i in self.size.split('x', 1) ]
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
29 self.width = width and int(width) or None
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
30 self.height = height and int(height) or None
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
31
0
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
32 def __call__(self, request, data):
5
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
33
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
34 # add width + height data
2
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
35 data['width'] = self.width
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
36 data['height'] = self.height
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
37
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
38 # filter out non-images
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
39 _files = []
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
40 for f in data['files']:
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
41 mimetype = mimetypes.guess_type(f['name'])[0]
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
42 if mimetype and mimetype.split('/')[0] == 'image':
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
43 _files.append(f)
5
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
44 f['link'] = f['path']
2
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
45 data['files'] = _files
5
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
46
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
47 # columns for grid display
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
48 if self.columns is None:
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
49 data['columns'] = len(data['files'])
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
50 else:
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
51 data['columns'] = int(self.columns)
2
4b8aa9b0a45b montage actually does something now
k0s <k0scist@gmail.com>
parents: 0
diff changeset
52
5
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
53 # thumbnails
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
54 if 'thumbnails' not in self.args:
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
55 return
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
56 thumb_dir = self.thumb_dir
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
57 if not os.path.isabs(thumb_dir):
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
58 thumb_dir = os.path.join(data['directory'], self.thumb_dir)
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
59 else:
5
d60a5ffbf4f4 * include a new template to display images in a grid
k0s <k0scist@gmail.com>
parents: 2
diff changeset
60 raise NotImplementedError
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
61 if not os.path.exists(thumb_dir):
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
62 os.mkdir(thumb_dir)
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
63 for f in data['files']:
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
64 filepath = os.path.join(data['directory'], f['name'])
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
65 thumbnail = '%s%s' % (self.thumb_prefix, f['name'])
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
66 thumbnail_file = os.path.join(data['directory'], thumb_dir, thumbnail)
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
67 create_thumbnail = False
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
68 if os.path.exists(thumbnail_file):
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
69
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
70 try:
12
e9be444c874b really use a thumbnail if it exists
k0s <k0scist@gmail.com>
parents: 11
diff changeset
71 # ensure the size is smaller than the specified size
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
72 thumb = Image.open(thumbnail_file)
12
e9be444c874b really use a thumbnail if it exists
k0s <k0scist@gmail.com>
parents: 11
diff changeset
73 if self.width and thumb.size[0] > self.width:
e9be444c874b really use a thumbnail if it exists
k0s <k0scist@gmail.com>
parents: 11
diff changeset
74 create_thumbnail = True
e9be444c874b really use a thumbnail if it exists
k0s <k0scist@gmail.com>
parents: 11
diff changeset
75 if self.height and thumb.size[1] > self.height:
e9be444c874b really use a thumbnail if it exists
k0s <k0scist@gmail.com>
parents: 11
diff changeset
76 create_thumbnail = True
e9be444c874b really use a thumbnail if it exists
k0s <k0scist@gmail.com>
parents: 11
diff changeset
77
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
78 except:
12
e9be444c874b really use a thumbnail if it exists
k0s <k0scist@gmail.com>
parents: 11
diff changeset
79 pass
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
80
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
81 # ensure the original file has not been modified
10
73d18f0cf8bb fix serious bug where access time was used instead of modify time
k0s <k0scist@gmail.com>
parents: 8
diff changeset
82 if os.path.getmtime(thumbnail_file) < os.path.getmtime(filepath):
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
83 create_thumbnail = True
12
e9be444c874b really use a thumbnail if it exists
k0s <k0scist@gmail.com>
parents: 11
diff changeset
84
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
85 else:
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
86 # create a new thumbnail
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
87 create_thumbnail = True
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
88
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
89 if create_thumbnail: # do thumbnail creation
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
90
13
ca43a7f71985 remove badly created files, for now
k0s <k0scist@gmail.com>
parents: 12
diff changeset
91 flag = False
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
92 try:
11
8353caad836c use a thumbnail if it exists even if its wrong
k0s <k0scist@gmail.com>
parents: 10
diff changeset
93 image = Image.open(filepath)
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
94 thumbnail_image = crop_resize(image, (self.width, self.height))
11
8353caad836c use a thumbnail if it exists even if its wrong
k0s <k0scist@gmail.com>
parents: 10
diff changeset
95 fd = file(thumbnail_file, 'w')
13
ca43a7f71985 remove badly created files, for now
k0s <k0scist@gmail.com>
parents: 12
diff changeset
96 flag = True
11
8353caad836c use a thumbnail if it exists even if its wrong
k0s <k0scist@gmail.com>
parents: 10
diff changeset
97 thumbnail_image.save(fd)
8353caad836c use a thumbnail if it exists even if its wrong
k0s <k0scist@gmail.com>
parents: 10
diff changeset
98 fd.close()
8353caad836c use a thumbnail if it exists even if its wrong
k0s <k0scist@gmail.com>
parents: 10
diff changeset
99
13
ca43a7f71985 remove badly created files, for now
k0s <k0scist@gmail.com>
parents: 12
diff changeset
100 except Exception, e: # failure to create thumbnail
ca43a7f71985 remove badly created files, for now
k0s <k0scist@gmail.com>
parents: 12
diff changeset
101 # cleanup file
ca43a7f71985 remove badly created files, for now
k0s <k0scist@gmail.com>
parents: 12
diff changeset
102 if flag:
ca43a7f71985 remove badly created files, for now
k0s <k0scist@gmail.com>
parents: 12
diff changeset
103 fd.close()
ca43a7f71985 remove badly created files, for now
k0s <k0scist@gmail.com>
parents: 12
diff changeset
104 os.remove(thumbnail_file)
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
105
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
106 # fix the path to point to the thumbnail
11
8353caad836c use a thumbnail if it exists even if its wrong
k0s <k0scist@gmail.com>
parents: 10
diff changeset
107 if os.path.exists(thumbnail_file):
8353caad836c use a thumbnail if it exists even if its wrong
k0s <k0scist@gmail.com>
parents: 10
diff changeset
108 f['path'] = '%s/%s/%s' % (f['path'].rsplit('/', 1)[0],
8353caad836c use a thumbnail if it exists even if its wrong
k0s <k0scist@gmail.com>
parents: 10
diff changeset
109 self.thumb_dir,
8353caad836c use a thumbnail if it exists even if its wrong
k0s <k0scist@gmail.com>
parents: 10
diff changeset
110 thumbnail)
8
93af41dcff3a now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents: 5
diff changeset
111