From aeb50765bdcb5e94bcd07d22f2cfa8f692e13911 Mon Sep 17 00:00:00 2001 From: Nishanth Amuluru Date: Thu, 10 Nov 2011 19:05:10 +0530 Subject: ENH: created user registration and login --- exam/forms.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- exam/urls.py | 2 ++ exam/views.py | 61 ++++++++++++++++++++++++++++++---------------- 3 files changed, 113 insertions(+), 27 deletions(-) (limited to 'exam') diff --git a/exam/forms.py b/exam/forms.py index 164e334..7ee4b0e 100644 --- a/exam/forms.py +++ b/exam/forms.py @@ -1,15 +1,80 @@ from django import forms from exam.models import Profile -class UserRegisterForm(forms.ModelForm): +from django.contrib.auth import authenticate +from django.contrib.auth.models import User +from string import letters, punctuation + +UNAME_CHARS = letters + "." +PWD_CHARS = letters + punctuation + +class UserRegisterForm(forms.Form): + + username = forms.CharField(max_length=30) + email = forms.EmailField() + password = forms.CharField(max_length=30, widget=forms.PasswordInput()) + confirm_password = forms.CharField(max_length=30, widget=forms.PasswordInput()) first_name = forms.CharField(max_length=30) last_name = forms.CharField(max_length=30) roll_number = forms.CharField(max_length=30) - email_address = forms.EmailField() - #password = forms.CharField(max_length=30, widget=forms.PasswordInput()) - class Meta: - model = Profile - fields = ['first_name', 'last_name', 'roll_number'] + def clean_username(self): + u_name = self.cleaned_data["username"] + + if u_name.strip(UNAME_CHARS): + raise forms.ValidationError("Only letters and period character are \ + allowed in username") + + try: + User.objects.get(username__iexact = u_name) + raise forms.ValidationError("Username already exists") + except User.DoesNotExist: + return u_name + + def clean_password(self): + pwd = self.cleaned_data['password'] + if pwd.strip(PWD_CHARS): + raise forms.ValidationError("Only letters and punctuation are \ + allowed in password") + return pwd + + def clean_confirm_password(self): + c_pwd = self.cleaned_data['confirm_password'] + pwd = self.data['password'] + if c_pwd != pwd: + raise forms.ValidationError("Passwords do not match") + + return c_pwd + + def save(self): + u_name = self.cleaned_data["username"] + u_name = u_name.lower() + pwd = self.cleaned_data["password"] + email = self.cleaned_data['email'] + new_user = User.objects.create_user(u_name, email, pwd) + + new_user.first_name = self.cleaned_data["first_name"] + new_user.last_name = self.cleaned_data["last_name"] + new_user.save() + + new_profile = Profile(user=new_user) + new_profile.roll_number = self.cleaned_data["roll_number"] + new_profile.save() + + return new_user + +class UserLoginForm(forms.Form): + username = forms.CharField(max_length = 30) + password = forms.CharField(max_length=30, widget=forms.PasswordInput()) + + def clean(self): + super(UserLoginForm, self).clean() + u_name, pwd = self.cleaned_data["username"], self.cleaned_data["password"] + user = authenticate(username = u_name, password = pwd) + + if not user: + raise forms.ValidationError("Invalid username/password") + + return user diff --git a/exam/urls.py b/exam/urls.py index 1ca9755..e517adb 100644 --- a/exam/urls.py +++ b/exam/urls.py @@ -2,6 +2,8 @@ from django.conf.urls.defaults import patterns, include, url urlpatterns = patterns('exam.views', url(r'^$', 'index'), + url(r'^login/$', 'user_login'), + url(r'^register/$', 'user_register'), url(r'^start/$', 'start'), url(r'^quit/$', 'quit'), url(r'^complete/$', 'complete'), diff --git a/exam/views.py b/exam/views.py index 05fe792..d8a0a45 100644 --- a/exam/views.py +++ b/exam/views.py @@ -9,7 +9,7 @@ from django.contrib.auth import login, logout, authenticate from django.shortcuts import render_to_response, get_object_or_404, redirect from django.template import RequestContext from exam.models import Question, Quiz, Profile, Answer -from exam.forms import UserRegisterForm +from exam.forms import UserRegisterForm, UserLoginForm def gen_key(no_of_chars): """Generate a random key of the number of characters.""" @@ -20,6 +20,16 @@ def index(request): """The start page. """ # Largely copied from Nishanth's quiz app. + user = request.user + if user.is_authenticated(): + return redirect("/exam/start/") + + return redirect("/exam/login/") + +def user_register(request): + """ Register a new user. + Create a user and corresponding profile and store roll_number also.""" + user = request.user if user.is_authenticated(): return redirect("/exam/start/") @@ -28,34 +38,43 @@ def index(request): form = UserRegisterForm(request.POST) if form.is_valid(): data = form.cleaned_data + new_user = form.save() - while True: - try: - username = gen_key(20) - new_user = User.objects.create_user(username, "temp@temp.com", "123") - break - except IntegrityError: - pass + context = {} + context['full_name'] = new_user.first_name.title() + " " + \ + new_user.last_name.title() + return render_to_response('exam/register.html', context, + context_instance=RequestContext(request)) + + else: + return render_to_response('exam/register.html',{'form':form}, + context_instance=RequestContext(request)) + else: + form = UserRegisterForm() + return render_to_response('exam/register.html',{'form':form}, + context_instance=RequestContext(request)) - new_user.first_name = data['first_name'] - new_user.last_name = data['last_name'] - new_user.email = data['email_address'] - new_user.save() +def user_login(request): + """Take the credentials of the user and log the user in.""" - new_profile = Profile(user=new_user) - new_profile.roll_number = data['roll_number'] - new_profile.save() + user = request.user + if user.is_authenticated(): + return redirect("/exam/start/") - user = authenticate(username=username, password="123") + if request.method == "POST": + form = UserLoginForm(request.POST) + if form.is_valid(): + user = form.cleaned_data login(request, user) return redirect("/exam/start/") - else: - return render_to_response('exam/register.html',{'form':form}, - context_instance=RequestContext(request)) + context = {"form": form,} + return render_to_response('exam/login.html', context, + context_instance=RequestContext(request)) else: - form = UserRegisterForm() - return render_to_response('exam/register.html',{'form':form}, + form = UserLoginForm() + context = {"form": form} + return render_to_response('exam/login.html', context, context_instance=RequestContext(request)) def show_question(request, q_id): -- cgit