Browse Source

Merge branch 'master' into 758-refatora-painel

pull/792/head
Eduardo Calil 9 years ago
parent
commit
95ed2fd0f1
  1. 24
      README.rst
  2. 10
      sapl/compilacao/compilacao_data_tables.sql
  3. 8
      sapl/compilacao/forms.py
  4. 21
      sapl/compilacao/migrations/0070_perfilestruturaltextoarticulado_parent.py
  5. 20
      sapl/compilacao/migrations/0071_tipotextoarticulado_perfis.py
  6. 55
      sapl/compilacao/migrations/0072_auto_20161112_1553.py
  7. 130
      sapl/compilacao/models.py
  8. 78
      sapl/compilacao/views.py
  9. 89
      sapl/materia/forms.py
  10. 35
      sapl/materia/migrations/0068_auto_20161110_0910.py
  11. 21
      sapl/materia/migrations/0069_tipoproposicao_perfis.py
  12. 21
      sapl/materia/migrations/0070_auto_20161111_1301.py
  13. 42
      sapl/materia/models.py
  14. 13
      sapl/materia/views.py
  15. 109
      sapl/norma/forms.py
  16. 20
      sapl/norma/migrations/0022_auto_20161110_0910.py
  17. 10
      sapl/norma/urls.py
  18. 144
      sapl/norma/views.py
  19. 25
      sapl/protocoloadm/migrations/0007_auto_20161110_0910.py
  20. 6
      sapl/templates/base.html
  21. 2
      sapl/templates/compilacao/ajax_actions_dinamic_edit.html
  22. 2
      sapl/templates/compilacao/text_edit.html
  23. 5
      sapl/templates/compilacao/text_list.html
  24. 6
      sapl/templates/compilacao/textoarticulado_detail.html
  25. 12
      sapl/templates/compilacao/tipotextoarticulado_detail.html
  26. 2
      sapl/templates/materia/layouts.yaml
  27. 15
      sapl/templates/materia/proposicao_form.html
  28. 6
      sapl/templates/materia/tipoproposicao_form.html
  29. 2
      sapl/templates/navbar.yaml
  30. 39
      sapl/templates/norma/list_pesquisa.html
  31. 62
      sapl/templates/norma/normajuridica_filter.html
  32. 20
      sapl/templates/norma/pesquisa.html

24
README.rst

@ -34,8 +34,6 @@ Instalar as seguintes dependências do sistema::
software-properties-common build-essential libxml2-dev libjpeg-dev \
libmysqlclient-dev libssl-dev libffi-dev libxslt1-dev python3-setuptools curl
sudo easy_install3 pip lxml
sudo -i
curl -sL https://deb.nodesource.com/setup_5.x | bash -
exit
@ -197,11 +195,11 @@ Instruções para criação do super usuário e de usuários de testes
./manage.py createsuperuser
* `Os perfis semânticos do SAPL <https://github.com/interlegis/sapl/blob/master/sapl/rules/__init__.py>`_ são fixos e atualizados a cada execução do comando:
* `Os perfis semânticos do SAPL <https://github.com/interlegis/sapl/blob/master/sapl/rules/__init__.py>`_ são fixos e atualizados a cada execução do comando::
./manage.py migrate
* Os perfis fixos não aceitam customização via admin, porém outros grupos podem ser criados. O SAPL não interferirá no conjunto de permissões definidas em grupos customizados e se comportará diante de usuários segundo seus grupos e suas permissões.
* Os perfis fixos não aceitam customização via admin, porém outros grupos podem ser criados. O SAPL não interferirá no conjunto de permissões definidas em grupos customizados e se comportará diante de usuários segundo seus grupos e suas permissões.
* Os usuários de testes de perfil são criados apenas se o SAPL estiver rodando em modo DEBUG=True. Todos com senha "interlegis", serão::
@ -214,6 +212,24 @@ Instruções para criação do super usuário e de usuários de testes
operador_painel
operador_geral
Instruções para Importação da base mysql 2.5
============================================
Criar um arquivo `sapl/legacy/.env` com o seguinte conteúdo (parametros de acesso ao banco 2.5)::
DATABASE_URL = mysql://[usuario do mysql]:[senha do myuysql]@[host]:[porta]/[banco]
o conteúdo do arquivo será semelhante a isso::
DATABASE_URL = mysql://sapl:sapl@localhost:3306/interlegis
Posteriormente rodar a seguinte sequencia de comandos::
./manage.py shell_plus --settings=sapl.legacy_migration_settings
>>> %run sapl/legacy/migration.py
>>> migrate()
Instruções para Tradução
========================

10
sapl/compilacao/compilacao_data_tables.sql

@ -1,6 +1,7 @@
INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (2, 'LC95-v', 'Lei Complementar 95 com Variação', false);
INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (1, 'LC95', 'Lei Complementar 95', true);
SELECT pg_catalog.setval('compilacao_perfilestruturaltextoarticulado_id_seq', 2, true);
INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (2, 'LC95-v', 'Lei Complementar 95 com Variação', false);
INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (3, 'PLOL', 'Projeto de Lei Ordinária do Legislativo', false);
SELECT pg_catalog.setval('compilacao_perfilestruturaltextoarticulado_id_seq', 3, true);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
@ -24,7 +25,9 @@ INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (123, 'Alinea', 'alinea', '', '', 0, ')', '&nbsp;&ndash;&nbsp;', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (124, 'Item', 'item', '', '', 0, '', '&nbsp;&ndash;&nbsp;', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (125, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false);
SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 125, true);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (126, 'Justificativa', 'justificativa', '', '', 0, '', '', '', '<div class="titulo">Justificativa</div>', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false);
SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 126, true);
delete from compilacao_tipodispositivorelationship;
@ -245,6 +248,7 @@ 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 (125, 104, false, 1, -1, false);
INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 104, false, 2, -1, false);
INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (126, 1, false, 3, -1, false);
INSERT INTO compilacao_tiponota (id, sigla, nome, modelo) VALUES (1, 'NE', 'Nota Explicativa', '');

8
sapl/compilacao/forms.py

