gremmie@1
|
1 """
|
gremmie@1
|
2 Forms for the messages application.
|
bgneal@804
|
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
|
bgneal@1022
|
13 from core.html import ImageCheckError
|
bgneal@1022
|
14 from core.html import image_check
|
bgneal@1022
|
15 from core.markup import site_markup
|
bgneal@814
|
16 import messages
|
bgneal@810
|
17 from messages.models import Flag, Message, Options
|
gremmie@1
|
18
|
gremmie@1
|
19
|
bgneal@432
|
20 # Maximum size of a private message in characters
|
bgneal@432
|
21 MESSAGE_MAX = getattr(settings, 'MESSAGES_MAX_SIZE', 8192)
|
bgneal@432
|
22
|
bgneal@432
|
23
|
gremmie@1
|
24 class ComposeForm(forms.Form):
|
bgneal@432
|
25 """
|
bgneal@432
|
26 This form is used to compose private messages.
|
bgneal@432
|
27 """
|
bgneal@432
|
28 receiver = forms.CharField(label='To',
|
bgneal@432
|
29 max_length=30,
|
bgneal@1138
|
30 widget=forms.TextInput(attrs={'class': 'sg101-autocomplete'}))
|
bgneal@1137
|
31 subject = forms.CharField(max_length=120)
|
bgneal@1137
|
32 message = forms.CharField(widget=forms.Textarea)
|
bgneal@432
|
33 attach_signature = forms.BooleanField(label='Attach Signature?', required=False)
|
bgneal@804
|
34 parent_id = forms.IntegerField(required=False, widget=forms.HiddenInput)
|
gremmie@1
|
35
|
bgneal@432
|
36 def __init__(self, user, *args, **kwargs):
|
bgneal@432
|
37 forms.Form.__init__(self, *args, **kwargs)
|
bgneal@432
|
38 self.user = user
|
bgneal@432
|
39 options = Options.objects.for_user(user)
|
bgneal@432
|
40 self.fields['attach_signature'].initial = options.attach_signature
|
bgneal@1138
|
41 url = reverse('core-ajax_users')
|
bgneal@1138
|
42 self.fields['receiver'].widget.attrs['data-autocomplete-url'] = url
|
gremmie@1
|
43
|
bgneal@432
|
44 def clean_receiver(self):
|
bgneal@432
|
45 receiver = self.cleaned_data['receiver']
|
bgneal@432
|
46 try:
|
bgneal@432
|
47 self.rcvr_user = User.objects.get(username=receiver)
|
bgneal@432
|
48 except User.DoesNotExist:
|
bgneal@432
|
49 raise forms.ValidationError("That username does not exist.")
|
bgneal@432
|
50 if self.user == self.rcvr_user:
|
bgneal@432
|
51 raise forms.ValidationError("You can't send a message to yourself.")
|
bgneal@432
|
52 return receiver
|
gremmie@1
|
53
|
bgneal@432
|
54 def clean_message(self):
|
bgneal@1022
|
55 msg = self.cleaned_data['message'].strip()
|
bgneal@432
|
56 if len(msg) > MESSAGE_MAX:
|
bgneal@432
|
57 raise forms.ValidationError("Your message is too long. Please trim some text.")
|
bgneal@1022
|
58
|
bgneal@1022
|
59 self.html = None
|
bgneal@1022
|
60 if not msg:
|
bgneal@1022
|
61 raise forms.ValidationError("Please enter a message.")
|
bgneal@1022
|
62
|
bgneal@1022
|
63 self.html = site_markup(msg)
|
bgneal@1022
|
64 try:
|
bgneal@1022
|
65 image_check(self.html)
|
bgneal@1022
|
66 except ImageCheckError as ex:
|
bgneal@1022
|
67 raise forms.ValidationError(str(ex))
|
bgneal@1022
|
68
|
bgneal@432
|
69 return msg
|
gremmie@1
|
70
|
bgneal@436
|
71 def clean(self):
|
bgneal@461
|
72 rcvr = self.cleaned_data.get('receiver')
|
bgneal@461
|
73 subject = self.cleaned_data.get('subject')
|
bgneal@461
|
74 message = self.cleaned_data.get('message')
|
bgneal@436
|
75
|
bgneal@461
|
76 if rcvr and subject and message:
|
bgneal@461
|
77 # Can we send a message? Is our outbox full?
|
bgneal@436
|
78
|
bgneal@461
|
79 count = Message.objects.outbox(self.user).count()
|
bgneal@814
|
80 if count >= messages.MSG_BOX_LIMIT:
|
bgneal@461
|
81 raise forms.ValidationError(
|
bgneal@461
|
82 "Your outbox is full. Please delete some messages.")
|
bgneal@461
|
83
|
bgneal@461
|
84 # Is the receiver's inbox full?
|
bgneal@461
|
85 count = Message.objects.inbox(self.rcvr_user).count()
|
bgneal@814
|
86 if count >= messages.MSG_BOX_LIMIT:
|
bgneal@461
|
87 raise forms.ValidationError(
|
bgneal@461
|
88 "Sorry, %s's inbox is full. This message cannot be sent." %
|
bgneal@461
|
89 self.rcvr_user.username)
|
bgneal@436
|
90
|
bgneal@436
|
91 return self.cleaned_data
|
bgneal@436
|
92
|
bgneal@432
|
93 def save(self, parent_msg=None):
|
bgneal@432
|
94 sender = self.user
|
bgneal@432
|
95 receiver = self.rcvr_user
|
bgneal@432
|
96 subject = self.cleaned_data['subject']
|
bgneal@432
|
97 message = self.cleaned_data['message']
|
bgneal@432
|
98 attach_signature = self.cleaned_data['attach_signature']
|
gremmie@1
|
99
|
bgneal@432
|
100 new_msg = Message(
|
bgneal@432
|
101 sender=sender,
|
bgneal@432
|
102 receiver=receiver,
|
bgneal@432
|
103 subject=subject,
|
bgneal@432
|
104 message=message,
|
bgneal@432
|
105 signature_attached=attach_signature,
|
bgneal@432
|
106 )
|
bgneal@1022
|
107 new_msg.save(html=self.html)
|
gremmie@1
|
108
|
bgneal@804
|
109 # Update the parent message (if there is one)
|
bgneal@804
|
110 parent_id = self.cleaned_data['parent_id']
|
bgneal@804
|
111 if parent_id:
|
bgneal@804
|
112 try:
|
bgneal@804
|
113 parent_msg = Message.objects.get(pk=parent_id)
|
bgneal@804
|
114 except Message.DoesNotExist:
|
bgneal@804
|
115 parent_msg = None
|
bgneal@804
|
116
|
bgneal@804
|
117 if parent_msg and parent_msg.receiver == self.user:
|
bgneal@804
|
118 parent_msg.reply_date = new_msg.send_date
|
bgneal@804
|
119 parent_msg.save()
|
bgneal@804
|
120
|
bgneal@804
|
121 # Notify recipient
|
bgneal@432
|
122 receiver_opts = Options.objects.for_user(receiver)
|
bgneal@432
|
123 if receiver_opts.notify_email:
|
bgneal@432
|
124 notify_receiver(new_msg)
|
bgneal@432
|
125
|
gremmie@1
|
126
|
gremmie@1
|
127 class OptionsForm(forms.ModelForm):
|
bgneal@432
|
128 class Meta:
|
bgneal@432
|
129 model = Options
|
bgneal@741
|
130 fields = ['attach_signature', 'notify_email']
|
gremmie@1
|
131
|
gremmie@1
|
132
|
bgneal@810
|
133 class ReportForm(forms.ModelForm):
|
bgneal@810
|
134 class Meta:
|
bgneal@810
|
135 model = Flag
|
bgneal@810
|
136 fields = ['comments']
|
bgneal@810
|
137 labels = {'comments': ''}
|
bgneal@810
|
138 widgets = {
|
bgneal@810
|
139 'comments': forms.Textarea(attrs={
|
bgneal@810
|
140 'placeholder': 'Enter a comment for the admin (optional).'})
|
bgneal@810
|
141 }
|
bgneal@810
|
142
|
bgneal@810
|
143
|
gremmie@1
|
144 def notify_receiver(new_msg):
|
bgneal@432
|
145 """
|
bgneal@432
|
146 This function creates the notification email to notify a user of
|
bgneal@432
|
147 a new private message.
|
bgneal@432
|
148 """
|
bgneal@432
|
149 site = Site.objects.get_current()
|
gremmie@1
|
150
|
bgneal@432
|
151 email_body = render_to_string('messages/notification_email.txt', {
|
bgneal@432
|
152 'site': site,
|
bgneal@432
|
153 'msg': new_msg,
|
bgneal@808
|
154 'options_url': reverse('messages-options'),
|
bgneal@432
|
155 })
|
gremmie@1
|
156
|
bgneal@432
|
157 subject = 'New private message for %s at %s' % (new_msg.receiver.username, site.name)
|
bgneal@432
|
158 from_email = settings.GPP_NO_REPLY_EMAIL + '@' + site.domain
|
bgneal@432
|
159 send_mail(subject, email_body, from_email, [new_msg.receiver.email])
|