diff messages/forms.py @ 581:ee87ea74d46b

For Django 1.4, rearranged project structure for new manage.py.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 May 2012 17:10:48 -0500
parents gpp/messages/forms.py@4b9970ad0edb
children 9aae4f99f062
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messages/forms.py	Sat May 05 17:10:48 2012 -0500
@@ -0,0 +1,130 @@
+"""
+Forms for the messages application.
+"""
+
+from django import forms
+from django.contrib.auth.models import User
+from django.conf import settings
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+from django.template.loader import render_to_string
+
+from core.functions import send_mail
+from core.widgets import AutoCompleteUserInput
+from messages.models import Message
+from messages.models import Options
+from messages import MSG_BOX_LIMIT
+
+
+# Maximum size of a private message in characters
+MESSAGE_MAX = getattr(settings, 'MESSAGES_MAX_SIZE', 8192)
+
+
+class ComposeForm(forms.Form):
+    """
+    This form is used to compose private messages.
+    """
+    receiver = forms.CharField(label='To',
+            max_length=30,
+            widget=AutoCompleteUserInput())
+    subject = forms.CharField(max_length=120, widget=forms.TextInput(attrs={'size': 52}))
+    message = forms.CharField(widget=forms.Textarea(attrs={'class': 'markItUp smileyTarget'}))
+    attach_signature = forms.BooleanField(label='Attach Signature?', required=False)
+
+    def __init__(self, user, *args, **kwargs):
+        forms.Form.__init__(self, *args, **kwargs)
+        self.user = user
+        options = Options.objects.for_user(user)
+        self.fields['attach_signature'].initial = options.attach_signature
+
+    def clean_receiver(self):
+        receiver = self.cleaned_data['receiver']
+        try:
+            self.rcvr_user = User.objects.get(username=receiver)
+        except User.DoesNotExist:
+            raise forms.ValidationError("That username does not exist.")
+        if self.user == self.rcvr_user:
+            raise forms.ValidationError("You can't send a message to yourself.")
+        return receiver
+
+    def clean_message(self):
+        msg = self.cleaned_data['message']
+        if len(msg) > MESSAGE_MAX:
+            raise forms.ValidationError("Your message is too long. Please trim some text.")
+        return msg
+
+    def clean(self):
+        rcvr = self.cleaned_data.get('receiver')
+        subject = self.cleaned_data.get('subject')
+        message = self.cleaned_data.get('message')
+
+        if rcvr and subject and message:
+            # Can we send a message? Is our outbox full?
+
+            count = Message.objects.outbox(self.user).count()
+            if count >= MSG_BOX_LIMIT:
+                raise forms.ValidationError(
+                        "Your outbox is full. Please delete some messages.")
+
+            # Is the receiver's inbox full?
+            count = Message.objects.inbox(self.rcvr_user).count()
+            if count >= MSG_BOX_LIMIT:
+                raise forms.ValidationError(
+                    "Sorry, %s's inbox is full. This message cannot be sent." %
+                    self.rcvr_user.username)
+
+        return self.cleaned_data
+
+    def save(self, parent_msg=None):
+        sender = self.user
+        receiver = self.rcvr_user
+        subject = self.cleaned_data['subject']
+        message = self.cleaned_data['message']
+        attach_signature = self.cleaned_data['attach_signature']
+
+        new_msg = Message(
+            sender=sender,
+            receiver=receiver,
+            subject=subject,
+            message=message,
+            signature_attached=attach_signature,
+        )
+        new_msg.save()
+        if parent_msg is not None:
+            parent_msg.reply_date = new_msg.send_date
+            parent_msg.save()
+
+        receiver_opts = Options.objects.for_user(receiver)
+        if receiver_opts.notify_email:
+            notify_receiver(new_msg)
+
+    class Media:
+        css = {
+             'all': (settings.GPP_THIRD_PARTY_CSS['markitup'] +
+                        settings.GPP_THIRD_PARTY_CSS['jquery-ui'])
+        }
+        js = (settings.GPP_THIRD_PARTY_JS['markitup'] +
+                settings.GPP_THIRD_PARTY_JS['jquery-ui'])
+
+
+class OptionsForm(forms.ModelForm):
+    class Meta:
+        model = Options
+
+
+def notify_receiver(new_msg):
+    """
+    This function creates the notification email to notify a user of
+    a new private message.
+    """
+    site = Site.objects.get_current()
+
+    email_body = render_to_string('messages/notification_email.txt', {
+                'site': site,
+                'msg': new_msg,
+                'options_url': reverse('messages-options_tab'),
+            })
+
+    subject = 'New private message for %s at %s' % (new_msg.receiver.username, site.name)
+    from_email = settings.GPP_NO_REPLY_EMAIL + '@' + site.domain
+    send_mail(subject, email_body, from_email, [new_msg.receiver.email])