Browse Source

Merge branch '3.1.x' of https://github.com/interlegis/sapl into 2195-relatorio-reuniao-audiencia

pull/2200/head
Mariana Mendes 7 years ago
parent
commit
52e7bb472f
  1. 2
      docker-compose.yml
  2. 23
      sapl/base/forms.py
  3. 2
      sapl/compilacao/compilacao_data_tables.sql
  4. 35
      sapl/compilacao/migrations/0007_auto_20180911_1600.py
  5. 16
      sapl/materia/views.py
  6. 24
      sapl/protocoloadm/forms.py
  7. 20
      sapl/protocoloadm/migrations/0006_documentoadministrativo_restrito.py
  8. 5
      sapl/protocoloadm/models.py
  9. 6
      sapl/protocoloadm/tests/test_protocoloadm.py
  10. 7
      sapl/protocoloadm/views.py
  11. 5
      sapl/sessao/forms.py
  12. 3
      sapl/templates/compilacao/text_edit_bloco.html
  13. 34
      sapl/templates/compilacao/text_list_blocoalteracao.html
  14. 4
      sapl/templates/protocoloadm/documentoadministrativo_filter.html
  15. 2
      setup.py

2
docker-compose.yml

@ -11,7 +11,7 @@ sapldb:
ports: ports:
- "5432:5432" - "5432:5432"
sapl: sapl:
image: interlegis/sapl:3.1.114 image: interlegis/sapl:3.1.116
restart: always restart: always
environment: environment:
ADMIN_PASSWORD: interlegis ADMIN_PASSWORD: interlegis

23
sapl/base/forms.py

@ -194,16 +194,19 @@ class SessaoLegislativaForm(ModelForm):
'inserida, favor verificar as Sessões existentes antes de criar uma ' 'inserida, favor verificar as Sessões existentes antes de criar uma '
'nova Sessão Legislativa') 'nova Sessão Legislativa')
sessoes_legislativas = SessaoLegislativa.objects.filter(legislatura=legislatura).exclude(pk=pk) #sessoes_legislativas = SessaoLegislativa.objects.filter(legislatura=legislatura).exclude(pk=pk)
if sessoes_legislativas: # if sessoes_legislativas:
numeracoes = [n.numero for n in sessoes_legislativas] # numeracoes = [n.numero for n in sessoes_legislativas]
numeracoes = sorted(numeracoes) # numeracoes = sorted(numeracoes)
ult = max(numeracoes) # ult = max(numeracoes)
else: #
ult = SessaoLegislativa.objects.latest('data_fim') # else:
flag_edit = ult.id != pk # ult = SessaoLegislativa.objects.latest('data_fim')
ult = ult.numero # flag_edit = ult.id != pk
# ult = ult.numero
ult = 0
if numero <= ult and flag_edit: if numero <= ult and flag_edit:
raise ValidationError('O número da Sessão Legislativa não pode ser menor ou igual ' raise ValidationError('O número da Sessão Legislativa não pode ser menor ou igual '

2
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, 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 (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', ''); INSERT INTO compilacao_tiponota (id, sigla, nome, modelo) VALUES (1, 'NE', 'Nota Explicativa', '');

35
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),
]

16
sapl/materia/views.py

@ -1843,7 +1843,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
# issue https://github.com/interlegis/sapl/issues/1123 # issue https://github.com/interlegis/sapl/issues/1123
# TODO: usar Form # TODO: usar Form
urgente = request.POST['urgente'] == 'True' urgente = request.POST['urgente'] == 'True'
flag_error = False
for materia_id in marcadas: for materia_id in marcadas:
t = Tramitacao( t = Tramitacao(
materia_id=materia_id, materia_id=materia_id,
@ -1861,9 +1861,17 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
texto=request.POST['texto'] texto=request.POST['texto']
) )
t.save() t.save()
tramitacao_signal.send(sender=Tramitacao, try:
post=t, tramitacao_signal.send(sender=Tramitacao,
request=self.request) 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']) status = StatusTramitacao.objects.get(id=request.POST['status'])

24
sapl/protocoloadm/forms.py

@ -304,15 +304,15 @@ class ProtocoloDocumentForm(ModelForm):
numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True) numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True)
assunto = forms.CharField( assunto = forms.CharField(
widget=forms.Textarea, label='Assunto', required=True) widget=forms.Textarea, label=_('Assunto'), required=True)
interessado = forms.CharField(required=True, interessado = forms.CharField(required=True,
label='Interessado') label=_('Interessado'))
observacao = forms.CharField(required=False, 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: class Meta:
model = Protocolo model = Protocolo
@ -394,12 +394,12 @@ class ProtocoloMateriaForm(ModelForm):
numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True) numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True)
observacao = forms.CharField(required=False, observacao = forms.CharField(required=False,
widget=forms.Textarea, label='Observação') widget=forms.Textarea, label=_('Observação'))
assunto_ementa = forms.CharField(required=True, 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: class Meta:
model = Protocolo model = Protocolo
@ -636,6 +636,11 @@ class DocumentoAdministrativoForm(ModelForm):
label=Protocolo._meta. label=Protocolo._meta.
get_field('numero').verbose_name) get_field('numero').verbose_name)
restrito = forms.ChoiceField(label=_('Acesso Restrito'),
widget=forms.RadioSelect(),
choices=YES_NO_CHOICES,
initial=False)
class Meta: class Meta:
model = DocumentoAdministrativo model = DocumentoAdministrativo
fields = ['tipo', fields = ['tipo',
@ -653,6 +658,7 @@ class DocumentoAdministrativoForm(ModelForm):
'observacao', 'observacao',
'texto_integral', 'texto_integral',
'protocolo', 'protocolo',
'restrito'
] ]
widgets = {'protocolo': forms.HiddenInput()} widgets = {'protocolo': forms.HiddenInput()}
@ -682,7 +688,7 @@ class DocumentoAdministrativoForm(ModelForm):
tipo=tipo_documento, tipo=tipo_documento,
ano=ano_protocolo).exists() ano=ano_protocolo).exists()
if doc_exists: if doc_exists:
raise ValidationError('Documento já existente') raise ValidationError(_('Documento já existente'))
# campos opcionais, mas que se informados devem ser válidos # campos opcionais, mas que se informados devem ser válidos
if numero_protocolo and ano_protocolo: if numero_protocolo and ano_protocolo:
@ -740,7 +746,7 @@ class DocumentoAdministrativoForm(ModelForm):
[('assunto', 12)]) [('assunto', 12)])
row4 = to_row( row4 = to_row(
[('interessado', 9), ('tramitacao', 3)]) [('interessado', 8), ('tramitacao', 2), (InlineRadios('restrito'), 2)])
row5 = to_row( row5 = to_row(
[('texto_integral', 12)]) [('texto_integral', 12)])

