Browse Source

Adicionando tabs na pagina de convenio para organizar geração de relatorios. Trocando os nomes de geração de relatorio para exportar para PDF. Acrescentando novo relatorio - resumo de informações do projeto interlegis por região

diagnosticos
Starlone (Estagiario) 14 years ago
parent
commit
ad94ace1d0
  1. 2
      sigi/apps/convenios/admin.py
  2. 85
      sigi/apps/convenios/reports.py
  3. 66
      sigi/apps/convenios/templates/convenios/change_list.html
  4. 165
      sigi/apps/convenios/templates/convenios/relatorio_por_regiao.html
  5. 138
      sigi/apps/convenios/views.py
  6. 4
      sigi/urls.py

2
sigi/apps/convenios/admin.py

@ -65,7 +65,7 @@ class ConvenioAdmin(admin.ModelAdmin):
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
relatorio.short_description = 'Gerar relatorio dos convenios selecionados' relatorio.short_description = u'Exportar convênios selecionados para PDF'
class EquipamentoPrevistoAdmin(admin.ModelAdmin): class EquipamentoPrevistoAdmin(admin.ModelAdmin):

85
sigi/apps/convenios/reports.py

@ -4,7 +4,7 @@ from ctypes import alignment
from operator import attrgetter from operator import attrgetter
from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \ from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \
landscape,SystemField, BAND_WIDTH,ReportGroup, \ landscape,SystemField, BAND_WIDTH,ReportGroup, \
FIELD_ACTION_SUM, FIELD_ACTION_COUNT FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG
from geraldo.graphics import Image from geraldo.graphics import Image
from reportlab.lib.units import cm from reportlab.lib.units import cm
@ -26,8 +26,9 @@ class CasasComEquipamentosReport(object):
class SemEquipamentosReport(object): class SemEquipamentosReport(object):
pass pass
class ConvenioReport(ReportDefault): class ConvenioReport(ReportDefault):
title = u'Relatório de Convênios' title = u'Relatório de Convênios'
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
@ -151,62 +152,60 @@ class ConvenioReport(ReportDefault):
) )
] ]
float_duas_casas = lambda instance: '%.2f' % (instance)
class ConvenioReportRegiao(ReportDefault): class ConvenioReportRegiao(ReportDefault):
title = u'Relatório de Convênios por Região' title = u'Relatório de Convênios por Região'
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top label_top = ReportDefault.band_page_header.label_top
label_left = [0.5,6,8,10,12,14]
map(lambda x:x-0.4,label_left)
elements = list(ReportDefault.band_page_header.elements) elements = list(ReportDefault.band_page_header.elements)
elements += [ elements += [
Label( Label(text="UF", left=label_left[0]*cm,top=label_top,),
text="Região", left=0*cm, Label(text="Total", left=label_left[1]*cm,top=label_top,),
top=label_top, Label(text="Aderidas", left=label_left[2]*cm,top=label_top,),
), Label(text="%", left=label_left[3]*cm,top=label_top),
Label( Label(text="Ñ Aderidas", left=label_left[4]*cm,top=label_top,),
text="Casas", left=3*cm, Label(text="%", left=label_left[5]*cm,top=label_top),
top=label_top,
),
Label(
text="Conveniadas", left=5*cm,
top=label_top,
),
Label(
text="%", left=7*cm,
top=label_top
),
Label(
text="Não Conveniadas", left=9*cm,
top=label_top,
),
] ]
class band_detail(ReportDefault.band_detail): class band_detail(ReportDefault.band_detail):
elements=[ label_left = [0.5,6,8,10,12,14]
ObjectValue(attribute_name='regiao', left=0*cm, ), display_inline = True
ObjectValue(attribute_name='casas', left=3*cm,), float_duas_casas = lambda instance: '%.2f' % (instance.porc_casas_aderidas)
ObjectValue(attribute_name='casas_conveniadas', left=5*cm), default_style = {'fontName': 'Helvetica', 'fontSize': 11}
ObjectValue(attribute_name='porc_casas_conveniadas', left=7*cm),
]
border = {'bottom': True}
class band_summary(ReportBand): elements=[
ObjectValue(attribute_name='estado', left=label_left[0]*cm, ),
ObjectValue(attribute_name='quant_casas', left=label_left[1]*cm,),
ObjectValue(attribute_name='quant_casas_aderidas', left=label_left[2]*cm),
ObjectValue(attribute_name='porc_casas_aderidas', left=label_left[3]*cm),
ObjectValue(attribute_name='quant_casas_nao_aderidas', left=label_left[4]*cm),
ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,),
]
class band_summary(ReportBand):
label_left = [0.5,6,8,10,12,14]
elements = [ elements = [
Label(text="Total", top=0.1*cm, left=0), Label(text="Total", top=0.1*cm, left=label_left[0]*cm),
ObjectValue(attribute_name='casas', action=FIELD_ACTION_SUM, left=3*cm, top=0.1*cm), ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1]*cm, ),
ObjectValue(attribute_name='casas_conveniadas', left=6*cm, action=FIELD_ACTION_SUM), ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2]*cm),
# ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm,
# #get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas),
# ),
ObjectValue(attribute_name='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4]*cm),
# ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,
# get_value=lambda x: teste(),
# ),
] ]
borders = {'top':True} borders = {'top':True}
#child_bands = [
# ReportBand(
# height = 0.6*cm,
# elements = [
# Label(text="Total",),
# ObjectValue(attribute_name='casas', action=FIELD_ACTION_COUNT,)
# ]
# ),
# ]
class ConvenioPorCMReport(ConvenioReport): class ConvenioPorCMReport(ConvenioReport):
title = u'Relatório de Convênios por Câmera Municipal' title = u'Relatório de Convênios por Câmera Municipal'

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

