Welcome, guest | Sign In | My Account | Store | Cart

Notice! PyPM is being replaced with the ActiveState Platform, which enhances PyPM’s build and deploy capabilities. Create your free Platform account to download ActivePython or customize Python with the packages you require and get automatic updates.

Download
ActivePython
INSTALL>
pypm install django-cuddlybuddly-thumbnail

How to install django-cuddlybuddly-thumbnail

  1. Download and install ActivePython
  2. Open Command Prompt
  3. Type pypm install django-cuddlybuddly-thumbnail
 Python 2.7Python 3.2Python 3.3
Windows (32-bit)
2.5 Available View build log
Windows (64-bit)
2.5 Available View build log
Mac OS X (10.5+)
2.5 Available View build log
Linux (32-bit)
2.5 Available View build log
Linux (64-bit)
2.5 Available View build log
 
License
BSD
Dependencies
Lastest release
version 2.5 on Dec 30th, 2011

A Django app that supplies a template tag to generate thumbnails. Specifically designed to be compatible with properly implemented Django storage systems, which unfortunately most are not. Look for django-cuddlybuddly-storage-s3 for a fully working Amazon S3 storage system.

Installation

  1. Add cuddlybuddly.thumbnail to your INSTALLED_APPS.

  2. If using a remote storage system, set CUDDLYBUDDLY_THUMBNAIL_CACHE to a location on the local disk to store a local cache of hashes to increase access times.

  3. If using a remote storage system and have setup the local cache, add the following to your URLconf to automatically attach signals to all models with a file field that may need to be cached:

    from cuddlybuddly import thumbnail
    thumbnail.autodiscover()
    
  4. Add {% load thumbnail_tags %} to the templates where you wish to use the template tag.

Settings

CUDDLYBUDDLY_THUMBNAIL_CACHE

An optional location on your local disk to store a cache to increase performance when using remote storage systems. Do not use this if your remote storage system has its own cache as this feature is basically just a mass of signals that could go wrong. For example, django-cuddlybuddly-storage-s3 has its own proper cache at the storage level.

CUDDLYBUDDLY_THUMBNAIL_BASEDIR

Save thumbnail images to a directory directly off MEDIA_ROOT, still keeping the relative directory structure of the source image.

CUDDLYBUDDLY_THUMBNAIL_BASEDIR = '_thumbs'

Results in:

MEDIA_ROOT + '_thumbs/photos/1_jpg_150x150_q85.jpg'
CUDDLYBUDDLY_THUMBNAIL_SUBDIR

Save thumbnail images to a sub-directory relative to the source image.

CUDDLYBUDDLY_THUMBNAIL_SUBDIR = '_thumbs'

Results in:

MEDIA_ROOT + 'photos/_thumbs/1_jpg_150x150_q85.jpg'
CUDDLYBUDDLY_THUMBNAIL_SKIP_TESTS

Optional and defaults to false. Set to a true value to skip the tests as they can be pretty slow when using a remote storage backend.

Template Tag

thumbnail

Creates a thumbnail and returns its relative path without the MEDIA_URL attached.

Usage:

{% thumbnail source width height %}
{% thumbnail source width height as var %}
{% thumbnail source width height destination %}
{% thumbnail source width height destination as var %}
{% thumbnail source width height destination processor %}
{% thumbnail source width height destination processor as var %}

Or by using keyword arguments. Notice how extra options can be specified for the processor by using keyword arguments at the end:

{% thumbnail source width height dest='/media/test.jpg' proc='crop' upscale=1 quality=50 %}
{% thumbnail source width height=height proc='crop' quality=50 as var %}

Usually it will just be something like:

<img src="{{ MEDIA_URL }}{% thumbnail source width height %}" alt="" />

source and destination can be paths as strings or file like objects. width and height must be integers. processor is the string name of the image processor you want to use. destination by default is calculated using your directory settings and the properties of the thumbnail itself. If an unknown or no processor is specified then the default will be used.

Image Processors

Rather than endlessly adding requested features this app uses easily pluggable image processors to generate thumbnails (doesn't have to be thumbnails).

ResizeProcessor

This processor merely resizes the image so that the smallest side matches the requested dimensions, e.g. a 150x100 image resized to 50x50 will end up as 75x50. By default this is registered as resize and is the default processor. It has two options; quality which defualts to 85 and upscale which defaults to False. If upscale is set to True then images smaller than the requested dimensions will be upscaled, e.g. a 25x25 image resized to 50x50 will come out as 50x50 instead of being left alone.

CropToFitProcessor

This processor is the same as ResizeProcessor except that it will crop the image if necessary to match the requested dimensions, e.g. a 150x100 image resized to 50x50 will end up as 50x50 with the left and right cropped off. By default it is registered as crop and has the same options as ResizeProcessor.

Custom Image Processors

To create image processors you just need to extend cuddlybuddly.thumbnail.processors.BaseProcessor, implement generate_filename and generate_thumbnail and then register the processor in your project's urls.py.

The following is a very simple example of creating a processor that merely changes the default quality of ResizeProcessor. Put this in a project's urls.py:

from cuddlybuddly import thumbnail
from cuddlybuddly.thumbnail.processors import ResizeProcessor

class MyProcessor(ResizeProcessor):
    quality = 50

thumbnail.register_processor('myprocessor', MyProcessor)

Now you can use your processor with the template tag:

{% thumbnail source width height proc='myprocessor' %}

Or we could have registered it as the new default processor by instead having the following in urls.py:

thumbnail.register_processor('myprocessor', MyProcessor, default=True)

Now we can use it with the template tag without having to specify a processor:

{% thumbnail source width height %}
Processor Options

Any unused arguments from the thumbnail template tag are passed along to image processors and so you can use them to specify extra options. Take the following example:

class MyProcessor(BaseProcessor):
    my_option = 50

    def generate_thumbnail(self, image, width, height):
        print self.my_option

Now my_option will default to 50 but we can set it to something else from the template tag:

{% thumbnail source width height my_option=75 %}

Subscribe to package updates

Last updated Dec 30th, 2011

Download Stats

Last month:1

What does the lock icon mean?

Builds marked with a lock icon are only available via PyPM to users with a current ActivePython Business Edition subscription.

Need custom builds or support?

ActivePython Enterprise Edition guarantees priority access to technical support, indemnification, expert consulting and quality-assured language builds.

Plan on re-distributing ActivePython?

Get re-distribution rights and eliminate legal risks with ActivePython OEM Edition.