root/trunk/blog/forms.py

Revision 55, 2.2 kB (checked in by nobu, 9 months ago)

fixed #17 コメントのカウント数を一覧に表示

  • これに伴ってDBの構造も変更。
  • Comment, TrackBackにpre_deleteのフックを追加。
Line 
1 # vim: encoding=utf-8 :
2
3 import re
4 import urllib2
5 from lxml import etree
6
7 from django import newforms as forms
8 from django.contrib.sites.models import Site
9 from django.utils.translation import ugettext_lazy as _
10
11 from blog.models import Comment, TrackBack
12
13 REMOTELINK_PATTERN = re.compile(r'http://%s.*?' % Site.objects.get_current().domain)
14 MULTIBYTE_PATTERN = re.compile(u'.*[\u3041-\u3096]{2,}.*', re.M+re.U)
15 EMPTY_VALUES = (None, '')
16
17
18 class MultibyteCharField(forms.CharField):                                               
19     """
20     """
21     def clean(self, value):
22         super(MultibyteCharField, self).clean(value)                                     
23         if value in EMPTY_VALUES:
24             return u''
25         if MULTIBYTE_PATTERN.search(value) is None:                                     
26             raise forms.ValidationError(_(u'Ensure this value has at least 2 characters or more continuing of Hiragana.'))
27         return value
28
29
30 class CommentForm(forms.ModelForm):
31     """
32     blog.Comment's form.
33     """
34     description = MultibyteCharField(label=_(u'comment'))
35     class Meta:
36         model = Comment
37         fields = ('name', 'email', 'url', 'description')
38
39
40 class TrackBackForm(forms.ModelForm):
41     """
42     blog.TrackBack's form.
43     """
44     excerpt = MultibyteCharField(required=False)
45     class Meta:
46         model = TrackBack
47         fields = ('entry', 'blog_name', 'title', 'url', 'excerpt')
48    
49     def clean(self):
50         if not self._errors:
51             try:
52                 try:
53                     TrackBack.objects.get(entry__exact=self.cleaned_data['entry'],
54                                           url__exact=self.cleaned_data['url'])
55                     raise ValueError
56                 except TrackBack.DoesNotExist:
57                     pass
58                 html = etree.parse(urllib2.urlopen(self.cleaned_data['url']),
59                                    parser=etree.HTMLParser())
60                 links = '\n'.join(html.xpath('//a[@href]/@href'))
61                 if REMOTELINK_PATTERN.search(links) is None:
62                     raise ValueError
63             except Exception, e:
64                 raise forms.ValidationError(_(u'Invalid TrackBack.'))
65         return super(TrackBackForm, self).clean()
Note: See TracBrowser for help on using the browser.