diff --git a/.travis.yml b/.travis.yml index ca28e7c..d8c58ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,20 @@ language: python python: + - "2.6" - "2.7" - "3.3" - "3.4" env: + - DB=sqlite3 REQUIREMENTS=test_project/requirements-1.6.txt + - DB=mysql REQUIREMENTS=test_project/requirements-1.6.txt - DB=sqlite3 REQUIREMENTS=test_project/requirements-1.7.txt - DB=mysql REQUIREMENTS=test_project/requirements-1.7.txt matrix: exclude: + - python: "3.3" + env: DB=mysql REQUIREMENTS=test_project/requirements-1.6.txt + - python: "3.4" + env: DB=mysql REQUIREMENTS=test_project/requirements-1.6.txt - python: "3.3" env: DB=mysql REQUIREMENTS=test_project/requirements-1.7.txt - python: "3.4" diff --git a/daguerre/management/commands/daguerre.py b/daguerre/management/commands/daguerre.py index fcb622e..22efe4d 100644 --- a/daguerre/management/commands/daguerre.py +++ b/daguerre/management/commands/daguerre.py @@ -1,7 +1,11 @@ import os import sys -from django.apps import apps +try: + from django.apps import apps +except ImportError: + apps = None + from django.core.management import find_management_module from django.core.management import load_command_class from django.core.management.base import BaseCommand from django.utils.encoding import smart_str @@ -14,8 +18,13 @@ class Command(BaseCommand): def _find_commands(self): - command_dir = os.path.join(apps.get_app_config('daguerre').path, - 'management', 'commands') + if apps: + parts = (apps.get_app_config('daguerre').path, + 'management', 'commands') + else: + parts = (find_management_module('daguerre'), + 'commands') + command_dir = os.path.join(*parts) try: return dict((f[10:-3], f[:-3]) for f in os.listdir(command_dir) if f.startswith('_daguerre_') and f.endswith('.py')) diff --git a/daguerre/south_migrations/0001_initial.py b/daguerre/south_migrations/0001_initial.py new file mode 100644 index 0000000..c6ffc56 --- /dev/null +++ b/daguerre/south_migrations/0001_initial.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Area' + db.create_table(u'daguerre_area', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('storage_path', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('x1', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('y1', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('x2', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('y2', self.gf('django.db.models.fields.PositiveIntegerField')()), + ('name', self.gf('django.db.models.fields.CharField')(max_length=20, blank=True)), + ('priority', self.gf('django.db.models.fields.PositiveIntegerField')(default=3)), + )) + db.send_create_signal(u'daguerre', ['Area']) + + # Adding model 'AdjustedImage' + db.create_table(u'daguerre_adjustedimage', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('storage_path', self.gf('django.db.models.fields.CharField')(max_length=200)), + ('adjusted', self.gf('django.db.models.fields.files.ImageField')(max_length=45)), + ('requested', self.gf('django.db.models.fields.CharField')(max_length=100)), + )) + db.send_create_signal(u'daguerre', ['AdjustedImage']) + + + def backwards(self, orm): + # Deleting model 'Area' + db.delete_table(u'daguerre_area') + + # Deleting model 'AdjustedImage' + db.delete_table(u'daguerre_adjustedimage') + + + models = { + u'daguerre.adjustedimage': { + 'Meta': {'object_name': 'AdjustedImage'}, + 'adjusted': ('django.db.models.fields.files.ImageField', [], {'max_length': '45'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'requested': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'storage_path': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'daguerre.area': { + 'Meta': {'ordering': "('priority',)", 'object_name': 'Area'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}), + 'priority': ('django.db.models.fields.PositiveIntegerField', [], {'default': '3'}), + 'storage_path': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'x1': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'x2': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'y1': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'y2': ('django.db.models.fields.PositiveIntegerField', [], {}) + } + } + + complete_apps = ['daguerre'] \ No newline at end of file diff --git a/daguerre/south_migrations/__init__.py b/daguerre/south_migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/daguerre/utils.py b/daguerre/utils.py index 8e31017..10021b1 100644 --- a/daguerre/utils.py +++ b/daguerre/utils.py @@ -30,7 +30,7 @@ #: Which Exif orientation tags correspond to a 90deg or 270deg rotation. ROTATION_TAGS = (5, 6, 7, 8) #: Map human-readable Exif tag names to their markers. -EXIF_TAGS = {y:x for x,y in ExifTags.TAGS.items()} +EXIF_TAGS = dict((y, x) for (x, y) in six.iteritems(ExifTags.TAGS)) def make_hash(*args, **kwargs): @@ -45,11 +45,11 @@ def make_hash(*args, **kwargs): def get_exif_orientation(image): # Extract the orientation tag try: - exif_data = image._getexif() # should be careful with that _method + exif_data = image._getexif() # should be careful with that _method except AttributeError: # No Exif data, return None return None - if exif_data is not None and EXIF_TAGS['Orientation'] in exif_data: + if exif_data is not None and EXIF_TAGS['Orientation'] in exif_data: orientation = exif_data[EXIF_TAGS['Orientation']] return orientation # No Exif orientation tag, return None diff --git a/test_project/requirements-1.6.txt b/test_project/requirements-1.6.txt new file mode 100644 index 0000000..9905d53 --- /dev/null +++ b/test_project/requirements-1.6.txt @@ -0,0 +1,4 @@ +Pillow==2.3.0 +django==1.6 +mock==1.0.1 +six==1.5.2 diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index 78fdb28..39b6104 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -73,6 +73,11 @@ 'django.contrib.messages', 'django.contrib.staticfiles', 'daguerre', + #'south', ) TEST_RUNNER = 'django.test.runner.DiscoverRunner' + +SOUTH_MIGRATION_MODULES = { + 'daguerre': 'daguerre.south_migrations', +} diff --git a/tox.ini b/tox.ini index 6cf2bfc..d4222fc 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,9 @@ [tox] envlist = + py26-django16, + py27-django16, py27-django17, + py33-django16, py33-django17, py34-django17 @@ -9,6 +12,20 @@ changedir = {toxinidir}/test_project commands = {envpython} manage.py test --verbosity=2 {posargs:daguerre} +[testenv:py26-django16] +basepython=python2.6 +deps = + --no-deps + --use-mirrors + -r{toxinidir}/test_project/requirements-1.6.txt + +[testenv:py27-django16] +basepython=python2.7 +deps = + --no-deps + --use-mirrors + -r{toxinidir}/test_project/requirements-1.6.txt + [testenv:py27-django17] basepython=python2.7 deps = @@ -16,6 +33,13 @@ deps = --use-mirrors -r{toxinidir}/test_project/requirements-1.7.txt +[testenv:py33-django16] +basepython=python3.3 +deps = + --no-deps + --use-mirrors + -r{toxinidir}/test_project/requirements-1.6.txt + [testenv:py33-django17] basepython=python3.3 deps =