annotate gpp/bio/forms.py @ 133:c515b7401078

Use the new common way to apply markItUp to textareas and to get the smiley and markdown help dialogs for all the remaining apps except for forums and comments.
author Brian Neal <bgneal@gmail.com>
date Fri, 27 Nov 2009 00:21:47 +0000
parents f8f4514b806a
children ab7830b067b3
rev   line source
gremmie@1 1 """
gremmie@1 2 This file contains the forms used by the bio application.
gremmie@1 3 """
gremmie@1 4 from PIL import ImageFile
gremmie@1 5 from PIL import Image
gremmie@1 6
gremmie@1 7 try:
gremmie@1 8 from cStringIO import StringIO
gremmie@1 9 except:
gremmie@1 10 from StringIO import StringIO
gremmie@1 11
gremmie@1 12 from django import forms
gremmie@1 13 from django.conf import settings
gremmie@1 14 from django.core.files.base import ContentFile
gremmie@1 15 from django.contrib.auth.models import User
gremmie@1 16
gremmie@1 17 from bio.models import UserProfile
gremmie@1 18
gremmie@1 19
gremmie@1 20 class EditUserForm(forms.ModelForm):
gremmie@1 21 """Form for editing the fields of the User model."""
gremmie@1 22 email = forms.EmailField(label='Email', required=True)
gremmie@1 23 class Meta:
gremmie@1 24 model = User
gremmie@1 25 fields = ('first_name', 'last_name', 'email')
gremmie@1 26
gremmie@1 27
gremmie@1 28 class EditUserProfileForm(forms.ModelForm):
gremmie@1 29 """Form for editing the fields of the UserProfile model."""
gremmie@1 30 location = forms.CharField(required=False, widget=forms.TextInput(attrs={'size' : 64 }))
gremmie@1 31 occupation = forms.CharField(required=False, widget=forms.TextInput(attrs={'size' : 64 }))
gremmie@1 32 interests = forms.CharField(required=False, widget=forms.TextInput(attrs={'size' : 64 }))
bgneal@70 33 time_zone = forms.CharField(required=False, widget=forms.HiddenInput())
bgneal@120 34 use_24_time = forms.BooleanField(label='Show times in 24-hour mode', required=False)
bgneal@133 35 profile_text = forms.CharField(required=False,
bgneal@133 36 widget=forms.Textarea(attrs={'class': 'markItUp'}))
bgneal@133 37 signature = forms.CharField(required=False,
bgneal@133 38 widget=forms.Textarea(attrs={'class': 'markItUp'}))
gremmie@1 39
gremmie@1 40 class Meta:
gremmie@1 41 model = UserProfile
bgneal@120 42 exclude = ('user', 'avatar', 'profile_html', 'signature_html', 'forum_post_count')
gremmie@1 43
gremmie@1 44 class Media:
gremmie@1 45 css = {
bgneal@6 46 'all': settings.GPP_THIRD_PARTY_CSS['markitup'] + \
bgneal@6 47 settings.GPP_THIRD_PARTY_CSS['jquery-ui']
gremmie@1 48 }
bgneal@12 49 js = settings.GPP_THIRD_PARTY_JS['markitup'] + \
bgneal@6 50 settings.GPP_THIRD_PARTY_JS['jquery-ui'] + \
bgneal@70 51 ('js/bio.js', 'js/timezone.js')
gremmie@1 52
gremmie@1 53
gremmie@1 54 def get_image(file):
gremmie@1 55 """
gremmie@1 56 Returns a PIL Image from the supplied file.
gremmie@1 57 Throws ValidationError if the file does not parse as an image file.
gremmie@1 58 """
gremmie@1 59 parser = ImageFile.Parser()
gremmie@1 60 for chunk in file.chunks():
gremmie@1 61 parser.feed(chunk)
gremmie@1 62 try:
gremmie@1 63 image = parser.close()
gremmie@1 64 return image
gremmie@1 65 except IOError:
gremmie@1 66 pass
gremmie@1 67 raise forms.ValidationError("Upload a valid image. " +
gremmie@1 68 "The file you uploaded was either not an image or a corrupted image.")
gremmie@1 69
gremmie@1 70
gremmie@1 71 def scale_image(image, size):
gremmie@1 72 """Scales an image file if necessary."""
gremmie@1 73
gremmie@1 74 # don't upscale
gremmie@1 75 if (size, size) >= image.size:
gremmie@1 76 return image
gremmie@1 77
gremmie@1 78 (w, h) = image.size
gremmie@1 79 if w > h:
gremmie@1 80 diff = (w - h) / 2
gremmie@1 81 image = image.crop((diff, 0, w - diff, h))
gremmie@1 82 elif h > w:
gremmie@1 83 diff = (h - w) / 2
gremmie@1 84 image = image.crop((0, diff, w, h - diff))
gremmie@1 85 image = image.resize((size, size), Image.ANTIALIAS)
gremmie@1 86 return image
gremmie@1 87
gremmie@1 88
gremmie@1 89 class UploadAvatarForm(forms.Form):
gremmie@1 90 """Form used to change a user's avatar"""
gremmie@1 91 avatar_file = forms.ImageField(required=False)
gremmie@1 92 image = None
gremmie@1 93
gremmie@1 94 def clean_avatar_file(self):
gremmie@1 95 file = self.cleaned_data['avatar_file']
gremmie@1 96 if file is not None:
gremmie@1 97 if file.size > settings.MAX_AVATAR_SIZE_BYTES:
gremmie@1 98 raise forms.ValidationError("Please upload a file smaller than %s bytes." % \
gremmie@1 99 settings.MAX_AVATAR_SIZE)
gremmie@1 100 self.image = get_image(file)
gremmie@1 101 self.format = self.image.format
gremmie@1 102 return file
gremmie@1 103
gremmie@1 104 def get_file(self):
gremmie@1 105 if self.image is not None:
gremmie@1 106 self.image = scale_image(self.image, settings.MAX_AVATAR_SIZE_PIXELS)
gremmie@1 107 s = StringIO()
gremmie@1 108 self.image.save(s, self.format)
gremmie@1 109 return ContentFile(s.getvalue())
gremmie@1 110 return None
gremmie@1 111
gremmie@1 112 def get_filename(self):
gremmie@1 113 return self.cleaned_data['avatar_file'].name
gremmie@1 114