2
Details about AutoOneToOneField:
3
http://softwaremaniacs.org/blog/2007/03/07/auto-one-to-one-field/
6
from StringIO import StringIO
9
from django.db.models import OneToOneField
10
from django.db.models.fields.related import SingleRelatedObjectDescriptor
11
from django.db import models
12
from django.core.files.uploadedfile import SimpleUploadedFile
15
class AutoSingleRelatedObjectDescriptor(SingleRelatedObjectDescriptor):
16
def __get__(self, instance, instance_type=None):
18
return super(AutoSingleRelatedObjectDescriptor, self).__get__(instance, instance_type)
19
except self.related.model.DoesNotExist:
20
obj = self.related.model(**{self.related.field.name: instance})
25
class AutoOneToOneField(OneToOneField):
27
OneToOneField creates dependent object on first request from parent object
28
if dependent oject has not created yet.
31
def contribute_to_related_class(self, cls, related):
32
setattr(cls, related.get_accessor_name(), AutoSingleRelatedObjectDescriptor(related))
33
#if not cls._meta.one_to_one_field:
34
#cls._meta.one_to_one_field = self
37
class ExtendedImageField(models.ImageField):
39
Extended ImageField that can resize image before saving it.
41
def __init__(self, *args, **kwargs):
42
self.width = kwargs.pop('width', None)
43
self.height = kwargs.pop('height', None)
44
super(ExtendedImageField, self).__init__(*args, **kwargs)
47
def save_form_data(self, instance, data):
48
if data and self.width and self.height:
50
instance.avatar.delete()
52
content = self.resize_image(data.read(), width=self.width, height=self.height)
53
data = SimpleUploadedFile(instance.user.username + ".png", content, data.content_type)
54
super(ExtendedImageField, self).save_form_data(instance, data)
57
def resize_image(self, rawdata, width, height):
59
Resize image to fit it into (width, height) box.
67
image = Image.open(StringIO(rawdata))
69
oldw, oldh = image.size
71
if oldw > width or oldh > height:
73
x = int(round((oldw - oldh) / 2.0))
74
image = image.crop((x, 0, (x + oldh) - 1, oldh - 1))
76
y = int(round((oldh - oldw) / 2.0))
77
image = image.crop((0, y, oldw - 1, (y + oldw) - 1))
78
image = image.resize((width, height), resample=Image.ANTIALIAS)
79
except Exception, err:
84
image.save(string, format='PNG')
85
return string.getvalue()