@ -8,6 +8,7 @@ from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset,
from django import forms
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
from django.db.models import Q
from django.forms import widgets
from django.forms.forms import Form
from django.forms.models import ModelForm
from django.template import defaultfilters
@ -24,6 +25,7 @@ from sapl.compilacao.utils import DISPOSITIVO_SELECT_RELATED
from sapl.crispy_layout_mixin import SaplFormLayout, to_column, to_row
from sapl.utils import YES_NO_CHOICES
error_messages = {
'required': _('Este campo é obrigatório'),
'invalid': _('URL inválida.')
@ -62,9 +64,12 @@ class TipoTaForm(ModelForm):
'descricao',
'content_type',
'participacao_social',
'publicacao_func'
'publicacao_func',
'perfis'
]
widgets = {'perfis': widgets.CheckboxSelectMultiple()}
def __init__(self, *args, **kwargs):
row1 = to_row([
@ -75,6 +80,7 @@ class TipoTaForm(ModelForm):
row2 = to_row([
(InlineRadios('participacao_social'), 3),
(InlineRadios('publicacao_func'), 3),
('perfis', 12),
])
self.helper = FormHelper()

21
sapl/compilacao/migrations/0070_perfilestruturaltextoarticulado_parent.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-11 13:01
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0069_auto_20161107_1932'),
]
operations = [
migrations.AddField(
model_name='perfilestruturaltextoarticulado',
name='parent',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='perfil_parent_set', to='compilacao.PerfilEstruturalTextoArticulado', verbose_name='Perfil Herdado'),
),
]

20
sapl/compilacao/migrations/0071_tipotextoarticulado_perfis.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-12 14:25
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0070_perfilestruturaltextoarticulado_parent'),
]
operations = [
migrations.AddField(
model_name='tipotextoarticulado',
name='perfis',
field=models.ManyToManyField(blank=True, help_text='\n Apenas os perfis selecionados aqui estarão disponíveis\n para o editor de Textos Articulados cujo Tipo seja este\n em edição.\n ', to='compilacao.PerfilEstruturalTextoArticulado', verbose_name='Perfis Estruturais de Textos Articulados'),
),
]

