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 -*-
from django.contrib import admin
from django.contrib.contenttypes import generic
from sigi.apps.casas.forms import CasaLegislativaForm
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.contatos.models import Contato, Telefone
from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo
from apps.casas.forms import CasaLegislativaForm
from apps.casas.models import CasaLegislativa
from apps.contatos.models import Contato, Telefone
from apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo
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 sigi.apps.casas.views import casa_info, labels_report, export_csv, \
labels_report_sem_presidente, report
from sigi.apps.utils import queryset_ascii
from apps.casas.views import report_complete, labels_report, export_csv, \
labels_report_sem_presidente, report, \
adicionar_casas_carrinho
from apps.utils import queryset_ascii
class ContatosInline(generic.GenericTabularInline):
model = Contato
@ -30,7 +31,7 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
form = CasaLegislativaForm
change_form_template = 'casas/change_form.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)
list_display = ('nome','municipio','presidente','logradouro')
list_display_links = ('nome',)
@ -61,41 +62,42 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
extra_context={'query_str': '?' + request.META['QUERY_STRING']}
)
def etiqueta(modelAdmin,request,queryset):
def etiqueta(self,request,queryset):
return labels_report(request,queryset=queryset)
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)
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)
relatorio.short_description = u"Exportar a(s) casa(s) selecionada(s) para PDF"
def relatorio_completo(modelAdmin,request,queryset):
return casa_info(request,queryset=queryset)
def relatorio_completo(self,request,queryset):
return report_complete(request,queryset=queryset)
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)
relatorio_csv.short_description = u"Exportar casa(s) selecionada(s) para CSV"
def adicionar_casas(modelAdmin, request, queryset):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
print "Selecionados atual :",
print ids_selecionados
if request.session.has_key('ids_selecionados_etiqueta') == False:
request.session['ids_selecionados_etiqueta'] = ids_selecionados
else:
lista = request.session['ids_selecionados_etiqueta']
print "Selecionados anteriormente :",
print lista
lista.extend(ids_selecionados)
print "Todos selecionados :",
print lista
request.session['ids_selecionados_etiqueta'] = lista
def adicionar_casas(self, request, queryset):
if request.session.has_key('carrinho_casas'):
q1 = len(request.session['carrinho_casas'])
else:
q1 = 0
response = adicionar_casas_carrinho(request,queryset=queryset)
q2 = len(request.session['carrinho_casas'])
quant = q2 - q1
if quant:
self.message_user(request,str(q2-q1)+" Casas Legislativas adicionadas no carrinho" )
else:
self.message_user(request,"As Casas Legislativas selecionadas já foram adicionadas anteriormente" )
return HttpResponseRedirect('.')
adicionar_casas.short_description = u"Armazenar casas no carrinho para exportar"
def get_actions(self, 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.enums import TA_CENTER, TA_RIGHT
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
@ -220,6 +220,15 @@ class CasasSemConvenioReport(CasasLegislativasReport):
class InfoCasaLegislativa(ReportDefault):
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):
posicao_left = [
@ -403,7 +412,7 @@ class InfoCasaLegislativa(ReportDefault):
),
ObjectValue(attribute_name='nota',left=tel_left[2]*cm),
],
borders = {'all':True},
#borders = {'all':True},
),
),
#Contatos
@ -433,7 +442,7 @@ class InfoCasaLegislativa(ReportDefault):
ObjectValue(attribute_name='nota',left=cont_left[1]*cm),
ObjectValue(attribute_name='email',left=cont_left[2]*cm),
],
borders = {'all':True},
#borders = {'all':True},
),
),
#Convenios
@ -483,7 +492,7 @@ class InfoCasaLegislativa(ReportDefault):
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 %}
{% if change %}{% if not is_popup %}
<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_sem_presidente/">Etiqueta sem presidente</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" %}
{% load adminmedia admin_list i18n reporting_tags %}
{% block extrastyle %}
{{ block.super }}
{% include "jquery/tabs_style.html" %}
{% endblock %}
{% block object-tools %}
{% if has_add_permission %}
<div id="tabs">
<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>
<ul class="object-tools">
<li><a href="casas_sem_convenio_report/{{query_str}}">Casas sem Processo de Convênio</a></li>
<li><a onclick="return showRelatedObjectLookupPopup(this);" href="carrinho/{{query_str}}">Carrinho / Exportar</a></li>
<li>
<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>-->
{% endif %}
</li>
</ul>
{% endblock %}

