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 | 5 | from django.utils.translation import ugettext_lazy as _ |
| 6 | 6 | |
| 7 | 7 | from super_archives.models import MailingList |
| 8 | - | |
| 8 | +from .utils.validators import validate_social_account | |
| 9 | 9 | |
| 10 | 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 | 26 | class UserForm(forms.ModelForm): |
| 14 | 27 | required = ('first_name', 'last_name', 'email', 'username') |
| 15 | 28 | |
| ... | ... | @@ -34,12 +47,16 @@ class UserCreationForm(UserForm): |
| 34 | 47 | |
| 35 | 48 | |
| 36 | 49 | class UserUpdateForm(UserForm): |
| 50 | + | |
| 37 | 51 | class Meta: |
| 38 | 52 | model = User |
| 39 | 53 | fields = ('username', 'first_name', 'last_name', |
| 40 | 54 | 'institution', 'role', 'twitter', 'facebook', |
| 41 | 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 | 61 | class ListsForm(forms.Form): |
| 45 | 62 | LISTS_NAMES = ((list.name, list.name) for list in MailingList.objects.all()) | ... | ... |
| ... | ... | @@ -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 | ... | ... |