Commit 033c6b82 authored by João Denis Rodrigues's avatar João Denis Rodrigues
Browse files

Cache student + merge_dcits

parent 8c119d4c
......@@ -67,8 +67,14 @@ def generate_data():
def generate_degree_data(degree, path):
print("Fazendo analises do Curso - {}".format(degree.name))
average_grad = average_graduation(degree) # media_formandos
dic = merge_dicts(graph_average_ira(degree), graph_average_ira_evasion_semester(degree), graph_average_ira_graduation(degree), ['average_ira', 'semester_evasion', 'graduation'])
dic = merge_dicts(
['average_ira', 'semester_evasion', 'graduation'],
graph_average_ira(degree),
graph_average_ira_evasion_semester(degree),
graph_average_ira_graduation(degree)
)
degree_data = {
'time_graduation': average_time_graduation_degree(degree),
'graduation_rate': average_grad[0],
......@@ -104,11 +110,15 @@ def generate_student_data(degree, path):
student_klasses = StudentKlass.objects.filter(student=student)
amount_courses_semester = get_student_courses_completed(student_klasses)
failures_semester = semester_pass_rate(student)
# failures_amount_courses_semester = merge_dicts(failures_semester, amount_courses_semester)
failures_amount_courses_semester = merge_dicts(
['reprovacoes', 'cursadas'],
failures_semester,
amount_courses_semester,
)
ira_courses = sorted(ira_amount_courses(student).items())
pass_rate = pass_rate(student_klasses)
pass_rate_semester = sorted(failures_semester.items())
pass_rate = calculate_pass_rate(student_klasses)
pass_rate_semester = sorted(failures_amount_courses_semester.items())
position = sorted(get_student_position(student).items())
real_period = get_real_period(student)
intended_period = get_intended_period(student)
......@@ -118,12 +128,12 @@ def generate_student_data(degree, path):
dict_position = {}
dict_pass = {}
for item, course_pass, pos in zip(ira_courses, pass_rate_semester, position):
for item, course_pass, pos in zip(ira_courses,pass_rate_semester, position):
ca = list(course_pass)
i = list(item)
p = list(pos)
d_pass, d_done = ap[1]
date = ap[0].split('/')
d_pass, d_done = ca[1]
date = ca[0].split('/')
semester_data = {}
data = '{}/{}'.format(date[0], date[1])
......@@ -157,7 +167,7 @@ def generate_student_data(degree, path):
}
counter += 1
with io.open(student_path + '/' + student.grr + '.json', 'w', encondig = 'utf8') as output:
with io.open(student_path + '/' + student.grr + '.json', 'w', encoding = 'utf8') as output:
str_ = json.dumps(student_data, indent = 3, sort_keys = True,
separators=(',', ': '), ensure_ascii = False)
output.write(to_unicode(str_))
......@@ -177,7 +187,7 @@ def generate_admission_list_data(degree, path):
return
def generate_course_data(degree, path):
print("\t - Fazendo analises das disciplinas")
print("\t- Fazendo analises das disciplinas")
return
def generate_course_general_data(degree, path):
......
......@@ -16,12 +16,11 @@ def pass_amount(student_klasses): # calcular_indice_aprovacao
if student_klass.situation in SITUATION_PASS:
amount_pass += 1
return -1 if amount_courses == 0 else amount_pass
def pass_rate(student_klasses): # indice_aprovacao
def calculate_pass_rate(student_klasses): # indice_aprovacao
amount_pass = 0
amout_courses = 0
amount_courses = 0
for sk in student_klasses:
if sk.situation in SITUATIONS_COURSE_COMPLETED:
amount_courses += 1
......@@ -31,22 +30,19 @@ def pass_rate(student_klasses): # indice_aprovacao
def semester_pass_rate(student): # calcular_indice_aprovacao_semestral
index = {}
amount_semesters = student.get_time_in_degree()
year = student.admission.year
semester = student.admission.semester
for i in range(0, amount_semesters):
#semester_student_klass = student.studentklass_set.filter(klass__year = year, klass__semester = semester
#semester_index = pass_amount
semester_index = student.studentklass_set.filter(klass__year = year, klass__semester = semester, situation__in = SITUATION_PASS).count()
if semester_index > 0:
key = "{}/{}".format(year, semester)
index[key] = semester_index
semester = (semester % 2) + 1
semester += semester % 2
return index
def get_student_courses_completed(student_klasses):
......@@ -129,7 +125,7 @@ def get_student_position(student):
positions = {semester: value['position'] / value['amount_student'] for semester, value in positions.items()}
return position
return positions
def ira_amount_courses(student):
ira_semesters = get_ira_semester(student)
......@@ -145,15 +141,15 @@ def ira_amount_courses(student):
def get_real_period(student, last_period = None):
if last_period is None:
last_period = student.curriculum.get_amount_of_semesters()
last_period = student.current_curriculum.get_amount_of_semesters()
real_period = 0
period_completed = True
while period_completed and real_period <= last_period:
real_period += 1
courses_period = student.current_curriculum.courses.filter(coursecurriculum__period = real_period)
courses_passed_period = StudentKlass.objects.filter(klass__course__in = courses_period, student = student, situation__in = SITUATION_CONCLUDED)
courses_period = student.current_grade.courses.filter(coursecurriculum__period = real_period)
courses_passed_period = courses_period.filter(klass__studentklass__student = student, klass__studentkass__situation__in = SITUATION_CONCLUDED)
period_completed = len(courses_passed_period) == len(courses_period)
if real_period > last_period:
......
......@@ -23,7 +23,7 @@ SITUATION_CONCLUDED = ( # Situacoes concluidas
)
SITUATION_PASS = ( # Situacoes aprovacao
u'Aprovado'
u'Aprovado',
u'Aprovado Adiantamento',
u'Equivalência de Disciplinas',
u'Aprovado Conhecimento',
......@@ -90,11 +90,16 @@ SITUATION_FAILURE_COMPLETED = ( # Situacoes reprovacao cursada ate o fim
def difference_between_semesters(year_start, semester_start, year_end, semester_end):
return 2 * (year_end - year_start) + (semester_end - semester_start) + 1
def merge_dicts(dict1, dict2, dict3, keys):
def merge_dicts(keys, *args):
dict_out = {}
for key, value in dict1.items():
v2 = dict2[key] if key in dict2 else None
v3 = dict3[key] if key in dict3 else None
dict_out[key] = {keys[0]: value, keys[1]: v2, keys[2]: v3}
size = len(args)
for key, value in args[0].items():
values = []
values.append(value)
for i in range(1, size):
values.append(args[i][key] if key in args[i] else None)
dict_out[key] = {keys[i]: values[i] for i in range(0, size)}
return dict_out
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