Mercurial > hg > montage
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 |
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 | 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 | 9 |
31 | 10 # PIL |
11 try: | |
12 import Image | |
13 except: | |
14 from PIL import Image | |
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 | 23 |
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 | 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 | 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 | 35 data['width'] = self.width |
36 data['height'] = self.height | |
37 | |
38 # filter out non-images | |
39 _files = [] | |
40 for f in data['files']: | |
41 mimetype = mimetypes.guess_type(f['name'])[0] | |
42 if mimetype and mimetype.split('/')[0] == 'image': | |
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 | 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 | 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 | 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 | 73 if self.width and thumb.size[0] > self.width: |
74 create_thumbnail = True | |
75 if self.height and thumb.size[1] > self.height: | |
76 create_thumbnail = True | |
77 | |
8
93af41dcff3a
now creates thumbnails using cropresize package
k0s <k0scist@gmail.com>
parents:
5
diff
changeset
|
78 except: |
12 | 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 | 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 | 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 | 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 | 100 except Exception, e: # failure to create thumbnail |
101 # cleanup file | |
102 if flag: | |
103 fd.close() | |
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 |