django-dummy-thumbnails

Dummy thumbnails for most popular Django thumbnail generators.

There are times when you have a database of a Django site and you need to quickly start it up to fix/develop, but then you realise that images are missing and you need to have images, because either your layout is broken or, in the worst case, entire site is broken (500). This library has been written for developers in order to avoid above mentioned problems in the shortest way possible, with least efforts possible.

Prerequisites

  • Django 1.8, 1.9, 1.10, 1.11, 2.0
  • Python 2.7, 3.4, 3.5, 3.6

Although django-dummy-thumbnails is not being tested against older versions of Django, tests do pass with Django versions 1.5, 1.6 and 1.7.

Installation

  1. Install in your virtual environment

    Latest stable version from PyPI:

    pip install django-dummy-thumbnails
    

    or latest stable version from GitHub:

    pip install https://github.com/barseghyanartur/django-dummy-thumbnails/archive/stable.tar.gz
    

    or latest stable version from BitBucket:

    pip install https://bitbucket.org/barseghyanartur/django-dummy-thumbnails/get/stable.tar.gz
    
  2. Add dummy_thumbnails to your INSTALLED_APPS in the global settings.py.

    INSTALLED_APPS = (
        # ...
        'dummy_thumbnails',
        # ...
    )
    
  3. Collect the statics:

    ./manage.py collectstatic --noinput
    
  4. Specify a custom path to your images directory in settings:

    DUMMY_THUMBNAILS_IMAGES_PATH = '/home/path/to/images/'
    

    This should be a directory inside your media directory of your Django project. Otherwise Django would raise a SuspiciousOperation exception. In order not to duplicate tons of files for each project, you are advised to create symlinks to the images directory in the media directory of your Django project.

    ln -s /home/path/to/images /home/repos/your-django-project/media
    

    If you prefer to use included public domain images, run the following management command:

    ./manage.py dummy_thumbnails_symlink_dummy_images
    

    And specify the following path in settings:

    DUMMY_THUMBNAILS_IMAGES_PATH = os.path.join(MEDIA_ROOT, 'mixed')
    

Usage

Common usage examples.

Replace broken images with dummy ones

That’s what it’s all about - replacing the broken images with dummy ones.

Note

You should never use this in production. All the changes mentioned above and below are supposed to be applied to development settings only.

Supported thumbnailers

Most popular image thumbnailers for Django (django-imagekit, sorl-thumbnail and easy-thumbnails) are supported. If you can’t find your favourite thumbnailer, open an issue or consider making a pull request.

django-imagekit

Integration with django-imagekit.

Modify your settings in the following way:

  1. Add imagekit, dummy_thumbnails and dummy_thumbnails.contrib.thumbnailers.django_imagekit.generatorlibrary to the INSTALLED_APPS:

    INSTALLED_APPS = [
        # ...
        'imagekit',
        'dummy_thumbnails',
        'dummy_thumbnails.contrib.thumbnailers.django_imagekit.generatorlibrary',
        # ...
    ]
    
  2. Collect the statics:

    ./manage.py collectstatic --noinput
    
  3. Specify a custom path to your images directory in settings:

    DUMMY_THUMBNAILS_IMAGES_PATH = os.path.join(MEDIA_ROOT, 'mixed')
    
  4. If you are using the included public domain images, don’t forget to create a symlink:

    ./manage.py dummy_thumbnails_symlink_dummy_images
    
  5. Now the following would work:

    {% load imagekit %}
    
    {% thumbnail '640x480' 'None1' %}
    {% thumbnail '480x640' 'None2' %}
    {% thumbnail '200x200' 'None3' %}
    
sorl-thumbnail

Integration with sorl-thumbnail.

Modify your settings in the following way:

  1. Add sorl.thumbnail and dummy_thumbnails to the INSTALLED_APPS:

    INSTALLED_APPS = [
        # ...
        'sorl.thumbnail',
        'dummy_thumbnails',
        # ...
    ]
    
  2. Set the dummy thumbnail engine as THUMBNAIL_ENGINE:

    THUMBNAIL_ENGINE = 'dummy_thumbnails.contrib.sorl_thumbnail.engines.DummyThumbnailsEngine'
    
  3. Collect the statics:

    ./manage.py collectstatic --noinput
    
  4. Specify a custom path to your images directory in settings:

    DUMMY_THUMBNAILS_IMAGES_PATH = os.path.join(MEDIA_ROOT, 'mixed')
    
  5. If you are using the included public domain images, don’t forget create a symlink:

    ./manage.py dummy_thumbnails_symlink_dummy_images
    
  6. Now the following would work:

    {% load thumbnail %}
    
    {% thumbnail 'None1' "640x480" crop="center" as im %}
        <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" />
    {% endthumbnail %}
    
    {% thumbnail 'None2' "480x640" crop="center" as im %}
        <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" />
    {% endthumbnail %}
    
    {% thumbnail 'None3' "200x200" crop="center" as im %}
        <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" />
    {% endthumbnail %}
    
