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('