gremmie@1: """ gremmie@1: Forms for the messages application. bgneal@804: gremmie@1: """ gremmie@1: from django import forms gremmie@1: from django.contrib.auth.models import User gremmie@1: from django.conf import settings gremmie@1: from django.contrib.sites.models import Site gremmie@1: from django.core.urlresolvers import reverse gremmie@1: from django.template.loader import render_to_string gremmie@1: gremmie@1: from core.functions import send_mail bgneal@1022: from core.html import ImageCheckError bgneal@1022: from core.html import image_check bgneal@1022: from core.markup import site_markup bgneal@814: import messages bgneal@810: from messages.models import Flag, Message, Options gremmie@1: gremmie@1: bgneal@432: # Maximum size of a private message in characters bgneal@432: MESSAGE_MAX = getattr(settings, 'MESSAGES_MAX_SIZE', 8192) bgneal@432: bgneal@432: gremmie@1: class ComposeForm(forms.Form): bgneal@432: """ bgneal@432: This form is used to compose private messages. bgneal@432: """ bgneal@432: receiver = forms.CharField(label='To', bgneal@432: max_length=30, bgneal@1138: widget=forms.TextInput(attrs={'class': 'sg101-autocomplete'})) bgneal@1137: subject = forms.CharField(max_length=120) bgneal@1137: message = forms.CharField(widget=forms.Textarea) bgneal@432: attach_signature = forms.BooleanField(label='Attach Signature?', required=False) bgneal@804: parent_id = forms.IntegerField(required=False, widget=forms.HiddenInput) gremmie@1: bgneal@432: def __init__(self, user, *args, **kwargs): bgneal@432: forms.Form.__init__(self, *args, **kwargs) bgneal@432: self.user = user bgneal@432: options = Options.objects.for_user(user) bgneal@432: self.fields['attach_signature'].initial = options.attach_signature bgneal@1138: url = reverse('core-ajax_users') bgneal@1138: self.fields['receiver'].widget.attrs['data-autocomplete-url'] = url gremmie@1: bgneal@432: def clean_receiver(self): bgneal@432: receiver = self.cleaned_data['receiver'] bgneal@432: try: bgneal@432: self.rcvr_user = User.objects.get(username=receiver) bgneal@432: except User.DoesNotExist: bgneal@432: raise forms.ValidationError("That username does not exist.") bgneal@432: if self.user == self.rcvr_user: bgneal@432: raise forms.ValidationError("You can't send a message to yourself.") bgneal@432: return receiver gremmie@1: bgneal@432: def clean_message(self): bgneal@1022: msg = self.cleaned_data['message'].strip() bgneal@432: if len(msg) > MESSAGE_MAX: bgneal@432: raise forms.ValidationError("Your message is too long. Please trim some text.") bgneal@1022: bgneal@1022: self.html = None bgneal@1022: if not msg: bgneal@1022: raise forms.ValidationError("Please enter a message.") bgneal@1022: bgneal@1022: self.html = site_markup(msg) bgneal@1022: try: bgneal@1022: image_check(self.html) bgneal@1022: except ImageCheckError as ex: bgneal@1022: raise forms.ValidationError(str(ex)) bgneal@1022: bgneal@432: return msg gremmie@1: bgneal@436: def clean(self): bgneal@461: rcvr = self.cleaned_data.get('receiver') bgneal@461: subject = self.cleaned_data.get('subject') bgneal@461: message = self.cleaned_data.get('message') bgneal@436: bgneal@461: if rcvr and subject and message: bgneal@461: # Can we send a message? Is our outbox full? bgneal@436: bgneal@461: count = Message.objects.outbox(self.user).count() bgneal@814: if count >= messages.MSG_BOX_LIMIT: bgneal@461: raise forms.ValidationError( bgneal@461: "Your outbox is full. Please delete some messages.") bgneal@461: bgneal@461: # Is the receiver's inbox full? bgneal@461: count = Message.objects.inbox(self.rcvr_user).count() bgneal@814: if count >= messages.MSG_BOX_LIMIT: bgneal@461: raise forms.ValidationError( bgneal@461: "Sorry, %s's inbox is full. This message cannot be sent." % bgneal@461: self.rcvr_user.username) bgneal@436: bgneal@436: return self.cleaned_data bgneal@436: bgneal@432: def save(self, parent_msg=None): bgneal@432: sender = self.user bgneal@432: receiver = self.rcvr_user bgneal@432: subject = self.cleaned_data['subject'] bgneal@432: message = self.cleaned_data['message'] bgneal@432: attach_signature = self.cleaned_data['attach_signature'] gremmie@1: bgneal@432: new_msg = Message( bgneal@432: sender=sender, bgneal@432: receiver=receiver, bgneal@432: subject=subject, bgneal@432: message=message, bgneal@432: signature_attached=attach_signature, bgneal@432: ) bgneal@1022: new_msg.save(html=self.html) gremmie@1: bgneal@804: # Update the parent message (if there is one) bgneal@804: parent_id = self.cleaned_data['parent_id'] bgneal@804: if parent_id: bgneal@804: try: bgneal@804: parent_msg = Message.objects.get(pk=parent_id) bgneal@804: except Message.DoesNotExist: bgneal@804: parent_msg = None bgneal@804: bgneal@804: if parent_msg and parent_msg.receiver == self.user: bgneal@804: parent_msg.reply_date = new_msg.send_date bgneal@804: parent_msg.save() bgneal@804: bgneal@804: # Notify recipient bgneal@432: receiver_opts = Options.objects.for_user(receiver) bgneal@432: if receiver_opts.notify_email: bgneal@432: notify_receiver(new_msg) bgneal@432: gremmie@1: gremmie@1: class OptionsForm(forms.ModelForm): bgneal@432: class Meta: bgneal@432: model = Options bgneal@741: fields = ['attach_signature', 'notify_email'] gremmie@1: gremmie@1: bgneal@810: class ReportForm(forms.ModelForm): bgneal@810: class Meta: bgneal@810: model = Flag bgneal@810: fields = ['comments'] bgneal@810: labels = {'comments': ''} bgneal@810: widgets = { bgneal@810: 'comments': forms.Textarea(attrs={ bgneal@810: 'placeholder': 'Enter a comment for the admin (optional).'}) bgneal@810: } bgneal@810: bgneal@810: gremmie@1: def notify_receiver(new_msg): bgneal@432: """ bgneal@432: This function creates the notification email to notify a user of bgneal@432: a new private message. bgneal@432: """ bgneal@432: site = Site.objects.get_current() gremmie@1: bgneal@432: email_body = render_to_string('messages/notification_email.txt', { bgneal@432: 'site': site, bgneal@432: 'msg': new_msg, bgneal@808: 'options_url': reverse('messages-options'), bgneal@432: }) gremmie@1: bgneal@432: subject = 'New private message for %s at %s' % (new_msg.receiver.username, site.name) bgneal@432: from_email = settings.GPP_NO_REPLY_EMAIL + '@' + site.domain bgneal@432: send_mail(subject, email_body, from_email, [new_msg.receiver.email])