From 4a6a2edb0ad48569fee4b90d55d0d56056ea4b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?= Date: Thu, 24 Sep 2020 20:33:24 -0300 Subject: [PATCH 1/5] Adiciona model ExpedientePautaSessao --- .../0054_popula_expedientepautasessao.py | 53 +++++++++++++++++++ .../migrations/0055_expedientepautasessao.py | 24 +++++++++ sapl/sessao/models.py | 32 ++++++++++- 3 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 sapl/sessao/migrations/0054_popula_expedientepautasessao.py create mode 100644 sapl/sessao/migrations/0055_expedientepautasessao.py diff --git a/sapl/sessao/migrations/0054_popula_expedientepautasessao.py b/sapl/sessao/migrations/0054_popula_expedientepautasessao.py new file mode 100644 index 000000000..3adfde3dc --- /dev/null +++ b/sapl/sessao/migrations/0054_popula_expedientepautasessao.py @@ -0,0 +1,53 @@ +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ('sessao', '0053_auto_20200609_1501'), + ] + + operations = [ + migrations.RunSQL( + """ + create or replace view sessao_expedientepauta as + with autoria_materia as ( + select ma.materia_id, array_agg(ba.nome) as autores + from materia_autoria ma + join base_autor ba on (ma.autor_id = ba.id) + group by ma.materia_id + order by ma.materia_id, autores + ), + tramitacao_numeracao_materia as ( + select distinct on (m.id) + m.id as materia_id, + mt.id as tramitacao_id, + mn.id as numeracao_id + from materia_materialegislativa as m + left join materia_tramitacao mt on (m.id = mt.materia_id) + left join materia_numeracao mn on (m.id = mn.materia_id) + order by materia_id, mt.data_tramitacao DESC, mt.id DESC, + mn.id DESC + ), + sessao_expedientepauta as ( + select ex.id as id, + ex.id as expediente_id, + ex.sessao_plenaria_id as sessao_plenaria_id, + tnm.materia_id as materia_id, + tnm.tramitacao_id as tramitacao_id, + tnm.numeracao_id as numeracao_id, + am.autores as autores + from sessao_expedientemateria ex + join tramitacao_numeracao_materia tnm on ( + ex.materia_id = tnm.materia_id + ) + left join autoria_materia am on ( + ex.materia_id = am.materia_id + ) + ) + select * + from sessao_expedientepauta + """ + ) + ] diff --git a/sapl/sessao/migrations/0055_expedientepautasessao.py b/sapl/sessao/migrations/0055_expedientepautasessao.py new file mode 100644 index 000000000..67362bf90 --- /dev/null +++ b/sapl/sessao/migrations/0055_expedientepautasessao.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.13 on 2020-09-24 23:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0054_popula_expedientepautasessao'), + ] + + operations = [ + migrations.CreateModel( + name='ExpedientePautaSessao', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('autores', models.CharField(blank=True, max_length=545)), + ], + options={ + 'db_table': 'sessao_expedientepauta', + 'managed': False, + }, + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 8585be2ad..2f791db6a 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -9,7 +9,7 @@ from model_utils import Choices import reversion from sapl.base.models import Autor -from sapl.materia.models import MateriaLegislativa +from sapl.materia.models import MateriaLegislativa, Tramitacao, Numeracao from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar, Partido, SessaoLegislativa) from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation, @@ -944,4 +944,32 @@ class RegistroLeitura(models.Model): raise ValidationError( 'RegistroLeitura deve ter exatamente um dos campos ' 'ordem ou expediente preenchido. Ambos estão preenchidos: ' - '{}, {}'. format(self.ordem, self.expediente)) \ No newline at end of file + '{}, {}'. format(self.ordem, self.expediente)) + + +class ExpedientePautaSessao(models.Model): + expediente = models.ForeignKey( + ExpedienteMateria, on_delete=models.DO_NOTHING + ) + sessao_plenaria = models.ForeignKey( + SessaoPlenaria, on_delete=models.DO_NOTHING + ) + materia = models.ForeignKey( + MateriaLegislativa, on_delete=models.DO_NOTHING + ) + tramitacao = models.ForeignKey( + Tramitacao, blank=True, null=True, on_delete=models.DO_NOTHING + ) + numeracao = models.ForeignKey( + Numeracao, blank=True, null=True, on_delete=models.DO_NOTHING + ) + autores = models.CharField( + max_length=545, blank=True + ) + + class Meta: + managed = False + db_table = "sessao_expedientepauta" + + def __str__(self): + return '{}'.format(self.expediente) From 62929c5be3321accf615ddd2da633ef980bf8352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?= Date: Tue, 29 Sep 2020 14:12:24 -0300 Subject: [PATCH 2/5] Adiciona rule model ExpedientePautaSessao --- sapl/rules/map_rules.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index ad34fe1b1..9668f4b62 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -188,6 +188,7 @@ rules_group_sessao = { (sessao.JustificativaAusencia, __base__, __perms_publicas__), (sessao.RetiradaPauta, __base__, __perms_publicas__), (sessao.RegistroLeitura, __base__, __perms_publicas__), + (sessao.ExpedientePautaSessao, __base__, __perms_publicas__) ] } From 16ae10603bc688203afc791d7e00871f0613248a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?= Date: Tue, 29 Sep 2020 17:07:18 -0300 Subject: [PATCH 3/5] =?UTF-8?q?Refatora=20PautaSessaoDetailView=20-=20Mat?= =?UTF-8?q?=C3=A9rias=20do=20Expediente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/sessao/views.py | 45 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index ccb51fa31..40b664bd6 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -50,7 +50,7 @@ from .models import (Bancada, CargoBancada, CargoMesa, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta, RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia, - ORDENACAO_RESUMO, RegistroLeitura) + ORDENACAO_RESUMO, RegistroLeitura, ExpedientePautaSessao) TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') @@ -3583,32 +3583,27 @@ class PautaSessaoDetailView(DetailView): # ===================================================================== # Matérias Expediente materias_expediente = [] - for m in ExpedienteMateria.objects \ - .prefetch_related('registrovotacao_set') \ - .select_related("materia", "materia__tipo") \ - .filter(sessao_plenaria_id=self.object.id): - rv = m.registrovotacao_set.first() - if rv: - resultado = rv.tipo_resultado_votacao.nome - resultado_observacao = rv.observacao - else: - resultado = _('Matéria não votada') - resultado_observacao = _(' ') - - ultima_tramitacao = m.materia.tramitacao_set.order_by('-data_tramitacao', '-id').first() - numeracao = m.materia.numeracao_set.first() + for e in ExpedientePautaSessao.objects.select_related("materia").filter( + sessao_plenaria_id=self.object.id + ).order_by('expediente__numero_ordem'): + + processo = f'{str(e.numeracao.numero_materia)}/{str(e.numeracao.ano_materia)}' if e.numeracao else '-' + + autores = e.autores if e.autores else [ + str(a.autor) for a in e.materia.autoria_set.select_related('autor').all() + ] materias_expediente.append({ - 'id': m.materia_id, - 'ementa': m.materia.ementa, - 'observacao': m.observacao, - 'titulo': m.materia, - 'numero': m.numero_ordem, - 'resultado': resultado, - 'resultado_observacao': resultado_observacao, - 'situacao': ultima_tramitacao.status if ultima_tramitacao else _("Não informada"), - 'processo': f'{str(numeracao.numero_materia)}/{str(numeracao.ano_materia)}' if numeracao else '-', - 'autor': [str(x.autor) for x in m.materia.autoria_set.select_related('autor').all()] + 'id': e.materia_id, + 'ementa': e.materia.ementa, + 'observacao': e.expediente.observacao, + 'titulo': e.materia, + 'numero': e.expediente.numero_ordem, + 'resultado': '', # Não é utilizado + 'resultado_observacao': '', # Não é utilizado + 'situacao': e.tramitacao.status if e.tramitacao else _('Não informada'), + 'processo': processo, + 'autor': e.autores }) context.update({'materia_expediente': materias_expediente}) # ===================================================================== From 48f7a470818d63d1f64997cf2298b454fe3fd8ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?= Date: Thu, 1 Oct 2020 12:24:29 -0300 Subject: [PATCH 4/5] =?UTF-8?q?Refatora=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/sessao/views.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 40b664bd6..c18b5c885 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -3583,7 +3583,7 @@ class PautaSessaoDetailView(DetailView): # ===================================================================== # Matérias Expediente materias_expediente = [] - for e in ExpedientePautaSessao.objects.select_related("materia").filter( + for e in ExpedientePautaSessao.objects.select_related("materia", "materia__tipo").filter( sessao_plenaria_id=self.object.id ).order_by('expediente__numero_ordem'): @@ -3599,8 +3599,6 @@ class PautaSessaoDetailView(DetailView): 'observacao': e.expediente.observacao, 'titulo': e.materia, 'numero': e.expediente.numero_ordem, - 'resultado': '', # Não é utilizado - 'resultado_observacao': '', # Não é utilizado 'situacao': e.tramitacao.status if e.tramitacao else _('Não informada'), 'processo': processo, 'autor': e.autores @@ -3620,25 +3618,11 @@ class PautaSessaoDetailView(DetailView): context.update({'expedientes': expedientes}) # ===================================================================== - # Orador Expediente - context.update({ - 'oradores': OradorExpediente.objects.filter(sessao_plenaria_id=self.object.id).order_by('numero_ordem') - }) - # ===================================================================== # Matérias Ordem do Dia materias_ordem = [] for o in OrdemDia.objects \ - .prefetch_related('registrovotacao_set') \ .select_related("materia", "materia__tipo") \ .filter(sessao_plenaria_id=self.object.id): - # Verificar resultado - rv = o.registrovotacao_set.first() - if rv: - resultado = rv.tipo_resultado_votacao.nome - resultado_observacao = rv.observacao - else: - resultado = _('Matéria não votada') - resultado_observacao = _(' ') ultima_tramitacao = o.materia.tramitacao_set.order_by('-data_tramitacao', '-id').first() numeracao = o.materia.numeracao_set.first() @@ -3649,8 +3633,6 @@ class PautaSessaoDetailView(DetailView): 'observacao': o.observacao, 'titulo': o.materia, 'numero': o.numero_ordem, - 'resultado': resultado, - 'resultado_observacao': resultado_observacao, 'situacao': ultima_tramitacao.status if ultima_tramitacao else _("Não informada"), 'processo': f'{str(numeracao.numero_materia)}/{str(numeracao.ano_materia)}' if numeracao else '-', 'autor': [str(x.autor) for x in Autoria.objects.select_related("autor").filter(materia_id=o.materia_id)] From 07480428706737266846d9b3a7b999ca1d5deeb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?= Date: Mon, 5 Oct 2020 16:21:23 -0300 Subject: [PATCH 5/5] Refatora get_pauta_sessao --- sapl/relatorios/views.py | 64 +++++++++++++++++++++------------------- sapl/sessao/views.py | 4 +-- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 0d541ce52..b279b8d3e 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -24,7 +24,7 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, IntegranteMesa, JustificativaAusencia, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, - SessaoPlenariaPresenca, OcorrenciaSessao, + SessaoPlenariaPresenca, OcorrenciaSessao, ExpedientePautaSessao, RegistroVotacao, VotoParlamentar, OradorOrdemDia, TipoExpediente, ResumoOrdenacao) from sapl.settings import STATIC_ROOT from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data, create_barcode @@ -1118,47 +1118,51 @@ def get_pauta_sessao(sessao, casa): inf_basicas_dic["nom_camara"] = casa.nome lst_expediente_materia = [] - for expediente_materia in ExpedienteMateria.objects.filter(sessao_plenaria=sessao): + for e in ExpedientePautaSessao.objects.filter( + sessao_plenaria=sessao + ).order_by('expediente__numero_ordem'): - materia = MateriaLegislativa.objects.filter( - id=expediente_materia.materia.id).first() + materia = e.materia dic_expediente_materia = {} - dic_expediente_materia["tipo_materia"] = materia.tipo.sigla + \ - ' - ' + materia.tipo.descricao - dic_expediente_materia["num_ordem"] = str( - expediente_materia.numero_ordem) + tipo_materia = materia.tipo.sigla + ' - ' + materia.tipo.descricao + dic_expediente_materia["tipo_materia"] = tipo_materia + + dic_expediente_materia["num_ordem"] = str(e.expediente.numero_ordem) + dic_expediente_materia["id_materia"] = str( - materia.numero) + "/" + str(materia.ano) - dic_expediente_materia["txt_ementa"] = materia.ementa - dic_expediente_materia["materia_observacao"] = materia.observacao + materia.numero + ) + "/" + str(materia.ano) - dic_expediente_materia["ordem_observacao"] = str( - expediente_materia.observacao) + dic_expediente_materia["txt_ementa"] = e.materia.ementa - dic_expediente_materia["des_numeracao"] = ' ' + dic_expediente_materia["ordem_observacao"] = str( + e.expediente.observacao + ) - numeracao = Numeracao.objects.filter(materia=materia) - if numeracao: - numeracao = numeracao.first() - dic_expediente_materia["des_numeracao"] = str(numeracao) + autores = e.autores if e.autores else [ + str(a.autor) for a in e.materia.autoria_set.select_related( + 'autor' + ).all() + ] - dic_expediente_materia["nom_autor"] = '' - autoria = materia.autoria_set.all() dic_expediente_materia['num_autores'] = 'Autores' if len( - autoria) > 1 else 'Autor' - if autoria: - for a in autoria: - if a.autor.nome: - dic_expediente_materia['nom_autor'] += a.autor.nome + ', ' - dic_expediente_materia['nom_autor'] = dic_expediente_materia['nom_autor'][:-2] + autores + ) > 1 else 'Autor' + + dic_expediente_materia['nom_autor'] = '' + if autores: + for a in autores: + if a: + dic_expediente_materia['nom_autor'] += a + ', ' + dic_expediente_materia['nom_autor'] = dic_expediente_materia[ + 'nom_autor' + ][:-2] else: dic_expediente_materia["nom_autor"] = 'Desconhecido' - turno, tramitacao = get_turno(materia) - - dic_expediente_materia["des_turno"] = turno - dic_expediente_materia["des_situacao"] = tramitacao + situacao = e.tramitacao.status if e.tramitacao else _('Não informada') + dic_expediente_materia["des_situacao"] = situacao lst_expediente_materia.append(dic_expediente_materia) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index c18b5c885..f02bd5a0c 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -3596,12 +3596,12 @@ class PautaSessaoDetailView(DetailView): materias_expediente.append({ 'id': e.materia_id, 'ementa': e.materia.ementa, - 'observacao': e.expediente.observacao, + 'observacao': e.expediente.observacao, 'titulo': e.materia, 'numero': e.expediente.numero_ordem, 'situacao': e.tramitacao.status if e.tramitacao else _('Não informada'), 'processo': processo, - 'autor': e.autores + 'autor': autores }) context.update({'materia_expediente': materias_expediente}) # =====================================================================