| 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() |
|---|