|
|
|
@ -7,7 +7,7 @@ from crispy_forms.layout import HTML |
|
|
|
from django.contrib import messages |
|
|
|
from django.contrib.auth.decorators import permission_required |
|
|
|
from django.contrib.auth.mixins import PermissionRequiredMixin |
|
|
|
from django.core.exceptions import ObjectDoesNotExist |
|
|
|
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned |
|
|
|
from django.core.urlresolvers import reverse |
|
|
|
from django.db.models import Max |
|
|
|
from django.http import HttpResponse, JsonResponse |
|
|
|
@ -21,6 +21,7 @@ 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.models import Autor, CasaLegislativa |
|
|
|
@ -92,6 +93,8 @@ def autores_ja_adicionados(materia_pk): |
|
|
|
|
|
|
|
|
|
|
|
def proposicao_texto(request, pk): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
logger.info('- Tentando obter objeto Proposicao.') |
|
|
|
proposicao = Proposicao.objects.get(pk=pk) |
|
|
|
|
|
|
|
if proposicao.texto_original: |
|
|
|
@ -113,6 +116,7 @@ def proposicao_texto(request, pk): |
|
|
|
response['Content-Disposition'] = ( |
|
|
|
'inline; filename="%s"' % arquivo.name.split('/')[-1]) |
|
|
|
return response |
|
|
|
logger.error('- Objeto Proposicao não encontrado.') |
|
|
|
raise Http404 |
|
|
|
|
|
|
|
|
|
|
|
@ -171,21 +175,26 @@ class CriarProtocoloMateriaView(CreateView): |
|
|
|
'pk': materia.pk}) |
|
|
|
|
|
|
|
def get_context_data(self, **kwargs): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
context = super( |
|
|
|
CriarProtocoloMateriaView, self).get_context_data(**kwargs) |
|
|
|
|
|
|
|
try: |
|
|
|
logger.info("- Tentando obter objeto Protocolo.") |
|
|
|
protocolo = Protocolo.objects.get(pk=self.kwargs['pk']) |
|
|
|
except ObjectDoesNotExist: |
|
|
|
logger.error("- Objeto Protocolo não encontrado.") |
|
|
|
raise Http404() |
|
|
|
|
|
|
|
numero = 1 |
|
|
|
try: |
|
|
|
logger.info("- Tentando obter materias do último ano.") |
|
|
|
materias_ano = MateriaLegislativa.objects.filter( |
|
|
|
ano=protocolo.ano, |
|
|
|
tipo=protocolo.tipo_materia).latest('numero') |
|
|
|
numero = materias_ano.numero + 1 |
|
|
|
except ObjectDoesNotExist: |
|
|
|
logger.error("- Não foram encontradas matérias no último ano. Definido 1 como padrão.") |
|
|
|
pass # numero ficou com o valor padrão 1 acima |
|
|
|
|
|
|
|
context['form'].fields['tipo'].initial = protocolo.tipo_materia |
|
|
|
@ -198,11 +207,14 @@ class CriarProtocoloMateriaView(CreateView): |
|
|
|
return context |
|
|
|
|
|
|
|
def form_valid(self, form): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
materia = form.save() |
|
|
|
|
|
|
|
try: |
|
|
|
logger.info("- Tentando obter objeto Procolo.") |
|
|
|
protocolo = Protocolo.objects.get(pk=self.kwargs['pk']) |
|
|
|
except ObjectDoesNotExist: |
|
|
|
logger.error('- Objeto Protocolo não encontrado.') |
|
|
|
raise Http404() |
|
|
|
|
|
|
|
if protocolo.autor: |
|
|
|
@ -286,14 +298,17 @@ class ProposicaoTaView(IntegracaoTaView): |
|
|
|
|
|
|
|
@permission_required('materia.detail_materialegislativa') |
|
|
|
def recuperar_materia(request): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
tipo = TipoMateriaLegislativa.objects.get(pk=request.GET['tipo']) |
|
|
|
ano = request.GET.get('ano', '') |
|
|
|
|
|
|
|
numeracao = None |
|
|
|
try: |
|
|
|
logger.info("Tentando obter numeração da matéria.") |
|
|
|
numeracao = sapl.base.models.AppConfig.objects.last( |
|
|
|
).sequencia_numeracao |
|
|
|
except AttributeError: |
|
|
|
except AttributeError as e: |
|
|
|
logger.error("- Excessão " + str(e) + ". Numeracao da matéria definida como None.") |
|
|
|
pass |
|
|
|
|
|
|
|
if tipo.sequencia_numeracao: |
|
|
|
@ -521,13 +536,16 @@ class RetornarProposicao(UpdateView): |
|
|
|
permission_required = ('materia.detail_proposicao_enviada', ) |
|
|
|
|
|
|
|
def dispatch(self, request, *args, **kwargs): |
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
try: |
|
|
|
logger.info("Tentando obter objeto Proposicao.") |
|
|
|
p = Proposicao.objects.get(id=kwargs['pk']) |
|
|
|
except: |
|
|
|
logger.error("Objeto Proposicao não encontrado.") |
|
|
|
raise Http404() |
|
|
|
|
|
|
|
if p.autor.user != request.user: |
|
|
|
logger.error("'Usuário sem acesso a esta opção.'") |
|
|
|
messages.error( |
|
|
|
request, |
|
|
|
'Usuário sem acesso a esta opção.' % |
|
|
|
@ -554,12 +572,14 @@ class ConfirmarProposicao(PermissionRequiredForAppCrudMixin, UpdateView): |
|
|
|
return self.object.results['url'] |
|
|
|
|
|
|
|
def get_object(self, queryset=None): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
try: |
|
|
|
""" |
|
|
|
Não deve haver acesso na rotina de confirmação a proposições: |
|
|
|
já recebidas -> data_recebimento != None |
|
|
|
não enviadas -> data_envio == None |
|
|
|
""" |
|
|
|
logger.info("- Tentando obter objeto Proposicao.") |
|
|
|
proposicao = Proposicao.objects.get(pk=self.kwargs['pk'], |
|
|
|
data_envio__isnull=False, |
|
|
|
data_recebimento__isnull=True) |
|
|
|
@ -576,9 +596,11 @@ class ConfirmarProposicao(PermissionRequiredForAppCrudMixin, UpdateView): |
|
|
|
if hasher == 'P%s/%s' % (self.kwargs['hash'], proposicao.pk): |
|
|
|
self.object = proposicao |
|
|
|
except: |
|
|
|
logger.error("- Objeto Proposicao não encontrado.") |
|
|
|
raise Http404() |
|
|
|
|
|
|
|
if not self.object: |
|
|
|
logger.error("- Objeto vazio.") |
|
|
|
raise Http404() |
|
|
|
|
|
|
|
return self.object |
|
|
|
@ -704,6 +726,7 @@ class ProposicaoCrud(Crud): |
|
|
|
return context |
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
action = request.GET.get('action', '') |
|
|
|
|
|
|
|
if not action: |
|
|
|
@ -736,17 +759,21 @@ class ProposicaoCrud(Crud): |
|
|
|
messages.success(request, _( |
|
|
|
'Proposição enviada com sucesso.')) |
|
|
|
try: |
|
|
|
logger.info("- Tentando obter objeto MateriaLegislativa.") |
|
|
|
numero = MateriaLegislativa.objects.filter(tipo=p.tipo.tipo_conteudo_related, |
|
|
|
ano=p.ano).last().numero + 1 |
|
|
|
messages.success(request, _( |
|
|
|
'%s : nº %s de %s <br>Atenção! Este número é apenas um provável ' |
|
|
|
'número que pode não corresponder com a realidade' |
|
|
|
% (p.tipo, numero, p.ano))) |
|
|
|
except ValueError: |
|
|
|
except ValueError as e: |
|
|
|
logger.error("- " + str(e)) |
|
|
|
pass |
|
|
|
except AttributeError: |
|
|
|
except AttributeError as e: |
|
|
|
logger.error("- " + str(e)) |
|
|
|
pass |
|
|
|
except TypeError: |
|
|
|
except TypeError as e: |
|
|
|
logger.error("- " + str(e)) |
|
|
|
pass |
|
|
|
|
|
|
|
elif action == 'return': |
|
|
|
@ -774,10 +801,12 @@ class ProposicaoCrud(Crud): |
|
|
|
kwargs={'pk': kwargs['pk']})) |
|
|
|
|
|
|
|
def dispatch(self, request, *args, **kwargs): |
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
try: |
|
|
|
logger.info("- Tentando obter objeto Proposicao") |
|
|
|
p = Proposicao.objects.get(id=kwargs['pk']) |
|
|
|
except: |
|
|
|
logger.error("- Erro ao obter proposicao. Retornando 404.") |
|
|
|
raise Http404() |
|
|
|
|
|
|
|
if not self.has_permission(): |
|
|
|
@ -974,15 +1003,19 @@ class RelatoriaCrud(MasterDetailCrud): |
|
|
|
form_class = RelatoriaForm |
|
|
|
|
|
|
|
def get_context_data(self, **kwargs): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
context = super().get_context_data(**kwargs) |
|
|
|
|
|
|
|
try: |
|
|
|
logger.info("- Tentando obter objeto Comissao.") |
|
|
|
comissao = Comissao.objects.get( |
|
|
|
pk=context['form'].initial['comissao']) |
|
|
|
except: |
|
|
|
logger.error("- Objeto Comissão não encontrado.") |
|
|
|
pass |
|
|
|
|
|
|
|
else: |
|
|
|
logger.info("- Objeto Comissao obtido com sucesso.") |
|
|
|
composicao = comissao.composicao_set.order_by( |
|
|
|
'-periodo__data_inicio').first() |
|
|
|
participacao = Participacao.objects.filter( |
|
|
|
@ -1019,14 +1052,18 @@ class RelatoriaCrud(MasterDetailCrud): |
|
|
|
form_class = RelatoriaForm |
|
|
|
|
|
|
|
def get_context_data(self, **kwargs): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
context = super().get_context_data(**kwargs) |
|
|
|
|
|
|
|
try: |
|
|
|
logger.info("- Tentando obter objeto Comissao.") |
|
|
|
comissao = Comissao.objects.get( |
|
|
|
pk=context['form'].initial['comissao']) |
|
|
|
except ObjectDoesNotExist: |
|
|
|
logger.error("- Objeto Comissão não encontrado.") |
|
|
|
pass |
|
|
|
else: |
|
|
|
logger.info("- Objeto Comissao obtido com sucesso.") |
|
|
|
composicao = comissao.composicao_set.order_by( |
|
|
|
'-periodo__data_inicio').first() |
|
|
|
participacao = Participacao.objects.filter( |
|
|
|
@ -1097,6 +1134,8 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
|
return context |
|
|
|
|
|
|
|
def form_valid(self, form): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
self.object = form.save() |
|
|
|
|
|
|
|
if form.instance.status.indicador == 'F': |
|
|
|
@ -1106,6 +1145,7 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
|
form.instance.materia.save() |
|
|
|
|
|
|
|
try: |
|
|
|
logger.info("Tentando enviar Tramitacao.") |
|
|
|
tramitacao_signal.send(sender=Tramitacao, |
|
|
|
post=self.object, |
|
|
|
request=self.request) |
|
|
|
@ -1114,6 +1154,9 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
|
msg = _('Tramitação criada, mas e-mail de acompanhamento ' |
|
|
|
'de matéria não enviado. Há problemas na configuração ' |
|
|
|
'do e-mail.') |
|
|
|
logger.error('- Tramitação criada, mas e-mail de acompanhamento ' |
|
|
|
'de matéria não enviado. Há problemas na configuração ' |
|
|
|
'do e-mail.') |
|
|
|
messages.add_message(self.request, messages.ERROR, msg) |
|
|
|
return HttpResponseRedirect(self.get_success_url()) |
|
|
|
return super().form_valid(form) |
|
|
|
@ -1124,6 +1167,7 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
|
layout_key = 'TramitacaoUpdate' |
|
|
|
|
|
|
|
def form_valid(self, form): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
self.object = form.save() |
|
|
|
|
|
|
|
if form.instance.status.indicador == 'F': |
|
|
|
@ -1133,6 +1177,7 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
|
form.instance.materia.save() |
|
|
|
|
|
|
|
try: |
|
|
|
logger.info("Tentando enviar Tramitacao.") |
|
|
|
tramitacao_signal.send(sender=Tramitacao, |
|
|
|
post=self.object, |
|
|
|
request=self.request) |
|
|
|
@ -1141,6 +1186,9 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
|
msg = _('Tramitação atualizada, mas e-mail de acompanhamento ' |
|
|
|
'de matéria não enviado. Há problemas na configuração ' |
|
|
|
'do e-mail.') |
|
|
|
logger.error('- Tramitação atualizada, mas e-mail de acompanhamento ' |
|
|
|
'de matéria não enviado. Há problemas na configuração ' |
|
|
|
'do e-mail.') |
|
|
|
messages.add_message(self.request, messages.ERROR, msg) |
|
|
|
return HttpResponseRedirect(self.get_success_url()) |
|
|
|
return super().form_valid(form) |
|
|
|
@ -1516,20 +1564,24 @@ class AcompanhamentoConfirmarView(TemplateView): |
|
|
|
kwargs={'pk': self.kwargs['pk']}) |
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
materia_id = kwargs['pk'] |
|
|
|
hash_txt = request.GET.get('hash_txt', '') |
|
|
|
|
|
|
|
try: |
|
|
|
logger.info("- Tentando obter objeto AcompanhamentoMateria.") |
|
|
|
acompanhar = AcompanhamentoMateria.objects.get( |
|
|
|
materia_id=materia_id, |
|
|
|
hash=hash_txt) |
|
|
|
except ObjectDoesNotExist: |
|
|
|
logger.error("- Objeto AcompanhamentoMateria não encontrado.") |
|
|
|
raise Http404() |
|
|
|
# except MultipleObjectsReturned: |
|
|
|
except MultipleObjectsReturned as e: |
|
|
|
# A melhor solução deve ser permitir que a exceção |
|
|
|
# (MultipleObjectsReturned) seja lançada e vá para o log, |
|
|
|
# pois só poderá ser causada por um erro de desenvolvimente |
|
|
|
|
|
|
|
logger.error("- " + str(e)) |
|
|
|
pass |
|
|
|
acompanhar.confirmado = True |
|
|
|
acompanhar.save() |
|
|
|
|
|
|
|
@ -1545,13 +1597,16 @@ class AcompanhamentoExcluirView(TemplateView): |
|
|
|
kwargs={'pk': self.kwargs['pk']}) |
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
materia_id = kwargs['pk'] |
|
|
|
hash_txt = request.GET.get('hash_txt', '') |
|
|
|
|
|
|
|
try: |
|
|
|
logger.info("- Tentando obter objeto AcompanhamentoMateria.") |
|
|
|
AcompanhamentoMateria.objects.get(materia_id=materia_id, |
|
|
|
hash=hash_txt).delete() |
|
|
|
except ObjectDoesNotExist: |
|
|
|
logger.error("- Objeto AcompanhamentoMateria não encontrado.") |
|
|
|
pass |
|
|
|
|
|
|
|
return HttpResponseRedirect(self.get_success_url()) |
|
|
|
@ -1814,6 +1869,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
|
|
|
|
|
|
|
|
|
def post(self, request, *args, **kwargs): |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
marcadas = request.POST.getlist('materia_id') |
|
|
|
|
|
|
|
tz = timezone.get_current_timezone() |
|
|
|
@ -1869,10 +1925,14 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
|
) |
|
|
|
t.save() |
|
|
|
try: |
|
|
|
logger.info("Tentando enviar tramitação.") |
|
|
|
tramitacao_signal.send(sender=Tramitacao, |
|
|
|
post=t, |
|
|
|
request=self.request) |
|
|
|
except Exception: |
|
|
|
logger.error('Tramitação criada, mas e-mail de acompanhamento ' |
|
|
|
'de matéria não enviado. Há problemas na configuração ' |
|
|
|
'do e-mail.') |
|
|
|
flag_error = True |
|
|
|
if flag_error: |
|
|
|
msg = _('Tramitação criada, mas e-mail de acompanhamento ' |
|
|
|
@ -1890,6 +1950,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
|
materia.save() |
|
|
|
|
|
|
|
msg = _('Tramitação completa.') |
|
|
|
logger.info('Tramitação completa.') |
|
|
|
messages.add_message(request, messages.SUCCESS, msg) |
|
|
|
return self.get(request, self.kwargs) |
|
|
|
|
|
|
|
|