Browse Source

Fixes OSTicket #247431

Refatora lista_anexados
pull/3354/head
eribeiro 5 years ago
parent
commit
8e7c0f3b2b
  1. 24
      sapl/materia/forms.py
  2. 31
      sapl/materia/views.py
  3. 42
      sapl/utils.py

24
sapl/materia/forms.py

@ -550,6 +550,8 @@ class TramitacaoForm(ModelForm):
@transaction.atomic @transaction.atomic
def save(self, commit=True): def save(self, commit=True):
from datetime import datetime
ini = datetime.now()
tramitacao = super(TramitacaoForm, self).save(commit) tramitacao = super(TramitacaoForm, self).save(commit)
materia = tramitacao.materia materia = tramitacao.materia
materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True
@ -559,16 +561,19 @@ class TramitacaoForm(ModelForm):
'tramitacao_materia') 'tramitacao_materia')
if tramitar_anexadas: if tramitar_anexadas:
lista_tramitacao = [] lista_tramitacao = []
anexadas_list = lista_anexados(materia) materias_anexadas = lista_anexados(materia)
for ma in anexadas_list: for mat in materias_anexadas:
if not ma.tramitacao_set.order_by('-data_tramitacao', '-id').all() \ ultima_tramitacao = mat.tramitacao_set.\
or ma.tramitacao_set.order_by('-data_tramitacao', '-id').first().unidade_tramitacao_destino \ 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: == tramitacao.unidade_tramitacao_local:
ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True mat.em_tramitacao = False if \
ma.save() tramitacao.status.indicador == "F" else True
lista_tramitacao.append(Tramitacao( lista_tramitacao.append(Tramitacao(
status=tramitacao.status, status=tramitacao.status,
materia=ma, materia=mat,
data_tramitacao=tramitacao.data_tramitacao, data_tramitacao=tramitacao.data_tramitacao,
unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, unidade_tramitacao_local=tramitacao.unidade_tramitacao_local,
data_encaminhamento=tramitacao.data_encaminhamento, data_encaminhamento=tramitacao.data_encaminhamento,
@ -582,7 +587,10 @@ class TramitacaoForm(ModelForm):
ultima_edicao=tramitacao.ultima_edicao ultima_edicao=tramitacao.ultima_edicao
)) ))
Tramitacao.objects.bulk_create(lista_tramitacao) 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 return tramitacao

31
sapl/materia/views.py

@ -1432,7 +1432,7 @@ class TramitacaoCrud(MasterDetailCrud):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def delete(self, request, *args, **kwargs): 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 materia = tramitacao.materia
url = reverse('sapl.materia:tramitacao_list', url = reverse('sapl.materia:tramitacao_list',
kwargs={'pk': materia.id}) kwargs={'pk': materia.id})
@ -1449,31 +1449,26 @@ class TramitacaoCrud(MasterDetailCrud):
messages.add_message(request, messages.ERROR, msg) messages.add_message(request, messages.ERROR, msg)
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
else: else:
tramitacoes_deletar = [tramitacao] tramitacoes_deletar = [tramitacao.id]
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( tramitar_anexadas = sapl.base.models.AppConfig.attr(
'tramitacao_materia') 'tramitacao_materia')
if tramitar_anexadas: if tramitar_anexadas:
mat_anexadas = lista_anexados(materia) materias_anexadas = lista_anexados(materia)
for ma in mat_anexadas: for materia in materias_anexadas:
tram_anexada = ma.tramitacao_set.order_by( tram_anexada = materia.tramitacao_set.order_by(
'-data_tramitacao', '-id').first() '-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.id)
if ma.tramitacao_set.count() == 0: if materia.tramitacao_set.count() == 0:
ma.em_tramitacao = False materia.em_tramitacao = False
ma.save() materia.save()
Tramitacao.objects.filter( # Atualiza status 'em_tramitacao'
id__in=[t.id for t in tramitacoes_deletar]).delete() MateriaLegislativa.objects.\
bulk_update(materias_anexadas, ['em_tramitacao'])
# TODO: otimizar para passar a lista de matérias Tramitacao.objects.filter(id__in=tramitacoes_deletar).delete()
# for tramitacao in tramitacoes_deletar:
# post_delete_signal.send(sender=None,
# instance=tramitacao,
# operation='C',
# request=self.request)
return HttpResponseRedirect(url) return HttpResponseRedirect(url)

42
sapl/utils.py

@ -1018,34 +1018,38 @@ def google_recaptcha_configured():
def lista_anexados(principal, isMateriaLegislativa=True): def lista_anexados(principal, isMateriaLegislativa=True):
anexados_total = [] from datetime import datetime
ini = datetime.now()
if isMateriaLegislativa: # MateriaLegislativa if isMateriaLegislativa: # MateriaLegislativa
from sapl.materia.models import Anexada 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 else: # DocAdm
from sapl.protocoloadm.models import Anexado from sapl.protocoloadm.models import Anexado
anexados_iterator = Anexado.objects.filter( anexados = {a.documento_anexado for a in Anexado.objects.select_related(
documento_principal=principal) 'documento_anexado').filter(documento_principal=principal)}
anexadas_temp = list(anexados_iterator)
while anexadas_temp: anexados_total = set()
anx = anexadas_temp.pop() while anexados:
if isMateriaLegislativa: if isMateriaLegislativa:
if anx.materia_anexada not in anexados_total: novos_anexados = {a.materia_anexada for a in
anexados_total.append(anx.materia_anexada) Anexada.objects.filter(
anexados_anexado = Anexada.objects.filter( materia_principal__in=anexados)
materia_principal=anx.materia_anexada) if a.materia_anexada not in anexados_total}
anexadas_temp.extend(anexados_anexado)
else: else:
if anx.documento_anexado not in anexados_total: novos_anexados = {a.documento_anexado for a in
anexados_total.append(anx.documento_anexado) Anexado.objects.filter(
anexados_anexado = Anexado.objects.filter( documento_principal__in=anexados)
documento_principal=anx.documento_anexado) if a.documento_anexado not in anexados_total}
anexadas_temp.extend(anexados_anexado) anexados_total.update(anexados)
anexados = novos_anexados
if principal in anexados_total: if principal in anexados_total:
anexados_total.remove(principal) anexados_total.remove(principal)
return anexados_total
print(datetime.now() - ini)
return list(anexados_total)
def from_date_to_datetime_utc(data): def from_date_to_datetime_utc(data):

Loading…
Cancel
Save