Simplify/Robustify the thumbnail URL usage in templates
[mediagoblin.git] / mediagoblin / db / mixin.py
index a5aded02f4cf8ee50e48a0b4c11acf3ae423c9c7..22375b7f07ee43f9388624567fbdca7e2e454fbf 100644 (file)
@@ -27,6 +27,8 @@ These functions now live here and get "mixed in" into the
 real objects.
 """
 
+import importlib
+
 from mediagoblin import mg_globals
 from mediagoblin.auth import lib as auth_lib
 from mediagoblin.tools import common, licenses
@@ -60,7 +62,7 @@ class MediaEntryMixin(object):
 
         if duplicate:
             if self.id is not None:
-                self.slug = "%s-%s" % (self.id, self.slug)
+                self.slug = u"%s-%s" % (self.id, self.slug)
             else:
                 self.slug = None
 
@@ -112,12 +114,29 @@ class MediaEntryMixin(object):
             media=self.slug_or_id,
             **extra_args)
 
+    @property
+    def thumb_url(self):
+        """Return the thumbnail URL (for usage in templates)
+        Will return either the real thumbnail or a default fallback icon."""
+        # TODO: implement generic fallback in case MEDIA_MANAGER does
+        # not specify one?
+        if u'thumb' in self.media_files:
+            thumb_url = mg_globals.app.public_store.file_url(
+                            self.media_files[u'thumb'])
+        else:
+            # no thumbnail in media available. Get the media's
+            # MEDIA_MANAGER for the fallback icon and return static URL
+            manager = importlib.import_module(self.media_type)
+            thumb_url = manager.MEDIA_MANAGER[u'default_thumb']
+            thumb_url = mg_globals.app.staticdirector(thumb_url) # use static
+        return thumb_url
+
     def get_fail_exception(self):
         """
         Get the exception that's appropriate for this error
         """
-        if self['fail_error']:
-            return common.import_component(self['fail_error'])
+        if self.fail_error:
+            return common.import_component(self.fail_error)
 
     def get_license_data(self):
         """Return license dict for requested license"""
@@ -143,3 +162,57 @@ class MediaCommentMixin(object):
         Run through Markdown and the HTML cleaner.
         """
         return cleaned_markdown_conversion(self.content)
+
+
+class CollectionMixin(object):
+    def generate_slug(self):
+        # import this here due to a cyclic import issue
+        # (db.models -> db.mixin -> db.util -> db.models)
+        from mediagoblin.db.util import check_collection_slug_used
+
+        self.slug = slugify(self.title)
+
+        duplicate = check_collection_slug_used(mg_globals.database,
+            self.creator, self.slug, self.id)
+
+        if duplicate:
+            if self.id is not None:
+                self.slug = u"%s-%s" % (self.id, self.slug)
+            else:
+                self.slug = None
+
+    @property
+    def description_html(self):
+        """
+        Rendered version of the description, run through
+        Markdown and cleaned with our cleaning tool.
+        """
+        return cleaned_markdown_conversion(self.description)
+
+    @property
+    def slug_or_id(self):
+        return (self.slug or self._id)
+
+    def url_for_self(self, urlgen, **extra_args):
+        """
+        Generate an appropriate url for ourselves
+
+        Use a slug if we have one, else use our '_id'.
+        """
+        creator = self.get_creator
+
+        return urlgen(
+            'mediagoblin.user_pages.user_collection',
+            user=creator.username,
+            collection=self.slug_or_id,
+            **extra_args)
+
+
+class CollectionItemMixin(object):
+    @property
+    def note_html(self):
+        """
+        the actual html-rendered version of the note displayed.
+        Run through Markdown and the HTML cleaner.
+        """
+        return cleaned_markdown_conversion(self.note)