20
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'),
),
]

5
sapl/protocoloadm/models.py

@ -93,7 +93,7 @@ class Protocolo(models.Model):
user_anulacao = models.CharField(max_length=20, blank=True) user_anulacao = models.CharField(max_length=20, blank=True)
ip_anulacao = models.CharField(max_length=15, blank=True) ip_anulacao = models.CharField(max_length=15, blank=True)
justificativa_anulacao = models.CharField( 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) timestamp_anulacao = models.DateTimeField(blank=True, null=True)
class Meta: class Meta:
@ -148,6 +148,9 @@ class DocumentoAdministrativo(models.Model):
null=True, null=True,
upload_to=texto_upload_path, upload_to=texto_upload_path,
verbose_name=_('Texto Integral')) verbose_name=_('Texto Integral'))
restrito = models.BooleanField(default=False,
verbose_name=_('Acesso Restrito'),
blank=True)
class Meta: class Meta:
verbose_name = _('Documento Administrativo') verbose_name = _('Documento Administrativo')

6
sapl/protocoloadm/tests/test_protocoloadm.py

@ -359,8 +359,9 @@ def test_documento_administrativo_invalido():
assert errors['assunto'] == [_('Este campo é obrigatório.')] assert errors['assunto'] == [_('Este campo é obrigatório.')]
assert errors['numero'] == [_('Este campo é obrigatório.')] assert errors['numero'] == [_('Este campo é obrigatório.')]
assert errors['data'] == [_('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) @pytest.mark.django_db(transaction=False)
@ -374,7 +375,8 @@ def test_documento_administrativo_protocolo_inexistente():
'numero': '1', 'numero': '1',
'data': '2017-10-10', 'data': '2017-10-10',
'numero_protocolo': '11', 'numero_protocolo': '11',
'ano_protocolo': '2017' 'ano_protocolo': '2017',
'restrito': False
}) })
assert not form.is_valid() assert not form.is_valid()

7
sapl/protocoloadm/views.py

