Browse Source

Migrando os graficos Pie de diagnosticos

producao
Breno Teixeira 11 years ago
parent
commit
8bef2c21c8
  1. 19
      sigi/apps/diagnosticos/templates/diagnosticos/graficos.html
  2. 147
      sigi/apps/diagnosticos/views.py

19
sigi/apps/diagnosticos/templates/diagnosticos/graficos.html

@ -4,8 +4,11 @@
{% block extrahead %} {% block extrahead %}
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.4.min.js"></script> <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="{{ STATIC_URL }}js/Chart.min.js"></script>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script language=javascript> <script language=javascript>
jQuery(document).ready(function () { jQuery(document).ready(function () {
jQuery("form#categoria select").change(function () { jQuery("form#categoria select").change(function () {
jQuery("form#categoria").submit() jQuery("form#categoria").submit()
}); });
@ -13,14 +16,16 @@ jQuery(document).ready(function () {
jQuery("#perguntas a").click(function(event){ jQuery("#perguntas a").click(function(event){
event.preventDefault(); event.preventDefault();
id = jQuery(this).attr('id') var id = jQuery(this).attr('id')
output_id = '#output_'+id var output_id = 'output_'+id
jQuery.ajax({ jQuery.ajax({
url: jQuery(this).attr('href'), url: jQuery(this).attr('href'),
data: output_id,
success: function(data) { success: function(data) {
jQuery("img", output_id).attr('src',data['url']) var ctx = document.getElementById("myChart").getContext("2d");
jQuery("img", output_id).slideDown() var myNewChart = new Chart(ctx).Pie(data);
}, },
error: function(errorSender, errorMsg) { error: function(errorSender, errorMsg) {
jQuery(output_id).html(errorSender + ' ' + errorMsg); jQuery(output_id).html(errorSender + ' ' + errorMsg);
} }
@ -49,8 +54,8 @@ jQuery(document).ready(function () {
<li> <li>
{% if pergunta.datatype == 'many' or pergunta.datatype == 'one' %} {% if pergunta.datatype == 'many' or pergunta.datatype == 'one' %}
<a id="{{ pergunta.name }}" href="/diagnosticos/api/?id={{ pergunta.name }}"><p>{{ pergunta.title }}</p></a> <a id="{{ pergunta.name }}" href="/diagnosticos/api/?id={{ pergunta.name }}"><p>{{ pergunta.title }}</p></a>
<div id="output_{{ pergunta.name }}" class="grafico"> <div id="output_{{ pergunta.name }}">
<img style="display:none"/> <canvas id="myChart" width="400" height="400"></canvas>
</div> </div>
{% else %} {% else %}
<p>{{ pergunta.title }}</p> <p>{{ pergunta.title }}</p>
@ -60,4 +65,4 @@ jQuery(document).ready(function () {
</ul> </ul>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

147
sigi/apps/diagnosticos/views.py

@ -1,12 +1,13 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
import new import json
from django.http import HttpResponse, QueryDict from itertools import cycle
from django.http import HttpResponse
from django.utils import simplejson from django.utils import simplejson
from django.shortcuts import render_to_response, get_object_or_404, redirect from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext from django.template import RequestContext
from django.views.decorators.cache import never_cache from django.views.decorators.cache import never_cache
from geraldo.generators import PDFGenerator
from sigi.apps.diagnosticos.urls import LOGIN_REDIRECT_URL from sigi.apps.diagnosticos.urls import LOGIN_REDIRECT_URL
from sigi.apps.utils.decorators import login_required from sigi.apps.utils.decorators import login_required
@ -14,7 +15,7 @@ from sigi.apps.diagnosticos.decorators import validate_diagnostico
from sigi.apps.diagnosticos.models import Diagnostico, Categoria, Pergunta from sigi.apps.diagnosticos.models import Diagnostico, Categoria, Pergunta
from sigi.apps.casas.models import Funcionario from sigi.apps.casas.models import Funcionario
from sigi.apps.diagnosticos.forms import (DiagnosticoMobileForm, from sigi.apps.diagnosticos.forms import (DiagnosticoMobileForm,
CasaLegislativaMobileForm, FuncionariosMobileForm) CasaLegislativaMobileForm, FuncionariosMobileForm)
from sigi.apps.contatos.models import Telefone from sigi.apps.contatos.models import Telefone
from sigi.shortcuts import render_to_pdf from sigi.shortcuts import render_to_pdf
@ -47,9 +48,9 @@ def categorias(request, id_diagnostico):
ultima_categoria = request.session.get('ultima_categoria', 0) ultima_categoria = request.session.get('ultima_categoria', 0)
context = RequestContext(request, {'categorias': categorias, context = RequestContext(request, {'categorias': categorias,
'diagnostico': diagnostico, 'ultima_categoria': ultima_categoria}) 'diagnostico': diagnostico, 'ultima_categoria': ultima_categoria})
return render_to_response('diagnosticos/diagnosticos_categorias_list.html', return render_to_response('diagnosticos/diagnosticos_categorias_list.html',
context) context)
@never_cache @never_cache
@ -80,7 +81,7 @@ def categoria_detalhes(request, id_diagnostico, id_categoria):
if request.method == "POST": if request.method == "POST":
form = DiagnosticoMobileForm(request.POST, form = DiagnosticoMobileForm(request.POST,
instance=diagnostico, category=id_categoria) instance=diagnostico, category=id_categoria)
if form.is_valid(): if form.is_valid():
form.save() form.save()
resposta = { resposta = {
@ -96,12 +97,12 @@ def categoria_detalhes(request, id_diagnostico, id_categoria):
return HttpResponse(json, mimetype="application/json") return HttpResponse(json, mimetype="application/json")
else: else:
form = DiagnosticoMobileForm(instance=diagnostico, form = DiagnosticoMobileForm(instance=diagnostico,
category=id_categoria) category=id_categoria)
context = RequestContext(request, {'form': form, 'categoria': categoria, context = RequestContext(request, {'form': form, 'categoria': categoria,
'diagnostico': diagnostico}) 'diagnostico': diagnostico})
return render_to_response('diagnosticos/diagnosticos_categorias_form.html', return render_to_response('diagnosticos/diagnosticos_categorias_form.html',
context) context)
@never_cache @never_cache
@ -118,7 +119,7 @@ def categoria_casa_legislativa(request, id_diagnostico):
if request.method == "POST": if request.method == "POST":
form = CasaLegislativaMobileForm(request.POST, form = CasaLegislativaMobileForm(request.POST,
instance=casa_legislativa) instance=casa_legislativa)
if form.is_valid(): if form.is_valid():
form.save() form.save()
resposta = { resposta = {
@ -136,7 +137,7 @@ def categoria_casa_legislativa(request, id_diagnostico):
form = CasaLegislativaMobileForm(instance=casa_legislativa) form = CasaLegislativaMobileForm(instance=casa_legislativa)
context = RequestContext(request, {'form': form, context = RequestContext(request, {'form': form,
'diagnostico': diagnostico, 'casa_legislativa': casa_legislativa}) 'diagnostico': diagnostico, 'casa_legislativa': casa_legislativa})
return render_to_response( return render_to_response(
'diagnosticos/diagnosticos_categoria_casa_legislativa_form.html', 'diagnosticos/diagnosticos_categoria_casa_legislativa_form.html',
context) context)
@ -153,16 +154,16 @@ def categoria_contatos(request, id_diagnostico):
diagnostico = Diagnostico.objects.get(pk=id_diagnostico) diagnostico = Diagnostico.objects.get(pk=id_diagnostico)
casa_legislativa = diagnostico.casa_legislativa casa_legislativa = diagnostico.casa_legislativa
funcionarios = [] funcionarios = []
for n, l in Funcionario.SETOR_CHOICES: for n, l in Funcionario.SETOR_CHOICES:
if casa_legislativa.funcionario_set.filter(setor=n).count() <= 1: if casa_legislativa.funcionario_set.filter(setor=n).count() <= 1:
funcionarios.append(casa_legislativa.funcionario_set.get_or_create(setor=n)) funcionarios.append(casa_legislativa.funcionario_set.get_or_create(setor=n))
else: else:
for f in casa_legislativa.funcionario_set.filter(setor=n): for f in casa_legislativa.funcionario_set.filter(setor=n):
funcionarios.append((f, False)) funcionarios.append((f, False))
if request.method == "POST": if request.method == "POST":
forms = [] forms = []
for f, c in funcionarios: for f, c in funcionarios:
@ -176,7 +177,7 @@ def categoria_contatos(request, id_diagnostico):
'erros' : {}, 'erros' : {},
'fones' : {}, 'fones' : {},
'clean' : (), 'clean' : (),
} }
# valida e salva um formulario por vez # valida e salva um formulario por vez
for form in forms: for form in forms:
@ -199,15 +200,15 @@ def categoria_contatos(request, id_diagnostico):
for form_telefones in form.telefones.forms: for form_telefones in form.telefones.forms:
if not form_telefones.is_valid(): if not form_telefones.is_valid():
if (form_telefones.fields['id'].initial is not None if (form_telefones.fields['id'].initial is not None
and form_telefones.fields['tipo'].initial == 'I' and form_telefones.fields['tipo'].initial == 'I'
and form_telefones.fields['numero'].initial is None): and form_telefones.fields['numero'].initial is None):
if Telefone.objects.filter(pk=form_telefones.fields['id'].initial).exists(): if Telefone.objects.filter(pk=form_telefones.fields['id'].initial).exists():
Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete() Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete()
if not resposta['fones'].has_key(form.prefix): if not resposta['fones'].has_key(form.prefix):
resposta['fones'][form.prefix] = '' resposta['fones'][form.prefix] = ''
resposta['fones'][form.prefix] += u'<p>O telefone %s %s foi excluído da base de dados</p>' % ( resposta['fones'][form.prefix] += u'<p>O telefone %s %s foi excluído da base de dados</p>' % (
form_telefones.instance.get_tipo_display(), form_telefones.instance.numero) form_telefones.instance.get_tipo_display(), form_telefones.instance.numero)
else: else:
for key, value in form_telefones.errors.iteritems(): for key, value in form_telefones.errors.iteritems():
key = form_telefones.prefix + "-id-errors" key = form_telefones.prefix + "-id-errors"
resposta['erros'][key] = value resposta['erros'][key] = value
@ -216,12 +217,13 @@ def categoria_contatos(request, id_diagnostico):
return HttpResponse(json, mimetype="application/json") return HttpResponse(json, mimetype="application/json")
else: else:
forms = [FuncionariosMobileForm(prefix=f.setor, instance=f) forms = [FuncionariosMobileForm(prefix=f.setor, instance=f)
for f, c in funcionarios] for f, c in funcionarios]
context = RequestContext(request, {'forms': forms, context = RequestContext(request, {'forms': forms,
'diagnostico': diagnostico, 'casa_legislativa': casa_legislativa}) 'diagnostico': diagnostico, 'casa_legislativa': casa_legislativa})
return render_to_response('diagnosticos/diagnosticos_categoria_contatos_form.html', return render_to_response('diagnosticos/diagnosticos_categoria_contatos_form.html',
context) context)
def diagnostico_pdf(request, id_diagnostico): def diagnostico_pdf(request, id_diagnostico):
diagnostico = Diagnostico.objects.get(pk=id_diagnostico) diagnostico = Diagnostico.objects.get(pk=id_diagnostico)
@ -253,16 +255,17 @@ def diagnostico_pdf(request, id_diagnostico):
schemas_by_categoria.append((categoria,schemas)) schemas_by_categoria.append((categoria,schemas))
context = RequestContext(request, { context = RequestContext(request, {
'pagesize':'A4', 'pagesize':'A4',
'casa_legislativa': casa_legislativa, 'casa_legislativa': casa_legislativa,
'funcionarios': funcionarios, 'funcionarios': funcionarios,
'diagnostico': diagnostico, 'diagnostico': diagnostico,
'schemas_by_categoria': schemas_by_categoria, 'schemas_by_categoria': schemas_by_categoria,
}) })
return render_to_pdf('diagnosticos/diagnostico_pdf.html', context) return render_to_pdf('diagnosticos/diagnostico_pdf.html', context)
#return render_to_response('diagnosticos/diagnostico_pdf.html', context) #return render_to_response('diagnosticos/diagnostico_pdf.html', context)
def graficos(request): def graficos(request):
categorias = Categoria.objects.all() categorias = Categoria.objects.all()
@ -275,7 +278,8 @@ def graficos(request):
'perguntas': perguntas, 'perguntas': perguntas,
}) })
return render_to_response('diagnosticos/graficos.html', return render_to_response('diagnosticos/graficos.html',
context) context)
def percentage(fraction, population): def percentage(fraction, population):
try: try:
@ -283,69 +287,58 @@ def percentage(fraction, population):
except ValueError: except ValueError:
return '' return ''
def grafico_api(request): def grafico_api(request):
colors = ['ffff00', 'cc7900', 'ff0000', '92d050', '006600', '0097cc', '002776', 'ae78d6', 'ff00ff', '430080',
'28d75c', '0000ff', 'fff200']
graph_url = "http://chart.apis.google.com/chart"
#graph_params = QueryDict("chxt=y&chbh=a&chco=A2C180,3D7930")
graph_params = QueryDict("")
graph_params = graph_params.copy() # to make it mutable
width = request.REQUEST.get('width', '800') colors = cycle(['#7cb5ec',
height = request.REQUEST.get('height', '300') '#434348',
graph_params.update({'chs': width + 'x' + height}) '#90ed7d',
'#f7a35c',
'#8085e9',
'#f15c80',
'#e4d354',
'#8085e8',
'#8d4653',
'#91e8e1', ])
highlights = cycle(['#B0D3F4',
'#8E8E91',
'#BCF4B1',
'#FAC89D',
'#B3B6F2',
'#F79DB3',
'#EFE598',
'#B3B6F1',
'#BB9098',
'#BDF1ED', ])
pergunta_slug = request.REQUEST.get('id', None) pergunta_slug = request.REQUEST.get('id', None)
pergunta = get_object_or_404(Pergunta, name=pergunta_slug) pergunta = get_object_or_404(Pergunta, name=pergunta_slug)
if pergunta.datatype == 'one': if pergunta.datatype == 'one':
total = sum([r[1] for r in pergunta.group_choices()])
choices = [str(r[1]) for r in pergunta.group_choices()]
legend = [percentage(r[1],total) + " " + str(r[0]) for r in pergunta.group_choices()]
colors = ['ff0000', 'fff200', '0000ff', '28d75c'] + ["%0.6x" % (0x48d1 + (0xda74 * c))
for c in range(0,len(pergunta.group_choices()))]
graph_params.update({
'cht': 'p',
'chd': 't:' + ",".join(choices),
'chdl': '' + "|".join(legend),
'chco': '' + '|'.join(colors[:len(pergunta.group_choices())])
})
elif pergunta.datatype == 'many':
total = sum([r[1] for r in pergunta.group_choices()])
percent = [str(float(r[1])*100/total) for r in pergunta.group_choices()]
choices = [str(r[1]) for r in pergunta.group_choices()]
legend = [str(r[0]) for r in pergunta.group_choices()]
colors = ['ffff00', 'cc7900', 'ff0000', '92d050', '006600', '0097cc', '002776', 'ae78d6', 'ff00ff', '430080'] + \
["%0.6x" % (0x48d1 + (0xda74 * c)) for c in range(0,len(pergunta.group_choices()))]
graph_params.update({
'cht': 'bvg',
'chxt': 'y',
'chd': 't:' + ",".join(percent),
'chdl': '' + "|".join(legend),
'chl': '' + "|".join(choices),
'chco': '' + '|'.join(colors[:len(pergunta.group_choices())])
})
response = { list_perguntas = pergunta.group_choices()
"type": "photo", list_perguntas = [{'label': k.title,
"width": width, 'value': v,
"height": height, 'color': colors.next(),
"title": pergunta.title, 'highlight': highlights.next()}
"url": graph_url + "?" + graph_params.urlencode(), for k, v in list_perguntas]
"provider_name": "SIGI",
"provider_url": "https://intranet.interlegis.gov.br/sigi/" # list_perguntas = [[k.title, v, colors.next(), highlights.next()] for k, v in list_perguntas]
}
# elif pergunta.datatype == 'many':
jsonn = json.dumps(list_perguntas, sort_keys=True, indent=4, separators=(',', ': '))
return HttpResponse(jsonn, content_type="application/json")
json = simplejson.dumps(response)
return HttpResponse(json, mimetype="application/json")
def municipios_diagnosticados(self): def municipios_diagnosticados(self):
municipios = [] municipios = []
for d in Diagnostico.objects.all(): for d in Diagnostico.objects.all():
m = d.casa_legislativa.municipio m = d.casa_legislativa.municipio
municipio = {'nome': d.casa_legislativa.nome + ', ' + m.uf.sigla, 'lat': str(m.latitude), 'lng': str(m.longitude), 'inicio': d.data_visita_inicio, municipio = {'nome': d.casa_legislativa.nome + ', ' + m.uf.sigla, 'lat': str(m.latitude), 'lng': str(m.longitude), 'inicio': d.data_visita_inicio,
'fim': d.data_visita_fim, 'equipe': "<ul><li>" + "</li><li>".join([m.user.get_full_name() for m in d.membros]) + "</li></ul>",} 'fim': d.data_visita_fim, 'equipe': "<ul><li>" + "</li><li>".join([m.user.get_full_name() for m in d.membros]) + "</li></ul>",}
municipios.append(municipio) municipios.append(municipio)
return HttpResponse(simplejson.dumps(municipios), mimetype="application/json") return HttpResponse(simplejson.dumps(municipios), mimetype="application/json")
Loading…
Cancel
Save