From 041b7bb2a4de3509d069445d1c071b76520a3a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Wed, 5 Dec 2012 07:51:36 -0200 Subject: [PATCH] =?UTF-8?q?Mapa=20para=20o=20dashboard=20que=20permite=20f?= =?UTF-8?q?iltragem=20e=20plota=20servi=C3=A7os=20SEIT,=20conv=C3=AAnios,?= =?UTF-8?q?=20equipamentos=20e=20diagn=C3=B3sticos.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- media/js/metas/mapa.js | 51 +++++++++++ sigi/apps/metas/__init__.py | 0 sigi/apps/metas/forms.py | 3 + sigi/apps/metas/models.py | 3 + sigi/apps/metas/urls.py | 3 + sigi/apps/metas/views.py | 150 +++++++++++++++++++++++++++++++++ sigi/templates/metas/mapa.html | 76 +++++++++++++++++ sigi/urls.py | 4 + 8 files changed, 290 insertions(+) create mode 100644 media/js/metas/mapa.js create mode 100644 sigi/apps/metas/__init__.py create mode 100644 sigi/apps/metas/forms.py create mode 100644 sigi/apps/metas/models.py create mode 100644 sigi/apps/metas/urls.py create mode 100644 sigi/apps/metas/views.py create mode 100644 sigi/templates/metas/mapa.html diff --git a/media/js/metas/mapa.js b/media/js/metas/mapa.js new file mode 100644 index 0000000..148d524 --- /dev/null +++ b/media/js/metas/mapa.js @@ -0,0 +1,51 @@ +(function($) { + var map; // O mapa - Será carregado assim que o documento estiver pronto + var markersArray = []; + + $(document).ready(function($) { + $("#filter_form").bind('submit', ajax_submit); + var latlng = new google.maps.LatLng(-14.2350040, -51.925280); + var myOptions = { + zoom: 5, + center: latlng, + mapTypeId: google.maps.MapTypeId.ROADMAP + }; + + map = new google.maps.Map(document.getElementById("map"), myOptions); + ajax_submit(); + }) + + function ajax_submit(event) { + var data = $("#filter_form").serialize(); + $.post("/sigi/dashboard/map_data/", data, function(return_data) { + // Delete all markers + if (markersArray) { + for (i in markersArray) { + markersArray[i].setMap(null); + } + } + markersArray.length = 0; + + // Plot new markers + for (var i in return_data) { + var municipio = return_data[i]; + var markData = { + map: map, + 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); + } + }); + return false; + } + + function linkMarkMessage(mark, infoWin, map) { + google.maps.event.addListener(mark, 'click', function() {infoWin.open(map, mark);}); + } + +})(django.jQuery); \ No newline at end of file diff --git a/sigi/apps/metas/__init__.py b/sigi/apps/metas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/metas/forms.py b/sigi/apps/metas/forms.py new file mode 100644 index 0000000..6b477f9 --- /dev/null +++ b/sigi/apps/metas/forms.py @@ -0,0 +1,3 @@ +from django import forms + +# place form definition here \ No newline at end of file diff --git a/sigi/apps/metas/models.py b/sigi/apps/metas/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/sigi/apps/metas/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/sigi/apps/metas/urls.py b/sigi/apps/metas/urls.py new file mode 100644 index 0000000..5d79a9f --- /dev/null +++ b/sigi/apps/metas/urls.py @@ -0,0 +1,3 @@ +from django.conf.urls.defaults import * + +# place app url patterns here \ No newline at end of file diff --git a/sigi/apps/metas/views.py b/sigi/apps/metas/views.py new file mode 100644 index 0000000..e423971 --- /dev/null +++ b/sigi/apps/metas/views.py @@ -0,0 +1,150 @@ +# -*- coding: utf-8 -*- +from django.http import HttpResponse +from django.utils import simplejson +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.db.models import Q +from sigi.apps.servicos.models import TipoServico, Servico +from sigi.apps.convenios.models import Projeto, Convenio +from sigi.apps.contatos.models import UnidadeFederativa +from apps.casas.models import CasaLegislativa + +def mapa(request): + """ + Mostra o mapa com filtros carregados com valores default + """ + + regiao_choices = UnidadeFederativa.REGIAO_CHOICES + estado_choices = UnidadeFederativa.objects.all() + servico_choices = TipoServico.objects.all() + projeto_choices = Projeto.objects.all() + + seit = [ ts.sigla for ts in servico_choices] + convenios = ['PML'] # Apenas o ultimo #hardcoded #fixme + equipadas = [p.sigla for p in projeto_choices] + diagnosticos = ['P'] # choices: ["A", "P"] + regioes = [r[0] for r in regiao_choices] + estados = [] + + extra_context = { + 'seit': seit, + 'convenios': convenios, + 'equipadas': equipadas, + 'diagnosticos': diagnosticos, + 'regioes': regioes, + 'estados': estados, + 'regiao_choices': regiao_choices, + 'estado_choices': estado_choices, + 'servico_choices': servico_choices, + 'projeto_choices': projeto_choices, + } + + return render_to_response('metas/mapa.html', extra_context, context_instance=RequestContext(request)) + +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())) + + casas = {} + + for c in CasaLegislativa.objects.select_related('servico', 'convenio', 'diagnostico').filter(qRegiao | qEstado).filter(qSeit | + qConvenios | qEquipadas | qDiagnosticos).distinct(): + 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), + 'info': [] + } + + for sv in c.servico_set.all(): + casa['info'].append("%s ativado em %s" % (sv.tipo_servico.nome, sv.data_ativacao)) + + for cv in c.convenio_set.all(): + if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite is not None): + casa['info'].append("Equipada em %s pelo %s" % (cv.data_termo_aceite, cv.projeto.sigla)) + if (cv.data_retorno_assinatura is not None) and not (cv.equipada and cv.data_termo_aceite is not None): + casa['info'].append("Conveniada ao %s em %s" % (cv.projeto.sigla, cv.data_retorno_assinatura)) + if (cv.data_retorno_assinatura is not None) and (cv.equipada and cv.data_termo_aceite is not None): + casa['info'].append("Conveniada ao %s em %s e equipada em %s" % (cv.projeto.sigla, cv.data_retorno_assinatura, cv.data_termo_aceite)) + + for dg in c.diagnostico_set.all(): + casa['info'].append('Diagnosticada no período de %s a %s' % (dg.data_visita_inicio, dg.data_visita_fim)) + + 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") \ No newline at end of file diff --git a/sigi/templates/metas/mapa.html b/sigi/templates/metas/mapa.html new file mode 100644 index 0000000..17f247b --- /dev/null +++ b/sigi/templates/metas/mapa.html @@ -0,0 +1,76 @@ +{% extends "admin/index.html" %} +{% load adminmedia %} + +{% block title %}SIGI{% endblock %} + +{% block extrahead %} + {{ block.super }} + + + + + +{% endblock %} + +{% block content %} +
+ +
+{% endblock %} + +{% block sidebar %} +
+ +
+{% endblock %} diff --git a/sigi/urls.py b/sigi/urls.py index 0a6cd2c..40b8e89 100644 --- a/sigi/urls.py +++ b/sigi/urls.py @@ -4,6 +4,7 @@ from django.conf.urls.defaults import patterns, include, url from django.views.generic.simple import redirect_to, direct_to_template import sites from sigi.apps.servicos.models import TipoServico +from sigi.apps.contatos.models import UnidadeFederativa # register admin filters import admin.filterspecs @@ -95,6 +96,9 @@ urlpatterns = patterns( (r'^sigi/servicos/munatenjson/(?P\w+)/$', 'sigi.apps.servicos.views.municipios_atendidos'), # (r'^sigi/servicos/listacasas/(?P\w+)', # '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'), # automatic interface based on admin #(r'^sigi/(.*)', sites.default.root), (r'^sigi/', include(sites.default.urls)),