Browse Source

Mapa para o dashboard que permite filtragem e plota serviços SEIT, convênios, equipamentos e diagnósticos.

stable/1.0
Sesostris Vieira 12 years ago
parent
commit
041b7bb2a4
  1. 51
      media/js/metas/mapa.js
  2. 0
      sigi/apps/metas/__init__.py
  3. 3
      sigi/apps/metas/forms.py
  4. 3
      sigi/apps/metas/models.py
  5. 3
      sigi/apps/metas/urls.py
  6. 150
      sigi/apps/metas/views.py
  7. 76
      sigi/templates/metas/mapa.html
  8. 4
      sigi/urls.py

51
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: '<strong>' + municipio.nome + '</strong><br/><br/>' + 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);

0
sigi/apps/metas/__init__.py

3
sigi/apps/metas/forms.py

@ -0,0 +1,3 @@
from django import forms
# place form definition here

3
sigi/apps/metas/models.py

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

3
sigi/apps/metas/urls.py

@ -0,0 +1,3 @@
from django.conf.urls.defaults import *
# place app url patterns here

150
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'] = "<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")

76
sigi/templates/metas/mapa.html

@ -0,0 +1,76 @@
{% extends "admin/index.html" %}
{% load adminmedia %}
{% block title %}SIGI{% endblock %}
{% block extrahead %}
{{ block.super }}
<script type="text/javascript" src="{% admin_media_prefix %}js/core.js"></script>
<script type="text/javascript" src="{% admin_media_prefix %}js/jquery.min.js"></script>
<script type="text/javascript" src="{% admin_media_prefix %}js/jquery.init.js"></script>
<script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="{{ MEDIA_URL }}js/metas/mapa.js"></script>
{% endblock %}
{% block content %}
<div id="map" style="width:100%; height: 800px; float: left;">
<!-- google map -->
</div>
{% endblock %}
{% block sidebar %}
<form id="filter_form" method="post" action="">
<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 %}
<li><input type="checkbox" name="seit" value="{{ s.sigla }}"
{% if s.sigla in seit %} checked="checked" {% endif %}/>
{{ s.nome }}
</li>
{% endfor %}
</ul>
<h3>Por Casas conveniadas</h3>
<ul>
{% for p in projeto_choices %}
<li><input type="checkbox" name="convenios" value="{{ p.sigla }}" {% if p.sigla in convenios %}checked="checked" {% endif %}/>
ao {{ p.sigla }}</li>
{% endfor %}
</ul>
<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 %}/>
pelo {{ p.sigla }}</li>
{% endfor %}
</ul>
<h3>Por Diagnósticos</h3>
<ul>
<li><input type="checkbox" name="diagnosticos" value="A" {% if "A" in diagnosticos %}checked="checked" {% endif %}/>
Em andamento</li>
<li><input type="checkbox" name="diagnosticos" value="P" {% if "P" in diagnosticos %}checked="checked" {% endif %}/>
Publicados</li>
</ul>
<h3>Por região</h3>
<ul>
{% for r in regiao_choices %}
<li><input type="checkbox" name="regioes" value="{{ r.0 }}" {% if r.0 in regioes %}checked="checked"{% endif %}/> {{ r.1 }}</li>
{% endfor %}
</ul>
<h3>Por Estado</h3>
<ul>
{% for e in estado_choices %}
<li><input type="checkbox" name="estados" value="{{ e.sigla }}"
{% if e.sigla in estados %} checked="checked" {% endif %}/>
{{ e.nome }}
</li>
{% endfor %}
</ul>
<input type="submit" value="Filtrar"/>
</div>
</div>
</form>
{% endblock %}

4
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<servico>\w+)/$', 'sigi.apps.servicos.views.municipios_atendidos'),
# (r'^sigi/servicos/listacasas/(?P<sigla>\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)),

Loading…
Cancel
Save