diff --git a/src/accounts/forms.py b/src/accounts/forms.py index 8dd67f3..51ccb14 100644 --- a/src/accounts/forms.py +++ b/src/accounts/forms.py @@ -5,11 +5,24 @@ from django.contrib.auth import get_user_model from django.utils.translation import ugettext_lazy as _ from super_archives.models import MailingList - +from .utils.validators import validate_social_account User = get_user_model() +class SocialAccountField(forms.Field): + def __init__(self, *args, **kwargs): + self.url = kwargs.pop('url', None) + super(SocialAccountField, self).__init__(*args, **kwargs) + + def validate(self, value): + super(SocialAccountField, self).validate(value) + + if value and not validate_social_account(value, self.url): + raise forms.ValidationError(_('Social account does not exist'), + code='social-account-doesnot-exist') + + class UserForm(forms.ModelForm): required = ('first_name', 'last_name', 'email', 'username') @@ -34,12 +47,16 @@ class UserCreationForm(UserForm): class UserUpdateForm(UserForm): + class Meta: model = User fields = ('username', 'first_name', 'last_name', 'institution', 'role', 'twitter', 'facebook', 'google_talk', 'webpage') + twitter = SocialAccountField(url='https://twitter.com/', required=False) + facebook = SocialAccountField(url='https://graph.facebook.com/', required=False) + class ListsForm(forms.Form): LISTS_NAMES = ((list.name, list.name) for list in MailingList.objects.all()) diff --git a/src/accounts/utils/__init__.py b/src/accounts/utils/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/accounts/utils/__init__.py diff --git a/src/accounts/utils/validators.py b/src/accounts/utils/validators.py new file mode 100644 index 0000000..68f4128 --- /dev/null +++ b/src/accounts/utils/validators.py @@ -0,0 +1,26 @@ + +import urllib2 +import urlparse + + +def validate_social_account(account, url): + """Verifies if a social account is valid. + + Examples: + + >>> validate_social_account('seocam', 'http://twitter.com') + True + + >>> validate_social_account('seocam-fake-should-fail', 'http://twitter.com') + False + """ + + request = urllib2.Request(urlparse.urljoin(url, account)) + request.get_method = lambda: 'HEAD' + + try: + response = urllib2.urlopen(request) + except urllib2.HTTPError: + return False + + return response.code == 200 -- libgit2 0.21.2