pulling

parent 917d940b
This diff is collapsed.
# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2018-11-25 15:11
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ARFA_app', '0003_auto_20181125_1102'),
]
operations = [
migrations.AlterField(
model_name='test',
name='max_marks',
field=models.IntegerField(null=True),
),
]
......@@ -3,40 +3,140 @@
{%block title%}
View personal Question
{%endblock%}
{%block head%}
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('visualization', '1.0', {'packages':['corechart']});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = new google.visualization.DataTable();
// data.addColumn('string', 'Number');
data.addColumn('string', 'bin');
data.addColumn('number', 'Count');
// data.addRows( [['100',10],['90',9],['80',8]] );
data.addRows( {{distribution|safe}} );
console.log(data)
var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
chart.draw(data, {width: 500, height: 300, title: "Scores Distribution"});
}
</script>
{%endblock%}
{%block body%}
<h1 style="text-align:center"> You CAN VIEW student test performance prof {{username}}</h1>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
<div class="container">
<div class="panel-default">
<div class="panel-heading">
<h3 class="panel-title"> Student Performance </h3>
<h3 class="panel-title"> Test Stats </h3>
</div>
<ul class="list-group">
<!-- <ul> -->
<!-- {%for test in tests%} -->
<!-- <li class="list-group-item"> -->
<li class="list-group-item">
<div class="row toggle">
<div id="c1" class="col-xs-10" style="float:left;width:50%">
<p> Average Score : {{test_aggregates.avg_marks}}</p>
<p>Best Score : {{test_aggregates.max_marks}} </p>
<p>Minimum score : {{test_aggregates.max_marks}} </p>
<p>Students appeared : {{test_aggregates.students_appeared}}</p>
</div>
<div class="col-xs-10" style="float: right;width:50%" id="chart_div"> </div>
</div>
<!-- <div>
<hr></hr>
</div> -->
</li>
</ul>
<!-- <div id="chart_div" > </div> -->
<div class="panel-heading">
<h3 class="panel-title"> Student Performance </h3>
</div>
<ul class="list-group">
{%for p in student_performance%}
<li class="list-group-item">
<!-- <li> -->
<div class="row toggle">
<div class="col-xs-10">
{{student_performance}}
<p> student: {{p.student_id}}</p>
<p> rank: {{p.rank}}</p>
<p> Score: {{p.marks}}</p>
</div>
<!-- <form method="POST" action="ViewPerformence">
<input name="testID" value="{{test.test_ID}}" type="hidden">
<button>View Performence</button>
</form>
<form method="POST" action="EditTest">
<input name="testID" value="{{test.test_ID}}" type="hidden">
<button>Edit Test</button>
</form> -->
</div>
<!-- <div class="container"> -->
<!-- <div class="fluid-row"> -->
<!-- <ul>
{%for option in question.option_details%}
{%if option.is_answer %}
<li>
<p style="color: green"> {{option.option_text}} </p>
</li>
{%else%}
<li>
{{option.option_text}}
</li>
{%endif%}
{%endfor%}
</ul> -->
<!-- </div> -->
<!-- </div> -->
</li>
{%endfor%}
<div>
<hr></hr>
</ul>
<div class="panel-heading">
<h3 class="panel-title"> Per Question stats </h3>
</div>
<ul class="list-group">
{%for q in question_stats%}
<li class="list-group-item">
<!-- <li> -->
<div class="row toggle">
<div class="col-xs-10">
<p> Question: {{q.question_text}} </p>
<p> Difficulty set: {{q.difficulty_set}}</p>
<p> Difficulty observed: {{q.difficulty_observed}}</p>
</div>
</div>
<!-- </li> -->
<!-- {%endfor%} -->
<!-- <div class="container"> -->
<!-- <div class="fluid-row"> -->
<!-- <ul>
{%for option in question.option_details%}
{%if option.is_answer %}
<li>
<p style="color: green"> {{option.option_text}} </p>
</li>
{%else%}
<li>
{{option.option_text}}
</li>
{%endif%}
{%endfor%}
</ul> -->
<!-- </div> -->
<!-- </div> -->
</li>
{%endfor%}
</ul>
</div>
</div>
{%endblock%}
\ No newline at end of file
{%endblock%}
<!--
{%for p in student_performance%}
{{p}}
{%endfor%}
-->
\ No newline at end of file
......@@ -21,7 +21,7 @@ My Tests
<p>{{t.test_name}}</p>
</div>
<div style="float:right">
<form method="POST" action="arfa/loadStudentTest">
<form method="POST" action="loadStudentTest">
{% csrf_token %}
<input name="testID" value="{{t.test_ID}}" type="hidden">
<button >Load Test</button>
......
......@@ -18,7 +18,11 @@ View personal Question
<!-- <li> -->
<div class="row toggle">
<div class="col-xs-10">
{{test}}
<p> <h4> {{test.test_name}} </h4> </p>
<p> Start Time : {{test.start_time}} </p>
<p> Duration : {{test.duration}} </p>
<p> {{test.max_marks}} </p>
</div>
<form method="POST" action="viewTestPerformance">
{% csrf_token %}
......
......@@ -20,6 +20,8 @@ from django.db import IntegrityError
from django.db.models import F
from pprint import pprint
import datetime
import matplotlib.pyplot as plt
import numpy as np
def evaluate(responses, otherData):
"""responses contains a list of dicts of the form {q_ID: [option1, option2 ..]}
......@@ -121,8 +123,122 @@ def get_all_questions(request):
"ARFA_app_options" as o,"ARFA_app_subject" as s
WHERE ( q.faculty_id = %s or q.visibility='public' ) and s."subject_ID" = q."subject_ID_id" and q."q_ID" = o."q_ID_id"
order by s.subject,q_ID ''',[args['username']])
res = get_questions_dict(cursor)
return res
def result_analysis(request,test_ID):
if(request.session.get('session',None)!=True):
return render(request,'ARFA_app/login.html')
cursor = connection.cursor()
cursor.execute(''' SELECT student_id,total_marks as marks,rank
FROM "ARFA_app_takes"
WHERE "test_ID_id" = %s
order by total_marks desc ''',[test_ID])
rows = cursor.fetchall()
print rows
columns = [col[0] for col in cursor.description]
res_stud = []
for val in rows:
res_stud.append(dict(zip(columns,val)))
cursor = connection.cursor()
cursor.execute(''' SELECT avg(total_marks) as avg_marks,min(total_marks) as min_marks
,max(total_marks) as max_marks, count(student_id) as students_appeared
FROM "ARFA_app_takes"
WHERE "test_ID_id" = %s''',[test_ID])
rows = cursor.fetchall()
print rows
columns = [col[0] for col in cursor.description]
res_agg=dict(zip(columns,rows[0]))
cursor = connection.cursor()
cursor.execute(''' SELECT floor(total_marks/10) as left_bin,count(student_ID) as cnt
FROM "ARFA_app_takes"
WHERE "test_ID_id" = %s
GROUP BY total_marks/10
order by left_bin''',[test_ID])
hist = cursor.fetchall()
y = int(list(hist[-1])[0])
print y
hist = [ [str(str(int(x[0]))+"-"+str(int(x[0])+10)),int(x[1])] for x in hist]
print hist
# hist = []
# label = []
# x=0
# for val in rows:
# hist.append(val[1])
# label.append(str(int(val[0]))+"-"+str(int(val[0])+10))
# x=int(val[0])
y = y+10
for i in range(15):
hist.append([str(str(y)+"-"+str(y+10)),0])
y=y+10
# cleanup()
# imgpath = get_histogram(hist,label)
cursor = connection.cursor()
cursor.execute(''' SELECT q."q_ID" as q_ID,q.question_text,q.difficulty_set,
q.difficulty_observed,s.subject
FROM "ARFA_app_evaluation" as e,"ARFA_app_question" as q,
"ARFA_app_options" as o, "ARFA_app_subject" as s
GROUP BY s.subject,q."q_ID",q.question_text,q.difficulty_set,q.difficulty_observed
ORDER BY s.subject,q.difficulty_observed desc''',[test_ID])
rows = cursor.fetchall()
print rows
columns = [col[0] for col in cursor.description]
q_stats = []
for val in rows:
q_stats.append(dict(zip(columns,val)))
# print "q_stats",q_stats
print hist
args = {"student_performance":res_stud,"test_aggregates":res_agg,"question_stats":q_stats,"distribution":hist}
return args
def get_histogram(hist,label):
N = len(hist)
ind = np.arange(N) # the x locations for the groups
width = 0.35 # the width of the bars
fig, ax = plt.subplots()
rects = ax.bar(ind, hist, width, color='b')
# add some text for labels, title and axes ticks
ax.set_ylabel('Scores')
ax.set_title('Distribution of scores')
ax.set_xticks(ind )
ax.set_xticklabels(label)
autolabel(rects,ax)
imgpath ="TestAnalysis/"+ str(datetime.datetime.now())+".png"
plt.savefig(imgpath)
def autolabel(rects,ax):
"""
Attach a text label above each bar displaying its height
"""
for rect in rects:
height = rect.get_height()
ax.text(rect.get_x() + rect.get_width()/2., 1.00*height,
'%d' % int(height),
ha='center', va='bottom')
def cleanup():
return
def get_questions_dict(cursor):
rows = cursor.fetchall()
# print(len(rows))
columns = [col[0] for col in cursor.description]
res=[]
options_so_far = []
......@@ -146,7 +262,5 @@ def get_all_questions(request):
options_so_far.append({"option_text":val[-2],"is_answer":val[-1]})
if not(first):
preval[-1] = options_so_far
# preval[1] = "q"+str(preval[1])
t = dict(zip(columns[:-1], preval))
res.append(t)
return res
\ No newline at end of file
res.append(t)
\ No newline at end of file
......@@ -14,6 +14,7 @@ from .models import Evaluation
from . import utilities
from .utilities import evaluate
from . import forms
from .utilities import result_analysis
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
......@@ -25,6 +26,7 @@ from django.db.models import F
from .forms import TestForm
import datetime
def login(request):
# This is the Login page and checks if anyone is already logged in and redirects accordingly
if(request.session.get('session',None)==True):
......@@ -434,12 +436,27 @@ def create_Test(request):
if request.method == "GET":
return render(request,'ARFA_app/create_Test.html',args)
if request.method == "POST":
form = TestForm(request.POST)
# form = TestForm(request.POST)
data = dict(request.POST.copy()) #copy to make QueryDict mutable. HttpResponse is immutable
data.pop('csrfmiddlewaretoken')
if not data: #only csrf token was sent, display create test page
return render(request,'ARFA_app/create_Test.html',args)
print vars(form)
print data
"""dirty workaround"""
#the data in request.POST must be modified to be valid in the form
data['start_time'] = data['start_time'][0].replace('T', ' ') #remove the 'T' in HTML returned string
data['expected_time_for_completion'] = data['expected_time_for_completion'][0]+":00"
#add seconds to duration string
data['max_marks'] = int(data['max_marks'][0]) #convert max_marks from string to int
#if these are not in these exact formats everything may break.
#see form cleanup for a potentially better solution
form = TestForm(data)
print "start time"
print vars(form)
if form.is_valid():
test = form.save()
......@@ -546,6 +563,7 @@ def view_personal_Test(request):
for val in rows:
res.append(dict(zip(columns,val)))
args={'username':request.session['username'],'tests':res}
args['is_session'] = True
return render(request,'ARFA_app/view_personal_Test.html',args)
......@@ -568,14 +586,15 @@ def view_all_Test(request):
for val in rows:
res.append(dict(zip(columns,val)))
args={'username':request.session['username'],'tests':res}
args['is_session'] = True
return render(request,'ARFA_app/view_all_Test.html',args)
def analyse_test(request):
if(request.session.get('session',None)!=True):
return render(request,'ARFA_app/login.html')
if(request.session.get('role',None)!="faculty"):
return render(request,'ARFA_app/not_a_faculty.html',request.session.get('args',None))
# if(request.session.get('role',None)!="faculty"):
# return render(request,'ARFA_app/not_a_faculty.html',request.session.get('args',None))
# m = models.Created_BY(test_ID=models.Test(test_ID=request.session['test_ID'],
# faculty=models.Faculty(username=request.session['username'])))
......@@ -595,78 +614,9 @@ def analyse_test(request):
return HttpResponse("test does not exist")
# if test[0].start_time < datetime.datetime.now():
return result_analysis(request,test_ID)
return HttpResponse("Success")
def result_analysis(request,test_ID):
if(request.session.get('session',None)!=True):
return render(request,'ARFA_app/login.html')
if(request.session.get('role',None)!="faculty"):
return render(request,'ARFA_app/not_a_faculty.html',request.session.get('args',None))
cursor = connection.cursor()
cursor.execute(''' SELECT student_id,total_marks as marks,rank
FROM "ARFA_app_takes"
WHERE "test_ID_id" = %s
order by total_marks desc ''',[test_ID])
rows = cursor.fetchall()
print rows
columns = [col[0] for col in cursor.description]
res_stud = []
for val in rows:
res_stud.append(dict(zip(columns,val)))
cursor = connection.cursor()
cursor.execute(''' SELECT avg(total_marks) as avg_marks,min(total_marks) as min_marks,max(total_marks) as max_marks
FROM "ARFA_app_takes"
WHERE "test_ID_id" = %s''',[test_ID])
rows = cursor.fetchall()
print rows
columns = [col[0] for col in cursor.description]
res_agg=dict(zip(columns,rows[0]))
cursor = connection.cursor()
cursor.execute(''' SELECT floor(total_marks/10) as left_bin,count(student_ID) as cnt
FROM "ARFA_app_takes"
WHERE "test_ID_id" = %s
GROUP BY total_marks/10
order by left_bin''',[test_ID])
rows = cursor.fetchall()
print rows
columns = [col[0] for col in cursor.description]
hist = []
for val in rows:
hist.append(dict(zip(columns,val)))
cursor = connection.cursor()
cursor.execute(''' SELECT q."q_ID",q.question_text,q.difficulty_set,q.difficulty_observed
,(sum(case when e.marks=1 then 1 else 0 end)/count(e.student_ID)) as difficulty_in_exam
FROM "ARFA_app_evaluation" as e,"ARFA_app_question" as q
WHERE e."test_ID_id" = %s and e."q_ID_id"=q."q_ID"
GROUP BY q."q_ID",q.question_text,q.difficulty_set,q.difficulty_observed
''',[test_ID])
rows = cursor.fetchall()
print rows
columns = [col[0] for col in cursor.description]
q_stats = []
for val in rows:
q_stats.append(dict(zip(columns,val)))
args = {"student_performance":res_stud,"test_aggregates":res_agg,"question_stats":q_stats,"hist":hist}
args = result_analysis(request,test_ID)
args.update(request.session.get('args',None))
return render(request,'ARFA_app/performance.html',args)
return render(request,'ARFA_app/performance.html',args)
......
-- psql -h localhost -p 5430 -d arfa_database < <dump_file.sql>
--
-- PostgreSQL database dump
--
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment