summaryrefslogtreecommitdiff
path: root/choice_seeker/allotter/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'choice_seeker/allotter/views.py')
-rw-r--r--choice_seeker/allotter/views.py260
1 files changed, 260 insertions, 0 deletions
diff --git a/choice_seeker/allotter/views.py b/choice_seeker/allotter/views.py
new file mode 100644
index 0000000..fb819fc
--- /dev/null
+++ b/choice_seeker/allotter/views.py
@@ -0,0 +1,260 @@
+from django.contrib.auth import login, logout, authenticate
+from django.contrib.auth.decorators import login_required
+from django.shortcuts import render, redirect, get_object_or_404
+
+from django.http import Http404
+from django.http import HttpResponse
+from django.http import HttpResponseRedirect
+
+from django.core.urlresolvers import reverse
+
+from django.contrib.auth.models import User
+from allotter.models import Profile, Option, Exam
+from allotter.forms import UserLoginForm, UserDetailsForm
+
+from itertools import chain
+
+#Reportlab libraries
+from reportlab.platypus import Table, TableStyle, SimpleDocTemplate, Paragraph, Spacer
+from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
+from reportlab.lib import colors
+from reportlab.lib.units import inch
+from reportlab.lib.enums import TA_JUSTIFY
+
+import time
+
+def user_login(request):
+ """
+ Verify the user credentials and log the user in.
+ """
+
+ user = request.user
+ if user.is_authenticated():
+ status = user.get_profile().application.submitted #Getting the submission status
+ if status: #If already submitted, takes to Completion Page
+ return HttpResponseRedirect(reverse('allotter.views.complete_allotment', args=(user.username,)))
+ else: #Otherwise to Option Choosing Page
+ return HttpResponseRedirect(reverse('allotter.views.apply', args=(user.username,)))
+
+ if request.method == "POST":
+ form = UserLoginForm(request.POST)
+ if form.is_valid():
+ user = form.cleaned_data
+ login(request, user)
+ status = user.get_profile().application.submitted #Getting the submission status
+ if status:
+ return HttpResponseRedirect(reverse('allotter.views.complete_allotment', args=(user.username,)))
+ else:
+ return HttpResponseRedirect(reverse('allotter.views.submit_details', args=(user.username,)))
+ else:
+ context = {"form": form}
+ return render(request, 'allotter/login.html', context)
+ else:
+ form = UserLoginForm()
+ context = {"form": form}
+ return render(request, 'allotter/login.html', context)
+
+
+@login_required
+def submit_details(request, reg_no):
+ """
+ Get the secondary email address, phone number and save it to the Profile.
+ """
+ user = request.user
+
+ if request.method == "POST":
+ form = UserDetailsForm(user, request.POST)
+ if form.is_valid():
+ data = form.cleaned_data
+ form.save()
+ return redirect("/allotter/apply/")
+ else:
+ return render(request, 'allotter/details.html', {'form':form})
+
+ else:
+ form = UserDetailsForm(request.user)
+ context = {"form": form}
+ return render(request, 'allotter/details.html', context)
+
+def get_details(user, error_message = ""):
+ """
+ Retrieves the information about Test paper(s) and options available
+ and returns them in a dictionary(context) for passing to the Template.
+ """
+ user_profile = user.get_profile()
+ user_application = user_profile.application
+ np = user_application.np #Number of Papers
+ first_paper = user_application.first_paper #First Paper Name
+ options_available_first = Option.objects.filter(exam__exam_name=first_paper).distinct() #Options for First paper
+ oafl = len(options_available_first)
+ if np == 2: #If written two exams
+ second_paper = user_application.second_paper
+ options_available_second = Option.objects.filter(exam__exam_name=second_paper).distinct()
+ oasl = len(options_available_second)
+ context = {'user': user, 'first_paper': first_paper,
+ 'options_available_first' : options_available_first,
+ 'second_paper': second_paper,
+ 'options_available_second' : options_available_second,
+ 'np' : np, 'options_range': range(1, oafl + oasl + 1, 1),
+ 'error_message': error_message}
+ else: #If written only one exam
+ context = {'user': user, 'first_paper': first_paper,
+ 'options_available_first' : options_available_first,
+ 'options_range': range(1, oafl + 1, 1),
+ 'np' : np, 'error_message' : error_message}
+ return context
+
+@login_required
+def apply(request, reg_no):
+ """
+ Displays the application page for an authenticated user.
+ """
+ user = request.user
+ if not(user.is_authenticated()):
+ return redirect('/allotter/login/')
+
+ context = get_details(user)
+
+ return render(request, 'allotter/apply.html', context)
+
+
+def user_logout(request):
+ ##Logouts the user.
+ logout(request)
+ return redirect ('/allotter/login/')
+
+#TODO: Extensive Testing
+
+@login_required
+def submit_options(request, reg_no):
+ """
+ Gets the Options and their preference number through the POST object and
+ stores them as list(sorted according to preferences). Options with None are
+ ignored.
+ """
+ user = get_object_or_404(User, username=reg_no)
+ user_profile = user.get_profile()
+ user_application = user_profile.application
+ np = user_application.np
+ first_paper = user_application.first_paper #First Paper Name
+ options_available_first = Option.objects.filter(exam__exam_name=first_paper).distinct() #Options for First paper
+
+ if np == 2: #If qualified for second paper
+ second_paper = user_application.second_paper #Second Paper Name
+ options_available_second = Option.objects.filter(exam__exam_name=second_paper).distinct() #Options for second paper
+ options_available_list = chain(options_available_first, options_available_second) #chaining the two lists
+ else:
+ options_available_list = options_available_first
+
+ options_chosen_list = [] #Initializing empty list for storing options
+ for option in options_available_list:
+ option_pref = request.POST[unicode(option.opt_code)]
+ options_chosen_list.append([option_pref, str(option.opt_code)]) #[preference, option code]
+
+ options_chosen_list.sort() #Sorting by preference
+ options_code_list = []
+ for opt in options_chosen_list:
+ if int(opt[0]): #ignoring the options for which None was marked
+ options_code_list.append(opt[1])
+
+ user_application.options_selected = options_code_list #Saving the data in model
+ user_application.submitted = True #Submission Status
+ user_application.save()
+ return HttpResponseRedirect(reverse('allotter.views.complete_allotment', args=(reg_no,)))
+
+def complete_allotment(request, reg_no):
+ """
+ Passes the chosen options queryset to the Completion Page Template
+ """
+ user = get_object_or_404(User, username=reg_no)
+ sec_email = user.get_profile().secondary_email
+ options_chosen = get_chosen_options(user)
+ context = {'username': reg_no, 'email': sec_email,
+ 'options_chosen': options_chosen}
+
+ return render(request, 'allotter/complete.html', context)
+
+
+def get_chosen_options(user):
+ """
+ Reads the options submitted by the user in the Application page
+ """
+ user_profile = user.get_profile()
+ user_application = user_profile.application
+ np = user_application.np
+ ocl = eval(user_application.options_selected)
+ chosen_options = []
+ for oc in ocl:
+ chosen_options.append(Option.objects.get(opt_code=int(oc)))
+ return chosen_options
+
+
+@login_required
+def generate_pdf(request, reg_no):
+ """
+ The Ugly code for generating the pdf using ReportLab.
+ """
+
+ user = get_object_or_404(User, username=reg_no)
+ user_profile = user.get_profile()
+ user_application = user_profile.application
+ np = user_application.np
+
+ response = HttpResponse(mimetype='application/pdf')
+ response['Content-Disposition'] = 'attachment; filename=JAM2012_Allottment.pdf'
+
+ elements = []
+ doc = SimpleDocTemplate(response)
+
+ formatted_time = time.ctime()
+ styles = getSampleStyleSheet()
+ styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
+
+ ptext = '<font size=15>JAM 2012 Allotment.</font>'
+ elements.append(Paragraph(ptext, styles["Justify"]))
+ elements.append(Spacer(4, 20))
+
+ ptext = '<font size=12>Registration Number: %s</font>' % reg_no
+ elements.append(Paragraph(ptext, styles["Normal"]))
+ elements.append(Spacer(1, 12))
+
+ ptext = '<font size=12>Number of Papers Eligible: %s</font>' % np
+ elements.append(Paragraph(ptext, styles["Normal"]))
+ elements.append(Spacer(1, 12))
+
+ ptext = '<font size=12>No options were chosen.</font>'
+ elements.append(Paragraph(ptext, styles["Normal"]))
+ elements.append(Spacer(1, 12))
+
+ data = []
+ options = get_chosen_options(user) ##Put a check to show when the options chosen is empty
+
+ if not(options):
+ doc.build(elements)
+ return response
+
+ ptext = '<font size=12>Following are the options in order of preference</font>'
+ elements.append(Paragraph(ptext, styles["Normal"]))
+ elements.append(Spacer(1, 12))
+
+ counter = 1
+ for opt in options:
+ data.append([counter, opt.opt_code, opt.opt_location, opt.opt_name])
+ counter = counter + 1
+
+ t = Table(data)
+ t.setStyle(TableStyle([('GRID',(0,0),(3,len(options)),1,colors.black),
+ ('TEXTCOLOR',(0,0),(0,-1),colors.green)]))
+
+ elements.append(t)
+
+ ptext = '<font size=12>%s</font>' % formatted_time
+ elements.append(Paragraph(ptext, styles["Normal"]))
+ elements.append(Spacer(1, 12))
+
+ doc.build(elements)
+
+ return response
+
+
+