Browse Source

Criando sistema de sessão para casas e convenios (carrinho). Alterando layout de changelist de casas e convenios. Retirando ações de casas e convenios deixando apenas armazenar no carrinho. Colocando resumo por região na pagina principal. Adicionando exportação por CSV para casa com uso de JQuery para ordenação dos campos e checkbox para escolher os campos. Alterando o relatório de região consertando valores e acrescentando campos da tabela.

diagnosticos
Starlone (Estagiario) 14 years ago
parent
commit
86874f5721
  1. 62
      sigi/apps/casas/admin.py
  2. 17
      sigi/apps/casas/reports.py
  3. 158
      sigi/apps/casas/templates/casas/carrinho.html
  4. 2
      sigi/apps/casas/templates/casas/change_form.html
  5. 73
      sigi/apps/casas/templates/casas/change_list.html
  6. 248
      sigi/apps/casas/views.py
  7. 41
      sigi/apps/convenios/admin.py
  8. 98
      sigi/apps/convenios/templates/convenios/carrinho.html
  9. 56
      sigi/apps/convenios/templates/convenios/change_list.html
  10. 71
      sigi/apps/convenios/templates/convenios/tabela_regiao.html
  11. 371
      sigi/apps/convenios/views.py
  12. 109
      sigi/templates/admin/carrinho.html
  13. 38
      sigi/templates/admin/tabs_style.html
  14. 20
      sigi/templates/snippets/modules/charts-convenios.html
  15. 52
      sigi/urls.py

62
sigi/apps/casas/admin.py

@ -1,16 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from sigi.apps.casas.forms import CasaLegislativaForm from apps.casas.forms import CasaLegislativaForm
from sigi.apps.casas.models import CasaLegislativa from apps.casas.models import CasaLegislativa
from sigi.apps.contatos.models import Contato, Telefone from apps.contatos.models import Contato, Telefone
from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo from apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from sigi.apps.casas.reports import CasasLegislativasLabels, CasasLegislativasReport from apps.casas.reports import CasasLegislativasLabels, CasasLegislativasReport
from geraldo.generators import PDFGenerator from geraldo.generators import PDFGenerator
from sigi.apps.casas.views import casa_info, labels_report, export_csv, \ from apps.casas.views import report_complete, labels_report, export_csv, \
labels_report_sem_presidente, report labels_report_sem_presidente, report, \
from sigi.apps.utils import queryset_ascii adicionar_casas_carrinho
from apps.utils import queryset_ascii
class ContatosInline(generic.GenericTabularInline): class ContatosInline(generic.GenericTabularInline):
model = Contato model = Contato
@ -30,7 +31,7 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
form = CasaLegislativaForm form = CasaLegislativaForm
change_form_template = 'casas/change_form.html' change_form_template = 'casas/change_form.html'
change_list_template = 'casas/change_list.html' change_list_template = 'casas/change_list.html'
actions = ['etiqueta','relatorio','relatorio_csv','relatorio_completo','etiqueta_sem_presidente', 'adicionar_casas', 'teste'] actions = ['adicionar_casas',]
inlines = (TelefonesInline, ContatosInline, ConveniosInline) inlines = (TelefonesInline, ContatosInline, ConveniosInline)
list_display = ('nome','municipio','presidente','logradouro') list_display = ('nome','municipio','presidente','logradouro')
list_display_links = ('nome',) list_display_links = ('nome',)
@ -61,41 +62,42 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
extra_context={'query_str': '?' + request.META['QUERY_STRING']} extra_context={'query_str': '?' + request.META['QUERY_STRING']}
) )
def etiqueta(modelAdmin,request,queryset): def etiqueta(self,request,queryset):
return labels_report(request,queryset=queryset) return labels_report(request,queryset=queryset)
etiqueta.short_description = "Gerar etiqueta(s) da(s) casa(s) selecionada(s)" etiqueta.short_description = "Gerar etiqueta(s) da(s) casa(s) selecionada(s)"
def etiqueta_sem_presidente(modelAdmin,request,queryset): def etiqueta_sem_presidente(self,request,queryset):
return labels_report_sem_presidente(request,queryset=queryset) return labels_report_sem_presidente(request,queryset=queryset)
etiqueta_sem_presidente.short_description = "Gerar etiqueta(s) sem presidente da(s) casa(s) selecionada(s)" etiqueta_sem_presidente.short_description = "Gerar etiqueta(s) sem presidente da(s) casa(s) selecionada(s)"
def relatorio(modelAdmin,request,queryset): def relatorio(self,request,queryset):
return report(request,queryset=queryset) return report(request,queryset=queryset)
relatorio.short_description = u"Exportar a(s) casa(s) selecionada(s) para PDF" relatorio.short_description = u"Exportar a(s) casa(s) selecionada(s) para PDF"
def relatorio_completo(modelAdmin,request,queryset): def relatorio_completo(self,request,queryset):
return casa_info(request,queryset=queryset) return report_complete(request,queryset=queryset)
relatorio_completo.short_description = u"Gerar relatório completo da(s) casa(s) selecionada(s)" relatorio_completo.short_description = u"Gerar relatório completo da(s) casa(s) selecionada(s)"
def relatorio_csv(modelAdmin,request,queryset): def relatorio_csv(self,request,queryset):
return export_csv(request) return export_csv(request)
relatorio_csv.short_description = u"Exportar casa(s) selecionada(s) para CSV" relatorio_csv.short_description = u"Exportar casa(s) selecionada(s) para CSV"
def adicionar_casas(modelAdmin, request, queryset): def adicionar_casas(self, request, queryset):
if request.method == 'POST': if request.session.has_key('carrinho_casas'):
ids_selecionados = request.POST.getlist('_selected_action') q1 = len(request.session['carrinho_casas'])
print "Selecionados atual :", else:
print ids_selecionados q1 = 0
if request.session.has_key('ids_selecionados_etiqueta') == False: response = adicionar_casas_carrinho(request,queryset=queryset)
request.session['ids_selecionados_etiqueta'] = ids_selecionados q2 = len(request.session['carrinho_casas'])
else: quant = q2 - q1
lista = request.session['ids_selecionados_etiqueta'] if quant:
print "Selecionados anteriormente :", self.message_user(request,str(q2-q1)+" Casas Legislativas adicionadas no carrinho" )
print lista else:
lista.extend(ids_selecionados) self.message_user(request,"As Casas Legislativas selecionadas já foram adicionadas anteriormente" )
print "Todos selecionados :", return HttpResponseRedirect('.')
print lista
request.session['ids_selecionados_etiqueta'] = lista adicionar_casas.short_description = u"Armazenar casas no carrinho para exportar"
def get_actions(self, request): def get_actions(self, request):
actions = super(CasaLegislativaAdmin, self).get_actions(request) actions = super(CasaLegislativaAdmin, self).get_actions(request)

17
sigi/apps/casas/reports.py

@ -3,7 +3,7 @@ from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.lib.enums import TA_CENTER, TA_RIGHT from reportlab.lib.enums import TA_CENTER, TA_RIGHT
from geraldo import Report, DetailBand, Label, ObjectValue, ManyElements, \ from geraldo import Report, DetailBand, Label, ObjectValue, ManyElements, \
ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH,SystemField
from sigi.apps.relatorios.reports import ReportDefault from sigi.apps.relatorios.reports import ReportDefault
@ -220,6 +220,15 @@ class CasasSemConvenioReport(CasasLegislativasReport):
class InfoCasaLegislativa(ReportDefault): class InfoCasaLegislativa(ReportDefault):
title = u'Casa legislativa' title = u'Casa legislativa'
class band_summary(ReportBand):
pass
class band_page_footer(ReportBand):
height = 1*cm
elements = [
SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3*cm),
]
class band_detail(ReportDefault.band_detail): class band_detail(ReportDefault.band_detail):
posicao_left = [ posicao_left = [
@ -403,7 +412,7 @@ class InfoCasaLegislativa(ReportDefault):
), ),
ObjectValue(attribute_name='nota',left=tel_left[2]*cm), ObjectValue(attribute_name='nota',left=tel_left[2]*cm),
], ],
borders = {'all':True}, #borders = {'all':True},
), ),
), ),
#Contatos #Contatos
@ -433,7 +442,7 @@ class InfoCasaLegislativa(ReportDefault):
ObjectValue(attribute_name='nota',left=cont_left[1]*cm), ObjectValue(attribute_name='nota',left=cont_left[1]*cm),
ObjectValue(attribute_name='email',left=cont_left[2]*cm), ObjectValue(attribute_name='email',left=cont_left[2]*cm),
], ],
borders = {'all':True}, #borders = {'all':True},
), ),
), ),
#Convenios #Convenios
@ -483,7 +492,7 @@ class InfoCasaLegislativa(ReportDefault):
instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-'
), ),
], ],
borders = {'all':True}, #borders = {'all':True},
), ),
) )
] ]

