From d49ad30e1161d94d9c8ea23a974b468a55ab33e2 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 18 Oct 2018 10:42:24 -0300 Subject: [PATCH 01/21] Usa buffer inteiro p python-magic ao exportar do zope --- sapl/legacy/scripts/exporta_zope/exporta_zope.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/legacy/scripts/exporta_zope/exporta_zope.py b/sapl/legacy/scripts/exporta_zope/exporta_zope.py index 682296f4b..bec8595cf 100755 --- a/sapl/legacy/scripts/exporta_zope/exporta_zope.py +++ b/sapl/legacy/scripts/exporta_zope/exporta_zope.py @@ -93,7 +93,7 @@ def br(obj): def guess_extension(fullname, buffer): # um corte de apenas 1024 impediu a detecção correta de .docx - mime = magic.from_buffer(buffer[:4096], mime=True) + mime = magic.from_buffer(buffer, mime=True) extensao = EXTENSOES.get(mime) if extensao is not None: return extensao From f1611fe5aef1d2944251a2a5237ec09f762f85c5 Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Wed, 21 Nov 2018 13:16:37 -0200 Subject: [PATCH 02/21] fix #2391 (#2392) * fix #2391 * add test --- sapl/parlamentares/forms.py | 2 +- sapl/parlamentares/tests/test_parlamentares.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 36237d448..a15a4e305 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -136,7 +136,7 @@ class MandatoForm(ModelForm): existe_mandato = Mandato.objects.filter( parlamentar=data['parlamentar'], legislatura=data['legislatura']).exists() - if existe_mandato: + if existe_mandato and data['titular']: self.logger.error("Mandato nesta legislatura (parlamentar={}, legislatura={}) já existe." .format(data['parlamentar'], data['legislatura'])) raise ValidationError(_('Mandato nesta legislatura já existe.')) diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py index bc404757d..0f8d6e24f 100644 --- a/sapl/parlamentares/tests/test_parlamentares.py +++ b/sapl/parlamentares/tests/test_parlamentares.py @@ -178,6 +178,7 @@ def test_mandato_form_duplicado(): 'legislatura': str(legislatura.pk), 'data_expedicao_diploma': '01/07/2015', 'data_inicio_mandato': legislatura.data_inicio, + 'titular':True, }) assert not form.is_valid() From 751fde35152be41d2445aae20710777ed03747e2 Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Wed, 21 Nov 2018 13:16:56 -0200 Subject: [PATCH 03/21] fix #2376 (#2388) --- sapl/sessao/views.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 845608f79..2d8527aaa 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1335,7 +1335,7 @@ class ResumoView(DetailView): ).order_by('parlamentar__nome_parlamentar') parlamentares_sessao = [p.parlamentar for p in presencas] - + context.update({'presenca_sessao': parlamentares_sessao}) @@ -3086,6 +3086,7 @@ class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente): 'sessao.change_ordemdia') def mudar_ordem_materia_sessao(request): # Pega os dados vindos da requisição + # import ipdb; ipdb.set_trace() posicao_inicial = int(request.POST['pos_ini']) + 1 posicao_final = int(request.POST['pos_fim']) + 1 pk_sessao = int(request.POST['pk_sessao']) @@ -3099,7 +3100,7 @@ def mudar_ordem_materia_sessao(request): elif materia == 'ordem': materia = OrdemDia else: - return + return JsonResponse({}, safe=False) # Testa se existe alguma matéria na posição recebida try: @@ -3138,7 +3139,7 @@ def mudar_ordem_materia_sessao(request): materia_1.numero_ordem = posicao_final materia_1.save() - return + return JsonResponse({}, safe=False) class JustificativaAusenciaCrud(MasterDetailCrud): From cb15bd04daf6e459daecf7a6c4524009788590bf Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 21 Nov 2018 13:29:54 -0200 Subject: [PATCH 04/21] Remove chamada ipdb comentada --- sapl/sessao/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 2d8527aaa..8731376e3 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -3086,7 +3086,6 @@ class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente): 'sessao.change_ordemdia') def mudar_ordem_materia_sessao(request): # Pega os dados vindos da requisição - # import ipdb; ipdb.set_trace() posicao_inicial = int(request.POST['pos_ini']) + 1 posicao_final = int(request.POST['pos_fim']) + 1 pk_sessao = int(request.POST['pk_sessao']) From b27102f9264cc02580a16de713fd43593e6b9fa1 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 21 Nov 2018 13:31:18 -0200 Subject: [PATCH 05/21] Release: 3.1.135 --- docker-compose.yml | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 11902a565..c55959395 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.134 + image: interlegis/sapl:3.1.135 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 2ff5fdea4..e7b6cd7d1 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -184,7 +184,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.134 + Release: 3.1.135

diff --git a/setup.py b/setup.py index 3e97d8bf1..2e6baf114 100644 --- a/setup.py +++ b/setup.py @@ -52,7 +52,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.134', + version='3.1.135', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 442bfa85bcd31f64a51713a4e29fd5d8c77ff100 Mon Sep 17 00:00:00 2001 From: Edward Date: Wed, 21 Nov 2018 15:41:48 -0200 Subject: [PATCH 06/21] Fixes #2390 (#2395) --- sapl/relatorios/views.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 260d85a21..3b7ab6957 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -1083,8 +1083,7 @@ def get_pauta_sessao(sessao, casa): inf_basicas_dic["nom_camara"] = casa.nome lst_expediente_materia = [] - for expediente_materia in ExpedienteMateria.objects.filter( - data_ordem=sessao.data_inicio, sessao_plenaria=sessao): + for expediente_materia in ExpedienteMateria.objects.filter(sessao_plenaria=sessao): materia = MateriaLegislativa.objects.filter( id=expediente_materia.materia.id).first() From cc0a994448f2ae2656ea9afc94b4ceb463d48a29 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 21 Nov 2018 16:14:42 -0200 Subject: [PATCH 07/21] Release: 3.1.136 --- docker-compose.yml | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index c55959395..24dbd8cd3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.135 + image: interlegis/sapl:3.1.136 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/sapl/templates/base.html b/sapl/templates/base.html index e7b6cd7d1..efffd0cf8 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -184,7 +184,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.135 + Release: 3.1.136

