gremmie@1
|
1 """
|
gremmie@1
|
2 Forms for the comments application.
|
gremmie@1
|
3 """
|
gremmie@1
|
4 import datetime
|
gremmie@1
|
5 from django import forms
|
gremmie@1
|
6 from django.conf import settings
|
gremmie@1
|
7 from django.contrib.contenttypes.models import ContentType
|
gremmie@1
|
8
|
gremmie@1
|
9 from comments.models import Comment
|
bgneal@963
|
10 from core.html import ImageCheckError
|
bgneal@963
|
11 from core.html import image_check
|
bgneal@963
|
12 from core.markup import site_markup
|
bgneal@963
|
13
|
gremmie@1
|
14
|
gremmie@1
|
15 COMMENT_MAX_LENGTH = getattr(settings, 'COMMENT_MAX_LENGTH', 3000)
|
gremmie@1
|
16
|
gremmie@1
|
17 class CommentForm(forms.Form):
|
gremmie@1
|
18 comment = forms.CharField(label='',
|
bgneal@312
|
19 min_length=1,
|
gremmie@1
|
20 max_length=COMMENT_MAX_LENGTH,
|
bgneal@134
|
21 widget=forms.Textarea(attrs={'class': 'markItUp smileyTarget'}))
|
gremmie@1
|
22 content_type = forms.CharField(widget=forms.HiddenInput)
|
gremmie@1
|
23 object_pk = forms.CharField(widget=forms.HiddenInput)
|
gremmie@1
|
24
|
gremmie@1
|
25 def __init__(self, target_object, data=None, initial=None):
|
gremmie@1
|
26 self.target_object = target_object
|
gremmie@1
|
27 if initial is None:
|
gremmie@1
|
28 initial = {}
|
gremmie@1
|
29 initial.update({
|
gremmie@1
|
30 'content_type': str(self.target_object._meta),
|
gremmie@1
|
31 'object_pk': str(self.target_object.pk),
|
gremmie@1
|
32 })
|
gremmie@1
|
33 super(CommentForm, self).__init__(data=data, initial=initial)
|
gremmie@1
|
34
|
gremmie@1
|
35 def get_comment_object(self, user, ip_address):
|
gremmie@1
|
36 """
|
gremmie@1
|
37 Return a new (unsaved) comment object based on the information in this
|
gremmie@1
|
38 form. Assumes that the form is already validated and will throw a
|
gremmie@1
|
39 ValueError if not.
|
gremmie@1
|
40 """
|
gremmie@1
|
41 if not self.is_valid():
|
gremmie@1
|
42 raise ValueError("get_comment_object may only be called on valid forms")
|
gremmie@1
|
43
|
gremmie@1
|
44 new = Comment(
|
gremmie@1
|
45 content_type = ContentType.objects.get_for_model(self.target_object),
|
gremmie@1
|
46 object_id = self.target_object.pk,
|
gremmie@1
|
47 user = user,
|
gremmie@1
|
48 comment = self.cleaned_data["comment"],
|
gremmie@1
|
49 ip_address = ip_address,
|
gremmie@1
|
50 is_public = True,
|
gremmie@1
|
51 is_removed = False,
|
gremmie@1
|
52 )
|
gremmie@1
|
53
|
gremmie@1
|
54 # Check that this comment isn't duplicate. (Sometimes people post comments
|
gremmie@1
|
55 # twice by mistake.) If it is, fail silently by returning the old comment.
|
gremmie@1
|
56 today = datetime.date.today()
|
gremmie@1
|
57 possible_duplicates = Comment.objects.filter(
|
gremmie@1
|
58 content_type = new.content_type,
|
gremmie@1
|
59 object_id = new.object_id,
|
gremmie@1
|
60 user = new.user,
|
gremmie@1
|
61 creation_date__year = today.year,
|
gremmie@1
|
62 creation_date__month = today.month,
|
gremmie@1
|
63 creation_date__day = today.day,
|
gremmie@1
|
64 )
|
gremmie@1
|
65 for old in possible_duplicates:
|
gremmie@1
|
66 if old.comment == new.comment:
|
gremmie@1
|
67 return old
|
gremmie@1
|
68
|
gremmie@1
|
69 return new
|
gremmie@1
|
70
|
bgneal@963
|
71 def clean_comment(self):
|
bgneal@963
|
72 comment = self.cleaned_data['comment']
|
bgneal@963
|
73 self.comment_html = None
|
bgneal@963
|
74 if comment:
|
bgneal@963
|
75 self.comment_html = site_markup(comment)
|
bgneal@963
|
76 try:
|
bgneal@963
|
77 image_check(self.comment_html)
|
bgneal@963
|
78 except ImageCheckError as ex:
|
bgneal@963
|
79 raise forms.ValidationError(str(ex))
|
bgneal@963
|
80
|
bgneal@963
|
81 return comment
|
bgneal@963
|
82
|
gremmie@1
|
83 class Media:
|
gremmie@1
|
84 css = {
|
bgneal@127
|
85 'all': (settings.GPP_THIRD_PARTY_CSS['markitup'] +
|
bgneal@127
|
86 settings.GPP_THIRD_PARTY_CSS['jquery-ui']),
|
gremmie@1
|
87 }
|
bgneal@312
|
88 js = (settings.GPP_THIRD_PARTY_JS['markitup'] +
|
bgneal@127
|
89 settings.GPP_THIRD_PARTY_JS['jquery-ui'] +
|
bgneal@484
|
90 ['js/comments.js'])
|