From a99ce5379eada6e973552c4587aee1c8b29ab366 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Fri, 31 May 2019 15:45:08 -0300 Subject: [PATCH] Melhora desempenho --- sapl/base/views.py | 37 +++++++--------- .../migrations/0067_auto_20200401_1216.py | 41 +++++++++++++++++ .../0068_materiaprotocolo_protocolomateria.py | 44 +++++++++++++++++++ sapl/materia/models.py | 31 ++++++++++++- sapl/protocoloadm/forms.py | 2 +- sapl/utils.py | 11 +++-- 6 files changed, 139 insertions(+), 27 deletions(-) create mode 100644 sapl/materia/migrations/0067_auto_20200401_1216.py create mode 100644 sapl/materia/migrations/0068_materiaprotocolo_protocolomateria.py diff --git a/sapl/base/views.py b/sapl/base/views.py index 2b0d1a680..bfd0d51d9 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -47,9 +47,9 @@ from sapl.comissoes.models import Comissao, Reuniao from sapl.crud.base import CrudAux, make_pagination from sapl.materia.models import (Anexada, Autoria, DocumentoAcessorio, MateriaEmTramitacao, MateriaLegislativa, Proposicao, - StatusTramitacao, TipoDocumento, - TipoMateriaLegislativa, UnidadeTramitacao, Tramitacao) -from sapl.norma.models import NormaJuridica, TipoNormaJuridica + StatusTramitacao, TipoDocumento,MateriaProtocolo, + TipoMateriaLegislativa, UnidadeTramitacao, Tramitacao,ProtocoloMateria) +from sapl.norma.models import NormaJuridica, TipoNormaJuridica, NormaEstatisticas from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato, Parlamentar, SessaoLegislativa) from sapl.protocoloadm.models import (Anexado, DocumentoAdministrativo, Protocolo, @@ -59,7 +59,8 @@ from sapl.sessao.models import (Bancada, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, TipoSessaoPlenaria) from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao, mail_service_configured, parlamentares_ativos, - SEPARADOR_HASH_PROPOSICAO, show_results_filter_set, num_materias_por_tipo) + SEPARADOR_HASH_PROPOSICAO, show_results_filter_set, num_materias_por_tipo, remover_acentos) + from .forms import (AlterarSenhaForm, CasaLegislativaForm, ConfiguracoesAppForm, RelatorioAtasFilterSet, @@ -1648,14 +1649,11 @@ class ListarFiliacoesSemDataFiliacaoView(PermissionRequiredMixin, ListView): def materias_protocolo_inexistente(): - materias = [] - for materia in MateriaLegislativa.objects.filter(numero_protocolo__isnull=False).order_by('-ano', 'numero'): - exists = Protocolo.objects.filter( - ano=materia.ano, numero=materia.numero_protocolo).exists() - if not exists: - materias.append( - (materia, materia.ano, materia.numero_protocolo)) - return materias + return [(m.materia, m.materia.ano, m.materia.numero_protocolo) for m in + MateriaProtocolo.objects\ + .select_related('materia').all()\ + .order_by('-ano_materia', 'numero_materia')] + class ListarMatProtocoloInexistenteView(PermissionRequiredMixin, ListView): @@ -1684,15 +1682,12 @@ class ListarMatProtocoloInexistenteView(PermissionRequiredMixin, ListView): def protocolos_com_materias(): protocolos = {} - - for m in MateriaLegislativa.objects.filter(numero_protocolo__isnull=False).order_by('-ano', 'numero_protocolo'): - if Protocolo.objects.filter(numero=m.numero_protocolo, ano=m.ano).exists(): - key = "{}/{}".format(m.numero_protocolo, m.ano) - val = protocolos.get(key, list()) - val.append(m) - protocolos[key] = val - - return [(v[0], len(v)) for (k, v) in protocolos.items() if len(v) > 1] + + for p in ProtocoloMateria.objects.filter(total__gt=1): + key = "{}/{}".format(p.numero_protocolo, p.ano_protocolo) + protocolos[key] = list(MateriaLegislativa.objects.filter(id__in=p.materias)) + + return [(v[0], len(v)) for (k, v) in protocolos.items()] class ListarProtocolosComMateriasView(PermissionRequiredMixin, ListView): diff --git a/sapl/materia/migrations/0067_auto_20200401_1216.py b/sapl/materia/migrations/0067_auto_20200401_1216.py new file mode 100644 index 000000000..9ef69b1d2 --- /dev/null +++ b/sapl/materia/migrations/0067_auto_20200401_1216.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-05-31 18:38 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0066_auto_20200313_1441'), + ] + + operations = [ + migrations.RunSQL(""" + create view materia_protocolomateria as + select p.id, + p.numero as numero_protocolo, + p.ano as ano_protocolo, + count(*) total, + array_agg(m.id) as materias + from materia_materialegislativa m + left join protocoloadm_protocolo p on (m.ano = p.ano and m.numero_protocolo = p.numero) + where m.numero_protocolo is not null + group by p.id + order by p.numero, p.ano; + """), + migrations.RunSQL(""" + create view materia_materiaprotocolo as + select m.id, + m.id as materia_id, + m.numero numero_materia, + m.ano ano_materia, + m.numero_protocolo, + m.ano ano_protocolo + from materia_materialegislativa m + left join protocoloadm_protocolo p on (m.ano = p.ano and m.numero_protocolo = p.numero) + where m.numero_protocolo is not null and p.numero is null + order by m.ano desc , m.numero desc + """), + ] diff --git a/sapl/materia/migrations/0068_materiaprotocolo_protocolomateria.py b/sapl/materia/migrations/0068_materiaprotocolo_protocolomateria.py new file mode 100644 index 000000000..7a9d1efce --- /dev/null +++ b/sapl/materia/migrations/0068_materiaprotocolo_protocolomateria.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-04-01 15:18 +from __future__ import unicode_literals + +import django.contrib.postgres.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0067_auto_20200401_1216'), + ] + + operations = [ + migrations.CreateModel( + name='MateriaProtocolo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('numero_materia', models.PositiveIntegerField()), + ('ano_materia', models.PositiveIntegerField()), + ('numero_protocolo', models.PositiveIntegerField()), + ('ano_protocolo', models.PositiveIntegerField()), + ], + options={ + 'db_table': 'materia_materiaprotocolo', + 'managed': False, + }, + ), + migrations.CreateModel( + name='ProtocoloMateria', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('numero_protocolo', models.PositiveIntegerField()), + ('ano_protocolo', models.PositiveIntegerField()), + ('total', models.PositiveIntegerField()), + ('materias', django.contrib.postgres.fields.ArrayField(base_field=models.PositiveIntegerField(), size=None)), + ], + options={ + 'db_table': 'materia_protocolomateria', + 'managed': False, + }, + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index cd46f83ec..36c082e51 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -15,7 +15,6 @@ from sapl.comissoes.models import Comissao, Reuniao from sapl.compilacao.models import (PerfilEstruturalTextoArticulado, TextoArticulado) from sapl.parlamentares.models import Parlamentar -#from sapl.protocoloadm.models import Protocolo from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey, SaplGenericRelation, restringe_tipos_de_arquivo_txt, texto_upload_path, get_settings_auth_user_model, @@ -1116,3 +1115,33 @@ class MateriaEmTramitacao(models.Model): def __str__(self): return '{}/{}'.format(self.materia, self.tramitacao) +class ProtocoloMateria(models.Model): + from django.contrib.postgres.fields import ArrayField + + numero_protocolo = models.PositiveIntegerField() + ano_protocolo = models.PositiveIntegerField() + total = models.PositiveIntegerField() + materias = ArrayField(models.PositiveIntegerField()) + + class Meta: + managed = False + db_table = "materia_protocolomateria" + + def __str__(self): + return '{}/{}'.format(self.numero_protocolo, self.ano_protocolo) + + +class MateriaProtocolo(models.Model): + + materia = models.ForeignKey(MateriaLegislativa) + numero_materia = models.PositiveIntegerField() + ano_materia = models.PositiveIntegerField() + numero_protocolo = models.PositiveIntegerField() + ano_protocolo = models.PositiveIntegerField() + + class Meta: + managed = False + db_table = "materia_materiaprotocolo" + + def __str__(self): + return '{}/{}'.format(self.numero_materia, self.ano_materia) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 240d61891..41530a88b 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -1004,7 +1004,7 @@ class AnexadoForm(ModelForm): ciclico = False anexados_anexado = Anexado.objects.filter(documento_principal=documento_anexado) - while(anexados_anexado and not ciclico): + while anexados_anexado and not ciclico: anexados = [] for anexo in anexados_anexado: diff --git a/sapl/utils.py b/sapl/utils.py index ded879806..d5851be06 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1007,20 +1007,23 @@ def mail_service_configured(request=None): return settings.EMAIL_RUNNING -def lista_anexados(principal, isMateriaLegislativa=True): - anexados_total = [] - if isMateriaLegislativa: #MateriaLegislativa +def lista_anexados(principal): + from sapl.materia.models import MateriaLegislativa + is_materia = isinstance(principal, MateriaLegislativa) + + if is_materia: #MateriaLegislativa from sapl.materia.models import Anexada anexados_iterator = Anexada.objects.filter(materia_principal=principal) else: #DocAdm from sapl.protocoloadm.models import Anexado anexados_iterator = Anexado.objects.filter(documento_principal=principal) + anexados_total = [] anexadas_temp = list(anexados_iterator) while anexadas_temp: anx = anexadas_temp.pop() - if isMateriaLegislativa: + if is_materia: if anx.materia_anexada not in anexados_total: anexados_total.append(anx.materia_anexada) anexados_anexado = Anexada.objects.filter(materia_principal=anx.materia_anexada)