158
sigi/apps/casas/templates/casas/carrinho.html

@ -0,0 +1,158 @@
{% extends "admin/carrinho.html" %}
{% load adminmedia admin_list i18n %}
{% block extrastyle %}
{{ block.super }}
{% include "admin/tabs_style.html" %}
{% endblock %}
{% block title %}Casas legislativas no Carrinho | SIGI{% endblock %}
{% block content_title %}<h1>Casas Legislativas no Carrinho</h1>{% endblock %}
{% block mensagem%}
<ul class="messagelist">
{%if carIsEmpty%}
<li class="warning">O carrinho está vazio, sendo assim todas as casas entram na lista para exportação de acordo com os filtros aplicados.</li>
{%else%}
<li>{{paginas.paginator.count}} Casas Legislativas no carrinho.</li>
{%endif%}
</ul>
{% endblock %}
{% block action %}/casas/casalegislativa/carrinho/deleta_itens_carrinho{% endblock %}
{% block tabela %}
<table>
<thead>
<tr>
{%if not carIsEmpty%}
<th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">-->
</th>
{% endif %}
<th class="sorted ascending">Nome</th>
<th class="sorted ascending">Município</th>
<th class="sorted ascending">Presidente</th>
<th class="sorted ascending">Endereço</th>
</tr>
</thead>
<tbody>
{% for casa in paginas.object_list %}
<tr class="{% cycle 'row1' 'row2' %}">
{%if not carIsEmpty%}
<th><input type="checkbox" name="_selected_action"
value="{{casa.id}}" class="action-select" /></th>
{% endif %}
<td style="text-align: left;">{{casa.nome}}</td>
<td>{{casa.municipio}}</td>
<td>{{casa.presidente}}</td>
<td>{{casa.logradouro}}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
{% block botoes %}
<div id="tabs">
<ul>
<li><a href="#tabs-1">Etiqueta</a></li>
<li><a href="#tabs-2">Relatório</a></li>
<li><a href="#tabs-3">Arquivo CSV (Excel, Calc)</a></li>
</ul>
<div id="tabs-1">
<form action="../labels/{{query_str}}" method="post">
<fieldset><legend>Tipo de etiqueta</legend>
<ul class="tabs-conteudo">
<li><input type="radio" name="tipo_etiqueta"
value="com_presidente"><label>Com Presidente</label></li>
<li><input type="radio" name="tipo_etiqueta"
value="sem_presidente" checked="checked">
<label>Sem Presidente</label></li>
</ul>
</fieldset>
<ul class="botoes">
<li><input type="submit" value="Gerar Etiqueta" /></li>
</ul>
</form>
</div>
<div id="tabs-2">
<form action="../reports/{{query_str}}" method="post">
<fieldset><legend>Tipo de relatório</legend>
<ul class="tabs-conteudo">
<li><input type="radio" name="tipo_relatorio" value="simples"
checked="checked"><label>Simples</label></li>
<li><input type="radio" name="tipo_relatorio" value="completo"><label>Completo</label></li>
</ul>
</fieldset>
<ul class="botoes">
<li><input type="submit" value="Gerar Relatório" /></li>
</ul>
</form>
</div>
<div id="tabs-3">
<form action="../csv/{{query_str}}" method="post">
<fieldset><legend>Escolha os atributos para exportar</legend>
<ul id="sortable" class="tabs-conteudo">
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="CNPJ"
class="action-select" checked="checked" />
<label>CNPJ</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Código IBGE" class="action-select" checked="checked" />
<label>Código IBGE</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Nome"
class="action-select" checked="checked" />
<label>Nome</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Município" class="action-select" checked="checked" />
<label>Município</label></li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Presidente" class="action-select" checked="checked" />
<label>Presidente</label></li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Logradouro" class="action-select" checked="checked" />
<label>Endereço</label></li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Bairro" class="action-select" checked="checked" />
<label>Bairro</label></li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="CEP"
class="action-select" checked="checked" />
<label>CEP</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Telefone" class="action-select" checked="checked" />
<label>Telefone</label>
</li>
</ul>
</fieldset>
<ul class="botoes">
<li><input type="submit" value="Exportar CSV" /></li>
</ul>
</form>
</div>
</div>
{% endblock %}

2
sigi/apps/casas/templates/casas/change_form.html

@ -4,7 +4,7 @@
{% block object-tools %} {% block object-tools %}
{% if change %}{% if not is_popup %} {% if change %}{% if not is_popup %}
<ul class="object-tools"> <ul class="object-tools">
<li><a href="casa_info/">Relatório</a></li> <li><a href="report_complete/">Relatório</a></li>
<li><a href="labels/">Etiqueta</a></li> <li><a href="labels/">Etiqueta</a></li>
<li><a href="labels_sem_presidente/">Etiqueta sem presidente</a></li> <li><a href="labels_sem_presidente/">Etiqueta sem presidente</a></li>
<li><a href="history/" class="historylink">{% trans "History" %}</a></li> <li><a href="history/" class="historylink">{% trans "History" %}</a></li>

73
sigi/apps/casas/templates/casas/change_list.html

@ -1,76 +1,15 @@
{% extends "admin/change_list.html" %} {% extends "admin/change_list.html" %}
{% load adminmedia admin_list i18n reporting_tags %} {% load adminmedia admin_list i18n reporting_tags %}
{% block extrastyle %}
{{ block.super }}
{% include "jquery/tabs_style.html" %}
{% endblock %}
{% block object-tools %} {% block object-tools %}
{% if has_add_permission %} <ul class="object-tools">
<li><a href="casas_sem_convenio_report/{{query_str}}">Casas sem Processo de Convênio</a></li>
<div id="tabs"> <li><a onclick="return showRelatedObjectLookupPopup(this);" href="carrinho/{{query_str}}">Carrinho / Exportar</a></li>
<ul>
<li><a href="#tabs-1">Exportar para PDF</a></li>
<li><a href="#tabs-2">Exportar para CSV</a></li>
<li><a href="#tabs-3">Etiqueta</a></li>
<li>
<a style="display: none" href="#tabs-0" />
<a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink">
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
</a>
</li>
</ul>
<div id="tabs-1">
<p>Escolha uma das opções abaixo para exportar todas as casas legislátivas listadas.
Caso queira selecionar casas específicas, utilize a opção "exportar
casa(s) selecionada(s)" na caixa "Ação".</p>
<div class="tabs-conteudo">
<ul>
<li><a href="reports/{{query_str}}">Exportar todas as casas listadas</a> </li>
<li>
<a href="casas_sem_convenio_report/{{query_str}}">
Exportar apenas casas listadas sem convênio
</a>
</li>
</ul>
</div>
</div>
<div id="tabs-2">
<div class="tabs-conteudo">
<p>
As opções abaixo exportam todas as casas listadas para um arquivo CSV que
pode ser aberto por programas de planilha eletrônica (Excel, Calc).
Para exportar casas específicas utilize a opção "Exportar casa(s) selecionada(s)
para CSV"
</p>
<ul>
<li><a href="csv/{{query_str}}">Exportar casas listas para CSV</a> </li>
</ul>
</div>
</div>
<div id="tabs-3">
<p>Escolha uma das opções abaixo para gerar etiquetas de todas as casas listadas.
Caso queira gerar de casas especificas, utilize a opção "gerar etiquetas
das casas selecionadas" disponivel na caixa "Ação". </p>
<ul class="tabs-conteudo">
<li><a href="labels/{{ query_str }}">Gerar etiquetas com nome do presidente</a></li>
<li><a href="labels_sem_presidente/{{ query_str }}">Gerar etiquetas sem nome do presidente</a></li>
</ul>
</div>
</div>
<!--<ul class="object-tools">
<li><a href="reports/{{query_str}}">Relatório</a> </li>
<li><a href="csv/{{query_str}}">Exportar CSV</a> </li>
<li><a href="casas_sem_convenio_report/{{query_str}}">Casas sem convênio</a> </li>
<li><a href="labels/{{ query_str }}">Gerar etiquetas</a></li>
<li> <li>
<a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink"> <a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink">
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
</a> </a>
</li> </li>
</ul>--> </ul>
{% endif %}
{% endblock %} {% endblock %}

