Commit dc0168e00d898e340021fe873876b73f69c70664
1 parent
904e05d4
Exists in
master
and in
39 other branches
Validating facebook and twitter accounts.
closes #28
Showing
3 changed files
with
44 additions
and
1 deletions
Show diff stats
src/accounts/forms.py
@@ -5,11 +5,24 @@ from django.contrib.auth import get_user_model | @@ -5,11 +5,24 @@ from django.contrib.auth import get_user_model | ||
5 | from django.utils.translation import ugettext_lazy as _ | 5 | from django.utils.translation import ugettext_lazy as _ |
6 | 6 | ||
7 | from super_archives.models import MailingList | 7 | from super_archives.models import MailingList |
8 | - | 8 | +from .utils.validators import validate_social_account |
9 | 9 | ||
10 | User = get_user_model() | 10 | User = get_user_model() |
11 | 11 | ||
12 | 12 | ||
13 | +class SocialAccountField(forms.Field): | ||
14 | + def __init__(self, *args, **kwargs): | ||
15 | + self.url = kwargs.pop('url', None) | ||
16 | + super(SocialAccountField, self).__init__(*args, **kwargs) | ||
17 | + | ||
18 | + def validate(self, value): | ||
19 | + super(SocialAccountField, self).validate(value) | ||
20 | + | ||
21 | + if value and not validate_social_account(value, self.url): | ||
22 | + raise forms.ValidationError(_('Social account does not exist'), | ||
23 | + code='social-account-doesnot-exist') | ||
24 | + | ||
25 | + | ||
13 | class UserForm(forms.ModelForm): | 26 | class UserForm(forms.ModelForm): |
14 | required = ('first_name', 'last_name', 'email', 'username') | 27 | required = ('first_name', 'last_name', 'email', 'username') |
15 | 28 | ||
@@ -34,12 +47,16 @@ class UserCreationForm(UserForm): | @@ -34,12 +47,16 @@ class UserCreationForm(UserForm): | ||
34 | 47 | ||
35 | 48 | ||
36 | class UserUpdateForm(UserForm): | 49 | class UserUpdateForm(UserForm): |
50 | + | ||
37 | class Meta: | 51 | class Meta: |
38 | model = User | 52 | model = User |
39 | fields = ('username', 'first_name', 'last_name', | 53 | fields = ('username', 'first_name', 'last_name', |
40 | 'institution', 'role', 'twitter', 'facebook', | 54 | 'institution', 'role', 'twitter', 'facebook', |
41 | 'google_talk', 'webpage') | 55 | 'google_talk', 'webpage') |
42 | 56 | ||
57 | + twitter = SocialAccountField(url='https://twitter.com/', required=False) | ||
58 | + facebook = SocialAccountField(url='https://graph.facebook.com/', required=False) | ||
59 | + | ||
43 | 60 | ||
44 | class ListsForm(forms.Form): | 61 | class ListsForm(forms.Form): |
45 | LISTS_NAMES = ((list.name, list.name) for list in MailingList.objects.all()) | 62 | LISTS_NAMES = ((list.name, list.name) for list in MailingList.objects.all()) |
@@ -0,0 +1,26 @@ | @@ -0,0 +1,26 @@ | ||
1 | + | ||
2 | +import urllib2 | ||
3 | +import urlparse | ||
4 | + | ||
5 | + | ||
6 | +def validate_social_account(account, url): | ||
7 | + """Verifies if a social account is valid. | ||
8 | + | ||
9 | + Examples: | ||
10 | + | ||
11 | + >>> validate_social_account('seocam', 'http://twitter.com') | ||
12 | + True | ||
13 | + | ||
14 | + >>> validate_social_account('seocam-fake-should-fail', 'http://twitter.com') | ||
15 | + False | ||
16 | + """ | ||
17 | + | ||
18 | + request = urllib2.Request(urlparse.urljoin(url, account)) | ||
19 | + request.get_method = lambda: 'HEAD' | ||
20 | + | ||
21 | + try: | ||
22 | + response = urllib2.urlopen(request) | ||
23 | + except urllib2.HTTPError: | ||
24 | + return False | ||
25 | + | ||
26 | + return response.code == 200 |