forked from django-cms/django-filer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
imagemodels.py
166 lines (147 loc) · 5.99 KB
/
imagemodels.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#-*- coding: utf-8 -*-
from PIL import Image as PILImage
from datetime import datetime
from django.core import urlresolvers
from django.db import models
from django.utils.translation import ugettext_lazy as _
from filer import settings as filer_settings
from filer.models.filemodels import File
from filer.utils.filer_easy_thumbnails import FilerThumbnailer
from filer.utils.pil_exif import get_exif_for_file
class Image(File):
SIDEBAR_IMAGE_WIDTH = 210
DEFAULT_THUMBNAILS = {
'admin_clipboard_icon': {'size': (32,32), 'crop':True, 'upscale':True},
'admin_sidebar_preview': {'size': (SIDEBAR_IMAGE_WIDTH,10000),},
'admin_directory_listing_icon': {'size': (48,48), 'crop':True, 'upscale':True},
'admin_tiny_icon': {'size': (32,32), 'crop':True, 'upscale':True},
}
file_type = 'Image'
_icon = "image"
_height = models.IntegerField(null=True, blank=True)
_width = models.IntegerField(null=True, blank=True)
date_taken = models.DateTimeField(_('date taken'), null=True, blank=True, editable=False)
default_alt_text = models.CharField(max_length=255, blank=True, null=True)
default_caption = models.CharField(max_length=255, blank=True, null=True)
author = models.CharField(max_length=255, null=True, blank=True)
must_always_publish_author_credit = models.BooleanField(default=False)
must_always_publish_copyright = models.BooleanField(default=False)
subject_location = models.CharField(max_length=64, null=True, blank=True, default=None)
def save(self, *args, **kwargs):
if self.date_taken is None:
try:
exif_date = self.exif.get('DateTimeOriginal', None)
if exif_date is not None:
d, t = str.split(exif_date.values)
year, month, day = d.split(':')
hour, minute, second = t.split(':')
self.date_taken = datetime(int(year), int(month), int(day),
int(hour), int(minute), int(second))
except:
pass
if self.date_taken is None:
self.date_taken = datetime.now()
self.has_all_mandatory_data = self._check_validity()
try:
# do this more efficient somehow?
self._width, self._height = PILImage.open(self.file).size
except Exception, e:
# probably the image is missing. nevermind.
pass
super(Image, self).save(*args, **kwargs)
def _check_validity(self):
if not self.name:# or not self.contact:
return False
return True
def sidebar_image_ratio(self):
if self.width:
return float(self.width)/float(self.SIDEBAR_IMAGE_WIDTH)
else:
return 1.0
def _get_exif(self):
if hasattr(self, '_exif_cache'):
return self._exif_cache
else:
if self.file:
self._exif_cache = get_exif_for_file(self.file.path)
else:
self._exif_cache = {}
return self._exif_cache
exif = property(_get_exif)
def has_edit_permission(self, request):
return self.has_generic_permission(request, 'edit')
def has_read_permission(self, request):
return self.has_generic_permission(request, 'read')
def has_add_children_permission(self, request):
return self.has_generic_permission(request, 'add_children')
def has_generic_permission(self, request, type):
"""
Return true if the current user has permission on this
image. Return the string 'ALL' if the user has all rights.
"""
user = request.user
if not user.is_authenticated() or not user.is_staff:
return False
elif user.is_superuser:
return True
elif user == self.owner:
return True
elif self.folder:
return self.folder.has_generic_permission(request, type)
else:
return False
@property
def label(self):
if self.name in ['', None]:
return self.original_filename or 'unnamed file'
else:
return self.name
@property
def width(self):
return self._width or 0
@property
def height(self):
return self._height or 0
@property
def icons(self):
_icons = {}
for size in filer_settings.FILER_ADMIN_ICON_SIZES:
try:
thumbnail_options = {
'size':(int(size),int(size)),
'crop': True,
'upscale':True,
'subject_location': self.subject_location,
}
thumb = self.file.get_thumbnail(thumbnail_options)
_icons[size] = thumb.url
except Exception, e:
# swallow the the exception to avoid to bubble it up
# in the template {{ image.icons.48 }}
pass
return _icons
@property
def thumbnails(self):
_thumbnails = {}
for name, opts in Image.DEFAULT_THUMBNAILS.items():
try:
opts.update({'subject_location': self.subject_location})
thumb = self.file.get_thumbnail(opts)
_thumbnails[name] = thumb.url
except:
# swallow the exception to avoid it bubbling up
# to the template {{ image.icons.48 }}
pass
return _thumbnails
def get_admin_url_path(self):
return urlresolvers.reverse('admin:filer_image_change', args=(self.id,))
@property
def easy_thumbnails_thumbnailer(self):
tn = FilerThumbnailer(file=self.file.file, name=self.file.name,
source_storage=self.file.source_storage,
thumbnail_storage=self.file.thumbnail_storage)
return tn
class Meta:
app_label = 'filer'
verbose_name = _('image')
verbose_name_plural = _('images')