summaryrefslogtreecommitdiff
path: root/statistics_app/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'statistics_app/views.py')
-rw-r--r--statistics_app/views.py455
1 files changed, 455 insertions, 0 deletions
diff --git a/statistics_app/views.py b/statistics_app/views.py
new file mode 100644
index 0000000..be79a78
--- /dev/null
+++ b/statistics_app/views.py
@@ -0,0 +1,455 @@
+from workshop_app.forms import (
+ UserRegistrationForm, UserLoginForm,
+ ProfileForm, CreateWorkshop,
+ ProposeWorkshopDateForm
+)
+from workshop_app.models import (
+ Profile, User,
+ has_profile, Workshop,
+ WorkshopType, RequestedWorkshop,
+ BookedWorkshop, ProposeWorkshopDate,
+ Testimonial
+)
+from django.template.loader import get_template
+from django.template import RequestContext
+from datetime import datetime, date
+from django.contrib.auth import login, logout, authenticate
+from django.contrib.auth.decorators import login_required
+from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
+from django.shortcuts import render, redirect
+from django.db import IntegrityError
+from django.utils import timezone
+from django.http import HttpResponse, HttpResponseRedirect
+from django.conf import settings
+from os import listdir, path, sep
+from zipfile import ZipFile
+from django.contrib import messages
+import datetime as dt
+import csv
+try:
+ from StringIO import StringIO as string_io
+except ImportError:
+ from io import BytesIO as string_io
+
+
+# Create your views here.
+def check_workshop_type(x):
+ try:
+ y = datetime.strftime(x.proposed_workshop_date, '%d-%m-%Y')
+ except BaseException:
+ y = datetime.strftime(x.requested_workshop_date, '%d-%m-%Y')
+ return y
+
+
+def is_instructor(user):
+ '''Check if the user is having instructor rights'''
+ return True if user.groups.filter(name='instructor').count() > 0 else False
+
+
+def is_email_checked(user):
+ if hasattr(user, 'profile'):
+ return True if user.profile.is_email_verified else False
+ else:
+ return False
+
+
+def pie_chart():
+ '''This function gives Data for drawring Pie Chart'''
+
+ # Count Total Number of workshops for each type
+ workshop_titles = WorkshopType.objects.all()
+ workshoptype_dict = {}
+ for title in workshop_titles:
+ workshoptype_dict[title] = 0
+
+ for title in workshoptype_dict.keys():
+ workshoptype_dict[title] += RequestedWorkshop.objects.filter(
+ requested_workshop_title=title,
+ status='ACCEPTED').count()
+ workshoptype_dict[title] += ProposeWorkshopDate.objects.filter(
+ proposed_workshop_title=title,
+ status='ACCEPTED').count()
+
+ # For Pie Chart
+ workshoptype_num = []
+ workshoptype_title = []
+ for title in workshoptype_dict.keys():
+ workshoptype_title.append(str(title))
+
+ for count in workshoptype_dict.values():
+ workshoptype_num.append(count)
+
+ workshoptype_count = [workshoptype_title, workshoptype_num]
+ del workshoptype_title, workshoptype_num
+
+ return workshoptype_count
+
+
+
+def india_map():
+ '''This function returns count of workshops based on states in India.'''
+
+ states = [
+ ['Code', 'State', 'Number'],
+ ["IN-AP", "Andhra Pradesh", 0],
+ ["IN-AR", "Arunachal Pradesh", 0],
+ ["IN-AS", "Assam", 0],
+ ["IN-BR", "Bihar", 0],
+ ["IN-CT", "Chhattisgarh", 0],
+ ["IN-GA", "Goa", 0],
+ ["IN-GJ", "Gujarat", 0],
+ ["IN-HR", "Haryana", 0],
+ ["IN-HP", "Himachal Pradesh", 0],
+ ["IN-JK", "Jammu and Kashmir", 0],
+ ["IN-JH", "Jharkhand", 0],
+ ["IN-KA", "Karnataka", 0],
+ ["IN-KL", "Kerala", 0],
+ ["IN-MP", "Madhya Pradesh", 0],
+ ["IN-MH", "Maharashtra", 0],
+ ["IN-MN", "Manipur", 0],
+ ["IN-ML", "Meghalaya", 0],
+ ["IN-MZ", "Mizoram", 0],
+ ["IN-NL", "Nagaland", 0],
+ ["IN-OR", "Odisha", 0],
+ ["IN-PB", "Punjab", 0],
+ ["IN-RJ", "Rajasthan", 0],
+ ["IN-SK", "Sikkim", 0],
+ ["IN-TN", "Tamil Nadu", 0],
+ ["IN-TG", "Telangana", 0],
+ ["IN-TR", "Tripura", 0],
+ ["IN-UT", "Uttarakhand", 0],
+ ["IN-UP", "Uttar Pradesh", 0],
+ ["IN-WB", "West Bengal", 0],
+ ["IN-AN", "Andaman and Nicobar Islands", 0],
+ ["IN-CH", "Chandigarh", 0],
+ ["IN-DN", "Dadra and Nagar Haveli", 0],
+ ["IN-DD", "Daman and Diu", 0],
+ ["IN-DL", "Delhi", 0],
+ ["IN-LD", "Lakshadweep", 0],
+ ["IN-PY", "Puducherry", 0]
+ ]
+ workshop_state = []
+ requestedWorkshops = RequestedWorkshop.objects.filter(status='ACCEPTED')
+ proposedWorkshops = ProposeWorkshopDate.objects.filter(status='ACCEPTED')
+ for workshop in requestedWorkshops:
+ for s in states:
+ if s[0] == workshop.requested_workshop_coordinator.profile.state:
+ s[2] += 1
+
+ for workshop in proposedWorkshops:
+ for s in states:
+ if s[0] == workshop.proposed_workshop_coordinator.profile.state:
+ s[2] += 1
+
+ return states
+
+
+
+@login_required
+def workshop_stats(request):
+ user = request.user
+ today = datetime.now()
+ upto = today + dt.timedelta(days=15)
+
+ # For Monthly Chart
+ workshop_count = [0] * 12
+ for x in range(12):
+ workshop_count[x] += RequestedWorkshop.objects.filter(
+ requested_workshop_date__year=str(today.year),
+ requested_workshop_date__month=str(x + 1),
+ status='ACCEPTED').count()
+ workshop_count[x] += ProposeWorkshopDate.objects.filter(
+ proposed_workshop_date__year=str(today.year),
+ proposed_workshop_date__month=str(x + 1),
+ status='ACCEPTED').count()
+
+ # For Pie Chart
+ workshoptype_count = pie_chart()
+
+ # For India Map
+ states = india_map()
+
+ # For Data Downloading and Viewing
+ if request.method == 'POST':
+ try:
+ from_dates = request.POST.get('from')
+ to_dates = request.POST.get('to')
+
+ # Fetches Accepted workshops which were proposed by Coordinators
+ proposed_workshops = ProposeWorkshopDate.objects.filter(
+ proposed_workshop_date__range=(from_dates, to_dates),
+ status='ACCEPTED'
+ )
+
+ # Fetches Accepted workshops which were Accepted by
+ # Instructors based on their Availability
+ requested_workshops = RequestedWorkshop.objects.filter(
+ requested_workshop_date__range=(from_dates, to_dates),
+ status='ACCEPTED'
+ )
+
+ upcoming_workshops = []
+
+ for workshop in proposed_workshops:
+ upcoming_workshops.append(workshop)
+
+ for workshop in requested_workshops:
+ upcoming_workshops.append(workshop)
+
+ upcoming_workshops = sorted(upcoming_workshops,
+ key=lambda x: check_workshop_type(x))
+
+ download = request.POST.get('Download')
+ if download:
+ response = HttpResponse(content_type='text/csv')
+
+ response['Content-Disposition'] = 'attachment;\
+ filename="records_from_{0}_to_{1}.csv"'.format(
+ from_dates, to_dates
+ )
+
+ writer = csv.writer(response)
+ header = [
+ 'coordinator name',
+ 'instructor name',
+ 'workshop',
+ 'date',
+ 'status',
+ 'institute name'
+ ]
+
+ writer.writerow(header)
+
+ for workshop in upcoming_workshops:
+ try:
+ row = [
+ workshop.proposed_workshop_coordinator,
+ workshop.proposed_workshop_instructor,
+ workshop.proposed_workshop_title,
+ workshop.proposed_workshop_date,
+ workshop.status,
+ workshop.proposed_workshop_coordinator.profile.institute]
+
+ except BaseException:
+ row = [
+ workshop.requested_workshop_coordinator,
+ workshop.requested_workshop_instructor,
+ workshop.requested_workshop_title,
+ workshop.requested_workshop_date,
+ workshop.status,
+ workshop.requested_workshop_coordinator.profile.institute]
+
+ writer.writerow(row)
+ return response
+ else:
+ return render(request,
+ 'statistics_app/workshop_stats.html',
+ {"upcoming_workshops": upcoming_workshops,
+ "show_workshop_stats": settings.SHOW_WORKSHOP_STATS,
+ "workshop_count": workshop_count,
+ "workshoptype_count": workshoptype_count,
+ "india_map": states})
+ except BaseException:
+ messages.info(request, 'Please enter Valid Dates')
+
+ if is_instructor(user) and is_email_checked(user):
+ try:
+ # Fetches Accepted workshops which were proposed by Coordinators
+ proposed_workshops = ProposeWorkshopDate.objects.filter(
+ proposed_workshop_date__range=(today, upto),
+ status='ACCEPTED'
+ )
+
+ # Fetches Accepted workshops which were Accepted by
+ # Instructors based on their Availability
+ requested_workshops = RequestedWorkshop.objects.filter(
+ requested_workshop_date__range=(today, upto),
+ status='ACCEPTED'
+ )
+
+ upcoming_workshops = []
+ for workshop in proposed_workshops:
+ upcoming_workshops.append(workshop)
+
+ for workshop in requested_workshops:
+ upcoming_workshops.append(workshop)
+
+ upcoming_workshops = sorted(upcoming_workshops,
+ key=lambda x: check_workshop_type(x))
+
+ except BaseException:
+ upcoming_workshops = []
+
+ paginator = Paginator(upcoming_workshops, 12)
+
+ page = request.GET.get('page')
+ try:
+ upcoming_workshops = paginator.page(page)
+ except PageNotAnInteger:
+ # If page is not an integer, deliver first page.
+ upcoming_workshops = paginator.page(1)
+ except EmptyPage:
+ # If page is out of range(e.g 999999), deliver last page.
+ upcoming_workshops = paginator.page(paginator.num_pages)
+
+ return render(request, 'statistics_app/workshop_stats.html',
+ {
+ "upcoming_workshops": upcoming_workshops,
+ "show_workshop_stats": settings.SHOW_WORKSHOP_STATS,
+ "workshop_count": workshop_count,
+ "workshoptype_count": workshoptype_count,
+ "india_map": states
+ })
+ else:
+ return redirect('/statistics/public_stats/')
+
+
+def workshop_public_stats(request):
+ user = request.user
+ today = datetime.now()
+ upto = today + dt.timedelta(days=15)
+
+ #For Pie Chart
+ workshoptype_count = pie_chart()
+
+ # For India Map
+ states = india_map()
+
+ # Select By WorkshopType
+ workshoptype_list = list(WorkshopType.objects.all())
+ workshoptype_list.append('all')
+
+ # For Data Viewing
+ if request.method == 'POST':
+ workshop_list = []
+
+ try:
+ from_dates = request.POST.get('from')
+ to_dates = request.POST.get('to')
+ selected_state = request.POST.get('states')
+ selected_workshoptype = request.POST.get('workshoptype_name')
+ if selected_state == 'all':
+ # If dates not passed
+ if len(from_dates) == 0 and len(to_dates) == 0:
+ from_dates = '2017-01-01'
+ to_dates = upto
+ # If SelectedWorkshopType is 'All'
+ if len(selected_workshoptype) == 0:
+ # Fetches Accepted workshops which were proposed by
+ # Coordinators
+ proposed_workshops = ProposeWorkshopDate.objects.filter(
+ proposed_workshop_date__range=(from_dates, to_dates),
+ status='ACCEPTED'
+ )
+
+ # Fetches Accepted workshops which were Accepted by
+ # Instructors based on their Availability
+ requested_workshops = RequestedWorkshop.objects.filter(
+ requested_workshop_date__range=(from_dates, to_dates),
+ status='ACCEPTED'
+ )
+
+ else:
+ # Fetches Accepted workshops which were proposed by
+ # Coordinators
+ proposed_workshops = ProposeWorkshopDate.objects.filter(
+ proposed_workshop_date__range=(from_dates, to_dates),
+ status='ACCEPTED', proposed_workshop_title_id=int(selected_workshoptype)
+ )
+
+ # Fetches Accepted workshops which were Accepted by
+ # Instructors based on their Availability
+ requested_workshops = RequestedWorkshop.objects.filter(
+ requested_workshop_date__range=(from_dates, to_dates),
+ status='ACCEPTED', requested_workshop_title_id=int(selected_workshoptype)
+ )
+
+ for workshop in proposed_workshops:
+ workshop_list.append(workshop)
+
+ for workshop in requested_workshops:
+ workshop_list.append(workshop)
+
+ else:
+ # If dates not passed
+ if len(from_dates) == 0 and len(to_dates) == 0:
+ from_dates = '2017-01-01'
+ to_dates = upto
+
+ # Get list of coordinators
+ coordinators_state_wise = Profile.objects.filter(
+ state=selected_state)
+
+ if len(selected_workshoptype) == 0:
+ # Traverse through list of coordinators and append
+ # workshop_list
+ for coordinator in coordinators_state_wise:
+ # Fetches Accepted workshops which were proposed by
+ # Coordinators
+ proposed_workshops = ProposeWorkshopDate.objects.filter(
+ proposed_workshop_date__range=(
+ from_dates,
+ to_dates),
+ status='ACCEPTED',
+ proposed_workshop_coordinator=coordinator.user_id)
+
+ # Fetches Accepted workshops which were Accepted by
+ # Instructors based on their Availability
+ requested_workshops = RequestedWorkshop.objects.filter(
+ requested_workshop_date__range=(
+ from_dates,
+ to_dates),
+ status='ACCEPTED',
+ requested_workshop_coordinator=coordinator.user_id)
+
+ for workshop in proposed_workshops:
+ workshop_list.append(workshop)
+
+ for workshop in requested_workshops:
+ workshop_list.append(workshop)
+
+ else:
+ # Traverse through list of coordinators and append
+ # workshop_list
+ for coordinator in coordinators_state_wise:
+ # Fetches Accepted workshops which were proposed by
+ # Coordinators
+ proposed_workshops = ProposeWorkshopDate.objects.filter(
+ proposed_workshop_date__range=(
+ from_dates,
+ to_dates),
+ status='ACCEPTED', proposed_workshop_title_id=int(selected_workshoptype),
+ proposed_workshop_coordinator=coordinator.user_id)
+
+ # Fetches Accepted workshops which were Accepted by
+ # Instructors based on their Availability
+ requested_workshops = RequestedWorkshop.objects.filter(
+ requested_workshop_date__range=(
+ from_dates,
+ to_dates),
+ status='ACCEPTED', requested_workshop_title_id=int(selected_workshoptype),
+ requested_workshop_coordinator=coordinator.user_id)
+
+ for workshop in proposed_workshops:
+ workshop_list.append(workshop)
+
+ for workshop in requested_workshops:
+ workshop_list.append(workshop)
+
+ return render(request,
+ 'statistics_app/workshop_public_stats.html',
+ {
+ "workshoptype_list": workshoptype_list[::-1],
+ "workshop_list": workshop_list,
+ "workshoptype_count": workshoptype_count,
+ "india_map": states})
+
+ except BaseException:
+ messages.info(request, 'Please enter Valid Dates')
+
+ return render(request,
+ 'statistics_app/workshop_public_stats.html',
+ {
+ "workshoptype_list": workshoptype_list[::-1],
+ "workshoptype_count": workshoptype_count,
+ "india_map": states})