@ -1,17 +1,63 @@
{% extends "admin/change_list.html" %} {% extends "admin/change_list.html" %}
{% load i18n reporting_tags %} {% load i18n reporting_tags %}
{% block extrastyle %}
{{ block.super }}
{% include "jquery/tabs_style.html" %}
{% endblock %}
{% block object-tools %} {% block object-tools %}
{% if has_add_permission %} {% if has_add_permission %}
<ul class="object-tools">
<li><a href="reports_por_cm/{{ query_str }}">Relatórios por Câmara Municipal</a></li> <div id="tabs">
<li><a href="reports_por_al/{{ query_str }}">Relatórios por Assembléia Legislativa</a></li>
<li><a href="reportsRegiao/">Sumário Região</a></li> <ul>
<li> <!--<li><a href="#tabs-0"> </a></li>-->
<a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink"> <li><a href="#tabs-1">Exportar</a></li>
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} <li><a href="#tabs-2">Resumo por Região</a></li>
</a> <li>
</li> <a style="display: none" href="#tabs-0" /><a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink">
</ul> {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
</a>
</li>
</ul>
<!-- <div id="tabs-0">
</div>-->
<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">
<div>
<ul>
<li><a href="reports_por_cm/{{ query_str }}">Exportar para PDF por Câmara Municipal</a></li>
<li><a href="reports_por_al/{{ query_str }}">Exportar para PDF por Assembléia Legislativa</a></li>
</ul>
</div>
</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>
<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 %} {% endif %}
{% endblock %} {% endblock %}

165
sigi/apps/convenios/templates/convenios/relatorio_por_regiao.html

