Commit 82070acd authored by SANCHIT JAIN's avatar SANCHIT JAIN

Merge branch 'master' of https://git.cse.iitb.ac.in/ARFA/ARFA

parents 9e156cd8 9fb0d9c1
{
"python.linting.enabled": false
}
\ No newline at end of file
...@@ -45,7 +45,7 @@ class TestForm(forms.ModelForm): ...@@ -45,7 +45,7 @@ class TestForm(forms.ModelForm):
# 'expected_time_for_completion': forms.TimeInput(attrs={'type':'time'}), # 'expected_time_for_completion': forms.TimeInput(attrs={'type':'time'}),
# 'start_time': forms.DateInput(attrs={'type':'datetime-local'}), # 'start_time': forms.DateInput(attrs={'type':'datetime-local'}),
} }
exclude = ['test_ID', 'ownership'] exclude = ['test_ID', 'ownership', 'max_marks']
# def clean_start_time(self): # def clean_start_time(self):
# dt = self.cleaned_data['start_time'] # dt = self.cleaned_data['start_time']
# print dt # print dt
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.15 on 2018-11-26 18:47 # Generated by Django 1.11.16 on 2018-11-27 03:40
from __future__ import unicode_literals from __future__ import unicode_literals
import django.core.validators import django.core.validators
...@@ -144,8 +144,6 @@ class Migration(migrations.Migration): ...@@ -144,8 +144,6 @@ class Migration(migrations.Migration):
fields=[ fields=[
('test_ID', models.AutoField(primary_key=True, serialize=False)), ('test_ID', models.AutoField(primary_key=True, serialize=False)),
('test_name', models.CharField(max_length=200, unique=True)), ('test_name', models.CharField(max_length=200, unique=True)),
('visibility_student', models.CharField(max_length=20)),
('ownership', models.CharField(max_length=20)),
('expected_time_for_completion', models.DurationField(blank=True)), ('expected_time_for_completion', models.DurationField(blank=True)),
('start_time', models.DateTimeField()), ('start_time', models.DateTimeField()),
('max_marks', models.IntegerField(null=True)), ('max_marks', models.IntegerField(null=True)),
......
...@@ -28,11 +28,12 @@ class Faculty(arfa_user): ...@@ -28,11 +28,12 @@ class Faculty(arfa_user):
class Test(models.Model): class Test(models.Model):
test_ID = models.AutoField(primary_key=True) test_ID = models.AutoField(primary_key=True)
test_name = models.CharField(max_length=200,unique=True) test_name = models.CharField(max_length=200,unique=True)
visibility_student = models.CharField(max_length=20) # visibility_student = models.CharField(max_length=20)
ownership = models.CharField(max_length=20) # ownership = models.CharField(max_length=20)
expected_time_for_completion = models.DurationField(blank=True) expected_time_for_completion = models.DurationField(blank=True)
start_time = models.DateTimeField(auto_now=False, auto_now_add=False,blank=False) start_time = models.DateTimeField(auto_now=False, auto_now_add=False,blank=False)
max_marks = models.IntegerField(null=True) max_marks = models.IntegerField(null=True)
# class TestQuestions(models.Model): # class TestQuestions(models.Model):
# test_ID = models.ForeignKey( # test_ID = models.ForeignKey(
......
*.jpg
*.png
*.jpeg
\ No newline at end of file
{%extends 'base2.html'%} {%extends 'base2.html'%}
{%block head%}
<script>
total_marks = 0;
num_questions = 0;
function dispTotalMarks() {
$('#total_marks').html(total_marks);
}
function computeTotalMarks() {
val = 0;
$('.pos_marks').each(function() {
//add '#' to the id of checkbox to obtain that element
//'if' condition checks if the box is checked
//if it is, add to val
if(document.getElementById($(this).attr('checkBoxID')).checked) {
console.log($(this).attr('checkBoxID'))
val += parseFloat($(this).val());
}
})
total_marks = val;
}
function handleMarkChange() {
computeTotalMarks();
dispTotalMarks();
}
function handleCheckBoxClick(cb) {
posmarks = parseFloat((document.getElementById(
cb.getAttribute('posMarksID'))).value);
// get value of input field like so: element.value
if(cb.checked) {
total_marks += posmarks;
//update num_questions
num_questions++;
}
else {
total_marks -= posmarks
//update num_questions
num_questions--;
}
dispTotalMarks();
dispNumQuestions();
}
function dispNumQuestions() {
$('#num_questions').html(num_questions);
}
function getDiff()
{
var listItem = document.getElementsByClassName("bigclass");
var diffle = document.getElementById("di").value ;
for (var i=0; i < listItem.length; i++) {
listItem[i].style.display = "" ;
if (listItem[i].id != diffle && diffle != "")
listItem[i].style.display = "None" ;
}
}
</script>
{%endblock%}
{%block title%} {%block title%}
Create Test Create Test
...@@ -9,7 +71,7 @@ Create Test ...@@ -9,7 +71,7 @@ Create Test
{%block body%} {%block body%}
<h1> You CAN CREATE A Test HERE prof {{username}}</h1> <h1 style="text-align:center"> Create a test here</h1>
<div class="container"> <div class="container">
<div class="panel-default"> <div class="panel-default">
...@@ -17,22 +79,54 @@ Create Test ...@@ -17,22 +79,54 @@ Create Test
<h3 class="panel-title">Choose which questions are to be a part of the test</h3> <h3 class="panel-title">Choose which questions are to be a part of the test</h3>
</div> </div>
<ul class="list-group"> <ul class="list-group">
<!-- <ul> --> <!-- <ul> -->
<div>
<div style="float:right ; margin-right: 35px ">
Total Marks : <p id='total_marks' style="float:right;"></p>
</div>
<br/> <br/>
<div style="float:right ;margin-right: 35px ">
Number of Questions : <p id='num_questions' style="float:right;"></p>
</div>
<br/> <br/>
<div style="float:right ;margin-right: 30px ">
<input id="di" placeholder="Set difficulty" type="text" style="float:left;">
<button onclick="getDiff()" style="background-color:rgb(71, 118, 219); color: ">Filter </button>
</div>
</div>
</div>
<form method="POST" action="create_Test"> <form method="POST" action="create_Test">
{% csrf_token %} {% csrf_token %}
{{ TestForm.as_p }} {{ TestForm.as_p }}
{{TestForm.errors}} {{TestForm.errors}}
{{TestForm.non_field_errors}} {{TestForm.non_field_errors}}
{%for question in questions%} {%for question in questions%}
<li class="list-group-item">
<!-- <li> --> <li class="list-group-item bigclass" id={{question.difficulty_set}}>
<div class="row toggle"> <div class="row toggle" style="margin-left:10%" >
<div class="col-xs-10"> <div class="col-xs-10">
<input type="checkbox" value= "True" name = "{{question.q_id}}" > <input type="checkbox" value= "True" name = "{{question.q_id}}"
{{question.question_text}} {{question.q_id}} </br> id = "{{question.q_id}}" onclick="handleCheckBoxClick(this)"
posMarksID="{{question.q_id}}pos_marks">
<!-- link to posmarks in checkbox -->
{{question.question_text}} </br>
<p style="float:right;"><b>Difficulty: </b> {{question.difficulty_set}}</p>
{%if question.ip%}
{%load static%}
<div align="center">
<img src = "{% static "" %}{{question.ip|slice:"16:" }}" width="35%" height="35%">
<p style="margin-top:5px">
{{question.imdesc}}
</p>
</div>
{%endif%}
</div> </div>
</div> </div>
<div> <div style="margin-left:10%">
<hr></hr> <hr></hr>
<ul> <ul>
{%for option in question.option_details%} {%for option in question.option_details%}
...@@ -46,19 +140,29 @@ Create Test ...@@ -46,19 +140,29 @@ Create Test
</li> </li>
{%endif%} {%endif%}
{%endfor%} {%endfor%}
<label style="margin-top:10px; margin-right:5px"> marks </label>
<label> marks <!-- the id of checkboxes is q_id. I'm linking pos_marks to checkboxes
<input type="number" name="{{question.q_id}}" min="0" max="10" placeholder="4" step="0.25" value="4"> by id -->
<input type="number" name="{{question.q_id}}" min="-10" max="0" placeholder="-1" step="0.25" value="0"> <input class = "pos_marks" type="number" name="{{question.q_id}}"
</label> min="0" max="10" placeholder="4" step="0.25" value="4"
checkBoxID = "{{question.q_id}}" onchange="handleMarkChange()"
id="{{question.q_id}}pos_marks">
<input type="number" name="{{question.q_id}}"
min="-10" max="0" placeholder="-1" step="0.25" value="0">
</ul> </ul>
</div> </div>
</li> </li>
{%endfor%} {%endfor%}
<div style="float:right; margin-top: 10px; margin-right:20px " >
<button type="submit" class="btn btn-login float-right">Submit</button> <button type="submit" class="btn btn-login float-right">Submit</button>
</div>
</form> </form>
</ul> </ul>
</div> <br><br><br><br><br><br>
</div> </div>
{%endblock%} {%endblock%}
\ No newline at end of file
...@@ -75,7 +75,7 @@ function prevTab(elem) { ...@@ -75,7 +75,7 @@ function prevTab(elem) {
var check = document.createElement("input"); var check = document.createElement("input");
var check_ans = document.createElement("label"); var check_ans = document.createElement("label");
check_ans.for = "c" + x ; check_ans.for = "c" + x ;
check_ans.innerHTML = "Is this an / the answer?" check_ans.innerHTML = "Is this an / the answer?" ;
check.type="checkbox"; check.type="checkbox";
check.className = "form-control" ; check.className = "form-control" ;
check.name="c" + x ; check.name="c" + x ;
...@@ -110,8 +110,9 @@ function prevTab(elem) { ...@@ -110,8 +110,9 @@ function prevTab(elem) {
var qtext = document.getElementById('qtext').value ; var qtext = document.getElementById('qtext').value ;
question_data['subject_ID'] = subject.value ; question_data['subject_ID'] = subject.value ;
question_data['question_text'] = qtext ; question_data['question_text'] = qtext ;
console.log(question_data['question_text']) ; question_data['difficulty_set'] = document.getElementById('diff').value;
console.log(question_data['subject_ID']) ; question_data['visibility'] = document.getElementById('visible').value ;
console.log(question_data) ;
document.getElementById('l2').click() ; document.getElementById('l2').click() ;
} }
...@@ -228,7 +229,7 @@ Create Question ...@@ -228,7 +229,7 @@ Create Question
{%endblock%} {%endblock%}
{%block body%} {%block body%}
<h3> You CAN CREATE A QUESTION HERE prof {{username}}</h3> <h3 style="text-align:center"> Create a question here</h3>
<div class="container" title="this is title"> <div class="container" title="this is title">
<div class="row"> <div class="row">
<section> <section>
...@@ -288,6 +289,18 @@ Create Question ...@@ -288,6 +289,18 @@ Create Question
<label>Question Text</label> <label>Question Text</label>
<textarea class="form-control" rows="6" id= "qtext"></textarea> <textarea class="form-control" rows="6" id= "qtext"></textarea>
</div> </div>
<div class="form-group col-lg-4">
<label style="margin-right:20px">Specify question difficulty</label>
<input type="number" name="quantity" min="1" max="10" placeholder="5" value="5" id="diff">
</div>
<br>
<div class="form-group col-lg-4">
<label style="margin-right:20px;">Specify question visibility</label>
<select name="visible" id="visible">
<option value="public" >Public</option>
<option value="private" >Private</option>
</select>
</div>
</div> </div>
<div class="tab-pane" role="tabpanel" id="step2"> <div class="tab-pane" role="tabpanel" id="step2">
<h3>Step 2 - Add some options</h3> <h3>Step 2 - Add some options</h3>
...@@ -308,7 +321,7 @@ Create Question ...@@ -308,7 +321,7 @@ Create Question
<p> Drop images in the order you want to display</p> <p> Drop images in the order you want to display</p>
<ul class="list-inline pull-right"> <ul class="list-inline pull-right">
<li><button type="button" class="btn btn-default prev-step" onclick="document.getElementById('l2').click() ; ">Previous</button></li> <li><button type="button" class="btn btn-default prev-step" onclick="document.getElementById('l2').click() ; ">Previous</button></li>
<li><button type="button" class="btn btn-default next-step" onclick="document.getElementById('l4').click() ;">Skip</button></li> <!-- <li><button type="button" class="btn btn-default next-step" onclick="document.getElementById('l4').click() ;">Skip</button></li> -->
<li><button align="left" type="button" class="btn btn-primary" id="addsubjectiveque" onclick="intend_to_add_img() ; post()" >Add an image</button></li> <li><button align="left" type="button" class="btn btn-primary" id="addsubjectiveque" onclick="intend_to_add_img() ; post()" >Add an image</button></li>
<li><button type="button" class="btn btn-primary btn-info-full next-step" onclick="post()">Post Question</button></li> <li><button type="button" class="btn btn-primary btn-info-full next-step" onclick="post()">Post Question</button></li>
</ul> </ul>
......
...@@ -143,12 +143,12 @@ profile ...@@ -143,12 +143,12 @@ profile
</a> </a>
<a href="/arfa/view_personal_Test"> <a href="/arfa/view_personal_Test">
<center><button type="button" class="btn btn-lg btn-labeled btn-primary" href="#" style="margin-bottom: 15px;"> <center><button type="button" class="btn btn-lg btn-labeled btn-primary" href="#" style="margin-bottom: 15px;">
<span class="btn-label"><i class="fa fa-eye-slash"></i></span>VIEW MY Test <span class="btn-label"><i class="fa fa-eye-slash"></i></span>VIEW MY Tests
</button></center> </button></center>
</a> </a>
<a href="/arfa/view_all_Test"> <a href="/arfa/view_all_Test">
<center><button type="button" class="btn btn-lg btn-labeled btn-info" href="#" style="margin-bottom: 15px;"> <center><button type="button" class="btn btn-lg btn-labeled btn-info" href="#" style="margin-bottom: 15px;">
<span class="btn-label"><i class="fa fa-eye"></i></span>VIEW ALL Test <span class="btn-label"><i class="fa fa-eye"></i></span>VIEW ALL Tests
</button></center> </button></center>
</a> </a>
......
...@@ -13,15 +13,19 @@ Total Time :<b > {{total_time.hours}} {{total_time.minutes}} </b> ...@@ -13,15 +13,19 @@ Total Time :<b > {{total_time.hours}} {{total_time.minutes}} </b>
<p> Max Marks. <b>{{max_marks}}</b> </p> <p> Max Marks. <b>{{max_marks}}</b> </p>
<div id="Timer" style="border-style: solid; text-align: center;"></div> <div id="Timer" style="border-style: solid; text-align: center;"></div>
</div> </div>
<h2 align="center" style=" text-decoration: underline;"><b> {{testName.test_name}} </b> </h2> <h2 align="center" style=" text-decoration: underline;"><b> {{testName.test_name}} </b> </h2>
</div> </div>
<script> <script>
function submitExam()
{
document.getElementById('ExamForm').submit() ;
}
</script>
<script>
// Set the date we're counting down to // Set the date we're counting down to
var countDownDate = new Date( {{ end_time }} ); var countDownDate = new Date( {{ end_time }} );
countDownDate.setMonth(countDownDate.getMonth() - 1) ; countDownDate.setMonth(countDownDate.getMonth() - 1) ;
countDownDate.setMonth(countDownDate.getMonth() - 1) ;
countDownDate.setMonth(countDownDate.getMonth() - 1) ;
console.log(countDownDate) ; console.log(countDownDate) ;
// Update the count down every 1 second // Update the count down every 1 second
var x = setInterval(function() { var x = setInterval(function() {
...@@ -51,19 +55,37 @@ var x = setInterval(function() { ...@@ -51,19 +55,37 @@ var x = setInterval(function() {
<div style="margin-left: 5%; margin-top: 10%"> <div style="margin-left: 5%; margin-top: 10%">
<ol> <ol>
<font size="3"> <font size="3">
<form class="exam-form" method="POST" action="/arfa/result"> <form class="exam-form" method="POST" action="/arfa/result" id="ExamForm">
<p style="margin-right: 5%"> <b> Questions </b></p> <p style="margin-right: 5%"> <b> Questions </b></p>
{% csrf_token %} {% csrf_token %}
<input name="testID" value="{{testID}}" type="hidden" > <input name="testID" value="{{testID}}" type="hidden" >
{% for question, options in questions.items %} {{images}}
{% for question, data in questions.items %}
<div class="row" style="margin-top: 10px; margin-bottom: 10px"> <div class="row" style="margin-top: 10px; margin-bottom: 10px">
<li style="font-weight: bold;" > {{ question }}</li> <li style="font-weight: bold;margin-left: 10px; margin-bottom: 10px" > {{ question }}<br></li>
{% for option in options %}
<!-- adding an image -->
{% for image in data.images %}
{%load static%}
{%if image.0 %}
<div align="center" style="margin-top:30px">
<img src = "{% static "" %}{{ image.0 }}" width="35%" height="35%" >
<p style="margin-top:5px">{{image.1}}</p>
{%endif%}
</div>
{% endfor %}
{% for option in data.options %}
<input type="checkbox" name = "{{option.0}}" value= "{{option.1}}" > {{ option.2 }} </br> <input type="checkbox" name = "{{option.0}}" value= "{{option.1}}" > {{ option.2 }} </br>
{% endfor %} {% endfor %}
</div> </div>
{% endfor %} {% endfor %}
<button type="submit" class="btn btn-login" style="float: right;">Submit</button> <button onclick="submitExam()" class="btn btn-login" style="float: right;">Submit</button>
</form> </form>
</font> </font>
......
...@@ -12,7 +12,7 @@ Logout ...@@ -12,7 +12,7 @@ Logout
{%endblock%} {%endblock%}
{%block body%} {%block body%}
<h3 class="myh3 deepshd"> You have succesfully logged out </h3> <h3 style="text-align:center" class="myh3 deepshd"> You have succesfully logged out </h3>
<!-- <div class="container"> <!-- <div class="container">
<centre> <centre>
<h1> You have succesfully logged out</h1> <h1> You have succesfully logged out</h1>
......
...@@ -7,5 +7,5 @@ View All Question ...@@ -7,5 +7,5 @@ View All Question
{%endblock%} {%endblock%}
{%block body%} {%block body%}
<h1> You are not authorized for this action {{username}}</h1> <h1 style="text-align:center"> You are not authorized for this action {{username}}</h1>
{%endblock%} {%endblock%}
\ No newline at end of file
{%extends 'base2.html'%}
{%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"> Test Performance</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"> Test Stats </h3>
</div>
<ul class="list-group">
<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">
<p> student: {{p.student_id}}</p>
<p> rank: {{p.rank}}</p>
<p> Score: {{p.marks}}</p>
</div>
</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%}
</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> Difficulty set: {{q.difficulty_set}}</p>
<p> Difficulty observed: {{q.difficulty_observed}}</p>
<p> Question: {{q.question_text}} </p>
</div>
</div>
<div>
<div>
<hr></hr>
<!-- <div class="container"> -->
<!-- <div class="fluid-row"> -->
<ul>
{%for option in q.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> -->
</div>
</div>
</li>
{%endfor%}
</ul>
</div>
</div>
{%endblock%}
...@@ -5,6 +5,8 @@ profile ...@@ -5,6 +5,8 @@ profile
{%block body%} {%block body%}
<h1 style="text-align:center">Test Successfully Recorded </h1>
{%endblock%} {%endblock%}
\ No newline at end of file
...@@ -16,17 +16,26 @@ My Tests ...@@ -16,17 +16,26 @@ My Tests
</div> </div>
<ul class="list-group"> <ul class="list-group">
{% for t in activeTests %} {% for t in activeTests %}
<div> <div class="row" style="margin-bottom: 10px; margin-top: 5px">
<p>{{t.test_ID}}</p> <div style="float: left; margin-left: 20px">
<p>{{t.test_name}}</p> <p><i>Test Id</i> <b> {{t.test_ID}}</b></p>
</div> <p><i> Test Name</i> <b>{{t.test_name}}</b> </p>
</div>
<div style="float:right"> <div style="float:right">
<form method="POST" action="loadStudentTest"> <form method="POST" action="loadStudentTest">
{% csrf_token %} {% csrf_token %}
<input name="testID" value="{{t.test_ID}}" type="hidden"> <input name="testID" value="{{t.test_ID}}" type="hidden">
<button type="submit" class="btn btn-login float-right" style="margin-top: 10px ;margin-right: 40px">Load Test</button> {% if t.hasTaken is True %}
<button type="button" disabled class="btn btn-login float-right"
style="margin-top: 10px ;margin-right: 40px">Attempted</button>
{% else %}
<button type="submit" class="btn btn-login float-right"
style="margin-top: 10px ;margin-right: 40px">Load Test</button>
{% endif %}
</form> </form>
</div> </div>
</div>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>
...@@ -47,11 +56,34 @@ My Tests ...@@ -47,11 +56,34 @@ My Tests
<p><i> Test Name</i> <b>{{t.test_name}}</b> </p> <p><i> Test Name</i> <b>{{t.test_name}}</b> </p>
</div> </div>
<div style="float:right"> <div style="float:right">
<form method="POST" action="loadStudentTest"> <div class="row">
<form method="POST" action="loadStudentTest" style="float:right;">
{% csrf_token %} {% csrf_token %}
<input name="testID" value="{{t.test_ID}}" type="hidden"> <input name="testID" value="{{t.test_ID}}" type="hidden">
<button type="submit" class="btn btn-login float-right" style="margin-top: 10px ;margin-right: 40px">Load Test</button> <button type="submit" class="btn btn-login float-right"
style="margin-top: 10px ;margin-right: 40px">Load Test</button>
</form> </form>
<form method="POST" action="viewStudentPerformance" style="float:left;">
{% csrf_token %}
<!-- {% if t.hasTaken is True %} -->
<input name="test_ID" value="{{t.test_ID}}" type="hidden">
<button type="submit" class="btn btn-login float-right"
style="margin-top: 10px ;margin-right: 40px; background-color: gray; ">View Results</button>
<!-- {% endif %} -->
</form>
<form method="POST" action="CompareResponses" style="float:left;">
{% csrf_token %}
{% if t.hasTaken is True %}
<input name="test_ID" value="{{t.test_ID}}" type="hidden">
<button type="submit" class="btn btn-login float-right"
style="margin-top: 10px ;margin-right: 40px; background-color: gray; ">View Responses</button>
{% endif %}
</form>
</div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
......
{%extends 'base2.html'%}
{%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"> Test Performance</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"> Test Stats </h3>
</div>
<ul class="list-group">
<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.min_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 class="panel-heading">
<h3 class="panel-title"> Your Standings </h3>
</div>
<ul class="list-group">
<li class="list-group-item">
<div class="row toggle">
<div id="c1" class="col-xs-10" style="float:left;width:50%">
<p> rank : {{rank}}</p>
<p> Score : {{marks}}</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"> Students 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">
<p> student: {{p.student_id}}</p>
<p> rank: {{p.rank}}</p>
<p> Score: {{p.marks}}</p>
</div>
</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%}
</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> Difficulty set: {{q.difficulty_set}}</p>
<p> Difficulty observed: {{q.difficulty_observed}}</p>
<p> Question: {{q.question_text}} </p>
</div>
</div>
<div>
<div>
<hr></hr>
<!-- <div class="container"> -->
<!-- <div class="fluid-row"> -->
<ul>
{%for option in q.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> -->
</div>
</div>
</li>
{%endfor%}
</ul>
</div>
</div>
{%endblock%}
{%extends 'base2.html'%}
{%block title%}
View all Question
{%endblock%}
{%block body%}
<h1 style="text-align:center"> You CAN VIEW all your responses {{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">LIST OF QUESTIONS</h3>
</div>
<ul class="list-group">
<!-- <ul> -->
{%for question in question_responses%}
<li class="list-group-item">
<!-- <li> -->
<div class="row toggle">
<div class="col-xs-10">
{{question.answer.question_text}}
</div>
</div>
<div>
<hr></hr>
<!-- <div class="container"> -->
<div class="row">
<div class="col-xs-6">
<ul> <p>Answers</p>
{%for option in question.answer.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 class="col-xs-6">
<ul><p>Your Responses</p>
{%for option in question.response.option_details%}
{%if option.is_answer %}
<li>
<p style="color: red"> {{option.option_text}} </p>
</li>
{%else%}
<li>
{{option.option_text}}
</li>
{%endif%}
{%endfor%}
</ul>
</div>
</div>
</div>
<!-- </div> -->
</li>
{%endfor%}
</ul>
</div>
</div>
{%endblock%}
\ No newline at end of file
{%extends 'base2.html'%}
{%block head%}
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML">
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
</script>
{%endblock%}
{%block title%}
View personal Question
{%endblock%}
{%block body%}
<h1> You CAN VIEW all your tests HERE student {{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">LIST OF QUESTIONS</h3>
</div>
<ul class="list-group">
<!-- <ul> -->
{%for question in questions%}
<li class="list-group-item">
<!-- <li> -->
<div class="row toggle">
<div class="col-xs-10">
{{question.question_text}}
</div>
</div>
<div>
<hr></hr>
<!-- <div class="container"> -->
<!-- <div class="fluid-row"> -->
<ul>
{%for option in question.option_details%}
<!-- <div class="col-xs-1"> -->
<li> {{option.is_answer}}
<!-- </div> -->
<!-- <div class="col-xs-5"> -->
{{option.option_text}}
<!-- </div> -->
</li>
{%endfor%}
</ul>
<!-- </div> -->
<!-- </div> -->
</div>
</li>
{%endfor%}
</ul>
</div>
</div>
{%endblock%}
\ No newline at end of file
{%extends 'base2.html'%} {%extends 'base2.html'%}
{%block title%} {%block title%}
View All Test View personal Question
{%endblock%} {%endblock%}
{%block body%} {%block body%}
<h1> You CAN VIEW ALL Test HERE prof {{username}}</h1> <h1 style="text-align:center"> View all tests here</h1>
<div class="container">
<div class="panel-default">
<div class="panel-heading">
<h3 class="panel-title">LIST OF TESTS</h3>
</div>
<ul class="list-group">
<!-- <ul> -->
{%for test in tests%}
<li class="list-group-item">
<!-- <li> -->
<div class="row toggle">
<div class="col-xs-10">
<p> <h4> {{test.test_name}} </h4> </p>
<p> Start Time : {{test.start_time}} </p>
<p> Duration : {{test.duration}} </p>
<p> Maximum marks : {{test.max_marks}} </p>
</div>
<form method="POST" action="viewTestPerformance">
{% csrf_token %}
<input name="test_ID" value="{{test.test_id}}" type="hidden">
<button>View Performence</button>
</form>
<!-- <form method="POST" action="EditTest">
{% csrf_token %}
<input name="test_ID" value="{{test.test_ID}}" type="hidden">
<button>Edit Test</button>
</form> -->
</div>
<div>
<hr></hr>
</div>
</li>
{%endfor%}
</ul>
</div>
</div>
{%endblock%} {%endblock%}
\ No newline at end of file
{%extends 'base2.html'%} {%extends 'base2.html'%}
{%block title%} {%block title%}
View all Question View all Question
{%endblock%} {%endblock%}
{%block body%} {%block body%}
<h1> You CAN VIEW all questions QUESTION HERE prof {{username}}</h1> <h1 style="text-align:center"> You CAN VIEW all questions QUESTION HERE prof {{username}}</h1>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css"> <link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
<div class="container"> <div class="container">
<div class="panel-default"> <div class="panel-default">
...@@ -19,10 +20,20 @@ View all Question ...@@ -19,10 +20,20 @@ View all Question
<!-- <li> --> <!-- <li> -->
<div class="row toggle"> <div class="row toggle">
<div class="col-xs-10"> <div class="col-xs-10">
{{question.question_text}} <p> <b> Question. </b> {{question.question_text}}</p>
{%if question.ip%}
{%load static%}
<div align="center">
<img src = "{% static "" %}{{question.ip|slice:"16:" }}" width="35%" height="35%">
<p style="margin-top:5px">
{{question.imdesc}}
</p>
</div>
{%endif%}
</div> </div>
</div> </div>
<div> <div class="col-xs-10">
<hr></hr> <hr></hr>
<!-- <div class="container"> --> <!-- <div class="container"> -->
<!-- <div class="fluid-row"> --> <!-- <div class="fluid-row"> -->
...@@ -34,7 +45,9 @@ View all Question ...@@ -34,7 +45,9 @@ View all Question
</li> </li>
{%else%} {%else%}
<li> <li>
<p>
{{option.option_text}} {{option.option_text}}
</p>
</li> </li>
{%endif%} {%endif%}
{%endfor%} {%endfor%}
......
{%extends 'base2.html'%} {%extends 'base2.html'%}
{%block head%}
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML">
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
</script>
{%endblock%}
{%block title%} {%block title%}
View personal Question View personal Question
{%endblock%} {%endblock%}
{%block body%} {%block body%}
<h1> You CAN VIEW your tests prof {{username}}</h1> <h1 style="text-align:center"> View your tests here</h1>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
<div class="container"> <div class="container">
<div class="panel-default"> <div class="panel-default">
<div class="panel-heading"> <div class="panel-heading">
...@@ -25,9 +17,25 @@ View personal Question ...@@ -25,9 +17,25 @@ View personal Question
<!-- <li> --> <!-- <li> -->
<div class="row toggle"> <div class="row toggle">
<div class="col-xs-10"> <div class="col-xs-10">
{{test.test_name}} <p> <h4> {{test.test_name}} </h4> </p>
<p> Start Time : {{test.start_time}} </p>
<p> Duration : {{test.duration}} </p>
<p> Maximum marks : {{test.max_marks}} </p>
</div> </div>
<form method="POST" action="viewTestPerformance">
{% csrf_token %}
<input name="test_ID" value="{{test.test_id}}" type="hidden">
<button>View Performence</button>
</form>
<!-- <form method="POST" action="EditTest">
{% csrf_token %}
<input name="test_ID" value="{{test.test_ID}}" type="hidden">
<button>Edit Test</button>
</form> -->
</div> </div>
<div> <div>
<hr></hr> <hr></hr>
</div> </div>
......
...@@ -4,24 +4,39 @@ ...@@ -4,24 +4,39 @@
View personal Question View personal Question
{%endblock%} {%endblock%}
{%block body%} {%block body%}
<h1> You CAN VIEW personal QUESTION HERE prof {{username}}</h1> <style>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css"> p {
font-size: 130%
}
</style>
<h2 align="center"> View personal questions here </h2>
<div class="container"> <div class="container">
<div class="panel-default"> <div class="panel-default" >
<div class="panel-heading"> <div class="panel-heading" >
<h3 class="panel-title">LIST OF QUESTIONS</h3> <h3 class="panel-title">LIST OF QUESTIONS</h3>
</div> </div>
<ul class="list-group"> <ul class="list-group">
<!-- <ul> -->
{%for question in questions%} {%for question in questions%}
<li class="list-group-item"> <li class="list-group-item">
<!-- <li> -->
<div class="row toggle"> <div class="row toggle">
<div class="col-xs-10"> <div class="col-xs-10">
{{question.question_text}} <p> <b> Question. </b> {{question.question_text}} </p>
</div> {%if question.ip%}
{%load static%}
<div align="center">
<img src = "{% static "" %}{{question.ip|slice:"16:" }}" width="35%" height="35%">
<p style="margin-top:5px">
{{question.imdesc}}
</p>
</div>
{%endif%}
</div>
</div> </div>
<div> <div >
<hr></hr> <hr></hr>
<ul> <ul>
{%for option in question.option_details%} {%for option in question.option_details%}
...@@ -31,7 +46,9 @@ View personal Question ...@@ -31,7 +46,9 @@ View personal Question
</li> </li>
{%else%} {%else%}
<li> <li>
<p>
{{option.option_text}} {{option.option_text}}
</p>
</li> </li>
{%endif%} {%endif%}
{%endfor%} {%endfor%}
...@@ -40,6 +57,7 @@ View personal Question ...@@ -40,6 +57,7 @@ View personal Question
</li> </li>
{%endfor%} {%endfor%}
</ul> </ul>
</div> </div>
</div> </div>
{%endblock%} {%endblock%}
\ No newline at end of file
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
}); });
</script> </script>
<script type="text/javascript" src="{% static 'ARFA_app/lib/MathJax-2.7.5/MathJax.js' %}"> <script type="text/javascript" src="{% static 'ARFA_app/lib/MathJax-2.7.5/MathJax.js' %}">
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
</script> </script>
<script type="text/javascript" src="{% static 'ARFA_app/lib/MathJax-2.7.5/config/TeX-MML-AM_CHTML-full.js' %}"> <script type="text/javascript" src="{% static 'ARFA_app/lib/MathJax-2.7.5/config/TeX-MML-AM_CHTML-full.js' %}">
</script> </script>
......
...@@ -27,5 +27,10 @@ urlpatterns=[ ...@@ -27,5 +27,10 @@ urlpatterns=[
url(r'^reg',views.reg), url(r'^reg',views.reg),
url(r'^studentTestHome', views.studentTestHome), url(r'^studentTestHome', views.studentTestHome),
url(r'^loadStudentTest', views.loadStudentTest), url(r'^loadStudentTest', views.loadStudentTest),
url(r'^viewTestPerformance',views.analyse_test),
url(r'^viewStudentPerformance',views.student_results),
url(r'^CompareResponses',views.student_responses),
# url(r'^viewStudentPerformance',views.student_responses),
] ]
...@@ -21,6 +21,7 @@ from django.db.models import F ...@@ -21,6 +21,7 @@ from django.db.models import F
from pprint import pprint from pprint import pprint
import datetime import datetime
def evaluate(responses, otherData): def evaluate(responses, otherData):
"""responses contains a list of dicts of the form {q_ID: [option1, option2 ..]} """responses contains a list of dicts of the form {q_ID: [option1, option2 ..]}
other data contains any other data necessary for evaluation such as testID and studentID""" other data contains any other data necessary for evaluation such as testID and studentID"""
...@@ -112,17 +113,102 @@ def getOptions(question): #returns queryset ...@@ -112,17 +113,102 @@ def getOptions(question): #returns queryset
def get_all_questions(request): def get_all_questions(request):
args={'username':request.session['username']} args={'username':request.session['username']}
# args = {'username':'mathura'}
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute(''' SELECT s.subject,q."q_ID" as q_ID,q.question_text,q.topic,q.subtopic,q.source, cursor.execute(''' SELECT q."q_ID" as q_ID,s.subject,q.question_text,q.topic,q.subtopic,q.source,
q.difficulty_set,q.visibility,q.ownership,o."option_Value" as option_details, q.difficulty_set,q.visibility,q.ownership,q.image as ip , q."imageDesc" as imdesc,
o."option_Value" as option_details,
o."is_Answer" o."is_Answer"
FROM "ARFA_app_question" as q, FROM ("ARFA_app_question" as u LEFT OUTER JOIN "ARFA_app_questionimage" as v ON
u."q_ID" = v."q_ID_id") as q,
"ARFA_app_options" as o,"ARFA_app_subject" as s "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" 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']]) order by s.subject,q_ID ''',[args['username']])
res = get_questions_dict(cursor)
return res
def get_difficulty(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))
else:
Diff = request.POST['difficulty']
Questions = models.Questions.objects.filter(difficulty_set = Diff)
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() rows = cursor.fetchall()
# print(len(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()
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 left_bin
order by left_bin''',[test_ID])
hist = cursor.fetchall()
y=0
if hist!=[]:
y = int(hist[-1][0])
y = y+1
hist = [ [str(str(int(x[0])*10)+"-"+str(int(x[0])*10+10)),int(x[1])] for x in hist]
for i in range(5):
hist.append([str(str(y*10)+"-"+str(y*10+10)),0])
y=y+1
cursor = connection.cursor()
cursor.execute(''' SELECT q."q_ID" as q_ID,q.question_text,q.difficulty_set,
q.difficulty_observed,s.subject, q.image as ip , q."imageDesc" as imdesc,
o."option_Value" as option_details,
o."is_Answer"
FROM "ARFA_app_contains" as c,
("ARFA_app_question" as u LEFT OUTER JOIN "ARFA_app_questionimage" as v ON
u."q_ID" = v."q_ID_id") as q,
"ARFA_app_options" as o, "ARFA_app_subject" as s
WHERE o."q_ID_id" = q."q_ID" and c."q_ID_id" = q."q_ID" and q."subject_ID_id" = s."subject_ID"
and c."test_ID_id" = %s
ORDER BY s.subject,q.difficulty_observed desc,o."q_ID_id" ''',[test_ID])
q_stats = get_questions_dict(cursor)
args = {"student_performance":res_stud,"test_aggregates":res_agg,"question_stats":q_stats,"distribution":hist}
return args
def get_questions_dict(cursor):
rows = cursor.fetchall()
print rows
columns = [col[0] for col in cursor.description] columns = [col[0] for col in cursor.description]
res=[] res=[]
options_so_far = [] options_so_far = []
...@@ -134,9 +220,8 @@ def get_all_questions(request): ...@@ -134,9 +220,8 @@ def get_all_questions(request):
preval = list(val[:-1]) preval = list(val[:-1])
options_so_far = [{"option_text":val[-2],"is_answer":val[-1]}] options_so_far = [{"option_text":val[-2],"is_answer":val[-1]}]
else: else:
if not(preval[0]==val[0] and preval[1]==val[1]): if not(preval[0]==val[0] ):
preval[-1] = options_so_far preval[-1] = options_so_far
# preval[1] = "q"+str(preval[1])
t = dict(zip(columns[:-1], preval)) t = dict(zip(columns[:-1], preval))
res.append(t) res.append(t)
options_so_far = [{"option_text":val[-2],"is_answer":val[-1]}] options_so_far = [{"option_text":val[-2],"is_answer":val[-1]}]
...@@ -146,7 +231,46 @@ def get_all_questions(request): ...@@ -146,7 +231,46 @@ def get_all_questions(request):
options_so_far.append({"option_text":val[-2],"is_answer":val[-1]}) options_so_far.append({"option_text":val[-2],"is_answer":val[-1]})
if not(first): if not(first):
preval[-1] = options_so_far preval[-1] = options_so_far
# preval[1] = "q"+str(preval[1])
t = dict(zip(columns[:-1], preval)) t = dict(zip(columns[:-1], preval))
res.append(t) res.append(t)
return res return res
\ No newline at end of file
def get_responses_side_by_side(test,student):
cursor = connection.cursor()
cursor.execute(''' SELECT q."q_ID" as q_ID,q.question_text,
o."option_Value" as option_details,o."is_Answer"
FROM "ARFA_app_contains" as c,"ARFA_app_question" as q,
"ARFA_app_options" as o, "ARFA_app_subject" as s
WHERE o."q_ID_id" = q."q_ID" and c."q_ID_id" = q."q_ID" and q."subject_ID_id" = s."subject_ID"
and c."test_ID_id" = %s
ORDER BY o."q_ID_id",o."option_ID" ''',[test.test_ID])
args={}
args["answers"]=get_questions_dict(cursor)
cursor = connection.cursor()
cursor.execute(''' SELECT o."q_ID_id" as q_ID,
o."option_Value" as option_details,
(case when exists
(select * from "ARFA_app_responses" as r
where r."student_ID_id"=%s and r."test_ID_id"=%s
and r."q_ID_id" = c."q_ID_id" and o."id" = r."option_ID_id"
) then TRUE else FALSE end
) as is_Answer
FROM "ARFA_app_options" as o,"ARFA_app_contains" as c
WHERE c."q_ID_id" = o."q_ID_id" and c."test_ID_id" = %s
ORDER BY o."q_ID_id" ,o."option_ID" ''',[student.username,test.test_ID,test.test_ID])
args["responses"]=get_questions_dict(cursor)
bargs = []
for i in range(len(args["responses"])):
bargs.append({"answer":args["answers"][i],"response":args["responses"][i]})
return bargs
\ No newline at end of file
This diff is collapsed.
-- psql -h localhost -p 5430 -d arfa_database < <dump_file.sql>
-- --
-- PostgreSQL database dump -- PostgreSQL database dump
-- --
......
pip install django-background-tasks
\ No newline at end of file
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