Browse Source

Add Saberes app to control and display Saberes dashboard

producao
Sesostris Vieira 10 years ago
parent
commit
e1177c6123
  1. 0
      sigi/apps/saberes/__init__.py
  2. 12
      sigi/apps/saberes/admin.py
  3. 51
      sigi/apps/saberes/models.py
  4. 20
      sigi/apps/saberes/templates/saberes/dashboard.html
  5. 22
      sigi/apps/saberes/templates/saberes/snippets.html
  6. 3
      sigi/apps/saberes/tests.py
  7. 6
      sigi/apps/saberes/urls.py
  8. 54
      sigi/apps/saberes/views.py

0
sigi/apps/saberes/__init__.py

12
sigi/apps/saberes/admin.py

@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext as _
from django.contrib import admin
from sigi.apps.saberes.models import CategoriasInteresse
class CategoriasInteresseAdmin(admin.ModelAdmin):
list_display = ('prefixo', 'descricao', 'count_categorias',)
def count_categorias(self, obj):
return obj.categorias().count()
count_categorias.short_description = _("Categorias que casam")
admin.site.register(CategoriasInteresse, CategoriasInteresseAdmin)

51
sigi/apps/saberes/models.py

@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.utils.translation import ugettext as _
from django.db import models
from django.db.models import Q
from sigi.apps.mdl.models import Course, CourseCategories, CourseCompletions, UserEnrolments
class CategoriasInteresse(models.Model):
prefixo = models.CharField(_(u"Prefixo das categorias no Moodle"), max_length=100,
help_text=_(u"Identifica as categorias no Moodle (campo idnumber) relacionadas a este interesse"))
descricao = models.CharField(_(u"Descrição"), max_length=100)
sigla = models.CharField(_(u"Sigla"), max_length=20)
coorte = models.BooleanField(_(u"Usa Cohorte"), default=False, help_text=_(u"Usa cohorte para calcular o número de matrículas/alunos"))
apurar_alunos = models.BooleanField(_(u"Apurar alunos"), default=False, help_text=_(u"Indica que deve-se verificar o perfil da"\
+ " inscrição para saber se é um aluno ou se a matrícula foi rejeitada"))
apurar_conclusao = models.BooleanField(_(u"Apurar conclusão"), default=False, help_text=_(u"Indica se o dashboard mostrará o "\
+ "número de alunos aprovados, reprovados e desistentes"))
class Meta:
verbose_name = _(u'Categorias de interesse')
def __unicode__(self):
return self.descricao
def categorias(self):
return CourseCategories.objects.filter(idnumber__startswith=self.prefixo)
def get_all_courses(self, only_visible=False):
q = Course.objects.none()
for categoria in self.categorias():
q = q | categoria.get_all_courses(only_visible=only_visible)
return q
def get_all_completions(self):
q = CourseCompletions.objects.none()
for c in self.get_all_courses():
q = q | c.coursecompletions_set.all()
return q
def get_all_enrolments(self):
q = UserEnrolments.objects.none()
for c in self.get_all_courses():
q = q | c.get_matriculas()
return q
def total_alunos(self):
if self.coorte:
return sum(c.total_alunos_cohort() for c in self.categorias())
else:
return sum([c.total_alunos() for c in self.categorias()])

20
sigi/apps/saberes/templates/saberes/dashboard.html

@ -0,0 +1,20 @@
{% extends "admin/base_site.html" %}
{% block extrastyle %}
{{ block.super }}
<style>
td.number {
text-align: right;
}
.panel-body {
max-height: 400px;
overflow: auto;
}
</style>
{% endblock %}
{% block content %}
<div id="content-main">
{% include "saberes/snippets.html" %}
</div>
{% endblock %}

22
sigi/apps/saberes/templates/saberes/snippets.html

@ -0,0 +1,22 @@
{% load charts %}
<div class="row row-flex row-flex-wrap">
{% for painel in paineis %}
<div class="col-md-4">
<div class="panel panel-primary flex-col">
<div class="panel-heading">{{ painel.titulo }}</div>
<div class="panel-body">
<table class='table'>
{% for linha in painel.dados %}
<tr>
<th>{{ linha.descricao }}</th>
<td class='number'>{{ linha.valor }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
{% cycle '' '' '</div><div class="row">' %}
{% endfor %}
</div>

3
sigi/apps/saberes/tests.py

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

6
sigi/apps/saberes/urls.py

@ -0,0 +1,6 @@
# coding: utf-8
from django.conf.urls import patterns, url
urlpatterns = patterns('sigi.apps.saberes.views',
url(r'^dashboard/$', 'dashboard', name="saberes-dashboard-view"),
)

54
sigi/apps/saberes/views.py

@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext as _
from django.db.models import Count
from django.shortcuts import render, render_to_response
from django.template import RequestContext
from sigi.apps.mdl.models import User, CourseStatus
from sigi.apps.saberes.models import CategoriasInteresse
def dashboard(request):
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():
matriculas = ci.total_alunos()
numeros.append({'descricao': _(u'Total de matrículas em %s' % ci.descricao.lower()), 'valor': matriculas})
area = {'titulo': ci.descricao, 'dados': [{'descricao': _(u'Total de matrículas'), 'valor': matriculas}]}
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
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))
Loading…
Cancel
Save