easy-thumbnails

Integration with easy-thumbnails.

Modify your settings in the following way:

  1. Add easy_thumbnails and dummy_thumbnails to the INSTALLED_APPS:

    INSTALLED_APPS = [
        # ...
        'easy_thumbnails',
        'dummy_thumbnails',
        # ...
    ]
    
  2. Add dummy thumbnail generator to THUMBNAIL_SOURCE_GENERATORS:

    THUMBNAIL_SOURCE_GENERATORS = (
        'dummy_thumbnails.contrib.thumbnailers.easy_thumbnails.source_generators.dummy_thumbnail',
    )
    
  3. Collect the statics:

    ./manage.py collectstatic --noinput
    
  4. Specify a custom path to your images directory in settings:

    DUMMY_THUMBNAILS_IMAGES_PATH = os.path.join(MEDIA_ROOT, 'mixed')
    
  5. If you are using the included public domain images, don’t forget to create a symlink:

    ./manage.py dummy_thumbnails_symlink_dummy_images
    
  6. Now the following would work:

    {% load thumbnail %}
    
    <img src="{% thumbnail 'None1' 640x480 crop %}" alt="" />
    <img src="{% thumbnail 'None2' 480x640 crop %}" alt="" />
    <img src="{% thumbnail 'None3' 200x200 crop %}" alt="" />
    

Dealing with broken or invalid dummy images

Of course, it’s always better to have a good working set of dummy images. However, it might happen that for some reason one of your dummy images is broken.

The recommended approach is to use a management command dummy_thumbnails_verify_dummy_images, which has been written in order to verify the dummy images and identify possible problems. It also lets you remove broken/invalid dummy images.

To remove broken/invalid dummy images with confirmation, type:

./manage.py dummy_thumbnails_verify_dummy_images

To remove broken/invalid dummy images without confirmation, type:

./manage.py dummy_thumbnails_verify_dummy_images --noinput

To just list broken/invalid dummy images without removal, type:

./manage.py dummy_thumbnails_verify_dummy_images --list

Another way to avoid failures is to set the value of DUMMY_THUMBNAILS_VERIFY_IMAGES to True in your project settings. Beware, that this slows down the start up time of your Django project, although does not slow down further rendering of the images.

Importing images from feed

Imports images from feeds, that support enclosures.

Installation

Add dummy_thumbnails.contrib.image_importers.feed to your INSTALLED_APPS in the global settings.py.

INSTALLED_APPS = (
    # ...
    'dummy_thumbnails.contrib.image_importers.feed',
    # ...
)

Usage

To import 50 dummy images from Flickr commercialphotos feed, type:

./manage.py dummy_thumbnails_import_from_feed

You can provide a custom feed URL and the number of dummy images to import. To import 100 images from Flickr nationalgeographic group, type:

./manage.py dummy_thumbnails_import_from_feed \
    "https://api.flickr.com/services/feeds/groups_pool.gne?id=36256495@N00" \
    --limit=100

Configuration

As you have seen, syntax allows to read images from any feed (that supports enclosures). In your project, you might want to make it easy for developers, so that they don’t have to type the feed URL. Therefore a setting DUMMY_THUMBNAILS_FEED_DEFAULT_FEED_URL has been introduced. It defaults to the URL of the commercialphotos group of the Flickr.

DUMMY_THUMBNAILS_FEED_DEFAULT_FEED_URL = "https://api.flickr.com/" \
                                         "services/feeds/groups_pool.gne" \
                                         "?id=36256495@N00"

Demo

Run demo locally

In order to be able to quickly evaluate the django-dummy-thumbnails, a demo app (with a quick installer) has been created (works on Ubuntu/Debian, may work on other Linux systems as well, although not guaranteed). Follow the instructions below to have the demo running within a minute.

Grab the latest dummy_thumbnails_demo_installer.sh:

wget -O - https://raw.github.com/barseghyanartur/django-dummy-thumbnails/stable/examples/dummy_thumbnails_demo_installer.sh | bash

Open your browser and test the app.

If quick installer doesn’t work for you, see the manual steps on running the example project.

Testing

Simply type:

./runtests.py

or use tox:

tox

or use tox to check specific env:

tox -e py35

or run Django tests:

./manage.py test dummy_thumbnails --settings=settings.testing

License

GPL 2.0/LGPL 2.1

Support

For any issues contact me at the e-mail given in the Author section.

Documentation

Contents:

dummy_thumbnails package

Subpackages

dummy_thumbnails.contrib package
Subpackages
dummy_thumbnails.contrib.image_importers package
Subpackages
dummy_thumbnails.contrib.image_importers.feed package
Subpackages
dummy_thumbnails.contrib.image_importers.feed.management package
Subpackages
dummy_thumbnails.contrib.image_importers.feed.management.commands package
Submodules
dummy_thumbnails.contrib.image_importers.feed.management.commands.dummy_thumbnails_import_from_feed module
Module contents
Module contents
Submodules
dummy_thumbnails.contrib.image_importers.feed.apps module