diff --git a/setup.py b/setup.py index 2e6baf114..281eb06e4 100644 --- a/setup.py +++ b/setup.py @@ -52,7 +52,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.135', + version='3.1.136', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 80117ab4dc07f09d56bb8a80288c2ccb76e32585 Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Thu, 22 Nov 2018 12:46:12 -0200 Subject: [PATCH 08/21] fix #1973 (#2383) * [WIP] initial commit * [WIP] adiciona tipo retirada de pauta * [WIP] * Fix migrations conflicts * [WIP] * [WIP] form in progress * form on the away * form working * form update bugging, form create and view ok * Retirada de pauta quase completo * Edit funcionando * fix migration conflicts --- sapl/rules/map_rules.py | 2 + sapl/sessao/forms.py | 102 +++++++++++++++++- .../migrations/0028_auto_20181031_0902.py | 50 +++++++++ .../migrations/0030_auto_20181113_1149.py | 27 +++++ .../0030_resumoordenacao_decimo_primeiro.py | 2 +- .../migrations/0031_auto_20181116_1849.py | 21 ++++ sapl/sessao/models.py | 65 +++++++++++ sapl/sessao/urls.py | 9 +- sapl/sessao/views.py | 68 ++++++++++-- sapl/templates/menu_tabelas_auxiliares.yaml | 3 + sapl/templates/sessao/layouts.yaml | 12 ++- sapl/templates/sessao/retiradapauta_form.html | 6 ++ sapl/templates/sessao/subnav.yaml | 2 + sapl/templates/sistema.html | 1 + 14 files changed, 351 insertions(+), 19 deletions(-) create mode 100644 sapl/sessao/migrations/0028_auto_20181031_0902.py create mode 100644 sapl/sessao/migrations/0030_auto_20181113_1149.py create mode 100644 sapl/sessao/migrations/0031_auto_20181116_1849.py create mode 100644 sapl/templates/sessao/retiradapauta_form.html diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index 2b6204ec2..aa691da5e 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -172,6 +172,7 @@ rules_group_sessao = { (sessao.RegistroVotacao, __base__), (sessao.VotoParlamentar, __base__), (sessao.JustificativaAusencia, __base__), + (sessao.RetiradaPauta, __base__) ] } @@ -269,6 +270,7 @@ rules_group_geral = { (sessao.JustificativaAusencia, __base__), (sessao.Bloco, __base__), (sessao.ResumoOrdenacao, __base__), + (sessao.TipoRetiradaPauta, __base__), (lexml.LexmlProvedor, __base__), (lexml.LexmlPublicador, __base__), diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 2a31b60c3..386f123ca 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -23,11 +23,11 @@ from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, MateriaPesquisaOrderingFilter, autor_label, autor_modal, timezone) +from .models import (Bancada, Bloco, ExpedienteMateria, Orador, JustificativaAusencia, + OradorExpediente, OrdemDia, SessaoPlenaria, + SessaoPlenariaPresenca, TipoResultadoVotacao, OcorrenciaSessao, + RetiradaPauta, TipoRetiradaPauta) -from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia, - Orador, OradorExpediente, OrdemDia, SessaoPlenaria, - SessaoPlenariaPresenca, TipoJustificativa, TipoResultadoVotacao, - OcorrenciaSessao) def recupera_anos(): @@ -191,6 +191,100 @@ class SessaoPlenariaForm(ModelForm): return self.cleaned_data +class RetiradaPautaForm(ModelForm): + + tipo_de_retirada = forms.ModelChoiceField(required=True, + empty_label='------------', + queryset=TipoRetiradaPauta.objects.all()) + expediente = forms.ModelChoiceField(required=False, + label='Matéria do Expediente', + queryset=ExpedienteMateria.objects.all()) + ordem = forms.ModelChoiceField(required=False, + label='Matéria da Ordem do Dia', + queryset=OrdemDia.objects.all()) + materia = forms.ModelChoiceField(required=False, + widget=forms.HiddenInput(), + queryset=MateriaLegislativa.objects.all()) + + class Meta: + model = RetiradaPauta + fields = ['ordem', + 'expediente', + 'parlamentar', + 'tipo_de_retirada', + 'data', + 'observacao', + 'materia'] + + def __init__(self, *args, **kwargs): + + row1 = to_row([('tipo_de_retirada', 5), + ('parlamentar', 4), + ('data', 3)]) + row2 = to_row([('ordem', 6), + ('expediente', 6)]) + row3 = to_row([('observacao',12)]) + + self.helper = FormHelper() + self.helper.layout = SaplFormLayout( + Fieldset(_('Retirada de Pauta'), + row1, row2, row3)) + + q = Q(sessao_plenaria=kwargs['initial']['sessao_plenaria']) + ordens = OrdemDia.objects.filter(q) + expedientes = ExpedienteMateria.objects.filter(q) + retiradas_ordem = [r.ordem for r in RetiradaPauta.objects.filter(q, ordem__in=ordens)] + retiradas_expediente = [r.expediente for r in RetiradaPauta.objects.filter(q, expediente__in=expedientes)] + setOrdem = set(ordens) - set(retiradas_ordem) + setExpediente = set(expedientes) - set(retiradas_expediente) + + super(RetiradaPautaForm, self).__init__( + *args, **kwargs) + + if self.instance.pk: + setOrdem = set(ordens) + setExpediente = set(expedientes) + + presencas = SessaoPlenariaPresenca.objects.filter( + q).order_by('parlamentar__nome_parlamentar') + presentes = [p.parlamentar for p in presencas] + + self.fields['expediente'].choices = [ + (None, "------------")] + [(e.id, e.materia) for e in setExpediente] + self.fields['ordem'].choices = [ + (None, "------------")] + [(o.id, o.materia) for o in setOrdem] + self.fields['parlamentar'].choices = [ + (None, "------------")] + [(p.id, p) for p in presentes] + + def clean(self): + + super(RetiradaPautaForm, self).clean() + + if not self.is_valid(): + return self.cleaned_data + + sessao_plenaria = self.instance.sessao_plenaria + if self.cleaned_data['data'] < sessao_plenaria.data_inicio: + raise ValidationError(_("Data de retirada de pauta anterior à abertura da Sessão.")) + if sessao_plenaria.data_fim and self.cleaned_data['data'] > sessao_plenaria.data_fim: + raise ValidationError(_("Data de retirada de pauta posterior ao encerramento da Sessão.")) + + if self.cleaned_data['ordem'] and self.cleaned_data['ordem'].registrovotacao_set.exists(): + raise ValidationError(_("Essa matéria já foi votada, portanto não pode ser retirada de pauta.")) + elif self.cleaned_data['expediente'] and self.cleaned_data['expediente'].registrovotacao_set.exists(): + raise ValidationError(_("Essa matéria já foi votada, portanto não pode ser retirada de pauta.")) + + return self.cleaned_data + + def save(self, commit=False): + retirada = super(RetiradaPautaForm, self).save(commit=False) + if retirada.ordem: + retirada.materia = retirada.ordem.materia + elif retirada.expediente: + retirada.materia = retirada.expediente.materia + retirada.save() + return retirada + class BancadaForm(ModelForm): class Meta: diff --git a/sapl/sessao/migrations/0028_auto_20181031_0902.py b/sapl/sessao/migrations/0028_auto_20181031_0902.py new file mode 100644 index 000000000..3ff3c0dc5 --- /dev/null +++ b/sapl/sessao/migrations/0028_auto_20181031_0902.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-10-31 12:02 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0032_auto_20181022_1743'), + ('parlamentares', '0025_auto_20180924_1724'), + ('sessao', '0029_auto_20181024_0952'), + ] + + operations = [ + migrations.CreateModel( + name='RetiradaPauta', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('observacao', models.TextField(blank=True, verbose_name='Observações')), + ('expediente', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.ExpedienteMateria')), + ('materia', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa')), + ('ordem', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.OrdemDia')), + ('parlamentar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar', verbose_name='Requerente')), + ], + options={ + 'verbose_name_plural': 'Retirada de Pauta', + 'verbose_name': 'Retirada de Pauta', + }, + ), + migrations.CreateModel( + name='TipoRetiradaPauta', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('descricao', models.CharField(max_length=150, verbose_name='Descrição')), + ], + options={ + 'verbose_name_plural': 'Tipos de Retirada de Pauta', + 'verbose_name': 'Tipo de Retidara de Pauta', + 'ordering': ['descricao'], + }, + ), + migrations.AddField( + model_name='retiradapauta', + name='tipo_de_retirada', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sessao.TipoRetiradaPauta', verbose_name='Motivo de Retirada de Pauta'), + ), + ] diff --git a/sapl/sessao/migrations/0030_auto_20181113_1149.py b/sapl/sessao/migrations/0030_auto_20181113_1149.py new file mode 100644 index 000000000..6b7c3a237 --- /dev/null +++ b/sapl/sessao/migrations/0030_auto_20181113_1149.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-13 13:49 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0028_auto_20181031_0902'), + ] + + operations = [ + migrations.AddField( + model_name='retiradapauta', + name='data', + field=models.DateField(default=django.utils.timezone.now, verbose_name='Data'), + ), + migrations.AddField( + model_name='retiradapauta', + name='sessao_plenaria', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria', verbose_name='Sessão Plenária'), + ), + ] diff --git a/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py b/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py index f284bf715..8bd62e137 100644 --- a/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py +++ b/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py @@ -8,7 +8,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('sessao', '0029_auto_20181024_0952'), + ('sessao', '0031_auto_20181116_1849'), ] operations = [ diff --git a/sapl/sessao/migrations/0031_auto_20181116_1849.py b/sapl/sessao/migrations/0031_auto_20181116_1849.py new file mode 100644 index 000000000..61ea74b9f --- /dev/null +++ b/sapl/sessao/migrations/0031_auto_20181116_1849.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-16 20:49 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0030_auto_20181113_1149'), + ] + + operations = [ + migrations.AlterField( + model_name='retiradapauta', + name='materia', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa', verbose_name='Matéria'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 6f07d9645..8cc162a05 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -2,6 +2,7 @@ from operator import xor from django.core.exceptions import ValidationError from django.db import models +from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from model_utils import Choices import reversion @@ -584,6 +585,18 @@ class ResumoOrdenacao(models.Model): def __str__(self): return 'Ordenação do Resumo de uma Sessão' +@reversion.register() +class TipoRetiradaPauta(models.Model): + descricao = models.CharField(max_length=150, verbose_name=_('Descrição')) + + class Meta: + verbose_name = _('Tipo de Retidara de Pauta') + verbose_name_plural = _('Tipos de Retirada de Pauta') + ordering = ['descricao'] + + def __str__(self): + return self.descricao + @reversion.register() class TipoJustificativa(models.Model): @@ -662,3 +675,55 @@ class JustificativaAusencia(models.Model): force_update=force_update, using=using, update_fields=update_fields) + +class RetiradaPauta(models.Model): + materia = models.ForeignKey(MateriaLegislativa, + on_delete=models.CASCADE, + verbose_name=_('Matéria')) + sessao_plenaria = models.ForeignKey(SessaoPlenaria, + on_delete=models.CASCADE, + verbose_name=_('Sessão Plenária'), + blank=True, + null=True) + ordem = models.ForeignKey(OrdemDia, + blank=True, + null=True, + on_delete=models.CASCADE) + expediente = models.ForeignKey(ExpedienteMateria, + blank=True, + null=True, + on_delete=models.CASCADE) + data = models.DateField(verbose_name=_('Data'), + default=timezone.now) + observacao = models.TextField(blank=True, + verbose_name=_('Observações')) + parlamentar = models.ForeignKey(Parlamentar, + on_delete=models.PROTECT, + verbose_name=_('Requerente'), + blank=True, + null=True) + tipo_de_retirada = models.ForeignKey(TipoRetiradaPauta, + on_delete=models.PROTECT, + verbose_name=_('Motivo de Retirada de Pauta')) + + class Meta: + verbose_name = _('Retirada de Pauta') + verbose_name_plural = _('Retirada de Pauta') + + def __str__(self): + return _('Ordem: %(ordem)s - Requerente: %(requerente)s - ' + 'Matéria: %(materia)s') % { + 'ordem': self.ordem, + 'requerente': self.parlamentar, + 'materia': self.materia} + + def clean(self): + """Exatamente um dos campos ordem ou expediente deve estar preenchido. + """ + # TODO remover esse método quando OrdemDia e ExpedienteMateria + # forem reestruturados e os campos ordem e expediente forem unificados + if not xor(bool(self.ordem), bool(self.expediente)): + raise ValidationError( + 'ReritadaPauta deve ter exatamente um dos campos ' + 'ordem ou expediente preenchido. Ambos estão preenchidos: ' + '{}, {}'. format(self.ordem, self.expediente)) diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index f2e2fbbcc..f9b07967d 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -10,8 +10,9 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, PesquisarPautaSessaoView, PesquisarSessaoPlenariaView, PresencaOrdemDiaView, PresencaView, - ResumoOrdenacaoView, ResumoView, ResumoAtaView, SessaoCrud, + ResumoOrdenacaoView, ResumoView, ResumoAtaView, RetiradaPautaCrud, SessaoCrud, TipoJustificativaCrud, TipoExpedienteCrud, TipoResultadoVotacaoCrud, + TipoExpedienteCrud, TipoResultadoVotacaoCrud,TipoRetiradaPautaCrud, TipoSessaoCrud, VotacaoEditView, VotacaoExpedienteEditView, VotacaoExpedienteView, VotacaoNominalEditView, @@ -39,7 +40,7 @@ urlpatterns = [ OradorExpedienteCrud.get_urls() + ExpedienteMateriaCrud.get_urls() + JustificativaAusenciaCrud.get_urls() + - MateriaOrdemDiaCrud.get_urls())), + MateriaOrdemDiaCrud.get_urls() + RetiradaPautaCrud.get_urls())), url(r'^sessao/(?P\d+)/mesa$', MesaView.as_view(), name='mesa'), @@ -76,6 +77,8 @@ urlpatterns = [ include(TipoExpedienteCrud.get_urls())), url(r'^sistema/sessao-plenaria/tipo-justificativa/', include(TipoJustificativaCrud.get_urls())), + url(r'^sistema/sessao-plenaria/tipo-retirada-pauta/', + include(TipoRetiradaPautaCrud.get_urls())), url(r'^sistema/bancada/', include(BancadaCrud.get_urls())), url(r'^sistema/bloco/', @@ -157,5 +160,5 @@ urlpatterns = [ name='votacao_simbolica_transparencia'), url(r'^sessao/mudar-ordem-materia-sessao/', mudar_ordem_materia_sessao, - name='mudar_ordem_materia_sessao'), + name='mudar_ordem_materia_sessao'), ] diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 8731376e3..2af2b9805 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -43,24 +43,22 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, - VotacaoNominalForm) -from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, - ExpedienteSessao, JustificativaAusencia, OcorrenciaSessao, IntegranteMesa, + VotacaoNominalForm, RetiradaPautaForm) +from .models import (Bancada, Bloco, CargoBancada, CargoMesa, + ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, - TipoJustificativa, TipoResultadoVotacao, TipoSessaoPlenaria, - VotoParlamentar) + TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta, + RetiradaPauta, TipoJustificativa, JustificativaAusencia) TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente') TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa') CargoBancadaCrud = CrudAux.build(CargoBancada, '') - - -TipoResultadoVotacaoCrud = CrudAux.build( - TipoResultadoVotacao, 'tipo_resultado_votacao') +TipoResultadoVotacaoCrud = CrudAux.build(TipoResultadoVotacao, 'tipo_resultado_votacao') +TipoRetiradaPautaCrud = CrudAux.build(TipoRetiradaPauta, 'tipo_retirada_pauta') def reordernar_materias_expediente(request, pk): @@ -221,7 +219,9 @@ def customize_link_materia(context, pk, has_permission, is_expediente): exist_resultado = obj.registrovotacao_set.filter( materia=obj.materia).exists() - if not exist_resultado: + exist_retirada = obj.retiradapauta_set.filter( + materia=obj.materia).exists() + if not exist_resultado and not exist_retirada: if obj.votacao_aberta: url = '' if is_expediente: @@ -294,6 +294,19 @@ def customize_link_materia(context, pk, has_permission, is_expediente): resultado = btn_abrir else: resultado = '''Não há resultado''' + + elif exist_retirada: + retirada = obj.retiradapauta_set.filter( + materia_id=obj.materia_id).last() + retirada_descricao = retirada.tipo_de_retirada.descricao + retirada_observacao = retirada.observacao + url = reverse('sapl.sessao:retiradapauta_detail', + kwargs={'pk': retirada.id}) + resultado = ('%s
%s
' % + (url, + retirada_descricao, + retirada_observacao)) + else: resultado = obj.registrovotacao_set.filter( materia_id=obj.materia_id).last() @@ -3218,3 +3231,38 @@ class JustificativaAusenciaCrud(MasterDetailCrud): class DeleteView(MasterDetailCrud.DeleteView): pass + + +class RetiradaPautaCrud(MasterDetailCrud): + model = RetiradaPauta + public = [RP_LIST, RP_DETAIL, ] + parent_field = 'sessao_plenaria' + + class BaseMixin(MasterDetailCrud.BaseMixin): + list_field_names = ['tipo_de_retirada', 'materia', 'observacao', 'parlamentar'] + + class ListView(MasterDetailCrud.ListView): + paginate_by = 10 + + class CreateView(MasterDetailCrud.CreateView): + form_class = RetiradaPautaForm + layout_key = None + + def get_initial(self): + sessao_plenaria = SessaoPlenaria.objects.get(id=self.kwargs['pk']) + return {'sessao_plenaria': sessao_plenaria} + + def get_success_url(self): + return reverse('sapl.sessao:retiradapauta_list', + kwargs={'pk': self.kwargs['pk']}) + + class UpdateView(MasterDetailCrud.UpdateView): + form_class = RetiradaPautaForm + layout_key = None + + def get_initial(self): + sessao_plenaria = RetiradaPauta.objects.get(id=self.kwargs['pk']).sessao_plenaria + return {'sessao_plenaria': sessao_plenaria} + + class DeleteView(MasterDetailCrud.DeleteView): + pass diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml index 65ea6fd6f..6c8734805 100644 --- a/sapl/templates/menu_tabelas_auxiliares.yaml +++ b/sapl/templates/menu_tabelas_auxiliares.yaml @@ -152,6 +152,9 @@ - title: {% trans 'Tipo de Expediente' %} url: sapl.sessao:tipoexpediente_list css_class: btn btn-link + - title: {% trans 'Tipo de Retirada de Pauta' %} + url: sapl.sessao:tiporetiradapauta_list + css_class: btn btn-link - title: {% trans 'Ordenação do Resumo' %} url: sapl.sessao:resumo_ordenacao css_class: btn btn-link diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index 4e9e1118a..55e0db570 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -91,7 +91,7 @@ TipoJustificativa: JustificativaAusencia: {% trans 'Justificativa de Ausência' %}: - - parlamentar + - parlamentar - data hora - upload_anexo - tipo_ausencia @@ -99,3 +99,13 @@ JustificativaAusencia: - materias_do_expediente - materias_da_ordem_do_dia - observacao + +TipoRetiradaPauta: + {% trans 'Tipo Retirada Pauta'%}: + - descricao + +RetiradaPauta: + {% trans 'Retirada de Pauta' %}: + - tipo_de_retirada materia + - data parlamentar + - observacao diff --git a/sapl/templates/sessao/retiradapauta_form.html b/sapl/templates/sessao/retiradapauta_form.html new file mode 100644 index 000000000..9d850cad0 --- /dev/null +++ b/sapl/templates/sessao/retiradapauta_form.html @@ -0,0 +1,6 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% block detail_content %} + {% crispy form %} +{% endblock detail_content %} diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index 40c5903c4..5e768ae4e 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -14,6 +14,8 @@ url: orador_list - title: {% trans 'Ocorrências da Sessão' %} url: ocorrencia_sessao + - title: {% trans 'Retirada de Pauta'%} + url: retiradapauta_list - title: {% trans 'Expedientes' %} children: diff --git a/sapl/templates/sistema.html b/sapl/templates/sistema.html index 2283266b8..8c1784038 100644 --- a/sapl/templates/sistema.html +++ b/sapl/templates/sistema.html @@ -104,6 +104,7 @@ +
From 3cafaca430bcbf7ec4fc561e7c616d71bdfe7d95 Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Thu, 22 Nov 2018 15:28:21 -0200 Subject: [PATCH 09/21] HOT-FIX: resolve problema nas migrations de sessao --- .../0030_resumoordenacao_decimo_primeiro.py | 2 +- .../migrations/0032_merge_20181122_1527.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 sapl/sessao/migrations/0032_merge_20181122_1527.py diff --git a/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py b/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py index 8bd62e137..f284bf715 100644 --- a/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py +++ b/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py @@ -8,7 +8,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('sessao', '0031_auto_20181116_1849'), + ('sessao', '0029_auto_20181024_0952'), ] operations = [ diff --git a/sapl/sessao/migrations/0032_merge_20181122_1527.py b/sapl/sessao/migrations/0032_merge_20181122_1527.py new file mode 100644 index 000000000..9a74abe95 --- /dev/null +++ b/sapl/sessao/migrations/0032_merge_20181122_1527.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-22 17:27 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0031_auto_20181116_1849'), + ('sessao', '0031_auto_20181119_1103'), + ] + + operations = [ + ] From b23faf71f4ce4bcac9ffc16bb8f8e2b4a3348b16 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 28 Nov 2018 12:17:24 -0200 Subject: [PATCH 10/21] Reaponta docs para existentes em media --- sapl/legacy/migracao_documentos.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index 2c9e00842..23c6f05f7 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -1,6 +1,6 @@ import os -import shutil import re +import shutil from glob import glob from os.path import join @@ -189,3 +189,27 @@ def migrar_documentos(repo): print('\n#### Encerrado ####\n\n' '{} documentos sobraram sem ser migrados!!!'.format( len(sobrando))) + + +def corrigir_documentos_para_existentes(repo): + + for model, campos_bases in DOCS.items(): + if model == Parlamentar: + continue + for campo, base_origem in campos_bases: + print('#### Corrigindo {} de {} ####'.format(campo, + model.__name__)) + upload_to = model._meta.get_field(campo).upload_to + for obj in model.objects.all(): + if getattr(obj, campo): + continue + dir_upload_to = os.path.join( + repo.working_dir, upload_to(obj, '')) + achados = glob(dir_upload_to + '*') + if achados: + assert len(achados) == 1, 'Mais de um doc achado' + [achado] = achados + destino = upload_to(obj, os.path.basename(achado)) + print('-- {}'.format(destino)) + setattr(obj, campo, destino) + obj.save() From 4e91f84b2cacc68787b33a8095af61a636da7bb8 Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Mon, 3 Dec 2018 11:37:13 -0200 Subject: [PATCH 11/21] fix #2407 (#2408) --- sapl/parlamentares/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 9e6fc1d17..f9a37b373 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -498,7 +498,7 @@ class ParlamentarCrud(Crud): if legislatura_id >= 0: return queryset.filter( mandato__legislatura_id=legislatura_id).annotate( - mandato_titular=F('mandato__titular')) + mandato_titular=F('mandato__titular')).distinct() else: try: self.logger.debug("user=" + username + ". Tentando obter o mais recente registro do objeto Legislatura.") From 4bd1a38922990fdee618d182e5b576c0583e8f42 Mon Sep 17 00:00:00 2001 From: Talitha Pumar Date: Mon, 3 Dec 2018 11:38:58 -0200 Subject: [PATCH 12/21] Fix #2371 justificativa no resumo e extrato (#2397) --- .../templates/pdf_sessao_plenaria_gerar.py | 21 ++++++++++++--- sapl/relatorios/views.py | 20 +++++++++++++- sapl/sessao/views.py | 7 ++++- .../sessao/blocos_ata/lista_presenca.html | 12 ++++++--- .../sessao/blocos_resumo/lista_presenca.html | 27 ++++++++++++++++++- 5 files changed, 77 insertions(+), 10 deletions(-) diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index bdbce554e..5932c4811 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -144,7 +144,7 @@ def mesa(lst_mesa): return tmp -def presenca(lst_presenca_sessao): +def presenca(lst_presenca_sessao,lst_ausencia_sessao): """ """ @@ -157,6 +157,19 @@ def presenca(lst_presenca_sessao): tmp += '\t\t' + \ str(presenca['nom_parlamentar']) + '/' + \ str(presenca['sgl_partido']) + '\n' + + tmp += '\t\tJustificativas de Ausência da Sessão\n' + tmp += '\t\t\n' + tmp += '\t\t\t
\n' + tmp += '\t\t
\n' + tmp += '\n' + tmp += 'ParlamentarJustificativaAusente em\n' + for ausencia in lst_ausencia_sessao: + tmp += '' + \ + str(ausencia['parlamentar']) + ' ' + \ + str(ausencia['justificativa']) + '' + \ + str(ausencia['tipo']) + '\n' + tmp += '' return tmp @@ -305,7 +318,7 @@ def ocorrencias(lst_ocorrencias): return tmp -def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores, lst_ocorrencias): +def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_mesa, lst_presenca_sessao,lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores, lst_ocorrencias): """ """ arquivoPdf = str(int(time.time() * 100)) + ".pdf" @@ -331,7 +344,7 @@ def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_me 'cont_mult': '', 'exp': expedientes(lst_expedientes), 'id_basica': inf_basicas(inf_basicas_dic), - 'lista_p': presenca(lst_presenca_sessao), + 'lista_p': presenca(lst_presenca_sessao,lst_ausencia_sessao), 'lista_p_o_d': presenca_ordem_dia(lst_presenca_ordem_dia), 'mat_exp': expediente_materia(lst_expediente_materia), 'mat_o_d': votacao(lst_votacao), @@ -357,7 +370,7 @@ def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_me else: tmp += inf_basicas(inf_basicas_dic) tmp += mesa(lst_mesa) - tmp += presenca(lst_presenca_sessao) + tmp += presenca(lst_presenca_sessao,lst_ausencia_sessao) tmp += expedientes(lst_expedientes) tmp += expediente_materia(lst_expediente_materia) tmp += oradores_expediente(lst_oradores_expediente) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 3b7ab6957..65455c0ca 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -16,7 +16,8 @@ from sapl.parlamentares.models import CargoMesa, Filiacao, Parlamentar from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, TramitacaoAdministrativo) from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, - IntegranteMesa, Orador, OradorExpediente, + IntegranteMesa, JustificativaAusencia, + Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, OcorrenciaSessao) from sapl.settings import STATIC_ROOT @@ -538,6 +539,20 @@ def get_sessao_plenaria(sessao, casa): dic_presenca['sgl_partido'] = partido_sigla lst_presenca_sessao.append(dic_presenca) + # Lista de ausencias na sessão + lst_ausencia_sessao = [] + ausencia = JustificativaAusencia.objects.filter( + sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar') + for ausente in ausencia: + dic_ausencia = {} + dic_ausencia['parlamentar'] = ausente.parlamentar + dic_ausencia['justificativa'] = ausente.tipo_ausencia + if ausente.ausencia == 1: + dic_ausencia['tipo'] = 'Matéria' + else: + dic_ausencia['tipo'] = 'Sessão' + + lst_ausencia_sessao.append(dic_ausencia) # Exibe os Expedientes lst_expedientes = [] @@ -779,6 +794,7 @@ def get_sessao_plenaria(sessao, casa): return (inf_basicas_dic, lst_mesa, lst_presenca_sessao, + lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, @@ -833,6 +849,7 @@ def relatorio_sessao_plenaria(request, pk): (inf_basicas_dic, lst_mesa, lst_presenca_sessao, + lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, @@ -856,6 +873,7 @@ def relatorio_sessao_plenaria(request, pk): inf_basicas_dic, lst_mesa, lst_presenca_sessao, + lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 2af2b9805..d3ed0209c 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1349,7 +1349,12 @@ class ResumoView(DetailView): parlamentares_sessao = [p.parlamentar for p in presencas] - context.update({'presenca_sessao': parlamentares_sessao}) + ausentes_sessao = JustificativaAusencia.objects.filter( + sessao_plenaria_id=self.object.id + ).order_by('parlamentar__nome_parlamentar') + + context.update({'presenca_sessao': parlamentares_sessao, + 'justificativa_ausencia': ausentes_sessao}) # ===================================================================== diff --git a/sapl/templates/sessao/blocos_ata/lista_presenca.html b/sapl/templates/sessao/blocos_ata/lista_presenca.html index c6456f2c4..621a4783c 100644 --- a/sapl/templates/sessao/blocos_ata/lista_presenca.html +++ b/sapl/templates/sessao/blocos_ata/lista_presenca.html @@ -2,9 +2,15 @@