@ -142,6 +142,13 @@ class DocumentoAdministrativoCrud(Crud):
class DetailView(DocumentoAdministrativoMixin, Crud.DetailView): 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): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
self.layout_display[0]['rows'][-1][0]['text'] = ( self.layout_display[0]['rows'][-1][0]['text'] = (

5
sapl/sessao/forms.py

@ -103,9 +103,8 @@ class SessaoPlenariaForm(ModelForm):
abertura_entre_leg = leg.data_inicio <= abertura <= leg.data_fim abertura_entre_leg = leg.data_inicio <= abertura <= leg.data_fim
abertura_entre_sl = sl.data_inicio <= abertura <= sl.data_fim abertura_entre_sl = sl.data_inicio <= abertura <= sl.data_fim
if encerramento is not None: if encerramento is not None:
encerramento_entre_leg = leg.data_inicio < encerramento < leg.data_fim encerramento_entre_leg = leg.data_inicio <= encerramento <= leg.data_fim
encerramento_entre_sl = sl.data_inicio < encerramento < sl.data_fim encerramento_entre_sl = sl.data_inicio <= encerramento <= sl.data_fim
# Verificação das datas de abertura e encerramento da Sessão # Verificação das datas de abertura e encerramento da Sessão
# Verificações com a data de encerramento preenchidas # Verificações com a data de encerramento preenchidas
if encerramento is not None: if encerramento is not None:

3
sapl/templates/compilacao/text_edit_bloco.html

@ -36,9 +36,6 @@
{{ node.td.rotulo_sufixo_html|safe }} {{ node.td.rotulo_sufixo_html|safe }}
{% endif %} {% endif %}
{{ node.td.texto_prefixo_html|safe }} {{ node.td.texto_prefixo_html|safe }}
{% if node.da and node in node.da.alts and not node.dpt.visibilidade %}<small>({% trans 'Dispositivo visível apenas no Texto Articulado Original'%})</small>{% endif %} {% if node.da and node in node.da.alts and not node.dpt.visibilidade %}<small>({% trans 'Dispositivo visível apenas no Texto Articulado Original'%})</small>{% endif %}

34
sapl/templates/compilacao/text_list_blocoalteracao.html

@ -5,15 +5,31 @@
{% if ch.visibilidade %} {% if ch.visibilidade %}
<div class="dpt" id="d{{ch.id}}" nivel="{{ch.nivel}}"> <div class="dpt" id="d{{ch.id}}" nivel="{{ch.nivel}}">
<div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}"> <div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}">
{% if ch.auto_inserido %} {% if ch.auto_inserido %}
{{ ch.dispositivo_pai.tipo_dispositivo.rotulo_prefixo_html|safe }} {{ ch.dispositivo_pai.tipo_dispositivo.rotulo_prefixo_html|safe }}
<a name="{{ch.dispositivo_pai.pk}}" href="{% url 'sapl.compilacao:ta_text' ch.dispositivo_pai.ta.pk %}#{{ch.dispositivo_pai.pk}}">{{ ch.dispositivo_pai.rotulo }}</a> {% if ch.dispositivo_pai.rotulo %}
{{ ch.dispositivo_pai.tipo_dispositivo.rotulo_sufixo_html|safe }} <a name="{{ch.dispositivo_pai.pk}}" href="{% url 'sapl.compilacao:ta_text' ch.dispositivo_pai.ta.pk %}#{{ch.dispositivo_pai.pk}}">{{ ch.dispositivo_pai.rotulo }}</a>
{% endif %} {{ ch.dispositivo_pai.tipo_dispositivo.rotulo_sufixo_html|safe }}
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }} {% else %}
<a name="{{ch.pk}}" href="{% url 'sapl.compilacao:ta_text' ch.ta.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a> <a name="{{ch.dispositivo_pai.pk}}" href="{% url 'sapl.compilacao:ta_text' ch.dispositivo_pai.ta.pk %}#{{ch.dispositivo_pai.pk}}">
{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }} {{ ch.dispositivo_pai.tipo_dispositivo.rotulo_sufixo_html|safe }}
{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} </a>
{% endif %}
{% endif %}
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}
{% if ch.rotulo %}
<a name="{{ch.pk}}" href="{% url 'sapl.compilacao:ta_text' ch.ta.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>
{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}
{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
{% elif not ch.rotulo and not ch.auto_inserido %}
<a name="{{ch.pk}}" href="{% url 'sapl.compilacao:ta_text' ch.ta.pk %}#{{ch.pk}}">
{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}
{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
</a>
{% else %}
{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}
{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
{% endif %}
</div> </div>
</div> </div>
{%endif%} {%endif%}

4
sapl/templates/protocoloadm/documentoadministrativo_filter.html

@ -34,10 +34,11 @@
{% endif %} {% endif %}
{% for d in page_obj %} {% for d in page_obj %}
{% if request.user.is_anonymous and not d.restrito or not request.user.is_anonymous%}
<tr> <tr>
<td> <td>
<strong><a href="{% url 'sapl.protocoloadm:documentoadministrativo_detail' d.id %}">{{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}</strong></a></br> <strong><a href="{% url 'sapl.protocoloadm:documentoadministrativo_detail' d.id %}">{{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}</strong></a></br>
<strong>Interessado:</strong>&nbsp;{{ d.interessado|default_if_none:"Não informado"}} <strong>Interessado:</strong>&nbsp;{{ d.interessado|default_if_none:"Não informado"}}
</br> </br>
<strong>Assunto:</strong>&nbsp;{{ d.assunto|safe }} <strong>Assunto:</strong>&nbsp;{{ d.assunto|safe }}
</br> </br>
@ -65,6 +66,7 @@
</td> </td>
</tr> </tr>
{% endif %}
{% endfor %} {% endfor %}
{% else %} {% else %}
<tr><td><h3>Nenhum documento encontrado com essas especificações</h3></tr> <tr><td><h3>Nenhum documento encontrado com essas especificações</h3></tr>

2
setup.py

@ -49,7 +49,7 @@ install_requires = [
] ]
setup( setup(
name='interlegis-sapl', name='interlegis-sapl',
version='3.1.114', version='3.1.116',
packages=find_packages(), packages=find_packages(),
include_package_data=True, include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',

Loading…
Cancel
Save