248
sigi/apps/casas/views.py

@ -1,15 +1,21 @@
# -*- coding: utf-8 -*-
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
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 sigi.apps.casas.reports import CasasLegislativasLabelsSemPresidente
from sigi.apps.casas.reports import CasasLegislativasReport
from sigi.apps.casas.reports import CasasSemConvenioReport
from sigi.apps.casas.reports import InfoCasaLegislativa
from apps.casas.reports import CasasLegislativasLabels
from apps.casas.reports import CasasLegislativasLabelsSemPresidente
from apps.casas.reports import CasasLegislativasReport
from apps.casas.reports import CasasSemConvenioReport
from apps.casas.reports import InfoCasaLegislativa
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.conf import settings
import csv
from bzrlib.switch import switch
def query_ordena(qs,o,ot):
list_display = ('nome','municipio','presidente','logradouro')
@ -22,93 +28,186 @@ def query_ordena(qs,o,ot):
return qs
def get_for_qs(get,qs):
"""
Verifica atributos do GET e retorna queryset correspondente
"""
kwargs = {}
for k,v in get.iteritems():
if not k == 'o':
if k == "ot":
qs = query_ordena(qs,get["o"],get["ot"])
else:
kwargs[str(k)] = v
qs = qs.filter(**kwargs)
if not (k == 'page' or k == 'pop' or k == 'q'):
if not k == 'o':
if k == "ot":
qs = query_ordena(qs,get["o"],get["ot"])
else:
kwargs[str(k)] = v
qs = qs.filter(**kwargs)
return qs
def labels_report(request, id=None,queryset=None):
""" TODO: adicionar suporte para resultado de pesquisa do admin.
def carrinhoOrGet_for_qs(request):
"""
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:
ids = request.session['ids_selecionados_etiqueta']
del request.session['ids_selecionados_etiqueta']
# request.session.modified = True
print "Impressao",
print ids
qs = CasaLegislativa.objects.filter(pk__in=ids)
elif queryset:
qs = queryset
if request.session.has_key('carrinho_casas'):
ids = request.session['carrinho_casas']
qs = CasaLegislativa.objects.filter(pk__in=ids)
else:
qs = CasaLegislativa.objects.all()
if id:
qs = qs.filter(pk=id)
elif request.GET:
qs = CasaLegislativa.objects.all()
if request.GET:
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['Content-Disposition'] = 'attachment; filename=casas.pdf'
report = CasasLegislativasLabels(queryset=qs)
report.generate_by(PDFGenerator, filename=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.
"""
if queryset:
qs = queryset
else:
qs = CasaLegislativa.objects.all()
if id:
qs = qs.filter(pk=id)
elif request.GET:
qs = get_for_qs(request.GET,qs)
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['Content-Disposition'] = 'attachment; filename=casas.pdf'
report = CasasLegislativasLabelsSemPresidente(queryset=qs)
report.generate_by(PDFGenerator, filename=response)
return response
def report(request, id=None,queryset=None):
if queryset:
qs = queryset
else:
qs = CasaLegislativa.objects.all()
if id:
qs = qs.filter(pk=id)
elif request.GET:
qs = get_for_qs(request.GET,qs)
def report(request, id=None,tipo=None):
if request.POST:
if request.POST.has_key('tipo_relatorio'):
tipo = request.POST['tipo_relatorio']
if tipo =='completo':
return report_complete(request, id)
if id:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = carrinhoOrGet_for_qs(request)
if not qs:
return HttpResponseRedirect('../')
if not qs:
return HttpResponseRedirect('../')
#qs.order_by('municipio__uf','nome')
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=casas.pdf'
report = CasasLegislativasReport(queryset=qs)
report.generate_by(PDFGenerator, filename=response)
return response
def casa_info(request,id=None,queryset=None):
if queryset:
qs = queryset
else:
qs = CasaLegislativa.objects.all()
if id:
qs = qs.filter(pk=id)
elif request.GET:
qs = get_for_qs(request.GET,qs)
def report_complete(request,id=None):
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['Content-Disposition'] = 'attachment; filename=casas.pdf'
# Gera um relatorio para cada casa e concatena os relatorios
cont = 0
@ -154,8 +253,39 @@ def export_csv(request):
response['Content-Disposition'] = 'attachment; filename=casas.csv'
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:
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

41
sigi/apps/convenios/admin.py

@ -1,13 +1,15 @@
# -*- coding: utf-8 -*-
from django.contrib import admin
from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.servicos.models import Servico
from apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo
from apps.casas.models import CasaLegislativa
from apps.servicos.models import Servico
from django.http import HttpResponse, HttpResponseRedirect
from sigi.apps.convenios.reports import ConvenioReport
from sigi.apps.utils import queryset_ascii
from apps.convenios.reports import ConvenioReport
from apps.utils import queryset_ascii
from geraldo.generators import PDFGenerator
from apps.convenios.views import adicionar_convenios_carrinho
class AnexosInline(admin.TabularInline):
model = Anexo
extra = 2
@ -38,7 +40,7 @@ class ConvenioAdmin(admin.ModelAdmin):
'data_devolucao_via', 'data_postagem_correio')}
),
)
actions = ['delete_selected', 'relatorio']
actions = ['adicionar_convenios']
inlines = (AnexosInline, EquipamentoPrevistoInline)
list_display = ('num_convenio', 'casa_legislativa',
'data_adesao','data_retorno_assinatura','data_termo_aceite',
@ -47,7 +49,7 @@ class ConvenioAdmin(admin.ModelAdmin):
list_display_links = ('num_convenio','casa_legislativa',)
list_filter = ('projeto','casa_legislativa','conveniada', 'equipada')
#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',)
queryset = queryset_ascii
search_fields = ('id', 'search_text',#'casa_legislativa__nome',
@ -58,15 +60,34 @@ class ConvenioAdmin(admin.ModelAdmin):
request,
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')
response = HttpResponse(mimetype='application/pdf')
report = ConvenioReport(queryset=queryset)
report.generate_by(PDFGenerator, filename=response)
return response
return response
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):
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.super }}
{% include "jquery/tabs_style.html" %}
{% include "admin/tabs_style.html" %}
{% endblock %}
{% block object-tools %}
{% if has_add_permission %}
{% if has_add_permission %}
<div id="tabs">
<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">
<ul class="object-tools">
<li><a onclick="return showRelatedObjectLookupPopup(this);" href="carrinho/{{query_str}}">Carrinho / Exportar</a></li>
<li>
<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> -->
</ul>
{% endif %}
{% 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;
}
#footerContent #esquerda{
text-align: left;
text-align: left;
}
#footerContent #direita{
text-align: right;
}
background-image: url("/media/images/logo-senado.png");
}
.tabela {
padding-top: 0.1cm;
padding-left: 0.1cm;
@ -79,12 +80,8 @@
.tabela .sumario{
font-weight: bold;
background-color: #CFCFCF;
}
.tabela .aderidas{
/*background-color: #E8E8E8;*/
border: blue solid;
}
.tabela .estado{
}
.tabela .cabecalho_esquerda{
background-color: #E8E8E8;
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>
</tr>
</table>
<h1 class="titulo">Resumo por Região</h1>
<h1 class="titulo">{{tabela.regiao}}</h1>
</div>
<div id="midle">
<table class="tabela" repeat="1">
<caption>{{sumario_regiao.regiao}}</caption>
<caption>{{tabela.projeto}} - {{tabela.regiao}}</caption>
<thead>
<tr>
<th>UF</th>
<th>Total</th>
<th>Não Aderidas</th>
<th>%</th>
<th>Aderidas</th>
<th>%</th>
<th>Não Equipadas</th>
<th>%</th>
<th>Equipadas</th>
<th>%</th>
{%for item in tabela.cabecalho%}
<th>{{item}}</th>
{%endfor%}
</tr>
</thead>
<tbody>
{%for r in lista%}
<tr class="conteudo">
<td class="estado">{{r.estado}}</td>
<td>{{r.quant_casas}}</td>
<td>{{r.quant_casas_nao_aderidas}}</td>
<td>{{r.porc_casas_nao_aderidas}}</td>
<td class="aderidas">{{r.quant_casas_aderidas}}</td>
<td class="aderidas">{{r.porc_casas_aderidas}}</td>
<td class="aderidas">{{r.quant_casas_nao_equipadas}}</td>
<td class="aderidas">{{r.porc_casas_nao_equipadas}}</td>
<td class="aderidas">{{r.quant_casas_equipadas}}</td>
<td class="aderidas">{{r.porc_casas_equipadas}}</td>
</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>
{% for linha in tabela.linhas %}
<tr class="conteudo">
<th class="cabecalho_esquerda">{{linha.estado}}</th>
{% for item in linha.lista %}
<td>{{item}}</td>
{% endfor %}
</tr>
{% endfor %}
<tr>
<th>Total</th>
{% for item in tabela.sumario %}
<th>{{item}}</th>
{% endfor %}
</tr>
</tbody>
</table>
</div>

371
sigi/apps/convenios/views.py

@ -1,19 +1,23 @@
#-*- coding:utf-8 -*-
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response, get_list_or_404
from geraldo.generators import PDFGenerator
from sigi.apps.convenios.models import Convenio
from sigi.apps.convenios.reports import ConvenioReport, \
ConvenioPorCMReport, \
ConvenioPorALReport, \
ConvenioReportRegiao, \
ConvenioReportSemAceiteAL, \
ConvenioReportSemAceiteCM
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.contatos.models import UnidadeFederativa
from apps.convenios.models import Convenio
from apps.convenios.reports import ConvenioReport \
,ConvenioPorCMReport \
,ConvenioPorALReport \
,ConvenioReportSemAceiteAL \
,ConvenioReportSemAceiteCM
from apps.casas.models import CasaLegislativa
from apps.contatos.models import UnidadeFederativa
import ho.pisa as pisa
from django.template import Context, loader
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.conf import settings
import datetime
def query_ordena(qs,o,ot):
@ -33,120 +37,147 @@ def get_for_qs(get,qs):
kwargs = {}
ids = 0
for k,v in get.iteritems():
if not k == 'o':
if k == "ot":
qs = query_ordena(qs,get["o"],get["ot"])
else:
kwargs[str(k)] = v
if(str(k)=='ids'):
ids = 1
break
qs = qs.filter(**kwargs)
if not (k == 'page' or k == 'pop' or k == 'q'):
if not k == 'o':
if k == "ot":
qs = query_ordena(qs,get["o"],get["ot"])
else:
kwargs[str(k)] = v
if(str(k)=='ids'):
ids = 1
break
qs = qs.filter(**kwargs)
if ids:
query = 'id IN ('+ kwargs['ids'].__str__()+')'
qs = Convenio.objects.extra(where=[query])
return qs
def report_por_cm(request, id=None):
qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM').order_by('casa_legislativa__municipio__uf','casa_legislativa')
if id:
qs = qs.filter(pk=id)
elif request.GET: #Se tiver algum parametro de pesquisa
qs = get_for_qs(request.GET,qs)
if not qs:
return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf')
report = ConvenioPorCMReport(queryset=qs)
report.generate_by(PDFGenerator, filename=response)
return response
def carrinhoOrGet_for_qs(request):
"""
Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente.
"""
if request.session.has_key('carrinho_convenios'):
ids = request.session['carrinho_convenios']
qs = Convenio.objects.filter(pk__in=ids)
else:
qs = Convenio.objects.all()
if request.GET:
qs = qs.order_by("casa_legislativa__municipio__uf","casa_legislativa__municipio")
qs = get_for_qs(request.GET,qs)
return qs
def report_por_al(request, id=None):
qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='AL').order_by('casa_legislativa__municipio__uf','casa_legislativa')
if id:
qs = qs.filter(pk=id)
elif request.GET: #Se tiver algum parametro de pesquisa
qs = get_for_qs(request.GET,qs)
if not qs:
return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf')
report = ConvenioPorALReport(queryset=qs)
report.generate_by(PDFGenerator, filename=response)
return response
def adicionar_convenios_carrinho(request,queryset=None,id=None):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
if not request.session.has_key('carrinho_convenios'):
request.session['carrinho_convenios'] = ids_selecionados
else:
lista = request.session['carrinho_convenios']
# Verifica se id já não está adicionado
for id in ids_selecionados:
if not id in lista:
lista.append(id)
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):
qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM').order_by('casa_legislativa__municipio__uf','casa_legislativa')
if id:
qs = qs.filter(pk=id)
elif request.GET: #Se tiver algum parametro de pesquisa
qs = get_for_qs(request.GET,qs)
if not qs:
return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf')
report = ConvenioReportSemAceiteCM(queryset=qs)
report.generate_by(PDFGenerator, filename=response)
return response
def deleta_itens_carrinho(request):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
if request.session.has_key('carrinho_convenios'):
lista = request.session['carrinho_convenios']
for item in ids_selecionados:
lista.remove(item)
if lista:
request.session['carrinho_convenios'] = lista
else:
del lista;
del request.session['carrinho_convenios']
return HttpResponseRedirect('.')
def report_semaceite_por_al(request, id=None):
qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='AL').order_by('casa_legislativa__municipio__uf','casa_legislativa')
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_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:
qs = qs.filter(pk=id)
elif request.GET: #Se tiver algum parametro de pesquisa
qs = get_for_qs(request.GET,qs)
qs = Convenio.objects.filter(pk=id)
else:
qs = carrinhoOrGet_for_qs(request)
if not qs:
return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf')
report = ConvenioReportSemAceiteAL(queryset=qs)
report.generate_by(PDFGenerator, filename=response)
return response
return HttpResponseRedirect('../')
class RelatorioRegiao(object):
def __init__(self, estado, casas, casas_aderidas, casas_equipadas,casas_nao_equipadas):
self.estado = estado
self.quant_casas = casas
self.quant_casas_aderidas = casas_aderidas
self.quant_casas_nao_aderidas = (casas - casas_aderidas)
self.quant_casas_equipadas = casas_equipadas
self.quant_casas_nao_equipadas = casas_nao_equipadas
if(casas!=0):
self.porc_casas_aderidas = "%.2f" % (float(casas_aderidas)*100/float(casas))
self.porc_casas_nao_aderidas = "%.2f" % (float(self.quant_casas_nao_aderidas)*100/float(casas))
else:
self.porc_casas_aderidas = 0
self.porc_casas_nao_aderidas = 0
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))
tipo = ''
data_aceite_has = ''
report = None
if request.POST:
if request.POST.has_key('filtro_casa'):
tipo = request.POST['filtro_casa']
if request.POST.has_key('data_aceite'):
data_aceite_has = request.POST['data_aceite']
# Verifica filtro se é por Assembleia
if tipo == 'al':
qs = qs.filter(casa_legislativa__tipo__sigla='AL')
# Verifica se é com data de aceite
if data_aceite_has == 'nao':
report = ConvenioReportSemAceiteAL(queryset=qs)
else:
report = ConvenioPorALReport(queryset=qs)
else:
self.porc_casas_equipadas = 0
self.porc_casas_nao_equipadas = 0
qs = qs.filter(casa_legislativa__tipo__sigla='CM')
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'):
if request.POST:
if request.POST.has_key('regiao'):
regiao = request.POST['regiao']
REGIAO_CHOICES = {
'SL': 'Sul',
@ -154,54 +185,108 @@ def report_regiao(request,regiao='NE'):
'CO': 'Centro-Oeste',
'NE': 'Nordeste',
'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
estados = get_list_or_404(UnidadeFederativa,regiao=regiao)
class LinhaEstado():
pass
lista = []
for estado in estados:
casas = CasaLegislativa.objects.filter(municipio__uf=estado)
casas_aderidas = casas.exclude(convenio=None).distinct()
casas_equipadas = casas_aderidas.exclude(convenio__data_termo_aceite=None).distinct()
casas_nao_equipadas = casas_aderidas.filter(convenio__data_termo_aceite=None).distinct()
lista.append(
RelatorioRegiao(
estado.sigla,casas.count(),
casas_aderidas.count(),
casas_equipadas.count(),
casas_nao_equipadas.count()
)
linha = LinhaEstado()
conv_sem_adesao_est = convenios_sem_adesao.filter(casa_legislativa__municipio__uf=estado)
conv_com_adesao_est = convenios_com_adesao.filter(casa_legislativa__municipio__uf=estado)
conv_assinados_est = convenios_assinados.filter(casa_legislativa__municipio__uf=estado)
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)
camaras_est = camaras.filter(municipio__uf=estado,tipo__sigla='CM').count()
camaras_sem_processo_est = camaras_sem_processo.filter(municipio__uf=estado).count()
camaras_nao_aderidas_est = camaras.filter(convenio__in=conv_sem_adesao_est).count()
camaras_aderidas_est = camaras.filter(convenio__in=conv_com_adesao_est).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
casas = CasaLegislativa.objects.filter(municipio__uf__regiao=regiao)
casas_aderidas = casas.exclude(convenio=None).distinct()
casas_equipadas = casas_aderidas.exclude(convenio__data_termo_aceite=None).distinct()
casas_nao_equipadas = casas_aderidas.filter(convenio__data_termo_aceite=None).distinct()
sumario_regiao = RelatorioRegiaoTotal(
REGIAO_CHOICES[regiao],
casas.count(),
casas_aderidas.count(),
casas_equipadas.count(),
casas_nao_equipadas.count(),
)
# response = HttpResponse(mimetype='application/pdf')
# relatorio = ConvenioReportRegiao(queryset=lista)
# relatorio.generate_by(PDFGenerator, filename=response)
linha.estado = estado.sigla
lista.append(linha)
# Total
total_cm = camaras.filter(municipio__uf__regiao=regiao,tipo__sigla='CM').count()
total_sem_processo = camaras_sem_processo.filter(municipio__uf__regiao=regiao).count()
total_sem_adesao = camaras.filter(convenio__in=convenios_sem_adesao,municipio__uf__regiao=regiao).count()
total_com_adesao = camaras.filter(convenio__in=convenios_com_adesao,municipio__uf__regiao=regiao).count()
total_conv_assin = camaras.filter(convenio__in=convenios_assinados,municipio__uf__regiao=regiao).count()
total_conv_andam = camaras.filter(convenio__in=convenios_em_andamento,municipio__uf__regiao=regiao).count()
total_equipadas = camaras.filter(convenio__in=convenios_com_aceite,municipio__uf__regiao=regiao).count()
sumario = [
total_cm,
total_sem_processo,
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')
hora = datetime.datetime.now().strftime('%H:%M')
pisa.showLogging()
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf'
t = loader.get_template('convenios/relatorio_por_regiao.html')
c = Context({'lista': lista,'sumario_regiao':sumario_regiao,'data':data,'hora':hora})
t = loader.get_template('convenios/tabela_regiao.html')
c = Context({'tabela':tabela,'data':data,'hora':hora})
pdf = pisa.CreatePDF(t.render(c),response)
if not pdf.err:
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.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.mouse.js"></script>
<script type="text/javascript" src="{{MEDIA_URL}}js/jquery/ui/ jquery.ui.sortable.js"></script>
<script type="text/javascript">
$(function() {
$("#tabs").tabs(
{collapsible: true}
);
$( "#tabs" ).tabs({
event: "mouseover"
});
});
</script>
<!--End Script's JQuery-->
</script>
<!--CSS para o conteudo das tabs do jquery-->
<style>
.ui-tabs-nav{
background-image: url("../../admin_media/img/admin/nav-bg.gif");
}
.tabs-conteudo li{
border: 1px solid #CCC;
background-image: url("../../admin_media/img/admin/nav-bg.gif");
display: inline;
padding: 4px 8px;
}
.tabs-conteudo a{
color:#000;
}
</style>
<script>
$(function() {
$( "#sortable" ).sortable();
$( "#sortable" ).disableSelection();
});
</script>
<style>
.ui-tabs-nav {
background-image: url("{{ADMIN_MEDIA_PREFIX}}img/admin/nav-bg.gif");
}
</style>

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

@ -58,6 +58,26 @@
</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">
<h2>Convênios</h2>
<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.urls.defaults import *
from sigi import sites
import sites
# register admin filters
import sigi.admin.filterspecs
import admin.filterspecs
urlpatterns = patterns(
'',
# Informacoes de uma casa legislativa
(r'^casas/casalegislativa/(?P<id>\w+)/casa_info/',
'sigi.apps.casas.views.casa_info'),
(r'^casas/casalegislativa/(?P<id>\w+)/report_complete/',
'sigi.apps.casas.views.report_complete'),
(r'^casas/casalegislativa/report_complete/',
'sigi.apps.casas.views.report_complete'),
# reports labels
(r'^casas/casalegislativa/labels/',
'sigi.apps.casas.views.labels_report'),
@ -21,24 +24,35 @@ urlpatterns = patterns(
'sigi.apps.casas.views.labels_report_sem_presidente'),
(r'^casas/casalegislativa/(?P<id>\w+)/labels_sem_presidente/',
'sigi.apps.casas.views.labels_report_sem_presidente'),
# reports
# reports casa
(r'^casas/casalegislativa/reports/',
'sigi.apps.casas.views.report'),
(r'^casas/casalegislativa/csv/',
'sigi.apps.casas.views.export_csv'),
'sigi.apps.casas.views.report'),
(r'^casas/casalegislativa/casas_sem_convenio_report/',
'sigi.apps.casas.views.casas_sem_convenio_report'),
(r'^convenios/convenio/reports_por_cm/',
'sigi.apps.convenios.views.report_por_cm'),
(r'^convenios/convenio/reports_por_al/',
'sigi.apps.convenios.views.report_por_al'),
(r'^convenios/convenio/reportsRegiao/(?P<regiao>\w+)',
'sigi.apps.convenios.views.report_regiao'),
#reports sem data de aceite
(r'^convenios/convenio/report_semaceite_por_cm/',
'sigi.apps.convenios.views.report_semaceite_por_cm'),
(r'^convenios/convenio/report_semaceite_por_al/',
'sigi.apps.convenios.views.report_semaceite_por_al'),
# reports convenios
(r'^convenios/convenio/reports/',
'sigi.apps.convenios.views.report'),
#Carrinho Casa
(r'^casas/casalegislativa/carrinho/deleta_itens_carrinho',
'sigi.apps.casas.views.deleta_itens_carrinho'),
(r'^casas/casalegislativa/carrinho/excluir_carrinho',
'sigi.apps.casas.views.excluir_carrinho'),
(r'^casas/casalegislativa/carrinho/',
'sigi.apps.casas.views.visualizar_carrinho'),
#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
(r'^(.*)', sites.default.root),
)

Loading…
Cancel
Save