- Lista de Presença na Sessão: + Lista de Presença na Sessão: {% for p in presenca_sessao %} - {{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ; + {{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ; {% endfor %}

-
\ No newline at end of file +

+ Justificativas de Ausências na Sessão: + {% for j in justificativa_ausencia %} + {{j.parlamentar}} / {{ j.tipo_ausencia }} ; + {% endfor %} +

+ diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca.html b/sapl/templates/sessao/blocos_resumo/lista_presenca.html index 56ecf9c17..8f5ac10e2 100644 --- a/sapl/templates/sessao/blocos_resumo/lista_presenca.html +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca.html @@ -7,4 +7,29 @@
{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }}
{% endfor %} - \ No newline at end of file +


+
+ Justificativas de Ausência na Sessão + + + + + + + + + + {% for j in justificativa_ausencia %} + + + + {% if j.ausencia == 1 %} + + {% else %} + + {% endif %} + {% endfor %} + +
ParlamentarJustificativaAusente em
{{ j.parlamentar }} {{ j.tipo_ausencia }} Matéria Sessão
+
+ From 05d2956b0df23f8caaded226f250252387b66c62 Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Mon, 3 Dec 2018 11:39:33 -0200 Subject: [PATCH 13/21] fix #2398 (#2399) --- sapl/sessao/views.py | 9 ++++++++- sapl/templates/sessao/resumo_ata.html | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index d3ed0209c..08336c8a4 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1388,10 +1388,13 @@ class ResumoView(DetailView): turno = get_turno(tramitacao.turno) rv = m.registrovotacao_set.first() + rp = m.retiradapauta_set.filter(materia=m.materia).first() if rv: resultado = rv.tipo_resultado_votacao.nome resultado_observacao = rv.observacao - + elif rp: + resultado = rp.tipo_de_retirada.descricao + resultado_observacao = rp.observacao else: resultado = _('Matéria não votada') resultado_observacao = _(' ') @@ -1479,9 +1482,13 @@ class ResumoView(DetailView): # Verificar resultado rv = o.registrovotacao_set.filter(materia=o.materia).first() + rp = o.retiradapauta_set.filter(materia=o.materia).first() if rv: resultado = rv.tipo_resultado_votacao.nome resultado_observacao = rv.observacao + elif rp: + resultado = rp.tipo_de_retirada.descricao + resultado_observacao = rp.observacao else: resultado = _('Matéria não votada') resultado_observacao = _(' ') diff --git a/sapl/templates/sessao/resumo_ata.html b/sapl/templates/sessao/resumo_ata.html index 528dda494..dd3b811f7 100644 --- a/sapl/templates/sessao/resumo_ata.html +++ b/sapl/templates/sessao/resumo_ata.html @@ -19,6 +19,6 @@ {% include 'sessao/blocos_ata/'|add:oitavo_ordenacao %} {% include 'sessao/blocos_ata/'|add:nono_ordenacao %} {% include 'sessao/blocos_ata/'|add:decimo_ordenacao %} - {% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %} + {% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %} {% include 'sessao/blocos_ata/assinaturas.html' %} {% endblock detail_content %} From c2ebae0c2d43378672e29387412b7836637a4639 Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Mon, 3 Dec 2018 11:40:19 -0200 Subject: [PATCH 14/21] fix #2396 (#2400) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix #2396 * Muda pre população de tipo de vínculo para ocorrer no final --- .../pre_popula_tipo_vinculo_norma.json | 15 +++++++++++++- sapl/norma/forms.py | 2 ++ ...normajuridica_popula_tipo_vinculo_norma.py | 4 ++-- .../migrations/0009_auto_20171113_1339.py | 2 +- ...inculonormajuridica_revoga_integramente.py | 20 +++++++++++++++++++ .../migrations/0017_auto_20181127_0955.py | 20 +++++++++++++++++++ sapl/norma/models.py | 3 +++ sapl/norma/views.py | 4 ++-- sapl/templates/norma/layouts.yaml | 4 ++-- 9 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py create mode 100644 sapl/norma/migrations/0017_auto_20181127_0955.py diff --git a/sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json b/sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json index 50c6ad647..afae65bfe 100644 --- a/sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json +++ b/sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json @@ -1,6 +1,7 @@ [ { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Altera o(a)", "descricao_passiva": "Alterado(a) pelo(a)", "sigla": "A" @@ -10,6 +11,7 @@ }, { "fields": { + "revoga_integralmente": "True", "descricao_ativa": "Revoga integralmente o(a)", "descricao_passiva": "Revogado(a) integralmente pelo(a)", "sigla": "R" @@ -19,6 +21,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Revoga parcialmente o(a)", "descricao_passiva": "Revogado(a) parcialmente pelo(a)", "sigla": "P" @@ -28,6 +31,7 @@ }, { "fields": { + "revoga_integralmente": "True", "descricao_ativa": "Revoga integralmente por consolida\u00e7\u00e3o", "descricao_passiva": "Revogado(a) integralmente por consolida\u00e7\u00e3o", "sigla": "T" @@ -37,6 +41,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Norma correlata", "descricao_passiva": "Norma correlata", "sigla": "C" @@ -46,6 +51,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Ressalva o(a)", "descricao_passiva": "Ressalvada pelo(a)", "sigla": "S" @@ -55,6 +61,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Reedita o(a)", "descricao_passiva": "Reeditada pelo(a)", "sigla": "E" @@ -64,6 +71,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Reedita com altera\u00e7\u00e3o o(a)", "descricao_passiva": "Reeditada com altera\u00e7\u00e3o pelo(a)", "sigla": "I" @@ -73,6 +81,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Regulamenta o(a)", "descricao_passiva": "Regulamentada pelo(a)", "sigla": "G" @@ -82,6 +91,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Suspende parcialmente o(a)", "descricao_passiva": "Suspenso(a) parcialmente pelo(a)", "sigla": "K" @@ -91,6 +101,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Suspende integralmente o(a)", "descricao_passiva": "Suspenso(a) integralmente pelo(a)", "sigla": "L" @@ -100,6 +111,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Julga integralmente inconstitucional", "descricao_passiva": "Julgada integralmente inconstitucional", "sigla": "N" @@ -109,6 +121,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Julga parcialmente inconstitucional", "descricao_passiva": "Julgada parcialmente inconstitucional", "sigla": "O" @@ -116,4 +129,4 @@ "model": "norma.TipoVinculoNormaJuridica", "pk": "13" } -] \ No newline at end of file +] diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 674e1b9a8..4f6b6a563 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -344,6 +344,8 @@ class NormaRelacionadaForm(ModelForm): def save(self, commit=False): relacionada = super(NormaRelacionadaForm, self).save(commit) relacionada.norma_relacionada = self.cleaned_data['norma_relacionada'] + relacionada.norma_relacionada.data_vigencia = relacionada.norma_principal.data + relacionada.norma_relacionada.save() relacionada.save() return relacionada diff --git a/sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py b/sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py index 3bfb90132..460122073 100644 --- a/sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py +++ b/sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py @@ -31,9 +31,9 @@ def gera_tipo_vinculo(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('norma', '0007_auto_20170904_1708'), + ('norma', '0017_auto_20181127_0955'), ] operations = [ migrations.RunPython(gera_tipo_vinculo), - ] \ No newline at end of file + ] diff --git a/sapl/norma/migrations/0009_auto_20171113_1339.py b/sapl/norma/migrations/0009_auto_20171113_1339.py index 672d87c94..36380b2a9 100644 --- a/sapl/norma/migrations/0009_auto_20171113_1339.py +++ b/sapl/norma/migrations/0009_auto_20171113_1339.py @@ -9,7 +9,7 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('norma', '0008_normajuridica_popula_tipo_vinculo_norma'), + ('norma', '0007_auto_20170904_1708'), ] operations = [ diff --git a/sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py b/sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py new file mode 100644 index 000000000..5a57c2d9f --- /dev/null +++ b/sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-23 14:51 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0015_auto_20181109_1422'), + ] + + operations = [ + migrations.AddField( + model_name='tipovinculonormajuridica', + name='revoga_integramente', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Revoga Integralmente?'), + ), + ] diff --git a/sapl/norma/migrations/0017_auto_20181127_0955.py b/sapl/norma/migrations/0017_auto_20181127_0955.py new file mode 100644 index 000000000..45fdb463b --- /dev/null +++ b/sapl/norma/migrations/0017_auto_20181127_0955.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-27 11:55 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0016_tipovinculonormajuridica_revoga_integramente'), + ] + + operations = [ + migrations.RenameField( + model_name='tipovinculonormajuridica', + old_name='revoga_integramente', + new_name='revoga_integralmente', + ), + ] diff --git a/sapl/norma/models.py b/sapl/norma/models.py index fd06b553e..6565304ee 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -258,6 +258,9 @@ class TipoVinculoNormaJuridica(models.Model): max_length=50, blank=True, verbose_name=_('Descrição Ativa')) descricao_passiva = models.CharField( max_length=50, blank=True, verbose_name=_('Descrição Passiva')) + revoga_integralmente = models.BooleanField(verbose_name=_('Revoga Integralmente?'), + choices=YES_NO_CHOICES, + default=False) class Meta: verbose_name = _('Tipo de Vínculo entre Normas Jurídicas') diff --git a/sapl/norma/views.py b/sapl/norma/views.py index faca58d32..779cfcd11 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -37,7 +37,7 @@ TipoNormaCrud = CrudAux.build( list_field_names=['sigla', 'descricao', 'equivalente_lexml']) TipoVinculoNormaJuridicaCrud = CrudAux.build( TipoVinculoNormaJuridica, '', - list_field_names=['sigla', 'descricao_ativa', 'descricao_passiva']) + list_field_names=['sigla', 'descricao_ativa', 'descricao_passiva', 'revoga_integralmente']) class NormaRelacionadaCrud(MasterDetailCrud): @@ -208,7 +208,7 @@ class NormaCrud(Crud): def get_initial(self): username = self.request.user.username - + try: self.logger.debug('user=' + username + '. Tentando obter objeto de modelo da esfera da federação.') esfera = sapl.base.models.AppConfig.objects.last( diff --git a/sapl/templates/norma/layouts.yaml b/sapl/templates/norma/layouts.yaml index 295ef62d5..90be4172e 100644 --- a/sapl/templates/norma/layouts.yaml +++ b/sapl/templates/norma/layouts.yaml @@ -58,7 +58,7 @@ LegislacaoCitadaDetail: TipoVinculoNormaJuridica: {% trans 'Tipo de Vínculo entre Normas Jurídicas' %}: - - sigla:2 descricao_ativa descricao_passiva + - sigla:2 descricao_ativa descricao_passiva revoga_integralmente NormaRelacionada: {% trans 'Norma Relacionada' %}: @@ -73,4 +73,4 @@ NormaRelacionadaDetail: AutoriaNorma: {% trans 'Autoria' %}: - - autor primeiro_autor \ No newline at end of file + - autor primeiro_autor From deafb772eeedb2da02e5a6a9ed0aa65db0bae21b Mon Sep 17 00:00:00 2001 From: Cesar Augusto de Carvalho Date: Mon, 3 Dec 2018 11:41:32 -0200 Subject: [PATCH 15/21] =?UTF-8?q?Fix=20#2380=20Cron=C3=B4metro=20n=C3=A3o?= =?UTF-8?q?=20aceita=20valor=20acima=20de=2023:59=20(#2401)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix #2380 * fix 2380 * fix 2380 * fix 2380 * fix #2380 --- .../migrations/0024_auto_20181126_1534.py | 35 +++++++++++++++++++ .../migrations/0025_auto_20181126_1648.py | 21 +++++++++++ .../migrations/0026_auto_20181126_1727.py | 20 +++++++++++ sapl/base/models.py | 8 ++--- sapl/base/templatetags/common_tags.py | 7 ++-- sapl/painel/views.py | 1 - sapl/sessao/views.py | 17 +++------ sapl/static/js/app.js | 2 +- 8 files changed, 88 insertions(+), 23 deletions(-) create mode 100644 sapl/base/migrations/0024_auto_20181126_1534.py create mode 100644 sapl/base/migrations/0025_auto_20181126_1648.py create mode 100644 sapl/base/migrations/0026_auto_20181126_1727.py diff --git a/sapl/base/migrations/0024_auto_20181126_1534.py b/sapl/base/migrations/0024_auto_20181126_1534.py new file mode 100644 index 000000000..2f91af1ea --- /dev/null +++ b/sapl/base/migrations/0024_auto_20181126_1534.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-26 17:34 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0023_auto_20181105_1804'), + ] + + operations = [ + migrations.AlterField( + model_name='appconfig', + name='cronometro_aparte', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro do Aparte'), + ), + migrations.AlterField( + model_name='appconfig', + name='cronometro_consideracoes', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro de Considerações Finais'), + ), + migrations.AlterField( + model_name='appconfig', + name='cronometro_discurso', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro do Discurso'), + ), + migrations.AlterField( + model_name='appconfig', + name='cronometro_ordem', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro da Ordem'), + ), + ] diff --git a/sapl/base/migrations/0025_auto_20181126_1648.py b/sapl/base/migrations/0025_auto_20181126_1648.py new file mode 100644 index 000000000..a1ca53ed4 --- /dev/null +++ b/sapl/base/migrations/0025_auto_20181126_1648.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-26 18:48 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0024_auto_20181126_1534'), + ] + + operations = [ + migrations.AlterField( + model_name='appconfig', + name='cronometro_discurso', + field=models.DurationField(blank=True, default=datetime.timedelta(0, 2400), null=True, verbose_name='Cronômetro do Discurso'), + ), + ] diff --git a/sapl/base/migrations/0026_auto_20181126_1727.py b/sapl/base/migrations/0026_auto_20181126_1727.py new file mode 100644 index 000000000..4b908e7c4 --- /dev/null +++ b/sapl/base/migrations/0026_auto_20181126_1727.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-26 19:27 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0025_auto_20181126_1648'), + ] + + operations = [ + migrations.AlterField( + model_name='appconfig', + name='cronometro_discurso', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro do Discurso'), + ), + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index 9153803b8..5caf8b2c0 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -121,22 +121,22 @@ class AppConfig(models.Model): verbose_name=_('Quem deve assina a ata'), max_length=1, choices=ASSINATURA_ATA_CHOICES, default='T') - cronometro_discurso = models.TimeField( + cronometro_discurso = models.DurationField( verbose_name=_('Cronômetro do Discurso'), blank=True, null=True) - cronometro_aparte = models.TimeField( + cronometro_aparte = models.DurationField( verbose_name=_('Cronômetro do Aparte'), blank=True, null=True) - cronometro_ordem = models.TimeField( + cronometro_ordem = models.DurationField( verbose_name=_('Cronômetro da Ordem'), blank=True, null=True) - cronometro_consideracoes = models.TimeField( + cronometro_consideracoes = models.DurationField( verbose_name=_('Cronômetro de Considerações Finais'), blank=True, null=True) diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 4251e54da..89f781558 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -228,11 +228,8 @@ def file_extension(value): def cronometro_to_seconds(value): if not AppConfig.attr('cronometro_' + value): return 0 - - m, s, x = AppConfig.attr( - 'cronometro_' + value).isoformat().split(':') - - return 60 * int(m) + int(s) + + return AppConfig.attr('cronometro_' + value).seconds @register.filter diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 963e53019..333c3771e 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -340,7 +340,6 @@ def cronometro_painel(request): def get_cronometro_status(request, name): logger = logging.getLogger(__name__) username = request.user.username - try: logger.debug("user=" + username + ". Tentando obter cronometro.") cronometro = request.session[name] diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 08336c8a4..c674ea664 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -846,18 +846,11 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): messages.add_message(self.request, messages.ERROR, msg) else: - m, s, x = cronometro_discurso.isoformat().split(':') - cronometro_discurso = int(m) * 60 + int(s) - - m, s, x = cronometro_aparte.isoformat().split(':') - cronometro_aparte = int(m) * 60 + int(s) - - m, s, x = cronometro_ordem.isoformat().split(':') - cronometro_ordem = int(m) * 60 + int(s) - - m, s, x = cronometro_consideracoes.isoformat().split(':') - cronometro_consideracoes = int(m) * 60 + int(s) - + cronometro_discurso = cronometro_discurso.seconds + cronometro_aparte = cronometro_aparte.seconds + cronometro_ordem = cronometro_ordem.seconds + cronometro_consideracoes = cronometro_consideracoes.seconds + context = TemplateView.get_context_data(self, **kwargs) context.update({ 'head_title': str(_('Painel Plenário')), diff --git a/sapl/static/js/app.js b/sapl/static/js/app.js index cc9c773ce..4341cb784 100644 --- a/sapl/static/js/app.js +++ b/sapl/static/js/app.js @@ -47,7 +47,7 @@ function refreshMask() { $('.dateinput').mask('00/00/0000', {placeholder:"__/__/____"}); $('.hora').mask("00:00", {placeholder:"hh:mm"}); $('.hora_hms').mask("00:00:00", {placeholder:"hh:mm:ss"}); - $('.cronometro').mask("00:00", {placeholder:"mm:ss"}); + $('.cronometro').mask("00:00:00", {placeholder:"hh:mm:ss"}); } function autorModal() { From 2af93939cc55075173f3682879bfb9a2fc77bc69 Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Mon, 3 Dec 2018 14:05:29 -0200 Subject: [PATCH 16/21] HOT-FIX: migrate norma --- ...normajuridica_popula_tipo_vinculo_norma.py | 39 ------------------- ...inculonormajuridica_revoga_integramente.py | 35 ++++++++++++++++- .../migrations/0017_auto_20181127_0955.py | 20 ---------- 3 files changed, 33 insertions(+), 61 deletions(-) delete mode 100644 sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py delete mode 100644 sapl/norma/migrations/0017_auto_20181127_0955.py diff --git a/sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py b/sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py deleted file mode 100644 index 460122073..000000000 --- a/sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import os - -from django.core.management import call_command -from django.db import migrations - - -def gera_tipo_vinculo(apps, schema_editor): - TipoVinculoNormaJuridica = apps.get_model("norma", "TipoVinculoNormaJuridica") - - db_alias = schema_editor.connection.alias - tipo_vinculos = TipoVinculoNormaJuridica.objects.all().exists() - - if tipo_vinculos: - # Caso haja algum TipoVinculoNormaJuridica cadastrado na base de dados, - # a migração não deve ser carregada para evitar duplicações de dados. - print("Carga de {} não efetuada. Já Existem {} cadastrados...".format( - TipoVinculoNormaJuridica._meta.verbose_name, - TipoVinculoNormaJuridica._meta.verbose_name_plural - ) - ) - else: - fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures')) - # pega tipo_vinculo_norma_juridica listados em fixtures/pre_popula_tipo_vinculo_norma.json - fixture_filename = 'pre_popula_tipo_vinculo_norma.json' - fixture_file = os.path.join(fixture_dir, fixture_filename) - call_command('loaddata', fixture_file) - -class Migration(migrations.Migration): - - dependencies = [ - ('norma', '0017_auto_20181127_0955'), - ] - - operations = [ - migrations.RunPython(gera_tipo_vinculo), - ] diff --git a/sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py b/sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py index 5a57c2d9f..54c316c81 100644 --- a/sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py +++ b/sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py @@ -2,9 +2,37 @@ # Generated by Django 1.10.8 on 2018-11-23 14:51 from __future__ import unicode_literals +import os + +from django.core.management import call_command from django.db import migrations, models +def gera_tipo_vinculo(apps, schema_editor): + TipoVinculoNormaJuridica = apps.get_model( + "norma", "TipoVinculoNormaJuridica") + + db_alias = schema_editor.connection.alias + tipo_vinculos = TipoVinculoNormaJuridica.objects.all().exists() + + if tipo_vinculos: + # Caso haja algum TipoVinculoNormaJuridica cadastrado na base de dados, + # a migração não deve ser carregada para evitar duplicações de dados. + print("Carga de {} não efetuada. Já Existem {} cadastrados...".format( + TipoVinculoNormaJuridica._meta.verbose_name, + TipoVinculoNormaJuridica._meta.verbose_name_plural + ) + ) + else: + fixture_dir = os.path.abspath(os.path.join( + os.path.dirname(__file__), '../fixtures')) + # pega tipo_vinculo_norma_juridica listados em + # fixtures/pre_popula_tipo_vinculo_norma.json + fixture_filename = 'pre_popula_tipo_vinculo_norma.json' + fixture_file = os.path.join(fixture_dir, fixture_filename) + call_command('loaddata', fixture_file) + + class Migration(migrations.Migration): dependencies = [ @@ -14,7 +42,10 @@ class Migration(migrations.Migration): operations = [ migrations.AddField( model_name='tipovinculonormajuridica', - name='revoga_integramente', - field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Revoga Integralmente?'), + name='revoga_integralmente', + field=models.BooleanField(choices=[( + True, 'Sim'), (False, 'Não')], default=False, verbose_name='Revoga Integralmente?'), ), + + migrations.RunPython(gera_tipo_vinculo), ] diff --git a/sapl/norma/migrations/0017_auto_20181127_0955.py b/sapl/norma/migrations/0017_auto_20181127_0955.py deleted file mode 100644 index 45fdb463b..000000000 --- a/sapl/norma/migrations/0017_auto_20181127_0955.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-11-27 11:55 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('norma', '0016_tipovinculonormajuridica_revoga_integramente'), - ] - - operations = [ - migrations.RenameField( - model_name='tipovinculonormajuridica', - old_name='revoga_integramente', - new_name='revoga_integralmente', - ), - ] From cc3a91671f2647a9e85767579964aaa8319ed3cf Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 3 Dec 2018 15:07:48 -0200 Subject: [PATCH 17/21] =?UTF-8?q?HOT-FIX:=20verifica=20se=20texto=5Forigin?= =?UTF-8?q?al=20existe=20antes=20de=20referenciar=20em=20proposi=C3=A7?= =?UTF-8?q?=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/templates/materia/proposicao_detail.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sapl/templates/materia/proposicao_detail.html b/sapl/templates/materia/proposicao_detail.html index 9ab80ab62..2a34305b0 100644 --- a/sapl/templates/materia/proposicao_detail.html +++ b/sapl/templates/materia/proposicao_detail.html @@ -158,11 +158,12 @@
Texto Original
-      + {% if object.materia_de_vinculo.texto_original %} {{object.materia_de_vinculo.texto_original| to_str | split:"/" | get_last_item_from_list:-1}} -
+ {% endif %} +
From 69e1910b79950561bc2e1673ea9030116f362721 Mon Sep 17 00:00:00 2001 From: Cesar Augusto de Carvalho Date: Mon, 3 Dec 2018 16:23:17 -0200 Subject: [PATCH 18/21] =?UTF-8?q?Fix=20#2402=20-=20PDF=20do=20resumo=20da?= =?UTF-8?q?=20sess=C3=A3o=20sem=20todos=20os=20autores=20(#2406)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix #2402 * fix #2402 * fix #2402 * fix #2402 --- .../templates/pdf_pauta_sessao_gerar.py | 12 +- .../pdf_pauta_sessao_preparar_pysc.py | 1 + .../templates/pdf_sessao_plenaria_gerar.py | 18 +- sapl/relatorios/views.py | 178 ++++++------------ sapl/sessao/views.py | 2 +- 5 files changed, 76 insertions(+), 135 deletions(-) diff --git a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py index 15a4147d6..24cd5ed4a 100755 --- a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py +++ b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py @@ -124,10 +124,10 @@ def expediente_materia(lst_expediente_materia): for expediente_materia in lst_expediente_materia: tmp += '' + str(expediente_materia['num_ordem']) + ' - ' + \ expediente_materia["tipo_materia"] + ' No. ' + \ - expediente_materia['id_materia'] + '\n' + 'Autor: ' + \ + expediente_materia['id_materia'] + '\n' + '' + expediente_materia['num_autores'] + ': ' + \ expediente_materia['nom_autor'] + '\n' txt_ementa = expediente_materia['txt_ementa'].replace('&', '&') - tmp += '' + txt_ementa + '\n' + tmp += '' + txt_ementa + '' + '' + expediente_materia['ordem_observacao'] + '\n' tmp += '' + \ str(expediente_materia['des_situacao']) + '\n' @@ -151,10 +151,10 @@ def votacao(lst_votacao): votacao["tipo_materia"] + ' No. ' + \ str(votacao['id_materia']) + '\n' + 'Processo: ' + \ str(votacao['des_numeracao']) + '\n' + 'Turno: ' + \ - str(votacao['des_turno']) + '\n' + 'Autor: ' + \ + str(votacao['des_turno']) + '\n' + ''+votacao['num_autores']+': ' + \ str(votacao['nom_autor']) + '\n' - tmp += '' + \ - str(votacao['txt_ementa']) + '\n' + txt_ementa = votacao['txt_ementa'].replace('&', '&') + tmp += '' + txt_ementa + '' + '' + votacao['ordem_observacao'] + '\n' tmp += '' + \ str(votacao['des_situacao']) + '\n' @@ -162,7 +162,7 @@ def votacao(lst_votacao): return tmp -def principal(cabecalho_dic, rodape_dic, sessao, imagem, inf_basicas_dic, lst_expediente_materia, lst_votacao): +def principal(rodape_dic, imagem, inf_basicas_dic, lst_expediente_materia, lst_votacao): """ """ diff --git a/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py b/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py index 914f77a7b..67f0c774b 100755 --- a/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py @@ -121,6 +121,7 @@ if context.REQUEST['data'] != '': autoria = autoria[0] autor = context.zsql.autor_obter_zsql( cod_autor=autoria.cod_autor) + if len(autor) > 0: autor = autor[0] diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index 5932c4811..b67a51696 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -120,8 +120,6 @@ def inf_basicas(inf_basicas_dic): tmp += '\t\tAbertura: ' + \ dat_inicio_sessao + ' - ' + hr_inicio_sessao + '\n' - data_fim_sessao = dat_fim_sessao + ' - ' if dat_fim_sessao else '' - tmp += '\t\tEncerramento: ' + \ dat_fim_sessao + ' - ' + hr_fim_sessao + '\n' @@ -182,7 +180,7 @@ def expedientes(lst_expedientes): tmp += '\t\t\n' tmp += '\t\t\t \n' tmp += '\t\t\n' - for idx, expediente in enumerate(lst_expedientes): + for expediente in lst_expedientes: tmp += '\t\t' + '
' + \ expediente['nom_expediente'] + ':
\n' + \ '' + \ @@ -204,10 +202,10 @@ def expediente_materia(lst_expediente_materia): tmp += '\n' tmp += 'MatériaEmentaResultado da Votação\n' for expediente_materia in lst_expediente_materia: - tmp += '' + str(expediente_materia['num_ordem']) + ' - ' + expediente_materia['id_materia'] + '\n' + 'Turno: ' + str(expediente_materia[ - 'des_turno']) + '\n' + 'Autor: ' + str(expediente_materia['nom_autor']) + '\n' + tmp += '' + str(expediente_materia['num_ordem']) + ' - ' + expediente_materia['id_materia'] + '\n' + 'Turno: ' + expediente_materia[ + 'des_turno'] + '\n' + ''+ expediente_materia['num_autores'] + ': ' + str(expediente_materia['nom_autor']) + '\n' txt_ementa = expediente_materia['txt_ementa'].replace('&', '&') - tmp += '' + txt_ementa + '\n' + tmp += '' + txt_ementa + '' + '' + expediente_materia['ordem_observacao'] + '\n' tmp += '' + \ str(expediente_materia['nom_resultado']) + \ '\n' + '' @@ -267,8 +265,8 @@ def votacao(lst_votacao): tmp += '\n' tmp += 'MatériaEmentaResultado da Votação\n' for votacao in lst_votacao: - tmp += '' + str(votacao['num_ordem']) + ' - ' + votacao['id_materia'] + '\n' + 'Turno: ' + str(votacao[ - 'des_turno']) + '\n' + 'Autor: ' + str(votacao['nom_autor']) + '\n' + tmp += '' + str(votacao['num_ordem']) + ' - ' + votacao['id_materia'] + '\n' + 'Turno: ' + votacao[ + 'des_turno'] + '\n' + ''+ votacao['num_autores'] +': ' + str(votacao['nom_autor']) + '\n' txt_ementa = votacao['txt_ementa'].replace('&', '&') tmp += '' + txt_ementa + '' + '' + votacao['ordem_observacao'] + '\n' tmp += '' + \ @@ -309,7 +307,7 @@ def ocorrencias(lst_ocorrencias): tmp += '\t\t\n' tmp += '\t\t\t \n' tmp += '\t\t\n' - for idx, ocorrencia in enumerate(lst_ocorrencias): + for ocorrencia in lst_ocorrencias: tmp += '\t\t' + \ str(ocorrencia.conteudo) + '\n' tmp += '\t\t\n' @@ -318,7 +316,7 @@ def ocorrencias(lst_ocorrencias): return tmp -def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_mesa, lst_presenca_sessao,lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores, lst_ocorrencias): +def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores, lst_ocorrencias): """ """ arquivoPdf = str(int(time.time() * 100)) + ".pdf" diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 65455c0ca..a8daa645a 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -21,7 +21,7 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, OrdemDia, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, OcorrenciaSessao) from sapl.settings import STATIC_ROOT -from sapl.utils import LISTA_DE_UFS, ExtraiTag, TrocaTag, filiacao_data +from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data from .templates import (pdf_capa_processo_gerar, pdf_documento_administrativo_gerar, pdf_espelho_gerar, @@ -587,9 +587,7 @@ def get_sessao_plenaria(sessao, casa): for expediente_materia in ExpedienteMateria.objects.filter( sessao_plenaria=sessao): # seleciona os detalhes de uma matéria - materia = MateriaLegislativa.objects.filter( - id=expediente_materia.materia.id).first() - + materia = expediente_materia.materia dic_expediente_materia = {} dic_expediente_materia["num_ordem"] = expediente_materia.numero_ordem dic_expediente_materia["id_materia"] = (materia.tipo.sigla + ' ' + @@ -600,40 +598,27 @@ def get_sessao_plenaria(sessao, casa): numeracao = Numeracao.objects.filter( materia=expediente_materia.materia).first() - if numeracao is not None: + if numeracao: dic_expediente_materia["des_numeracao"] = ( str(numeracao.numero_materia) + '/' + str( numeracao.ano_materia)) - turno, _ = get_turno(dic_expediente_materia, materia, sessao.data_inicio) + turno, _ = get_turno(materia) dic_expediente_materia["des_turno"] = turno - dic_expediente_materia["txt_ementa"] = str(materia.ementa) dic_expediente_materia["ordem_observacao"] = expediente_materia.observacao - dic_expediente_materia["nom_autor"] = ' ' dic_expediente_materia["nom_resultado"] = '' - autoria = Autoria.objects.filter( - materia=materia, primeiro_autor=True).first() - - if autoria is not None: - autor = Autor.objects.filter(id=autoria.autor.id) - - if autor is not None: - autor = autor.first() - - if autor.tipo == 'Parlamentar': - parlamentar = Parlamentar.objects.filter( - id=autor.parlamentar.id) - dic_expediente_materia["nom_autor"] = str( - parlamentar.nome_completo) - elif autor.tipo == 'Comissao': - comissao = Comissao.objects.filter(id=autor.comissao.id) - dic_expediente_materia["nom_autor"] = str(comissao) - else: - dic_expediente_materia["nom_autor"] = str(autor.nome) - elif autoria is None: + 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] + else: dic_expediente_materia["nom_autor"] = 'Desconhecido' dic_expediente_materia["votacao_observacao"] = ' ' @@ -689,9 +674,7 @@ def get_sessao_plenaria(sessao, casa): for votacao in OrdemDia.objects.filter( sessao_plenaria=sessao): # seleciona os detalhes de uma matéria - materia = MateriaLegislativa.objects.filter( - id=votacao.materia.id).first() - + materia = votacao.materia dic_votacao = {} dic_votacao["nom_resultado"] = '' dic_votacao["num_ordem"] = votacao.numero_ordem @@ -702,15 +685,15 @@ def get_sessao_plenaria(sessao, casa): str(materia.ano)) dic_votacao["des_numeracao"] = ' ' - numeracao = Numeracao.objects.filter( - materia=votacao.materia).first() - if numeracao is not None: + numeracao = materia.numeracao_set.first() + if numeracao: + dic_votacao["des_numeracao"] = ( str(numeracao.numero_materia) + '/' + str(numeracao.ano_materia)) - turno, _ = get_turno(dic_votacao, materia, sessao.data_inicio) + turno, _ = get_turno(materia) dic_votacao["des_turno"] = turno @@ -718,26 +701,15 @@ def get_sessao_plenaria(sessao, casa): dic_votacao["txt_ementa"] = html.unescape(materia.ementa) dic_votacao["ordem_observacao"] = html.unescape(votacao.observacao) - dic_votacao["nom_autor"] = ' ' - autoria = Autoria.objects.filter( - materia=materia, primeiro_autor=True).first() - - if autoria is not None: - autor = Autor.objects.filter(id=autoria.autor.id) - if autor is not None: - autor = autor.first() - - if autor.tipo == 'Parlamentar': - parlamentar = Parlamentar.objects.filter( - id=autor.parlamentar.id) - dic_votacao["nom_autor"] = str(parlamentar.nome_completo) - elif autor.tipo == 'Comissao': - comissao = Comissao.objects.filter( - id=autor.comissao.id) - dic_votacao["nom_autor"] = str(comissao) - else: - dic_votacao["nom_autor"] = str(autor.nome) - elif autoria is None: + dic_votacao["nom_autor"] = '' + autoria = materia.autoria_set.all() + dic_votacao['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor' + if autoria: + for a in autoria: + if a.autor.nome: + dic_votacao['nom_autor'] += a.autor.nome + ', ' + dic_votacao['nom_autor'] = dic_votacao['nom_autor'][:-2] + else: dic_votacao["nom_autor"] = 'Desconhecido' dic_votacao["votacao_observacao"] = ' ' @@ -804,20 +776,19 @@ def get_sessao_plenaria(sessao, casa): lst_ocorrencias) -def get_turno(dic, materia, sessao_data_inicio): - descricao_turno = ' ' - descricao_tramitacao = ' ' - tramitacao = None - if tramitacao is None: - tramitacao = materia.tramitacao_set.last() +def get_turno(materia): + descricao_turno = '' + descricao_tramitacao = '' + tramitacao = materia.tramitacao_set.last() - if tramitacao is not None: - for t in Tramitacao.TURNO_CHOICES: - if t[0] == tramitacao.turno: - descricao_turno = t[1] - break + if tramitacao: + if tramitacao.turno: + for t in Tramitacao.TURNO_CHOICES: + if t[0] == tramitacao.turno: + descricao_turno = str(t[1]) + break descricao_tramitacao = tramitacao.status.descricao if tramitacao.status else 'Não informada' - return (descricao_turno, descricao_tramitacao) + return descricao_turno, descricao_tramitacao def relatorio_sessao_plenaria(request, pk): @@ -835,7 +806,6 @@ def relatorio_sessao_plenaria(request, pk): if not casa: raise Http404 - cabecalho = get_cabecalho(casa) rodape = get_rodape(casa) imagem = get_imagem(casa) @@ -866,10 +836,8 @@ def relatorio_sessao_plenaria(request, pk): lst_expedientes[idx]['txt_expediente'] = txt_expedientes pdf = pdf_sessao_plenaria_gerar.principal( - cabecalho, rodape, imagem, - None, inf_basicas_dic, lst_mesa, lst_presenca_sessao, @@ -1066,7 +1034,6 @@ def relatorio_pauta_sessao(request, pk): casa = CasaLegislativa.objects.first() - cabecalho = get_cabecalho(casa) rodape = get_rodape(casa) imagem = get_imagem(casa) @@ -1074,9 +1041,7 @@ def relatorio_pauta_sessao(request, pk): lst_expediente_materia, lst_votacao, inf_basicas_dic = get_pauta_sessao( sessao, casa) - pdf = pdf_pauta_sessao_gerar.principal(cabecalho, - rodape, - sessao, + pdf = pdf_pauta_sessao_gerar.principal(rodape, imagem, inf_basicas_dic, lst_expediente_materia, @@ -1119,34 +1084,22 @@ def get_pauta_sessao(sessao, casa): dic_expediente_materia["des_numeracao"] = ' ' numeracao = Numeracao.objects.filter(materia=materia) - if numeracao is not None: + if numeracao: numeracao = numeracao.first() dic_expediente_materia["des_numeracao"] = str(numeracao) - dic_expediente_materia["nom_autor"] = ' ' - autoria = Autoria.objects.filter( - materia=materia, primeiro_autor=True).first() - - if autoria is not None: - autor = Autor.objects.filter(id=autoria.autor.id) - - if autor is not None: - autor = autor.first() - - if autor.tipo == 'Parlamentar': - parlamentar = Parlamentar.objects.filter( - id=autor.parlamentar.id) - dic_expediente_materia["nom_autor"] = str( - parlamentar.nome_completo) - elif autor.tipo == 'Comissao': - comissao = Comissao.objects.filter(id=autor.comissao.id) - dic_expediente_materia["nom_autor"] = str(comissao) - else: - dic_expediente_materia["nom_autor"] = str(autor.nome) - elif autoria is None: + 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] + else: dic_expediente_materia["nom_autor"] = 'Desconhecido' - turno, tramitacao = get_turno(dic_expediente_materia, materia, sessao.data_inicio) + turno, tramitacao = get_turno(materia) dic_expediente_materia["des_turno"] = turno dic_expediente_materia["des_situacao"] = tramitacao @@ -1174,30 +1127,19 @@ def get_pauta_sessao(sessao, casa): dic_votacao["des_numeracao"] = str( numeracao.numero_materia) + '/' + str(numeracao.ano_materia) - turno, tramitacao = get_turno(dic_votacao, materia, sessao.data_inicio) + turno, tramitacao = get_turno(materia) dic_votacao["des_turno"] = turno dic_votacao["des_situacao"] = tramitacao - dic_votacao["nom_autor"] = ' ' - autoria = Autoria.objects.filter( - materia=materia, primeiro_autor=True).first() - - if autoria is not None: - autor = Autor.objects.filter(id=autoria.autor.id) - if autor is not None: - autor = autor.first() - - if autor.tipo == 'Parlamentar': - parlamentar = Parlamentar.objects.filter( - id=autor.parlamentar.id) - dic_votacao["nom_autor"] = str(parlamentar.nome_completo) - elif autor.tipo == 'Comissao': - comissao = Comissao.objects.filter( - id=autor.comissao.id) - dic_votacao["nom_autor"] = str(comissao) - else: - dic_votacao["nom_autor"] = str(autor.nome) - elif autoria is None: + dic_votacao["nom_autor"] = '' + autoria = materia.autoria_set.all() + dic_votacao['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor' + if autoria: + for a in autoria: + if a.autor.nome: + dic_votacao['nom_autor'] += a.autor.nome + ', ' + dic_votacao['nom_autor'] = dic_votacao['nom_autor'][:-2] + else: dic_votacao["nom_autor"] = 'Desconhecido' lst_votacao.append(dic_votacao) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index c674ea664..2f93b7056 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -195,7 +195,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): '-data_tramitacao' ).first() turno = ' ' - if tramitacao is not None: + if tramitacao: for t in Tramitacao.TURNO_CHOICES: if t[0] == tramitacao.turno: turno = t[1] From 6d07780dfc8f5784c5d86da2285d9100a22e3060 Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 3 Dec 2018 16:36:19 -0200 Subject: [PATCH 19/21] Fixes #2410 (#2411) --- sapl/norma/views.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 779cfcd11..f2dfb6f2e 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -274,16 +274,19 @@ def recuperar_norma(request): def recuperar_numero_norma(request): tipo = TipoNormaJuridica.objects.get(pk=request.GET['tipo']) ano = request.GET.get('ano', '') - param = {'tipo': tipo} - param['ano'] = ano if ano else timezone.now().year + param = {'tipo': tipo, + 'ano': ano if ano else timezone.now().year + } norma = NormaJuridica.objects.filter(**param).order_by( - 'tipo', 'ano', 'numero').values_list('numero', 'ano').last() + 'tipo', 'ano', 'numero').values_list('numero', flat=True) if norma: - response = JsonResponse({'numero': int(re.sub("[^0-9].*", '', norma[0])) + 1, - 'ano': norma[1]}) + numeros = sorted([int(re.sub("[^0-9].*", '', n)) for n in norma]) + next_num = numeros.pop() + 1 + response = JsonResponse({'numero': next_num, + 'ano': param['ano']}) else: response = JsonResponse( - {'numero': 1, 'ano': ano}) + {'numero': 1, 'ano': param['ano']}) return response From ccfd5203cc1b9f4ef4fb4e26d3873db572af302c Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 3 Dec 2018 16:54:59 -0200 Subject: [PATCH 20/21] Release: 3.1.137 --- docker-compose.yml | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 24dbd8cd3..ac3425c9f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.136 + image: interlegis/sapl:3.1.137 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/sapl/templates/base.html b/sapl/templates/base.html index efffd0cf8..d2f4cca33 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -184,7 +184,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.136 + Release: 3.1.137

diff --git a/setup.py b/setup.py index 281eb06e4..daf572e62 100644 --- a/setup.py +++ b/setup.py @@ -52,7 +52,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.136', + version='3.1.137', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 0ff18c043097df36c1b6d7160663c8e1a4117bfa Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 4 Dec 2018 13:08:28 -0200 Subject: [PATCH 21/21] =?UTF-8?q?HOT-FIX:=20erro=20na=20passagem=20de=20pa?= =?UTF-8?q?r=C3=A2metros=20relat=C3=B3rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index b67a51696..3a3512764 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -316,7 +316,7 @@ def ocorrencias(lst_ocorrencias): return tmp -def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores, lst_ocorrencias): +def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores, lst_ocorrencias): """ """ arquivoPdf = str(int(time.time() * 100)) + ".pdf"