mirror of https://github.com/interlegis/sigi.git
Sesostris Vieira
10 years ago
7 changed files with 192 additions and 76 deletions
@ -0,0 +1,103 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# |
||||
|
# sigi.apps.servicos.management.commands.get_moodle_stats |
||||
|
# |
||||
|
# Copyright (c) 2014 by Interlegis |
||||
|
# |
||||
|
# GNU General Public License (GPL) |
||||
|
# |
||||
|
# This program is free software; you can redistribute it and/or |
||||
|
# modify it under the terms of the GNU General Public License |
||||
|
# as published by the Free Software Foundation; either version 2 |
||||
|
# of the License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU General Public License |
||||
|
# along with this program; if not, write to the Free Software |
||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
||||
|
# 02110-1301, USA. |
||||
|
# |
||||
|
from django.utils.translation import ugettext as _ |
||||
|
from django.core.management.base import BaseCommand |
||||
|
from django.db.models import Sum, Avg |
||||
|
from sigi.apps.metas.views import gera_map_data_file |
||||
|
from sigi.apps.saberes.models import CategoriasInteresse, PainelItem |
||||
|
from sigi.apps.mdl.models import User, CourseStats |
||||
|
|
||||
|
|
||||
|
class Command(BaseCommand): |
||||
|
help = u'Get Moodle data and generate statistical panels.' |
||||
|
|
||||
|
def handle(self, *args, **options): |
||||
|
areas = [] |
||||
|
numeros = [ |
||||
|
{'descricao': _(u'Total de usuários cadastrados'), 'valor': User.objects.count()}, |
||||
|
{'descricao': _(u'Novos usuários cadastrados') , 'valor': User.objects.filter(firstaccess__gte=1392326052).count()} |
||||
|
] |
||||
|
|
||||
|
for ci in CategoriasInteresse.objects.all(): |
||||
|
if ci.coorte: |
||||
|
total_matriculas = ci.total_alunos_coorte() |
||||
|
elif ci.apurar_conclusao: |
||||
|
data = {x['completionstatus']: x for x in CourseStats.objects.filter(category__in=ci.categorias(subcategorias=True)). \ |
||||
|
values('completionstatus').annotate(total_users=Sum('usercount'),grade_average=Avg('gradeaverage'))} |
||||
|
total_matriculas = sum(x['total_users'] for k, x in data.items()) |
||||
|
else: |
||||
|
total_matriculas = CourseStats.objects.filter(category__in=ci.categorias(subcategorias=True)). \ |
||||
|
aggreate(total_users=Sum('usercount'))['total_users'] |
||||
|
|
||||
|
dados = [{'descricao': _(u'Total de matrículas'), 'valor': total_matriculas}] |
||||
|
|
||||
|
if ci.coorte: |
||||
|
for c in ci.categorias(subcategorias=True): |
||||
|
dados.append({'descricao': c.name, 'valor': c.total_alunos_cohort()}) |
||||
|
|
||||
|
if ci.apurar_conclusao: |
||||
|
if 'N' in data: |
||||
|
dados.append({'descricao': _(u'Matrículas rejeitadas'), 'help_text': _(u'demanda reprimida'), |
||||
|
'valor': data['N']['total_users'], 'percentual': 100.0 * data['N']['total_users'] / total_matriculas}) |
||||
|
total_alunos = total_matriculas - data['N']['total_users'] |
||||
|
dados.append({'descricao': _(u'Alunos efetivos'), 'help_text': _(u'os percentuais seguintes se referem a este indicador'), |
||||
|
'valor': total_alunos}) |
||||
|
else: |
||||
|
total_alunos = total_matriculas |
||||
|
|
||||
|
if 'C' in data: |
||||
|
dados.append({'descricao': _(u'Alunos em curso'), 'valor': data['C']['total_users'], |
||||
|
'percentual': 100.0 * data['C']['total_users'] / total_alunos }) |
||||
|
if 'L' in data: |
||||
|
dados.append({'descricao': _(u'Alunos que abandonaram o curso'), 'valor': data['L']['total_users'], |
||||
|
'percentual': 100.0 * data['L']['total_users'] / total_alunos }) |
||||
|
if 'R' in data: |
||||
|
dados.append({'descricao': _(u'Alunos reprovados'), 'valor': data['R']['total_users'], |
||||
|
'percentual': 100.0 * data['R']['total_users'] / total_alunos}) |
||||
|
if 'A' in data: |
||||
|
dados.append({'descricao': _(u'Alunos aprovados'), 'valor': data['A']['total_users'], |
||||
|
'percentual': 100.0 * data['A']['total_users'] / total_alunos}) |
||||
|
|
||||
|
if 'I' in data: |
||||
|
dados.append({'descricao': _(u'Situação indefinida'), 'valor': data['I']['total_users'], |
||||
|
'help_text': _(u'Situação do aluno não pode ser determinada pelo sistema'), |
||||
|
'percentual': 100.0 * data['I']['total_users'] / total_alunos}) |
||||
|
|
||||
|
if 'A' in data: |
||||
|
dados.append({'descricao': _(u'Média das notas dos alunos aprovados (%)'), 'valor': int(data['A']['grade_average'])}) |
||||
|
|
||||
|
if 'R' in data: |
||||
|
dados.append({'descricao': _(u'Média das notas dos alunos reprovados (%)'), 'valor': int(data['R']['grade_average'])}) |
||||
|
|
||||
|
areas.append({'titulo': ci.descricao, 'dados': dados}) |
||||
|
|
||||
|
paineis = [{'titulo': _(u'Saberes em números'), 'dados': numeros}] + areas |
||||
|
|
||||
|
PainelItem.objects.all().delete() # Clear dashboard |
||||
|
|
||||
|
for p in paineis: |
||||
|
for d in p['dados']: |
||||
|
PainelItem.objects.create(painel=p['titulo'], descricao=d['descricao'], help_text= d['help_text'] if 'help_text' in |
||||
|
d else '', valor=d['valor'], percentual=d['percentual'] if 'percentual' in d else None) |
||||
|
|
@ -1,54 +1,21 @@ |
|||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
from collections import OrderedDict |
||||
from django.utils.translation import ugettext as _ |
from django.utils.translation import ugettext as _ |
||||
from django.db.models import Count |
from django.db.models import Sum, Avg |
||||
from django.shortcuts import render, render_to_response |
from django.shortcuts import render, render_to_response |
||||
from django.template import RequestContext |
from django.template import RequestContext |
||||
from sigi.apps.mdl.models import User, CourseStatus |
from sigi.apps.mdl.models import User, CourseStats |
||||
from sigi.apps.saberes.models import CategoriasInteresse |
from sigi.apps.saberes.models import CategoriasInteresse, PainelItem |
||||
|
|
||||
def dashboard(request): |
def dashboard(request): |
||||
areas = [] |
paineis = OrderedDict() |
||||
numeros = [ |
|
||||
{'descricao': _(u'Total de usuários cadastrados'), 'valor': User.objects.count()}, |
|
||||
{'descricao': _(u'Novos usuários cadastrados') , 'valor': User.objects.filter(firstaccess__gte=1392326052).count()} |
|
||||
] |
|
||||
|
|
||||
for ci in CategoriasInteresse.objects.all(): |
for p in PainelItem.objects.all(): |
||||
matriculas = ci.total_alunos() |
if p.painel not in paineis: |
||||
numeros.append({'descricao': _(u'Total de matrículas em %s' % ci.descricao.lower()), 'valor': matriculas}) |
paineis[p.painel] = {'titulo': p.painel, 'dados': []} |
||||
area = {'titulo': ci.descricao, 'dados': [{'descricao': _(u'Total de matrículas'), 'valor': matriculas}]} |
paineis[p.painel]['dados'].append(p) |
||||
for course in ci.get_all_courses(only_visible=True): |
|
||||
area['dados'].append({'descricao': course.fullname, 'valor': course.total_alunos()}) |
|
||||
# if ci.apurar_alunos: # Apurar número de alunos |
|
||||
# valor = sum([curso.total_ativos() for curso in ci.get_all_courses()]) |
|
||||
# area['dados'].append({'descricao': _(u'Total de alunos aceitos'), 'valor': valor}) |
|
||||
# if ci.apurar_conclusao: |
|
||||
# cl = [curso.id for curso in ci.get_all_courses()] |
|
||||
# for cs in CourseStatus.objects.filter(courseid__in=cl).values('status').annotate(valor=Count('userid')): |
|
||||
# area['dados'].append({'descricao': cs['status'], 'valor': cs['valor']}) |
|
||||
# |
|
||||
areas.append(area) |
|
||||
|
|
||||
paineis = [{'titulo': _(u'Saberes em números'), 'dados': numeros}] + areas |
|
||||
|
|
||||
|
extra_context = {'paineis': paineis} |
||||
totais = [] |
|
||||
|
|
||||
# for i in MapaCategorias.INTERESSE_CHOICES: |
|
||||
# totais.append({'nome': i[1], 'total_turmas': '', 'total_alunos': '', 'padding': 0}) |
|
||||
# for mapa in MapaCategorias.objects.filter(area_interesse=i[0]): |
|
||||
# totais.append({'nome': mapa.categoria.name, 'total_turmas': mapa.total_turmas(), 'total_alunos': mapa.total_alunos(), 'padding': 1}) |
|
||||
# for c in mapa.categoria.children.all(): |
|
||||
# totais.append({'nome': c.name, 'total_turmas': c.total_turmas(), 'total_alunos': c.total_alunos(), 'padding': 2}) |
|
||||
|
|
||||
tutorias = [] |
|
||||
|
|
||||
# for mapa in MapaCategorias.objects.filter(area_interesse='CT'): |
|
||||
# tutorias.append({'nome': mapa.categoria.name, 'inscritos': mapa.total_alunos(), 'padding': 0}) |
|
||||
# for c in mapa.categoria.courses.all(): |
|
||||
# tutorias.append({'nome': c.fullname, 'inscritos': c.total_alunos(), 'padding': 1}) |
|
||||
|
|
||||
extra_context = {'numeros': numeros, 'paineis': paineis, 'totais': totais, 'tutorias': tutorias} |
|
||||
|
|
||||
return render_to_response('saberes/dashboard.html', extra_context, context_instance=RequestContext(request)) |
return render_to_response('saberes/dashboard.html', extra_context, context_instance=RequestContext(request)) |
Loading…
Reference in new issue