@ -1,9 +1,11 @@
from datetime import datetime
import logging
from random import choice
from string import ascii_letters , digits
from crispy_forms . helper import FormHelper
from crispy_forms . layout import HTML
from django . conf import settings
from django . contrib import messages
from django . contrib . auth . decorators import permission_required
from django . contrib . auth . mixins import PermissionRequiredMixin
@ -21,10 +23,11 @@ from django.views.generic.base import RedirectView
from django . views . generic . edit import FormView
from django_filters . views import FilterView
import weasyprint
import logging
import sapl
from sapl . base . email_utils import do_envia_email_confirmacao
from sapl . base . models import Autor , CasaLegislativa
from sapl . base . signals import tramitacao_signal
from sapl . comissoes . models import Comissao , Participacao
from sapl . compilacao . models import ( STATUS_TA_IMMUTABLE_RESTRICT ,
STATUS_TA_PRIVATE )
@ -45,9 +48,8 @@ from sapl.protocoloadm.models import Protocolo
from sapl . utils import ( YES_NO_CHOICES , autor_label , autor_modal , SEPARADOR_HASH_PROPOSICAO ,
gerar_hash_arquivo , get_base_url ,
get_mime_type_from_file_extension , montar_row_autor ,
show_results_filter_set )
show_results_filter_set , mail_service_configured )
from sapl . base . email_utils import do_envia_email_confirmacao
from . forms import ( AcessorioEmLoteFilterSet , AcompanhamentoMateriaForm ,
AdicionarVariasAutoriasFilterSet , DespachoInicialForm ,
DocumentoAcessorioForm , EtiquetaPesquisaForm ,
@ -66,7 +68,6 @@ from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria,
RegimeTramitacao , Relatoria , StatusTramitacao ,
TipoDocumento , TipoFimRelatoria , TipoMateriaLegislativa ,
TipoProposicao , Tramitacao , UnidadeTramitacao )
from sapl . base . signals import tramitacao_signal
AssuntoMateriaCrud = CrudAux . build ( AssuntoMateria , ' assunto_materia ' )
@ -95,7 +96,8 @@ def autores_ja_adicionados(materia_pk):
def proposicao_texto ( request , pk ) :
logger = logging . getLogger ( __name__ )
username = request . user . username . replace ( " ' " , " " )
logger . debug ( ' user= ' + username + ' . Tentando obter objeto Proposicao com pk = {} . ' . format ( pk ) )
logger . debug ( ' user= ' + username +
' . Tentando obter objeto Proposicao com pk = {} . ' . format ( pk ) )
proposicao = Proposicao . objects . get ( pk = pk )
if proposicao . texto_original :
@ -119,7 +121,8 @@ def proposicao_texto(request, pk):
response [ ' Content-Disposition ' ] = (
' inline; filename= " %s " ' % arquivo . name . split ( ' / ' ) [ - 1 ] )
return response
logger . error ( ' user= ' + username + ' . Objeto Proposicao com pk= {} não encontrado. ' . format ( pk ) )
logger . error ( ' user= ' + username +
' . Objeto Proposicao com pk= {} não encontrado. ' . format ( pk ) )
raise Http404
@ -184,15 +187,18 @@ class CriarProtocoloMateriaView(CreateView):
username = self . request . user . username . replace ( " ' " , " " )
try :
self . logger . debug ( " user= " + username + " . Tentando obter objeto Protocolo. " )
self . logger . debug ( " user= " + username +
" . Tentando obter objeto Protocolo. " )
protocolo = Protocolo . objects . get ( pk = self . kwargs [ ' pk ' ] )
except ObjectDoesNotExist as e :
self . logger . error ( " user= " + username + " . Objeto Protocolo com pk= {} não encontrado. " . format ( self . kwargs [ ' pk ' ] ) + str ( e ) )
self . logger . error (
" user= " + username + " . Objeto Protocolo com pk= {} não encontrado. " . format ( self . kwargs [ ' pk ' ] ) + str ( e ) )
raise Http404 ( )
numero = 1
try :
self . logger . debug ( " user= " + username + " . Tentando obter materias do último ano. " )
self . logger . debug ( " user= " + username +
" . Tentando obter materias do último ano. " )
materias_ano = MateriaLegislativa . objects . filter (
ano = protocolo . ano ,
tipo = protocolo . tipo_materia ) . latest ( ' numero ' )
@ -216,10 +222,12 @@ class CriarProtocoloMateriaView(CreateView):
username = self . request . user . username . replace ( " ' " , " " )
try :
self . logger . info ( " user= " + username + " . Tentando obter objeto Procolo com pk= {} . " . format ( self . kwargs [ ' pk ' ] ) )
self . logger . info (
" user= " + username + " . Tentando obter objeto Procolo com pk= {} . " . format ( self . kwargs [ ' pk ' ] ) )
protocolo = Protocolo . objects . get ( pk = self . kwargs [ ' pk ' ] )
except ObjectDoesNotExist :
self . logger . error ( ' user= ' + username + ' . Objeto Protocolo com pk= {} não encontrado. ' . format ( self . kwargs [ ' pk ' ] ) )
self . logger . error (
' user= ' + username + ' . Objeto Protocolo com pk= {} não encontrado. ' . format ( self . kwargs [ ' pk ' ] ) )
raise Http404 ( )
if protocolo . autor :
@ -310,11 +318,13 @@ def recuperar_materia(request):
numeracao = None
try :
logger . debug ( " user= " + username + " . Tentando obter numeração da matéria. " )
logger . debug ( " user= " + username +
" . Tentando obter numeração da matéria. " )
numeracao = sapl . base . models . AppConfig . objects . last (
) . sequencia_numeracao
except AttributeError as e :
logger . error ( " user= " + username + " . " + str ( e ) + " Numeracao da matéria definida como None. " )
logger . error ( " user= " + username + " . " + str ( e ) +
" Numeracao da matéria definida como None. " )
pass
if tipo . sequencia_numeracao :
@ -531,7 +541,8 @@ class ReceberProposicao(PermissionRequiredForAppCrudMixin, FormView):
except IndexError :
messages . error ( request , _ ( ' Código de recibo mal formado! ' ) )
except IOError :
messages . error ( request , _ ( ' Erro abrindo texto original de proposição ' ) )
messages . error ( request , _ (
' Erro abrindo texto original de proposição ' ) )
return self . form_invalid ( form )
def get_success_url ( self ) :
@ -554,14 +565,17 @@ class RetornarProposicao(UpdateView):
def dispatch ( self , request , * args , * * kwargs ) :
username = request . user . username . replace ( " ' " , " " )
try :
self . logger . info ( " user= " + username + " . Tentando obter objeto Proposicao com id= {} . " . format ( kwargs [ ' pk ' ] ) )
self . logger . info (
" user= " + username + " . Tentando obter objeto Proposicao com id= {} . " . format ( kwargs [ ' pk ' ] ) )
p = Proposicao . objects . get ( id = kwargs [ ' pk ' ] )
except :
self . logger . error ( " user= " + username + " . Objeto Proposicao com id= {} não encontrado. " . format ( kwargs [ ' pk ' ] ) )
self . logger . error (
" user= " + username + " . Objeto Proposicao com id= {} não encontrado. " . format ( kwargs [ ' pk ' ] ) )
raise Http404 ( )
if p . autor . user != request . user :
self . logger . error ( " user= " + username + " . Usuário ( {} ) sem acesso a esta opção. " . format ( request . user ) )
self . logger . error (
" user= " + username + " . Usuário ( {} ) sem acesso a esta opção. " . format ( request . user ) )
messages . error (
request ,
' Usuário sem acesso a esta opção. ' %
@ -597,7 +611,8 @@ class ConfirmarProposicao(PermissionRequiredForAppCrudMixin, UpdateView):
já recebidas - > data_recebimento != None
não enviadas - > data_envio == None
"""
self . logger . debug ( " user= " + username + " . Tentando obter objeto Proposicao. " )
self . logger . debug ( " user= " + username +
" . Tentando obter objeto Proposicao. " )
proposicao = Proposicao . objects . get ( pk = self . kwargs [ ' pk ' ] ,
data_envio__isnull = False ,
data_recebimento__isnull = True )
@ -736,6 +751,7 @@ class ProposicaoCrud(Crud):
' materia.detail_proposicao_incorporada ' )
logger = logging . getLogger ( __name__ )
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ ' subnav_template_name ' ] = ' '
@ -790,18 +806,22 @@ class ProposicaoCrud(Crud):
' número que pode não corresponder com a realidade '
% ( p . tipo , numero , p . ano ) ) )
except ValueError as e :
self . logger . error ( " user= " + username + " . " + str ( e ) )
self . logger . error (
" user= " + username + " . " + str ( e ) )
pass
except AttributeError as e :
self . logger . error ( " user= " + username + " . " + str ( e ) )
self . logger . error (
" user= " + username + " . " + str ( e ) )
pass
except TypeError as e :
self . logger . error ( " user= " + username + " . " + str ( e ) )
self . logger . error (
" user= " + username + " . " + str ( e ) )
pass
elif action == ' return ' :
if not p . data_envio :
self . logger . error ( " user= " + username + " . Proposição (numero= {} ) ainda não foi enviada. " . format ( p . numero_proposicao ) )
self . logger . error (
" user= " + username + " . Proposição (numero= {} ) ainda não foi enviada. " . format ( p . numero_proposicao ) )
msg_error = _ ( ' Proposição ainda não foi enviada. ' )
elif p . data_recebimento :
self . logger . error ( " user= " + username + " . Proposição (numero= {} ) já foi recebida, não é "
@ -816,7 +836,8 @@ class ProposicaoCrud(Crud):
ta . privacidade = STATUS_TA_PRIVATE
ta . editing_locked = False
ta . save ( )
self . logger . info ( " user= " + username + " . Proposição (numero= {} ) Retornada com sucesso. " . format ( p . numero_proposicao ) )
self . logger . info (
" user= " + username + " . Proposição (numero= {} ) Retornada com sucesso. " . format ( p . numero_proposicao ) )
messages . success ( request , _ (
' Proposição Retornada com sucesso. ' ) )
@ -830,10 +851,12 @@ class ProposicaoCrud(Crud):
def dispatch ( self , request , * args , * * kwargs ) :
username = request . user . username . replace ( " ' " , " " )
try :
self . logger . debug ( " user= " + username + " . Tentando obter objeto Proposicao com pk= {} " . format ( kwargs [ ' pk ' ] ) )
self . logger . debug (
" user= " + username + " . Tentando obter objeto Proposicao com pk= {} " . format ( kwargs [ ' pk ' ] ) )
p = Proposicao . objects . get ( id = kwargs [ ' pk ' ] )
except Exception as e :
self . logger . error ( " user= " + username + " . Erro ao obter proposicao com pk= {} . Retornando 404. " . format ( kwargs [ ' pk ' ] ) + str ( e ) )
self . logger . error (
" user= " + username + " . Erro ao obter proposicao com pk= {} . Retornando 404. " . format ( kwargs [ ' pk ' ] ) + str ( e ) )
raise Http404 ( )
if not self . has_permission ( ) :
@ -1048,7 +1071,8 @@ class ReciboProposicaoView(TemplateView):
messages . error ( request , _ ( ' Não é possível gerar recibo para uma '
' Proposição ainda não enviada. ' ) )
elif proposicao . data_devolucao :
self . logger . error ( " user= " + username + " . Não é possível gerar recibo para proposicao de pk= {} . " . format ( self . kwargs [ ' pk ' ] ) )
self . logger . error (
" user= " + username + " . Não é possível gerar recibo para proposicao de pk= {} . " . format ( self . kwargs [ ' pk ' ] ) )
messages . error ( request , _ ( ' Não é possível gerar recibo. ' ) )
return redirect ( reverse ( ' sapl.materia:proposicao_detail ' ,
@ -1070,15 +1094,18 @@ class RelatoriaCrud(MasterDetailCrud):
username = self . request . user . username . replace ( " ' " , " " )
try :
self . logger . debug ( " user= " + username + " . Tentando obter objeto Comissao de pk= {} . " . format ( context [ ' form ' ] . initial [ ' comissao ' ] ) )
self . logger . debug ( " user= " + username + " . Tentando obter objeto Comissao de pk= {} . " . format (
context [ ' form ' ] . initial [ ' comissao ' ] ) )
comissao = Comissao . objects . get (
pk = context [ ' form ' ] . initial [ ' comissao ' ] )
except :
self . logger . error ( " user= " + username + " . Objeto Comissão de pk= {} não encontrado. " . format ( context [ ' form ' ] . initial [ ' comissao ' ] ) )
self . logger . error ( " user= " + username + " . Objeto Comissão de pk= {} não encontrado. " . format (
context [ ' form ' ] . initial [ ' comissao ' ] ) )
pass
else :
self . logger . info ( " user= " + username + " . Objeto Comissao de pk= {} obtido com sucesso. " . format ( context [ ' form ' ] . initial [ ' comissao ' ] ) )
self . logger . info ( " user= " + username + " . Objeto Comissao de pk= {} obtido com sucesso. " . format (
context [ ' form ' ] . initial [ ' comissao ' ] ) )
composicao = comissao . composicao_set . order_by (
' -periodo__data_inicio ' ) . first ( )
participacao = Participacao . objects . filter (
@ -1122,14 +1149,17 @@ class RelatoriaCrud(MasterDetailCrud):
username = self . request . user . username . replace ( " ' " , " " )
try :
self . logger . debug ( " user= " + username + " . Tentando obter objeto Comissao de pk= {} . " . format ( context [ ' form ' ] . initial [ ' comissao ' ] ) )
self . logger . debug ( " user= " + username + " . Tentando obter objeto Comissao de pk= {} . " . format (
context [ ' form ' ] . initial [ ' comissao ' ] ) )
comissao = Comissao . objects . get (
pk = context [ ' form ' ] . initial [ ' comissao ' ] )
except ObjectDoesNotExist :
self . logger . error ( " user= " + username + " . Objeto Comissão de pk= {} não encontrado. " . format ( context [ ' form ' ] . initial [ ' comissao ' ] ) )
self . logger . error ( " user= " + username + " . Objeto Comissão de pk= {} não encontrado. " . format (
context [ ' form ' ] . initial [ ' comissao ' ] ) )
pass
else :
self . logger . info ( " user= " + username + " . Objeto Comissao de pk= {} obtido com sucesso. " . format ( context [ ' form ' ] . initial [ ' comissao ' ] ) )
self . logger . info ( " user= " + username + " . Objeto Comissao de pk= {} obtido com sucesso. " . format (
context [ ' form ' ] . initial [ ' comissao ' ] ) )
composicao = comissao . composicao_set . order_by (
' -periodo__data_inicio ' ) . first ( )
participacao = Participacao . objects . filter (
@ -1640,7 +1670,8 @@ class AcompanhamentoConfirmarView(TemplateView):
def get_redirect_url ( self , email ) :
username = self . request . user . username . replace ( " ' " , " " )
self . logger . debug ( ' user= ' + username + ' . Esta matéria está sendo acompanhada pelo e-mail: %s ' % ( email ) )
self . logger . debug (
' user= ' + username + ' . Esta matéria está sendo acompanhada pelo e-mail: %s ' % ( email ) )
msg = _ ( ' Esta matéria está sendo acompanhada pelo e-mail: %s ' ) % (
email )
messages . add_message ( self . request , messages . SUCCESS , msg )
@ -1680,7 +1711,8 @@ class AcompanhamentoExcluirView(TemplateView):
def get_success_url ( self ) :
username = self . request . user . username . replace ( " ' " , " " )
self . logger . debug ( " user= " + username + " . Você parou de acompanhar esta matéria. " )
self . logger . debug ( " user= " + username +
" . Você parou de acompanhar esta matéria. " )
msg = _ ( ' Você parou de acompanhar esta matéria. ' )
messages . add_message ( self . request , messages . INFO , msg )
return reverse ( ' sapl.materia:materialegislativa_detail ' ,
@ -1790,6 +1822,12 @@ class AcompanhamentoMateriaView(CreateView):
return ' ' . join ( choice ( s ) for i in range ( choice ( [ 6 , 7 ] ) ) )
def get ( self , request , * args , * * kwargs ) :
if not mail_service_configured ( ) :
self . logger . warning ( _ ( ' Servidor de email não configurado. ' ) )
messages . error ( request , _ ( ' Serviço de Acompanhamento de '
' Matérias não foi configurado ' ) )
return redirect ( ' / ' )
pk = self . kwargs [ ' pk ' ]
materia = MateriaLegislativa . objects . get ( id = pk )
@ -1798,6 +1836,13 @@ class AcompanhamentoMateriaView(CreateView):
' materia ' : materia } )
def post ( self , request , * args , * * kwargs ) :
if not settings . EMAIL_HOST :
self . logger . warning ( _ ( ' Servidor de email não configurado. ' ) )
messages . error ( request , _ ( ' Serviço de Acompanhamento de '
' Matérias não foi configurado ' ) )
return redirect ( ' / ' )
form = AcompanhamentoMateriaForm ( request . POST )
pk = self . kwargs [ ' pk ' ]
materia = MateriaLegislativa . objects . get ( id = pk )
@ -1845,7 +1890,8 @@ class AcompanhamentoMateriaView(CreateView):
# Caso esse Acompanhamento já exista
# avisa ao usuário que essa matéria já está sendo acompanhada
else :
self . logger . debug ( " user= " + usuario . username + " . Este e-mail já está acompanhando essa matéria. " )
self . logger . debug ( " user= " + usuario . username +
" . Este e-mail já está acompanhando essa matéria. " )
msg = _ ( ' Este e-mail já está acompanhando essa matéria. ' )
messages . add_message ( request , messages . INFO , msg )
@ -1966,7 +2012,6 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
return context
def post ( self , request , * args , * * kwargs ) :
marcadas = request . POST . getlist ( ' materia_id ' )
@ -1991,7 +2036,6 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
messages . add_message ( request , messages . ERROR , msg )
return self . get ( request , self . kwargs )
if not request . POST [ ' data_encaminhamento ' ] :
data_encaminhamento = None
else :
@ -2026,7 +2070,8 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
)
t . save ( )
try :
self . logger . debug ( " user= " + username + " . Tentando enviar tramitação. " )
self . logger . debug ( " user= " + username +
" . Tentando enviar tramitação. " )
tramitacao_signal . send ( sender = Tramitacao ,
post = t ,
request = self . request )
@ -2211,11 +2256,13 @@ class FichaSelecionaView(PermissionRequiredMixin, FormView):
username = self . request . user . username . replace ( " ' " , " " )
try :
self . logger . debug ( " user= " + username + " . Tentando obter objeto MateriaLegislativa com id= {} " . format ( form . data [ ' materia ' ] ) )
self . logger . debug (
" user= " + username + " . Tentando obter objeto MateriaLegislativa com id= {} " . format ( form . data [ ' materia ' ] ) )
materia = MateriaLegislativa . objects . get (
id = form . data [ ' materia ' ] )
except ObjectDoesNotExist :
self . logger . error ( " user= " + username + " . Esta MáteriaLegislativa não existe (id= {} ). " . format ( form . data [ ' materia ' ] ) )
self . logger . error (
" user= " + username + " . Esta MáteriaLegislativa não existe (id= {} ). " . format ( form . data [ ' materia ' ] ) )
mensagem = _ ( ' Esta Máteria não existe! ' )
self . messages . add_message ( self . request , messages . INFO , mensagem )