filer.models.imagemodels: 129 total statements, 0.0% covered

Generated: Wed 2013-03-13 10:33 CET

Source file: /media/Envs/Envs/filer-gallery/lib/python2.7/site-packages/filer/models/imagemodels.py

Stats: 0 executed, 117 missed, 12 excluded, 74 ignored

  1. #-*- coding: utf-8 -*-
  2. import logging
  3. try:
  4. from PIL import Image as PILImage
  5. except ImportError:
  6. try:
  7. import Image as PILImage
  8. except ImportError:
  9. raise ImportError("The Python Imaging Library was not found.")
  10. from datetime import datetime
  11. from django.core import urlresolvers
  12. from django.db import models
  13. from django.utils.translation import ugettext_lazy as _
  14. from filer import settings as filer_settings
  15. from filer.models.filemodels import File
  16. from filer.utils.filer_easy_thumbnails import FilerThumbnailer
  17. from filer.utils.pil_exif import get_exif_for_file
  18. import os
  19. logger = logging.getLogger("filer")
  20. class Image(File):
  21. SIDEBAR_IMAGE_WIDTH = 210
  22. DEFAULT_THUMBNAILS = {
  23. 'admin_clipboard_icon': {'size': (32, 32), 'crop': True,
  24. 'upscale': True},
  25. 'admin_sidebar_preview': {'size': (SIDEBAR_IMAGE_WIDTH, 10000)},
  26. 'admin_directory_listing_icon': {'size': (48, 48),
  27. 'crop': True, 'upscale': True},
  28. 'admin_tiny_icon': {'size': (32, 32), 'crop': True, 'upscale': True},
  29. }
  30. file_type = 'Image'
  31. _icon = "image"
  32. _height = models.IntegerField(null=True, blank=True)
  33. _width = models.IntegerField(null=True, blank=True)
  34. date_taken = models.DateTimeField(_('date taken'), null=True, blank=True,
  35. editable=False)
  36. default_alt_text = models.CharField(_('default alt text'), max_length=255, blank=True, null=True)
  37. default_caption = models.CharField(_('default caption'), max_length=255, blank=True, null=True)
  38. author = models.CharField(_('author'), max_length=255, null=True, blank=True)
  39. must_always_publish_author_credit = models.BooleanField(_('must always publish author credit'), default=False)
  40. must_always_publish_copyright = models.BooleanField(_('must always publish copyright'), default=False)
  41. subject_location = models.CharField(_('subject location'), max_length=64, null=True, blank=True,
  42. default=None)
  43. @classmethod
  44. def matches_file_type(cls, iname, ifile, request):
  45. # This was originally in admin/clipboardadmin.py it was inside of a try
  46. # except, I have moved it here outside of a try except because I can't
  47. # figure out just what kind of exception this could generate... all it was
  48. # doing for me was obscuring errors...
  49. # --Dave Butler <croepha@gmail.com>
  50. iext = os.path.splitext(iname)[1].lower()
  51. return iext in ['.jpg', '.jpeg', '.png', '.gif']
  52. def save(self, *args, **kwargs):
  53. if self.date_taken is None:
  54. try:
  55. exif_date = self.exif.get('DateTimeOriginal', None)
  56. if exif_date is not None:
  57. d, t = str.split(exif_date.values)
  58. year, month, day = d.split(':')
  59. hour, minute, second = t.split(':')
  60. self.date_taken = datetime(
  61. int(year), int(month), int(day),
  62. int(hour), int(minute), int(second))
  63. except:
  64. pass
  65. if self.date_taken is None:
  66. self.date_taken = datetime.now()
  67. self.has_all_mandatory_data = self._check_validity()
  68. try:
  69. # do this more efficient somehow?
  70. self.file.seek(0)
  71. self._width, self._height = PILImage.open(self.file).size
  72. except Exception:
  73. # probably the image is missing. nevermind.
  74. pass
  75. super(Image, self).save(*args, **kwargs)
  76. def _check_validity(self):
  77. if not self.name:
  78. return False
  79. return True
  80. def sidebar_image_ratio(self):
  81. if self.width:
  82. return float(self.width) / float(self.SIDEBAR_IMAGE_WIDTH)
  83. else:
  84. return 1.0
  85. def _get_exif(self):
  86. if hasattr(self, '_exif_cache'):
  87. return self._exif_cache
  88. else:
  89. if self.file:
  90. self._exif_cache = get_exif_for_file(self.file.path)
  91. else:
  92. self._exif_cache = {}
  93. return self._exif_cache
  94. exif = property(_get_exif)
  95. def has_edit_permission(self, request):
  96. return self.has_generic_permission(request, 'edit')
  97. def has_read_permission(self, request):
  98. return self.has_generic_permission(request, 'read')
  99. def has_add_children_permission(self, request):
  100. return self.has_generic_permission(request, 'add_children')
  101. def has_generic_permission(self, request, permission_type):
  102. """
  103. Return true if the current user has permission on this
  104. image. Return the string 'ALL' if the user has all rights.
  105. """
  106. user = request.user
  107. if not user.is_authenticated() or not user.is_staff:
  108. return False
  109. elif user.is_superuser:
  110. return True
  111. elif user == self.owner:
  112. return True
  113. elif self.folder:
  114. return self.folder.has_generic_permission(request, permission_type)
  115. else:
  116. return False
  117. @property
  118. def label(self):
  119. if self.name in ['', None]:
  120. return self.original_filename or 'unnamed file'
  121. else:
  122. return self.name
  123. @property
  124. def width(self):
  125. return self._width or 0
  126. @property
  127. def height(self):
  128. return self._height or 0
  129. @property
  130. def icons(self):
  131. _icons = {}
  132. for size in filer_settings.FILER_ADMIN_ICON_SIZES:
  133. try:
  134. thumbnail_options = {
  135. 'size': (int(size), int(size)),
  136. 'crop': True,
  137. 'upscale': True,
  138. 'subject_location': self.subject_location}
  139. thumb = self.file.get_thumbnail(thumbnail_options)
  140. _icons[size] = thumb.url
  141. except Exception, e:
  142. # catch exception and manage it. We can re-raise it for debugging
  143. # purposes and/or just logging it, provided user configured
  144. # proper logging configuration
  145. if filer_settings.FILER_ENABLE_LOGGING:
  146. logger.error('Error while generating icons: %s',e)
  147. if filer_settings.FILER_DEBUG:
  148. raise e
  149. return _icons
  150. @property
  151. def thumbnails(self):
  152. _thumbnails = {}
  153. for name, opts in Image.DEFAULT_THUMBNAILS.items():
  154. try:
  155. opts.update({'subject_location': self.subject_location})
  156. thumb = self.file.get_thumbnail(opts)
  157. _thumbnails[name] = thumb.url
  158. except Exception,e:
  159. # catch exception and manage it. We can re-raise it for debugging
  160. # purposes and/or just logging it, provided user configured
  161. # proper logging configuration
  162. if filer_settings.FILER_ENABLE_LOGGING:
  163. logger.error('Error while generating thumbnail: %s',e)
  164. if filer_settings.FILER_DEBUG:
  165. raise e
  166. return _thumbnails
  167. @property
  168. def easy_thumbnails_thumbnailer(self):
  169. tn = FilerThumbnailer(
  170. file=self.file.file, name=self.file.name,
  171. source_storage=self.file.source_storage,
  172. thumbnail_storage=self.file.thumbnail_storage,
  173. thumbnail_basedir=self.file.thumbnail_basedir)
  174. return tn
  175. class Meta:
  176. app_label = 'filer'
  177. verbose_name = _('image')
  178. verbose_name_plural = _('images')