diff --git a/docker-compose.yml b/docker-compose.yml index 8a285050a..9179ca79e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.114 + image: interlegis/sapl:3.1.116 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/sapl/base/forms.py b/sapl/base/forms.py index e6e052534..43a591b15 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -194,16 +194,19 @@ class SessaoLegislativaForm(ModelForm): 'inserida, favor verificar as Sessões existentes antes de criar uma ' 'nova Sessão Legislativa') - sessoes_legislativas = SessaoLegislativa.objects.filter(legislatura=legislatura).exclude(pk=pk) - - if sessoes_legislativas: - numeracoes = [n.numero for n in sessoes_legislativas] - numeracoes = sorted(numeracoes) - ult = max(numeracoes) - else: - ult = SessaoLegislativa.objects.latest('data_fim') - flag_edit = ult.id != pk - ult = ult.numero + #sessoes_legislativas = SessaoLegislativa.objects.filter(legislatura=legislatura).exclude(pk=pk) + + # if sessoes_legislativas: + # numeracoes = [n.numero for n in sessoes_legislativas] + # numeracoes = sorted(numeracoes) + # ult = max(numeracoes) + # + # else: + # ult = SessaoLegislativa.objects.latest('data_fim') + # flag_edit = ult.id != pk + # ult = ult.numero + + ult = 0 if numero <= ult and flag_edit: raise ValidationError('O número da Sessão Legislativa não pode ser menor ou igual ' diff --git a/sapl/compilacao/compilacao_data_tables.sql b/sapl/compilacao/compilacao_data_tables.sql index cd70c3e6f..0d3841713 100644 --- a/sapl/compilacao/compilacao_data_tables.sql +++ b/sapl/compilacao/compilacao_data_tables.sql @@ -260,6 +260,8 @@ INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (122, 119, false, 1, -1, false); INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (122, 119, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (3, 125, false, 3, -1, false); + INSERT INTO compilacao_tiponota (id, sigla, nome, modelo) VALUES (1, 'NE', 'Nota Explicativa', ''); diff --git a/sapl/compilacao/migrations/0007_auto_20180911_1600.py b/sapl/compilacao/migrations/0007_auto_20180911_1600.py new file mode 100644 index 000000000..9db7dfa4f --- /dev/null +++ b/sapl/compilacao/migrations/0007_auto_20180911_1600.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-03-21 13:54 +from __future__ import unicode_literals + +from django.db import migrations, models + + +def insert_relacionamento_entre_dispositivos(apps, schema_editor): + + TipoDispositivoRelationship = apps.get_model( + 'compilacao', 'TipoDispositivoRelationship') + + try: + if TipoDispositivoRelationship.objects.exists(): + rel = TipoDispositivoRelationship() + rel.filho_permitido_id = 3 + rel.pai_id = 125 + rel.filho_de_insercao_automatica = False + rel.perfil_id = 3 + rel.quantidade_permitida = -1 + rel.permitir_variacao = False + rel.save() + except: + pass + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0006_auto_20180321_1054'), + ] + + operations = [ + migrations.RunPython(insert_relacionamento_entre_dispositivos), + ] diff --git a/sapl/materia/views.py b/sapl/materia/views.py index fa48209e2..622383726 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1843,7 +1843,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): # issue https://github.com/interlegis/sapl/issues/1123 # TODO: usar Form urgente = request.POST['urgente'] == 'True' - + flag_error = False for materia_id in marcadas: t = Tramitacao( materia_id=materia_id, @@ -1861,9 +1861,17 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): texto=request.POST['texto'] ) t.save() - tramitacao_signal.send(sender=Tramitacao, - post=t, - request=self.request) + try: + tramitacao_signal.send(sender=Tramitacao, + post=t, + request=self.request) + except Exception: + flag_error = True + if flag_error: + msg = _('Tramitação criada, mas e-mail de acompanhamento ' + 'de matéria não enviado. Há problemas na configuração ' + 'do e-mail.') + messages.add_message(self.request, messages.ERROR, msg) status = StatusTramitacao.objects.get(id=request.POST['status']) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 22e649459..8f80a5632 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -304,15 +304,15 @@ class ProtocoloDocumentForm(ModelForm): numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True) assunto = forms.CharField( - widget=forms.Textarea, label='Assunto', required=True) + widget=forms.Textarea, label=_('Assunto'), required=True) interessado = forms.CharField(required=True, - label='Interessado') + label=_('Interessado')) observacao = forms.CharField(required=False, - widget=forms.Textarea, label='Observação') + widget=forms.Textarea, label=_('Observação')) - numero = forms.IntegerField(required=False, label='Número de Protocolo (opcional)') + numero = forms.IntegerField(required=False, label=_('Número de Protocolo (opcional)')) class Meta: model = Protocolo @@ -394,12 +394,12 @@ class ProtocoloMateriaForm(ModelForm): numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True) observacao = forms.CharField(required=False, - widget=forms.Textarea, label='Observação') + widget=forms.Textarea, label=_('Observação')) assunto_ementa = forms.CharField(required=True, - widget=forms.Textarea, label='Ementa') + widget=forms.Textarea, label=_('Ementa')) - numero = forms.IntegerField(required=False, label='Número de Protocolo (opcional)') + numero = forms.IntegerField(required=False, label=_('Número de Protocolo (opcional)')) class Meta: model = Protocolo @@ -636,6 +636,11 @@ class DocumentoAdministrativoForm(ModelForm): label=Protocolo._meta. get_field('numero').verbose_name) + restrito = forms.ChoiceField(label=_('Acesso Restrito'), + widget=forms.RadioSelect(), + choices=YES_NO_CHOICES, + initial=False) + class Meta: model = DocumentoAdministrativo fields = ['tipo', @@ -653,6 +658,7 @@ class DocumentoAdministrativoForm(ModelForm): 'observacao', 'texto_integral', 'protocolo', + 'restrito' ] widgets = {'protocolo': forms.HiddenInput()} @@ -682,7 +688,7 @@ class DocumentoAdministrativoForm(ModelForm): tipo=tipo_documento, ano=ano_protocolo).exists() if doc_exists: - raise ValidationError('Documento já existente') + raise ValidationError(_('Documento já existente')) # campos opcionais, mas que se informados devem ser válidos if numero_protocolo and ano_protocolo: @@ -740,7 +746,7 @@ class DocumentoAdministrativoForm(ModelForm): [('assunto', 12)]) row4 = to_row( - [('interessado', 9), ('tramitacao', 3)]) + [('interessado', 8), ('tramitacao', 2), (InlineRadios('restrito'), 2)]) row5 = to_row( [('texto_integral', 12)]) diff --git a/sapl/protocoloadm/migrations/0006_documentoadministrativo_restrito.py b/sapl/protocoloadm/migrations/0006_documentoadministrativo_restrito.py new file mode 100644 index 000000000..ac7f0de94 --- /dev/null +++ b/sapl/protocoloadm/migrations/0006_documentoadministrativo_restrito.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-09-10 12:07 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0005_auto_20180824_1241'), + ] + + operations = [ + migrations.AddField( + model_name='documentoadministrativo', + name='restrito', + field=models.BooleanField(default=False, verbose_name='Acesso Restrito'), + ), + ] diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py index 1fd38e720..347b8545e 100644 --- a/sapl/protocoloadm/models.py +++ b/sapl/protocoloadm/models.py @@ -93,7 +93,7 @@ class Protocolo(models.Model): user_anulacao = models.CharField(max_length=20, blank=True) ip_anulacao = models.CharField(max_length=15, blank=True) justificativa_anulacao = models.CharField( - max_length=60, blank=True, verbose_name='Motivo') + max_length=60, blank=True, verbose_name=_('Motivo')) timestamp_anulacao = models.DateTimeField(blank=True, null=True) class Meta: @@ -148,6 +148,9 @@ class DocumentoAdministrativo(models.Model): null=True, upload_to=texto_upload_path, verbose_name=_('Texto Integral')) + restrito = models.BooleanField(default=False, + verbose_name=_('Acesso Restrito'), + blank=True) class Meta: verbose_name = _('Documento Administrativo') diff --git a/sapl/protocoloadm/tests/test_protocoloadm.py b/sapl/protocoloadm/tests/test_protocoloadm.py index f74c4dd7b..2f61d359f 100644 --- a/sapl/protocoloadm/tests/test_protocoloadm.py +++ b/sapl/protocoloadm/tests/test_protocoloadm.py @@ -359,8 +359,9 @@ def test_documento_administrativo_invalido(): assert errors['assunto'] == [_('Este campo é obrigatório.')] assert errors['numero'] == [_('Este campo é obrigatório.')] assert errors['data'] == [_('Este campo é obrigatório.')] + assert errors['restrito'] == [_('Este campo é obrigatório.')] - assert len(errors) == 5 + assert len(errors) == 6 @pytest.mark.django_db(transaction=False) @@ -374,7 +375,8 @@ def test_documento_administrativo_protocolo_inexistente(): 'numero': '1', 'data': '2017-10-10', 'numero_protocolo': '11', - 'ano_protocolo': '2017' + 'ano_protocolo': '2017', + 'restrito': False }) assert not form.is_valid() diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index d86063887..a084f899c 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -142,6 +142,13 @@ class DocumentoAdministrativoCrud(Crud): class DetailView(DocumentoAdministrativoMixin, Crud.DetailView): + def get(self, *args, **kwargs): + pk = self.kwargs['pk'] + documento = DocumentoAdministrativo.objects.get(id=pk) + if documento.restrito and self.request.user.is_anonymous(): + return redirect('/') + return super(Crud.DetailView, self).get(args, kwargs) + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) self.layout_display[0]['rows'][-1][0]['text'] = ( diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 34ae035f9..0166e848e 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -103,9 +103,8 @@ class SessaoPlenariaForm(ModelForm): abertura_entre_leg = leg.data_inicio <= abertura <= leg.data_fim abertura_entre_sl = sl.data_inicio <= abertura <= sl.data_fim if encerramento is not None: - encerramento_entre_leg = leg.data_inicio < encerramento < leg.data_fim - encerramento_entre_sl = sl.data_inicio < encerramento < sl.data_fim - + encerramento_entre_leg = leg.data_inicio <= encerramento <= leg.data_fim + encerramento_entre_sl = sl.data_inicio <= encerramento <= sl.data_fim # Verificação das datas de abertura e encerramento da Sessão # Verificações com a data de encerramento preenchidas if encerramento is not None: diff --git a/sapl/templates/compilacao/text_edit_bloco.html b/sapl/templates/compilacao/text_edit_bloco.html index 27b6c38fc..27056b7f2 100644 --- a/sapl/templates/compilacao/text_edit_bloco.html +++ b/sapl/templates/compilacao/text_edit_bloco.html @@ -36,9 +36,6 @@ {{ node.td.rotulo_sufixo_html|safe }} {% endif %} - - - {{ node.td.texto_prefixo_html|safe }} {% if node.da and node in node.da.alts and not node.dpt.visibilidade %}({% trans 'Dispositivo visível apenas no Texto Articulado Original'%}){% endif %} diff --git a/sapl/templates/compilacao/text_list_blocoalteracao.html b/sapl/templates/compilacao/text_list_blocoalteracao.html index 26b069072..ed9876fd9 100644 --- a/sapl/templates/compilacao/text_list_blocoalteracao.html +++ b/sapl/templates/compilacao/text_list_blocoalteracao.html @@ -5,15 +5,31 @@ {% if ch.visibilidade %}