From 161ac922617494a26671b7837784e1e121954a47 Mon Sep 17 00:00:00 2001 From: Cesar Carvalho Date: Fri, 3 May 2019 10:57:57 -0300 Subject: [PATCH] Fix #2763 --- sapl/materia/forms.py | 47 +++++++++++++++++++++++++++++-------------- sapl/materia/views.py | 23 ++++++++++++++++----- sapl/utils.py | 23 +++++++++++++++++++++ 3 files changed, 73 insertions(+), 20 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 831d062cd..ed1bf7cf3 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -38,7 +38,7 @@ from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto, from sapl.norma.models import (LegislacaoCitada, NormaJuridica, TipoNormaJuridica) from sapl.parlamentares.models import Legislatura, Partido, Parlamentar -from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo +from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo, Anexado from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.utils import (YES_NO_CHOICES, SEPARADOR_HASH_PROPOSICAO, ChoiceWithoutValidationField, @@ -580,20 +580,6 @@ class TramitacaoForm(ModelForm): return tramitacao -def lista_anexadas(materia_principal): - materias_anexadas = [] - anexadas_principal = Anexada.objects.filter(materia_principal=materia_principal) - while anexadas_principal: - anexadas = [] - for anexada in anexadas_principal: - materias_anexadas.append(anexada.materia_anexada) - anexadas_anexada = Anexada.objects.filter(materia_principal=anexada.materia_anexada) - anexadas.extend(anexadas_anexada) - anexadas_principal = anexadas - - return materias_anexadas - - class TramitacaoUpdateForm(TramitacaoForm): unidade_tramitacao_local = forms.ModelChoiceField( queryset=UnidadeTramitacao.objects.all(), @@ -670,6 +656,37 @@ class TramitacaoUpdateForm(TramitacaoForm): return cd + @transaction.atomic + def save(self, commit=True): + tram_principal = super(TramitacaoUpdateForm, self).save(commit) + materia = tram_principal.materia + for ma in materia.anexadas.all(): + tram_anexada = ma.tramitacao_set.last() + if (tram_principal.status != tram_anexada.status or \ + tram_principal.data_tramitacao != tram_anexada.data_tramitacao or \ + tram_principal.unidade_tramitacao_local != tram_anexada.unidade_tramitacao_local or \ + tram_principal.data_encaminhamento != tram_anexada.data_encaminhamento or \ + tram_principal.unidade_tramitacao_destino != tram_anexada.unidade_tramitacao_destino or \ + tram_principal.urgente != tram_anexada.urgente or \ + tram_principal.turno != tram_anexada.turno or \ + tram_principal.texto != tram_anexada.texto or \ + tram_principal.data_fim_prazo != tram_anexada.data_fim_prazo or \ + tram_principal.user != tram_anexada.user or \ + tram_principal.ip != tram_anexada.ip): + + tram_anexada.status = tram_principal.status + tram_anexada.data_tramitacao = tram_principal.data_tramitacao + tram_anexada.unidade_tramitacao_local = tram_principal.unidade_tramitacao_local + tram_anexada.data_encaminhamento = tram_principal.data_encaminhamento + tram_anexada.unidade_tramitacao_destino = tram_principal.unidade_tramitacao_destino + tram_anexada.urgente = tram_principal.urgente + tram_anexada.turno = tram_principal.turno + tram_anexada.texto = tram_principal.texto + tram_anexada.data_fim_prazo = tram_principal.data_fim_prazo + tram_anexada.user = tram_principal.user + tram_anexada.ip = tram_principal.ip + tram_anexada.save() + return tram_principal class LegislacaoCitadaForm(ModelForm): diff --git a/sapl/materia/views.py b/sapl/materia/views.py index f38f72dbd..5584baee9 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1299,18 +1299,17 @@ class TramitacaoCrud(MasterDetailCrud): def delete(self, request, *args, **kwargs): tramitacao = Tramitacao.objects.get(id=self.kwargs['pk']) - materia = MateriaLegislativa.objects.get(id=tramitacao.materia.id) + materia = tramitacao.materia url = reverse('sapl.materia:tramitacao_list', - kwargs={'pk': tramitacao.materia.id}) + kwargs={'pk': materia.id}) ultima_tramitacao = materia.tramitacao_set.order_by( '-data_tramitacao', '-timestamp', '-id').first() - username = request.user.username - if tramitacao.pk != ultima_tramitacao.pk: + username = request.user.username self.logger.error("user=" + username + ". Não é possível deletar a tramitação de pk={}. " "Somente a última tramitação (pk={}) pode ser deletada!." .format(tramitacao.pk, ultima_tramitacao.pk)) @@ -1318,7 +1317,21 @@ class TramitacaoCrud(MasterDetailCrud): messages.add_message(request, messages.ERROR, msg) return HttpResponseRedirect(url) else: - tramitacao.delete() + tramitacoes_deletar = [tramitacao.id] + for ma in materia.anexadas.all(): + tram_anexada = ma.tramitacao_set.last() + if (tram_anexada and + tramitacao.status == tram_anexada.status and \ + tramitacao.data_tramitacao == tram_anexada.data_tramitacao and \ + tramitacao.unidade_tramitacao_local == tram_anexada.unidade_tramitacao_local and \ + tramitacao.data_encaminhamento == tram_anexada.data_encaminhamento and \ + tramitacao.unidade_tramitacao_destino == tram_anexada.unidade_tramitacao_destino and \ + tramitacao.urgente == tram_anexada.urgente and \ + tramitacao.turno == tram_anexada.turno and \ + tramitacao.texto == tram_anexada.texto and \ + tramitacao.data_fim_prazo == tram_anexada.data_fim_prazo): + tramitacoes_deletar.append(tram_anexada.id) + Tramitacao.objects.filter(id__in=tramitacoes_deletar).delete() return HttpResponseRedirect(url) class DetailView(MasterDetailCrud.DetailView): diff --git a/sapl/utils.py b/sapl/utils.py index eb5552c0a..8be7cf369 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -952,3 +952,26 @@ def mail_service_configured(request=None): settings.EMAIL_RUNNING = result return settings.EMAIL_RUNNING + + +def lista_anexados(principal, isMateriaLegislativa=True): + from sapl.materia.models import Anexada + from sapl.protocoloadm.models import Anexado + anexados_total = [] + if isMateriaLegislativa: #MateriaLegislativa + anexados_iterator = Anexada.objects.filter(materia_principal=principal) + else: #DocAdm + anexados_iterator = Anexado.objects.filter(documento_principal=principal) + while anexados_iterator: + anexados_tmp = [] + for anx in anexados_iterator: + if isMateriaLegislativa: + anexados_total.append(anx.materia_anexada) + anexados_anexado = Anexada.objects.filter(materia_principal=anx.materia_anexada) + else: + anexados_total.append(anx.documento_anexado) + anexados_anexado = Anexado.objects.filter(documento_principal=anx.documento_anexado) + anexados_tmp.extend(anexados_anexado) + anexados_iterator = anexados_tmp + + return anexados_total \ No newline at end of file