55
sapl/compilacao/migrations/0072_auto_20161112_1553.py

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-12 15:53
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0071_tipotextoarticulado_perfis'),
]
operations = [
migrations.AlterField(
model_name='tipodispositivo',
name='nota_automatica_prefixo_html',
field=models.TextField(blank=True, verbose_name='Prefixo html da nota automática'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='nota_automatica_sufixo_html',
field=models.TextField(blank=True, verbose_name='Sufixo html da nota automática'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='rotulo_prefixo_html',
field=models.TextField(blank=True, verbose_name='Prefixo html do rótulo'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='rotulo_prefixo_texto',
field=models.TextField(blank=True, verbose_name='Prefixo de Edição do rótulo'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='rotulo_sufixo_html',
field=models.TextField(blank=True, verbose_name='Sufixo html do rótulo'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='rotulo_sufixo_texto',
field=models.TextField(blank=True, verbose_name='Sufixo de Edição do rótulo'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='texto_prefixo_html',
field=models.TextField(blank=True, verbose_name='Prefixo html do texto'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='texto_sufixo_html',
field=models.TextField(blank=True, verbose_name='Sufixo html do texto'),
),
]

130
sapl/compilacao/models.py

@ -6,6 +6,7 @@ from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models import F, Q
from django.db.models.aggregates import Max
from django.db.models.deletion import PROTECT
from django.http.response import Http404
from django.template import defaultfilters
from django.utils.decorators import classonlymethod
@ -74,6 +75,31 @@ class BaseModel(models.Model):
update_fields=update_fields)
class PerfilEstruturalTextoArticulado(BaseModel):
sigla = models.CharField(
max_length=10, unique=True, verbose_name=_('Sigla'))
nome = models.CharField(max_length=50, verbose_name=_('Nome'))
padrao = models.BooleanField(
default=False,
choices=YES_NO_CHOICES, verbose_name=_('Padrão'))
parent = models.ForeignKey(
'self',
blank=True, null=True, default=None,
related_name='perfil_parent_set',
on_delete=PROTECT,
verbose_name=_('Perfil Herdado'))
class Meta:
verbose_name = _('Perfil Estrutural de Texto Articulado')
verbose_name_plural = _('Perfis Estruturais de Textos Articulados')
ordering = ['-padrao', 'sigla']
def __str__(self):
return self.nome
class TipoTextoArticulado(models.Model):
sigla = models.CharField(max_length=3, verbose_name=_('Sigla'))
descricao = models.CharField(max_length=50, verbose_name=_('Descrição'))
@ -93,6 +119,15 @@ class TipoTextoArticulado(models.Model):
choices=YES_NO_CHOICES,
verbose_name=_('Histórico de Publicação'))
perfis = models.ManyToManyField(
PerfilEstruturalTextoArticulado,
blank=True, verbose_name=_('Perfis Estruturais de Textos Articulados'),
help_text=_("""
Apenas os perfis selecionados aqui estarão disponíveis
para o editor de Textos Articulados cujo Tipo seja este
em edição.
"""))
class Meta:
verbose_name = _('Tipo de Texto Articulado')
verbose_name_plural = _('Tipos de Texto Articulados')
@ -538,13 +573,11 @@ class TipoDispositivo(BaseModel):
blank=True,
max_length=20,
verbose_name=_('Classe CSS'))
rotulo_prefixo_html = models.CharField(
rotulo_prefixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Prefixo html do rótulo'))
rotulo_prefixo_texto = models.CharField(
rotulo_prefixo_texto = models.TextField(
blank=True,
max_length=30,
verbose_name=_('Prefixo de Edição do rótulo'))
rotulo_ordinal = models.IntegerField(
choices=TIPO_NUMERO_ROTULO,
@ -574,29 +607,23 @@ class TipoDispositivo(BaseModel):
max_length=1,
default="-",
verbose_name=_('Separador entre Variação 4 e Variação 5'))
rotulo_sufixo_texto = models.CharField(
rotulo_sufixo_texto = models.TextField(
blank=True,
max_length=30,
verbose_name=_('Sufixo de Edição do rótulo'))
rotulo_sufixo_html = models.CharField(
rotulo_sufixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Sufixo html do rótulo'))
texto_prefixo_html = models.CharField(
texto_prefixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Prefixo html do texto'))
texto_sufixo_html = models.CharField(
texto_sufixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Sufixo html do texto'))
nota_automatica_prefixo_html = models.CharField(
nota_automatica_prefixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Prefixo html da nota automática'))
nota_automatica_sufixo_html = models.CharField(
nota_automatica_sufixo_html = models.TextField(
blank=True,
max_length=100,
verbose_name=_('Sufixo html da nota automática'))
contagem_continua = models.BooleanField(
choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua'))
@ -657,58 +684,49 @@ class TipoDispositivo(BaseModel):
def permitido_inserir_in(
self, pai_relativo, include_relative_autos=True, perfil_pk=None):
perfil = PerfilEstruturalTextoArticulado.objects.all()
if not perfil_pk:
perfis = PerfilEstruturalTextoArticulado.objects.filter(
padrao=True)[:1]
if not perfis.exists():
return False
perfil_pk = perfis[0].pk
perfil = perfil.filter(padrao=True)
pp = self.possiveis_pais.filter(pai=pai_relativo, perfil_id=perfil_pk)
if pp.exists():
if not include_relative_autos:
if pp[0].filho_de_insercao_automatica:
return False
return True
return False
def permitido_variacao(
self, base, perfil_pk=None):
if not perfil_pk:
perfis = PerfilEstruturalTextoArticulado.objects.filter(
padrao=True)[:1]
else:
perfil = perfil.filter(pk=perfil_pk)
if not perfis.exists():
return False
if not perfil.exists():
return False
perfil_pk = perfis[0].pk
perfil = perfil[0]
pp = self.possiveis_pais.filter(pai=base, perfil_id=perfil_pk)
if pp.exists():
if pp[0].permitir_variacao:
while perfil:
pp = self.possiveis_pais.filter(pai=pai_relativo, perfil=perfil)
if pp.exists():
if not include_relative_autos:
if pp[0].filho_de_insercao_automatica:
return False
return True
perfil = perfil.parent
return False
def permitido_variacao(self, base, perfil_pk=None):
class PerfilEstruturalTextoArticulado(BaseModel):
sigla = models.CharField(
max_length=10, unique=True, verbose_name=_('Sigla'))
nome = models.CharField(max_length=50, verbose_name=_('Nome'))
padrao = models.BooleanField(
default=False,
choices=YES_NO_CHOICES, verbose_name=_('Padrão'))
perfil = PerfilEstruturalTextoArticulado.objects.all()
if not perfil_pk:
perfil = perfil.filter(padrao=True)
class Meta:
verbose_name = _('Perfil Estrutural de Texto Articulado')
verbose_name_plural = _('Perfis Estruturais de Textos Articulados')
else:
perfil = perfil.filter(pk=perfil_pk)
ordering = ['-padrao', 'sigla']
if not perfil.exists():
return False
def __str__(self):
return self.nome
perfil = perfil[0]
while perfil:
pp = self.possiveis_pais.filter(pai=base, perfil=perfil)
if pp.exists():
if pp[0].permitir_variacao:
return True
perfil = perfil.parent
return False
class TipoDispositivoRelationship(BaseModel):

78
sapl/compilacao/views.py

@ -162,7 +162,7 @@ class IntegracaoTaView(TemplateView):
(request.user.has_perm(
'compilacao.change_your_dispositivo_edicao_dinamica') and
ta_values.get('privacidade', STATUS_TA_EDITION
) == STATUS_TA_PUBLIC)):
) == STATUS_TA_PRIVATE)):
"""
o texto articulado será criado/atualizado se:
- texto articulado foi criado.
@ -1638,9 +1638,6 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
'action': 'json_add_prior',
'itens': []}]
if request and 'perfil_estrutural' not in request.session:
self.set_perfil_in_session(request)
perfil_pk = request.session['perfil_estrutural']
prox_possivel = Dispositivo.objects.filter(
@ -2222,42 +2219,47 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
return JsonResponse(data, safe=False)
def get_queryset_perfil_estrutural(self):
perfis = PerfilEstruturalTextoArticulado.objects.all()
return perfis
def json_get_perfis(self, context):
if 'perfil_pk' in self.request.GET:
self.set_perfil_in_session(
self.request, self.request.GET['perfil_pk'])
elif 'perfil_estrutural' not in self.request.session:
self.set_perfil_in_session(request=self.request)
data = {'pk': self.kwargs['dispositivo_id'],
'pai': [self.kwargs['dispositivo_id'], ]}
return data
def set_perfil_in_session(self, request=None, perfil_id=0):
if not request:
return None
def update_perfis(self):
qs = PerfilEstruturalTextoArticulado.objects.all()
request = self.request
if perfil_id:
perfil = PerfilEstruturalTextoArticulado.objects.get(
pk=perfil_id)
request.session['perfil_estrutural'] = perfil.pk
return perfil.pk
ta = None
if hasattr(self, 'object') and isinstance(self.object, Dispositivo):
ta = self.object.ta
elif hasattr(self, 'object') and isinstance(
self.object, TextoArticulado):
ta = self.object
else:
perfis = PerfilEstruturalTextoArticulado.objects.filter(
padrao=True)[:1]
ta_id = self.kwargs.get('ta_id', 0)
if ta_id:
ta = TextoArticulado.objects.get(pk=ta_id)
if not perfis.exists():
request.session.pop('perfil_estrutural')
if ta:
if ta.content_object and hasattr(ta.content_object, 'perfis'):
qs = ta.content_object.perfis
else:
request.session['perfil_estrutural'] = perfis[0].pk
return perfis[0].pk
return None
qs = ta.tipo_ta.perfis.all()
perfil_get = request.GET.get('perfil_pk', 0)
if perfil_get and qs.filter(id=perfil_get).exists():
request.session['perfil_estrutural'] = int(perfil_get)
return qs
perfil_session = request.session.get('perfil_estrutural', perfil_get)
if perfil_session and qs.filter(id=perfil_session).exists():
request.session['perfil_estrutural'] = int(perfil_session)
return qs
if qs.exists():
request.session['perfil_estrutural'] = qs.first().id
return qs
def json_add_next_registra_inclusao(
self, context, local_add='json_add_next'):
@ -2500,6 +2502,9 @@ class DispositivoDinamicEditView(
self.template_name = 'compilacao/text_edit_bloco.html'
return TextEditView.get(self, request, *args, **kwargs)
self.object = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
perfil_estrutural_list = self.update_perfis()
self.template_name = 'compilacao/ajax_form.html'
self.action = request.GET['action']
@ -2519,9 +2524,6 @@ class DispositivoDinamicEditView(
elif self.action.startswith('get_actions'):
self.form_class = None
self.object = Dispositivo.objects.get(
pk=self.kwargs['dispositivo_id'])
ta_id = self.kwargs['ta_id']
context = {}
@ -2537,17 +2539,9 @@ class DispositivoDinamicEditView(
'ajax_actions_dinamic_edit.html')
if ta_id == str(self.object.ta_id):
context['perfil_estrutural_list'] = perfil_estrutural_list
context['allowed_inserts'] = self.allowed_inserts()
if 'perfil_pk' in request.GET:
self.set_perfil_in_session(
request, request.GET['perfil_pk'])
elif 'perfil_estrutural' not in request.session:
self.set_perfil_in_session(request=request)
context['perfil_estrutural_list'
] = PerfilEstruturalTextoArticulado.objects.all()
return self.render_to_response(context)
elif self.action.startswith('json_'):

89
sapl/materia/forms.py

@ -1,12 +1,13 @@
from datetime import date, datetime
from itertools import chain
import os
from crispy_forms.bootstrap import (Alert, FormActions, InlineCheckboxes,
InlineRadios)
from crispy_forms.helper import FormHelper
from crispy_forms.layout import (HTML, Button, Column, Field, Fieldset, Layout,
Submit)
Submit, Div)
from django import forms
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist, ValidationError
@ -16,13 +17,18 @@ from django.db import models, transaction
from django.db.models import Max
from django.forms import ModelForm, widgets
from django.forms.forms import Form
from django.forms.widgets import Select
from django.utils.encoding import force_text
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
import django_filters
from sapl.base.models import Autor
from sapl.comissoes.models import Comissao
from sapl.compilacao.models import STATUS_TA_PRIVATE,\
STATUS_TA_IMMUTABLE_PUBLIC, TextoArticulado, STATUS_TA_PUBLIC
STATUS_TA_IMMUTABLE_PUBLIC, TextoArticulado, STATUS_TA_PUBLIC,\
PerfilEstruturalTextoArticulado
from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column,
to_row)
from sapl.materia.models import TipoProposicao, MateriaLegislativa,\
@ -747,16 +753,20 @@ class TipoProposicaoForm(ModelForm):
fields = ['descricao',
'content_type',
'tipo_conteudo_related_radio',
'tipo_conteudo_related']
'tipo_conteudo_related',
'perfis']
widgets = {'tipo_conteudo_related': forms.HiddenInput()}
widgets = {'tipo_conteudo_related': forms.HiddenInput(),
'perfis': widgets.CheckboxSelectMultiple()}
def __init__(self, *args, **kwargs):
tipo_select = Fieldset(TipoProposicao._meta.verbose_name,
to_column(('descricao', 5)),
to_column(('content_type', 7)),
to_column(('tipo_conteudo_related_radio', 12)))
Div(to_column(('descricao', 5)),
to_column(('content_type', 7)), css_class='clearfix'),
to_column(('tipo_conteudo_related_radio', 6)),
to_column(('perfis', 6)))
self.helper = FormHelper()
self.helper.layout = SaplFormLayout(tipo_select)
@ -795,7 +805,7 @@ class TipoProposicaoForm(ModelForm):
@transaction.atomic
def save(self, commit=False):
tipo_proposicao = super(TipoProposicaoForm, self).save(commit)
tipo_proposicao = self.instance
assert tipo_proposicao.content_type
@ -803,9 +813,45 @@ class TipoProposicaoForm(ModelForm):
tipo_proposicao.content_type.model_class(
).objects.get(pk=self.cleaned_data['tipo_conteudo_related'])
tipo_proposicao.save()
return super().save(True)
return tipo_proposicao
class TipoProposicaoSelect(Select):
def render_tipo_option(self, selected_choices, option_value, option_label,
data_has_perfil=False):
if option_value is None:
option_value = ''
option_value = force_text(option_value)
if option_value in selected_choices:
selected_html = mark_safe(' selected="selected"')
if not self.allow_multiple_selected:
# Only allow for a single selection.
selected_choices.remove(option_value)
else:
selected_html = ''
return format_html('<option value="{}"{} data-has-perfil={}>{}</option>',
option_value,
selected_html,
str(data_has_perfil),
force_text(option_label))
def render_options(self, choices, selected_choices):
# Normalize to strings.
selected_choices = set(force_text(v) for v in selected_choices)
output = []
output.append(
self.render_tipo_option(
selected_choices, '', self.choices.field.empty_label))
for tipo in self.choices.queryset.all():
output.append(
self.render_tipo_option(
selected_choices,
str(tipo.pk),
str(tipo),
data_has_perfil=tipo.perfis.exists()))
return '\n'.join(output)
class ProposicaoForm(forms.ModelForm):
@ -827,11 +873,11 @@ class ProposicaoForm(forms.ModelForm):
ano_materia = forms.CharField(
label='Ano', required=False)
tipo_texto = forms.MultipleChoiceField(
tipo_texto = forms.ChoiceField(
label=_('Tipo do Texto da Proposição'),
required=False,
choices=TIPO_TEXTO_CHOICE,
widget=widgets.CheckboxSelectMultiple())
widget=widgets.RadioSelect())
materia_de_vinculo = forms.ModelChoiceField(
queryset=MateriaLegislativa.objects.all(),
@ -851,7 +897,8 @@ class ProposicaoForm(forms.ModelForm):
'tipo_texto']
widgets = {
'descricao': widgets.Textarea(attrs={'rows': 4})}
'descricao': widgets.Textarea(attrs={'rows': 4}),
'tipo': TipoProposicaoSelect()}
def __init__(self, *args, **kwargs):
self.texto_articulado_proposicao = sapl.base.models.AppConfig.attr(
@ -882,7 +929,7 @@ class ProposicaoForm(forms.ModelForm):
if self.texto_articulado_proposicao:
fields.append(
to_column((InlineCheckboxes('tipo_texto'), 5)),)
to_column((InlineRadios('tipo_texto'), 5)),)
fields.append(to_column((
'texto_original', 7 if self.texto_articulado_proposicao else 12)))
@ -893,12 +940,12 @@ class ProposicaoForm(forms.ModelForm):
super(ProposicaoForm, self).__init__(*args, **kwargs)
if self.instance.pk:
self.fields['tipo_texto'].initial = []
self.fields['tipo_texto'].initial = ''
if self.instance.texto_original:
self.fields['tipo_texto'].initial.append('D')
self.fields['tipo_texto'].initial = 'D'
if self.texto_articulado_proposicao:
if self.instance.texto_articulado.exists():
self.fields['tipo_texto'].initial.append('T')
self.fields['tipo_texto'].initial = 'T'
if self.instance.materia_de_vinculo:
self.fields[
@ -941,6 +988,14 @@ class ProposicaoForm(forms.ModelForm):
def save(self, commit=True):
if self.instance.pk:
if 'tipo_texto' in self.cleaned_data:
if self.cleaned_data['tipo_texto'] in ['T', ''] and\
self.instance.texto_original:
self.instance.texto_original.delete()
if self.cleaned_data['tipo_texto'] in ['D', '']:
self.instance.texto_articulado.all().delete()
return super().save(commit)
self.instance.ano = datetime.now().year

35
sapl/materia/migrations/0068_auto_20161110_0910.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-10 09:10
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('materia', '0067_auto_20161025_1630'),
]
operations = [
migrations.AlterField(
model_name='materialegislativa',
name='ano',
field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'),
),
migrations.AlterField(
model_name='materialegislativa',
name='ano_origem_externa',
field=models.PositiveSmallIntegerField(blank=True, choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], null=True, verbose_name='Ano'),
),
migrations.AlterField(
model_name='numeracao',
name='ano_materia',
field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'),
),
migrations.AlterField(
model_name='proposicao',
name='ano',
field=models.PositiveSmallIntegerField(blank=True, choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], default=None, null=True, verbose_name='Ano'),
),
]

21
sapl/materia/migrations/0069_tipoproposicao_perfis.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-11 10:05
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0069_auto_20161107_1932'),
('materia', '0068_auto_20161110_0910'),
]
operations = [
migrations.AddField(
model_name='tipoproposicao',
name='perfis',
field=models.ManyToManyField(blank=True, to='compilacao.PerfilEstruturalTextoArticulado', verbose_name='Perfis Estruturais de Textos Articulados'),
),
]

21
sapl/materia/migrations/0070_auto_20161111_1301.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-11 13:01
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('materia', '0069_tipoproposicao_perfis'),
]
operations = [
migrations.AlterField(
model_name='tipoproposicao',
name='perfis',
field=models.ManyToManyField(blank=True, help_text='\n Mesmo que em Configurações da Aplicação nas\n Tabelas Auxiliares esteja definido que Proposições possam\n utilizar Textos Articulados, ao gerar uma proposição,\n a solução de Textos Articulados será disponibilizada se\n o Tipo escolhido para a Proposição estiver associado a ao\n menos um Perfil Estrutural de Texto Articulado.\n ',
to='compilacao.PerfilEstruturalTextoArticulado', verbose_name='Perfis Estruturais de Textos Articulados'),
),
]

42
sapl/materia/models.py

@ -1,19 +1,24 @@
from datetime import datetime
from django.contrib.auth.models import Group
from django.contrib.contenttypes.fields import GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models.deletion import PROTECT
from django.utils import formats
from django.utils.translation import ugettext_lazy as _
from model_utils import Choices
from sapl.base.models import Autor
from sapl.comissoes.models import Comissao
from sapl.compilacao.models import TextoArticulado
from sapl.compilacao.models import TextoArticulado,\
PerfilEstruturalTextoArticulado
from sapl.parlamentares.models import Parlamentar
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey,
SaplGenericRelation, restringe_tipos_de_arquivo_txt,
texto_upload_path)
EM_TRAMITACAO = [(1, 'Sim'),
(0, 'Não')]
@ -38,19 +43,17 @@ class TipoProposicao(models.Model):
tipo_conteudo_related = SaplGenericForeignKey(
'content_type', 'object_id', verbose_name=_('Seleção de Tipo'))
"""materia_ou_documento = models.CharField(
max_length=1, verbose_name=_('Gera'), choices=MAT_OU_DOC_CHOICES)
modelo = models.CharField(max_length=50, verbose_name=_('Modelo XML'))
# mutually exclusive (depend on materia_ou_documento)
tipo_materia = models.ForeignKey(
TipoMateriaLegislativa,
blank=True,
null=True,
verbose_name=_('Tipo de Matéria'))
tipo_documento = models.ForeignKey(
TipoDocumento, blank=True, null=True,
verbose_name=_('Tipo de Documento'))"""
perfis = models.ManyToManyField(
PerfilEstruturalTextoArticulado,
blank=True, verbose_name=_('Perfis Estruturais de Textos Articulados'),
help_text=_("""
Mesmo que em Configurações da Aplicação nas
Tabelas Auxiliares esteja definido que Proposições possam
utilizar Textos Articulados, ao gerar uma proposição,
a solução de Textos Articulados será disponibilizada se
o Tipo escolhido para a Proposição estiver associado a ao
menos um Perfil Estrutural de Texto Articulado.
"""))
class Meta:
verbose_name = _('Tipo de Proposição')
@ -566,6 +569,17 @@ class Proposicao(models.Model):
documento_gerado = models.ForeignKey(
DocumentoAcessorio, blank=True, null=True)"""
@property
def perfis(self):
return self.tipo.perfis.all()
@property
def title_type(self):
return '%s nº _____ %s' % (
self.tipo, formats.date_format(
self.data_envio if self.data_envio else datetime.now(),
"\d\e d \d\e F \d\e Y"))
class Meta:
verbose_name = _('Proposição')
verbose_name_plural = _('Proposições')

13
sapl/materia/views.py

@ -624,18 +624,19 @@ class ProposicaoCrud(Crud):
def get_rows(self, object_list):
for obj in object_list:
if obj.data_recebimento is None:
obj.data_recebimento = 'Não recebida'\
if obj.data_envio else 'Não enviada'
else:
obj.data_recebimento = formats.date_format(
obj.data_recebimento, "DATETIME_FORMAT")
if obj.data_envio is None:
obj.data_envio = 'Em elaboração...'
else:
obj.data_envio = formats.date_format(
obj.data_envio, "DATETIME_FORMAT")
if obj.data_recebimento is None:
obj.data_recebimento = 'Não recebida'
else:
obj.data_envio = formats.date_format(
obj.data_recebimento, "DATETIME_FORMAT")
return [self._as_row(obj) for obj in object_list]

109
sapl/norma/forms.py

@ -1,16 +1,18 @@
from datetime import datetime
import django_filters
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Fieldset, Layout
from django import forms
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import models
from django.forms import ModelForm, widgets
from django.utils.translation import ugettext_lazy as _
from sapl.crispy_layout_mixin import form_actions, to_row
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
from sapl.settings import MAX_DOC_UPLOAD_SIZE
from sapl.utils import RANGE_ANOS
from sapl.utils import RANGE_ANOS, RangeWidgetOverride
from .models import AssuntoNorma, NormaJuridica
@ -30,94 +32,43 @@ ORDENACAO_CHOICES = [('', '---------'),
('data,tipo,ano,numero', _('Data/Tipo/Ano/Número'))]
# TODO termos, pesquisa textual, assunto(M2M)
class NormaJuridicaPesquisaForm(ModelForm):
periodo_inicial = forms.DateField(label=u'Período Inicial',
input_formats=['%d/%m/%Y'],
required=False,
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
periodo_final = forms.DateField(label=u'Período Final',
input_formats=['%d/%m/%Y'],
required=False,
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
publicacao_inicial = forms.DateField(label=u'Publicação Inicial',
input_formats=['%d/%m/%Y'],
required=False,
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
publicacao_final = forms.DateField(label=u'Publicação Final',
input_formats=['%d/%m/%Y'],
required=False,
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
ano = forms.ModelChoiceField(
label='Ano',
required=False,
queryset=NormaJuridica.objects.order_by('-ano').values_list(
'ano', flat=True).distinct(),
empty_label='Selecione'
)
class NormaFilterSet(django_filters.FilterSet):
em_vigencia = forms.ChoiceField(
label='Em vigência?',
choices=YES_NO_CHOICES,
required=False)
RANGE_ANOS.insert(0, ('', 'Selecione'))
ordenacao = forms.ChoiceField(
label='Ordenação',
choices=ORDENACAO_CHOICES,
required=False)
filter_overrides = {models.DateField: {
'filter_class': django_filters.DateFromToRangeFilter,
'extra': lambda f: {
'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
'widget': RangeWidgetOverride}
}}
numero = forms.IntegerField(required=False)
ano = django_filters.ChoiceFilter(required=False,
label=u'Ano',
choices=RANGE_ANOS)
assunto = forms.ModelChoiceField(
label='Assunto',
required=False,
queryset=AssuntoNorma.objects.all(),
empty_label='Selecione'
)
ementa = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = NormaJuridica
fields = ['tipo',
'numero',
'ano',
'periodo_inicial',
'periodo_final',
'publicacao_inicial',
'publicacao_final',
'assunto']
fields = ['tipo', 'numero', 'ano', 'data',
'data_publicacao', 'ementa', 'assuntos']
def __init__(self, *args, **kwargs):
row1 = to_row([('tipo', 12)])
row2 = to_row([('numero', 6), ('ano', 6)])
row3 = to_row([('periodo_inicial', 6), ('periodo_final', 6)])
row4 = to_row([('publicacao_inicial', 6), ('publicacao_final', 6)])
row5 = to_row([('em_vigencia', 4), ('ordenacao', 4), ('assunto', 4)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset('Pesquisa Norma Juridica',
row1, row2, row3, row4, row5),
form_actions(save_label='Pesquisar')
super(NormaFilterSet, self).__init__(*args, **kwargs)
row1 = to_row([('tipo', 4), ('numero', 4), ('ano', 4)])
row2 = to_row([('data', 6), ('data_publicacao', 6)])
row3 = to_row([('ementa', 12)])
row4 = to_row([('assuntos', 12)])
self.form.helper = FormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisa de Norma'),
row1, row2, row3, row4,
form_actions(save_label='Pesquisar'))
)
super(NormaJuridicaPesquisaForm, self).__init__(*args, **kwargs)
class NormaJuridicaForm(ModelForm):

20
sapl/norma/migrations/0022_auto_20161110_0910.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-10 09:10
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('norma', '0021_auto_20161028_1335'),
]
operations = [
migrations.AlterField(
model_name='normajuridica',
name='ano',
field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'),
),
]

10
sapl/norma/urls.py

@ -1,8 +1,7 @@
from django.conf.urls import include, url
from sapl.norma.views import (AssuntoNormaCrud,
NormaCrud, NormaPesquisaView, NormaTaView,
PesquisaNormaListView, TipoNormaCrud)
from sapl.norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView,
TipoNormaCrud, NormaTaView)
from .apps import AppConfig
@ -17,8 +16,7 @@ urlpatterns = [
url(r'^sistema/norma/tipo/', include(TipoNormaCrud.get_urls())),
url(r'^sistema/norma/assunto/', include(AssuntoNormaCrud.get_urls())),
url(r'^norma/pesquisa$',
url(r'^norma/pesquisar$',
NormaPesquisaView.as_view(), name='norma_pesquisa'),
url(r'^norma/pesquisa-resultado$',
PesquisaNormaListView.as_view(), name='list_pesquisa_norma'),
]

144
sapl/norma/views.py

@ -2,18 +2,18 @@ from datetime import datetime
from django.core.urlresolvers import reverse
from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _
from django.views.generic import FormView, ListView
from django.views.generic.base import RedirectView
from django_filters.views import FilterView
from sapl.base.models import AppConfig
from sapl.compilacao.views import IntegracaoTaView
from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
MasterDetailCrud, make_pagination)
from sapl.norma.forms import NormaJuridicaForm
from .forms import NormaJuridicaPesquisaForm
from .models import (AssuntoNorma, NormaJuridica,
TipoNormaJuridica)
from .forms import NormaFilterSet, NormaJuridicaForm
from .models import AssuntoNorma, NormaJuridica, TipoNormaJuridica
# LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '')
AssuntoNormaCrud = CrudAux.build(AssuntoNorma, 'assunto_norma_juridica',
@ -25,6 +25,32 @@ TipoNormaCrud = CrudAux.build(
list_field_names=['sigla', 'descricao', 'equivalente_lexml'])
class NormaPesquisaView(FilterView):
model = NormaJuridica
filterset_class = NormaFilterSet
paginate_by = 10
def get_context_data(self, **kwargs):
context = super(NormaPesquisaView, self).get_context_data(**kwargs)
context['title'] = _('Pesquisar Norma Jurídica')
qr = self.request.GET.copy()
if 'page' in qr:
del qr['page']
paginator = context['paginator']
page_obj = context['page_obj']
context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
return context
class NormaTaView(IntegracaoTaView):
model = NormaJuridica
model_type_foreignkey = TipoNormaJuridica
@ -103,113 +129,3 @@ class NormaCrud(Crud):
self.initial['ano_materia'] = norma.materia.ano
self.initial['numero_materia'] = norma.materia.numero
return self.initial.copy()
class NormaPesquisaView(FormView):
template_name = "norma/pesquisa.html"
success_url = "norma:norma_pesquisa"
form_class = NormaJuridicaPesquisaForm
def post(self, request, *args, **kwargs):
form = NormaJuridicaPesquisaForm(request.POST)
if form.data['tipo']:
kwargs['tipo'] = form.data['tipo']
if form.data['numero']:
kwargs['numero'] = form.data['numero']
if form.data['ano']:
kwargs['ano'] = form.data['ano']
if form.data['periodo_inicial'] and form.data['periodo_final']:
kwargs['periodo_inicial'] = form.data['periodo_inicial']
kwargs['periodo_final'] = form.data['periodo_final']
if form.data['publicacao_inicial'] and form.data['publicacao_final']:
kwargs['publicacao_inicial'] = form.data['publicacao_inicial']
kwargs['publicacao_final'] = form.data['publicacao_final']
if form.data['ordenacao']:
kwargs['ordenacao'] = form.data['ordenacao']
if form.data['em_vigencia']:
kwargs['em_vigencia'] = form.data['em_vigencia']
if form.data['assunto']:
kwargs['assunto'] = form.data['assunto']
request.session['kwargs'] = kwargs
return redirect('sapl.norma:list_pesquisa_norma')
class PesquisaNormaListView(ListView):
template_name = 'norma/list_pesquisa.html'
model = NormaJuridica
paginate_by = 10
def get_queryset(self):
kwargs = self.request.session['kwargs']
if 'ordenacao' in kwargs:
ordenacao = kwargs.pop('ordenacao').split(',')
for o in ordenacao:
normas = NormaJuridica.objects.all().order_by(o)
else:
normas = NormaJuridica.objects.all()
if 'em_vigencia' in kwargs:
del kwargs['em_vigencia']
normas = normas.filter(
data_vigencia__lte=datetime.now().date())
if 'periodo_inicial' and 'publicacao_inicial' in kwargs:
periodo_inicial = datetime.strptime(
kwargs['periodo_inicial'],
'%d/%m/%Y').strftime('%Y-%m-%d')
periodo_final = datetime.strptime(
kwargs['periodo_final'],
'%d/%m/%Y').strftime('%Y-%m-%d')
publicacao_inicial = datetime.strptime(
kwargs['publicacao_inicial'],
'%d/%m/%Y').strftime('%Y-%m-%d')
publicacao_final = datetime.strptime(
kwargs['publicacao_final'],
'%d/%m/%Y').strftime('%Y-%m-%d')
normas = normas.filter(
data__range=(periodo_inicial, periodo_final),
data_publicacao__range=(publicacao_inicial, publicacao_final))
if 'periodo_inicial' in kwargs:
inicial = datetime.strptime(kwargs['periodo_inicial'],
'%d/%m/%Y').strftime('%Y-%m-%d')
final = datetime.strptime(kwargs['periodo_inicial'],
'%d/%m/%Y').strftime('%Y-%m-%d')
normas = normas.filter(data__range=(inicial, final))
if 'publicacao_inicial' in kwargs:
inicial = datetime.strptime(kwargs['publicacao_inicial'],
'%d/%m/%Y').strftime('%Y-%m-%d')
final = datetime.strptime(kwargs['publicacao_final'],
'%d/%m/%Y').strftime('%Y-%m-%d')
normas = normas.filter(data_publicacao__range=(inicial, final))
if 'tipo' in kwargs:
normas = normas.filter(tipo=kwargs['tipo'])
if 'numero' in kwargs:
normas = normas.filter(numero=kwargs['numero'])
if 'ano' in kwargs:
normas = normas.filter(ano=kwargs['ano'])
if 'assunto' in kwargs:
normas = normas.filter(assuntos=kwargs['assunto'])
return normas
def get_context_data(self, **kwargs):
context = super(PesquisaNormaListView, self).get_context_data(
**kwargs)
paginator = context['paginator']
page_obj = context['page_obj']
context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
return context

25
sapl/protocoloadm/migrations/0007_auto_20161110_0910.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-11-10 09:10
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('protocoloadm', '0006_auto_20161103_1721'),
]
operations = [
migrations.AlterField(
model_name='documentoadministrativo',
name='ano',
field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'),
),
migrations.AlterField(
model_name='protocolo',
name='ano',
field=models.PositiveSmallIntegerField(choices=[('', 'Selecione'), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano do Protocolo'),
),
]

6
sapl/templates/base.html

@ -94,7 +94,9 @@
</span>
</a>
</div>
{% block sections_nav %} {% subnav %} {% endblock sections_nav %}
<div class="hidden-print">
{% block sections_nav %} {% subnav %} {% endblock sections_nav %}
</div>
</div>
</header>
{% endblock main_header %}
@ -148,7 +150,7 @@
{% block footer_container %}
<footer id="footer" class="footer page__row">
<footer id="footer" class="footer page__row hidden-print">
<div class="container">
<div class="row">

2
sapl/templates/compilacao/ajax_actions_dinamic_edit.html

@ -59,7 +59,7 @@
<div class="btn-group " role="group">
{% if not object.dispositivo_subsequente %}
{% for perfil in perfil_estrutural_list%}
<button type="button" class="btn-action btn-perfis btn btn-xs {%if request.session.perfil_estrutural == perfil.pk%}btn-primary{%else%}btn-default{%endif%}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" pk="{{object.pk}}" perfil_pk="{{perfil.pk}}" action="json_get_perfis" title="{{perfil.nome}}">
<button type="button" class="btn-action btn-perfis btn btn-xs {%if request.session.perfil_estrutural == perfil.pk %}btn-primary{%else%}btn-default{%endif%}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" pk="{{object.pk}}" perfil_pk="{{perfil.pk}}" action="json_get_perfis" title="{{perfil.nome}}">
{{perfil.sigla}}
</button>
{% endfor %}

2
sapl/templates/compilacao/text_edit.html

@ -11,7 +11,7 @@
{% endblock %}
{% block title%}
<h1 class="page-header">{{object }}. <small><i>{% trans 'Texto Multivigente em Edição' %}</i></small></h1>
<h2 class="page-header">{% if object.content_object.title_type %}{{object.content_object.title_type}}{%else%}{{object}}{% endif %}{% comment %}<small><i>{% trans 'Texto Multivigente em Edição' %}</i></small>{% endcomment %}</h2>
{% endblock %}
{% block actions %}

5
sapl/templates/compilacao/text_list.html

@ -9,6 +9,11 @@
{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
{% endblock %}
{% block title %}
<h2 class="page-header">{% if object.content_object.title_type %}{{object.content_object.title_type}}{%else%}{{object}}{% endif %}{% comment %}<small><i>{% trans 'Texto Multivigente em Edição' %}</i></small>{% endcomment %}</h2>
{% endblock %}
{% block extra_sections_nav %}
<li><a href="{% url 'sapl.compilacao:ta_text' object.pk %}?print">{% trans 'Versão para Impressão' %}</a></li>
{% endblock %}

6
sapl/templates/compilacao/textoarticulado_detail.html

@ -31,7 +31,7 @@
{% block base_content %}
{% block actions %}
<div class="clearfix">
<div class="clearfix hidden-print">
<div class="actions btn-group pull-right" role="group">
{% if perms.compilacao.lock_unlock_textoarticulado and not object.editable_only_by_owners%}
@ -44,12 +44,12 @@
<a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
{% endif %}
</div>
</div>
</div>
{% endblock actions %}
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset>
<fieldset class="hidden-print">
<legend>{%trans 'Identificação Básica'%}</legend>
<div class="row">
<div class="col-md-3">

12
sapl/templates/compilacao/tipotextoarticulado_detail.html

@ -56,6 +56,18 @@
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="div_id_ano" class="holder">
<label>{% field_verbose_name object 'perfis' %}</label>
<ul>
{% for perfil in object.perfis.all %}
<li>{{perfil}}</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</fieldset>
{% endblock detail_content %}
{% endblock base_content %}

2
sapl/templates/materia/layouts.yaml

@ -75,7 +75,7 @@ Relatoria:
TipoProposicao:
{% trans 'Tipo Proposição' %}:
- descricao content_type
- tipo_conteudo_related
- tipo_conteudo_related perfis
Proposicao:
{% trans 'Proposição' %}:

15
sapl/templates/materia/proposicao_form.html

@ -13,6 +13,21 @@
$("#div_id_texto_original").addClass('hidden');
});
$("select[name=tipo]").change(function(event) {
if (this.selectedOptions[0].getAttribute('data-has-perfil') === "True") {
$("input[name=tipo_texto]").closest('label').removeClass('disabled');
$("input[name=tipo_texto]").prop('disabled', false);
}
else {
$("input[name=tipo_texto]").closest('label').addClass('disabled');
$("input[name=tipo_texto]").prop('disabled', true);
}
$("input[name=tipo_texto]").first().prop('checked', true);
$("input[name=tipo_texto]").first().closest('label').addClass('checked');
});
$("select[name=tipo_materia], input[name=numero_materia], input[name=ano_materia]").change(function(event) {
var url = '{% url 'sapl.api:materialegislativa-list'%}'

6
sapl/templates/materia/tipoproposicao_form.html

@ -6,7 +6,7 @@ aaa
<script type="text/javascript">
$(document).ready(function(){
var initial_select = $("input[name=tipo_conteudo_related]").val();
var initial_select = parseInt($("input[name=tipo_conteudo_related]").val());
$("input[name=tipo_conteudo_related]").remove();
$('#id_content_type').change(function(event) {
var pk = this[event.target.selectedIndex].value;
@ -18,8 +18,8 @@ $(document).ready(function(){
data.forEach(function (val, index) {
var html_radio = '<div class="radio'+(initial_select==val.value?' checked':'')+'"> <label><span class="icons"><span class="first-icon"></span><span class="second-icon"></span></span><input type="radio" name="tipo_conteudo_related" id="id_tipo_conteudo_related_'+index+'" value="'+val.value+'"'+(initial_select?' checked="checked"':'')+' style="display:none;">'+val.text+'</label></div>';
if (val === initial_select)
initial_select='';
if (val.value === initial_select)
initial_select=0;
radios.append(html_radio);
});
});

2
sapl/templates/navbar.yaml

@ -45,7 +45,7 @@
- title: {% trans 'Normas Jurídicas' %}
children:
- title: {% trans 'Pesquisar Normas Jurídicas' %}
url: sapl.norma:normajuridica_list
url: sapl.norma:norma_pesquisa
- title: {% trans 'Sistema' %}
check_permission: base.menu_sistemas

39
sapl/templates/norma/list_pesquisa.html

@ -1,39 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load common_tags %}
{% block actions %}{% endblock %}
{% block detail_content %}
<div class="actions btn-group pull-right" role="group">
{% if perms.norma.add_normajuridica %}
<a href="{% url 'sapl.norma:normajuridica_create' %}" class="btn btn-default">Adicionar Norma Jurídica</a>
{% endif %}
</div>
<br /><br /><br />
{% if object_list %}
<table class="table table-striped">
<thead class="thead-default">
<tr>
<th>Tipo da Norma Juridica</th>
<th>Número</th>
<th>Ano</th>
<th>Data</th>
<th>Ementa</th>
</tr>
</thead>
{% for obj in object_list %}
<tr>
<td><a href="{% url 'sapl.norma:normajuridica_detail' obj.id %}">{{obj.tipo}}</a></td>
<td>{{obj.numero}}</td>
<td>{{obj.ano}}</td>
<td>{{obj.data}}</td>
<td>{{obj.ementa|safe}}</td>
</tr>
{% endfor %}
</table>
{% else %}
<h2>Nenhum Registro recuperado</h2>
{% endif %}
{% endblock detail_content %}

62
sapl/templates/norma/normajuridica_filter.html

@ -0,0 +1,62 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %}
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'sapl.norma:normajuridica_create' %}" class="btn btn-default">
{% if perms.norma.add_normajuridica %}
{% blocktrans with verbose_name=view.verbose_name %} Adicionar Norma Jurídica {% endblocktrans %}
{% endif %}
</a>
{% if filter_url %}
<a href="{% url 'sapl.norma:norma_pesquisa' %}" class="btn btn-default">{% trans 'Fazer nova pesquisa' %}</a>
{% endif %}
</div>
<br /><br />
{% endblock %}
{% block detail_content %}
{% if not filter_url %}
{% crispy filter.form %}
{% endif %}
{% if filter_url %}
{% if page_obj|length %}
<br />
{% if page_obj|length > 1 %}
<h3 style="text-align:right;">Pesquisa concluída com sucesso! Foram encontradas {{paginator.count}} normas.</h3>
{% elif page_obj|length == 1 %}
<h3 style="text-align:right;">{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 norma.'%}</h3>
{% endif %}
<br />
<table class="table table-striped">
<thead class="thead-default">
<tr>
<th>Tipo</th>
<th>Número</th>
<th>Ano</th>
<th>Data</th>
<th>Ementa</th>
</tr>
</thead>
{% for n in page_obj %}
<tr>
<td><a href="{% url 'sapl.norma:normajuridica_detail' n.id %}">{{n.tipo}}</a></td>
<td>{{n.numero}}</td>
<td>{{n.ano}}</td>
<td>{{n.data}}</td>
<td>{{n.ementa|safe}}</td>
</tr>
{% endfor %}
</table>
{% include "paginacao.html" %}
{% else %}
<br /><br />
<h2>Nenhuma norma encontrada com essas especificações</h2>
{% endif %}
{% endif %}
{% endblock detail_content %}
{% block table_content %}
{% endblock table_content %}

20
sapl/templates/norma/pesquisa.html

@ -1,20 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load common_tags %}
{% block base_content %}
{% block actions %}
<div class="actions btn-group pull-right" role="group">
{% if perms.norma.add_normajuridica %}
<a href="{% url 'sapl.norma:normajuridica_create' %}" class="btn btn-default">{% trans 'Adicionar Norma Juridica' %}</a>
{% endif %}
</div>
<br /><br />
{% endblock %}
{% block detail_content %}
{% crispy form %}
{% endblock %}
{% endblock %}
Loading…
Cancel
Save