annotate messages/forms.py @ 645:99f7917702ca

Fix 081a88b3bfc8, javascript resize of forum images. Commit 081a88b3bfc8 broke those pages that loaded forums.js but did not load the imagesLoaded jQuery extension. Now we have arranged it so that only the forums topic view loads imagesLoaded and put the resizing javascript inline.
author Brian Neal <bgneal@gmail.com>
date Mon, 11 Mar 2013 15:30:25 -0500
parents ee87ea74d46b
children 9aae4f99f062
rev   line source
gremmie@1 1 """
gremmie@1 2 Forms for the messages application.
gremmie@1 3 """
gremmie@1 4
gremmie@1 5 from django import forms
gremmie@1 6 from django.contrib.auth.models import User
gremmie@1 7 from django.conf import settings
gremmie@1 8 from django.contrib.sites.models import Site
gremmie@1 9 from django.core.urlresolvers import reverse
gremmie@1 10 from django.template.loader import render_to_string
gremmie@1 11
gremmie@1 12 from core.functions import send_mail
gremmie@1 13 from core.widgets import AutoCompleteUserInput
gremmie@1 14 from messages.models import Message
gremmie@1 15 from messages.models import Options
bgneal@436 16 from messages import MSG_BOX_LIMIT
gremmie@1 17
gremmie@1 18
bgneal@432 19 # Maximum size of a private message in characters
bgneal@432 20 MESSAGE_MAX = getattr(settings, 'MESSAGES_MAX_SIZE', 8192)
bgneal@432 21
bgneal@432 22
gremmie@1 23 class ComposeForm(forms.Form):
bgneal@432 24 """
bgneal@432 25 This form is used to compose private messages.
bgneal@432 26 """
bgneal@432 27 receiver = forms.CharField(label='To',
bgneal@432 28 max_length=30,
bgneal@432 29 widget=AutoCompleteUserInput())
bgneal@432 30 subject = forms.CharField(max_length=120, widget=forms.TextInput(attrs={'size': 52}))
bgneal@432 31 message = forms.CharField(widget=forms.Textarea(attrs={'class': 'markItUp smileyTarget'}))
bgneal@432 32 attach_signature = forms.BooleanField(label='Attach Signature?', required=False)
gremmie@1 33
bgneal@432 34 def __init__(self, user, *args, **kwargs):
bgneal@432 35 forms.Form.__init__(self, *args, **kwargs)
bgneal@432 36 self.user = user
bgneal@432 37 options = Options.objects.for_user(user)
bgneal@432 38 self.fields['attach_signature'].initial = options.attach_signature
gremmie@1 39
bgneal@432 40 def clean_receiver(self):
bgneal@432 41 receiver = self.cleaned_data['receiver']
bgneal@432 42 try:
bgneal@432 43 self.rcvr_user = User.objects.get(username=receiver)
bgneal@432 44 except User.DoesNotExist:
bgneal@432 45 raise forms.ValidationError("That username does not exist.")
bgneal@432 46 if self.user == self.rcvr_user:
bgneal@432 47 raise forms.ValidationError("You can't send a message to yourself.")
bgneal@432 48 return receiver
gremmie@1 49
bgneal@432 50 def clean_message(self):
bgneal@432 51 msg = self.cleaned_data['message']
bgneal@432 52 if len(msg) > MESSAGE_MAX:
bgneal@432 53 raise forms.ValidationError("Your message is too long. Please trim some text.")
bgneal@432 54 return msg
gremmie@1 55
bgneal@436 56 def clean(self):
bgneal@461 57 rcvr = self.cleaned_data.get('receiver')
bgneal@461 58 subject = self.cleaned_data.get('subject')
bgneal@461 59 message = self.cleaned_data.get('message')
bgneal@436 60
bgneal@461 61 if rcvr and subject and message:
bgneal@461 62 # Can we send a message? Is our outbox full?
bgneal@436 63
bgneal@461 64 count = Message.objects.outbox(self.user).count()
bgneal@461 65 if count >= MSG_BOX_LIMIT:
bgneal@461 66 raise forms.ValidationError(
bgneal@461 67 "Your outbox is full. Please delete some messages.")
bgneal@461 68
bgneal@461 69 # Is the receiver's inbox full?
bgneal@461 70 count = Message.objects.inbox(self.rcvr_user).count()
bgneal@461 71 if count >= MSG_BOX_LIMIT:
bgneal@461 72 raise forms.ValidationError(
bgneal@461 73 "Sorry, %s's inbox is full. This message cannot be sent." %
bgneal@461 74 self.rcvr_user.username)
bgneal@436 75
bgneal@436 76 return self.cleaned_data
bgneal@436 77
bgneal@432 78 def save(self, parent_msg=None):
bgneal@432 79 sender = self.user
bgneal@432 80 receiver = self.rcvr_user
bgneal@432 81 subject = self.cleaned_data['subject']
bgneal@432 82 message = self.cleaned_data['message']
bgneal@432 83 attach_signature = self.cleaned_data['attach_signature']
gremmie@1 84
bgneal@432 85 new_msg = Message(
bgneal@432 86 sender=sender,
bgneal@432 87 receiver=receiver,
bgneal@432 88 subject=subject,
bgneal@432 89 message=message,
bgneal@432 90 signature_attached=attach_signature,
bgneal@432 91 )
bgneal@432 92 new_msg.save()
bgneal@432 93 if parent_msg is not None:
bgneal@432 94 parent_msg.reply_date = new_msg.send_date
bgneal@432 95 parent_msg.save()
gremmie@1 96
bgneal@432 97 receiver_opts = Options.objects.for_user(receiver)
bgneal@432 98 if receiver_opts.notify_email:
bgneal@432 99 notify_receiver(new_msg)
bgneal@432 100
bgneal@432 101 class Media:
bgneal@432 102 css = {
bgneal@432 103 'all': (settings.GPP_THIRD_PARTY_CSS['markitup'] +
bgneal@432 104 settings.GPP_THIRD_PARTY_CSS['jquery-ui'])
bgneal@432 105 }
bgneal@432 106 js = (settings.GPP_THIRD_PARTY_JS['markitup'] +
bgneal@432 107 settings.GPP_THIRD_PARTY_JS['jquery-ui'])
gremmie@1 108
gremmie@1 109
gremmie@1 110 class OptionsForm(forms.ModelForm):
bgneal@432 111 class Meta:
bgneal@432 112 model = Options
gremmie@1 113
gremmie@1 114
gremmie@1 115 def notify_receiver(new_msg):
bgneal@432 116 """
bgneal@432 117 This function creates the notification email to notify a user of
bgneal@432 118 a new private message.
bgneal@432 119 """
bgneal@432 120 site = Site.objects.get_current()
gremmie@1 121
bgneal@432 122 email_body = render_to_string('messages/notification_email.txt', {
bgneal@432 123 'site': site,
bgneal@432 124 'msg': new_msg,
bgneal@441 125 'options_url': reverse('messages-options_tab'),
bgneal@432 126 })
gremmie@1 127
bgneal@432 128 subject = 'New private message for %s at %s' % (new_msg.receiver.username, site.name)
bgneal@432 129 from_email = settings.GPP_NO_REPLY_EMAIL + '@' + site.domain
bgneal@432 130 send_mail(subject, email_body, from_email, [new_msg.receiver.email])