|
|
@ -1,46 +1,43 @@ |
|
|
|
|
|
|
|
|
|
|
|
from datetime import datetime |
|
|
|
|
|
from datetime import datetime |
|
|
|
|
|
from io import BytesIO |
|
|
import itertools |
|
|
import itertools |
|
|
import logging |
|
|
import logging |
|
|
import os |
|
|
import os |
|
|
import sapl |
|
|
from random import choice |
|
|
import shutil |
|
|
import shutil |
|
|
|
|
|
from string import ascii_letters, digits |
|
|
import tempfile |
|
|
import tempfile |
|
|
import weasyprint |
|
|
|
|
|
import time |
|
|
import time |
|
|
|
|
|
|
|
|
from crispy_forms.layout import HTML |
|
|
|
|
|
from datetime import datetime |
|
|
|
|
|
from random import choice |
|
|
|
|
|
from string import ascii_letters, digits |
|
|
|
|
|
from datetime import datetime |
|
|
|
|
|
from PyPDF4 import PdfFileReader, PdfFileMerger |
|
|
|
|
|
import zipfile |
|
|
import zipfile |
|
|
from io import BytesIO |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from PyPDF4 import PdfFileReader, PdfFileMerger |
|
|
|
|
|
from crispy_forms.layout import HTML |
|
|
from django.conf import settings |
|
|
from django.conf import settings |
|
|
from django.contrib import messages |
|
|
from django.contrib import messages |
|
|
from django.contrib.auth.decorators import permission_required |
|
|
from django.contrib.auth.decorators import permission_required |
|
|
from django.contrib.auth.mixins import PermissionRequiredMixin |
|
|
from django.contrib.auth.mixins import PermissionRequiredMixin |
|
|
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, ValidationError |
|
|
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, ValidationError |
|
|
from django.urls import reverse |
|
|
|
|
|
from django.db.models import Max, Q |
|
|
from django.db.models import Max, Q |
|
|
from django.http import HttpResponse, JsonResponse |
|
|
from django.http import HttpResponse, JsonResponse |
|
|
from django.http.response import Http404, HttpResponseRedirect |
|
|
from django.http.response import Http404, HttpResponseRedirect |
|
|
from django.shortcuts import get_object_or_404, redirect |
|
|
from django.shortcuts import get_object_or_404, redirect |
|
|
|
|
|
from django.shortcuts import render |
|
|
from django.template import loader, RequestContext |
|
|
from django.template import loader, RequestContext |
|
|
|
|
|
from django.urls import reverse |
|
|
from django.utils import formats, timezone |
|
|
from django.utils import formats, timezone |
|
|
from django.utils.translation import ugettext_lazy as _ |
|
|
from django.utils.translation import ugettext_lazy as _ |
|
|
from django.views.generic import CreateView, ListView, TemplateView, UpdateView |
|
|
from django.views.generic import CreateView, ListView, TemplateView, UpdateView |
|
|
from django.views.generic.base import RedirectView |
|
|
from django.views.generic.base import RedirectView |
|
|
from django.views.generic.edit import FormView |
|
|
from django.views.generic.edit import FormView |
|
|
from django.shortcuts import render |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from django_filters.views import FilterView |
|
|
from django_filters.views import FilterView |
|
|
|
|
|
import weasyprint |
|
|
|
|
|
|
|
|
|
|
|
import sapl |
|
|
from sapl.base.email_utils import do_envia_email_confirmacao |
|
|
from sapl.base.email_utils import do_envia_email_confirmacao |
|
|
from sapl.base.models import Autor, CasaLegislativa, AppConfig as BaseAppConfig |
|
|
from sapl.base.models import Autor, CasaLegislativa, AppConfig as BaseAppConfig |
|
|
from sapl.base.signals import tramitacao_signal, post_delete_signal, post_save_signal |
|
|
from sapl.base.signals import tramitacao_signal |
|
|
from sapl.comissoes.models import Comissao, Participacao, Composicao |
|
|
from sapl.comissoes.models import Comissao, Participacao, Composicao |
|
|
from sapl.compilacao.models import STATUS_TA_IMMUTABLE_RESTRICT, STATUS_TA_PRIVATE |
|
|
from sapl.compilacao.models import STATUS_TA_IMMUTABLE_RESTRICT, STATUS_TA_PRIVATE |
|
|
from sapl.compilacao.views import IntegracaoTaView |
|
|
from sapl.compilacao.views import IntegracaoTaView |
|
|
@ -812,7 +809,8 @@ class ProposicaoCrud(Crud): |
|
|
elif p.data_envio: |
|
|
elif p.data_envio: |
|
|
msg_error = _('Proposição já foi enviada.') |
|
|
msg_error = _('Proposição já foi enviada.') |
|
|
elif not p.texto_original and not p.texto_articulado.exists(): |
|
|
elif not p.texto_original and not p.texto_articulado.exists(): |
|
|
msg_error = _('Proposição não possui nenhum tipo de Texto associado.') |
|
|
msg_error = _( |
|
|
|
|
|
'Proposição não possui nenhum tipo de Texto associado.') |
|
|
else: |
|
|
else: |
|
|
if p.texto_articulado.exists(): |
|
|
if p.texto_articulado.exists(): |
|
|
ta = p.texto_articulado.first() |
|
|
ta = p.texto_articulado.first() |
|
|
@ -820,7 +818,8 @@ class ProposicaoCrud(Crud): |
|
|
ta.editing_locked = True |
|
|
ta.editing_locked = True |
|
|
ta.save() |
|
|
ta.save() |
|
|
|
|
|
|
|
|
receber_recibo = BaseAppConfig.attr('receber_recibo_proposicao') |
|
|
receber_recibo = BaseAppConfig.attr( |
|
|
|
|
|
'receber_recibo_proposicao') |
|
|
|
|
|
|
|
|
if not receber_recibo: |
|
|
if not receber_recibo: |
|
|
ta = p.texto_articulado.first() |
|
|
ta = p.texto_articulado.first() |
|
|
@ -830,7 +829,8 @@ class ProposicaoCrud(Crud): |
|
|
p.data_envio = timezone.now() |
|
|
p.data_envio = timezone.now() |
|
|
p.save() |
|
|
p.save() |
|
|
|
|
|
|
|
|
messages.success(request, _('Proposição enviada com sucesso.')) |
|
|
messages.success(request, _( |
|
|
|
|
|
'Proposição enviada com sucesso.')) |
|
|
try: |
|
|
try: |
|
|
self.logger.debug("User={}. Tentando obter número do objeto MateriaLegislativa " |
|
|
self.logger.debug("User={}. Tentando obter número do objeto MateriaLegislativa " |
|
|
"com atributos tipo={} e ano={}." |
|
|
"com atributos tipo={} e ano={}." |
|
|
@ -845,13 +845,16 @@ class ProposicaoCrud(Crud): |
|
|
"número que pode não corresponder com a realidade" |
|
|
"número que pode não corresponder com a realidade" |
|
|
.format(p.tipo, numero, p.ano))) |
|
|
.format(p.tipo, numero, p.ano))) |
|
|
except ValueError as e: |
|
|
except ValueError as e: |
|
|
self.logger.warning("User=" + username + ". " + str(e)) |
|
|
self.logger.warning( |
|
|
|
|
|
"User=" + username + ". " + str(e)) |
|
|
pass |
|
|
pass |
|
|
except AttributeError as e: |
|
|
except AttributeError as e: |
|
|
self.logger.warning("User=" + username + ". " + str(e)) |
|
|
self.logger.warning( |
|
|
|
|
|
"User=" + username + ". " + str(e)) |
|
|
pass |
|
|
pass |
|
|
except TypeError as e: |
|
|
except TypeError as e: |
|
|
self.logger.warning("User=" + username + ". " + str(e)) |
|
|
self.logger.warning( |
|
|
|
|
|
"User=" + username + ". " + str(e)) |
|
|
pass |
|
|
pass |
|
|
|
|
|
|
|
|
elif action == 'return': |
|
|
elif action == 'return': |
|
|
@ -862,7 +865,8 @@ class ProposicaoCrud(Crud): |
|
|
elif p.data_recebimento: |
|
|
elif p.data_recebimento: |
|
|
self.logger.warning("User={}. Proposição (numero={}) já foi recebida, " |
|
|
self.logger.warning("User={}. Proposição (numero={}) já foi recebida, " |
|
|
"não é possível retorná-la.".format(username, p.numero_proposicao)) |
|
|
"não é possível retorná-la.".format(username, p.numero_proposicao)) |
|
|
msg_error = _('Proposição já foi recebida, não é possível retorná-la.') |
|
|
msg_error = _( |
|
|
|
|
|
'Proposição já foi recebida, não é possível retorná-la.') |
|
|
else: |
|
|
else: |
|
|
p.data_envio = None |
|
|
p.data_envio = None |
|
|
p.save() |
|
|
p.save() |
|
|
@ -873,7 +877,8 @@ class ProposicaoCrud(Crud): |
|
|
ta.save() |
|
|
ta.save() |
|
|
self.logger.info("User={}. Proposição (numero={}) Retornada com sucesso." |
|
|
self.logger.info("User={}. Proposição (numero={}) Retornada com sucesso." |
|
|
.format(username, p.numero_proposicao)) |
|
|
.format(username, p.numero_proposicao)) |
|
|
messages.success(request, _('Proposição Retornada com sucesso.')) |
|
|
messages.success(request, _( |
|
|
|
|
|
'Proposição Retornada com sucesso.')) |
|
|
|
|
|
|
|
|
if msg_error: |
|
|
if msg_error: |
|
|
messages.error(request, msg_error) |
|
|
messages.error(request, msg_error) |
|
|
@ -884,7 +889,8 @@ class ProposicaoCrud(Crud): |
|
|
def dispatch(self, request, *args, **kwargs): |
|
|
def dispatch(self, request, *args, **kwargs): |
|
|
username = request.user.username |
|
|
username = request.user.username |
|
|
try: |
|
|
try: |
|
|
self.logger.debug("User={}. Tentando obter objeto Proposicao com pk={}".format(username, kwargs['pk'])) |
|
|
self.logger.debug("User={}. Tentando obter objeto Proposicao com pk={}".format( |
|
|
|
|
|
username, kwargs['pk'])) |
|
|
p = Proposicao.objects.get(id=kwargs['pk']) |
|
|
p = Proposicao.objects.get(id=kwargs['pk']) |
|
|
except Exception as e: |
|
|
except Exception as e: |
|
|
self.logger.warning("User={}. Erro ao obter proposicao com pk={}. Retornando 404. {}" |
|
|
self.logger.warning("User={}. Erro ao obter proposicao com pk={}. Retornando 404. {}" |
|
|
@ -915,7 +921,8 @@ class ProposicaoCrud(Crud): |
|
|
logger = logging.getLogger(__name__) |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
def _action_is_valid(self, request, *args, **kwargs): |
|
|
def _action_is_valid(self, request, *args, **kwargs): |
|
|
proposicao = Proposicao.objects.filter(id=kwargs['pk']).values_list('data_envio', 'data_recebimento') |
|
|
proposicao = Proposicao.objects.filter( |
|
|
|
|
|
id=kwargs['pk']).values_list('data_envio', 'data_recebimento') |
|
|
|
|
|
|
|
|
username = request.user.username |
|
|
username = request.user.username |
|
|
|
|
|
|
|
|
@ -923,7 +930,8 @@ class ProposicaoCrud(Crud): |
|
|
if proposicao[0][0] and proposicao[0][1]: |
|
|
if proposicao[0][0] and proposicao[0][1]: |
|
|
self.logger.warning("User={}. Proposição (id={}) já foi enviada e recebida." |
|
|
self.logger.warning("User={}. Proposição (id={}) já foi enviada e recebida." |
|
|
"Não pode mais ser excluida.".format(username, kwargs['pk'])) |
|
|
"Não pode mais ser excluida.".format(username, kwargs['pk'])) |
|
|
msg = _('Proposição já foi enviada e recebida. Não pode mais ser excluida.') |
|
|
msg = _( |
|
|
|
|
|
'Proposição já foi enviada e recebida. Não pode mais ser excluida.') |
|
|
elif proposicao[0][0] and not proposicao[0][1]: |
|
|
elif proposicao[0][0] and not proposicao[0][1]: |
|
|
self.logger.warning("""\ |
|
|
self.logger.warning("""\ |
|
|
User={}. Proposição (id={}) já foi enviada, mas ainda não recebida pelo protocolo. \ |
|
|
User={}. Proposição (id={}) já foi enviada, mas ainda não recebida pelo protocolo. \ |
|
|
@ -976,7 +984,8 @@ class ProposicaoCrud(Crud): |
|
|
return super().form_valid(form) |
|
|
return super().form_valid(form) |
|
|
|
|
|
|
|
|
def _action_is_valid(self, request, *args, **kwargs): |
|
|
def _action_is_valid(self, request, *args, **kwargs): |
|
|
proposicao = Proposicao.objects.filter(id=kwargs['pk']).values_list('data_envio', 'data_recebimento') |
|
|
proposicao = Proposicao.objects.filter( |
|
|
|
|
|
id=kwargs['pk']).values_list('data_envio', 'data_recebimento') |
|
|
|
|
|
|
|
|
username = request.user.username |
|
|
username = request.user.username |
|
|
|
|
|
|
|
|
@ -985,7 +994,8 @@ class ProposicaoCrud(Crud): |
|
|
if proposicao[0][0] and proposicao[0][1]: |
|
|
if proposicao[0][0] and proposicao[0][1]: |
|
|
self.logger.warning('User={}. Proposição (id={}) já foi enviada e recebida. ' |
|
|
self.logger.warning('User={}. Proposição (id={}) já foi enviada e recebida. ' |
|
|
'Não pode mais ser editada'.format(username, kwargs['pk'])) |
|
|
'Não pode mais ser editada'.format(username, kwargs['pk'])) |
|
|
msg = _('Proposição já foi enviada e recebida. Não pode mais ser editada') |
|
|
msg = _( |
|
|
|
|
|
'Proposição já foi enviada e recebida. Não pode mais ser editada') |
|
|
elif proposicao[0][0] and not proposicao[0][1]: |
|
|
elif proposicao[0][0] and not proposicao[0][1]: |
|
|
self.logger.warning("""\ |
|
|
self.logger.warning("""\ |
|
|
User={}. Proposição (id={}) já foi enviada, mas ainda não recebida pelo protocolo. \ |
|
|
User={}. Proposição (id={}) já foi enviada, mas ainda não recebida pelo protocolo. \ |
|
|
@ -1064,14 +1074,17 @@ class ProposicaoCrud(Crud): |
|
|
if obj.data_recebimento is None: |
|
|
if obj.data_recebimento is None: |
|
|
obj.data_recebimento = 'Não recebida' if obj.data_envio else 'Não enviada' |
|
|
obj.data_recebimento = 'Não recebida' if obj.data_envio else 'Não enviada' |
|
|
else: |
|
|
else: |
|
|
obj.data_recebimento = timezone.localtime(obj.data_recebimento) |
|
|
obj.data_recebimento = timezone.localtime( |
|
|
obj.data_recebimento = formats.date_format(obj.data_recebimento, "DATETIME_FORMAT") |
|
|
obj.data_recebimento) |
|
|
|
|
|
obj.data_recebimento = formats.date_format( |
|
|
|
|
|
obj.data_recebimento, "DATETIME_FORMAT") |
|
|
if obj.data_envio is None: |
|
|
if obj.data_envio is None: |
|
|
obj.data_envio = 'Em elaboração...' |
|
|
obj.data_envio = 'Em elaboração...' |
|
|
else: |
|
|
else: |
|
|
|
|
|
|
|
|
obj.data_envio = timezone.localtime(obj.data_envio) |
|
|
obj.data_envio = timezone.localtime(obj.data_envio) |
|
|
obj.data_envio = formats.date_format(obj.data_envio, "DATETIME_FORMAT") |
|
|
obj.data_envio = formats.date_format( |
|
|
|
|
|
obj.data_envio, "DATETIME_FORMAT") |
|
|
|
|
|
|
|
|
return [self._as_row(obj) for obj in object_list] |
|
|
return [self._as_row(obj) for obj in object_list] |
|
|
|
|
|
|
|
|
@ -1149,7 +1162,8 @@ class RelatoriaCrud(MasterDetailCrud): |
|
|
materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) |
|
|
materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) |
|
|
|
|
|
|
|
|
loc_atual = Tramitacao.objects.\ |
|
|
loc_atual = Tramitacao.objects.\ |
|
|
filter(materia=materia).order_by('-data_tramitacao', '-id').first() |
|
|
filter(materia=materia).order_by( |
|
|
|
|
|
'-data_tramitacao', '-id').first() |
|
|
|
|
|
|
|
|
if loc_atual is None: |
|
|
if loc_atual is None: |
|
|
localizacao = -1 |
|
|
localizacao = -1 |
|
|
@ -1353,7 +1367,8 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
url = reverse('sapl.materia:tramitacao_list', |
|
|
url = reverse('sapl.materia:tramitacao_list', |
|
|
kwargs={'pk': materia.id}) |
|
|
kwargs={'pk': materia.id}) |
|
|
|
|
|
|
|
|
ultima_tramitacao = materia.tramitacao_set.order_by('-data_tramitacao', '-id').first() |
|
|
ultima_tramitacao = materia.tramitacao_set.order_by( |
|
|
|
|
|
'-data_tramitacao', '-id').first() |
|
|
|
|
|
|
|
|
if tramitacao.pk != ultima_tramitacao.pk: |
|
|
if tramitacao.pk != ultima_tramitacao.pk: |
|
|
username = request.user.username |
|
|
username = request.user.username |
|
|
@ -1373,20 +1388,22 @@ class TramitacaoCrud(MasterDetailCrud): |
|
|
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: |
|
|
tram_anexada = ma.tramitacao_set.order_by('-data_tramitacao', '-id').first() |
|
|
tram_anexada = ma.tramitacao_set.order_by( |
|
|
|
|
|
'-data_tramitacao', '-id').first() |
|
|
if compara_tramitacoes_mat(tram_anexada, tramitacao): |
|
|
if compara_tramitacoes_mat(tram_anexada, tramitacao): |
|
|
tramitacoes_deletar.append(tram_anexada) |
|
|
tramitacoes_deletar.append(tram_anexada) |
|
|
if ma.tramitacao_set.count() == 0: |
|
|
if ma.tramitacao_set.count() == 0: |
|
|
ma.em_tramitacao = False |
|
|
ma.em_tramitacao = False |
|
|
ma.save() |
|
|
ma.save() |
|
|
Tramitacao.objects.filter(id__in=[t.id for t in tramitacoes_deletar]).delete() |
|
|
Tramitacao.objects.filter( |
|
|
|
|
|
id__in=[t.id for t in tramitacoes_deletar]).delete() |
|
|
|
|
|
|
|
|
# TODO: otimizar para passar a lista de matérias |
|
|
# TODO: otimizar para passar a lista de matérias |
|
|
for tramitacao in tramitacoes_deletar: |
|
|
# for tramitacao in tramitacoes_deletar: |
|
|
post_delete_signal.send(sender=None, |
|
|
# post_delete_signal.send(sender=None, |
|
|
instance=tramitacao, |
|
|
# instance=tramitacao, |
|
|
operation='C', |
|
|
# operation='C', |
|
|
request=self.request) |
|
|
# request=self.request) |
|
|
|
|
|
|
|
|
return HttpResponseRedirect(url) |
|
|
return HttpResponseRedirect(url) |
|
|
|
|
|
|
|
|
@ -2164,7 +2181,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
|
|
|
|
|
|
if request.FILES['arquivo'].size > MAX_DOC_UPLOAD_SIZE: |
|
|
if request.FILES['arquivo'].size > MAX_DOC_UPLOAD_SIZE: |
|
|
msg = _("O arquivo Anexo de Texto Integral deve ser menor que {0:.1f} MB, \ |
|
|
msg = _("O arquivo Anexo de Texto Integral deve ser menor que {0:.1f} MB, \ |
|
|
o tamanho atual desse arquivo é {1:.1f} MB" \ |
|
|
o tamanho atual desse arquivo é {1:.1f} MB" |
|
|
.format((MAX_DOC_UPLOAD_SIZE / 1024) / 1024, (request.FILES['arquivo'].size / 1024) / 1024)) |
|
|
.format((MAX_DOC_UPLOAD_SIZE / 1024) / 1024, (request.FILES['arquivo'].size / 1024) / 1024)) |
|
|
messages.add_message(request, messages.ERROR, msg) |
|
|
messages.add_message(request, messages.ERROR, msg) |
|
|
return self.get(request, self.kwargs) |
|
|
return self.get(request, self.kwargs) |
|
|
@ -2356,7 +2373,6 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs): |
|
|
def get_context_data(self, **kwargs): |
|
|
context = super(PrimeiraTramitacaoEmLoteView, |
|
|
context = super(PrimeiraTramitacaoEmLoteView, |
|
|
self).get_context_data(**kwargs) |
|
|
self).get_context_data(**kwargs) |
|
|
@ -2413,27 +2429,27 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): |
|
|
form.save() |
|
|
form.save() |
|
|
|
|
|
|
|
|
msg = _('Tramitação completa.') |
|
|
msg = _('Tramitação completa.') |
|
|
self.logger.info('user=' + user.username + '. Tramitação completa.') |
|
|
self.logger.info('user=' + user.username + |
|
|
|
|
|
'. Tramitação completa.') |
|
|
messages.add_message(request, messages.SUCCESS, msg) |
|
|
messages.add_message(request, messages.SUCCESS, msg) |
|
|
return self.get_success_url() |
|
|
return self.get_success_url() |
|
|
|
|
|
|
|
|
return self.form_invalid(form) |
|
|
return self.form_invalid(form) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_success_url(self): |
|
|
def get_success_url(self): |
|
|
return HttpResponseRedirect(reverse('sapl.materia:primeira_tramitacao_em_lote')) |
|
|
return HttpResponseRedirect(reverse('sapl.materia:primeira_tramitacao_em_lote')) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def form_invalid(self, form, *args, **kwargs): |
|
|
def form_invalid(self, form, *args, **kwargs): |
|
|
for key, erros in form.errors.items(): |
|
|
for key, erros in form.errors.items(): |
|
|
if not key == '__all__': |
|
|
if not key == '__all__': |
|
|
[messages.add_message(self.request, messages.ERROR, form.fields[key].label + ": " + e) for e in erros] |
|
|
[messages.add_message( |
|
|
|
|
|
self.request, messages.ERROR, form.fields[key].label + ": " + e) for e in erros] |
|
|
else: |
|
|
else: |
|
|
[messages.add_message(self.request, messages.ERROR, e) for e in erros] |
|
|
[messages.add_message(self.request, messages.ERROR, e) |
|
|
|
|
|
for e in erros] |
|
|
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 |
|
|
|
|
|
|
|
|
@ -2724,8 +2740,10 @@ def create_zip_docacessorios(materia): |
|
|
docs_path = [os.path.join(MEDIA_ROOT, i) for i in docs] |
|
|
docs_path = [os.path.join(MEDIA_ROOT, i) for i in docs] |
|
|
|
|
|
|
|
|
if not docs_path: |
|
|
if not docs_path: |
|
|
raise FileNotFoundError("Não há arquivos PDF cadastrados em documentos acessorios.") |
|
|
raise FileNotFoundError( |
|
|
logger.info("Gerando compilado PDF de documentos acessorios com {} documentos".format(docs_path)) |
|
|
"Não há arquivos PDF cadastrados em documentos acessorios.") |
|
|
|
|
|
logger.info( |
|
|
|
|
|
"Gerando compilado PDF de documentos acessorios com {} documentos".format(docs_path)) |
|
|
|
|
|
|
|
|
_zipfile = BytesIO() |
|
|
_zipfile = BytesIO() |
|
|
|
|
|
|
|
|
@ -2737,7 +2755,8 @@ def create_zip_docacessorios(materia): |
|
|
logger.error(e) |
|
|
logger.error(e) |
|
|
raise e |
|
|
raise e |
|
|
|
|
|
|
|
|
external_name = "mat_{}_{}_docacessorios.zip".format(materia.numero, materia.ano) |
|
|
external_name = "mat_{}_{}_docacessorios.zip".format( |
|
|
|
|
|
materia.numero, materia.ano) |
|
|
return external_name, _zipfile.getvalue() |
|
|
return external_name, _zipfile.getvalue() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -2748,7 +2767,8 @@ def get_zip_docacessorios(request, pk): |
|
|
data = None |
|
|
data = None |
|
|
try: |
|
|
try: |
|
|
external_name, data = create_zip_docacessorios(materia) |
|
|
external_name, data = create_zip_docacessorios(materia) |
|
|
logger.info("user= {}. Gerou o zip compilado de documento acessorios".format(username)) |
|
|
logger.info( |
|
|
|
|
|
"user= {}. Gerou o zip compilado de documento acessorios".format(username)) |
|
|
except FileNotFoundError: |
|
|
except FileNotFoundError: |
|
|
logger.error("user= {}.Não há arquivos cadastrados".format(username)) |
|
|
logger.error("user= {}.Não há arquivos cadastrados".format(username)) |
|
|
msg = _('Não há arquivos cadastrados nesses documentos acessórios.') |
|
|
msg = _('Não há arquivos cadastrados nesses documentos acessórios.') |
|
|
@ -2787,9 +2807,11 @@ def create_pdf_docacessorios(materia): |
|
|
|
|
|
|
|
|
# TODO: o for-comprehension abaixo filtra os arquivos não PDF. |
|
|
# TODO: o for-comprehension abaixo filtra os arquivos não PDF. |
|
|
# TODO: o que fazer com os arquivos não PDF? converter? ignorar? |
|
|
# TODO: o que fazer com os arquivos não PDF? converter? ignorar? |
|
|
docs_path = [os.path.join(MEDIA_ROOT, i) for i in docs if i.lower().endswith('pdf')] |
|
|
docs_path = [os.path.join(MEDIA_ROOT, i) |
|
|
|
|
|
for i in docs if i.lower().endswith('pdf')] |
|
|
if not docs_path: |
|
|
if not docs_path: |
|
|
raise FileNotFoundError("Não há arquivos PDF cadastrados em documentos acessorios.") |
|
|
raise FileNotFoundError( |
|
|
|
|
|
"Não há arquivos PDF cadastrados em documentos acessorios.") |
|
|
logger.info("Gerando compilado PDF de documentos acessorios com {} documentos" |
|
|
logger.info("Gerando compilado PDF de documentos acessorios com {} documentos" |
|
|
.format(docs_path)) |
|
|
.format(docs_path)) |
|
|
merged_pdf = '{}/mat_{}_{}_docacessorios.pdf'.format( |
|
|
merged_pdf = '{}/mat_{}_{}_docacessorios.pdf'.format( |
|
|
@ -2805,7 +2827,8 @@ def create_pdf_docacessorios(materia): |
|
|
merger.write(data) |
|
|
merger.write(data) |
|
|
merger.close() |
|
|
merger.close() |
|
|
|
|
|
|
|
|
external_name = "mat_{}_{}_docacessorios.pdf".format(materia.numero, materia.ano) |
|
|
external_name = "mat_{}_{}_docacessorios.pdf".format( |
|
|
|
|
|
materia.numero, materia.ano) |
|
|
return external_name, data.getvalue() |
|
|
return external_name, data.getvalue() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -2815,7 +2838,8 @@ def get_pdf_docacessorios(request, pk): |
|
|
username = 'Usuário anônimo' if request.user.is_anonymous else request.user.username |
|
|
username = 'Usuário anônimo' if request.user.is_anonymous else request.user.username |
|
|
try: |
|
|
try: |
|
|
external_name, data = create_pdf_docacessorios(materia) |
|
|
external_name, data = create_pdf_docacessorios(materia) |
|
|
logger.info("user= {}. Gerou o pdf compilado de documento acessorios".format(username)) |
|
|
logger.info( |
|
|
|
|
|
"user= {}. Gerou o pdf compilado de documento acessorios".format(username)) |
|
|
except FileNotFoundError: |
|
|
except FileNotFoundError: |
|
|
logger.error("user= {}.Não há arquivos cadastrados".format(username)) |
|
|
logger.error("user= {}.Não há arquivos cadastrados".format(username)) |
|
|
msg = _('Não há arquivos cadastrados nesses documentos acessórios.') |
|
|
msg = _('Não há arquivos cadastrados nesses documentos acessórios.') |
|
|
@ -2845,7 +2869,8 @@ def get_pdf_docacessorios(request, pk): |
|
|
def configEtiquetaMateriaLegislativaCrud(request): |
|
|
def configEtiquetaMateriaLegislativaCrud(request): |
|
|
config = ConfigEtiquetaMateriaLegislativa.objects.last() |
|
|
config = ConfigEtiquetaMateriaLegislativa.objects.last() |
|
|
if request.method == "POST": |
|
|
if request.method == "POST": |
|
|
form = ConfigEtiquetaMateriaLegislativaForms(request.POST, instance=config) |
|
|
form = ConfigEtiquetaMateriaLegislativaForms( |
|
|
|
|
|
request.POST, instance=config) |
|
|
if form.is_valid(): |
|
|
if form.is_valid(): |
|
|
config = form.save(commit=False) |
|
|
config = form.save(commit=False) |
|
|
config.published_date = timezone.now() |
|
|
config.published_date = timezone.now() |
|
|
|