changeset 140:e48318d2ff8a

Thumbnails now look better, although the internal architecture used to generate them on-the-fly is a bit questionable.
author Atul Varma <varmaa@toolness.com>
date Thu, 03 Apr 2008 23:51:30 -0700
parents be98236e2b34
children eb0a2b924b89
files .hgignore personasbackend/personas/models.py personasbackend/personas/templates/personas/list.html personasbackend/personas/urls.py personasbackend/personas/views.py
diffstat 5 files changed, 74 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Thu Apr 03 22:25:58 2008 -0700
+++ b/.hgignore	Thu Apr 03 23:51:30 2008 -0700
@@ -5,3 +5,4 @@
 *~
 media/hosted-content/footers/*
 media/hosted-content/headers/*
+media/thumbnails/*
--- a/personasbackend/personas/models.py	Thu Apr 03 22:25:58 2008 -0700
+++ b/personasbackend/personas/models.py	Thu Apr 03 23:51:30 2008 -0700
@@ -49,6 +49,7 @@
       published and accessible by clients.
 """
 
+import os
 import datetime
 
 from django.db import models
@@ -66,6 +67,8 @@
 
 NO_THUMBNAIL_IMAGE = "https://addons.mozilla.org/img/addon-icn.png"
 
+THUMBNAIL_DIR = "thumbnails"
+
 def generate_thumbnail( header_file, footer_file ):
     """
     Given a header and footer file--which can be either file-like
@@ -291,19 +294,67 @@
 
     resolved_url = property(__get_resolved_url)
 
-    def __get_thumbnail_url( self ):
-        if not self.url:
-            return self.get_absolute_header_img_url()
+    def __make_thumbnail( self, thumbnail_path ):
+        import urllib2
+        from cStringIO import StringIO
+
+        print "make thumbnail"
+        success = True
+        if self.header_img and self.footer_img:
+            header_file = self.get_header_img_filename()
+            footer_file = self.get_footer_img_filename()
+        else:
+            viewinfo = parse_personas_view_url( self.url )
+            if not viewinfo:
+                success = False
+            elif viewinfo['view'] == 'legacy-cbeard-persona':
+                header_url = LEGACY_HEADER_URL % viewinfo['kwargs']
+                footer_url = LEGACY_FOOTER_URL % viewinfo['kwargs']
+                print "getting header"
+                header_contents = urllib2.urlopen( header_url ).read()
+                header_file = StringIO( header_contents )
+                print "getting footer"
+                footer_contents = urllib2.urlopen( footer_url ).read()
+                footer_file = StringIO( footer_contents )
+            else:
+                success = False
+
+        if success:
+            print "generating thumbnail"
+            img = generate_thumbnail( header_file, footer_file )
+            print "Saving %s" % thumbnail_path
+            img.save( thumbnail_path, quality=95 )
 
-        viewinfo = parse_personas_view_url( self.url )
-        image = NO_THUMBNAIL_IMAGE
-        if not viewinfo:
-            # TODO: Fix this.
-            pass
-        elif viewinfo['view'] == 'legacy-cbeard-persona':
-            image = LEGACY_HEADER_URL % viewinfo['kwargs']
+        return success
+
+    def create_thumbnail_and_get_url( self ):
+        from distutils.dir_util import mkpath
+
+        from django.conf import settings
 
-        return image
+        print "get"
+        thumbnail_dir = os.path.join( settings.MEDIA_ROOT,
+                                      THUMBNAIL_DIR )
+        if not os.path.exists( thumbnail_dir ):
+            mkpath( thumbnail_dir )
+        thumbnail_filename = "%d.jpg" % self.id
+        thumbnail_path = os.path.join( thumbnail_dir,
+                                       thumbnail_filename )
+        print thumbnail_path
+        if ( (not os.path.exists( thumbnail_path ))
+             and (not self.__make_thumbnail( thumbnail_path )) ):
+            return NO_THUMBNAIL_IMAGE
+        else:
+            return make_absolute_url(
+                "%s%s/%s" % (settings.MEDIA_URL, THUMBNAIL_DIR,
+                             thumbnail_filename)
+                )
+
+    def __get_thumbnail_url( self ):
+        return reverse(
+            'persona-thumbnail',
+            kwargs = {'persona_id' : str(self.id)}
+            )
 
     thumbnail_url = property( __get_thumbnail_url )
 
--- a/personasbackend/personas/templates/personas/list.html	Thu Apr 03 22:25:58 2008 -0700
+++ b/personasbackend/personas/templates/personas/list.html	Thu Apr 03 23:51:30 2008 -0700
@@ -41,7 +41,7 @@
     <img persona="{{ persona.json_id }}"
          category="{{ persona.category.json_id }}"
          src="{{ persona.thumbnail_url }}" class="preview-image"
-         width="300" height="20" alt="" />
+         alt="" />
   </div>
   <div class="persona-title">
     <h2 class="persona-name">{{ persona.name }}</h2>
--- a/personasbackend/personas/urls.py	Thu Apr 03 22:25:58 2008 -0700
+++ b/personasbackend/personas/urls.py	Thu Apr 03 23:51:30 2008 -0700
@@ -20,6 +20,11 @@
         'personasbackend.personas.views.hosted_static_persona',
         name='hosted-static-persona'),
 
+    # Thumbnail images
+    url(r'^(?P<persona_id>\d+)/thumbnail/$',
+        'personasbackend.personas.views.thumbnail',
+        name='persona-thumbnail'),
+
     # Auth
     url(r'^login/$', 'django.contrib.auth.views.login',
         {'template_name':'personas/login.html'},
--- a/personasbackend/personas/views.py	Thu Apr 03 22:25:58 2008 -0700
+++ b/personasbackend/personas/views.py	Thu Apr 03 23:51:30 2008 -0700
@@ -54,6 +54,11 @@
 
     return _render_static_persona( img_src, action )
 
+def thumbnail( request, persona_id ):
+    persona = get_object_or_404( models.Persona, id=persona_id )
+
+    return HttpResponseRedirect( persona.create_thumbnail_and_get_url() )
+
 def list_view( request ):
     personas = models.Persona.objects.filter( status="published" )
     return render_to_response(