mirror of https://github.com/interlegis/sigi.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
374 lines
13 KiB
374 lines
13 KiB
#-*- coding:utf-8 -*-
|
|
import csv
|
|
|
|
import datetime
|
|
import ho.pisa as pisa
|
|
from django.conf import settings
|
|
from django.core.paginator import Paginator, InvalidPage, EmptyPage
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
|
from django.shortcuts import render, get_list_or_404
|
|
from django.template import Context, loader
|
|
from django.utils.translation import ugettext as _
|
|
from geraldo.generators import PDFGenerator
|
|
|
|
from sigi.apps.casas.models import Orgao
|
|
from sigi.apps.contatos.models import UnidadeFederativa
|
|
from sigi.apps.convenios.models import Convenio, Projeto
|
|
from sigi.apps.convenios.reports import (ConvenioReport,
|
|
ConvenioReportSemAceite,
|
|
ConvenioPorCMReport,
|
|
ConvenioPorALReport,
|
|
ConvenioReportSemAceiteAL,
|
|
ConvenioReportSemAceiteCM)
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
|
|
def query_ordena(qs, o, ot):
|
|
list_display = ('num_convenio', 'casa_legislativa',
|
|
'data_adesao', 'data_retorno_assinatura', 'data_termo_aceite',
|
|
'projeto',
|
|
)
|
|
|
|
aux = list_display[(int(o) - 1)]
|
|
if ot == 'asc':
|
|
qs = qs.order_by(aux)
|
|
else:
|
|
qs = qs.order_by("-" + aux)
|
|
return qs
|
|
|
|
def normaliza_data(get, nome_param):
|
|
import re
|
|
if nome_param in get:
|
|
value = get.get(nome_param, '')
|
|
if value == '':
|
|
del get[nome_param]
|
|
elif re.match('^\d*$', value): # Year only
|
|
# Complete with january 1st
|
|
get[nome_param] = "%s-01-01" % value
|
|
elif re.match('^\d*\D\d*$', value): # Year and month
|
|
# Complete with 1st day of month
|
|
get[nome_param] = '%s-01' % value
|
|
|
|
def get_for_qs(get, qs):
|
|
kwargs = {}
|
|
ids = 0
|
|
get._mutable = True
|
|
normaliza_data(get, 'data_retorno_assinatura__gte')
|
|
normaliza_data(get, 'data_retorno_assinatura__lte')
|
|
normaliza_data(get, 'data_sigad__gte')
|
|
normaliza_data(get, 'data_sigad__lte')
|
|
normaliza_data(get, 'data_sigi__gte')
|
|
normaliza_data(get, 'data_sigi__lte')
|
|
normaliza_data(get, 'data_solicitacao__gte')
|
|
normaliza_data(get, 'data_solicitacao__lte')
|
|
get._mutable = False
|
|
for k, v in get.iteritems():
|
|
if k not in ['page', 'pop', 'q', '_popup']:
|
|
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 carrinhoOrGet_for_qs(request):
|
|
"""
|
|
Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente.
|
|
"""
|
|
if 'carrinho_convenios' in request.session:
|
|
ids = request.session['carrinho_convenios']
|
|
qs = Convenio.objects.filter(pk__in=ids)
|
|
qs = qs.order_by("casa_legislativa__municipio__uf", "casa_legislativa__municipio")
|
|
qs = get_for_qs(request.GET, qs)
|
|
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 adicionar_convenios_carrinho(request, queryset=None, id=None):
|
|
if request.method == 'POST':
|
|
ids_selecionados = request.POST.getlist('_selected_action')
|
|
if 'carrinho_convenios' not in request.session:
|
|
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 id not in lista:
|
|
lista.append(id)
|
|
request.session['carrinho_convenios'] = lista
|
|
|
|
@login_required
|
|
def excluir_carrinho(request):
|
|
if 'carrinho_convenios' in request.session:
|
|
del request.session['carrinho_convenios']
|
|
return HttpResponseRedirect('.')
|
|
|
|
@login_required
|
|
def deleta_itens_carrinho(request):
|
|
if request.method == 'POST':
|
|
ids_selecionados = request.POST.getlist('_selected_action')
|
|
if 'carrinho_convenios' in request.session:
|
|
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('.')
|
|
|
|
@login_required
|
|
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('carrinho_convenios' in request.session)
|
|
|
|
return render(
|
|
request,
|
|
'convenios/carrinho.html',
|
|
{
|
|
'carIsEmpty': carrinhoIsEmpty,
|
|
'paginas': paginas,
|
|
'query_str': '?' + request.META['QUERY_STRING']
|
|
}
|
|
)
|
|
|
|
@login_required
|
|
def report(request, id=None):
|
|
|
|
if id:
|
|
qs = Convenio.objects.filter(pk=id)
|
|
else:
|
|
qs = carrinhoOrGet_for_qs(request)
|
|
|
|
if not qs:
|
|
return HttpResponseRedirect('../')
|
|
|
|
tipo = ''
|
|
data_aceite_has = ''
|
|
report = None
|
|
if request.POST:
|
|
if 'filtro_casa' in request.POST:
|
|
tipo = request.POST['filtro_casa']
|
|
if 'data_aceite' in request.POST:
|
|
data_aceite_has = request.POST['data_aceite']
|
|
# filtro adicional pela seleção do usuário
|
|
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)
|
|
elif tipo == 'cm':
|
|
qs = qs.filter(casa_legislativa__tipo__sigla='CM')
|
|
if data_aceite_has == 'nao':
|
|
report = ConvenioReportSemAceiteCM(queryset=qs)
|
|
else:
|
|
report = ConvenioPorCMReport(queryset=qs)
|
|
else:
|
|
if data_aceite_has == 'nao':
|
|
report = ConvenioReportSemAceite(queryset=qs)
|
|
else:
|
|
report = ConvenioReport(queryset=qs)
|
|
|
|
response = HttpResponse(content_type='application/pdf')
|
|
if report:
|
|
report.generate_by(PDFGenerator, filename=response)
|
|
else:
|
|
return HttpResponseRedirect('../')
|
|
return response
|
|
|
|
|
|
def casas_estado_to_tabela(casas, convenios, regiao):
|
|
|
|
estados = get_list_or_404(UnidadeFederativa, regiao=regiao)
|
|
|
|
class LinhaEstado():
|
|
pass
|
|
|
|
lista = []
|
|
|
|
for estado in estados:
|
|
linha = LinhaEstado()
|
|
|
|
convenios_est = convenios.filter(casa_legislativa__municipio__uf=estado)
|
|
convenios_est_publicados = convenios_est.exclude(data_pub_diario=None)
|
|
convenios_est_equipados = convenios_est.exclude(data_termo_aceite=None)
|
|
|
|
casas_est = casas.filter(municipio__uf=estado)
|
|
casas_est_nao_aderidas = casas_est.exclude(convenio__in=convenios_est).distinct()
|
|
casas_est_aderidas = casas_est.filter(convenio__in=convenios_est).distinct()
|
|
casas_est_conveniadas = casas_est.filter(convenio__in=convenios_est_publicados).distinct()
|
|
casas_est_equipadas = casas_est.filter(convenio__in=convenios_est_equipados).distinct()
|
|
|
|
linha.lista = (
|
|
casas_est.count(),
|
|
casas_est_nao_aderidas.count(),
|
|
casas_est_aderidas.count(),
|
|
casas_est_conveniadas.count(),
|
|
casas_est_equipadas.count(),
|
|
)
|
|
|
|
linha.estado = estado
|
|
|
|
lista.append(linha)
|
|
|
|
casas_regiao = casas.filter(municipio__uf__regiao=regiao)
|
|
convenios_regiao = convenios.filter(casa_legislativa__municipio__uf__regiao=regiao)
|
|
convenios_regiao_publicados = convenios_regiao.exclude(data_pub_diario=None)
|
|
convenios_regiao_equipados = convenios_regiao.exclude(data_termo_aceite=None)
|
|
sumario = (
|
|
casas_regiao.count(),
|
|
casas_regiao.exclude(convenio__in=convenios_regiao).distinct().count(),
|
|
casas_regiao.filter(convenio__in=convenios_regiao).distinct().count(),
|
|
casas_regiao.filter(convenio__in=convenios_regiao_publicados).distinct().count(),
|
|
casas_regiao.filter(convenio__in=convenios_regiao_equipados).distinct().count(),
|
|
)
|
|
|
|
cabecalho_topo = (
|
|
_(u'UF'),
|
|
_(u'Câmaras municipais'),
|
|
_(u'Não Aderidas'),
|
|
_(u'Aderidas'),
|
|
_(u'Conveniadas'),
|
|
_(u'Equipadas')
|
|
)
|
|
|
|
return {
|
|
"linhas": lista,
|
|
"cabecalho": cabecalho_topo,
|
|
"sumario": sumario,
|
|
}
|
|
|
|
@login_required
|
|
def report_regiao(request, regiao='NE'):
|
|
|
|
if request.POST:
|
|
if 'regiao' in request.POST:
|
|
regiao = request.POST['regiao']
|
|
|
|
REGIAO_CHOICES = dict(UnidadeFederativa.REGIAO_CHOICES)
|
|
|
|
projetos = Projeto.objects.all()
|
|
|
|
camaras = Orgao.objects.filter(tipo__sigla='CM')
|
|
|
|
tabelas = list()
|
|
# Geral
|
|
convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM')
|
|
tabela = casas_estado_to_tabela(camaras, convenios, regiao)
|
|
tabela["projeto"] = _(u"Geral")
|
|
|
|
tabelas.append(tabela)
|
|
|
|
for projeto in projetos:
|
|
convenios_proj = convenios.filter(projeto=projeto)
|
|
tabela = casas_estado_to_tabela(camaras, convenios_proj, regiao)
|
|
tabela["projeto"] = projeto.nome
|
|
tabelas.append(tabela)
|
|
|
|
data = datetime.datetime.now().strftime('%d/%m/%Y')
|
|
hora = datetime.datetime.now().strftime('%H:%M')
|
|
pisa.showLogging()
|
|
response = HttpResponse(content_type='application/pdf')
|
|
response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf'
|
|
#tabelas = ({'projeto':"PI"},{'projeto':"PML"},)
|
|
t = loader.get_template('convenios/tabela_regiao.html')
|
|
c = Context({'tabelas': tabelas, 'regiao': REGIAO_CHOICES[regiao], 'data': data, 'hora': hora})
|
|
pdf = pisa.CreatePDF(t.render(c), response)
|
|
if not pdf.err:
|
|
pisa.startViewer(response)
|
|
|
|
return response
|
|
|
|
@login_required
|
|
def export_csv(request):
|
|
response = HttpResponse(content_type='text/csv')
|
|
response['Content-Disposition'] = 'attachment; filename=convenios.csv'
|
|
|
|
csv_writer = csv.writer(response)
|
|
convenios = carrinhoOrGet_for_qs(request)
|
|
if not convenios:
|
|
return HttpResponseRedirect('../')
|
|
|
|
atributos = [_(u"No. Processo"), _(u"No. Convênio"), _(u"Projeto"), _(u"Casa Legislativa"), _(u"Data de Adesão"), _(u"Data de Convênio"),
|
|
_(u"Data da Publicacao no D.O."), _(u"Data Equipada"), ]
|
|
|
|
if request.POST:
|
|
atributos = request.POST.getlist("itens_csv_selected")
|
|
|
|
col_titles = atributos
|
|
if _(u"Casa Legislativa") in col_titles:
|
|
pos = col_titles.index(_(u"Casa Legislativa")) + 1
|
|
col_titles.insert(pos, _(u"uf"))
|
|
csv_writer.writerow([s.encode("utf-8") for s in col_titles])
|
|
|
|
for convenio in convenios:
|
|
lista = []
|
|
for atributo in atributos:
|
|
if _(u"No. Processo") == atributo:
|
|
lista.append(convenio.num_processo_sf.encode("utf-8"))
|
|
elif _(u"No. Convênio") == atributo:
|
|
lista.append(convenio.num_convenio.encode("utf-8"))
|
|
elif _(u"Projeto") == atributo:
|
|
lista.append(convenio.projeto.nome.encode("utf-8"))
|
|
elif _(u"Casa Legislativa") == atributo:
|
|
lista.append(convenio.casa_legislativa.nome.encode("utf-8"))
|
|
lista.append(convenio.casa_legislativa.municipio.uf.sigla.encode("utf-8"))
|
|
elif _(u"Data de Adesão") == atributo:
|
|
data = ''
|
|
if convenio.data_adesao:
|
|
data = convenio.data_adesao.strftime("%d/%m/%Y")
|
|
lista.append(data.encode("utf-8"))
|
|
elif _(u"Data de Convênio") == atributo:
|
|
data = ''
|
|
if convenio.data_retorno_assinatura:
|
|
data = convenio.data_retorno_assinatura.strftime("%d/%m/%Y")
|
|
lista.append(data.encode("utf-8"))
|
|
elif _(u"Data da Publicacao no D.O.") == atributo:
|
|
data = ''
|
|
if convenio.data_pub_diario:
|
|
data = convenio.data_pub_diario.strftime("%d/%m/%Y")
|
|
lista.append(data.encode("utf-8"))
|
|
data = ''
|
|
elif _(u"Data Equipada") == atributo:
|
|
if convenio.data_termo_aceite:
|
|
data = convenio.data_termo_aceite.strftime("%d/%m/%Y")
|
|
lista.append(data.encode("utf-8"))
|
|
else:
|
|
pass
|
|
|
|
csv_writer.writerow(lista)
|
|
|
|
return response
|
|
|