diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 9a0d47bdc..ecf9a5491 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -550,6 +550,8 @@ class TramitacaoForm(ModelForm): @transaction.atomic def save(self, commit=True): + from datetime import datetime + ini = datetime.now() tramitacao = super(TramitacaoForm, self).save(commit) materia = tramitacao.materia materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True @@ -559,16 +561,19 @@ class TramitacaoForm(ModelForm): 'tramitacao_materia') if tramitar_anexadas: lista_tramitacao = [] - anexadas_list = lista_anexados(materia) - for ma in anexadas_list: - if not ma.tramitacao_set.order_by('-data_tramitacao', '-id').all() \ - or ma.tramitacao_set.order_by('-data_tramitacao', '-id').first().unidade_tramitacao_destino \ + materias_anexadas = lista_anexados(materia) + for mat in materias_anexadas: + ultima_tramitacao = mat.tramitacao_set.\ + select_related('unidade_tramitacao_destino').\ + order_by('-data_tramitacao', '-id').first() + if not ultima_tramitacao or \ + ultima_tramitacao.unidade_tramitacao_destino \ == tramitacao.unidade_tramitacao_local: - ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True - ma.save() + mat.em_tramitacao = False if \ + tramitacao.status.indicador == "F" else True lista_tramitacao.append(Tramitacao( status=tramitacao.status, - materia=ma, + materia=mat, data_tramitacao=tramitacao.data_tramitacao, unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, data_encaminhamento=tramitacao.data_encaminhamento, @@ -582,7 +587,10 @@ class TramitacaoForm(ModelForm): ultima_edicao=tramitacao.ultima_edicao )) Tramitacao.objects.bulk_create(lista_tramitacao) - + # Atualiza status 'em_tramitacao' + MateriaLegislativa.objects.bulk_update(materias_anexadas, ['em_tramitacao']) + print("Execucao total") + print(datetime.now() - ini) return tramitacao diff --git a/sapl/materia/views.py b/sapl/materia/views.py index ec263154b..2002ac90c 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1432,7 +1432,7 @@ class TramitacaoCrud(MasterDetailCrud): logger = logging.getLogger(__name__) def delete(self, request, *args, **kwargs): - tramitacao = Tramitacao.objects.get(id=self.kwargs['pk']) + tramitacao = Tramitacao.objects.select_related('materia').get(id=self.kwargs['pk']) materia = tramitacao.materia url = reverse('sapl.materia:tramitacao_list', kwargs={'pk': materia.id}) @@ -1449,31 +1449,26 @@ class TramitacaoCrud(MasterDetailCrud): messages.add_message(request, messages.ERROR, msg) return HttpResponseRedirect(url) else: - tramitacoes_deletar = [tramitacao] + tramitacoes_deletar = [tramitacao.id] if materia.tramitacao_set.count() == 0: materia.em_tramitacao = False materia.save() tramitar_anexadas = sapl.base.models.AppConfig.attr( 'tramitacao_materia') if tramitar_anexadas: - mat_anexadas = lista_anexados(materia) - for ma in mat_anexadas: - tram_anexada = ma.tramitacao_set.order_by( + materias_anexadas = lista_anexados(materia) + for materia in materias_anexadas: + tram_anexada = materia.tramitacao_set.order_by( '-data_tramitacao', '-id').first() if compara_tramitacoes_mat(tram_anexada, tramitacao): - tramitacoes_deletar.append(tram_anexada) - if ma.tramitacao_set.count() == 0: - ma.em_tramitacao = False - ma.save() - Tramitacao.objects.filter( - id__in=[t.id for t in tramitacoes_deletar]).delete() - - # TODO: otimizar para passar a lista de matérias - # for tramitacao in tramitacoes_deletar: - # post_delete_signal.send(sender=None, - # instance=tramitacao, - # operation='C', - # request=self.request) + tramitacoes_deletar.append(tram_anexada.id) + if materia.tramitacao_set.count() == 0: + materia.em_tramitacao = False + materia.save() + # Atualiza status 'em_tramitacao' + MateriaLegislativa.objects.\ + bulk_update(materias_anexadas, ['em_tramitacao']) + Tramitacao.objects.filter(id__in=tramitacoes_deletar).delete() return HttpResponseRedirect(url) diff --git a/sapl/utils.py b/sapl/utils.py index 0104f3aed..3f6867ec4 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1018,34 +1018,38 @@ def google_recaptcha_configured(): def lista_anexados(principal, isMateriaLegislativa=True): - anexados_total = [] + from datetime import datetime + ini = datetime.now() + if isMateriaLegislativa: # MateriaLegislativa from sapl.materia.models import Anexada - anexados_iterator = Anexada.objects.filter(materia_principal=principal) + anexados = {a.materia_anexada for a in Anexada.objects.select_related( + 'materia_anexada').filter(materia_principal=principal)} else: # DocAdm from sapl.protocoloadm.models import Anexado - anexados_iterator = Anexado.objects.filter( - documento_principal=principal) - - anexadas_temp = list(anexados_iterator) + anexados = {a.documento_anexado for a in Anexado.objects.select_related( + 'documento_anexado').filter(documento_principal=principal)} - while anexadas_temp: - anx = anexadas_temp.pop() + anexados_total = set() + while anexados: if isMateriaLegislativa: - if anx.materia_anexada not in anexados_total: - anexados_total.append(anx.materia_anexada) - anexados_anexado = Anexada.objects.filter( - materia_principal=anx.materia_anexada) - anexadas_temp.extend(anexados_anexado) + novos_anexados = {a.materia_anexada for a in + Anexada.objects.filter( + materia_principal__in=anexados) + if a.materia_anexada not in anexados_total} else: - if anx.documento_anexado not in anexados_total: - anexados_total.append(anx.documento_anexado) - anexados_anexado = Anexado.objects.filter( - documento_principal=anx.documento_anexado) - anexadas_temp.extend(anexados_anexado) + novos_anexados = {a.documento_anexado for a in + Anexado.objects.filter( + documento_principal__in=anexados) + if a.documento_anexado not in anexados_total} + anexados_total.update(anexados) + anexados = novos_anexados + if principal in anexados_total: anexados_total.remove(principal) - return anexados_total + + print(datetime.now() - ini) + return list(anexados_total) def from_date_to_datetime_utc(data):