Browse Source

Alterações no mapa e no dashboard - melhoria de apresentação e performance (uso de cache)

stable/1.0
Sesostris Vieira 12 years ago
parent
commit
d5a8cede51
  1. BIN
      media/images/mapicon-large.png
  2. BIN
      media/images/mapmarker.png
  3. 75
      media/js/metas/mapa.js
  4. 101
      sigi/apps/metas/views.py
  5. 4
      sigi/settings.py
  6. 4
      sigi/templates/metas/mapa.html
  7. 13
      sigi/templates/snippets/modules/charts-convenios.html
  8. 2
      sigi/urls.py

BIN
media/images/mapicon-large.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

BIN
media/images/mapmarker.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 386 B

After

Width:  |  Height:  |  Size: 483 B

75
media/js/metas/mapa.js

@ -1,9 +1,9 @@
(function($) {
var map; // O mapa - Será carregado assim que o documento estiver pronto
var markersArray = [];
var municipiosArray = [];
$(document).ready(function($) {
$("#filter_form").bind('submit', ajax_submit);
$("input[type='checkbox']").change(filter);
var latlng = new google.maps.LatLng(-14.2350040, -51.925280);
var myOptions = {
zoom: 5,
@ -16,31 +16,36 @@
})
function ajax_submit(event) {
var data = $("#filter_form").serialize();
$.post("/sigi/dashboard/map_data/", data, function(return_data) {
$.ajax({
url: "/sigi/dashboard/mapdata/",
type: 'GET',
cache: true,
success: function(return_data) {
// Delete all markers
if (markersArray) {
for (i in markersArray) {
markersArray[i].setMap(null);
if (municipiosArray) {
for (i in municipiosArray) {
municipiosArray[i].setMap(null);
}
}
markersArray.length = 0;
municipiosArray.length = 0;
// Plot new markers
// Create new markers
for (var i in return_data) {
var municipio = return_data[i];
var markData = {
map: map,
map: null, // Just create the mark, dont plot it
position: new google.maps.LatLng(parseFloat(municipio.lat), parseFloat(municipio.lng)),
title: municipio.nome,
icon: '/sigi/media/images/' + municipio.icone + '.png'
}
var mark = new google.maps.Marker(markData);
markersArray.push(mark);
var infoWin = new google.maps.InfoWindow({content: '<strong>' + municipio.nome + '</strong><br/><br/>' + municipio.info });
linkMarkMessage(mark, infoWin, map);
municipio['mapmark'] = mark
municipiosArray.push(municipio);
}
});
filter(null);
}});
return false;
}
@ -48,4 +53,50 @@
google.maps.event.addListener(mark, 'click', function() {infoWin.open(map, mark);});
}
function filter(event) {
var data = $("#filter_form").serializeArray();
var estados = [];
var regioes = [];
for (var i in data) {
var name = data[i].name, value = data[i].value;
if (name == 'estados') {
estados.push(value);
delete data[i];
} else if (name == 'regioes') {
regioes.push(value);
delete data[i];
}
}
for (var i in municipiosArray) {
var municipio = municipiosArray[i];
var aparece = false;
if (regioes.indexOf(municipio.regiao) == -1 && estados.indexOf(municipio.estado) == -1) {
aparece = false;
} else {
for (var j in data) {
if (data[j]) {
var name = data[j].name, value = data[j].value;
idx = municipio[name].indexOf(value);
if (idx != -1) {
aparece = true;
break;
}
}
}
}
if (aparece) {
if (municipio.mapmark.map == null) {
municipio.mapmark.setMap(map);
}
} else {
if (municipio.mapmark.map != null) {
municipio.mapmark.setMap(null);
}
}
}
}
})(django.jQuery);

101
sigi/apps/metas/views.py

@ -4,6 +4,7 @@ from django.utils import simplejson
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.db.models import Q
from django.views.decorators.cache import cache_page
from sigi.apps.servicos.models import TipoServico, Servico
from sigi.apps.convenios.models import Projeto, Convenio
from sigi.apps.contatos.models import UnidadeFederativa
@ -21,7 +22,7 @@ def mapa(request):
seit = [ ts.sigla for ts in servico_choices]
convenios = ['PML'] # Apenas o ultimo #hardcoded #fixme
equipadas = [p.sigla for p in projeto_choices]
equipadas = [] #[p.sigla for p in projeto_choices]
diagnosticos = ['P'] # choices: ["A", "P"]
regioes = [r[0] for r in regiao_choices]
estados = []
@ -41,110 +42,56 @@ def mapa(request):
return render_to_response('metas/mapa.html', extra_context, context_instance=RequestContext(request))
@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos)
def map_data(request):
"""
Monta json com dados dos municípios conforme seleção do usuário
"""
# Seleções default
regiao_choices = UnidadeFederativa.REGIAO_CHOICES
seit = request.POST.getlist('seit')
convenios = request.POST.getlist('convenios')
equipadas = request.POST.getlist('equipadas')
diagnosticos = request.POST.getlist('diagnosticos')
regioes = request.POST.getlist('regioes')
estados = request.POST.getlist('estados')
qRegiao = Q(municipio__uf__regiao__in=regioes) if len(regioes) < len(regiao_choices) else Q()
qEstado = Q(municipio__uf__sigla__in=estados) if estados else Q()
qSeit = Q(servico__data_desativacao=None, servico__tipo_servico__sigla__in=seit) if seit else Q()
qConvenios = Q(~Q(convenio__data_retorno_assinatura=None), tipo__sigla='CM', convenio__projeto__sigla__in=convenios) if convenios else Q()
qEquipadas = Q(tipo__sigla='CM', convenio__equipada=True, convenio__projeto__sigla__in=equipadas) if equipadas else Q()
qDiagnosticos = Q((Q(diagnostico__publicado=True) if 'P' in diagnosticos else Q()) |
(Q(diagnostico__publicado=False) if 'A' in diagnosticos else Q()))
Monta json com todos os dados dos municípios que têm relação com o Interlegis
"""
casas = {}
for c in CasaLegislativa.objects.select_related('servico', 'convenio', 'diagnostico').filter(qRegiao | qEstado).filter(qSeit |
qConvenios | qEquipadas | qDiagnosticos).distinct():
for c in CasaLegislativa.objects.select_related('servico', 'convenio', 'diagnostico').all().distinct():
if c.servico_set.count() == 0 and c.convenio_set.count() == 0 and c.diagnostico_set.count() == 0:
continue; # Salta essa casa, pois ela não tem nada com o Interlegis
if not casas.has_key(c.pk):
casa = {
'nome': c.nome + ', ' + c.municipio.uf.sigla,
'icone': 'mapmarker',
'lat': str(c.municipio.latitude),
'lng': str(c.municipio.longitude),
'estado': c.municipio.uf.sigla,
'regiao': c.municipio.uf.regiao,
'diagnosticos': [],
'seit': [],
'convenios': [],
'equipadas': [],
'info': []
}
for sv in c.servico_set.all():
casa['info'].append(u"%s ativado em %s <a href='//%s' target='_blank'><img src='/sigi/media/images/link.gif' alt='link'></a>" % (sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y'), sv.url))
casa['seit'].append(sv.tipo_servico.sigla)
for cv in c.convenio_set.all():
if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite.strftime('%d/%m/%Y') is not None):
casa['info'].append(u"Equipada em %s pelo %s" % (cv.data_termo_aceite.strftime('%d/%m/%Y'), cv.projeto.sigla))
casa['equipadas'].append(cv.projeto.sigla)
if (cv.data_retorno_assinatura is not None) and not (cv.equipada and cv.data_termo_aceite.strftime('%d/%m/%Y') is not None):
casa['info'].append(u"Conveniada ao %s em %s" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y')))
casa['convenios'].append(cv.projeto.sigla)
if (cv.data_retorno_assinatura is not None) and (cv.equipada and cv.data_termo_aceite.strftime('%d/%m/%Y') is not None):
casa['info'].append(u"Conveniada ao %s em %s e equipada em %s" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y'), cv.data_termo_aceite.strftime('%d/%m/%Y')))
casa['equipadas'].append(cv.projeto.sigla)
casa['convenios'].append(cv.projeto.sigla)
for dg in c.diagnostico_set.all():
casa['diagnosticos'].append('P' if dg.publicado else 'A')
casa['info'].append(u'Diagnosticada no período de %s a %s' % (dg.data_visita_inicio.strftime('%d/%m/%Y'), dg.data_visita_fim.strftime('%d/%m/%Y')))
casa['info'] = "<br/>".join(casa['info'])
casas[c.pk] = casa
#-------------------------------------------------------------------------------------------------------------------------------
# if seit:
# for srv in Servico.objects.filter(qRegiao, qEstado, data_desativacao=None, tipo_servico__sigla__in=seit):
# if casas.has_key(srv.casa_legislativa.id):
# casa = casas[srv.casa_legislativa.id]
# else:
# casa = {
# 'nome': srv.casa_legislativa.nome + ', ' + srv.casa_legislativa.municipio.uf.sigla,
# 'icon': 'mapmarker',
# 'lat': str(srv.casa_legislativa.municipio.latitude),
# 'lng': str(srv.casa_legislativa.municipio.longitude),
# 'info': []
# }
# casas[srv.casa_legislativa.id] = casa
#
# casa['info'].append(srv.tipo_servico.nome)
#
# if convenios:
# for cnv in Convenio.objects.filter(qRegiao, qEstado, casa_legislativa__tipo__sigla='CM', projeto__sigla__in=convenios) \
# .exclude(data_retorno_assinatura=None):
# if casas.has_key(cnv.casa_legislativa.id):
# casa = casas[cnv.casa_legislativa.id]
# else:
# casa = {
# 'nome': cnv.casa_legislativa.nome + ', ' + cnv.casa_legislativa.municipio.uf.sigla,
# 'icon': 'mapmarker',
# 'lat': str(cnv.casa_legislativa.municipio.latitude),
# 'lng': str(cnv.casa_legislativa.municipio.longitude),
# 'info': []
# }
# casas[cnv.casa_legislativa.id] = casa
#
# casa['info'].append('Convênio %s assinado em %s' % (cnv.projeto.sigla, cnv.data_retorno_assinatura))
#
# if equipadas:
# for eqp in Convenio.objects.filter(qRegiao, qEstado, casa_legislativa__tipo__sigla='CM', equipada=True, projeto__sigla__in=equipadas)\
# .exclude(data_termo_aceite=None):
# if casas.has_key(eqp.casa_legislativa.id):
# casa = casas[eqp.casa_legislativa.id]
# else:
# casa = {
# 'nome': eqp.casa_legislativa.nome + ', ' + eqp.casa_legislativa.municipio.uf.sigla,
# 'icon': 'mapmarker',
# 'lat': str(eqp.casa_legislativa.municipio.latitude),
# 'lng': str(eqp.casa_legislativa.municipio.longitude),
# 'info': []
# }
# casas[eqp.casa_legislativa.id] = casa
#
# casa['info'].append('Equipada pelo %s em %s' % (eqp.projeto.sigla, eqp.data_termo_aceite))
#-------------------------------------------------------------------------------------------------------------------------------
return HttpResponse(simplejson.dumps(casas), mimetype="application/json")

4
sigi/settings.py

@ -109,7 +109,7 @@ AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
CACHE_BACKEND = 'dummy:///'
CACHE_BACKEND = 'locmem://' # Considerar seriamente a possibilidade de usar o memcached
CACHE_MIDDLEWARE_SECONDS = 60
CACHE_MIDDLEWARE_KEY_PREFIX = 'sigi'
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False
@ -134,6 +134,7 @@ TEMPLATE_CONTEXT_PROCESSORS = (
)
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.http.ConditionalGetMiddleware',
'django.middleware.gzip.GZipMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
@ -141,6 +142,7 @@ MIDDLEWARE_CLASSES = (
'django.middleware.cache.CacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.doc.XViewMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
ROOT_URLCONF = 'sigi.urls'

4
sigi/templates/metas/mapa.html

@ -23,7 +23,6 @@
<div id="content-related">
<div class="module" id="filters"> {% comment %} Adicione style="overflow: auto; height: 800px;" para rolar apenas na caixa de filtros {% endcomment %}
<h2>Filtros</h2>
<input type="submit" value="Filtrar"/>
<h3>Por Serviços SEIT</h3>
<ul>
{% for s in servico_choices %}
@ -43,7 +42,7 @@
<h3>Por Casas equipadas</h3>
<ul>
{% for p in projeto_choices %}
<li><input type="checkbox" name="equipadas" value="{{ p.sigla }}" {% if p.sigla in equipadas %}checked="checked" {% endif %}/>
<li><input type="checkbox" name="equipadas" value="{{ p.sigla }}" {% if p.sigla in equipadas %}checked="checked"{% endif %} />
pelo {{ p.sigla }}</li>
{% endfor %}
</ul>
@ -69,7 +68,6 @@
</li>
{% endfor %}
</ul>
<input type="submit" value="Filtrar"/>
</div>
</div>
</form>

13
sigi/templates/snippets/modules/charts-convenios.html

@ -106,11 +106,18 @@
</div>
<div class="module" style="height: 300px;">
<h2>Atendimentos</h2>
<h3>Mapa de atuação do Interlegis</h3>
<div class="align-center">
<a href="/sigi/dashboard/mapa/"> <img src="/sigi/media/images/mapicon-large.png" style="width: 60%;"/> </a>
</div>
{% comment %}
<h2>Convênios</h2>
<h3>Processos de convênios por projeto</h3>
<div class="align-center">
<img src="{{ processos.url }}&chdlp=b" class="chart" />
</div>
{% endcomment %}
</div>
<div class="module" style="height: 300px;">
@ -132,10 +139,10 @@
{% endfor %}
</table>
<div class="legend">
<span><div style="background-color: #A2BBED;">&nbsp;</div>Atingido</span>
<span><div style="background-color: #89D7AF;">&nbsp;</div>Bom</span>
<span><div style="background-color: #FFDB6E;">&nbsp;</div>Preocupante</span>
<span><div style="background-color: #E74A69;">&nbsp;</div>Ruim</span>
<span><div style="background-color: #FFDB6E;">&nbsp;</div>Preocupante</span>
<span><div style="background-color: #89D7AF;">&nbsp;</div>Bom</span>
<span><div style="background-color: #A2BBED;">&nbsp;</div>Atingido</span>
</div>
<!-- table>
<tr><th colspan="4">Legenda:</td></th>

2
sigi/urls.py

@ -98,7 +98,7 @@ urlpatterns = patterns(
# 'sigi.apps.servicos.views.casas_usam_servico'),
# Views de dashboard
(r'^sigi/dashboard/mapa/$', 'sigi.apps.metas.views.mapa'),
(r'^sigi/dashboard/map_data/$', 'sigi.apps.metas.views.map_data'),
(r'^sigi/dashboard/mapdata/$', 'sigi.apps.metas.views.map_data'),
# automatic interface based on admin
#(r'^sigi/(.*)', sites.default.root),
(r'^sigi/', include(sites.default.urls)),

Loading…
Cancel
Save