from datetime import datetime as dt
import html
import logging
import re
import tempfile
from django.core.exceptions import ObjectDoesNotExist
from django.http import Http404, HttpResponse
from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.html import strip_tags
from django.utils.translation import ugettext_lazy as _
import unidecode
from weasyprint import HTML, CSS
from sapl.base.models import Autor, CasaLegislativa, AppConfig as SaplAppConfig
from sapl.comissoes.models import Comissao
from sapl.materia.models import (Autoria, MateriaLegislativa, Numeracao,
Tramitacao, UnidadeTramitacao, ConfigEtiquetaMateriaLegislativa)
from sapl.parlamentares.models import CargoMesa, Filiacao, Parlamentar
from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo,
TramitacaoAdministrativo)
from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao,
IntegranteMesa, JustificativaAusencia,
Orador, OradorExpediente,
OrdemDia, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, OcorrenciaSessao,
RegistroVotacao, VotoParlamentar, OradorOrdemDia,
ConsideracoesFinais, TipoExpediente, ResumoOrdenacao)
from sapl.sessao.views import (get_identificacao_basica, get_mesa_diretora,
get_presenca_sessao, get_expedientes,
get_materias_expediente, get_oradores_expediente,
get_presenca_ordem_do_dia, get_materias_ordem_do_dia,
get_oradores_ordemdia,
get_oradores_explicacoes_pessoais, get_consideracoes_finais,
get_ocorrencias_da_sessao, get_assinaturas,
get_correspondencias)
from sapl.settings import MEDIA_URL
from sapl.settings import STATIC_ROOT
from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data, create_barcode
from .templates import (pdf_capa_processo_gerar,
pdf_documento_administrativo_gerar, pdf_espelho_gerar,
pdf_etiqueta_protocolo_gerar, pdf_materia_gerar,
pdf_ordem_dia_gerar, pdf_pauta_sessao_gerar,
pdf_protocolo_gerar, pdf_sessao_plenaria_gerar)
def get_kwargs_params(request, fields):
kwargs = {}
for i in fields:
if '__icontains' in i:
x = i[:-11] # remove '__icontains'
else:
x = i
if x in request.GET:
kwargs[i] = request.GET[x]
return kwargs
def get_cabecalho(casa):
cabecalho = {}
cabecalho["nom_casa"] = casa.nome
uf_dict = dict(LISTA_DE_UFS)
# FIXME i18n
cabecalho["nom_estado"] = "Estado de " + uf_dict[casa.uf.upper()]
return cabecalho
def get_imagem(casa):
if casa.logotipo:
return casa.logotipo.path
return STATIC_ROOT + '/img/brasao_transp.gif'
def get_rodape(casa):
if len(casa.cep) == 8:
cep = casa.cep[:4] + "-" + casa.cep[5:]
else:
cep = ""
linha1 = casa.endereco
if cep:
if casa.endereco:
linha1 = linha1 + " - "
linha1 = linha1 + str(_("CEP ")) + cep
# substituindo nom_localidade por municipio e sgl_uf por uf
if casa.municipio:
linha1 = linha1 + " - " + casa.municipio + " " + casa.uf
if casa.telefone:
linha1 = linha1 + str(_(" Tel.: ")) + casa.telefone
if casa.endereco_web:
linha2 = casa.endereco_web
else:
linha2 = ""
if casa.email:
if casa.endereco_web:
linha2 = linha2 + " - "
linha2 = linha2 + str(_("E-mail: ")) + casa.email
data_emissao = dt.strftime(timezone.now(), "%d/%m/%Y")
return [linha1, linha2, data_emissao]
def get_materias(mats):
materias = []
for materia in mats:
dic = {}
dic['titulo'] = materia.tipo.sigla + " " + materia.tipo.descricao \
+ " " + str(materia.numero) + "/" + str(materia.ano)
dic['txt_ementa'] = materia.ementa
dic['nom_autor'] = ', '.join(
[str(autor) for autor in materia.autores.all()])
des_status = ''
txt_tramitacao = ''
dic['localizacao_atual'] = " "
tramitacoes = Tramitacao.objects.filter(
unidade_tramitacao_destino__isnull=True).order_by(
'-data_tramitacao', '-id')
for tramitacao in tramitacoes:
des_status = tramitacao.status.descricao
txt_tramitacao = tramitacao.texto
# for tramitacao in context.zsql
# .tramitacao_obter_zsql(cod_materia
# =materia.cod_materia,ind_ult_tramitacao=1):
# if tramitacao.cod_unid_tram_dest:
# cod_unid_tram = tramitacao.cod_unid_tram_dest
# else:
# cod_unid_tram = tramitacao.cod_unid_tram_local
# for unidade_tramitacao in
# context.zsql
# .unidade_tramitacao_obter_zsql(
# cod_unid_tramitacao = cod_unid_tram):
# if unidade_tramitacao.cod_orgao:
# dic['localizacao_atual']=unidade_tramitacao.nom_orgao
# else:
# dic['localizacao_atual']=unidade_tramitacao.nom_comissao
# des_status=tramitacao.des_status
# txt_tramitacao=tramitacao.txt_tramitacao
dic['des_situacao'] = des_status
dic['ultima_acao'] = txt_tramitacao
dic['norma_vinculada'] = " "
# for norma_vinculada in context.zsql
# .materia_buscar_norma_juridica_zsql(cod_materia=materia.cod_materia):
# dic['norma_vinculada']=
# norma_vinculada.des_norma+" "
# +str(norma_vinculada.num_norma)+"/"+str(norma_vinculada.ano_norma)
materias.append(dic)
return materias
def relatorio_materia(request):
'''
pdf_materia_gerar.py
'''
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = (
'inline; filename="relatorio_materia.pdf"')
casa = CasaLegislativa.objects.first()
cabecalho = get_cabecalho(casa)
rodape = get_rodape(casa)
imagem = get_imagem(casa)
kwargs = get_kwargs_params(request, ['numero',
'ano',
'autor',
'tipo_autor',
'relator',
'interessado__icontains'
])
mats = MateriaLegislativa.objects.filter(**kwargs)
materias = get_materias(mats)
pdf = pdf_materia_gerar.principal(imagem,
materias,
cabecalho,
rodape)
response.write(pdf)
return response
def get_capa_processo(prot):
protocolos = []
for p in prot:
dic = {}
dic['numero'] = str(p.numero)
dic['ano'] = str(p.ano)
dic['data'] = str(p.data) + ' - ' + str(p.hora)
dic['txt_assunto'] = p.assunto_ementa
dic['txt_interessado'] = p.interessado
dic['nom_autor'] = " "
dic['titulo'] = " "
if p.autor:
dic['nom_autor'] = str(p.autor or ' ')
else:
dic['nom_autor'] = p.interessado
dic['natureza'] = ''
if p.tipo_processo == 0:
dic['natureza'] = 'Administrativo'
if p.tipo_processo == 1:
dic['natureza'] = 'Legislativo'
dic['ident_processo'] = str(p.tipo_materia) or str(p.tipo_documento)
dic['sgl_processo'] = str(p.tipo_materia) or str(p.tipo_documento)
dic['num_materia'] = ''
for materia in MateriaLegislativa.objects.filter(
numero_protocolo=p.numero, ano=p.ano):
dic['num_materia'] = str(materia.numero) + '/' + str(materia.ano)
dic['num_documento'] = ''
for documento in DocumentoAdministrativo.objects.filter(
numero=p.numero):
dic['num_documento'] = str(
documento.numero) + '/' + str(documento.ano)
dic['num_processo'] = dic['num_materia'] or dic['num_documento']
dic['numeracao'] = ''
for materia_num in MateriaLegislativa.objects.filter(
numero_protocolo=p.numero, ano=p.ano):
for numera in Numeracao.objects.filter(materia=materia_num):
# FIXME i18n
dic['numeracao'] = 'PROCESSO N° ' + \
str(numera.numero) + '/' + str(numera.ano)
dic['anulado'] = ''
if p.anulado == 1:
dic['anulado'] = 'Nulo'
protocolos.append(dic)
return protocolos
def relatorio_capa_processo(request):
'''
pdf_capa_processo_gerar.py
'''
response = HttpResponse(content_type='application/pdf')
response[
'Content-Disposition'] = ('inline; filename="relatorio_processo.pdf"')
casa = CasaLegislativa.objects.first()
cabecalho = get_cabecalho(casa)
rodape = get_rodape(casa)
imagem = get_imagem(casa)
kwargs = get_kwargs_params(request, ['numero',
'ano',
'tipo_protocolo',
'tipo_processo',
'assunto__icontains',
# 'interessado__icontains'
])
protocolos = Protocolo.objects.filter(**kwargs)
protocolos_pdf = get_capa_processo(protocolos)
pdf = pdf_capa_processo_gerar.principal(imagem,
protocolos_pdf,
cabecalho,
rodape)
response.write(pdf)
return response
def get_ordem_dia(ordem, sessao):
# TODO: fazer implementação de ordem dia
pass
def relatorio_ordem_dia(request):
'''
pdf_ordem_dia_gerar.py
'''
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = (
'inline; filename="relatorio_ordem_dia.pdf"')
casa = CasaLegislativa.objects.first()
cabecalho = get_cabecalho(casa)
rodape = get_rodape(casa)
imagem = get_imagem(casa)
kwargs = get_kwargs_params(request, ['numero_ordem'])
ordem = OrdemDia.objects.filter(**kwargs)
sessao = SessaoPlenaria.objects.first()
ordem_pdf = get_ordem_dia(ordem, sessao)
pdf = pdf_ordem_dia_gerar.principal(imagem,
ordem_pdf,
cabecalho,
rodape)
response.write(pdf)
return response
def relatorio_documento_administrativo(request):
'''
pdf_documento_administrativo_gerar.py
'''
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = (
'inline; filename="relatorio_documento_administrativo.pdf"')
casa = CasaLegislativa.objects.first()
cabecalho = get_cabecalho(casa)
rodape = get_rodape(casa)
imagem = get_imagem(casa)
docs = DocumentoAdministrativo.objects.all()[:50]
doc_pdf = get_documento_administrativo(docs)
pdf = pdf_documento_administrativo_gerar.principal(
imagem,
doc_pdf,
cabecalho,
rodape)
response.write(pdf)
return response
def get_documento_administrativo(docs):
documentos = []
for d in docs:
dic = {}
dic['titulo'] = str(d)
dic['txt_assunto'] = d.assunto
dic['txt_interessado'] = d.interessado
des_status = ''
txt_tramitacao = ''
dic['localizacao_atual'] = ' '
# Será removido o 'última'?
for t in TramitacaoAdministrativo.objects.filter(
documento=d, ultima=True):
if t.unidade_tramitacao_destino:
cod_unid_tram = t.unidade_tramitacao_destino
else:
cod_unid_tram = t.unidade_tramitacao_destino
for unidade_tramitacao in UnidadeTramitacao.objects.filter(
id=cod_unid_tram):
if unidade_tramitacao.orgao:
dic['localizacao_atual'] = unidade_tramitacao.orgao
else:
dic['localizacao_atual'] = unidade_tramitacao.comissao
des_status = t.status.descricao
txt_tramitacao = t.texto
dic['des_situacao'] = des_status
dic['ultima_acao'] = txt_tramitacao
documentos.append(dic)
return documentos
def relatorio_espelho(request):
'''
pdf_espelho_gerar.py
'''
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = (
'inline; filename="relatorio_espelho.pdf"')
casa = CasaLegislativa.objects.first()
cabecalho = get_cabecalho(casa)
rodape = get_rodape(casa)
imagem = get_imagem(casa)
mats = MateriaLegislativa.objects.all()[:50]
mat_pdf = get_espelho(mats)
pdf = pdf_espelho_gerar.principal(
imagem,
mat_pdf,
cabecalho,
rodape)
response.write(pdf)
return response
def get_espelho(mats):
materias = []
for m in mats:
dic = {}
dic['titulo'] = str(m)
dic['materia'] = str(m.numero) + '/' + str(m.ano)
dic['dat_apresentacao'] = str(m.data_apresentacao)
dic['txt_ementa'] = m.ementa
dic['nom_autor'] = []
for autoria in Autoria.objects.filter(materia=m, primeiro_autor=True):
dic['nom_autor'].append(str(autoria.autor))
dic['nom_autor'] = ', '.join(dic['nom_autor'])
des_status = ''
txt_tramitacao = ''
data_ultima_acao = ''
dic['localizacao_atual'] = " "
for tramitacao in Tramitacao.objects.filter(materia=m):
if tramitacao.unidade_tramitacao_destino:
cod_unid_tram = tramitacao.unidade_tramitacao_destino
else:
cod_unid_tram = tramitacao.unidade_tramitacao_local
for unidade_tramitacao in UnidadeTramitacao.objects.filter(
id=cod_unid_tram.id):
if unidade_tramitacao.orgao:
dic['localizacao_atual'] = unidade_tramitacao.orgao
elif unidade_tramitacao.parlamentar:
dic['localizacao_atual'] = unidade_tramitacao.parlamentar
else:
dic['localizacao_atual'] = unidade_tramitacao.comissao
des_status = tramitacao.status
txt_tramitacao = tramitacao.texto
data_ultima_acao = tramitacao.data_tramitacao
dic['des_situacao'] = des_status
dic['ultima_acao'] = txt_tramitacao
dic['data_ultima_acao'] = data_ultima_acao
dic['norma_juridica_vinculada'] = str(_('Não há nenhuma \
norma jurídica vinculada'))
# TODO
# for norma in context.zsql.materia_buscar_norma_juridica_zsql(
# cod_materia=materia.cod_materia):
# dic['norma_juridica_vinculada'] = norma.des_norma + " " + \
# str(norma.num_norma) + "/" + str(norma.ano_norma)
materias.append(dic)
return materias
def remove_html_comments(text):
"""
Assume comentários bem formados e
não aninhados como -->
:param text:
:return:
"""
clean_text = text
start = clean_text.find('') + 2
output_text = []
for idx, i in enumerate(clean_text):
if not start <= idx <= end:
output_text.append(i)
clean_text = ''.join(output_text)
start = clean_text.find('