Sistema de Informações Gerenciais do Interlegis
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.
 
 
 
 
 

388 lines
14 KiB

#-*- coding:utf-8 -*-
import csv
import datetime
from django.http.response import HttpResponseForbidden
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, Gescon, 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
@login_required
def importar_gescon(request):
if not request.user.is_superuser:
return HttpResponseForbidden()
action = request.GET.get('action', "")
gescon = Gescon.load()
if action == 'importar':
gescon.importa_contratos()
return render(request, "convenios/importar_gescon.html", {'gescon': gescon})