annotate comments/forms.py @ 989:2908859c2fe4

Smilies now use relative links. This is for upcoming switch to SSL. Currently we do not need absolute URLs for smilies. If this changes we can add it later.
author Brian Neal <bgneal@gmail.com>
date Thu, 29 Oct 2015 20:54:34 -0500
parents 4619290d171d
children 21c592cac71c
rev   line source
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'])