|
|
@ -1,13 +1,11 @@ |
|
|
|
|
|
from datetime import datetime |
|
|
|
|
|
import itertools |
|
|
import logging |
|
|
import logging |
|
|
import os |
|
|
import os |
|
|
import shutil |
|
|
|
|
|
import tempfile |
|
|
|
|
|
import weasyprint |
|
|
|
|
|
import itertools |
|
|
|
|
|
|
|
|
|
|
|
from datetime import datetime |
|
|
|
|
|
from random import choice |
|
|
from random import choice |
|
|
|
|
|
import shutil |
|
|
from string import ascii_letters, digits |
|
|
from string import ascii_letters, digits |
|
|
|
|
|
import tempfile |
|
|
|
|
|
|
|
|
from crispy_forms.layout import HTML |
|
|
from crispy_forms.layout import HTML |
|
|
from django.conf import settings |
|
|
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.views.generic.edit import FormView |
|
|
from django_filters.views import FilterView |
|
|
from django_filters.views import FilterView |
|
|
import weasyprint |
|
|
import weasyprint |
|
|
|
|
|
import weasyprint |
|
|
|
|
|
|
|
|
import sapl |
|
|
import sapl |
|
|
from sapl.base.email_utils import do_envia_email_confirmacao |
|
|
from sapl.base.email_utils import do_envia_email_confirmacao |
|
|
@ -1205,7 +1204,8 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
'-timestamp', |
|
|
'-timestamp', |
|
|
'-id').first() |
|
|
'-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: |
|
|
if ultima_tramitacao.unidade_tramitacao_destino: |
|
|
if ultima_tramitacao.unidade_tramitacao_destino: |
|
|
context['form'].fields[ |
|
|
context['form'].fields[ |
|
|
@ -1259,7 +1259,8 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
layout_key = 'TramitacaoUpdate' |
|
|
layout_key = 'TramitacaoUpdate' |
|
|
|
|
|
|
|
|
def form_valid(self, form): |
|
|
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() |
|
|
self.object = form.save() |
|
|
dict_objeto_novo = self.object.__dict__ |
|
|
dict_objeto_novo = self.object.__dict__ |
|
|
@ -1271,7 +1272,8 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
'data_encaminhamento', 'data_fim_prazo', 'urgente', 'turno' |
|
|
'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: |
|
|
for atributo in atributos: |
|
|
if dict_objeto_antigo[atributo] != dict_objeto_novo[atributo]: |
|
|
if dict_objeto_antigo[atributo] != dict_objeto_novo[atributo]: |
|
|
self.object.user = user |
|
|
self.object.user = user |
|
|
@ -1333,7 +1335,8 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
if materia.tramitacao_set.count() == 0: |
|
|
if materia.tramitacao_set.count() == 0: |
|
|
materia.em_tramitacao = False |
|
|
materia.em_tramitacao = False |
|
|
materia.save() |
|
|
materia.save() |
|
|
tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') |
|
|
tramitar_anexadas = sapl.base.models.AppConfig.attr( |
|
|
|
|
|
'tramitacao_materia') |
|
|
if tramitar_anexadas: |
|
|
if tramitar_anexadas: |
|
|
mat_anexadas = lista_anexados(materia) |
|
|
mat_anexadas = lista_anexados(materia) |
|
|
for ma in mat_anexadas: |
|
|
for ma in mat_anexadas: |
|
|
@ -1486,7 +1489,8 @@ class AutoriaMultiCreateView(PermissionRequiredForAppCrudMixin, FormView): |
|
|
autores_selecionados = form.cleaned_data['autor'] |
|
|
autores_selecionados = form.cleaned_data['autor'] |
|
|
primeiro_autor = form.cleaned_data['primeiro_autor'] |
|
|
primeiro_autor = form.cleaned_data['primeiro_autor'] |
|
|
for autor in autores_selecionados: |
|
|
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) |
|
|
return FormView.form_valid(self, form) |
|
|
|
|
|
|
|
|
@ -1506,7 +1510,7 @@ class DespachoInicialMultiCreateView(PermissionRequiredForAppCrudMixin, FormView |
|
|
context = super().get_context_data(**kwargs) |
|
|
context = super().get_context_data(**kwargs) |
|
|
context['title'] = '%s <small>(%s)</small>' % ( |
|
|
context['title'] = '%s <small>(%s)</small>' % ( |
|
|
_('Adicionar Vários Despachos'), self.materia) |
|
|
_('Adicionar Vários Despachos'), self.materia) |
|
|
context['root_pk']= self.kwargs['pk'] |
|
|
context['root_pk'] = self.kwargs['pk'] |
|
|
context['subnav_template_name'] = 'materia/subnav.yaml' |
|
|
context['subnav_template_name'] = 'materia/subnav.yaml' |
|
|
return context |
|
|
return context |
|
|
|
|
|
|
|
|
@ -1520,7 +1524,8 @@ class DespachoInicialMultiCreateView(PermissionRequiredForAppCrudMixin, FormView |
|
|
def form_valid(self, form): |
|
|
def form_valid(self, form): |
|
|
comissoes_selecionadas = form.cleaned_data['comissao'] |
|
|
comissoes_selecionadas = form.cleaned_data['comissao'] |
|
|
for comissao in comissoes_selecionadas: |
|
|
for comissao in comissoes_selecionadas: |
|
|
DespachoInicial.objects.create(materia=self.materia, comissao=comissao) |
|
|
DespachoInicial.objects.create( |
|
|
|
|
|
materia=self.materia, comissao=comissao) |
|
|
|
|
|
|
|
|
return FormView.form_valid(self, form) |
|
|
return FormView.form_valid(self, form) |
|
|
|
|
|
|
|
|
@ -1542,14 +1547,13 @@ class DespachoInicialCrud(MasterDetailCrud): |
|
|
initial = super().get_initial() |
|
|
initial = super().get_initial() |
|
|
self.materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) |
|
|
self.materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) |
|
|
initial['materia'] = self.materia |
|
|
initial['materia'] = self.materia |
|
|
import ipdb; ipdb.set_trace() |
|
|
|
|
|
return initial |
|
|
return initial |
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs): |
|
|
def get_context_data(self, **kwargs): |
|
|
context = super().get_context_data(**kwargs) |
|
|
context = super().get_context_data(**kwargs) |
|
|
context['title'] = '%s <small>(%s)</small>' % ( |
|
|
context['title'] = '%s <small>(%s)</small>' % ( |
|
|
_('Adicionar Vários Despachos'), self.materia) |
|
|
_('Adicionar Vários Despachos'), self.materia) |
|
|
context['root_pk']= self.kwargs['pk'] |
|
|
context['root_pk'] = self.kwargs['pk'] |
|
|
context['subnav_template_name'] = 'materia/subnav.yaml' |
|
|
context['subnav_template_name'] = 'materia/subnav.yaml' |
|
|
return context |
|
|
return context |
|
|
|
|
|
|
|
|
@ -1563,7 +1567,8 @@ class DespachoInicialCrud(MasterDetailCrud): |
|
|
def form_valid(self, form): |
|
|
def form_valid(self, form): |
|
|
comissoes_selecionadas = form.cleaned_data['comissao'] |
|
|
comissoes_selecionadas = form.cleaned_data['comissao'] |
|
|
for comissao in comissoes_selecionadas: |
|
|
for comissao in comissoes_selecionadas: |
|
|
DespachoInicial.objects.create(materia=self.materia, comissao=comissao) |
|
|
DespachoInicial.objects.create( |
|
|
|
|
|
materia=self.materia, comissao=comissao) |
|
|
|
|
|
|
|
|
return FormView.form_valid(self, form) |
|
|
return FormView.form_valid(self, form) |
|
|
|
|
|
|
|
|
@ -1752,7 +1757,8 @@ class MateriaLegislativaCrud(Crud): |
|
|
def get_context_data(self, **kwargs): |
|
|
def get_context_data(self, **kwargs): |
|
|
context = super().get_context_data(**kwargs) |
|
|
context = super().get_context_data(**kwargs) |
|
|
context['user'] = self.request.user |
|
|
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 |
|
|
return context |
|
|
|
|
|
|
|
|
class ListView(Crud.ListView, RedirectView): |
|
|
class ListView(Crud.ListView, RedirectView): |
|
|
@ -2148,9 +2154,11 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
doc_data = tz.localize(datetime.strptime( |
|
|
doc_data = tz.localize(datetime.strptime( |
|
|
request.POST['data'], "%d/%m/%Y")) |
|
|
request.POST['data'], "%d/%m/%Y")) |
|
|
except Exception as e: |
|
|
except Exception as e: |
|
|
msg = _('Formato da data incorreto. O formato deve ser da forma dd/mm/aaaa.') |
|
|
msg = _( |
|
|
|
|
|
'Formato da data incorreto. O formato deve ser da forma dd/mm/aaaa.') |
|
|
messages.add_message(request, messages.ERROR, msg) |
|
|
messages.add_message(request, messages.ERROR, msg) |
|
|
self.logger.error("User={}. {}. Data inserida: {}".format(username, str(msg), request.POST['data'])) |
|
|
self.logger.error("User={}. {}. Data inserida: {}".format( |
|
|
|
|
|
username, str(msg), request.POST['data'])) |
|
|
os.remove(tmp_name) |
|
|
os.remove(tmp_name) |
|
|
return self.get(request, self.kwargs) |
|
|
return self.get(request, self.kwargs) |
|
|
|
|
|
|
|
|
@ -2166,12 +2174,13 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
try: |
|
|
try: |
|
|
doc.clean_fields() |
|
|
doc.clean_fields() |
|
|
except ValidationError as e: |
|
|
except ValidationError as e: |
|
|
for m in [ '%s: %s' % (DocumentoAcessorio()._meta.get_field(k).verbose_name, '</br>'.join(v)) |
|
|
for m in ['%s: %s' % (DocumentoAcessorio()._meta.get_field(k).verbose_name, '</br>'.join(v)) |
|
|
for k,v in e.message_dict.items() ]: |
|
|
for k, v in e.message_dict.items()]: |
|
|
# Insere as mensagens de erro no formato: |
|
|
# Insere as mensagens de erro no formato: |
|
|
# 'verbose_name do nome do campo': 'mensagem de erro' |
|
|
# 'verbose_name do nome do campo': 'mensagem de erro' |
|
|
messages.add_message(request, messages.ERROR, m) |
|
|
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) |
|
|
os.remove(tmp_name) |
|
|
return self.get(request, self.kwargs) |
|
|
return self.get(request, self.kwargs) |
|
|
doc.save() |
|
|
doc.save() |
|
|
@ -2184,7 +2193,8 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
file_path = os.path.join(diretorio, |
|
|
file_path = os.path.join(diretorio, |
|
|
request.FILES['arquivo'].name) |
|
|
request.FILES['arquivo'].name) |
|
|
shutil.copy2(tmp_name, file_path) |
|
|
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() |
|
|
doc.save() |
|
|
os.remove(tmp_name) |
|
|
os.remove(tmp_name) |
|
|
|
|
|
|
|
|
@ -2210,17 +2220,17 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
|
|
|
|
|
|
# Verifica se os campos foram preenchidos |
|
|
# Verifica se os campos foram preenchidos |
|
|
if not self.request.GET.get('tipo', " "): |
|
|
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) |
|
|
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', " "): |
|
|
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) |
|
|
messages.add_message(self.request, messages.ERROR, msg) |
|
|
|
|
|
|
|
|
return context |
|
|
return context |
|
|
|
|
|
|
|
|
if not self.request.GET.get('data_apresentacao_0', " ") or not self.request.GET.get('data_apresentacao_1', " "): |
|
|
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) |
|
|
messages.add_message(self.request, messages.ERROR, msg) |
|
|
return context |
|
|
return context |
|
|
|
|
|
|
|
|
@ -2229,8 +2239,10 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
'numero', '-ano') |
|
|
'numero', '-ano') |
|
|
principal = MateriaLegislativa.objects.get(pk=self.kwargs['pk']) |
|
|
principal = MateriaLegislativa.objects.get(pk=self.kwargs['pk']) |
|
|
not_list = [self.kwargs['pk']] + \ |
|
|
not_list = [self.kwargs['pk']] + \ |
|
|
[m for m in principal.materia_principal_set.all().values_list('materia_anexada_id', flat=True)] |
|
|
[m for m in principal.materia_principal_set.all( |
|
|
context['object_list'] = context['object_list'].exclude(pk__in=not_list) |
|
|
).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['temp_object_list'] = context['object_list'] |
|
|
context['object_list'] = [] |
|
|
context['object_list'] = [] |
|
|
@ -2238,7 +2250,7 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
materia_anexada = obj |
|
|
materia_anexada = obj |
|
|
ciclico = False |
|
|
ciclico = False |
|
|
anexadas_anexada = Anexada.objects.filter( |
|
|
anexadas_anexada = Anexada.objects.filter( |
|
|
materia_principal = materia_anexada |
|
|
materia_principal=materia_anexada |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
while anexadas_anexada and not ciclico: |
|
|
while anexadas_anexada and not ciclico: |
|
|
@ -2307,7 +2319,8 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
msg = _('Matéria(s) anexada(s).') |
|
|
msg = _('Matéria(s) anexada(s).') |
|
|
messages.add_message(request, messages.SUCCESS, msg) |
|
|
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) |
|
|
return HttpResponseRedirect(success_url) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -2393,6 +2406,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
return self.get(self.request, kwargs, {'form':form}) |
|
|
return self.get(self.request, kwargs, {'form':form}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): |
|
|
class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): |
|
|
filterset_class = TramitacaoEmLoteFilterSet |
|
|
filterset_class = TramitacaoEmLoteFilterSet |
|
|
|
|
|
|
|
|
|