From 937010540b1145350ff20f9d07a94426879ea5bf Mon Sep 17 00:00:00 2001 From: Cesar Carvalho Date: Wed, 5 Jun 2019 09:09:24 -0300 Subject: [PATCH 01/18] =?UTF-8?q?HOT-FIX:=20Parlamentares=20de=20outras=20?= =?UTF-8?q?legislaturas=20aparecendo=20como=20op=C3=A7=C3=A3o=20de=20Orado?= =?UTF-8?q?res?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/sessao/forms.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index c09d2f220..65d89d984 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -672,8 +672,12 @@ class OradorForm(ModelForm): class OradorExpedienteForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + id_sessao = int(self.initial['id_sessao']) + sessao = SessaoPlenaria.objects.get(id=id_sessao) + legislatura_vigente = sessao.legislatura self.fields['parlamentar'].queryset = \ - Parlamentar.objects.filter(ativo=True).order_by('nome_parlamentar') + Parlamentar.objects.filter(mandato__legislatura=legislatura_vigente, + ativo=True).order_by('nome_parlamentar') def clean(self): super(OradorExpedienteForm, self).clean() @@ -703,8 +707,12 @@ class OradorExpedienteForm(ModelForm): class OradorOrdemDiaForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + id_sessao = int(self.initial['id_sessao']) + sessao = SessaoPlenaria.objects.get(id=id_sessao) + legislatura_vigente = sessao.legislatura self.fields['parlamentar'].queryset = \ - Parlamentar.objects.filter(ativo=True).order_by('nome_parlamentar') + Parlamentar.objects.filter(mandato__legislatura=legislatura_vigente, + ativo=True).order_by('nome_parlamentar') def clean(self): super(OradorOrdemDiaForm, self).clean() From bd7ce96ec9beb8167c2b85427879dd59eb7a1b8c Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Thu, 6 Jun 2019 10:49:14 -0300 Subject: [PATCH 02/18] =?UTF-8?q?HOT-FIX:=20Pro=C3=ADbe=20reg=20de=20incl?= =?UTF-8?q?=20c=20renum=20autom=C3=A1tica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/views.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index f3f2294ee..671e5bcf1 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -2147,8 +2147,11 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): return self.json_add_next(context, local_add='json_add_in') def json_add_next( - self, - context, local_add='json_add_next', create_auto_inserts=True): + self, + context, local_add='json_add_next', + create_auto_inserts=True, + registro_inclusao=False + ): try: @@ -2249,7 +2252,9 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): dp.rotulo = dp.rotulo_padrao() dp.ordem = ordem - dp.incrementar_irmaos(variacao, [local_add, ], force=False) + + if not registro_inclusao: + dp.incrementar_irmaos(variacao, [local_add, ], force=False) dp.publicacao = pub_last dp.save() @@ -2380,9 +2385,10 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): filho.save() ''' Renumerar dispositivos de - contagem continua, caso a inserção seja uma articulação''' + contagem continua, caso a inserção seja uma articulação. + Desde que não seja um registro de inclusão através de compilação''' - if dp.nivel == 0: + if dp.nivel == 0 and not registro_inclusao: proxima_articulacao = dp.select_next_root() @@ -2522,7 +2528,8 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, data = self.json_add_next(context, local_add=local_add, - create_auto_inserts=True) + create_auto_inserts=True, + registro_inclusao=True) if data and data['pk']: @@ -2554,6 +2561,11 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, else: data.update({'pk': bloco_alteracao.pk, 'pai': [bloco_alteracao.pk, ]}) + self.set_message( + data, 'danger', + _('Não é possível incluir seu Registro de Inclusão, ' + 'verifique a opção escolhida e as variações possíveis!'), + time=10000) return data From 7cbd46d40a3b30eb7379b968280983457c41f6cf Mon Sep 17 00:00:00 2001 From: Cesar Augusto de Carvalho Date: Fri, 7 Jun 2019 12:24:54 -0300 Subject: [PATCH 03/18] =?UTF-8?q?HOT-FIX:=20Corrige=20permiss=C3=B5es=20de?= =?UTF-8?q?=20tramita=C3=A7=C3=A3o=20DocAdm=20em=20lote=20(#2830)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/protocoloadm/views.py | 2 +- sapl/templates/navbar.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 89de69c72..79f843e37 100755 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -1455,7 +1455,7 @@ class FichaSelecionaAdmView(PermissionRequiredMixin, FormView): class PrimeiraTramitacaoEmLoteAdmView(PermissionRequiredMixin, FilterView): filterset_class = PrimeiraTramitacaoEmLoteAdmFilterSet template_name = 'protocoloadm/em_lote/tramitacaoadm.html' - permission_required = ('materia.add_tramitacao', ) + permission_required = ('protocoloadm.add_tramitacaoadministrativo', ) primeira_tramitacao = True diff --git a/sapl/templates/navbar.yaml b/sapl/templates/navbar.yaml index e06638095..5d50d2122 100644 --- a/sapl/templates/navbar.yaml +++ b/sapl/templates/navbar.yaml @@ -35,7 +35,7 @@ url: sapl.protocoloadm:pesq_doc_adm - title: {% trans 'Tramitação em Lote' %} url: sapl.protocoloadm:primeira_tramitacao_em_lote_docadm - check_permission: sapl.documento:add_tramitacao + check_permission: sapl.protocoloadm:add_tramitacaoadministrativo - title: {% trans 'Atividade Legislativa' %} children: From bf312cd866c7c1b9a7a0954f9fb88766c2d6786f Mon Sep 17 00:00:00 2001 From: Cesar Augusto de Carvalho Date: Fri, 7 Jun 2019 12:26:43 -0300 Subject: [PATCH 04/18] HOT-FIX: Corrige problema de PrimeiroAutor em AutoriaMultiCreate (#2832) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * HOT-FIX: Corrige problema de PrimeiroAutor em AutoriaMultiCreate * Corrige testes de acordo com alterações nos forms --- sapl/materia/forms.py | 23 +++++++++++++++++++---- sapl/materia/tests/test_materia.py | 1 + sapl/materia/tests/test_materia_form.py | 13 +++++++++---- sapl/materia/views.py | 5 ++++- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 6ad0fa11c..8b33a7f55 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1168,7 +1168,7 @@ class DespachoInicialForm(ModelForm): class AutoriaForm(ModelForm): tipo_autor = ModelChoiceField(label=_('Tipo Autor'), - required=False, + required=True, queryset=TipoAutor.objects.all(), empty_label=_('Selecione'),) @@ -1180,6 +1180,12 @@ class AutoriaForm(ModelForm): def __init__(self, *args, **kwargs): super(AutoriaForm, self).__init__(*args, **kwargs) + self.fields['primeiro_autor'].required = True + + if 'initial' in kwargs and 'materia' in kwargs['initial']: + materia = kwargs['initial']['materia'] + self.fields['primeiro_autor'].initial = Autoria.objects.filter(materia=materia).count() == 0 + row1 = to_row([('tipo_autor', 4), ('autor', 4), ('primeiro_autor', 4)]) @@ -1220,7 +1226,7 @@ class AutoriaMultiCreateForm(Form): logger = logging.getLogger(__name__) tipo_autor = ModelChoiceField(label=_('Tipo Autor'), - required=False, + required=True, queryset=TipoAutor.objects.all(), empty_label=_('Selecione'),) @@ -1230,7 +1236,7 @@ class AutoriaMultiCreateForm(Form): autor = ModelMultipleChoiceField( queryset=Autor.objects.all(), label=_('Possiveis Autores'), - required=False, + required=True, widget=CheckboxSelectMultiple) autores = ModelMultipleChoiceField( @@ -1238,10 +1244,19 @@ class AutoriaMultiCreateForm(Form): required=False, widget=HiddenInput) + primeiro_autor = forms.ChoiceField( + required=True, + choices=YES_NO_CHOICES, + label="Primeiro Autor?" + ) + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - row1 = to_row([('tipo_autor', 12), ]) + if 'initial' in kwargs and 'autores' in kwargs['initial']: + self.fields['primeiro_autor'].initial = kwargs['initial']['autores'].count() == 0 + + row1 = to_row([('tipo_autor', 10), ('primeiro_autor', 2)]) row2 = to_row([('autor', 12), ]) diff --git a/sapl/materia/tests/test_materia.py b/sapl/materia/tests/test_materia.py index e12b03dff..dabf29bed 100644 --- a/sapl/materia/tests/test_materia.py +++ b/sapl/materia/tests/test_materia.py @@ -243,6 +243,7 @@ def test_autoria_submit(admin_client): reverse('sapl.materia:autoria_create', kwargs={'pk': materia_principal.pk}), {'autor': autor.pk, + 'tipo_autor': tipo_autor.pk, 'primeiro_autor': True, 'materia_id': materia_principal.pk, }, follow=True) diff --git a/sapl/materia/tests/test_materia_form.py b/sapl/materia/tests/test_materia_form.py index e29d89815..215f114a2 100644 --- a/sapl/materia/tests/test_materia_form.py +++ b/sapl/materia/tests/test_materia_form.py @@ -129,9 +129,11 @@ def test_valida_campos_obrigatorios_autoria_form(): errors = form.errors - assert errors['autor'] == [_('Este campo é obrigatório.')] + assert len(errors) == 3 - assert len(errors) == 1 + assert errors['tipo_autor'] == [_('Este campo é obrigatório.')] + assert errors['autor'] == [_('Este campo é obrigatório.')] + assert errors['primeiro_autor'] == [_('Este campo é obrigatório.')] @pytest.mark.django_db(transaction=False) @@ -142,9 +144,12 @@ def test_valida_campos_obrigatorios_autoria_multicreate_form(): errors = form.errors - assert errors['__all__'] == [_('Ao menos um autor deve ser selecionado para inclusão')] + assert len(errors) == 4 - assert len(errors) == 1 + assert errors['__all__'] == [_('Ao menos um autor deve ser selecionado para inclusão')] + assert errors['tipo_autor'] == [_('Este campo é obrigatório.')] + assert errors['autor'] == [_('Este campo é obrigatório.')] + assert errors['primeiro_autor'] == [_('Este campo é obrigatório.')] @pytest.mark.django_db(transaction=False) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index f5d80ce11..4d31993dd 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1432,6 +1432,7 @@ class AutoriaCrud(MasterDetailCrud): materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) initial['data_relativa'] = materia.data_apresentacao initial['autor'] = [] + initial['materia'] = materia return initial class UpdateView(LocalBaseMixin, MasterDetailCrud.UpdateView): @@ -1441,6 +1442,7 @@ class AutoriaCrud(MasterDetailCrud): initial.update({ 'data_relativa': self.object.materia.data_apresentacao, 'tipo_autor': self.object.autor.tipo.id, + 'materia': self.object.materia }) return initial @@ -1480,8 +1482,9 @@ class AutoriaMultiCreateView(PermissionRequiredForAppCrudMixin, FormView): def form_valid(self, form): autores_selecionados = form.cleaned_data['autor'] + primeiro_autor = form.cleaned_data['primeiro_autor'] for autor in autores_selecionados: - Autoria.objects.create(materia=self.materia, autor=autor) + Autoria.objects.create(materia=self.materia, autor=autor, primeiro_autor=primeiro_autor) return FormView.form_valid(self, form) From 6b8f365f6bccbf3590c8fdf0c1dc313b2a49eae0 Mon Sep 17 00:00:00 2001 From: Leandro Roberto Silva Date: Mon, 10 Jun 2019 13:27:37 -0300 Subject: [PATCH 05/18] Fix #2833 (#2835) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * inclui campo para configuração do tipo de numeração * add tipo_numeracao para crud * refatora view que recupera próximo número de sessões * refatora clean de SessaoPlenariaForm * refatora __str__ de sessão plenária * altera o default para tipo_numeracao --- sapl/sessao/forms.py | 28 +++----- .../migrations/0041_auto_20190610_1300.py | 27 +++++++ sapl/sessao/models.py | 72 ++++++++++++++++++- sapl/sessao/urls.py | 6 +- sapl/sessao/views.py | 61 ++++++++++------ sapl/templates/sessao/layouts.yaml | 4 +- .../templates/sessao/sessaoplenaria_form.html | 45 +++++++----- 7 files changed, 177 insertions(+), 66 deletions(-) create mode 100644 sapl/sessao/migrations/0041_auto_20190610_1300.py diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 65d89d984..523e1cede 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -1,6 +1,5 @@ from datetime import datetime -from sapl.crispy_layout_mixin import SaplFormHelper from crispy_forms.layout import HTML, Button, Fieldset, Layout from django import forms from django.contrib.contenttypes.models import ContentType @@ -13,6 +12,7 @@ from django.utils.translation import ugettext_lazy as _ import django_filters from sapl.base.models import Autor, TipoAutor +from sapl.crispy_layout_mixin import SaplFormHelper from sapl.crispy_layout_mixin import form_actions, to_row, SaplFormLayout from sapl.materia.forms import MateriaLegislativaFilterSet from sapl.materia.models import (MateriaLegislativa, StatusTramitacao, @@ -60,21 +60,11 @@ class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm): "para a Legislatura, Sessão Legislativa e Tipo informados. " "Favor escolher um número distinto.") - sessoes = SessaoPlenaria.objects.filter(numero=num, - sessao_legislativa=sl, - legislatura=leg, - tipo=tipo, - data_inicio__year=abertura.year).\ - values_list('id', flat=True) - - qtd_sessoes = len(sessoes) + qs = tipo.queryset_tipo_numeracao(leg, sl, abertura) + qs &= Q(numero=num) - if qtd_sessoes > 0: - if instance.pk: # update - if instance.pk not in sessoes or qtd_sessoes > 1: - raise error - else: # create - raise error + if SessaoPlenaria.objects.filter(qs).exclude(pk=instance.pk).exists(): + raise error # Condições da verificação abertura_entre_leg = leg.data_inicio <= abertura <= leg.data_fim @@ -640,7 +630,7 @@ class OradorForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['parlamentar'].queryset = \ - Parlamentar.objects.filter(ativo=True).order_by('nome_parlamentar') + Parlamentar.objects.filter(ativo=True).order_by('nome_parlamentar') def clean(self): super(OradorForm, self).clean() @@ -662,8 +652,8 @@ class OradorForm(ModelForm): "Já existe orador nesta posição de ordem de pronunciamento" )) - return self.cleaned_data + class Meta: model = Orador exclude = ['sessao_plenaria'] @@ -676,7 +666,7 @@ class OradorExpedienteForm(ModelForm): sessao = SessaoPlenaria.objects.get(id=id_sessao) legislatura_vigente = sessao.legislatura self.fields['parlamentar'].queryset = \ - Parlamentar.objects.filter(mandato__legislatura=legislatura_vigente, + Parlamentar.objects.filter(mandato__legislatura=legislatura_vigente, ativo=True).order_by('nome_parlamentar') def clean(self): @@ -711,7 +701,7 @@ class OradorOrdemDiaForm(ModelForm): sessao = SessaoPlenaria.objects.get(id=id_sessao) legislatura_vigente = sessao.legislatura self.fields['parlamentar'].queryset = \ - Parlamentar.objects.filter(mandato__legislatura=legislatura_vigente, + Parlamentar.objects.filter(mandato__legislatura=legislatura_vigente, ativo=True).order_by('nome_parlamentar') def clean(self): diff --git a/sapl/sessao/migrations/0041_auto_20190610_1300.py b/sapl/sessao/migrations/0041_auto_20190610_1300.py new file mode 100644 index 000000000..da25e64b3 --- /dev/null +++ b/sapl/sessao/migrations/0041_auto_20190610_1300.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-06-10 16:00 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0040_auto_20190523_1130'), + ] + + operations = [ + migrations.AddField( + model_name='tiposessaoplenaria', + name='tipo_numeracao', + field=models.PositiveIntegerField(choices=[(1, 'Quinzenal'), (2, 'Mensal'), (10, 'Anual'), (11, 'Sessão Legislativa'), ( + 12, 'Legislatura'), (99, 'Numeração Única')], default=11, verbose_name='Tipo de Numeração'), + ), + migrations.AlterField( + model_name='tiposessaoplenaria', + name='nome', + field=models.CharField( + max_length=30, verbose_name='Descrição do Tipo'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 53721499b..8ab65ebfd 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -2,7 +2,8 @@ from operator import xor from django.core.exceptions import ValidationError from django.db import models -from django.utils import timezone +from django.db.models import Q +from django.utils import timezone, formats from django.utils.translation import ugettext_lazy as _ from model_utils import Choices import reversion @@ -73,10 +74,24 @@ class Bancada(models.Model): @reversion.register() class TipoSessaoPlenaria(models.Model): - nome = models.CharField(max_length=30, verbose_name=_('Tipo')) + + TIPO_NUMERACAO_CHOICES = Choices( + (1, 'quizenal', 'Quinzenal'), + (2, 'mensal', 'Mensal'), + (10, 'anual', 'Anual'), + (11, 'sessao_legislativa', 'Sessão Legislativa'), + (12, 'legislatura', 'Legislatura'), + (99, 'unica', 'Numeração Única'), + ) + + nome = models.CharField(max_length=30, verbose_name=_('Descrição do Tipo')) quorum_minimo = models.PositiveIntegerField( verbose_name=_('Quórum mínimo')) + tipo_numeracao = models.PositiveIntegerField( + verbose_name=_('Tipo de Numeração'), + choices=TIPO_NUMERACAO_CHOICES, default=11) + class Meta: verbose_name = _('Tipo de Sessão Plenária') verbose_name_plural = _('Tipos de Sessão Plenária') @@ -85,6 +100,29 @@ class TipoSessaoPlenaria(models.Model): def __str__(self): return self.nome + def queryset_tipo_numeracao(self, legislatura, sessao_legislativa, data): + + qs = Q(tipo=self) + tnc = self.TIPO_NUMERACAO_CHOICES + + if self.tipo_numeracao == tnc.unica: + pass + elif self.tipo_numeracao == tnc.legislatura: + qs &= Q(legislatura=legislatura) + elif self.tipo_numeracao == tnc.sessao_legislativa: + qs &= Q(sessao_legislativa=sessao_legislativa) + elif self.tipo_numeracao == tnc.anual: + qs &= Q(data_inicio__year=data.year) + elif self.tipo_numeracao in (tnc.mensal, tnc.quizenal): + qs &= Q(data_inicio__year=data.year, data_inicio__month=data.month) + + if self.tipo_numeracao == tnc.quizenal: + if data.day <= 15: + qs &= Q(data_inicio__day__lte=15) + else: + qs &= Q(data_inicio__day__gt=15) + return qs + def get_sessao_media_path(instance, subpath, filename): return './sapl/sessao/%s/%s/%s' % (instance.numero, subpath, filename) @@ -176,7 +214,34 @@ class SessaoPlenaria(models.Model): verbose_name_plural = _('Sessões Plenárias') def __str__(self): - return _('%(numero)sª Sessão %(tipo_nome)s' + + tnc = self.tipo.TIPO_NUMERACAO_CHOICES + + base = '{}ª {}'.format(self.numero, self.tipo.nome) + + if self.tipo.tipo_numeracao == tnc.quizenal: + base += ' da {}ª Quinzena'.format( + 1 if self.data_inicio.day > 15 else 2) + + if self.tipo.tipo_numeracao <= tnc.mensal: + base += ' do mês de {}'.format( + formats.date_format(self.data_inicio, 'F') + ) + + if self.tipo.tipo_numeracao <= tnc.anual: + base += ' de {}'.format(self.data_inicio.year) + + if self.tipo.tipo_numeracao <= tnc.sessao_legislativa: + base += ' da {}ª Sessão Legislativa'.format( + self.sessao_legislativa.numero) + + if self.tipo.tipo_numeracao <= tnc.legislatura: + base += ' da {}ª Legislatura'.format( + self.legislatura.numero) + + return base + + """return _('%(numero)sª Sessão %(tipo_nome)s' ' da %(sessao_legislativa_numero)sª Sessão Legislativa' ' da %(legislatura_id)sª Legislatura') % { @@ -185,6 +250,7 @@ class SessaoPlenaria(models.Model): 'sessao_legislativa_numero': self.sessao_legislativa.numero, # XXX check if it shouldn't be legislatura.numero 'legislatura_id': self.legislatura.numero} + """ def delete(self, using=None, keep_parents=False): if self.upload_pauta: diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index d5d709967..c570dfde8 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -2,7 +2,7 @@ from django.conf.urls import include, url from sapl.sessao.views import (AdicionarVariasMateriasExpediente, AdicionarVariasMateriasOrdemDia, BancadaCrud, - CargoBancadaCrud, ExpedienteMateriaCrud, + CargoBancadaCrud, ExpedienteMateriaCrud, ExpedienteView, JustificativaAusenciaCrud, OcorrenciaSessaoView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud, MesaView, OradorCrud, @@ -25,7 +25,7 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, VotacaoNominalView, VotacaoView, abrir_votacao, atualizar_mesa, insere_parlamentar_composicao, mudar_ordem_materia_sessao, recuperar_materia, - recuperar_numero_sessao, + recuperar_numero_sessao_view, remove_parlamentar_composicao, reordernar_materias_expediente, reordernar_materias_ordem, @@ -65,7 +65,7 @@ urlpatterns = [ url(r'^sessao/recuperar-materia/', recuperar_materia), url(r'^sessao/recuperar-numero-sessao/', - recuperar_numero_sessao, + recuperar_numero_sessao_view, name='recuperar_numero_sessao_view' ), url(r'^sessao/sessao-legislativa-legislatura-ajax/', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 93dd7fd9e..b720bf619 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -93,6 +93,7 @@ def reordernar_materias_ordem(request, pk): return HttpResponseRedirect( reverse('sapl.sessao:ordemdia_list', kwargs={'pk': pk})) + def renumerar_materias_ordem(request, pk): ordens = OrdemDia.objects.filter(sessao_plenaria_id=pk) @@ -103,6 +104,7 @@ def renumerar_materias_ordem(request, pk): return HttpResponseRedirect( reverse('sapl.sessao:ordemdia_list', kwargs={'pk': pk})) + def renumerar_materias_expediente(request, pk): expedientes = ExpedienteMateria.objects.filter(sessao_plenaria_id=pk) @@ -113,6 +115,7 @@ def renumerar_materias_expediente(request, pk): return HttpResponseRedirect( reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': pk})) + def verifica_presenca(request, model, spk): logger = logging.getLogger(__name__) if not model.objects.filter(sessao_plenaria_id=spk).exists(): @@ -595,7 +598,6 @@ class OradorCrud(MasterDetailCrud): class ListView(MasterDetailCrud.ListView): ordering = ['numero_ordem', 'parlamentar'] - class CreateView(MasterDetailCrud.CreateView): form_class = OradorForm @@ -607,7 +609,6 @@ class OradorCrud(MasterDetailCrud): return reverse('sapl.sessao:orador_list', kwargs={'pk': self.kwargs['pk']}) - class UpdateView(MasterDetailCrud.UpdateView): form_class = OradorForm @@ -615,7 +616,7 @@ class OradorCrud(MasterDetailCrud): def get_initial(self): initial = super(UpdateView, self).get_initial() initial.update({'id_sessao': self.object.sessao_plenaria.id}) - initial.update({'numero':self.object.numero_ordem}) + initial.update({'numero': self.object.numero_ordem}) return initial @@ -677,11 +678,24 @@ class BancadaCrud(CrudAux): return reverse('sapl.sessao:bancada_list') -def recuperar_numero_sessao(request): +def recuperar_numero_sessao_view(request): try: + tipo = TipoSessaoPlenaria.objects.get(pk=request.GET.get('tipo', '0')) + sl = request.GET.get('sessao_legislativa', '0') + l = request.GET.get('legislatura', '0') + data = request.GET.get('data_inicio', timezone.now()) + + if isinstance(data, str): + if data: + data = timezone.datetime.strptime(data, '%d/%m/%Y').date() + else: + data = timezone.now().date() + sessao = SessaoPlenaria.objects.filter( - tipo__pk=request.GET['tipo'], - sessao_legislativa=request.GET['sessao_legislativa']).last() + tipo.queryset_tipo_numeracao( + l, sl, data + )).last() + except ObjectDoesNotExist: numero = 1 else: @@ -1066,7 +1080,6 @@ class ListMateriaOrdemDiaView(FormMixin, DetailView): return self.get(self, request, args, kwargs) - class MesaView(FormMixin, DetailView): template_name = 'sessao/mesa.html' form_class = MesaForm @@ -1341,7 +1354,7 @@ def get_identificação_basica(sessao_plenaria): _('Encerramento: %(encerramento)s %(hora_fim)s') % { 'encerramento': encerramento, 'hora_fim': sessao_plenaria.hora_fim} ], - 'sessaoplenaria': sessao_plenaria}) + 'sessaoplenaria': sessao_plenaria}) def get_conteudo_multimidia(sessao_plenaria): @@ -1360,7 +1373,8 @@ def get_conteudo_multimidia(sessao_plenaria): def get_mesa_diretora(sessao_plenaria): - mesa = IntegranteMesa.objects.filter(sessao_plenaria=sessao_plenaria).order_by('cargo_id') + mesa = IntegranteMesa.objects.filter( + sessao_plenaria=sessao_plenaria).order_by('cargo_id') integrantes = [{'parlamentar': m.parlamentar, 'cargo': m.cargo} for m in mesa] return {'mesa': integrantes} @@ -1369,8 +1383,8 @@ def get_mesa_diretora(sessao_plenaria): def get_presenca_sessao(sessao_plenaria): parlamentares_sessao = [p.parlamentar for p in SessaoPlenariaPresenca.objects.filter( - sessao_plenaria_id=sessao_plenaria.id - ).order_by('parlamentar__nome_parlamentar')] + sessao_plenaria_id=sessao_plenaria.id + ).order_by('parlamentar__nome_parlamentar')] ausentes_sessao = JustificativaAusencia.objects.filter( sessao_plenaria_id=sessao_plenaria.id @@ -1404,7 +1418,8 @@ def get_materias_expediente(sessao_plenaria): numero = m.numero_ordem tramitacao = '' - tramitacoes = Tramitacao.objects.filter(materia=m.materia).order_by('-pk') + tramitacoes = Tramitacao.objects.filter( + materia=m.materia).order_by('-pk') for aux_tramitacao in tramitacoes: if aux_tramitacao.turno: tramitacao = aux_tramitacao @@ -1466,8 +1481,8 @@ def get_oradores_expediente(sessao_plenaria): def get_presenca_ordem_do_dia(sessao_plenaria): parlamentares_ordem = [p.parlamentar for p in PresencaOrdemDia.objects.filter( - sessao_plenaria_id=sessao_plenaria.id - ).order_by('parlamentar__nome_parlamentar')] + sessao_plenaria_id=sessao_plenaria.id + ).order_by('parlamentar__nome_parlamentar')] return {'presenca_ordem': parlamentares_ordem} @@ -1480,13 +1495,14 @@ def get_assinaturas(sessao_plenaria): '')] parlamentares_ordem = [p.parlamentar for p in PresencaOrdemDia.objects.filter( - sessao_plenaria_id=sessao_plenaria.id - ).order_by('parlamentar__nome_parlamentar')] + sessao_plenaria_id=sessao_plenaria.id + ).order_by('parlamentar__nome_parlamentar')] parlamentares_mesa = [m['parlamentar'] for m in mesa_dia] # filtra parlamentares retirando os que sao da mesa - parlamentares_ordem = [p for p in parlamentares_ordem if p not in parlamentares_mesa] + parlamentares_ordem = [ + p for p in parlamentares_ordem if p not in parlamentares_mesa] context = {} config_assinatura_ata = AppsAppConfig.attr('assinatura_ata') @@ -1517,7 +1533,8 @@ def get_materias_ordem_do_dia(sessao_plenaria): numero = o.numero_ordem tramitacao = '' - tramitacoes = Tramitacao.objects.filter(materia=o.materia).order_by('-pk') + tramitacoes = Tramitacao.objects.filter( + materia=o.materia).order_by('-pk') for aux_tramitacao in tramitacoes: if aux_tramitacao.turno: tramitacao = aux_tramitacao @@ -1600,7 +1617,7 @@ def get_oradores_ordemdia(sessao_plenaria): observacao = orador.observacao parlamentar = Parlamentar.objects.get( id=orador.parlamentar_id - ) + ) o = { 'numero_ordem': numero_ordem, 'url_discurso': url_discurso, @@ -1610,9 +1627,9 @@ def get_oradores_ordemdia(sessao_plenaria): oradores.append(o) context = {'oradores_ordemdia': oradores} - return context + return context + - def get_oradores_explicações_pessoais(sessao_plenaria): oradores_explicacoes = [] for orador in Orador.objects.filter( @@ -1729,7 +1746,7 @@ class ResumoView(DetailView): # ===================================================================== # Oradores Ordem do Dia context.update(get_oradores_ordemdia(self.object)) - # ===================================================================== + # ===================================================================== # Oradores nas Explicações Pessoais context.update(get_oradores_explicações_pessoais(self.object)) # ===================================================================== diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index 16e353910..f5356a829 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -1,11 +1,11 @@ {% load i18n %} TipoSessaoPlenaria: {% trans 'Tipo de Sessão Plenária' %}: - - nome quorum_minimo + - nome quorum_minimo tipo_numeracao SessaoPlenaria: {% trans 'Dados Básicos' %}: - - legislatura sessao_legislativa tipo:3 numero:1 + - legislatura sessao_legislativa tipo numero:2 - data_inicio:5 hora_inicio:5 iniciada - data_fim:5 hora_fim:5 finalizada - upload_pauta upload_ata upload_anexo diff --git a/sapl/templates/sessao/sessaoplenaria_form.html b/sapl/templates/sessao/sessaoplenaria_form.html index ee1bba4ac..aa18e0105 100644 --- a/sapl/templates/sessao/sessaoplenaria_form.html +++ b/sapl/templates/sessao/sessaoplenaria_form.html @@ -7,24 +7,35 @@ {% endblock foot_js %} - diff --git a/sapl/templates/materia/em_lote/tramitacao.html b/sapl/templates/materia/em_lote/tramitacao.html index 94cecf52f..5cc4a0b90 100644 --- a/sapl/templates/materia/em_lote/tramitacao.html +++ b/sapl/templates/materia/em_lote/tramitacao.html @@ -134,19 +134,5 @@ checkboxes[i].checked = elem.checked; } } - - $(document).ready(function(){ - var primeira_tramitacao = {{primeira_tramitacao|yesno:"true,false"}} - - if (primeira_tramitacao == false){ - $('#id_unidade_tramitacao_local').prop('disabled', true); - } - - // Reabilita o campo, no momento do Submit, para que seu dado seja enviado - $('input[type=submit]').click(function() { - $('#id_unidade_tramitacao_local').attr('disabled', false); - $('#id_unidade_tramitacao_local').parents('form').submit(); - }); - }); {% endblock %} diff --git a/sapl/templates/materia/tramitacao_form.html b/sapl/templates/materia/tramitacao_form.html deleted file mode 100644 index 4e79e3fd2..000000000 --- a/sapl/templates/materia/tramitacao_form.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "crud/form.html" %} -{% load i18n %} - -{% block extra_js %} - - - -{% endblock %} diff --git a/sapl/templates/protocoloadm/em_lote/tramitacaoadm.html b/sapl/templates/protocoloadm/em_lote/tramitacaoadm.html index 94796621f..38fe2b0c5 100644 --- a/sapl/templates/protocoloadm/em_lote/tramitacaoadm.html +++ b/sapl/templates/protocoloadm/em_lote/tramitacaoadm.html @@ -21,26 +21,12 @@ {% block extra_js %} {% endblock %} diff --git a/sapl/templates/protocoloadm/tramitacaoadministrativo_form.html b/sapl/templates/protocoloadm/tramitacaoadministrativo_form.html deleted file mode 100644 index 2bd266314..000000000 --- a/sapl/templates/protocoloadm/tramitacaoadministrativo_form.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "crud/form.html" %} -{% load i18n %} -{% block extra_js %} - -{% endblock extra_js %} \ No newline at end of file From 8b183c9156a2ca52ce3c6e6c62482fdd1168bd38 Mon Sep 17 00:00:00 2001 From: Cesar Carvalho Date: Mon, 24 Jun 2019 15:30:03 -0300 Subject: [PATCH 18/18] Release: 3.1.158 --- docker-compose.yml | 2 +- sapl/settings.py | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d5b87fd31..cb57ad36e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.157 + image: interlegis/sapl:3.1.158 # build: . restart: always environment: diff --git a/sapl/settings.py b/sapl/settings.py index 06015e777..1167d33f3 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -41,7 +41,7 @@ ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' LOGIN_URL = '/login/?next=' -SAPL_VERSION = '3.1.157' +SAPL_VERSION = '3.1.158' if DEBUG: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' diff --git a/sapl/templates/base.html b/sapl/templates/base.html index f87356e12..0df0d6dee 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -179,7 +179,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.157 + Release: 3.1.158

diff --git a/setup.py b/setup.py index a2c6f92ba..bb2a50556 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.157', + version='3.1.158', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',