@ -1,13 +1,11 @@
from datetime import datetime
import itertools
import logging
import os
import shutil
import tempfile
import weasyprint
import itertools
from datetime import datetime
from random import choice
import shutil
from string import ascii_letters , digits
import tempfile
from crispy_forms . layout import HTML
from django . conf import settings
@ -28,6 +26,7 @@ from django.views.generic.base import RedirectView
from django . views . generic . edit import FormView
from django_filters . views import FilterView
import weasyprint
import weasyprint
import sapl
from sapl . base . email_utils import do_envia_email_confirmacao
@ -47,7 +46,8 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm,
ConfirmarProposicaoForm ,
DevolverProposicaoForm , LegislacaoCitadaForm ,
OrgaoForm , ProposicaoForm , TipoProposicaoForm ,
TramitacaoForm , TramitacaoUpdateForm , MateriaPesquisaSimplesForm )
TramitacaoForm , TramitacaoUpdateForm , MateriaPesquisaSimplesForm ,
DespachoInicialCreateForm )
from sapl . norma . models import LegislacaoCitada
from sapl . parlamentares . models import Legislatura
from sapl . protocoloadm . models import Protocolo
@ -1141,9 +1141,9 @@ class RelatoriaCrud(MasterDetailCrud):
parlamentar = relatoria . parlamentar
comissao = relatoria . comissao
composicoes = [ p . composicao for p in
Participacao . objects . filter (
parlamentar = parlamentar ,
composicao__comissao = comissao ) ]
Participacao . objects . filter (
parlamentar = parlamentar ,
composicao__comissao = comissao ) ]
data_designacao = relatoria . data_designacao_relator
composicao = ' '
for c in composicoes :
@ -1204,7 +1204,8 @@ class TramitacaoCrud(MasterDetailCrud):
' -timestamp ' ,
' -id ' ) . first ( )
#TODO: Esta checagem foi inserida na issue #2027, mas é mesmo necessária?
# TODO: Esta checagem foi inserida na issue #2027, mas é mesmo
# necessária?
if ultima_tramitacao :
if ultima_tramitacao . unidade_tramitacao_destino :
context [ ' form ' ] . fields [
@ -1258,7 +1259,8 @@ class TramitacaoCrud(MasterDetailCrud):
layout_key = ' TramitacaoUpdate '
def form_valid ( self , form ) :
dict_objeto_antigo = Tramitacao . objects . get ( pk = self . kwargs [ ' pk ' ] ) . __dict__
dict_objeto_antigo = Tramitacao . objects . get (
pk = self . kwargs [ ' pk ' ] ) . __dict__
self . object = form . save ( )
dict_objeto_novo = self . object . __dict__
@ -1270,7 +1272,8 @@ class TramitacaoCrud(MasterDetailCrud):
' data_encaminhamento ' , ' data_fim_prazo ' , ' urgente ' , ' turno '
]
# Se não houve qualquer alteração em um dos dados, mantém o usuário e ip
# Se não houve qualquer alteração em um dos dados, mantém o usuário
# e ip
for atributo in atributos :
if dict_objeto_antigo [ atributo ] != dict_objeto_novo [ atributo ] :
self . object . user = user
@ -1332,7 +1335,8 @@ class TramitacaoCrud(MasterDetailCrud):
if materia . tramitacao_set . count ( ) == 0 :
materia . em_tramitacao = False
materia . save ( )
tramitar_anexadas = sapl . base . models . AppConfig . attr ( ' tramitacao_materia ' )
tramitar_anexadas = sapl . base . models . AppConfig . attr (
' tramitacao_materia ' )
if tramitar_anexadas :
mat_anexadas = lista_anexados ( materia )
for ma in mat_anexadas :
@ -1485,20 +1489,58 @@ class AutoriaMultiCreateView(PermissionRequiredForAppCrudMixin, FormView):
autores_selecionados = form . cleaned_data [ ' autor ' ]
primeiro_autor = form . cleaned_data [ ' primeiro_autor ' ]
for autor in autores_selecionados :
Autoria . objects . create ( materia = self . materia , autor = autor , primeiro_autor = primeiro_autor )
Autoria . objects . create ( materia = self . materia ,
autor = autor , primeiro_autor = primeiro_autor )
return FormView . form_valid ( self , form )
class DespachoInicialMultiCreateView ( PermissionRequiredForAppCrudMixin , FormView ) :
app_label = sapl . materia . apps . AppConfig . label
form_class = DespachoInicialCreateForm
template_name = ' materia/despachoinicial_multicreate_form.html '
def get_initial ( self ) :
initial = super ( ) . get_initial ( )
self . materia = MateriaLegislativa . objects . get ( id = self . kwargs [ ' pk ' ] )
initial [ ' materia ' ] = self . materia
return initial
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ ' title ' ] = ' %s <small>( %s )</small> ' % (
_ ( ' Adicionar Vários Despachos ' ) , self . materia )
context [ ' root_pk ' ] = self . kwargs [ ' pk ' ]
context [ ' subnav_template_name ' ] = ' materia/subnav.yaml '
return context
def get_success_url ( self ) :
messages . add_message (
self . request , messages . SUCCESS ,
_ ( ' Despachos adicionados com sucesso. ' ) )
return reverse (
' sapl.materia:despachoinicial_list ' , kwargs = { ' pk ' : self . materia . pk } )
def form_valid ( self , form ) :
comissoes_selecionadas = form . cleaned_data [ ' comissao ' ]
for comissao in comissoes_selecionadas :
DespachoInicial . objects . create (
materia = self . materia , comissao = comissao )
return FormView . form_valid ( self , form )
@property
def cancel_url ( self ) :
return reverse (
' sapl.materia:despachoinicial_list ' , kwargs = { ' pk ' : self . materia . pk } )
class DespachoInicialCrud ( MasterDetailCrud ) :
model = DespachoInicial
parent_field = ' materia '
help_topic = ' despacho_autoria '
public = [ RP_LIST , RP_DETAIL ]
class CreateView ( MasterDetailCrud . CreateView ) :
form_class = DespachoInicialForm
class UpdateView ( MasterDetailCrud . UpdateView ) :
form_class = DespachoInicialForm
@ -1687,7 +1729,8 @@ class MateriaLegislativaCrud(Crud):
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ ' user ' ] = self . request . user
context [ ' materia ' ] = MateriaLegislativa . objects . get ( pk = self . kwargs [ ' pk ' ] )
context [ ' materia ' ] = MateriaLegislativa . objects . get (
pk = self . kwargs [ ' pk ' ] )
return context
class ListView ( Crud . ListView , RedirectView ) :
@ -2081,13 +2124,15 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
destination . write ( chunk )
try :
doc_data = tz . localize ( datetime . strptime (
request . POST [ ' data ' ] , " %d / % m/ % Y " ) )
request . POST [ ' data ' ] , " %d / % m/ % Y " ) )
except Exception as e :
msg = _ ( ' Formato da data incorreto. O formato deve ser da forma dd/mm/aaaa. ' )
messages . add_message ( request , messages . ERROR , msg )
self . logger . error ( " User= {} . {} . Data inserida: {} " . format ( username , str ( msg ) , request . POST [ ' data ' ] ) )
os . remove ( tmp_name )
return self . get ( request , self . kwargs )
msg = _ (
' Formato da data incorreto. O formato deve ser da forma dd/mm/aaaa. ' )
messages . add_message ( request , messages . ERROR , msg )
self . logger . error ( " User= {} . {} . Data inserida: {} " . format (
username , str ( msg ) , request . POST [ ' data ' ] ) )
os . remove ( tmp_name )
return self . get ( request , self . kwargs )
for materia_id in marcadas :
doc = DocumentoAcessorio ( )
@ -2101,25 +2146,27 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
try :
doc . clean_fields ( )
except ValidationError as e :
for m in [ ' %s : %s ' % ( DocumentoAcessorio ( ) . _meta . get_field ( k ) . verbose_name , ' </br> ' . join ( v ) )
for k , v in e . message_dict . items ( ) ] :
for m in [ ' %s : %s ' % ( DocumentoAcessorio ( ) . _meta . get_field ( k ) . verbose_name , ' </br> ' . join ( v ) )
for k , v in e . message_dict . items ( ) ] :
# Insere as mensagens de erro no formato:
# 'verbose_name do nome do campo': 'mensagem de erro'
messages . add_message ( request , messages . ERROR , m )
self . logger . error ( " User= {} . {} . Nome do arquivo: {} . " . format ( username , str ( msg ) , request . FILES [ ' arquivo ' ] . name ) )
self . logger . error ( " User= {} . {} . Nome do arquivo: {} . " . format (
username , str ( msg ) , request . FILES [ ' arquivo ' ] . name ) )
os . remove ( tmp_name )
return self . get ( request , self . kwargs )
doc . save ( )
diretorio = os . path . join ( MEDIA_ROOT ,
' sapl/public/documentoacessorio ' ,
str ( doc_data . year ) ,
str ( doc . id ) )
diretorio = os . path . join ( MEDIA_ROOT ,
' sapl/public/documentoacessorio ' ,
str ( doc_data . year ) ,
str ( doc . id ) )
if not os . path . exists ( diretorio ) :
os . makedirs ( diretorio )
file_path = os . path . join ( diretorio ,
request . FILES [ ' arquivo ' ] . name )
shutil . copy2 ( tmp_name , file_path )
doc . arquivo . name = file_path . split ( MEDIA_ROOT + " / " ) [ 1 ] # Retira MEDIA_ROOT do nome
doc . arquivo . name = file_path . split (
MEDIA_ROOT + " / " ) [ 1 ] # Retira MEDIA_ROOT do nome
doc . save ( )
os . remove ( tmp_name )
@ -2145,17 +2192,17 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
# Verifica se os campos foram preenchidos
if not self . request . GET . get ( ' tipo ' , " " ) :
msg = _ ( ' Por favor, selecione um tipo de matéria. ' )
msg = _ ( ' Por favor, selecione um tipo de matéria. ' )
messages . add_message ( self . request , messages . ERROR , msg )
if not self . request . GET . get ( ' data_apresentacao_0 ' , " " ) or not self . request . GET . get ( ' data_apresentacao_1 ' , " " ) :
msg = _ ( ' Por favor, preencha as datas. ' )
msg = _ ( ' Por favor, preencha as datas. ' )
messages . add_message ( self . request , messages . ERROR , msg )
return context
if not self . request . GET . get ( ' data_apresentacao_0 ' , " " ) or not self . request . GET . get ( ' data_apresentacao_1 ' , " " ) :
msg = _ ( ' Por favor, preencha as datas. ' )
msg = _ ( ' Por favor, preencha as datas. ' )
messages . add_message ( self . request , messages . ERROR , msg )
return context
@ -2164,8 +2211,10 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
' numero ' , ' -ano ' )
principal = MateriaLegislativa . objects . get ( pk = self . kwargs [ ' pk ' ] )
not_list = [ self . kwargs [ ' pk ' ] ] + \
[ m for m in principal . materia_principal_set . all ( ) . values_list ( ' materia_anexada_id ' , flat = True ) ]
context [ ' object_list ' ] = context [ ' object_list ' ] . exclude ( pk__in = not_list )
[ m for m in principal . materia_principal_set . all (
) . values_list ( ' materia_anexada_id ' , flat = True ) ]
context [ ' object_list ' ] = context [ ' object_list ' ] . exclude (
pk__in = not_list )
context [ ' temp_object_list ' ] = context [ ' object_list ' ]
context [ ' object_list ' ] = [ ]
@ -2173,7 +2222,7 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
materia_anexada = obj
ciclico = False
anexadas_anexada = Anexada . objects . filter (
materia_principal = materia_anexada
materia_principal = materia_anexada
)
while anexadas_anexada and not ciclico :
@ -2242,7 +2291,8 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
msg = _ ( ' Matéria(s) anexada(s). ' )
messages . add_message ( request , messages . SUCCESS , msg )
success_url = reverse ( ' sapl.materia:anexada_list ' , kwargs = { ' pk ' : kwargs [ ' pk ' ] } )
success_url = reverse ( ' sapl.materia:anexada_list ' ,
kwargs = { ' pk ' : kwargs [ ' pk ' ] } )
return HttpResponseRedirect ( success_url )
@ -2328,6 +2378,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
return self . get ( self . request , kwargs , { ' form ' : form } )
class TramitacaoEmLoteView ( PrimeiraTramitacaoEmLoteView ) :
filterset_class = TramitacaoEmLoteFilterSet