248
sigi/apps/casas/views.py

@ -1,15 +1,21 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from geraldo.generators import PDFGenerator from geraldo.generators import PDFGenerator
from sigi.apps.casas.models import CasaLegislativa from apps.casas.models import CasaLegislativa
from sigi.apps.casas.reports import CasasLegislativasLabels from apps.casas.reports import CasasLegislativasLabels
from sigi.apps.casas.reports import CasasLegislativasLabelsSemPresidente from apps.casas.reports import CasasLegislativasLabelsSemPresidente
from sigi.apps.casas.reports import CasasLegislativasReport from apps.casas.reports import CasasLegislativasReport
from sigi.apps.casas.reports import CasasSemConvenioReport from apps.casas.reports import CasasSemConvenioReport
from sigi.apps.casas.reports import InfoCasaLegislativa from apps.casas.reports import InfoCasaLegislativa
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.conf import settings
import csv import csv
from bzrlib.switch import switch
def query_ordena(qs,o,ot): def query_ordena(qs,o,ot):
list_display = ('nome','municipio','presidente','logradouro') list_display = ('nome','municipio','presidente','logradouro')
@ -22,93 +28,186 @@ def query_ordena(qs,o,ot):
return qs return qs
def get_for_qs(get,qs): def get_for_qs(get,qs):
"""
Verifica atributos do GET e retorna queryset correspondente
"""
kwargs = {} kwargs = {}
for k,v in get.iteritems(): for k,v in get.iteritems():
if not k == 'o': if not (k == 'page' or k == 'pop' or k == 'q'):
if k == "ot": if not k == 'o':
qs = query_ordena(qs,get["o"],get["ot"]) if k == "ot":
else: qs = query_ordena(qs,get["o"],get["ot"])
kwargs[str(k)] = v else:
qs = qs.filter(**kwargs) kwargs[str(k)] = v
qs = qs.filter(**kwargs)
return qs return qs
def carrinhoOrGet_for_qs(request):
def labels_report(request, id=None,queryset=None): """
""" TODO: adicionar suporte para resultado de pesquisa do admin. Verifica se existe casas na sessão se não verifica get e retorna qs correspondente.
""" """
if request.session.has_key('ids_selecionados_etiqueta') == True: if request.session.has_key('carrinho_casas'):
ids = request.session['ids_selecionados_etiqueta'] ids = request.session['carrinho_casas']
del request.session['ids_selecionados_etiqueta'] qs = CasaLegislativa.objects.filter(pk__in=ids)
# request.session.modified = True
print "Impressao",
print ids
qs = CasaLegislativa.objects.filter(pk__in=ids)
elif queryset:
qs = queryset
else: else:
qs = CasaLegislativa.objects.all() qs = CasaLegislativa.objects.all()
if id: if request.GET:
qs = qs.filter(pk=id)
elif request.GET:
qs = get_for_qs(request.GET,qs) qs = get_for_qs(request.GET,qs)
return qs
def adicionar_casas_carrinho(request,queryset=None,id=None):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
if not request.session.has_key('carrinho_casas'):
request.session['carrinho_casas'] = ids_selecionados
else:
lista = request.session['carrinho_casas']
# Verifica se id já não está adicionado
for id in ids_selecionados:
if not id in lista:
lista.append(id)
request.session['carrinho_casas'] = lista
def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request)
paginator = Paginator(qs, 100)
# Make sure page request is an int. If not, deliver first page.
# Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
# Se o page request (9999) está fora da lista, mostre a última página.
try:
paginas = paginator.page(page)
except (EmptyPage, InvalidPage):
paginas = paginator.page(paginator.num_pages)
carrinhoIsEmpty = not(request.session.has_key('carrinho_casas'))
return render_to_response(
'casas/carrinho.html',
{
"ADMIN_MEDIA_PREFIX":settings.ADMIN_MEDIA_PREFIX,
'MEDIA_URL':settings.MEDIA_URL,
'carIsEmpty':carrinhoIsEmpty,
'paginas':paginas,
'query_str':'?'+request.META['QUERY_STRING']
}
)
def excluir_carrinho(request):
if request.session.has_key('carrinho_casas'):
del request.session['carrinho_casas']
return HttpResponseRedirect('.')
def deleta_itens_carrinho(request):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
if request.session.has_key('carrinho_casas'):
lista = request.session['carrinho_casas']
for item in ids_selecionados:
lista.remove(item)
if lista:
request.session['carrinho_casas'] = lista
else:
del lista;
del request.session['carrinho_casas']
return HttpResponseRedirect('.')
def labels_report(request, id=None, tipo=None):
""" TODO: adicionar suporte para resultado de pesquisa do admin.
"""
if request.POST:
if request.POST.has_key('tipo_etiqueta'):
tipo = request.POST['tipo_etiqueta']
if tipo =='sem_presidente':
return labels_report_sem_presidente(request, id)
if id:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = carrinhoOrGet_for_qs(request)
if not qs:
return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=casas.pdf'
report = CasasLegislativasLabels(queryset=qs) report = CasasLegislativasLabels(queryset=qs)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
def labels_report_sem_presidente(request, id=None,queryset=None): def labels_report_sem_presidente(request, id=None):
""" TODO: adicionar suporte para resultado de pesquisa do admin. """ TODO: adicionar suporte para resultado de pesquisa do admin.
""" """
if queryset:
qs = queryset if id:
else: qs = CasaLegislativa.objects.filter(pk=id)
qs = CasaLegislativa.objects.all() else:
if id: qs = carrinhoOrGet_for_qs(request)
qs = qs.filter(pk=id)
elif request.GET: if not qs:
qs = get_for_qs(request.GET,qs) return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=casas.pdf'
report = CasasLegislativasLabelsSemPresidente(queryset=qs) report = CasasLegislativasLabelsSemPresidente(queryset=qs)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
def report(request, id=None,queryset=None): def report(request, id=None,tipo=None):
if queryset:
qs = queryset if request.POST:
else: if request.POST.has_key('tipo_relatorio'):
qs = CasaLegislativa.objects.all() tipo = request.POST['tipo_relatorio']
if id:
qs = qs.filter(pk=id) if tipo =='completo':
elif request.GET: return report_complete(request, id)
qs = get_for_qs(request.GET,qs)
if id:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = carrinhoOrGet_for_qs(request)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
#qs.order_by('municipio__uf','nome') #qs.order_by('municipio__uf','nome')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=casas.pdf'
report = CasasLegislativasReport(queryset=qs) report = CasasLegislativasReport(queryset=qs)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
def casa_info(request,id=None,queryset=None): def report_complete(request,id=None):
if queryset:
qs = queryset if id:
else: qs = CasaLegislativa.objects.filter(pk=id)
qs = CasaLegislativa.objects.all() else:
if id: qs = carrinhoOrGet_for_qs(request)
qs = qs.filter(pk=id)
elif request.GET:
qs = get_for_qs(request.GET,qs)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=casas.pdf'
# Gera um relatorio para cada casa e concatena os relatorios # Gera um relatorio para cada casa e concatena os relatorios
cont = 0 cont = 0
@ -154,8 +253,39 @@ def export_csv(request):
response['Content-Disposition'] = 'attachment; filename=casas.csv' response['Content-Disposition'] = 'attachment; filename=casas.csv'
csv_writer = csv.writer(response) csv_writer = csv.writer(response)
casas = CasaLegislativa.objects.all() casas = carrinhoOrGet_for_qs(request)
if not casas:
return HttpResponseRedirect('../')
if request.POST:
atributos = request.POST.getlist("itens_csv_selected")
map(unicode,atributos)
csv_writer.writerow(atributos)
for casa in casas: for casa in casas:
csv_writer.writerow([casa.nome.encode("utf-8"), casa.municipio.uf.sigla.encode("utf-8")]) lista = []
for atributo in atributos:
if u"CNPJ" == atributo:
lista.append(casa.cnpj.encode("utf-8"))
elif u"Código IBGE" == atributo:
lista.append(str(casa.municipio.codigo_ibge).encode("utf-8"))
elif u"Nome" == atributo:
lista.append(casa.nome.encode("utf-8"))
elif u"Município" == atributo:
lista.append(str(casa.municipio).encode("utf-8"))
elif u"Presidente" == atributo:
lista.append(casa.presidente.encode("utf-8"))
elif u"Logradouro" == atributo:
lista.append(casa.logradouro.encode("utf-8"))
elif u"Bairro" == atributo:
lista.append(casa.bairro.encode("utf-8"))
elif u"CEP" == atributo:
lista.append(casa.cep.encode("utf-8"))
elif u"Telefone" == atributo:
lista.append(casa.telefone.encode("utf-8"))
else:
pass
csv_writer.writerow(lista)
return response return response