Apps.

class dummy_thumbnails.contrib.image_importers.feed.apps.Config(app_name, app_module)[source]

Bases: django.apps.config.AppConfig

Config.

label = 'dummy_thumbnails_contrib_image_importers_feed'
name = 'dummy_thumbnails.contrib.image_importers.feed'
dummy_thumbnails.contrib.image_importers.feed.conf module

Conf module.

  • get_setting: Get app setting.
dummy_thumbnails.contrib.image_importers.feed.conf.get_setting(setting, override=None)[source]

Get setting.

Get a setting from dummy_thumbnails conf module, falling back to the default.

If override is not None, it will be used instead of the setting.

Parameters:
  • setting – String with setting name
  • override – Value to use when no setting is available. Defaults to None.
Returns:

Setting value.

dummy_thumbnails.contrib.image_importers.feed.defaults module

Defaults module.

  • DEFAULT_FEED_URL: URL of the default feed.
dummy_thumbnails.contrib.image_importers.feed.reader module
dummy_thumbnails.contrib.image_importers.feed.settings module

Settings module.

  • DEFAULT_FEED_URL: URL of the default feed.
Module contents

Feed image importer for django-dummy-thumbnails. Imports photos from feeds, that support enclosures.

  • default_app_config: Default Django app config.
Module contents
dummy_thumbnails.contrib.thumbnailers package
Subpackages
dummy_thumbnails.contrib.thumbnailers.django_imagekit package
Submodules
dummy_thumbnails.contrib.thumbnailers.django_imagekit.generatorlibrary module
Module contents
dummy_thumbnails.contrib.thumbnailers.easy_thumbnails package
Submodules
dummy_thumbnails.contrib.thumbnailers.easy_thumbnails.source_generators module
Module contents
dummy_thumbnails.contrib.thumbnailers.sorl_thumbnail package
Subpackages
dummy_thumbnails.contrib.thumbnailers.sorl_thumbnail.engines package
Submodules
dummy_thumbnails.contrib.thumbnailers.sorl_thumbnail.engines.dummy_engine module
Module contents
Module contents
Module contents
Module contents
dummy_thumbnails.management package
Subpackages
dummy_thumbnails.management.commands package
Submodules
dummy_thumbnails.management.commands.dummy_thumbnails_verify_dummy_images module
Module contents
Module contents
dummy_thumbnails.tests package
Submodules
dummy_thumbnails.tests.base module

Base tests module.

  • log_info: Method decorator, logs info about the method (name, return value).
  • LOG_INFO: Flag.
  • app_setup: Setup the app.
  • skip: Method decorator. If used, tests is skipped.
  • is_app_setup_completed: Check if app setup has been completed.
  • mark_app_setup_as_completed: Mark the app setup as completed.
dummy_thumbnails.tests.base.log_info(func)[source]

Log some useful info.

dummy_thumbnails.tests.base.skip(func)[source]

Simply skip the test.

dummy_thumbnails.tests.base.is_app_setup_completed()[source]

Check if app setup is completed.

dummy_thumbnails.tests.base.mark_app_setup_as_completed()[source]

Mark app setup as completed.

dummy_thumbnails.tests.helpers module

Base tests module.

  • setup_app: Setup the app, collect the static, mark app setup as completed.
dummy_thumbnails.tests.helpers.setup_app(collectstatic=False)[source]

Set up i18next.

dummy_thumbnails.tests.test_core module
Module contents

Submodules

dummy_thumbnails.apps module

Apps.

class dummy_thumbnails.apps.Config(app_name, app_module)[source]

Bases: django.apps.config.AppConfig

Config.

label = 'dummy_thumbnails'
name = 'dummy_thumbnails'

dummy_thumbnails.base module

dummy_thumbnails.conf module

Conf module.

  • get_setting: Get app setting.
dummy_thumbnails.conf.get_setting(setting, override=None)[source]

Get setting.

Get a setting from dummy_thumbnails conf module, falling back to the default.

If override is not None, it will be used instead of the setting.

Parameters:
  • setting – String with setting name
  • override – Value to use when no setting is available. Defaults to None.
Returns:

Setting value.

dummy_thumbnails.defaults module

Defaults module.

  • IMAGES_PATH: Path to random images.
  • VERIFY_IMAGES: If set to True, images are verified.

dummy_thumbnails.helpers module

Helpers module.

  • prepare_dirs_and_symlinks: Prepare dirs and symlinks.

Prepare dirs and symlinks.

Parameters:create_dirs (bool) – If set to True, dirs are created.

dummy_thumbnails.settings module

Settings module.

  • IMAGES_PATH: Path to random images.
  • VERIFY_IMAGES: If set to True, images are verified.

Module contents

Dummy thumbnails for most popular Django thumbnail generators.

  • default_app_config: Default Django app config.