@ -0,0 +1,165 @@
<html>
<head>
<title>Relatório por Região</title>
<style>
@page {
size: a4;
margin-top: 6.5cm;
margin-left: 1.5cm;
margin-right: 1cm;
margin-bottom: 3.5cm;
@frame top{
-pdf-frame-content: cabecalho;
top: 2cm;
margin-left: 1cm;
margin-right: 1cm;
/*height: 1cm; */
}
/* @frame midle{
-pdf-frame-content: midle;
top: 6cm;
height: 1cm;
margin: 2cm;
}*/
@frame footer {
-pdf-frame-content: footerContent;
bottom: 2cm;
margin-left: 1cm;
margin-right: 1cm;
height: 1cm;
}
}
body{
font-family: 'Helvetica';
font-size: 9pt;
}
#corpo h1{
text-align: center;
}
#cabecalho {
text-align: center;
font-weight: bold;
font-size: 14pt;
}
#cabecalho .item2{
font-size: 13pt;
}
#cabecalho .titulo{
font-size: 14pt;
}
#footerContent {
border-top: black outset;
padding-top: 0.15cm;
}
#footerContent #esquerda{
text-align: left;
}
#footerContent #direita{
text-align: right;
}
.tabela {
padding-top: 0.1cm;
padding-left: 0.1cm;
border: black solid;
width: 2cm;
background-color: #B5B5B5;
}
.tabela caption{
text-align: center;
font-weight: bold;
font-size: 11pt;
}
.tabela th{
background-color: #CFCFCF;
text-align: left;
}
.tabela .conteudo {
background-color: white;/*#E8E8E8;*/
}
.tabela .sumario{
font-weight: bold;
background-color: #CFCFCF;
}
.tabela .aderidas{
/*background-color: #E8E8E8;*/
border: blue solid;
}
.tabela .estado{
background-color: #E8E8E8;
font-weight: bold;
}
</style>
</head>
<body>
<div id="cabecalho">
<table>
<tr>
<td id="imagem1"><img src="../media/images/logo-senado.png" width="80" height="80" alt="Logo Senado"/></td>
<td id="centro" colspan="3">SENADO FEDERAL<br/><span class="item2">SINTER - Secretaria Especial do Interlegis</span></td>
<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>
</div>
<div id="midle">
<table class="tabela" repeat="1">
<caption>{{sumario_regiao.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>
</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>
</tbody>
</table>
</div>
<div id="footerContent">
<table>
<tr>
<td id="esquerda">{{data}} às {{hora}}</td>
<td id="direita">Página <pdf:pagenumber /> </td>
</tr>
</table>
</div>
</body>
</html>

138
sigi/apps/convenios/views.py

@ -1,4 +1,5 @@
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
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 sigi.apps.convenios.models import Convenio
from sigi.apps.convenios.reports import ConvenioReport, \ from sigi.apps.convenios.reports import ConvenioReport, \
@ -6,6 +7,14 @@ from sigi.apps.convenios.reports import ConvenioReport, \
ConvenioPorALReport, \ ConvenioPorALReport, \
ConvenioReportRegiao ConvenioReportRegiao
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.contatos.models import UnidadeFederativa
import ho.pisa as pisa
from django.template import Context, loader
import datetime
def report_por_cm(request, id=None): def report_por_cm(request, id=None):
@ -54,45 +63,110 @@ def report_por_al(request, id=None):
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
class Relatorios(object): class RelatorioRegiao(object):
def __init__(self, regiao, casas, casas_conveniadas): def __init__(self, estado, casas, casas_aderidas, casas_equipadas,casas_nao_equipadas):
self.regiao = regiao self.estado = estado
self.quant_casas = casas self.quant_casas = casas
self.quant_casas_conveniadas = casas_conveniadas self.quant_casas_aderidas = casas_aderidas
if(casas_conveniadas!=0): self.quant_casas_nao_aderidas = (casas - casas_aderidas)
self.porc_casas_conveniadas = float(casas_conveniadas)/float(casas)*100 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: else:
self.porc_casas_conveniadas = 0 self.porc_casas_aderidas = 0
self.porc_casas_nao_aderidas = 0
def reportRegiao(request): 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
REGIAO_CHOICES = ( class RelatorioRegiaoTotal:
('SL', 'Sul'), def __init__(self,regiao,total,total_casas_aderidas,total_casas_equipadas,total_casas_nao_equipadas):
('SD', 'Sudeste'), self.regiao = regiao
('CO', 'Centro-Oeste'), self.total = total
('NE', 'Nordeste'), self.total_casas_aderidas = total_casas_aderidas
('NO', 'Norte'), 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
convenios = Convenio.object.all()
if(total!=0):
regioes = [] self.porc_casas_aderidas = "%.2f" % (float(self.total_casas_aderidas)*100/float(total))
conveniosCO.filter(municipio__uf__regiao='CO') self.porc_casas_nao_aderidas = "%.2f" % (float(self.total_casas_nao_aderidas)*100/float(total))
conveniosNO.filter(municipio__uf__regiao='NO') else:
conveniosNE.filter(municipio__uf__regiao='NE') self.porc_casas_aderidas = 0
conveniosSD.filter(municipio__uf__regiao='SD') self.porc_casas_nao_aderidas = 0
conveniosSL.filter(municipio__uf__regiao='SL')
if(total_casas_aderidas!=0):
for regiao in REGIAO_CHOICES: 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:
self.porc_casas_equipadas = 0
self.porc_casas_nao_equipadas = 0
def report_regiao(request,regiao='NE'):
REGIAO_CHOICES = {
'SL': 'Sul',
'SD': 'Sudeste',
'CO': 'Centro-Oeste',
'NE': 'Nordeste',
'NO': 'Norte',
}
get_list_or_404(UnidadeFederativa,regiao=regiao)
casasSD = CasaLegislativa.objects.filter(municipio__uf__regiao=regiao[0]) # Contando casas por estado
casasConvSD = CasaLegislativa.objects.filter(convenio__casa_legislativa__municipio__uf__regiao=regiao[0]).distinct() estados = get_list_or_404(UnidadeFederativa,regiao=regiao)
relatorio.append(Relatorios(casa[1], casasSD.count(), lista = []
casasConvSD.count())) 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()
)
)
# 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)
data = datetime.datetime.now().strftime('%d/%m/%Y')
hora = datetime.datetime.now().strftime('%H:%M')
pisa.showLogging()
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
relatorio = ConvenioReportRegiao(queryset=relatorio) response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf'
relatorio.generate_by(PDFGenerator, filename=response) t = loader.get_template('convenios/relatorio_por_regiao.html')
c = Context({'lista': lista,'sumario_regiao':sumario_regiao,'data':data,'hora':hora})
pdf = pisa.CreatePDF(t.render(c),response)
if not pdf.err:
pisa.startViewer(response)
return response return response

4
sigi/urls.py

@ -27,8 +27,8 @@ urlpatterns = patterns(
'sigi.apps.convenios.views.report_por_cm'), 'sigi.apps.convenios.views.report_por_cm'),
(r'^convenios/convenio/reports_por_al/', (r'^convenios/convenio/reports_por_al/',
'sigi.apps.convenios.views.report_por_al'), 'sigi.apps.convenios.views.report_por_al'),
(r'^convenios/convenio/reportsRegiao/', (r'^convenios/convenio/reportsRegiao/(?P<regiao>\w+)',
'sigi.apps.convenios.views.reportRegiao'), '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