41
sigi/apps/convenios/admin.py

@ -1,13 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo from apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo
from sigi.apps.casas.models import CasaLegislativa from apps.casas.models import CasaLegislativa
from sigi.apps.servicos.models import Servico from apps.servicos.models import Servico
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from sigi.apps.convenios.reports import ConvenioReport from apps.convenios.reports import ConvenioReport
from sigi.apps.utils import queryset_ascii from apps.utils import queryset_ascii
from geraldo.generators import PDFGenerator from geraldo.generators import PDFGenerator
from apps.convenios.views import adicionar_convenios_carrinho
class AnexosInline(admin.TabularInline): class AnexosInline(admin.TabularInline):
model = Anexo model = Anexo
extra = 2 extra = 2
@ -38,7 +40,7 @@ class ConvenioAdmin(admin.ModelAdmin):
'data_devolucao_via', 'data_postagem_correio')} 'data_devolucao_via', 'data_postagem_correio')}
), ),
) )
actions = ['delete_selected', 'relatorio'] actions = ['adicionar_convenios']
inlines = (AnexosInline, EquipamentoPrevistoInline) inlines = (AnexosInline, EquipamentoPrevistoInline)
list_display = ('num_convenio', 'casa_legislativa', list_display = ('num_convenio', 'casa_legislativa',
'data_adesao','data_retorno_assinatura','data_termo_aceite', 'data_adesao','data_retorno_assinatura','data_termo_aceite',
@ -47,7 +49,7 @@ class ConvenioAdmin(admin.ModelAdmin):
list_display_links = ('num_convenio','casa_legislativa',) list_display_links = ('num_convenio','casa_legislativa',)
list_filter = ('projeto','casa_legislativa','conveniada', 'equipada') list_filter = ('projeto','casa_legislativa','conveniada', 'equipada')
#date_hierarchy = 'data_adesao' #date_hierarchy = 'data_adesao'
ordering = ('casa_legislativa__municipio__uf','casa_legislativa','-id',) ordering = ('casa_legislativa__tipo__sigla','casa_legislativa__municipio__uf','casa_legislativa')
raw_id_fields = ('casa_legislativa',) raw_id_fields = ('casa_legislativa',)
queryset = queryset_ascii queryset = queryset_ascii
search_fields = ('id', 'search_text',#'casa_legislativa__nome', search_fields = ('id', 'search_text',#'casa_legislativa__nome',
@ -58,15 +60,34 @@ class ConvenioAdmin(admin.ModelAdmin):
request, request,
extra_context={'query_str': '?' + request.META['QUERY_STRING']} extra_context={'query_str': '?' + request.META['QUERY_STRING']}
) )
def relatorio(modeladmin, request, queryset): def relatorio(self, request, queryset):
#queryset.order_by('casa_legislativa__municipio__uf') #queryset.order_by('casa_legislativa__municipio__uf')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
report = ConvenioReport(queryset=queryset) report = ConvenioReport(queryset=queryset)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
relatorio.short_description = u'Exportar convênios selecionados para PDF' relatorio.short_description = u'Exportar convênios selecionados para PDF'
def adicionar_convenios(self, request, queryset):
if request.session.has_key('carrinho_convenios'):
q1 = len(request.session['carrinho_convenios'])
else:
q1 = 0
adicionar_convenios_carrinho(request,queryset=queryset)
q2 = len(request.session['carrinho_convenios'])
quant = q2 - q1
if quant:
self.message_user(request,str(q2-q1)+" Convênios adicionados no carrinho" )
else:
self.message_user(request,"Os Convênios selecionados já foram adicionadas anteriormente" )
return HttpResponseRedirect('.')
adicionar_convenios.short_description = u"Armazenar convênios no carrinho para exportar"
def get_actions(self, request):
actions = super(ConvenioAdmin, self).get_actions(request)
del actions['delete_selected']
return actions
class EquipamentoPrevistoAdmin(admin.ModelAdmin): class EquipamentoPrevistoAdmin(admin.ModelAdmin):
list_display = ('convenio', 'equipamento', 'quantidade') list_display = ('convenio', 'equipamento', 'quantidade')

98
sigi/apps/convenios/templates/convenios/carrinho.html

@ -0,0 +1,98 @@
{% extends "admin/carrinho.html" %}
{% load adminmedia admin_list i18n %}
{% block extrastyle %}
{{ block.super }}
{% include "admin/tabs_style.html" %}
{% endblock %}
{% block title %}Convênios no Carrinho | SIGI{% endblock %}
{% block content_title %}<h1>Convênios no Carrinho</h1>{% endblock %}
{% block mensagem%}
<ul class="messagelist">
{%if carIsEmpty%}
<li class="warning">O carrinho está vazio, sendo assim todos os convênios entram na lista para exportação de acordo com os filtros aplicados.</li>
{%else%}
<li>{{paginas.paginator.count}} Convênios no carrinho.</li>
{%endif%}
</ul>
{% endblock %}
{% block action %}/convenios/convenio/carrinho/deleta_itens_carrinho{% endblock %}
{% block tabela %}
<table>
<thead>
<tr>
{%if not carIsEmpty%}
<th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">-->
</th>
{% endif %}
<th class="sorted ascending">Numero do convênio</th>
<th class="sorted ascending">Casa Legislativa</th>
<th class="sorted ascending">Aderidas</th>
<th class="sorted ascending">Convêniadas</th>
<th class="sorted ascending">Equipadas</th>
<th class="sorted ascending">Projeto</th>
</tr>
</thead>
<tbody>
{% for convenio in paginas.object_list %}
<tr class="{% cycle 'row1' 'row2' %}">
{%if not carIsEmpty%}
<th><input type="checkbox" name="_selected_action"
value="{{convenio.id}}" class="action-select" /></th>
{% endif %}
<td style="text-align: left;">{{convenio.num_convenio}}</td>
<td>{{convenio.casa_legislativa}}</td>
<td>{{convenio.data_adesao}}</td>
<td>{{convenio.data_retorno_assinatura}}</td>
<td>{{convenio.data_termo_aceite}}</td>
<td>{{convenio.projeto}}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
{% block botoes %}
<div id="tabs">
<ul>
<li><a href="#tabs-1">Relatório</a></li>
</ul>
<div id="tabs-1">
<form action="../reports/{{ query_str }}" method="post">
<fieldset>
<legend>Relatório por</legend>
<ul class="tabs-conteudo">
<li>
<input type="radio" name="filtro_casa" value="cm" checked="checked"/>
<label>Câmara Municipal</label>
</li>
<li>
<input type="radio" name="filtro_casa" value="al" />
<label>Assembléia Legislativa</label>
</li>
</ul>
</fieldset>
<fieldset>
<legend>Com data de aceite? (Equipada)</legend>
<ul class="tabs-conteudo">
<li>
<input type="radio" name="data_aceite" value="sim" checked="checked" />
<label>Sim</label>
</li>
<li>
<input type="radio" name="data_aceite" value="nao" />
<label>Não</label>
</li>
</ul>
</fieldset>
<ul class="botoes">
<li><input type="submit" value="Gerar Relatório"></li>
</ul>
</form>
</div>
</div>
{% endblock %}

56
sigi/apps/convenios/templates/convenios/change_list.html

@ -3,65 +3,21 @@
{% block extrastyle %} {% block extrastyle %}
{{ block.super }} {{ block.super }}
{% include "jquery/tabs_style.html" %} {% include "admin/tabs_style.html" %}
{% endblock %} {% endblock %}
{% block object-tools %} {% block object-tools %}
{% if has_add_permission %} {% if has_add_permission %}
<div id="tabs"> <ul class="object-tools">
<li><a onclick="return showRelatedObjectLookupPopup(this);" href="carrinho/{{query_str}}">Carrinho / Exportar</a></li>
<ul>
<li><a href="#tabs-1">Exportar</a></li>
<li><a href="#tabs-2">Resumo por Região</a></li>
<li>
<a style="display: none" href="#tabs-0" />
<a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink">
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
</a>
</li>
</ul>
<div id="tabs-1">
<p>Escolha uma das opções abaixo para exportar todos os convênios listados.
Caso queira selecionar convênios especificos, utilize a opção "exportar
convênios selecionados" na caixa "Ação".</p>
<div class="tabs-conteudo">
<table>
<tr>
<td>
<ul><li><a href="reports_por_cm/{{ query_str }}">PDF por Câmara Municipal</a></li></ul>
<ul><li><a href="reports_por_al/{{ query_str }}">PDF por Assembléia Legislativa</a></li></ul>
</td>
<td>
<ul><li><a href="report_semaceite_por_cm/{{ query_str }}">PDF por Câmara Municipal (sem Data de Aceite)</a></li></ul>
<ul><li><a href="report_semaceite_por_al/{{ query_str }}">PDF por Assembléia Legislativa (sem Data de Aceite)</a></li></ul>
</td>
</tr>
</table>
</div>
</div>
<div id="tabs-2">
<p>Escolha uma das opções abaixo para obter um resumo de informações do Projeto Interlegis por região.
Outros projetos como PPM e PML não serão incluidos. </p>
<ul class="tabs-conteudo">
<li><a href="reportsRegiao/CO">Centro Oeste</a></li>
<li><a href="reportsRegiao/NE">Nordeste</a></li>
<li><a href="reportsRegiao/NO">Norte</a></li>
<li><a href="reportsRegiao/SD">Sudeste</a></li>
<li><a href="reportsRegiao/SL">Sul</a></li>
</ul>
</div>
</div>
<!--<ul class="object-tools">
<li> <li>
<a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink"> <a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink">
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
</a> </a>
</li> </li>
</ul> --> </ul>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

71
sigi/apps/convenios/templates/convenios/relatorio_por_regiao.html → sigi/apps/convenios/templates/convenios/tabela_regiao.html

@ -52,11 +52,12 @@
padding-top: 0.15cm; padding-top: 0.15cm;
} }
#footerContent #esquerda{ #footerContent #esquerda{
text-align: left; text-align: left;
} }
#footerContent #direita{ #footerContent #direita{
text-align: right; text-align: right;
} background-image: url("/media/images/logo-senado.png");
}
.tabela { .tabela {
padding-top: 0.1cm; padding-top: 0.1cm;
padding-left: 0.1cm; padding-left: 0.1cm;
@ -79,12 +80,8 @@
.tabela .sumario{ .tabela .sumario{
font-weight: bold; font-weight: bold;
background-color: #CFCFCF; background-color: #CFCFCF;
} }
.tabela .aderidas{ .tabela .cabecalho_esquerda{
/*background-color: #E8E8E8;*/
border: blue solid;
}
.tabela .estado{
background-color: #E8E8E8; background-color: #E8E8E8;
font-weight: bold; font-weight: bold;
} }
@ -102,53 +99,33 @@
<td id="imagem2"><img src="../media/images/logo-interlegis.jpg" width="90" height="65" alt="Logo Interlegis"/></td> <td id="imagem2"><img src="../media/images/logo-interlegis.jpg" width="90" height="65" alt="Logo Interlegis"/></td>
</tr> </tr>
</table> </table>
<h1 class="titulo">Resumo por Região</h1> <h1 class="titulo">{{tabela.regiao}}</h1>
</div> </div>
<div id="midle"> <div id="midle">
<table class="tabela" repeat="1"> <table class="tabela" repeat="1">
<caption>{{sumario_regiao.regiao}}</caption> <caption>{{tabela.projeto}} - {{tabela.regiao}}</caption>
<thead> <thead>
<tr> <tr>
<th>UF</th> {%for item in tabela.cabecalho%}
<th>Total</th> <th>{{item}}</th>
<th>Não Aderidas</th> {%endfor%}
<th>%</th>
<th>Aderidas</th>
<th>%</th>
<th>Não Equipadas</th>
<th>%</th>
<th>Equipadas</th>
<th>%</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{%for r in lista%} {% for linha in tabela.linhas %}
<tr class="conteudo"> <tr class="conteudo">
<td class="estado">{{r.estado}}</td> <th class="cabecalho_esquerda">{{linha.estado}}</th>
<td>{{r.quant_casas}}</td> {% for item in linha.lista %}
<td>{{r.quant_casas_nao_aderidas}}</td> <td>{{item}}</td>
<td>{{r.porc_casas_nao_aderidas}}</td> {% endfor %}
<td class="aderidas">{{r.quant_casas_aderidas}}</td> </tr>
<td class="aderidas">{{r.porc_casas_aderidas}}</td> {% endfor %}
<td class="aderidas">{{r.quant_casas_nao_equipadas}}</td> <tr>
<td class="aderidas">{{r.porc_casas_nao_equipadas}}</td> <th>Total</th>
<td class="aderidas">{{r.quant_casas_equipadas}}</td> {% for item in tabela.sumario %}
<td class="aderidas">{{r.porc_casas_equipadas}}</td> <th>{{item}}</th>
{% endfor %}
</tr> </tr>
{%endfor%}
<tr class="sumario">
<td>Total</td>
<td>{{sumario_regiao.total}}</td>
<td>{{sumario_regiao.total_casas_nao_aderidas}}</td>
<td>{{sumario_regiao.porc_casas_nao_aderidas}}</td>
<td>{{sumario_regiao.total_casas_aderidas}}</td>
<td>{{sumario_regiao.porc_casas_aderidas}}</td>
<td>{{sumario_regiao.total_casas_nao_equipadas }}</td>
<td>{{sumario_regiao.porc_casas_nao_equipadas }}</td>
<td>{{sumario_regiao.total_casas_equipadas }}</td>
<td>{{sumario_regiao.porc_casas_equipadas }}</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>

371
sigi/apps/convenios/views.py

@ -1,19 +1,23 @@
#-*- coding:utf-8 -*-
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response, get_list_or_404 from django.shortcuts import render_to_response, get_list_or_404
from geraldo.generators import PDFGenerator from geraldo.generators import PDFGenerator
from sigi.apps.convenios.models import Convenio from apps.convenios.models import Convenio
from sigi.apps.convenios.reports import ConvenioReport, \ from apps.convenios.reports import ConvenioReport \
ConvenioPorCMReport, \ ,ConvenioPorCMReport \
ConvenioPorALReport, \ ,ConvenioPorALReport \
ConvenioReportRegiao, \ ,ConvenioReportSemAceiteAL \
ConvenioReportSemAceiteAL, \ ,ConvenioReportSemAceiteCM
ConvenioReportSemAceiteCM from apps.casas.models import CasaLegislativa
from sigi.apps.casas.models import CasaLegislativa from apps.contatos.models import UnidadeFederativa
from sigi.apps.contatos.models import UnidadeFederativa
import ho.pisa as pisa import ho.pisa as pisa
from django.template import Context, loader from django.template import Context, loader
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.conf import settings
import datetime import datetime
def query_ordena(qs,o,ot): def query_ordena(qs,o,ot):
@ -33,120 +37,147 @@ def get_for_qs(get,qs):
kwargs = {} kwargs = {}
ids = 0 ids = 0
for k,v in get.iteritems(): for k,v in get.iteritems():
if not k == 'o': if not (k == 'page' or k == 'pop' or k == 'q'):
if k == "ot": if not k == 'o':
qs = query_ordena(qs,get["o"],get["ot"]) if k == "ot":
else: qs = query_ordena(qs,get["o"],get["ot"])
kwargs[str(k)] = v else:
if(str(k)=='ids'): kwargs[str(k)] = v
ids = 1 if(str(k)=='ids'):
break ids = 1
qs = qs.filter(**kwargs) break
qs = qs.filter(**kwargs)
if ids: if ids:
query = 'id IN ('+ kwargs['ids'].__str__()+')' query = 'id IN ('+ kwargs['ids'].__str__()+')'
qs = Convenio.objects.extra(where=[query]) qs = Convenio.objects.extra(where=[query])
return qs return qs
def report_por_cm(request, id=None): def carrinhoOrGet_for_qs(request):
qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM').order_by('casa_legislativa__municipio__uf','casa_legislativa') """
if id: Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente.
qs = qs.filter(pk=id) """
elif request.GET: #Se tiver algum parametro de pesquisa if request.session.has_key('carrinho_convenios'):
qs = get_for_qs(request.GET,qs) ids = request.session['carrinho_convenios']
if not qs: qs = Convenio.objects.filter(pk__in=ids)
return HttpResponseRedirect('../') else:
response = HttpResponse(mimetype='application/pdf') qs = Convenio.objects.all()
report = ConvenioPorCMReport(queryset=qs) if request.GET:
report.generate_by(PDFGenerator, filename=response) qs = qs.order_by("casa_legislativa__municipio__uf","casa_legislativa__municipio")
return response qs = get_for_qs(request.GET,qs)
return qs
def report_por_al(request, id=None): def adicionar_convenios_carrinho(request,queryset=None,id=None):
qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='AL').order_by('casa_legislativa__municipio__uf','casa_legislativa') if request.method == 'POST':
if id: ids_selecionados = request.POST.getlist('_selected_action')
qs = qs.filter(pk=id) if not request.session.has_key('carrinho_convenios'):
elif request.GET: #Se tiver algum parametro de pesquisa request.session['carrinho_convenios'] = ids_selecionados
qs = get_for_qs(request.GET,qs) else:
if not qs: lista = request.session['carrinho_convenios']
return HttpResponseRedirect('../') # Verifica se id já não está adicionado
response = HttpResponse(mimetype='application/pdf') for id in ids_selecionados:
report = ConvenioPorALReport(queryset=qs) if not id in lista:
report.generate_by(PDFGenerator, filename=response) lista.append(id)
return response request.session['carrinho_convenios'] = lista
def excluir_carrinho(request):
if request.session.has_key('carrinho_convenios'):
del request.session['carrinho_convenios']
return HttpResponseRedirect('.')
def report_semaceite_por_cm(request, id=None): def deleta_itens_carrinho(request):
qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM').order_by('casa_legislativa__municipio__uf','casa_legislativa') if request.method == 'POST':
if id: ids_selecionados = request.POST.getlist('_selected_action')
qs = qs.filter(pk=id) if request.session.has_key('carrinho_convenios'):
elif request.GET: #Se tiver algum parametro de pesquisa lista = request.session['carrinho_convenios']
qs = get_for_qs(request.GET,qs) for item in ids_selecionados:
if not qs: lista.remove(item)
return HttpResponseRedirect('../') if lista:
response = HttpResponse(mimetype='application/pdf') request.session['carrinho_convenios'] = lista
report = ConvenioReportSemAceiteCM(queryset=qs) else:
report.generate_by(PDFGenerator, filename=response) del lista;
return response del request.session['carrinho_convenios']
return HttpResponseRedirect('.')
def report_semaceite_por_al(request, id=None): def visualizar_carrinho(request):
qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='AL').order_by('casa_legislativa__municipio__uf','casa_legislativa')
qs = carrinhoOrGet_for_qs(request)
paginator = Paginator(qs, 100)
# Make sure page request is an int. If not, deliver first page.
# Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
# Se o page request (9999) está fora da lista, mostre a última página.
try:
paginas = paginator.page(page)
except (EmptyPage, InvalidPage):
paginas = paginator.page(paginator.num_pages)
carrinhoIsEmpty = not(request.session.has_key('carrinho_convenios'))
return render_to_response(
'convenios/carrinho.html',
{
"ADMIN_MEDIA_PREFIX":settings.ADMIN_MEDIA_PREFIX,
'MEDIA_URL':settings.MEDIA_URL,
'carIsEmpty':carrinhoIsEmpty,
'paginas':paginas,
'query_str':'?'+request.META['QUERY_STRING']
}
)
def report(request, id=None):
if id: if id:
qs = qs.filter(pk=id) qs = Convenio.objects.filter(pk=id)
elif request.GET: #Se tiver algum parametro de pesquisa else:
qs = get_for_qs(request.GET,qs) qs = carrinhoOrGet_for_qs(request)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf')
report = ConvenioReportSemAceiteAL(queryset=qs)
report.generate_by(PDFGenerator, filename=response)
return response
tipo = ''
class RelatorioRegiao(object): data_aceite_has = ''
def __init__(self, estado, casas, casas_aderidas, casas_equipadas,casas_nao_equipadas): report = None
self.estado = estado if request.POST:
self.quant_casas = casas if request.POST.has_key('filtro_casa'):
self.quant_casas_aderidas = casas_aderidas tipo = request.POST['filtro_casa']
self.quant_casas_nao_aderidas = (casas - casas_aderidas) if request.POST.has_key('data_aceite'):
self.quant_casas_equipadas = casas_equipadas data_aceite_has = request.POST['data_aceite']
self.quant_casas_nao_equipadas = casas_nao_equipadas # Verifica filtro se é por Assembleia
if(casas!=0): if tipo == 'al':
self.porc_casas_aderidas = "%.2f" % (float(casas_aderidas)*100/float(casas)) qs = qs.filter(casa_legislativa__tipo__sigla='AL')
self.porc_casas_nao_aderidas = "%.2f" % (float(self.quant_casas_nao_aderidas)*100/float(casas)) # Verifica se é com data de aceite
else: if data_aceite_has == 'nao':
self.porc_casas_aderidas = 0 report = ConvenioReportSemAceiteAL(queryset=qs)
self.porc_casas_nao_aderidas = 0 else:
report = ConvenioPorALReport(queryset=qs)
if(casas_aderidas!=0):
self.porc_casas_equipadas = "%.2f" % (float(casas_equipadas)*100/float(casas_aderidas))
self.porc_casas_nao_equipadas = "%.2f" % (float(self.quant_casas_nao_equipadas)*100/float(casas_aderidas))
else:
self.porc_casas_equipadas = 0
self.porc_casas_nao_equipadas = 0
class RelatorioRegiaoTotal:
def __init__(self,regiao,total,total_casas_aderidas,total_casas_equipadas,total_casas_nao_equipadas):
self.regiao = regiao
self.total = total
self.total_casas_aderidas = total_casas_aderidas
self.total_casas_nao_aderidas = (total - total_casas_aderidas)
self.total_casas_equipadas = total_casas_equipadas
self.total_casas_nao_equipadas = total_casas_nao_equipadas
if(total!=0):
self.porc_casas_aderidas = "%.2f" % (float(self.total_casas_aderidas)*100/float(total))
self.porc_casas_nao_aderidas = "%.2f" % (float(self.total_casas_nao_aderidas)*100/float(total))
else:
self.porc_casas_aderidas = 0
self.porc_casas_nao_aderidas = 0
if(total_casas_aderidas!=0):
self.porc_casas_equipadas = "%.2f" % (float(self.total_casas_equipadas)*100/float(total_casas_aderidas))
self.porc_casas_nao_equipadas = "%.2f" % (float(total_casas_nao_equipadas)*100/float(total_casas_aderidas))
else: else:
self.porc_casas_equipadas = 0 qs = qs.filter(casa_legislativa__tipo__sigla='CM')
self.porc_casas_nao_equipadas = 0 if data_aceite_has == 'nao':
report = ConvenioReportSemAceiteCM(queryset=qs)
else:
report = ConvenioPorCMReport(queryset=qs)
response = HttpResponse(mimetype='application/pdf')
if report:
report.generate_by(PDFGenerator, filename=response)
else:
return HttpResponseRedirect('../')
return response
def report_regiao(request,regiao='NE'): def report_regiao(request,regiao='NE'):
if request.POST:
if request.POST.has_key('regiao'):
regiao = request.POST['regiao']
REGIAO_CHOICES = { REGIAO_CHOICES = {
'SL': 'Sul', 'SL': 'Sul',
@ -154,54 +185,108 @@ def report_regiao(request,regiao='NE'):
'CO': 'Centro-Oeste', 'CO': 'Centro-Oeste',
'NE': 'Nordeste', 'NE': 'Nordeste',
'NO': 'Norte', 'NO': 'Norte',
} }
camaras = CasaLegislativa.objects.filter(tipo__sigla='CM')
convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM',projeto__sigla='PI')
camaras_sem_processo = camaras.exclude(convenio__projeto__sigla='PI')
convenios_assinados = convenios.exclude(data_retorno_assinatura=None)
convenios_em_andamento = convenios.filter(data_retorno_assinatura=None)
get_list_or_404(UnidadeFederativa,regiao=regiao) convenios_sem_adesao = convenios.filter(data_adesao=None)
convenios_com_adesao = convenios.exclude(data_adesao=None)
convenios_com_aceite = convenios.exclude(data_termo_aceite=None)
# Contando casas por estado # Contando casas por estado
estados = get_list_or_404(UnidadeFederativa,regiao=regiao) estados = get_list_or_404(UnidadeFederativa,regiao=regiao)
class LinhaEstado():
pass
lista = [] lista = []
for estado in estados: for estado in estados:
linha = LinhaEstado()
casas = CasaLegislativa.objects.filter(municipio__uf=estado) conv_sem_adesao_est = convenios_sem_adesao.filter(casa_legislativa__municipio__uf=estado)
casas_aderidas = casas.exclude(convenio=None).distinct() conv_com_adesao_est = convenios_com_adesao.filter(casa_legislativa__municipio__uf=estado)
casas_equipadas = casas_aderidas.exclude(convenio__data_termo_aceite=None).distinct() conv_assinados_est = convenios_assinados.filter(casa_legislativa__municipio__uf=estado)
casas_nao_equipadas = casas_aderidas.filter(convenio__data_termo_aceite=None).distinct() conv_em_andamento_est = convenios_em_andamento.filter(casa_legislativa__municipio__uf=estado)
conv_equipadas_est = convenios_com_aceite.filter(casa_legislativa__municipio__uf=estado)
lista.append(
RelatorioRegiao( camaras_est = camaras.filter(municipio__uf=estado,tipo__sigla='CM').count()
estado.sigla,casas.count(), camaras_sem_processo_est = camaras_sem_processo.filter(municipio__uf=estado).count()
casas_aderidas.count(), camaras_nao_aderidas_est = camaras.filter(convenio__in=conv_sem_adesao_est).count()
casas_equipadas.count(), camaras_aderidas_est = camaras.filter(convenio__in=conv_com_adesao_est).count()
casas_nao_equipadas.count() camaras_convenios_assinados_est = camaras.filter(convenio__in=conv_assinados_est).count()
) camaras_convenios_em_andamento_est = camaras.filter(convenio__in=conv_em_andamento_est).count()
camaras_equipadas_est = camaras.filter(convenio__in=conv_equipadas_est).count()
linha.lista = (
camaras_est,
camaras_sem_processo_est,
camaras_nao_aderidas_est,
camaras_aderidas_est,
camaras_convenios_assinados_est,
camaras_convenios_em_andamento_est,
camaras_equipadas_est,
) )
# Total de casas na regiao linha.estado = estado.sigla
casas = CasaLegislativa.objects.filter(municipio__uf__regiao=regiao)
casas_aderidas = casas.exclude(convenio=None).distinct() lista.append(linha)
casas_equipadas = casas_aderidas.exclude(convenio__data_termo_aceite=None).distinct() # Total
casas_nao_equipadas = casas_aderidas.filter(convenio__data_termo_aceite=None).distinct() total_cm = camaras.filter(municipio__uf__regiao=regiao,tipo__sigla='CM').count()
sumario_regiao = RelatorioRegiaoTotal( total_sem_processo = camaras_sem_processo.filter(municipio__uf__regiao=regiao).count()
REGIAO_CHOICES[regiao], total_sem_adesao = camaras.filter(convenio__in=convenios_sem_adesao,municipio__uf__regiao=regiao).count()
casas.count(), total_com_adesao = camaras.filter(convenio__in=convenios_com_adesao,municipio__uf__regiao=regiao).count()
casas_aderidas.count(), total_conv_assin = camaras.filter(convenio__in=convenios_assinados,municipio__uf__regiao=regiao).count()
casas_equipadas.count(), total_conv_andam = camaras.filter(convenio__in=convenios_em_andamento,municipio__uf__regiao=regiao).count()
casas_nao_equipadas.count(), total_equipadas = camaras.filter(convenio__in=convenios_com_aceite,municipio__uf__regiao=regiao).count()
)
sumario = [
# response = HttpResponse(mimetype='application/pdf') total_cm,
# relatorio = ConvenioReportRegiao(queryset=lista) total_sem_processo,
# relatorio.generate_by(PDFGenerator, filename=response) total_sem_adesao,
total_com_adesao,
total_conv_assin,
total_conv_andam,
total_equipadas,
]
cabecalho_topo = (
u'UF',
u'Câmaras municipais',
u'Sem processo',
u'Sem adesão',
u'Com adesão',
u'Convênios assinados',
u'Convênios andamento',
u'Equipadas'
)
projeto = "Projeto Interlegis"
tabela = {
"regiao":REGIAO_CHOICES[regiao],
"linhas":lista,
"cabecalho":cabecalho_topo,
"sumario":sumario,
"projeto":projeto,
}
data = datetime.datetime.now().strftime('%d/%m/%Y') data = datetime.datetime.now().strftime('%d/%m/%Y')
hora = datetime.datetime.now().strftime('%H:%M') hora = datetime.datetime.now().strftime('%H:%M')
pisa.showLogging() pisa.showLogging()
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf' response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf'
t = loader.get_template('convenios/relatorio_por_regiao.html') t = loader.get_template('convenios/tabela_regiao.html')
c = Context({'lista': lista,'sumario_regiao':sumario_regiao,'data':data,'hora':hora}) c = Context({'tabela':tabela,'data':data,'hora':hora})
pdf = pisa.CreatePDF(t.render(c),response) pdf = pisa.CreatePDF(t.render(c),response)
if not pdf.err: if not pdf.err:
pisa.startViewer(response) pisa.startViewer(response)

109
sigi/templates/admin/carrinho.html

@ -0,0 +1,109 @@
{% extends "admin/change_list.html" %}
{% load adminmedia admin_list i18n %}
{% block extrastyle %}
{{ block.super }}
<style>
.botoes{
/*background: url("{{ADMIN_MEDIA_PREFIX}}img/admin/nav-bg.gif");*/
font-weight: bold;
/*color: red;*/
}
.botoes input{
background: none;
font-weight: bold;
border: none;
color: blue;
}
.botoes li {
background-image: url("{{ADMIN_MEDIA_PREFIX}}img/admin/nav-bg.gif");
display: inline;
border: 1px solid #CCC;
padding: 5px 10px;
margin: 0px;
}
.botoes a{
}
.botao_excluir input{
color: red;
background: url("{{ADMIN_MEDIA_PREFIX}}img/admin/icon_deletelink.gif") no-repeat scroll 0 50% transparent
}
</style>
{% endblock %}
{% block branding %} {% endblock %}
{% block userlinks %} {% endblock %}
{% block nav-global %} {% endblock %}
{% block title %}Carrinho | SIGI{% endblock %}
{% block content_title %}<h1>Carrinho</h1>{% endblock %}
{% block content %}
<div id="content-main">
{% block mensagem %}
<ul class="messagelist">
{%if carIsEmpty%}
<li class="warning">O carrinho está vazio</li>
{%else%}
<li>{{paginas.paginator.count}} Itens no carrinho.</li>
{%endif%}
</ul>
{% endblock %}
<div id="changelist" class="module">
<form action="{% block action %}#{% endblock %}"
class="changelist-form" method="post">
{%if not carIsEmpty%}
<div class="botoes">
<ul class="botao_excluir">
<li><input class="botao_excluir" type="submit" value=" Excluir do carrinho os itens selecionados" /></li>
<li><a href="excluir_carrinho">Esvaziar carrinho</a></li>
</ul>
</div>
{% endif %}
<div class="result_list">
{% block tabela %}{% endblock %}
</div>
{%if not carIsEmpty%}
<div class="botoes">
<ul class="botao_excluir">
<li><input class="botao_excluir" type="submit" value=" Excluir do carrinho os itens selecionados" /></li>
<li><a href="excluir_carrinho">Esvaziar carrinho</a></li>
</ul>
</div>
{% endif %}
<div class="paginator">
<span class="step-links">
{% if paginas.has_previous %}
<a href="?page={{ paginas.previous_page_number }}">Anterior</a>
{% endif %}
<span class="this-page">
Página {{ paginas.number }} of {{ paginas.paginator.num_pages }}.
</span>
{% if paginas.has_next %}
<a href="?page={{ paginas.next_page_number }}">Próxima</a>
{% endif %}
</span>
<span>{{paginas.paginator.count}} itens</span>
</div>
</form>
{% block botoes %}{% endblock %}
</div>
</div>
{% endblock %}
{% block footer %}{% endblock %}

38
sigi/templates/jquery/tabs_style.html → sigi/templates/admin/tabs_style.html

@ -7,27 +7,25 @@
<script type="text/javascript" src="{{MEDIA_URL}}js/jquery/ui/jquery.ui.core.js"></script> <script type="text/javascript" src="{{MEDIA_URL}}js/jquery/ui/jquery.ui.core.js"></script>
<script type="text/javascript" src="{{MEDIA_URL}}js/jquery/ui/jquery.ui.widget.js"></script> <script type="text/javascript" src="{{MEDIA_URL}}js/jquery/ui/jquery.ui.widget.js"></script>
<script type="text/javascript" src="{{MEDIA_URL}}js/jquery/ui/jquery.ui.tabs.js"></script> <script type="text/javascript" src="{{MEDIA_URL}}js/jquery/ui/jquery.ui.tabs.js"></script>
<script type="text/javascript" src="{{MEDIA_URL}}js/jquery/ui/jquery.ui.mouse.js"></script>
<script type="text/javascript" src="{{MEDIA_URL}}js/jquery/ui/ jquery.ui.sortable.js"></script>
<script type="text/javascript"> <script type="text/javascript">
$(function() { $(function() {
$("#tabs").tabs( $( "#tabs" ).tabs({
{collapsible: true} event: "mouseover"
); });
}); });
</script> </script>
<!--End Script's JQuery-->
<!--CSS para o conteudo das tabs do jquery--> <script>
<style> $(function() {
.ui-tabs-nav{ $( "#sortable" ).sortable();
background-image: url("../../admin_media/img/admin/nav-bg.gif"); $( "#sortable" ).disableSelection();
} });
.tabs-conteudo li{ </script>
border: 1px solid #CCC;
background-image: url("../../admin_media/img/admin/nav-bg.gif"); <style>
display: inline; .ui-tabs-nav {
padding: 4px 8px; background-image: url("{{ADMIN_MEDIA_PREFIX}}img/admin/nav-bg.gif");
} }
.tabs-conteudo a{ </style>
color:#000;
}
</style>

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

@ -58,6 +58,26 @@
</div> </div>
</div> </div>
<div class="module">
<h2>Resumo de informações</h2>
<h3>Resumo de informações por região</h3>
<div >
<p style="text-align: justify">
Resumo de informações de Câmaras Municipais por região levando em conta
apenas o Projeto Interlegis. Demais projetos como PPM e PML não estão inclusos.
</p>
<ul class="conteudo_regiao">
<li><a href="reportsRegiao/CO">Centro Oeste</a></li>
<li><a href="reportsRegiao/NE">Nordeste</a></li>
<li><a href="reportsRegiao/NO">Norte</a></li>
<li><a href="reportsRegiao/SD">Sudeste</a></li>
<li><a href="reportsRegiao/SL">Sul</a></li>
</ul>
</div>
</div>
<div class="module"> <div class="module">
<h2>Convênios</h2> <h2>Convênios</h2>
<h3>Processos de convênios por projeto</h3> <h3>Processos de convênios por projeto</h3>

52
sigi/urls.py

@ -1,16 +1,19 @@
#-*- coding:utf-8 -*-
from django.conf import settings from django.conf import settings
from django.conf.urls.defaults import * from django.conf.urls.defaults import *
from sigi import sites import sites
# register admin filters # register admin filters
import sigi.admin.filterspecs import admin.filterspecs
urlpatterns = patterns( urlpatterns = patterns(
'', '',
# Informacoes de uma casa legislativa # Informacoes de uma casa legislativa
(r'^casas/casalegislativa/(?P<id>\w+)/casa_info/', (r'^casas/casalegislativa/(?P<id>\w+)/report_complete/',
'sigi.apps.casas.views.casa_info'), 'sigi.apps.casas.views.report_complete'),
(r'^casas/casalegislativa/report_complete/',
'sigi.apps.casas.views.report_complete'),
# reports labels # reports labels
(r'^casas/casalegislativa/labels/', (r'^casas/casalegislativa/labels/',
'sigi.apps.casas.views.labels_report'), 'sigi.apps.casas.views.labels_report'),
@ -21,24 +24,35 @@ urlpatterns = patterns(
'sigi.apps.casas.views.labels_report_sem_presidente'), 'sigi.apps.casas.views.labels_report_sem_presidente'),
(r'^casas/casalegislativa/(?P<id>\w+)/labels_sem_presidente/', (r'^casas/casalegislativa/(?P<id>\w+)/labels_sem_presidente/',
'sigi.apps.casas.views.labels_report_sem_presidente'), 'sigi.apps.casas.views.labels_report_sem_presidente'),
# reports # reports casa
(r'^casas/casalegislativa/reports/', (r'^casas/casalegislativa/reports/',
'sigi.apps.casas.views.report'), 'sigi.apps.casas.views.report'),
(r'^casas/casalegislativa/csv/',
'sigi.apps.casas.views.export_csv'),
(r'^casas/casalegislativa/casas_sem_convenio_report/', (r'^casas/casalegislativa/casas_sem_convenio_report/',
'sigi.apps.casas.views.casas_sem_convenio_report'), 'sigi.apps.casas.views.casas_sem_convenio_report'),
(r'^convenios/convenio/reports_por_cm/', # reports convenios
'sigi.apps.convenios.views.report_por_cm'), (r'^convenios/convenio/reports/',
(r'^convenios/convenio/reports_por_al/', 'sigi.apps.convenios.views.report'),
'sigi.apps.convenios.views.report_por_al'), #Carrinho Casa
(r'^convenios/convenio/reportsRegiao/(?P<regiao>\w+)', (r'^casas/casalegislativa/carrinho/deleta_itens_carrinho',
'sigi.apps.convenios.views.report_regiao'), 'sigi.apps.casas.views.deleta_itens_carrinho'),
#reports sem data de aceite (r'^casas/casalegislativa/carrinho/excluir_carrinho',
(r'^convenios/convenio/report_semaceite_por_cm/', 'sigi.apps.casas.views.excluir_carrinho'),
'sigi.apps.convenios.views.report_semaceite_por_cm'), (r'^casas/casalegislativa/carrinho/',
(r'^convenios/convenio/report_semaceite_por_al/', 'sigi.apps.casas.views.visualizar_carrinho'),
'sigi.apps.convenios.views.report_semaceite_por_al'), #Carrinho Convenio
(r'^convenios/convenio/carrinho/deleta_itens_carrinho',
'sigi.apps.convenios.views.deleta_itens_carrinho'),
(r'^convenios/convenio/carrinho/excluir_carrinho',
'sigi.apps.convenios.views.excluir_carrinho'),
(r'^convenios/convenio/carrinho/',
'sigi.apps.convenios.views.visualizar_carrinho'),
#CSV Casa
(r'^casas/casalegislativa/csv/',
'sigi.apps.casas.views.export_csv'),
# Resumo por região PDF
(r'^reportsRegiao/(?P<regiao>\w+)',
'sigi.apps.convenios.views.report_regiao'),
# automatic interface based on admin # automatic interface based on admin
(r'^(.*)', sites.default.root), (r'^(.*)', sites.default.root),
) )

Loading…
Cancel
Save