diff --git a/media/images/mapicon-large.png b/media/images/mapicon-large.png new file mode 100644 index 0000000..72fba13 Binary files /dev/null and b/media/images/mapicon-large.png differ diff --git a/media/images/mapmarker.png b/media/images/mapmarker.png index 7c0fc7e..61d7598 100644 Binary files a/media/images/mapmarker.png and b/media/images/mapmarker.png differ diff --git a/media/js/metas/mapa.js b/media/js/metas/mapa.js index 148d524..56a5bce 100644 --- a/media/js/metas/mapa.js +++ b/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: '' + municipio.nome + '

' + 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); \ No newline at end of file diff --git a/sigi/apps/metas/views.py b/sigi/apps/metas/views.py index 64fcafb..0a43d20 100644 --- a/sigi/apps/metas/views.py +++ b/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 link" % (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'] = "
".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") diff --git a/sigi/settings.py b/sigi/settings.py index e7d43f0..90534b1 100644 --- a/sigi/settings.py +++ b/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' diff --git a/sigi/templates/metas/mapa.html b/sigi/templates/metas/mapa.html index 17f247b..700369f 100644 --- a/sigi/templates/metas/mapa.html +++ b/sigi/templates/metas/mapa.html @@ -23,7 +23,6 @@ diff --git a/sigi/templates/snippets/modules/charts-convenios.html b/sigi/templates/snippets/modules/charts-convenios.html index 52f871f..ccfae74 100644 --- a/sigi/templates/snippets/modules/charts-convenios.html +++ b/sigi/templates/snippets/modules/charts-convenios.html @@ -106,11 +106,18 @@
+

Atendimentos

+

Mapa de atuação do Interlegis

+
+ +
+{% comment %}

Convênios

Processos de convênios por projeto

+{% endcomment %}
@@ -132,10 +139,10 @@ {% endfor %}
-
 
Atingido
-
 
Bom
-
 
Preocupante
 
Ruim
+
 
Preocupante
+
 
Bom
+
 
Atingido