From 3e14232c7b8440b4e96cc5634023fe3a88b711e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Thu, 13 Jun 2019 18:24:49 -0300 Subject: [PATCH] =?UTF-8?q?Refatora=20relat=C3=B3rio=20completo=20de=20Cas?= =?UTF-8?q?a=20para=20usar=20Pisa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sigi/apps/casas/reports.py | 288 +----------------- .../templates/casas/report_complete_pdf.html | 237 ++++++++++++++ sigi/apps/casas/views.py | 88 +++--- 3 files changed, 278 insertions(+), 335 deletions(-) create mode 100644 sigi/apps/casas/templates/casas/report_complete_pdf.html diff --git a/sigi/apps/casas/reports.py b/sigi/apps/casas/reports.py index 2c7a043..d94a3fa 100644 --- a/sigi/apps/casas/reports.py +++ b/sigi/apps/casas/reports.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- -from django.templatetags.static import static -from django.utils.translation import ugettext as _ from geraldo import Report, DetailBand, Label, ObjectValue, ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH, SystemField from geraldo.graphics import Image + +from django.templatetags.static import static +from django.utils.translation import ugettext as _ from reportlab.lib.enums import TA_CENTER from reportlab.lib.pagesizes import A4 from reportlab.lib.units import cm @@ -238,7 +239,6 @@ class CasasLegislativasReport(ReportDefault): top=label_top, ), - ] class band_page_footer(ReportDefault.band_page_footer): @@ -293,285 +293,3 @@ class CasasLegislativasReport(ReportDefault): class CasasSemConvenioReport(CasasLegislativasReport): title = _(u'Relatório de Casas Legislativas sem Convênio') - - -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 = [ - 0, 1.3, # Tipo - 0, 1.8, # Regiao - 5.5, 6.8, # U.F. - 0, 2.3, # Municipio - 0, 2.4, # Endereco - 0, 1.6, # Bairro - 0, 1.3, # CEP - 0, 1.6, # CNPJ - 0, 2.3, # Telefone - 0, 2.7, # Presidente - ] - posicao_top = [ - 0.5, # Tipo - 1.3, # Regiao - 1.3, # U.F. - 2.1, # Municipio - 2.9, # Logradouro - 3.7, # Bairro - 4.5, # CEP - 5.3, # CNPJ - 6.1, # Telefone - 6.9, # Presidente - ] - - height = 30 * cm - - display_inline = True - default_style = {'fontName': 'Helvetica', 'fontSize': 14} - - elements = [ - - Label( - text=label_text(_(u"Tipo")), - left=posicao_left[0] * cm, - top=posicao_top[0] * cm, - ), - ObjectValue( - attribute_name='tipo.nome', - left=posicao_left[1] * cm, - top=posicao_top[0] * cm, - width=6 * cm, - ), - Label( - text=label_text(_(u"Região")), - left=posicao_left[2] * cm, - top=posicao_top[1] * cm, - ), - ObjectValue( - attribute_name='municipio.uf.regiao', - left=posicao_left[3] * cm, - top=posicao_top[1] * cm, - get_value=lambda instance: - {'SL': _(u'Sul'), 'SD': _(u'Sudeste'), 'CO': _(u'Centro-Oeste'), 'NE': _(u'Nordeste'), 'NO': _(u'Norte'), } - [instance.municipio.uf.regiao] - ), - Label( - text=label_text(_(u"UF")), - left=posicao_left[4] * cm, - top=posicao_top[2] * cm, - ), - ObjectValue( - attribute_name='municipio.uf', - left=posicao_left[5] * cm, - top=posicao_top[2] * cm, - ), - Label( - text=label_text(_(u"Município")), - left=posicao_left[6] * cm, - top=posicao_top[3] * cm, - ), - ObjectValue( - attribute_name='municipio.nome', - left=posicao_left[7] * cm, - top=posicao_top[3] * cm, - width=20 * cm, - ), - # Linha 3 - Label( - text=label_text(_(u"Endereço")), - left=posicao_left[8] * cm, - top=posicao_top[4] * cm, - ), - ObjectValue( - attribute_name='logradouro', - left=posicao_left[9] * cm, - top=posicao_top[4] * cm, - width=20 * cm, - ), - Label( - text=label_text(_(u"Bairro")), - left=posicao_left[10] * cm, - top=posicao_top[5] * cm, - ), - ObjectValue( - attribute_name='bairro', - left=posicao_left[11] * cm, - top=posicao_top[5] * cm, - ), - Label( - text=label_text(_(u"CEP")), - left=posicao_left[12] * cm, - top=posicao_top[6] * cm, - ), - ObjectValue( - attribute_name='cep', - left=posicao_left[13] * cm, - top=posicao_top[6] * cm, - ), - Label( - text=label_text(_(u"CNPJ")), - left=posicao_left[14] * cm, - top=posicao_top[7] * cm, - ), - ObjectValue( - attribute_name='cnpj', - left=posicao_left[15] * cm, - top=posicao_top[7] * cm, - ), - Label( - text=label_text(_(u"Telefone")), - left=posicao_left[16] * cm, - top=posicao_top[8] * cm, - ), - ObjectValue( - attribute_name='telefone', - left=posicao_left[17] * cm, - top=posicao_top[8] * cm, - ), - Label( - text=label_text(_(u"Presidente")), - left=posicao_left[18] * cm, - top=posicao_top[9] * cm, - ), - ObjectValue( - attribute_name='presidente', - left=posicao_left[19] * cm, - top=posicao_top[9] * cm, - width=20 * cm, - ), - ] - # Telefones - tel_top = 2 * cm - tel_left = [0, 3, 5] - # Contato - cont_top = 2 * cm - cont_left = [0, 6, 9] - # Convenios - convenio_top = 2 * cm - convenio_left = [0, 1.8, 4.5, 8, 10.5, 13, 15.5, 18] - subreports = [ - # Telefones - SubReport( - queryset_string='%(object)s.telefones.all()', - band_header=ReportBand( - default_style={'fontName': 'Helvetica', 'fontSize': 12}, - height=2.5 * cm, - elements=[ - Label( - text=_(u"Telefone(s)"), - style={'fontSize': 14, 'alignment': TA_CENTER}, - width=BAND_WIDTH, - top=1 * cm, - ), - Label(text=_(u"Número"), left=tel_left[0] * cm, top=tel_top), - Label(text=_(u"Tipo"), left=tel_left[1] * cm, top=tel_top), - Label(text=_(u"Nota"), left=tel_left[2] * cm, top=tel_top), - ], - borders={'bottom': True}, - ), - band_detail=ReportBand( - default_style={'fontName': 'Helvetica', 'fontSize': 11}, - height=0.5 * cm, - elements=[ - ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm), - ObjectValue(attribute_name='tipo', left=tel_left[1] * cm, - get_value=lambda instance: - {'F': _(u'Fixo'), 'M': _(u'Móvel'), 'X': _(u'Fax'), 'I': _(u'Indefinido')}[instance.tipo], - ), - ObjectValue(attribute_name='nota', left=tel_left[2] * cm), - ], - #borders = {'all':True}, - ), - ), - # Contatos - SubReport( - queryset_string='%(object)s.funcionario_set.all()', - band_header=ReportBand( - default_style={'fontName': 'Helvetica', 'fontSize': 12}, - height=2.5 * cm, - elements=[ - Label( - text=_(u"Contato(s)"), - style={'fontSize': 14, 'alignment': TA_CENTER}, - width=BAND_WIDTH, - top=1 * cm, - ), - Label(text=_(u"Nome"), left=cont_left[0] * cm, top=cont_top), - Label(text=_(u"Nota"), left=cont_left[1] * cm, top=cont_top), - Label(text=_(u"E-mail"), left=cont_left[2] * cm, top=cont_top), - ], - borders={'bottom': True, 'top': True}, - ), - band_detail=ReportBand( - default_style={'fontName': 'Helvetica', 'fontSize': 11}, - height=0.5 * cm, - elements=[ - ObjectValue(attribute_name='nome', left=cont_left[0] * cm), - ObjectValue(attribute_name='nota', left=cont_left[1] * cm), - ObjectValue(attribute_name='email', left=cont_left[2] * cm), - ], - #borders = {'all':True}, - ), - ), - # Convenios - SubReport( - queryset_string='%(object)s.convenio_set.all()', - band_header=ReportBand( - default_style={'fontName': 'Helvetica', 'fontSize': 12}, - height=2.5 * cm, - elements=[ - Label( - text=_(u"Convênio(s)"), - style={'fontSize': 14, 'alignment': TA_CENTER}, - width=BAND_WIDTH, - top=1 * cm, - ), - Label(text=_(u"Projeto"), left=convenio_left[0] * cm, top=convenio_top), - Label(text=_(u"Nº Convenio"), left=convenio_left[1] * cm, top=convenio_top), - Label(text=_(u"Nº Processo SF"), left=convenio_left[2] * cm, top=convenio_top), - Label(text=_(u"Adesão"), left=convenio_left[3] * cm, top=convenio_top), - Label(text=_(u"Convênio"), left=convenio_left[4] * cm, top=convenio_top), - Label(text=_(u"Equipada"), left=convenio_left[5] * cm, top=convenio_top), - Label(text=_(u"Data D.O."), left=convenio_left[6] * cm, top=convenio_top), - ], - borders={'bottom': True} - ), - band_detail=ReportBand( - default_style={'fontName': 'Helvetica', 'fontSize': 11}, - height=0.5 * cm, - elements=[ - ObjectValue(attribute_name='projeto.sigla', left=convenio_left[0] * cm), - ObjectValue(attribute_name='num_convenio', left=convenio_left[1] * cm), - ObjectValue(attribute_name='num_processo_sf', left=convenio_left[2] * cm), - ObjectValue(attribute_name='data_adesao', left=convenio_left[3] * cm, - get_value=lambda instance: - instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao is not None else '-' - ), - ObjectValue(attribute_name='data_retorno_assinatura', left=convenio_left[4] * cm, - get_value=lambda instance: - instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura is not None else '-' - ), - ObjectValue(attribute_name='data_termo_aceite', left=convenio_left[5] * cm, - get_value=lambda instance: - instance.data_termo_aceite.strftime('%d/%m/%Y') if instance.data_termo_aceite is not None else '-' - ), - ObjectValue(attribute_name='data_pub_diario', left=convenio_left[6] * cm, - get_value=lambda instance: - instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario is not None else '-' - ), - ], - #borders = {'all':True}, - ), - ) - ] diff --git a/sigi/apps/casas/templates/casas/report_complete_pdf.html b/sigi/apps/casas/templates/casas/report_complete_pdf.html new file mode 100644 index 0000000..284dfa0 --- /dev/null +++ b/sigi/apps/casas/templates/casas/report_complete_pdf.html @@ -0,0 +1,237 @@ +{% load smart_if %} +{% load static from staticfiles %} +{% load i18n %} + + + + + Casa Legislativa + + + + + + {% for casa in casas %} +
+

{{ casa.nome }}

+ + + + + + + + + + + +
{% trans 'Presidente:' %}{{ casa.presidente }}
{% trans 'Tipo:' %}{{ casa.tipo.nome }}
{% trans 'Estado / região:' %}{{ casa.municipio.uf.nome }} / {{ casa.municipio.uf.get_regiao_display }}
{% trans 'Município:' %}{{ casa.municipio.nome }}
{% trans 'Endereço:' %}{{ casa.logradouro }}
{% trans 'Bairro:' %}{{ casa.bairro }}
{% trans 'CEP:' %}{{ casa.cep }}
{% trans 'CNPJ:' %}{{ casa.cnpj }}
{% trans 'Telefone:' %}{{ casa.telefone }}
{% trans 'E-mail:' %}{{ casa.email }}
+ +

Telefones

+ + + + + + + + + + {% for tel in casa.telefones.all %} + + + + + + {% endfor %} +
NúmeroTipoNota
{{ tel.numero }}{{ tel.get_tipo_display }}{{ tel.nota }}
+ +

Pessoas de contato

+ + + + + + + + + + + {% for func in casa.funcionario_set.all %} + + + + + + + {% endfor %} +
NomeE-mailSetorNotas
{{ func.nome }}{{ func.email }}{{ func.get_setor_display }}{{ func.nota }}
+ +

Convênios

+ + + + + + + + + + + + + + {% for conv in casa.convenio_set.all %} + + + + + + + + + + {% endfor %} +
ProjetoNº convênioNº processo SFAdesãoConvênioEquipadaPublicada
{{ conv.projeto.nome }}{{ conv.num_convenio|default_if_none:"-" }}{{ conv.num_processo_sf|default_if_none:"-" }}{{ conv.data_adesao|date:"SHORT_DATE_FORMAT" }}{{ conv.data_retorno_assinatura|date:"SHORT_DATE_FORMAT" }}{{ conv.equipada|yesno }}{{ conv.data_pub_diario|date:"SHORT_DATE_FORMAT" }}
+ +

Serviços Interlegis

+ + + + + + + + + + + {% for srv in casa.servico_set.all %} + + + + + + + {% endfor %} +
ServiçoEndereçoAtivado emDesativado em
{{ srv.tipo_servico.nome }}{{ srv.url|default_if_none:"-" }}{{ srv.data_ativacao|date:"SHORT_DATE_FORMAT" }}{{ srv.data_desativacao|date:"SHORT_DATE_FORMAT" }}
+ + +
+ {% endfor %} + + + + diff --git a/sigi/apps/casas/views.py b/sigi/apps/casas/views.py index d8cea61..97f5cdb 100644 --- a/sigi/apps/casas/views.py +++ b/sigi/apps/casas/views.py @@ -1,30 +1,31 @@ # -*- coding: utf-8 -*- import csv from functools import reduce +from geraldo.generators import PDFGenerator +from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator, InvalidPage, EmptyPage -from django.http import HttpResponse, HttpResponseRedirect, Http404 +from django.db.models import Count, Q +from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render, get_object_or_404 from django.utils.translation import ugettext as _, ungettext -from geraldo.generators import PDFGenerator +from sigi.apps.casas.forms import PortfolioForm from sigi.apps.casas.models import CasaLegislativa -from sigi.apps.casas.reports import CasasLegislativasLabels, CasasLegislativasLabelsSemPresidente, CasasLegislativasReport, CasasSemConvenioReport, InfoCasaLegislativa -from sigi.apps.parlamentares.reports import ParlamentaresLabels +from sigi.apps.casas.reports import (CasasLegislativasLabels, + CasasLegislativasLabelsSemPresidente, + CasasLegislativasReport, + CasasSemConvenioReport) from sigi.apps.contatos.models import UnidadeFederativa, Mesorregiao, Microrregiao -from sigi.apps.casas.forms import PortfolioForm -from django.contrib.auth.decorators import login_required +from sigi.apps.ocorrencias.models import Ocorrencia +from sigi.apps.parlamentares.reports import ParlamentaresLabels from sigi.apps.servicos.models import TipoServico from sigi.apps.servidores.models import Servidor -from sigi.apps.ocorrencias.models import Ocorrencia -from django.db.models import Count, Q -from django.http.response import JsonResponse +from sigi.shortcuts import render_to_pdf # @param qs: queryset # @param o: (int) number of order field - - def query_ordena(qs, o): from sigi.apps.casas.admin import CasaLegislativaAdmin list_display = CasaLegislativaAdmin.list_display @@ -85,6 +86,7 @@ def adicionar_casas_carrinho(request, queryset=None, id=None): lista.append(id) request.session['carrinho_casas'] = lista + @login_required def visualizar_carrinho(request): @@ -117,12 +119,14 @@ def visualizar_carrinho(request): } ) + @login_required def excluir_carrinho(request): if 'carrinho_casas' in request.session: del request.session['carrinho_casas'] return HttpResponseRedirect('.') + @login_required def deleta_itens_carrinho(request): if request.method == 'POST': @@ -139,6 +143,7 @@ def deleta_itens_carrinho(request): return HttpResponseRedirect('.') + @login_required def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'): """ TODO: adicionar suporte para resultado de pesquisa do admin. @@ -168,6 +173,7 @@ def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'): return response + @login_required def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'): """ TODO: adicionar suporte para resultado de pesquisa do admin. @@ -216,6 +222,7 @@ def carrinhoOrGet_for_parlamentar_qs(request): qs = get_for_qs(request.GET, qs) return qs + @login_required def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'): """ TODO: adicionar suporte para resultado de pesquisa do admin. @@ -236,6 +243,7 @@ def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'): return response + @login_required def report(request, id=None, tipo=None): @@ -261,6 +269,7 @@ def report(request, id=None, tipo=None): report.generate_by(PDFGenerator, filename=response) return response + @login_required def report_complete(request, id=None): @@ -271,33 +280,9 @@ def report_complete(request, id=None): if not qs: return HttpResponseRedirect('../') + + return render_to_pdf('casas/report_complete_pdf.html', {'casas': qs}) - response = HttpResponse(content_type='application/pdf') - response['Content-Disposition'] = 'attachment; filename=casas.pdf' - - # Gera um relatorio para cada casa e concatena os relatorios - cont = 0 - canvas = None - quant = qs.count() - if quant > 1: - for i in qs: - cont += 1 - # queryset deve ser uma lista - lista = (i,) - if cont == 1: - report = InfoCasaLegislativa(queryset=lista) - canvas = report.generate_by(PDFGenerator, return_canvas=True, filename=response,) - else: - report = InfoCasaLegislativa(queryset=lista) - if cont == quant: - report.generate_by(PDFGenerator, canvas=canvas) - else: - canvas = report.generate_by(PDFGenerator, canvas=canvas, return_canvas=True) - else: - report = InfoCasaLegislativa(queryset=qs) - report.generate_by(PDFGenerator, filename=response) - - return response @login_required def casas_sem_convenio_report(request): @@ -313,6 +298,7 @@ def casas_sem_convenio_report(request): report.generate_by(PDFGenerator, filename=response) return response + @login_required def export_csv(request): response = HttpResponse(content_type='text/csv') @@ -392,6 +378,7 @@ def export_csv(request): return response + @login_required def portfolio(request): page = request.GET.get('page', 1) @@ -426,7 +413,7 @@ def portfolio(request): data['mesorregioes'] = uf.mesorregiao_set.all() data['microrregioes'] = mesorregiao.microrregiao_set.all() data['form'] = PortfolioForm(_(u'Atribuir casas da microrregiao %s para') % (unicode(microrregiao),)) - data['querystring'] = 'micro=%s' % (microrregiao.pk,) + data['querystring'] = 'micro=%s' % (microrregiao.pk,) casas = CasaLegislativa.objects.filter(municipio__microrregiao=microrregiao) elif meso_id: mesorregiao = get_object_or_404(Mesorregiao, pk=meso_id) @@ -438,7 +425,7 @@ def portfolio(request): data['mesorregioes'] = uf.mesorregiao_set.all() data['microrregioes'] = mesorregiao.microrregiao_set.all() data['form'] = PortfolioForm(_(u'Atribuir casas da mesorregiao %s para') % (unicode(mesorregiao),)) - data['querystring'] = 'meso=%s' % (mesorregiao.pk,) + data['querystring'] = 'meso=%s' % (mesorregiao.pk,) casas = CasaLegislativa.objects.filter(municipio__microrregiao__mesorregiao=mesorregiao) elif uf_id: uf = get_object_or_404(UnidadeFederativa, pk=uf_id) @@ -447,13 +434,13 @@ def portfolio(request): data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao) data['mesorregioes'] = uf.mesorregiao_set.all() data['form'] = PortfolioForm(_(u'Atribuir casas do estado %s para') % (unicode(uf),)) - data['querystring'] = 'uf=%s' % (uf.pk,) + data['querystring'] = 'uf=%s' % (uf.pk,) casas = CasaLegislativa.objects.filter(municipio__uf=uf) elif regiao: data['regiao'] = regiao data['ufs'] = UnidadeFederativa.objects.filter(regiao=regiao) - data['form'] = PortfolioForm(_(u'Atribuir casas da região %s para') % [x[1] for x in UnidadeFederativa.REGIAO_CHOICES if x[0]==regiao][0]) - data['querystring'] = 'regiao=%s' % (regiao,) + data['form'] = PortfolioForm(_(u'Atribuir casas da região %s para') % [x[1] for x in UnidadeFederativa.REGIAO_CHOICES if x[0] == regiao][0]) + data['querystring'] = 'regiao=%s' % (regiao,) casas = CasaLegislativa.objects.filter(municipio__uf__regiao=regiao) if casas: @@ -536,12 +523,12 @@ def resumo_carteira(casas): resumo.append([_(u"Casas em sua carteira"), total['total']] + [total[r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) resumo.append({'subtitle': _(u"Uso dos produtos Interlegis")}) resumo.append([_(u"Casas sem nenhum produto"), sem_produto['total']] + [sem_produto[r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) - resumo.extend([[ts.nome, dados[ts.id]['total']]+[dados[ts.id][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES] for ts in tipos_servico]) + resumo.extend([[ts.nome, dados[ts.id]['total']] + [dados[ts.id][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES] for ts in tipos_servico]) resumo.append({'subtitle': _(u"Registros no sistema de ocorrências")}) - resumo.append([_(u"Casas que nunca registraram ocorrências"), dados_ocorrencia['sem']['total']]+[dados_ocorrencia['sem'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) - resumo.append([_(u"Total de ocorrências registradas"), dados_ocorrencia['registradas']['total']]+[dados_ocorrencia['registradas'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) - resumo.append([_(u"Total de ocorrências pendentes"), dados_ocorrencia['pendentes']['total']]+[dados_ocorrencia['pendentes'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) - resumo.append([_(u"Média de ocorrências por casa"), round(dados_ocorrencia['media']['total'],2)]+[round(dados_ocorrencia['media'][r[0]],2) for r in UnidadeFederativa.REGIAO_CHOICES]) + resumo.append([_(u"Casas que nunca registraram ocorrências"), dados_ocorrencia['sem']['total']] + [dados_ocorrencia['sem'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) + resumo.append([_(u"Total de ocorrências registradas"), dados_ocorrencia['registradas']['total']] + [dados_ocorrencia['registradas'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) + resumo.append([_(u"Total de ocorrências pendentes"), dados_ocorrencia['pendentes']['total']] + [dados_ocorrencia['pendentes'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) + resumo.append([_(u"Média de ocorrências por casa"), round(dados_ocorrencia['media']['total'], 2)] + [round(dados_ocorrencia['media'][r[0]], 2) for r in UnidadeFederativa.REGIAO_CHOICES]) return resumo @@ -594,7 +581,7 @@ def casas_carteira(request, casas, context): else: casas = casas.filter(servico__tipo_servico__sigla__in=servicos) casas = casas.distinct('nome', 'municipio__uf') - context['qs_servico'] = "&".join(['servico=%s' %s for s in servicos]) + context['qs_servico'] = "&".join(['servico=%s' % s for s in servicos]) context['servicos_check'] = servicos @@ -602,6 +589,7 @@ def casas_carteira(request, casas, context): return casas, context + @login_required def painel_relacionamento(request): page = request.GET.get('page', 1) @@ -634,7 +622,7 @@ def painel_relacionamento(request): 'servicos': tipos_servico, 'gerentes': Servidor.objects.exclude(casas_que_gerencia=None), 'gerente': gerente, - 'qs_servidor': ('servidor=%s' % gerente.pk) if gerente else '', + 'qs_servidor': ('servidor=%s' % gerente.pk) if gerente else '', } if snippet != 'lista': @@ -678,4 +666,4 @@ def painel_relacionamento(request): if snippet == 'resumo': return render(request, 'casas/resumo_carteira_snippet.html', context) - return render(request, 'casas/painel.html', context) \ No newline at end of file + return render(request, 'casas/painel.html', context)