2
Details about AutoOneToOneField:
3
http://softwaremaniacs.org/blog/2007/03/07/auto-one-to-one-field/
1
6
from StringIO import StringIO
9
from django.db.models import OneToOneField
10
from django.db.models.fields.related import SingleRelatedObjectDescriptor
2
11
from django.db import models
4
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
7
37
class ExtendedImageField(models.ImageField):
8
"""Extended ImageField that can resize image before saving it."""
39
Extended ImageField that can resize image before saving it.
10
41
def __init__(self, *args, **kwargs):
11
42
self.width = kwargs.pop('width', None)
12
43
self.height = kwargs.pop('height', None)
13
44
super(ExtendedImageField, self).__init__(*args, **kwargs)
15
47
def save_form_data(self, instance, data):
16
48
if data is not None and data != self.default:
18
50
data = self.default
19
51
if instance.avatar != self.default:
20
instance.avatar.delete()
52
instance.avatar.delete()
22
54
if hasattr(data, 'read') and self.width and self.height:
23
content = self.resize_image(
24
data.read(), width=self.width, height=self.height)
25
data = SimpleUploadedFile(
26
instance.user.username + '.png', content, 'image/png')
55
content = self.resize_image(data.read(), width=self.width, height=self.height)
56
data = SimpleUploadedFile(instance.user.username + ".png", content, "image/png")
27
57
super(ExtendedImageField, self).save_form_data(instance, data)
29
60
def resize_image(self, rawdata, width, height):
30
"""Resize image to fit it into (width, height) box."""
62
Resize image to fit it into (width, height) box.
31
64
from PIL import Image
33
66
image = Image.open(StringIO(rawdata))