Removing the dependency of django-thumbs.

This commit is contained in:
Isaac Bythewood
2012-07-25 01:50:28 +00:00
parent 8389462c80
commit a178144da4
12 changed files with 83 additions and 229 deletions

View File

@@ -20,8 +20,8 @@ class PinResource(ModelResource): # pylint: disable-msg=R0904
} }
def dehydrate_thumbnail(self, bundle): def dehydrate_thumbnail(self, bundle):
pin = Pin.objects.only('image').get(pk=bundle.data['id']) pin = Pin.objects.only('thumbnail').get(pk=bundle.data['id'])
return pin.image.url_200x1000 return pin.thumbnail.url
class UserResource(ModelResource): class UserResource(ModelResource):

View File

View File

@@ -61,4 +61,4 @@ class PinForm(forms.ModelForm):
class Meta: class Meta:
model = Pin model = Pin
exclude = ['submitter'] exclude = ['submitter', 'thumbnail']

View File

@@ -11,52 +11,65 @@ class Migration(SchemaMigration):
# Adding model 'Pin' # Adding model 'Pin'
db.create_table('pins_pin', ( db.create_table('pins_pin', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('url', self.gf('django.db.models.fields.TextField')()), ('submitter', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('title', self.gf('django.db.models.fields.CharField')(max_length=70)), ('url', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('image', self.gf('thumbs.ImageWithThumbsField')(max_length=100, sizes=((200, 1000),))), ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100)),
('thumbnail', self.gf('django.db.models.fields.files.ImageField')(max_length=100)),
('published', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
)) ))
db.send_create_signal('pins', ['Pin']) db.send_create_signal('pins', ['Pin'])
# Adding M2M table for field tags on 'Pin'
db.create_table('pins_pin_tags', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('pin', models.ForeignKey(orm['pins.pin'], null=False)),
('tag', models.ForeignKey(orm['pins.tag'], null=False))
))
db.create_unique('pins_pin_tags', ['pin_id', 'tag_id'])
# Adding model 'Tag'
db.create_table('pins_tag', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=70)),
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50)),
))
db.send_create_signal('pins', ['Tag'])
def backwards(self, orm): def backwards(self, orm):
# Deleting model 'Pin' # Deleting model 'Pin'
db.delete_table('pins_pin') db.delete_table('pins_pin')
# Removing M2M table for field tags on 'Pin'
db.delete_table('pins_pin_tags')
# Deleting model 'Tag'
db.delete_table('pins_tag')
models = { models = {
'pins.pin': { 'auth.group': {
'Meta': {'object_name': 'Pin'}, 'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('thumbs.ImageWithThumbsField', [], {'max_length': '100', 'sizes': '((200, 1000),)'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['pins.Tag']", 'symmetrical': 'False'}), 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
'title': ('django.db.models.fields.CharField', [], {'max_length': '70'}),
'url': ('django.db.models.fields.TextField', [], {})
}, },
'pins.tag': { 'auth.permission': {
'Meta': {'object_name': 'Tag'}, 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '70'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}) },
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'pins.pin': {
'Meta': {'ordering': "['-id']", 'object_name': 'Pin'},
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
'published': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'submitter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
'thumbnail': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
'url': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
} }
} }

View File

@@ -1,58 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Deleting model 'Tag'
db.delete_table('pins_tag')
# Deleting field 'Pin.title'
db.delete_column('pins_pin', 'title')
# Adding field 'Pin.description'
db.add_column('pins_pin', 'description',
self.gf('django.db.models.fields.TextField')(null=True, blank=True),
keep_default=False)
# Removing M2M table for field tags on 'Pin'
db.delete_table('pins_pin_tags')
def backwards(self, orm):
# Adding model 'Tag'
db.create_table('pins_tag', (
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50)),
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=70)),
))
db.send_create_signal('pins', ['Tag'])
# User chose to not deal with backwards NULL issues for 'Pin.title'
raise RuntimeError("Cannot reverse this migration. 'Pin.title' and its values cannot be restored.")
# Deleting field 'Pin.description'
db.delete_column('pins_pin', 'description')
# Adding M2M table for field tags on 'Pin'
db.create_table('pins_pin_tags', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('pin', models.ForeignKey(orm['pins.pin'], null=False)),
('tag', models.ForeignKey(orm['pins.tag'], null=False))
))
db.create_unique('pins_pin_tags', ['pin_id', 'tag_id'])
models = {
'pins.pin': {
'Meta': {'object_name': 'Pin'},
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('thumbs.ImageWithThumbsField', [], {'max_length': '100', 'sizes': '((200, 1000),)'}),
'url': ('django.db.models.fields.TextField', [], {})
}
}
complete_apps = ['pins']

View File

@@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Changing field 'Pin.url'
db.alter_column('pins_pin', 'url', self.gf('django.db.models.fields.TextField')(null=True))
def backwards(self, orm):
# User chose to not deal with backwards NULL issues for 'Pin.url'
raise RuntimeError("Cannot reverse this migration. 'Pin.url' and its values cannot be restored.")
models = {
'pins.pin': {
'Meta': {'ordering': "['-id']", 'object_name': 'Pin'},
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('thumbs.ImageWithThumbsField', [], {'max_length': '100', 'sizes': '((200, 1000),)'}),
'url': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
}
}
complete_apps = ['pins']

