Commit d2339754 authored by bhm15's avatar bhm15
Browse files

adega#122 adega#115: Add student info into analysis and Semestral IRA chart...

adega#122 adega#115: Add student info into analysis and Semestral IRA chart into Student page & Saving json with utf8
parent 9993aae7
......@@ -4,6 +4,8 @@ class AdegaChart{
//Object with two arrays (two charts), and the key is the x-axis
this.data = config.data || null;
this.legend = config.legend || null;
if(config.data == null){
this.data_x = config.data_x;
......@@ -12,15 +14,34 @@ class AdegaChart{
}
else{
this.data_x = [];
this.data_y = [[],[]];
this.data_y = [];
var first_element;
for (first_element in this.data) break;
first_element = this.data[first_element];
var multiplePlots = Array.isArray(first_element);
if(multiplePlots){
for(var i in first_element){
this.data_y.push([]);
}
}
for(var obj in this.data){
this.data_x.push(obj);
}
this.data_x.sort();
for(var i in this.data_x){
var key = this.data_x[i];
this.data_y[0].push(this.data[key][0]);
this.data_y[1].push(this.data[key][1]);
if(multiplePlots){
for(var i in first_element){
this.data_y[i].push(this.data[key][i]);
}
}
else{
this.data_y.push(this.data[key]);
}
}
}
......@@ -28,7 +49,7 @@ class AdegaChart{
this.div_target = config.div_target;
this.type = config.type || "scatter";
this.title = config.title || "";
this.legend = config.legend || null;
if(typeof(this.data_y[0]) == "number"){
this.data_y = [this.data_y];
......
......@@ -13,17 +13,20 @@ def get_data(session,degree,data_name):
data = json.load(data_f)
return data
def get_degree_information(session,degree):
def get_degree_information(session, degree):
return get_data(session,degree,"degree.json")
def get_list_admission(session,degree):
def get_list_admission(session, degree):
return get_data(session,degree,"admission/lista_turma_ingresso.json")
def get_list_courses(session,degree):
def get_list_courses(session, degree):
return get_data(session,degree,"disciplina/disciplinas.json")
def get_course_detail(session,degree, course_id):
def get_course_detail(session, degree, course_id):
return get_data(session,degree,"disciplina/"+course_id+".json")
def get_list_students(session, degree, list_name):
return get_data(session,degree,"students/list/"+list_name+".json")
\ No newline at end of file
return get_data(session,degree,"students/list/"+list_name+".json")
def get_student_detail(session, degree, student_id):
return get_data(session,degree,"students/"+student_id+".json")
\ No newline at end of file
......@@ -18,19 +18,50 @@ class StudentAnalysis:
def __init__(self, df):
self.data_frame = df
@memoize
def student_info(self, df=None):
df = df if df is not None else self.data_frame
students = df.groupby([
"MATR_ALUNO",
"NOME_PESSOA",
"ANO_INGRESSO",
"SEMESTRE_INGRESSO",
"ANO_EVASAO",
"SEMESTRE_EVASAO",
"FORMA_EVASAO",
])
students = students.groups.keys()
iras = self.ira_alunos()
info = {}
for stnd in students:
grr = stnd[0]
if(stnd[0][-1] == 1):
print(stnd[0])
info[grr] = {
"grr": grr,
"name": str(stnd[1]),
"ano_ingresso": str(stnd[2]),
"semestre_ingresso": str(stnd[3]),
"ano_evasao": str(stnd[4]),
"semestre_evasao": str(stnd[5]),
"forma_evasao": EvasionForm.code_to_str(stnd[6]),
"ira": iras[grr],
}
return info
@memoize
def list_students(self, df=None):
df = df if df is not None else self.data_frame
#~ ativos = df[["MATR_ALUNO", "NOME_PESSOA",]][df["FORMA_EVASAO"] == EvasionForm.EF_ATIVO].drop_duplicates()
situations = df.groupby(["MATR_ALUNO", "NOME_PESSOA", "FORMA_EVASAO"])
situations = list(pd.DataFrame({'count' : situations.size()}).reset_index().groupby(["FORMA_EVASAO"]))
#~ Cria lista de nome de listagens
iras = self.ira_alunos()
list_situations = defaultdict(list)
for sit in situations:
#Busca a lista de alunos relacionados a um codigo
grrs = list(sit[1]["MATR_ALUNO"])
people_names = list(sit[1]["NOME_PESSOA"])
......@@ -81,9 +112,6 @@ class StudentAnalysis:
aprovacoes_semestres[aluno] = aprovacoes/total
else:
aprovacoes_semestres[aluno] = None
#~ for semestre in aprovacoes_semestres[aluno]:
#~ aprovacoes+=aprovacoes_semestres[aluno][semestre][0]
#~ total+=aprovacoes_semestres[semestre][1]
return aprovacoes_semestres
......@@ -154,10 +182,8 @@ class StudentAnalysis:
situacao = int(df["SITUACAO"][i])
nota = float(df["MEDIA_FINAL"][i])
carga = float(df["CH_TOTAL"][i])
#media_credito = int(df["MEDIA_CREDITO"][i])
#if (situacao in Situation.SITUATION_AFFECT_IRA and media_credito != 0):
if (situacao in Situation.SITUATION_AFFECT_IRA):
if not (ano + "/" + semestre in students[matr]):
students[matr][ano + "/" + semestre] = [0, 0, 0]
......
......@@ -63,18 +63,17 @@ def process_semestre(per, df):
def generate_student_data(path, dataframe, student_analysis):
student_data = dict()
student_data = defaultdict(dict)
all_grrs = list(dataframe["MATR_ALUNO"].drop_duplicates())
for x in all_grrs:
student_data[x] = dict()
analysis = [
# tupla que contem no primeiro elemento a funcao que retorna um dicionario com {"GRR": valor}
# e na segunda posicao o nome que esta analise tera no json
# tuple that contains in the first element the function that returns a dictionary with {"GRR": value}
# and in the second position the name that this analysis will have in json
(student_analysis.posicao_turmaIngresso_semestral(),
"posicao_turmaIngresso_semestral"),
# (student_analysis.posicao_turmaIngresso_semestral(),
# "posicao_turmaIngresso_semestral"),
(student_analysis.periodo_real(),
"periodo_real"),
......@@ -96,12 +95,14 @@ def generate_student_data(path, dataframe, student_analysis):
(student_analysis.taxa_aprovacao(),
"taxa_aprovacao"),
]
(student_analysis.student_info(),
"student"),
]
for x in student_data:
for a in analysis: # Usar para fazer a verificacao de
student_data[x][a[1]] = a[0][x] # analises nulas para um GRR
for a in analysis: # Use this to verify
student_data[x][a[1]] = a[0][x] # null fields in analysis
save_json(path+x+".json", student_data[x])
files_list = [
......
......@@ -45,8 +45,6 @@ def save_json(path, data):
ensure_path_exists(os.path.dirname(path))
params = {} if not DEBUG else {'indent': 4}
with open(path, 'w') as f:
json.dump(data, f, **params)
json.dump(data, f, **params, ensure_ascii=False)
......@@ -2,123 +2,139 @@
{% load static %}
{% load math_tags %}
{% block content %}
<div class="row">
<div class="col-md-12">
<h1>{{ nome_disciplina }}
<small>{{ codigo_disciplina }}</small>
</h1>
<br>
<h2>Informações Gerais</h2>
<table class="table">
<tr>
<td>Quantidade de matrículas</td>
<td>{% if analysis_result.qtd_alunos >= 0%}
{{ analysis_result.qtd_alunos }}
{% else %}
Desconhecido
{% endif %}</td>
</tr>
<tr>
<td>Nota Média</td>
<td>{% if analysis_result.nota.0 >= 0%}
{{analysis_result.nota.0|floatformat:2}} &plusmn {{analysis_result.nota.1|floatformat:2}}
{% else %}
Desconhecido
{% endif %}</td>
</tr>
<tr>
<td>Nota Média/ Último ano</td>
<td>{% if analysis_result.nota_ultimo_ano.0 >= 0%}
{{analysis_result.nota_ultimo_ano.0|floatformat:2}} &plusmn {{analysis_result.nota_ultimo_ano.1|floatformat:2}}
{% else %}
Desconhecido
{% endif %}</td>
</tr>
</table>
<h1>Taxas</h1>
<table class="table">
<tr>
<td>Taxa Reprovação</td>
<td>{% if analysis_result.taxa_reprovacao_absoluta >= 0%}
{{ analysis_result.taxa_reprovacao_absoluta|floatformat:2 }}%
{% else %}
Desconhecido
{% endif %}</td>
</tr>
<tr>
<td>Taxa Reprovação Frequência </td>
<td>{% if analysis_result.taxa_reprovacao_frequencia >= 0%}
{{ analysis_result.taxa_reprovacao_frequencia|floatformat:2 }}%
{% else %}
Desconhecido
{% endif %}</td>
</tr>
<tr>
<td>Taxa Reprovação/Último ano</td>
<td>{% if analysis_result.taxa_reprovacao_ultimo_absoluto >= 0%}
{{ analysis_result.taxa_reprovacao_ultimo_absoluto|floatformat:2 }}%
{% else %}
Desconhecido
{% endif %}</td>
</tr>
<tr>
<td>Taxa Reprovação/Último ano Frequência</td>
<td>{% if analysis_result.taxa_reprovacao_ultimo_frequencia >= 0%}
{{ analysis_result.taxa_reprovacao_ultimo_frequencia|floatformat:2 }}%
{% else %}
Desconhecido
{% endif %}</td>
</tr>
<tr>
<td>Quantidade de Aproveitamento de Conhecimento</td>
<td>
{% if analysis_result.qtd_conhecimento >= 0 %}
{{ analysis_result.qtd_conhecimento }}
{% else %}
Desconhecido
{% endif %}
</td>
</tr>
<tr>
<td>Taxa Aprovação/Aproveitamento de Conhecimento</td>
<td>{% if analysis_result.taxa_aproveitamento_conhecimento >= 0%}
{{ analysis_result.taxa_aproveitamento_conhecimento|floatformat:2 }}%
{% else %}
Desconhecido
{% endif %}</td>
</tr>
<tr>
<td>Quantidade Trancamento</td>
<td>{% if analysis_result.qtd_trancamento >= 0%}
{{ analysis_result.qtd_trancamento }}
{% else %}
Desconhecido
{% endif %}</td>
</tr>
<tr>
<td>Taxa Trancamento</td>
<td>{% if analysis_result.taxa_trancamento >= 0%}
{{ analysis_result.taxa_trancamento|floatformat:2 }}%
{% else %}
Desconhecido
{% endif %}</td>
</tr>
<tr>
<td>Quantidade Média de Vezes Cursada até Aprovação</td>
<td>{% if analysis_result.qtd_cursada_aprov >= 0 %}
{{ analysis_result.qtd_cursada_aprov|floatformat:2 }}
{% else %}
Desconhecido
{% endif %}</td>
</td>
</table>
<div class="col-md-12">
<h1>{{ analysis_result.student.name }}
<small>{{ analysis_result.student.grr }}</small>
</h1>
<div>
<!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="active"><a href="#resumo" aria-controls="resumo" role="tab" data-toggle="tab">Resumo</a></li>
<li role="presentation"><a href="#disciplinas" aria-controls="disciplinas" role="tab" data-toggle="tab">Lista de Disciplinas</a></li>
</ul>
</div>
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="resumo">
<div class="panel-container">
<div class="data-panel">
<h3>Entrada</h3>
<span class="data">{{ analysis_result.student.ano_ingresso }}/{{ analysis_result.student.semestre_ingresso }}</span>
</div>
{% if analysis_result.student.ano_evasao %}
<div class="data-panel">
<h3>Saida</h3>
<span class="data">{{ analysis_result.student.forma_evasao }}</span><br>
<span class="data">{{ analysis_result.student.ano_evasao }}/{{analysis_result.student.semestre_evasao}}</span>
</div>
{% endif %}
</div>
<div class="panel-container">
<div class="data-panel">
<h3>Ira</h3>
<span class="data">{{ analysis_result.student.ira|floatformat:2 }}</span>
</div>
<div class="data-panel">
<h3>Taxa de Aprovação</h3>
<span class="data">{{ analysis_result.indice_aprovacao|multiply:100|floatformat:2 }}%</span>
</div>
<div class="data-panel">
<h3>Periodo real</h3>
{% if analysis_result.periodo_real %}
<span class="data">{{ analysis_result.periodo_real }}</span>
{% elif analysis_result.student.forma_evasao == 'Formatura' %}
<span class="data">Formado</span>
{% else %}
<span class="data">Jubilado</span>
{% endif %}
</div>
<div class="data-panel">
<h3>Periodo pretendido</h3>
{% if analysis_result.periodo_pretendido %}
<span class="data">{{ analysis_result.periodo_pretendido }}</span>
{% else %}
<span class="data">Formado</span>
{% endif %}
</div>
</div>
</div>
{% comment "aluno_turmas doesnt exists" %}
<div role="tabpanel" class="tab-pane" id="disciplinas">
<h1>Disciplinas Feitas</h1>
<table id="lista_disciplinas" class="table">
<thead>
<tr>
<th>Código</th>
<th>Nome</th>
<th>Nota</th>
<th>Situação</th>
<th>Data</th>
</tr>
</thead>
<tbody>
{% for at in analysis_result.aluno_turmas %}
<tr>
<td><a href="{% url 'disciplina:detail' degree_id=degree_id codigo_disciplina=at.turma.disciplina.codigo %}">
{{ at.turma.disciplina.codigo }}</a></td>
<td>{{ at.turma.disciplina.nome }}</td>
<td>{{ at.nota }}</td>
<td>{{ at.situacao }}</td>
<td>{{ at.turma.ano }}/{{ at.turma.semestre }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endcomment %}
<div id="graficos">
<div class="row">
<div class="col-md-6">
<div id="ira_semestral"></div>
</div>
<div class="col-md-6">
<h3>Índice de aprovação/Semestre</h3>
<canvas id="aprovacao_semestral"
data-data='{{ analysis_result.indice_reprovacao_semestral|safe }}'></canvas>
</div>
</div>
<div class="row">
{% comment "posicao_turma_ingresso_semestral doesnt exists" %}
<div class="col-md-6">
<h3>Posição do aluno em relação a turma de ingresso/Semestre(%)</h3>
<canvas id="posicao_turma_ingresso_semestral"
data-data='{{ analysis_result.posicao_turmaIngresso_semestral|safe }}'></canvas>
</div>
{% endcomment %}
<div class="col-md-6">
<h3>Relação entre IRA e a quantidade de disciplinas por semestre</h3>
<canvas id="ira_disciplinas_semestre"
data-data='{{ analysis_result.ira_por_quantidade_disciplinas|safe }}'></canvas>
</div>
</div>
<div class="row">
<div class="col-md-6">
<h3>Aprovação Acumulada</h3>
<canvas id="aprovacao_acumulada" data-data='{{ analysis_result.indice_reprovacao_semestral|safe }}'></canvas>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="aprovacao_semestre"></div>
<div id="myChart2"></div>
{% endblock content %}
......@@ -127,15 +143,15 @@
{% block js-foot %}
<script>
var chart1 = new AdegaChart({
data: {{analysis_result.aprovacao_semestral|safe}},
div_target: "aprovacao_semestre",
data: {{analysis_result.ira_semestral|safe}},
div_target: "ira_semestral",
//type: "bar",
title: "Índice de aprovação/Semestre",
fill: "none",
legend: ["Aprovação %","Quantidade de alunos"]
title: "Ira Semestral",
legend: ["IRA"]
});
var chart1 = new AdegaChart({
data_x: [0,1,2],
data_y: [[6,10,2], [7,9,2.5]],
......
from django import template
register = template.Library()
@register.filter(name='multiply')
def multiply(value, arg):
if value is not None:
return value * arg
return None
......@@ -4,25 +4,42 @@ from django.core.files.storage import FileSystemStorage
from django.contrib import messages
from degree.models import Degree
from report_api.views import get_list_students, get_course_detail
from report_api.views import get_list_students, get_student_detail
import json
def detail(request, degree_id, codigo_disciplina):
def detail(request, degree_id, grr):
degree = Degree.objects.get(code=degree_id)
if not (degree in request.user.educator.degree.all()):
return redirect("adega:dashboard")
course_detail = get_course_detail(request.session, degree, codigo_disciplina)
return render(request, 'student/detail.html',{
"analysis_result": course_detail,
"degree": degree,
"codigo_disciplina": codigo_disciplina,
"nome_disciplina": course_detail["disciplina_nome"]
cache_j = get_student_detail(request.session, degree, grr)
analysis_result = {
'indice_aprovacao' : cache_j['taxa_aprovacao'],
'periodo_real': cache_j['periodo_real'],
'periodo_pretendido': cache_j['periodo_pretendido'],
'ira_semestral': json.dumps(cache_j['ira_semestral']),
'indice_reprovacao_semestral': json.dumps(sorted(cache_j['indice_aprovacao_semestral'].items())),
# 'posicao_turmaIngresso_semestral': json.dumps(sorted(cache_j['posicao_turmaIngresso_semestral'].items())),
'ira_por_quantidade_disciplinas': json.dumps(sorted(cache_j['ira_por_quantidade_disciplinas'].items())),
'student': cache_j['student'],
# 'aluno_turmas': alunoTurmas,
}
return render(request, 'student/detail.html', {
'degree_id': degree_id,
'analysis_result': analysis_result
})
def index(request, degree_id):
degree = Degree.objects.get(code=degree_id)
if not (degree in request.user.educator.degree.all()):
......
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