Okay, we don't know that indexes are falsey, so let's make it clearer. Yeek!
[mediagoblin.git] / mediagoblin / db / mixin.py
index 0dc3bc851fb8c3b14a36de7c55f9388321fda08a..1f2e7ec30262d762deab08704059cc15b02bd6f2 100644 (file)
@@ -28,29 +28,29 @@ real objects.
 """
 
 import uuid
+import re
+from datetime import datetime
 
 from werkzeug.utils import cached_property
 
 from mediagoblin import mg_globals
-from mediagoblin.auth import lib as auth_lib
-from mediagoblin.media_types import get_media_managers, FileTypeNotSupported
+from mediagoblin.media_types import FileTypeNotSupported
 from mediagoblin.tools import common, licenses
+from mediagoblin.tools.pluginapi import hook_handle
 from mediagoblin.tools.text import cleaned_markdown_conversion
 from mediagoblin.tools.url import slugify
 
 
 class UserMixin(object):
-    def check_login(self, password):
-        """
-        See if a user can login with this password
-        """
-        return auth_lib.bcrypt_check_password(
-            password, self.pw_hash)
-
     @property
     def bio_html(self):
         return cleaned_markdown_conversion(self.bio)
 
+    def url_for_self(self, urlgen, **kwargs):
+        """Generate a URL for this User's home page."""
+        return urlgen('mediagoblin.user_pages.user_home',
+                      user=self.username, **kwargs)
+
 
 class GenerateSlugMixin(object):
     """
@@ -149,7 +149,7 @@ class MediaEntryMixin(GenerateSlugMixin):
           or, if not found, None.
 
         """
-        fetch_order = self.media_manager.get("media_fetch_order")
+        fetch_order = self.media_manager.media_fetch_order
 
         # No fetching order found?  well, give up!
         if not fetch_order:
@@ -202,20 +202,31 @@ class MediaEntryMixin(GenerateSlugMixin):
             thumb_url = mg_globals.app.staticdirector(manager[u'default_thumb'])
         return thumb_url
 
+    @property
+    def original_url(self):
+        """ Returns the URL for the original image
+        will return self.thumb_url if original url doesn't exist"""
+        if u"original" not in self.media_files:
+            return self.thumb_url
+        
+        return mg_globals.app.public_store.file_url(
+            self.media_files[u"original"]
+            )
+
     @cached_property
     def media_manager(self):
         """Returns the MEDIA_MANAGER of the media's media_type
 
         Raises FileTypeNotSupported in case no such manager is enabled
         """
-        # TODO, we should be able to make this a simple lookup rather
-        # than iterating through all media managers.
-        for media_type, manager in get_media_managers():
-            if media_type == self.media_type:
-                return manager
+        manager = hook_handle(('media_manager', self.media_type))
+        if manager:
+            return manager(self)
+
         # Not found?  Then raise an error
         raise FileTypeNotSupported(
-            "MediaManager not in enabled types.  Check media_types in config?")
+            "MediaManager not in enabled types. Check media_type plugins are"
+            " enabled in config?")
 
     def get_fail_exception(self):
         """
@@ -229,15 +240,60 @@ class MediaEntryMixin(GenerateSlugMixin):
         return licenses.get_license_by_url(self.license or "")
 
     def exif_display_iter(self):
-        from mediagoblin.tools.exif import USEFUL_TAGS
+        if not self.media_data:
+            return
+        exif_all = self.media_data.get("exif_all")
+
+        for key in exif_all:
+            label = re.sub('(.)([A-Z][a-z]+)', r'\1 \2', key)
+            yield label.replace('EXIF', '').replace('Image', ''), exif_all[key]
 
+    def exif_display_data_short(self):
+        """Display a very short practical version of exif info"""
         if not self.media_data:
             return
+
         exif_all = self.media_data.get("exif_all")
 
-        for key in USEFUL_TAGS:
-            if key in exif_all:
-                yield key, exif_all[key]
+        exif_short = {}
+
+        if 'Image DateTimeOriginal' in exif_all:
+            # format date taken
+            takendate = datetime.strptime(
+                exif_all['Image DateTimeOriginal']['printable'],
+                '%Y:%m:%d %H:%M:%S').date()
+            taken = takendate.strftime('%B %d %Y')
+
+            exif_short.update({'Date Taken': taken})
+
+        aperture = None
+        if 'EXIF FNumber' in exif_all:
+            fnum = str(exif_all['EXIF FNumber']['printable']).split('/')
+
+            # calculate aperture
+            if len(fnum) == 2:
+                aperture = "f/%.1f" % (float(fnum[0])/float(fnum[1]))
+            elif fnum[0] != 'None':
+                aperture = "f/%s" % (fnum[0])
+
+        if aperture:
+            exif_short.update({'Aperture': aperture})
+
+        short_keys = [
+            ('Camera', 'Image Model', None),
+            ('Exposure', 'EXIF ExposureTime', lambda x: '%s sec' % x),
+            ('ISO Speed', 'EXIF ISOSpeedRatings', None),
+            ('Focal Length', 'EXIF FocalLength', lambda x: '%s mm' % x)]
+
+        for label, key, fmt_func in short_keys:
+            try:
+                val = fmt_func(exif_all[key]['printable']) if fmt_func \
+                        else exif_all[key]['printable']
+                exif_short.update({label: val})
+            except KeyError:
+                pass
+
+        return exif_short
 
 
 class MediaCommentMixin(object):
@@ -249,6 +305,20 @@ class MediaCommentMixin(object):
         """
         return cleaned_markdown_conversion(self.content)
 
+    def __unicode__(self):
+        return u'<{klass} #{id} {author} "{comment}">'.format(
+            klass=self.__class__.__name__,
+            id=self.id,
+            author=self.get_author,
+            comment=self.content)
+
+    def __repr__(self):
+        return '<{klass} #{id} {author} "{comment}">'.format(
+            klass=self.__class__.__name__,
+            id=self.id,
+            author=self.get_author,
+            comment=self.content)
+
 
 class CollectionMixin(GenerateSlugMixin):
     def check_slug_used(self, slug):