View File

@@ -1,31 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'Pin.published'
db.add_column('pins_pin', 'published',
self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2012, 7, 12, 0, 0), blank=True),
keep_default=False)
def backwards(self, orm):
# Deleting field 'Pin.published'
db.delete_column('pins_pin', 'published')
models = {
'pins.pin': {
'Meta': {'ordering': "['-id']", 'object_name': 'Pin'},
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('thumbs.ImageWithThumbsField', [], {'max_length': '100', 'sizes': '((200, 1000),)'}),
'published': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'url': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
}
}
complete_apps = ['pins']

View File

@@ -1,68 +0,0 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'Pin.submitter'
db.add_column('pins_pin', 'submitter',
self.gf('django.db.models.fields.related.ForeignKey')(default=1, to=orm['auth.User']),
keep_default=False)
def backwards(self, orm):
# Deleting field 'Pin.submitter'
db.delete_column('pins_pin', 'submitter_id')
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'pins.pin': {
'Meta': {'ordering': "['-id']", 'object_name': 'Pin'},
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('thumbs.ImageWithThumbsField', [], {'max_length': '100', 'sizes': '((200, 1000),)'}),
'published': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'submitter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
'url': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
}
}
complete_apps = ['pins']

View File

@@ -3,29 +3,54 @@ from django.core.files import File
from django.core.files.temp import NamedTemporaryFile from django.core.files.temp import NamedTemporaryFile
from django.contrib.auth.models import User from django.contrib.auth.models import User
from thumbs import ImageWithThumbsField
import urllib2 import urllib2
import hashlib
from PIL import Image
class Pin(models.Model): class Pin(models.Model):
submitter = models.ForeignKey(User) submitter = models.ForeignKey(User)
url = models.TextField(blank=True, null=True) url = models.TextField(blank=True, null=True)
description = models.TextField(blank=True, null=True) description = models.TextField(blank=True, null=True)
image = ImageWithThumbsField(upload_to='pins/pin', sizes=((200, 1000),)) image = models.ImageField(upload_to='pins/pin/originals/')
thumbnail = models.ImageField(upload_to='pins/pin/thumbnails/')
published = models.DateTimeField(auto_now_add=True) published = models.DateTimeField(auto_now_add=True)
def __unicode__(self): def __unicode__(self):
return self.url return self.url
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.image: if not self.image:
temp_img = NamedTemporaryFile() temp_img = NamedTemporaryFile()
temp_img.write(urllib2.urlopen(self.url).read()) temp_img.write(urllib2.urlopen(self.url).read())
temp_img.flush() temp_img.flush()
# pylint: disable-msg=E1101
self.image.save(self.url.split('/')[-1], File(temp_img)) self.image.save(self.url.split('/')[-1], File(temp_img))
else:
super(Pin, self).save()
if not self.thumbnail:
if not self.image:
image = Image.open(temp_img.name)
else:
image = Image.open(self.image.path)
size = image.size
prop = 200 / image.size[0]
size = (prop*image.size[0], prop*image.size[1])
image.resize(size, Image.ANTIALIAS)
temp_thumb = NamedTemporaryFile()
image.save(temp_thumb.name, 'JPEG')
if self.url:
name = self.url.split('/')[-1]
else:
name = self.image.name
self.thumbnail.save(name, File(temp_thumb))
super(Pin, self).save(*args, **kwargs) super(Pin, self).save(*args, **kwargs)
class Meta: class Meta:
ordering = ['-id'] ordering = ['-id']

View File

@@ -10,7 +10,9 @@
<div class="row"> <div class="row">
<div class="span6 offset3" id="form"> <div class="span6 offset3" id="form">
<h1>New Pin</h1> <h1>New Pin</h1>
{{ form.non_field_errors }}
<form enctype="multipart/form-data" action="{% url pins:new-pin %}" method="post" class="form-horizontal"> <form enctype="multipart/form-data" action="{% url pins:new-pin %}" method="post" class="form-horizontal">
{% csrf_token %}
{% for field in form %} {% for field in form %}
{% bootstrap_field field %} {% bootstrap_field field %}
{% endfor %} {% endfor %}

View File

@@ -4,7 +4,7 @@
<div class="modal-header"> <div class="modal-header">
<h3>New Pin</h3> <h3>New Pin</h3>
</div> </div>
<form action="{% url pins:new-pin %}" method="post" class="form-horizontal"> <form enctype="multipart/form-data" action="{% url pins:new-pin %}" method="post" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
<div class="modal-body"> <div class="modal-body">
{% csrf_token %} {% csrf_token %}

View File

@@ -2,5 +2,4 @@ Django==1.4
South==0.7.4 South==0.7.4
Pillow==1.7.7 Pillow==1.7.7
django-tastypie==0.9.11 django-tastypie==0.9.11
git+git://github.com/vannoppen/django-thumbs.git@v1.0.0#egg=django-thumbs