2013-04-23 18:51:17 +02:00
from __future__ import absolute_import
2012-08-28 18:44:51 +02:00
from django import forms
2012-09-26 20:08:39 +02:00
from django . core . exceptions import ValidationError
2012-11-21 21:14:55 +01:00
from django . utils . safestring import mark_safe
2012-12-13 21:08:07 +01:00
from django . contrib . auth . forms import SetPasswordForm
2012-11-21 21:14:55 +01:00
2013-08-07 17:59:45 +02:00
from zerver . models import Realm , get_user_profile_by_email , UserProfile , \
completely_open
2013-07-29 23:03:31 +02:00
from zerver . lib . actions import do_change_password
2013-08-12 00:47:28 +02:00
import DNS
2012-09-26 20:08:39 +02:00
2013-02-12 20:52:42 +01:00
def is_inactive ( value ) :
2012-10-29 19:08:18 +01:00
try :
2013-03-28 20:47:22 +01:00
if get_user_profile_by_email ( value ) . is_active :
2012-10-29 19:08:18 +01:00
raise ValidationError ( u ' %s is already active ' % value )
2013-03-28 20:20:31 +01:00
except UserProfile . DoesNotExist :
2012-10-29 19:08:18 +01:00
pass
2013-07-24 23:41:24 +02:00
SIGNUP_STRING = ' <a href= " https://zulip.com/signup " >Sign up</a> to find out when Zulip is ready for you. '
2012-11-21 21:14:55 +01:00
def has_valid_realm ( value ) :
2013-08-07 17:59:45 +02:00
return Realm . objects . filter ( domain = value . split ( " @ " ) [ - 1 ] ) . exists ( )
2012-11-21 21:14:55 +01:00
2013-08-12 00:47:28 +02:00
def not_mit_mailing_list ( value ) :
# I don't want ec-discuss signed up for Zulip
if " @mit.edu " in value :
username = value . rsplit ( " @ " , 1 ) [ 0 ]
# Check whether the user exists and can get mail.
try :
DNS . dnslookup ( " %s .pobox.ns.athena.mit.edu " % username , DNS . Type . TXT )
2013-08-12 00:55:24 +02:00
return True
2013-08-12 00:47:28 +02:00
except DNS . Base . ServerError , e :
if e . rcode == DNS . Status . NXDOMAIN :
raise ValidationError ( mark_safe ( u ' That user does not exist at MIT or is a <a href= " https://ist.mit.edu/email-lists " >mailing list</a>. If you want to sign up an alias for Zulip, <a href= " mailto:support@zulip.com " >contact us</a>. ' ) )
else :
raise
2013-08-12 00:55:24 +02:00
return True
2013-08-12 00:47:28 +02:00
2012-08-28 18:44:51 +02:00
class RegistrationForm ( forms . Form ) :
2012-09-11 19:20:01 +02:00
full_name = forms . CharField ( max_length = 100 )
2012-09-05 16:20:39 +02:00
password = forms . CharField ( widget = forms . PasswordInput , max_length = 100 )
2012-10-25 21:04:46 +02:00
terms = forms . BooleanField ( required = True )
2012-09-28 22:47:05 +02:00
2013-01-08 23:26:40 +01:00
class ToSForm ( forms . Form ) :
full_name = forms . CharField ( max_length = 100 )
terms = forms . BooleanField ( required = True )
2012-09-28 22:47:05 +02:00
class HomepageForm ( forms . Form ) :
2013-08-07 17:59:45 +02:00
# This form is important because it determines whether users can
# register for our product. Be careful when modifying the
# validators.
2013-08-12 00:57:54 +02:00
email = forms . EmailField ( validators = [ is_inactive , ] )
2012-12-13 21:08:07 +01:00
2013-08-07 17:59:45 +02:00
def __init__ ( self , * args , * * kwargs ) :
self . domain = kwargs . get ( " domain " )
if kwargs . has_key ( " domain " ) :
del kwargs [ " domain " ]
super ( HomepageForm , self ) . __init__ ( * args , * * kwargs )
def clean_email ( self ) :
data = self . cleaned_data [ ' email ' ]
2013-08-12 00:55:24 +02:00
if completely_open ( self . domain ) or has_valid_realm ( data ) and not_mit_mailing_list ( data ) :
2013-08-07 17:59:45 +02:00
return data
raise ValidationError ( mark_safe (
u ' Registration is not currently available for your domain. ' \
+ SIGNUP_STRING ) )
2012-12-13 21:08:07 +01:00
class LoggingSetPasswordForm ( SetPasswordForm ) :
def save ( self , commit = True ) :
2013-03-29 17:39:53 +01:00
do_change_password ( self . user , self . cleaned_data [ ' new_password1 ' ] ,
2012-12-13 21:08:07 +01:00
log = True , commit = commit )
return self . user
2013-05-03 00:26:53 +02:00
class CreateBotForm ( forms . Form ) :
full_name = forms . CharField ( max_length = 100 )
email = forms . EmailField ( )