diff options
Diffstat (limited to 'allotter')
-rw-r--r-- | allotter/__init__.py | 2 | ||||
-rw-r--r-- | allotter/forms.py | 111 | ||||
-rw-r--r-- | allotter/migrations/0002_auto__add_field_option_exam.py | 91 | ||||
-rw-r--r-- | allotter/migrations/0003_auto__del_field_profile_roll_number__add_field_profile_application_num.py | 142 | ||||
-rw-r--r-- | allotter/models.py | 60 | ||||
-rw-r--r-- | allotter/urls.py | 8 | ||||
-rw-r--r-- | allotter/views.py | 78 |
7 files changed, 471 insertions, 21 deletions
diff --git a/allotter/__init__.py b/allotter/__init__.py index e69de29..b48e5a0 100644 --- a/allotter/__init__.py +++ b/allotter/__init__.py @@ -0,0 +1,2 @@ +import os + diff --git a/allotter/forms.py b/allotter/forms.py new file mode 100644 index 0000000..0623ff5 --- /dev/null +++ b/allotter/forms.py @@ -0,0 +1,111 @@ + +from django import forms +from allotter.models import Profile +from django.forms.extras.widgets import SelectDateWidget + +from django.contrib.auth import authenticate +from django.contrib.auth.models import User + +from string import digits, letters, punctuation + +from allotter.models import BIRTH_YEAR_CHOICES, GENDER_CHOICES, EXAMINATION_SUBJECTS, CATEGORIES + +PWD_CHARS = letters + punctuation + digits + +class RegistrationForm(forms.Form): + #5 Digit Registration Number would be used as username + username = forms.IntegerField(help_text="Enter your Registration Number") + + password = forms.CharField(max_length=30, + widget=forms.PasswordInput()) + + confirm_password = forms.CharField(max_length=30, + widget=forms.PasswordInput()) + + email = forms.EmailField() + + first_name = forms.CharField(max_length=30) + last_name = forms.CharField(max_length=30) + + app_no = forms.IntegerField(help_text="Enter your Application Number") + + exam_code = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, + choices=EXAMINATION_SUBJECTS, + help_text="Options available depends on the qualified Exam") + + #All India Rank + air = forms.DecimalField(help_text="All India Rank") + + dob = forms.DateField(widget=SelectDateWidget(years=BIRTH_YEAR_CHOICES)) + + gender = forms.ChoiceField(widget=forms.RadioSelect, choices=GENDER_CHOICES) + category = forms.ChoiceField(widget=forms.RadioSelect, choices=CATEGORIES) + + #Physical Disability + pd = forms.BooleanField() + + + def clean_username(self): + u_name = self.cleaned_data["username"] + + if str(u_name).strip(digits) and len(u_name) != 7: + msg = "Not a valid Registration Number" + raise forms.ValidationError(msg) + + try: + User.objects.get(username__exact = u_name) + raise forms.ValidationError("Registration Number 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, digits and punctuation \ + are allowed in password") + + 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"] + 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() + cleaned_data = self.cleaned_data + new_profile = Profile(user=new_user) + new_profile.exam_code = cleaned_data["exam_code"] + new_profile.gender = cleaned_data["gender"] + new_profile.rank = cleaned_data["air"] + new_profile.category = cleaned_data["category"] + new_profile.dob = cleaned_date["dob"] + new_profile.application_number = cleaned_data["app_no"] + new_profile.save() + + return u_name, pwd + +class UserLoginForm(forms.Form): + username = forms.IntegerField(help_text="Registration Number of Applicant") + password = forms.CharField(max_length=30, widget=forms.PasswordInput(), + help_text="Keep it safe") + + 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/allotter/migrations/0002_auto__add_field_option_exam.py b/allotter/migrations/0002_auto__add_field_option_exam.py new file mode 100644 index 0000000..9d6773c --- /dev/null +++ b/allotter/migrations/0002_auto__add_field_option_exam.py @@ -0,0 +1,91 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding field 'Option.exam' + db.add_column('allotter_option', 'exam', self.gf('django.db.models.fields.related.ForeignKey')(default=1, to=orm['allotter.Exam']), keep_default=False) + + + def backwards(self, orm): + + # Deleting field 'Option.exam' + db.delete_column('allotter_option', 'exam_id') + + + models = { + 'allotter.application': { + 'Meta': {'object_name': 'Application'}, + 'editable': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'exam_taken': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['allotter.Exam']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['allotter.Option']", 'symmetrical': 'False'}), + 'profile': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['allotter.Profile']"}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '24'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'allotter.exam': { + 'Meta': {'object_name': 'Exam'}, + 'exam_code': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'exam_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'allotter.option': { + 'Meta': {'object_name': 'Option'}, + 'exam': ('django.db.models.fields.related.ForeignKey', [], {'default': '1', 'to': "orm['allotter.Exam']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'opt_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'seats': ('django.db.models.fields.IntegerField', [], {}) + }, + 'allotter.profile': { + 'Meta': {'object_name': 'Profile'}, + 'category': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'dob': ('django.db.models.fields.DateTimeField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'roll_number': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['allotter'] diff --git a/allotter/migrations/0003_auto__del_field_profile_roll_number__add_field_profile_application_num.py b/allotter/migrations/0003_auto__del_field_profile_roll_number__add_field_profile_application_num.py new file mode 100644 index 0000000..b198a47 --- /dev/null +++ b/allotter/migrations/0003_auto__del_field_profile_roll_number__add_field_profile_application_num.py @@ -0,0 +1,142 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Deleting field 'Profile.roll_number' + db.delete_column('allotter_profile', 'roll_number') + + # Adding field 'Profile.application_number' + db.add_column('allotter_profile', 'application_number', self.gf('django.db.models.fields.IntegerField')(default=1, max_length=20), keep_default=False) + + # Adding field 'Profile.exam_code' + db.add_column('allotter_profile', 'exam_code', self.gf('django.db.models.fields.CharField')(default=1, max_length=30), keep_default=False) + + # Adding field 'Profile.rank' + db.add_column('allotter_profile', 'rank', self.gf('django.db.models.fields.IntegerField')(default=0, max_length=6), keep_default=False) + + # Adding field 'Profile.gender' + db.add_column('allotter_profile', 'gender', self.gf('django.db.models.fields.CharField')(default='M', max_length=10), keep_default=False) + + # Adding field 'Profile.pd' + db.add_column('allotter_profile', 'pd', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False) + + # Deleting field 'Option.exam' + db.delete_column('allotter_option', 'exam_id') + + # Adding M2M table for field exam on 'Option' + db.create_table('allotter_option_exam', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('option', models.ForeignKey(orm['allotter.option'], null=False)), + ('exam', models.ForeignKey(orm['allotter.exam'], null=False)) + )) + db.create_unique('allotter_option_exam', ['option_id', 'exam_id']) + + + def backwards(self, orm): + + # Adding field 'Profile.roll_number' + db.add_column('allotter_profile', 'roll_number', self.gf('django.db.models.fields.CharField')(default='', max_length=20), keep_default=False) + + # Deleting field 'Profile.application_number' + db.delete_column('allotter_profile', 'application_number') + + # Deleting field 'Profile.exam_code' + db.delete_column('allotter_profile', 'exam_code') + + # Deleting field 'Profile.rank' + db.delete_column('allotter_profile', 'rank') + + # Deleting field 'Profile.gender' + db.delete_column('allotter_profile', 'gender') + + # Deleting field 'Profile.pd' + db.delete_column('allotter_profile', 'pd') + + # Adding field 'Option.exam' + db.add_column('allotter_option', 'exam', self.gf('django.db.models.fields.related.ForeignKey')(default=1, to=orm['allotter.Exam']), keep_default=False) + + # Removing M2M table for field exam on 'Option' + db.delete_table('allotter_option_exam') + + + models = { + 'allotter.application': { + 'Meta': {'object_name': 'Application'}, + 'editable': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'exam_taken': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['allotter.Exam']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'options': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['allotter.Option']", 'symmetrical': 'False'}), + 'profile': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['allotter.Profile']"}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '24'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'allotter.exam': { + 'Meta': {'object_name': 'Exam'}, + 'exam_code': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'exam_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'allotter.option': { + 'Meta': {'object_name': 'Option'}, + 'exam': ('django.db.models.fields.related.ManyToManyField', [], {'default': '1', 'to': "orm['allotter.Exam']", 'symmetrical': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'opt_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'seats': ('django.db.models.fields.IntegerField', [], {}) + }, + 'allotter.profile': { + 'Meta': {'object_name': 'Profile'}, + 'application_number': ('django.db.models.fields.IntegerField', [], {'max_length': '20'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'dob': ('django.db.models.fields.DateTimeField', [], {}), + 'exam_code': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'gender': ('django.db.models.fields.CharField', [], {'max_length': '10'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pd': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'rank': ('django.db.models.fields.IntegerField', [], {'max_length': '6'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['allotter'] diff --git a/allotter/models.py b/allotter/models.py index 20814e7..44b86e0 100644 --- a/allotter/models.py +++ b/allotter/models.py @@ -10,8 +10,10 @@ EXAMINATION_SUBJECTS = ( ) CATEGORIES = ( - ("GEN", "GENERAL"), - ("OBC", "OTHER BACKWARD CASTE"), + ("GEN", "GEN"), + ("OBC", "OBC(Non-Creamy Layer)"), + ("SC", "SC"), + ("ST", "ST"), ) AVAILABLE_OPTIONS = ( @@ -27,22 +29,10 @@ APPLICATION_STATUS = ( ("I", "Incomplete"), ("Submitted", "Submitted")) +BIRTH_YEAR_CHOICES = ('1989', '1990', '1991') -class Option(models.Model): - - opt_name = models.CharField(max_length=100, - verbose_name=u"Option name", - help_text=u"Name of Option/Stream", - choices = AVAILABLE_OPTIONS) - - seats = models.IntegerField(verbose_name=u"Seats available") - - class Meta: - verbose_name_plural = "Options" - - def __unicode__(self): - return self.opt_name +DEFAULT_EXAM_ID = 1 class Exam(models.Model): @@ -59,21 +49,47 @@ class Exam(models.Model): return self.exam_name +class Option(models.Model): + + opt_name = models.CharField(max_length=100, + verbose_name=u"Option name", + help_text=u"Name of Option/Stream", + choices = AVAILABLE_OPTIONS) + + seats = models.IntegerField(verbose_name=u"Seats available") + + exam = models.ManyToManyField(Exam, default=DEFAULT_EXAM_ID) + + class Meta: + verbose_name_plural = "Options" + + def __unicode__(self): + return self.opt_name + + class Profile(models.Model): user = models.OneToOneField(User) - roll_number = models.CharField(max_length=20, - verbose_name=u"Examination Roll number", - help_text=u"Roll number as per the Examination Hall ticket") + application_number = models.IntegerField(max_length=20, + verbose_name=u"Examination Application number", + help_text=u"Application number as per the Examination Hall ticket") dob = models.DateTimeField(verbose_name=u"Date of Birth", help_text=u"Date of birth as given in the application") category = models.CharField(max_length=30, choices=CATEGORIES) + exam_code = models.CharField(max_length=30, choices=EXAMINATION_SUBJECTS) + + rank = models.IntegerField(max_length=6) + + gender = models.CharField(max_length=10, choices=GENDER_CHOICES) + + pd = models.BooleanField(default=False) + def __unicode__(self): - return self.name + return self.user.application_number class Application(models.Model): """An application for the student - one per student @@ -92,6 +108,10 @@ class Application(models.Model): editable = models.BooleanField(default=True) + def is_application_editable(self): + if self.status == "I": return True + else: return False + def __unicode__(self): u = self.user return u'Application for {0} {1}'.format(u.first_name, u.last_name) diff --git a/allotter/urls.py b/allotter/urls.py new file mode 100644 index 0000000..349c645 --- /dev/null +++ b/allotter/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls.defaults import patterns, url + +urlpatterns = patterns('allotter.views', + url(r'^$', 'index'), + url(r'^login/$', 'user_login'), + url(r'^register/$', 'user_register'), + url(r'^hello/$', 'hello'), +) diff --git a/allotter/views.py b/allotter/views.py index 60f00ef..037941f 100644 --- a/allotter/views.py +++ b/allotter/views.py @@ -1 +1,77 @@ -# Create your views here. +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 django.http import Http404 + +from allotter.models import Profile +from allotter.forms import RegistrationForm, UserLoginForm + +from settings import URL_ROOT + +def index(request): + """The start page. + """ + user = request.user + if user.is_authenticated(): + return redirect("/allotter/hello/") + + return redirect("/allotter/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("/allotter/hello/") + + if request.method == "POST": + form = RegistrationForm(request.POST) + if form.is_valid(): + data = form.cleaned_data + u_name, pwd = form.save() + + new_user = authenticate(username = u_name, password = pwd) + login(request, new_user) + return redirect("/allotter/login/") + + else: + return render_to_response('allotter/register.html', + {'form':form}, + context_instance=RequestContext(request)) + else: + form = RegistrationForm() + return render_to_response('allotter/register.html', + {'form':form}, + context_instance=RequestContext(request)) + +def user_login(request): + """Take the credentials of the user and log the user in.""" + + user = request.user + if user.is_authenticated(): + return redirect("/allotter/hello/") + + if request.method == "POST": + form = UserLoginForm(request.POST) + if form.is_valid(): + user = form.cleaned_data + login(request, user) + return redirect("/allotter/hello/") + else: + context = {"form": form} + return render_to_response('allotter/login.html', context, + context_instance=RequestContext(request)) + else: + form = UserLoginForm() + context = {"form": form} + return render_to_response('allotter/login.html', context, + context_instance=RequestContext(request)) + +def hello(request): + user = request.user + context = {'user': user} + ci = RequestContext(request) + return render_to_response('allotter/hello.html', context, + context_instance=ci) + |