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 |