Browse Source

Merge Compilacao de norma jurídica

pull/7/head
Edward Ribeiro 9 years ago
parent
commit
bc5b56514c
  1. 0
      compilacao/__init__.py
  2. 3
      compilacao/admin.py
  3. 7
      compilacao/apps.py
  4. 0
      compilacao/forms.py
  5. 27
      compilacao/insert_inicial_TipoDispositivo.sql
  6. 207
      compilacao/migrations/0001_initial.py
  7. 48
      compilacao/migrations/0002_auto_20150907_2334.py
  8. 19
      compilacao/migrations/0003_auto_20150911_1735.py
  9. 34
      compilacao/migrations/0004_auto_20150914_0842.py
  10. 0
      compilacao/migrations/__init__.py
  11. 402
      compilacao/models.py
  12. 0
      compilacao/templatetags/__init__.py
  13. 64
      compilacao/templatetags/compilacao_filters.py
  14. 16
      compilacao/urls.py
  15. 164
      compilacao/views.py
  16. 18
      materia/migrations/0005_auto_20150923_0941.py
  17. 35
      norma/migrations/0003_auto_20150906_0239.py
  18. 18
      norma/migrations/0004_auto_20150907_0004.py
  19. 18
      norma/migrations/0005_auto_20150915_1141.py
  20. 21
      norma/models.py
  21. 10
      norma/urls.py
  22. 11
      norma/views.py
  23. 1
      sapl/settings.py
  24. 2
      sapl/urls.py
  25. 1
      sapl/utils.py
  26. 1
      sessao/views.py
  27. 178
      static/styles/compilacao.scss
  28. 1
      templates/base.html
  29. 10
      templates/compilacao/bloco_alteracao.html
  30. 101
      templates/compilacao/index.html
  31. 35
      templates/compilacao/template_render_bloco.html
  32. 9
      templates/norma/normajuridica_detail.html
  33. 2
      templates/sessao/materia_ordemdia_list.html

0
compilacao/__init__.py

3
compilacao/admin.py

@ -0,0 +1,3 @@
from sapl.utils import register_all_models_in_admin
register_all_models_in_admin(__name__)

7
compilacao/apps.py

@ -0,0 +1,7 @@
from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _
class CompilacaoAppConfig(AppConfig):
name = 'compilacao'
verbose_name = _('Compilação')

0
compilacao/forms.py

27
compilacao/insert_inicial_TipoDispositivo.sql

@ -0,0 +1,27 @@
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (2, 'Ementa', 'ementa', '', '', 0, '.....', '', '', '', '', '', '', False, 'N', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (3, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (4, 'Omissis', 'omissis', '', '', 0, '.....', '', '', '', '', '', '', False, '1', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (11, 'Anexo', 'anexo', '', 'Anexo', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'I', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (12, 'Parte', 'parte', '', 'Parte', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'I', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (13, 'Livro', 'livro', '', 'Livro', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'I', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (14, 'Título', 'titulo', '', 'Título', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'I', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (15, 'Capítulo', 'capitulo', '', 'Capítulo', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'I', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (16, 'Seção', 'secao', '', 'Seção', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'I', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (17, 'SubSeção', 'subsecao', '', 'SubSeção', 0, '-----', '', '<br>', '', '<br>', '', '', False, '1', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (18, 'Item de Seção', 'itemsecao', '', 'Item', 0, '-----', '', '<br>', '', '<br>', '', '', False, '1', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (19, 'Artigo', 'artigo', '', 'Art.', 9, '-----', '', '&nbsp;&ndash;&nbsp;', '', '', '', '', True, '1', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (20, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', '', False, 'N', 'N', 'N', 'N', 'N', 'N');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (21, 'Parágrafo', 'paragrafo', '', '§;Parágrafo Único', 9, '-----', '', '&nbsp;&ndash;&nbsp;', '', '', '', '', False, '1', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (22, 'Inciso', 'inciso', '', '', 0, '.....', '', '&nbsp;&ndash;&nbsp;', '', '', '', '', False, 'I', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (23, 'Alinea', 'alinea', '', '', 0, '.....', '', '&nbsp;&ndash;&nbsp;', '', '', '', '', False, 'a', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (24, 'Item', 'item', '', '', 0, '.....', '', '&nbsp;&ndash;&nbsp;', '', '', '', '', False, '1', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (25, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'N', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (26, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'N', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (27, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'N', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (28, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '-----', '', '<br>', '', '<br>', '', '', False, 'N', '1', '1', '1', '1', '1');
insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, 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) VALUES (29, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '.....', '', '', '', '', '', '',False, '1', '1', '1', '1', '1', '1');
select setval('compilacao_tipodispositivo_id_seq'::regclass, (select max(id) from compilacao_tipodispositivo));

207
compilacao/migrations/0001_initial.py

@ -0,0 +1,207 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
from django.conf import settings
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('norma', '0003_auto_20150906_0239'),
]
operations = [
migrations.CreateModel(
name='Dispositivo',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('ordem', models.PositiveIntegerField(verbose_name='Ordem de Renderização', default=0)),
('ordem_bloco_atualizador', models.PositiveIntegerField(verbose_name='Ordem de Renderização no Bloco Atualizador', default=0)),
('nivel', models.PositiveIntegerField(blank=True, null=True, verbose_name='Nível Estrutural', default=0)),
('dispositivo0', models.PositiveIntegerField(verbose_name='Número do Dispositivo', default=0)),
('dispositivo1', models.PositiveIntegerField(blank=True, null=True, verbose_name='Primeiro Nível de Variação', default=0)),
('dispositivo2', models.PositiveIntegerField(blank=True, null=True, verbose_name='Segundo Nível de Variação', default=0)),
('dispositivo3', models.PositiveIntegerField(blank=True, null=True, verbose_name='Terceiro Nível de Variação', default=0)),
('dispositivo4', models.PositiveIntegerField(blank=True, null=True, verbose_name='Quarto Nível de Variação', default=0)),
('dispositivo5', models.PositiveIntegerField(blank=True, null=True, verbose_name='Quinto Nível de Variação', default=0)),
('rotulo', models.CharField(blank=True, max_length=50, verbose_name='Rótulo', default='')),
('texto', models.TextField(blank=True, verbose_name='Texto', default='')),
('texto_atualizador', models.TextField(blank=True, verbose_name='Texto no Dispositivo Atualizador', default='')),
('inicio_vigencia', models.DateField(verbose_name='Início de Vigência')),
('fim_vigencia', models.DateField(blank=True, null=True, verbose_name='Fim de Vigência')),
('inicio_eficacia', models.DateField(verbose_name='Início de Eficácia')),
('fim_eficacia', models.DateField(blank=True, null=True, verbose_name='Fim de Eficácia')),
('inconstitucionalidade', models.BooleanField(verbose_name='Inconstitucionalidade', default=False, choices=[(True, 'Sim'), (False, 'Não')])),
('visibilidade', models.BooleanField(verbose_name='Visibilidade na Norma Publicada', default=False, choices=[(True, 'Sim'), (False, 'Não')])),
('timestamp', models.DateTimeField()),
('dispositivo_atualizador', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo Atualizador', default=None, related_name='dispositivo_dispositivo_atualizador')),
('dispositivo_pai', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo Pai', default=None, related_name='dispositivo_dispositivo_pai')),
('dispositivo_subsequente', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo Subsequente', default=None, related_name='dispositivo_dispositivo_subsequente')),
('dispositivo_substituido', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo Substituido', default=None, related_name='dispositivo_dispositivo_substituido')),
('dispositivo_vigencia', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo de Vigência', default=None, related_name='dispositivo_dispositivo_vigencia')),
('norma', models.ForeignKey(to='norma.NormaJuridica', verbose_name='Norma Jurídica')),
('norma_publicada', models.ForeignKey(blank=True, null=True, to='norma.NormaJuridica', verbose_name='Norma Jurídica Publicada', default=None, related_name='dispositivo_norma_publicada')),
],
options={
'verbose_name': 'Dispositivo',
'verbose_name_plural': 'Dispositivos',
},
),
migrations.CreateModel(
name='Nota',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('texto', models.TextField(verbose_name='Texto da Nota')),
('url_externa', models.CharField(blank=True, max_length=1024, verbose_name='Url externa')),
('data_criacao', models.DateTimeField(verbose_name='Data de Criação')),
('publicacao', models.DateTimeField(verbose_name='Data de Publicação')),
('efetifidade', models.DateTimeField(verbose_name='Data de Efeito')),
('publicidade', models.PositiveSmallIntegerField(verbose_name='Nível de Publicidade', choices=[(1, 'Nota Privada'), (2, 'Nota Setorial'), (3, 'Nota Institucional'), (4, 'Nota Pública')])),
('dispositivo', models.ForeignKey(to='compilacao.Dispositivo', verbose_name='Dispositivo da Nota')),
('owner', models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Dono da Nota')),
],
options={
'verbose_name': 'Nota',
'verbose_name_plural': 'Notas',
},
),
migrations.CreateModel(
name='Publicacao',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('publicacao', models.DateTimeField(verbose_name='Data de Publicação')),
('pagina_inicio', models.PositiveIntegerField(blank=True, null=True, verbose_name='Pg. Início')),
('pagina_fim', models.PositiveIntegerField(blank=True, null=True, verbose_name='Pg. Fim')),
('timestamp', models.DateTimeField()),
('norma', models.ForeignKey(to='norma.NormaJuridica', verbose_name='Norma Jurídica')),
],
options={
'verbose_name': 'Publicação',
'verbose_name_plural': 'Publicações',
},
),
migrations.CreateModel(
name='TipoDispositivo',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('nome', models.CharField(max_length=50, verbose_name='Nome', unique=True)),
('class_css', models.CharField(max_length=20, verbose_name='Classe CSS')),
('rotulo_prefixo_html', models.CharField(blank=True, max_length=100, verbose_name='Prefixo html do rótulo')),
('rotulo_prefixo_texto', models.CharField(blank=True, max_length=30, verbose_name='Prefixo de construção do rótulo')),
('rotulo_ordinal', models.IntegerField(verbose_name='Tipo de número do rótulo')),
('rotulo_separadores_variacao', models.CharField(blank=True, max_length=5, verbose_name='Separadores das Variações')),
('rotulo_sufixo_texto', models.CharField(blank=True, max_length=30, verbose_name='Sufixo de construção do rótulo')),
('rotulo_sufixo_html', models.CharField(blank=True, max_length=100, verbose_name='Sufixo html do rótulo')),
('texto_prefixo_html', models.CharField(blank=True, max_length=100, verbose_name='Prefixo html do texto')),
('texto_sufixo_html', models.CharField(blank=True, max_length=100, verbose_name='Sufixo html do texto')),
('nota_automatica_prefixo_html', models.CharField(blank=True, max_length=100, verbose_name='Prefixo html da nota automática')),
('nota_automatica_sufixo_html', models.CharField(blank=True, max_length=100, verbose_name='Sufixo html da nota automática')),
('contagem_continua', models.BooleanField(verbose_name='Contagem contínua', choices=[(True, 'Sim'), (False, 'Não')])),
('formato_variacao0', models.CharField(max_length=1, verbose_name='Formato da Numeração', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])),
('formato_variacao1', models.CharField(max_length=1, verbose_name='Formato da Variação 1', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])),
('formato_variacao2', models.CharField(max_length=1, verbose_name='Formato da Variação 2', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])),
('formato_variacao3', models.CharField(max_length=1, verbose_name='Formato da Variação 3', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])),
('formato_variacao4', models.CharField(max_length=1, verbose_name='Formato da Variação 4', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])),
('formato_variacao5', models.CharField(max_length=1, verbose_name='Formato da Variação 5', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])),
],
options={
'verbose_name': 'Tipo de Dispositivo',
'verbose_name_plural': 'Tipos de Dispositivo',
},
),
migrations.CreateModel(
name='TipoNota',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('sigla', models.CharField(max_length=10, verbose_name='Sigla', unique=True)),
('nome', models.CharField(max_length=50, verbose_name='Nome')),
('modelo', models.TextField(blank=True, verbose_name='Modelo')),
],
options={
'verbose_name': 'Tipo de Nota',
'verbose_name_plural': 'Tipos de Nota',
},
),
migrations.CreateModel(
name='TipoPublicacao',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('sigla', models.CharField(max_length=10, verbose_name='Sigla', unique=True)),
('nome', models.CharField(max_length=50, verbose_name='Nome')),
],
options={
'verbose_name': 'Tipo de Publicação',
'verbose_name_plural': 'Tipos de Publicação',
},
),
migrations.CreateModel(
name='TipoVide',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('sigla', models.CharField(max_length=10, verbose_name='Sigla', unique=True)),
('nome', models.CharField(max_length=50, verbose_name='Nome')),
],
options={
'verbose_name': 'Tipo de Vide',
'verbose_name_plural': 'Tipos de Vide',
},
),
migrations.CreateModel(
name='VeiculoPublicacao',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('sigla', models.CharField(max_length=10, verbose_name='Sigla', unique=True)),
('nome', models.CharField(max_length=60, verbose_name='Nome')),
],
options={
'verbose_name': 'Veículo de Publicação',
'verbose_name_plural': 'Veículos de Publicação',
},
),
migrations.CreateModel(
name='Vide',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('data_criacao', models.DateTimeField(verbose_name='Data de Criação')),
('texto', models.TextField(verbose_name='Texto do Vide')),
('dispositivo_base', models.ForeignKey(to='compilacao.Dispositivo', verbose_name='Dispositivo Base', related_name='vide_dispositivo_base')),
('dispositivo_ref', models.ForeignKey(to='compilacao.Dispositivo', verbose_name='Dispositivo Referido', related_name='vide_dispositivo_ref')),
('tipo', models.ForeignKey(to='compilacao.TipoVide', verbose_name='Tipo do Vide')),
],
options={
'verbose_name': 'Vide',
'verbose_name_plural': 'Vides',
},
),
migrations.AddField(
model_name='publicacao',
name='tipo_publicacao',
field=models.ForeignKey(to='compilacao.TipoPublicacao', verbose_name='Tipo de Publicação'),
),
migrations.AddField(
model_name='publicacao',
name='veiculo_publicacao',
field=models.ForeignKey(to='compilacao.VeiculoPublicacao', verbose_name='Veículo de Publicação'),
),
migrations.AddField(
model_name='nota',
name='tipo',
field=models.ForeignKey(to='compilacao.TipoNota', verbose_name='Tipo da Nota'),
),
migrations.AddField(
model_name='dispositivo',
name='publicacao',
field=models.ForeignKey(blank=True, null=True, to='compilacao.Publicacao', verbose_name='Publicação', default=None),
),
migrations.AddField(
model_name='dispositivo',
name='tipo_dispositivo',
field=models.ForeignKey(to='compilacao.TipoDispositivo', verbose_name='Tipo do Dispositivo'),
),
migrations.AlterUniqueTogether(
name='dispositivo',
unique_together=set([('norma', 'dispositivo0', 'dispositivo1', 'dispositivo2', 'dispositivo3', 'dispositivo4', 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', 'publicacao'), ('norma', 'ordem')]),
),
]

48
compilacao/migrations/0002_auto_20150907_2334.py

@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='dispositivo',
options={'ordering': ['norma', 'ordem'], 'verbose_name_plural': 'Dispositivos', 'verbose_name': 'Dispositivo'},
),
migrations.AlterField(
model_name='dispositivo',
name='dispositivo_atualizador',
field=models.ForeignKey(related_name='dispositivos_alterados_set', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo Atualizador', default=None, blank=True),
),
migrations.AlterField(
model_name='dispositivo',
name='dispositivo_pai',
field=models.ForeignKey(related_name='+', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo Pai', default=None, blank=True),
),
migrations.AlterField(
model_name='dispositivo',
name='dispositivo_subsequente',
field=models.ForeignKey(related_name='+', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo Subsequente', default=None, blank=True),
),
migrations.AlterField(
model_name='dispositivo',
name='dispositivo_substituido',
field=models.ForeignKey(related_name='+', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo Substituido', default=None, blank=True),
),
migrations.AlterField(
model_name='dispositivo',
name='dispositivo_vigencia',
field=models.ForeignKey(related_name='+', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo de Vigência', default=None, blank=True),
),
migrations.AlterField(
model_name='dispositivo',
name='norma_publicada',
field=models.ForeignKey(related_name='dispositivos_alterados_set', to='norma.NormaJuridica', null=True, verbose_name='Norma Jurídica Publicada', default=None, blank=True),
),
]

19
compilacao/migrations/0003_auto_20150911_1735.py

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0002_auto_20150907_2334'),
]
operations = [
migrations.AlterField(
model_name='dispositivo',
name='dispositivo_pai',
field=models.ForeignKey(blank=True, null=True, verbose_name='Dispositivo Pai', to='compilacao.Dispositivo', related_name='filhos', default=None),
),
]

34
compilacao/migrations/0004_auto_20150914_0842.py

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0003_auto_20150911_1735'),
]
operations = [
migrations.AlterField(
model_name='dispositivo',
name='dispositivo_pai',
field=models.ForeignKey(to='compilacao.Dispositivo', verbose_name='Dispositivo Pai', blank=True, related_name='dispositivos_filhos_set', null=True, default=None),
),
migrations.AlterField(
model_name='dispositivo',
name='norma',
field=models.ForeignKey(related_name='dispositivos_set', to='norma.NormaJuridica', verbose_name='Norma Jurídica'),
),
migrations.AlterField(
model_name='dispositivo',
name='norma_publicada',
field=models.ForeignKey(to='norma.NormaJuridica', verbose_name='Norma Jurídica Publicada', blank=True, related_name='dispositivos_alterados_pela_norma_set', null=True, default=None),
),
migrations.AlterField(
model_name='dispositivo',
name='tipo_dispositivo',
field=models.ForeignKey(related_name='dispositivos_do_tipo_set', to='compilacao.TipoDispositivo', verbose_name='Tipo do Dispositivo'),
),
]

0
compilacao/migrations/__init__.py

402
compilacao/models.py

@ -0,0 +1,402 @@
from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import ugettext_lazy as _
from norma.models import NormaJuridica
from sapl.utils import YES_NO_CHOICES
class TipoNota(models.Model):
sigla = models.CharField(
max_length=10, unique=True, verbose_name=_('Sigla'))
nome = models.CharField(max_length=50, verbose_name=_('Nome'))
modelo = models.TextField(
blank=True, verbose_name=_('Modelo'))
class Meta:
verbose_name = _('Tipo de Nota')
verbose_name_plural = _('Tipos de Nota')
def __str__(self):
return '%s: %s' % (self.sigla, self.nome)
class TipoVide(models.Model):
sigla = models.CharField(
max_length=10, unique=True, verbose_name=_('Sigla'))
nome = models.CharField(max_length=50, verbose_name=_('Nome'))
class Meta:
verbose_name = _('Tipo de Vide')
verbose_name_plural = _('Tipos de Vide')
def __str__(self):
return '%s: %s' % (self.sigla, self.nome)
class TipoDispositivo(models.Model):
FNC1 = '1'
FNCI = 'I'
FNCi = 'i'
FNCA = 'A'
FNCa = 'a'
FNC8 = '*'
FNCN = 'N'
FORMATO_NUMERACAO_CHOICES = (
(FNC1, _('(1) Numérico')),
(FNCI, _('(I) Romano Maiúsculo')),
(FNCi, _('(i) Romano Minúsculo')),
(FNCA, _('(A) Alfabético Maiúsculo')),
(FNCa, _('(a) Alfabético Minúsculo')),
(FNC8, _('Tópico - Sem contagem')),
(FNCN, _('Sem renderização')),
)
nome = models.CharField(
max_length=50, unique=True, verbose_name=_('Nome'))
class_css = models.CharField(
max_length=20,
verbose_name=_('Classe CSS'))
rotulo_prefixo_html = models.CharField(
blank=True,
max_length=100,
verbose_name=_('Prefixo html do rótulo'))
rotulo_prefixo_texto = models.CharField(
blank=True,
max_length=30,
verbose_name=_('Prefixo de construção do rótulo'))
rotulo_ordinal = models.IntegerField(
verbose_name=_('Tipo de número do rótulo'))
rotulo_separadores_variacao = models.CharField(
blank=True,
max_length=5,
verbose_name=_('Separadores das Variações'))
rotulo_sufixo_texto = models.CharField(
blank=True,
max_length=30,
verbose_name=_('Sufixo de construção do rótulo'))
rotulo_sufixo_html = models.CharField(
blank=True,
max_length=100,
verbose_name=_('Sufixo html do rótulo'))
texto_prefixo_html = models.CharField(
blank=True,
max_length=100,
verbose_name=_('Prefixo html do texto'))
texto_sufixo_html = models.CharField(
blank=True,
max_length=100,
verbose_name=_('Sufixo html do texto'))
nota_automatica_prefixo_html = models.CharField(
blank=True,
max_length=100,
verbose_name=_('Prefixo html da nota automática'))
nota_automatica_sufixo_html = models.CharField(
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'))
formato_variacao0 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
verbose_name=_('Formato da Numeração'))
formato_variacao1 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
verbose_name=_('Formato da Variação 1'))
formato_variacao2 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
verbose_name=_('Formato da Variação 2'))
formato_variacao3 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
verbose_name=_('Formato da Variação 3'))
formato_variacao4 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
verbose_name=_('Formato da Variação 4'))
formato_variacao5 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
verbose_name=_('Formato da Variação 5'))
class Meta:
verbose_name = _('Tipo de Dispositivo')
verbose_name_plural = _('Tipos de Dispositivo')
def __str__(self):
return self.nome
class TipoPublicacao(models.Model):
sigla = models.CharField(
max_length=10, unique=True, verbose_name=_('Sigla'))
nome = models.CharField(max_length=50, verbose_name=_('Nome'))
class Meta:
verbose_name = _('Tipo de Publicação')
verbose_name_plural = _('Tipos de Publicação')
def __str__(self):
return self.sigla + ' - ' + self.nome
class VeiculoPublicacao(models.Model):
sigla = models.CharField(
max_length=10, unique=True, verbose_name=_('Sigla'))
nome = models.CharField(max_length=60, verbose_name=_('Nome'))
class Meta:
verbose_name = _('Veículo de Publicação')
verbose_name_plural = _('Veículos de Publicação')
def __str__(self):
return '%s: %s' % (self.sigla, self.nome)
class Publicacao(models.Model):
norma = models.ForeignKey(
NormaJuridica, verbose_name=_('Norma Jurídica'))
veiculo_publicacao = models.ForeignKey(
VeiculoPublicacao, verbose_name=_('Veículo de Publicação'))
tipo_publicacao = models.ForeignKey(
TipoPublicacao, verbose_name=_('Tipo de Publicação'))
publicacao = models.DateTimeField(verbose_name=_('Data de Publicação'))
pagina_inicio = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Pg. Início'))
pagina_fim = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Pg. Fim'))
timestamp = models.DateTimeField()
class Meta:
verbose_name = _('Publicação')
verbose_name_plural = _('Publicações')
def __str__(self):
return '%s: %s' % (self.veiculo_publicacao, self.publicacao)
class Dispositivo(models.Model):
TEXTO_PADRAO_DISPOSITIVO_REVOGADO = _('(Revogado)')
ordem = models.PositiveIntegerField(
default=0,
verbose_name=_('Ordem de Renderização'))
ordem_bloco_atualizador = models.PositiveIntegerField(
default=0,
verbose_name=_('Ordem de Renderização no Bloco Atualizador'))
nivel = models.PositiveIntegerField(
default=0,
blank=True,
null=True,
verbose_name=_('Nível Estrutural'))
dispositivo0 = models.PositiveIntegerField(
default=0,
verbose_name=_('Número do Dispositivo'))
dispositivo1 = models.PositiveIntegerField(
default=0,
blank=True,
null=True,
verbose_name=_('Primeiro Nível de Variação'))
dispositivo2 = models.PositiveIntegerField(
default=0,
blank=True,
null=True,
verbose_name=_('Segundo Nível de Variação'))
dispositivo3 = models.PositiveIntegerField(
default=0,
blank=True,
null=True,
verbose_name=_('Terceiro Nível de Variação'))
dispositivo4 = models.PositiveIntegerField(
default=0,
blank=True,
null=True,
verbose_name=_('Quarto Nível de Variação'))
dispositivo5 = models.PositiveIntegerField(
default=0,
blank=True,
null=True,
verbose_name=_('Quinto Nível de Variação'))
rotulo = models.CharField(
max_length=50,
blank=True,
default='',
verbose_name=_('Rótulo'))
texto = models.TextField(
blank=True,
default='',
verbose_name=_('Texto'))
texto_atualizador = models.TextField(
blank=True,
default='',
verbose_name=_('Texto no Dispositivo Atualizador'))
inicio_vigencia = models.DateField(
verbose_name=_('Início de Vigência'))
fim_vigencia = models.DateField(
blank=True, null=True, verbose_name=_('Fim de Vigência'))
inicio_eficacia = models.DateField(
verbose_name=_('Início de Eficácia'))
fim_eficacia = models.DateField(
blank=True, null=True, verbose_name=_('Fim de Eficácia'))
inconstitucionalidade = models.BooleanField(
default=False,
choices=YES_NO_CHOICES,
verbose_name=_('Inconstitucionalidade'))
# Relevant attribute only in altering norms
visibilidade = models.BooleanField(
default=False,
choices=YES_NO_CHOICES,
verbose_name=_('Visibilidade na Norma Publicada'))
timestamp = models.DateTimeField()
tipo_dispositivo = models.ForeignKey(
TipoDispositivo,
related_name='dispositivos_do_tipo_set',
verbose_name=_('Tipo do Dispositivo'))
publicacao = models.ForeignKey(
Publicacao,
blank=True, null=True, default=None, verbose_name=_('Publicação'))
norma = models.ForeignKey(
NormaJuridica,
related_name='dispositivos_set',
verbose_name=_('Norma Jurídica'))
norma_publicada = models.ForeignKey(
NormaJuridica,
blank=True, null=True, default=None,
related_name='dispositivos_alterados_pela_norma_set',
verbose_name=_('Norma Jurídica Publicada'))
dispositivo_subsequente = models.ForeignKey(
'self',
blank=True, null=True, default=None,
related_name='+',
verbose_name=_('Dispositivo Subsequente'))
dispositivo_substituido = models.ForeignKey(
'self',
blank=True, null=True, default=None,
related_name='+',
verbose_name=_('Dispositivo Substituido'))
dispositivo_pai = models.ForeignKey(
'self',
blank=True, null=True, default=None,
related_name='dispositivos_filhos_set',
verbose_name=_('Dispositivo Pai'))
dispositivo_vigencia = models.ForeignKey(
'self',
blank=True, null=True, default=None,
related_name='+',
verbose_name=_('Dispositivo de Vigência'))
dispositivo_atualizador = models.ForeignKey(
'self',
blank=True, null=True, default=None,
related_name='dispositivos_alterados_set',
verbose_name=_('Dispositivo Atualizador'))
class Meta:
verbose_name = _('Dispositivo')
verbose_name_plural = _('Dispositivos')
ordering = ['norma', 'ordem']
unique_together = (
('norma', 'ordem',),
('norma',
'dispositivo0',
'dispositivo1',
'dispositivo2',
'dispositivo3',
'dispositivo4',
'dispositivo5',
'tipo_dispositivo',
'dispositivo_pai',
'publicacao',),
)
def __str__(self):
return '%(rotulo)s - %(norma)s' % {
'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo),
'norma': self.norma}
class Vide(models.Model):
data_criacao = models.DateTimeField(verbose_name=_('Data de Criação'))
texto = models.TextField(verbose_name=_('Texto do Vide'))
tipo = models.ForeignKey(TipoVide, verbose_name=_('Tipo do Vide'))
dispositivo_base = models.ForeignKey(
Dispositivo,
verbose_name=_('Dispositivo Base'),
related_name='%(class)s_dispositivo_base')
dispositivo_ref = models.ForeignKey(
Dispositivo,
related_name='%(class)s_dispositivo_ref',
verbose_name=_('Dispositivo Referido'))
class Meta:
verbose_name = _('Vide')
verbose_name_plural = _('Vides')
def __str__(self):
return _('Vide %s') % self.texto
class Nota(models.Model):
NPRIV = 1
NSTRL = 2
NINST = 3
NPUBL = 4
PUBLICIDADE_CHOICES = (
# Only the owner of the note has visibility.
(NPRIV, _('Nota Privada')),
# All of the same group have visibility.
(NSTRL, _('Nota Setorial')),
# All authenticated users have visibility.
(NINST, _('Nota Institucional')),
# All users have visibility.
(NPUBL, _('Nota Pública')),
)
texto = models.TextField(verbose_name=_('Texto da Nota'))
url_externa = models.CharField(
max_length=1024,
blank=True,
verbose_name=_('Url externa'))
data_criacao = models.DateTimeField(verbose_name=_('Data de Criação'))
publicacao = models.DateTimeField(verbose_name=_('Data de Publicação'))
efetifidade = models.DateTimeField(verbose_name=_('Data de Efeito'))
tipo = models.ForeignKey(TipoNota, verbose_name=_('Tipo da Nota'))
dispositivo = models.ForeignKey(
Dispositivo,
verbose_name=_('Dispositivo da Nota'))
owner = models.ForeignKey(User, verbose_name=_('Dono da Nota'))
publicidade = models.PositiveSmallIntegerField(
choices=PUBLICIDADE_CHOICES,
verbose_name=_('Nível de Publicidade'))
class Meta:
verbose_name = _('Nota')
verbose_name_plural = _('Notas')
def __str__(self):
return '%s: %s' % (
self.tipo,
self.PUBLICIDADE_CHOICES[self.publicidade][1]
)

0
compilacao/templatetags/__init__.py

64
compilacao/templatetags/compilacao_filters.py

@ -0,0 +1,64 @@
from django import template
from django.core.signing import Signer
from django.db.models import Q
from compilacao.models import Dispositivo
register = template.Library()
@register.filter
def get_bloco(pk_atualizador):
return Dispositivo.objects.order_by('ordem_bloco_atualizador').filter(
Q(dispositivo_pai_id=pk_atualizador) |
Q(dispositivo_atualizador_id=pk_atualizador)).select_related()
@register.filter
def get_field(value, key):
return value[key]
@register.simple_tag
def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia):
if inicio_vigencia and fim_vigencia:
if dispositivo.fim_vigencia is None:
return ''
elif dispositivo.fim_vigencia >= fim_vigencia:
return ''
return 'desativado'
else:
if dispositivo.fim_vigencia is not None:
return 'desativado'
return ''
@register.simple_tag
def nota_automatica(dispositivo):
if dispositivo.norma_publicada is not None and \
dispositivo.tipo_dispositivo.class_css != 'artigo':
d = dispositivo.dispositivo_atualizador.dispositivo_pai
if dispositivo.texto == Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO:
return 'Revogado pelo %s.' % d
else:
return 'Alteração feita pelo %s.' % d
return ''
@register.simple_tag
def set_nivel_old(view, value):
view.flag_nivel_old = value
return ''
@register.simple_tag
def close_div(value_max, value_min):
return '</div>' * (int(value_max) - int(value_min) + 1)
@register.filter
def get_sign_vigencia(value):
string = "%s,%s" % (value.inicio_vigencia, value.fim_vigencia)
signer = Signer()
return signer.sign(str(string))

16
compilacao/urls.py

@ -0,0 +1,16 @@
from django.conf.urls import url
from compilacao import views
urlpatterns = [
url(r'^norma/(?P<norma_id>[0-9]+)/compilacao/$',
views.CompilacaoView.as_view(), name='compilacao'),
url(r'^norma/(?P<norma_id>[0-9]+)/compilacao/vigencia/(?P<sign>.+)/$',
views.CompilacaoView.as_view(), name='vigencia'),
url(r'^norma/(?P<norma_id>[0-9]+)/compilacao/(?P<dispositivo_id>[0-9]+)/$',
views.DispositivoView.as_view(), name='dispositivo'),
]

164
compilacao/views.py

@ -0,0 +1,164 @@
from collections import OrderedDict
from datetime import timedelta
from django.core.signing import Signer
from django.utils.dateparse import parse_date
from django.views.generic.list import ListView
from compilacao.models import Dispositivo
from norma.models import NormaJuridica
DISPOSITIVO_SELECT_RELATED = (
'tipo_dispositivo',
'norma_publicada',
'norma',
'dispositivo_atualizador',
'dispositivo_atualizador__dispositivo_pai',
'dispositivo_atualizador__dispositivo_pai__norma',
'dispositivo_atualizador__dispositivo_pai__norma__tipo',
'dispositivo_pai')
class CompilacaoView(ListView):
template_name = 'compilacao/index.html'
flag_alteradora = -1
flag_nivel_ini = 0
flag_nivel_old = -1
itens_de_vigencia = {}
inicio_vigencia = None
fim_vigencia = None
def get_queryset(self):
self.flag_alteradora = -1
self.flag_nivel_ini = 0
self.flag_nivel_old = -1
self.inicio_vigencia = None
self.fim_vigencia = None
if 'sign' in self.kwargs:
signer = Signer()
try:
string = signer.unsign(self.kwargs['sign']).split(',')
self.inicio_vigencia = parse_date(string[0])
self.fim_vigencia = parse_date(string[1])
except:
return{}
return Dispositivo.objects.filter(
inicio_vigencia__lte=self.fim_vigencia,
ordem__gt=0,
norma_id=self.kwargs['norma_id'],
).select_related(*DISPOSITIVO_SELECT_RELATED)
else:
return Dispositivo.objects.filter(
ordem__gt=0,
norma_id=self.kwargs['norma_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
def get_vigencias(self):
itens = Dispositivo.objects.filter(
norma_id=self.kwargs['norma_id'],
).order_by(
'inicio_vigencia'
).distinct(
'inicio_vigencia'
).select_related(
'norma_publicada',
'norma',
'norma_publicada__tipo',
'norma__tipo',)
ajuste_datas_vigencia = []
for item in itens:
ajuste_datas_vigencia.append(item)
lenLista = len(ajuste_datas_vigencia)
for i in range(lenLista):
if i + 1 < lenLista:
ajuste_datas_vigencia[
i].fim_vigencia = ajuste_datas_vigencia[
i + 1].inicio_vigencia - timedelta(days=1)
else:
ajuste_datas_vigencia[i].fim_vigencia = None
self.itens_de_vigencia = {}
idx = -1
length = len(ajuste_datas_vigencia)
for item in ajuste_datas_vigencia:
idx += 1
if idx == 0:
self.itens_de_vigencia[0] = [item, ]
continue
if idx + 1 < length:
ano = item.norma_publicada.ano
if ano in self.itens_de_vigencia:
self.itens_de_vigencia[ano].append(item)
else:
self.itens_de_vigencia[ano] = [item, ]
else:
self.itens_de_vigencia[9999] = [item, ]
if len(self.itens_de_vigencia.keys()) <= 1:
return {}
self.itens_de_vigencia = OrderedDict(
sorted(self.itens_de_vigencia.items(), key=lambda t: t[0]))
return self.itens_de_vigencia
def get_norma(self):
return NormaJuridica.objects.select_related('tipo').get(
pk=self.kwargs['norma_id'])
def is_norma_alteradora(self):
if self.flag_alteradora == -1:
self.flag_alteradora = Dispositivo.objects.select_related(
'dispositivos_alterados_pela_norma_set'
).filter(norma_id=self.kwargs['norma_id']).count()
return self.flag_alteradora > 0
class DispositivoView(CompilacaoView):
# template_name = 'compilacao/index.html'
template_name = 'compilacao/template_render_bloco.html'
def get_queryset(self):
self.flag_alteradora = -1
self.flag_nivel_ini = 0
self.flag_nivel_old = -1
try:
bloco = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
except Dispositivo.DoesNotExist:
return []
self.flag_nivel_old = bloco.nivel - 1
self.flag_nivel_ini = bloco.nivel
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=bloco.ordem,
nivel__lte=bloco.nivel,
norma_publicada=None,
norma_id=self.kwargs['norma_id'])[:1]
if proximo_bloco.count() == 0:
itens = Dispositivo.objects.filter(
ordem__gte=bloco.ordem,
norma_publicada=None,
norma_id=self.kwargs['norma_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
else:
itens = Dispositivo.objects.filter(
ordem__gte=bloco.ordem,
ordem__lt=proximo_bloco[0].ordem,
norma_publicada=None,
norma_id=self.kwargs['norma_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
return itens

18
materia/migrations/0005_auto_20150923_0941.py

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('materia', '0004_materialegislativa_texto_original'),
]
operations = [
migrations.AlterUniqueTogether(
name='materialegislativa',
unique_together=set([('tipo', 'numero', 'ano')]),
),
]

35
norma/migrations/0003_auto_20150906_0239.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('norma', '0002_auto_20150729_1717'),
]
operations = [
migrations.CreateModel(
name='AssuntoNormaRelationship',
fields=[
('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)),
('assunto', models.ForeignKey(to='norma.AssuntoNorma')),
],
),
migrations.RemoveField(
model_name='normajuridica',
name='assunto',
),
migrations.AddField(
model_name='assuntonormarelationship',
name='norma',
field=models.ForeignKey(to='norma.NormaJuridica'),
),
migrations.AddField(
model_name='normajuridica',
name='assuntos',
field=models.ManyToManyField(to='norma.AssuntoNorma', through='norma.AssuntoNormaRelationship'),
),
]

18
norma/migrations/0004_auto_20150907_0004.py

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('norma', '0003_auto_20150906_0239'),
]
operations = [
migrations.AlterUniqueTogether(
name='assuntonormarelationship',
unique_together=set([('assunto', 'norma')]),
),
]

18
norma/migrations/0005_auto_20150915_1141.py

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('norma', '0004_auto_20150907_0004'),
]
operations = [
migrations.AlterModelOptions(
name='normajuridica',
options={'verbose_name_plural': 'Normas Jurídicas', 'verbose_name': 'Norma Jurídica', 'ordering': ['-data']},
),
]

21
norma/models.py

@ -1,4 +1,5 @@
from django.db import models from django.db import models
from django.template import defaultfilters
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from materia.models import MateriaLegislativa from materia.models import MateriaLegislativa
@ -87,20 +88,32 @@ class NormaJuridica(models.Model):
complemento = models.NullBooleanField( complemento = models.NullBooleanField(
blank=True, verbose_name=_('Complementar ?')) blank=True, verbose_name=_('Complementar ?'))
# XXX was a CharField (attention on migrate) # XXX was a CharField (attention on migrate)
assunto = models.ForeignKey(AssuntoNorma) assuntos = models.ManyToManyField(
AssuntoNorma,
through='AssuntoNormaRelationship')
data_vigencia = models.DateField(blank=True, null=True) data_vigencia = models.DateField(blank=True, null=True)
timestamp = models.DateTimeField() timestamp = models.DateTimeField()
class Meta: class Meta:
verbose_name = _('Norma Jurídica') verbose_name = _('Norma Jurídica')
verbose_name_plural = _('Normas Jurídicas') verbose_name_plural = _('Normas Jurídicas')
ordering = ['-data']
def __str__(self): def __str__(self):
return _('%(tipo)s%(numero)s - %(materia)s - %(ano)s') % { return _('%(tipo)s%(numero)s de %(data)s') % {
'tipo': self.tipo, 'tipo': self.tipo,
'numero': self.numero, 'numero': self.numero,
'materia': self.materia, 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")}
'ano': self.ano}
class AssuntoNormaRelationship(models.Model):
assunto = models.ForeignKey(AssuntoNorma)
norma = models.ForeignKey(NormaJuridica)
class Meta:
unique_together = (
('assunto', 'norma'),
)
class LegislacaoCitada(models.Model): class LegislacaoCitada(models.Model):

10
norma/urls.py

@ -1,8 +1,16 @@
from django.conf.urls import include, url from django.conf.urls import include, url
from norma.views import assunto_norma_crud, tipo_norma_crud from norma.views import (assunto_norma_crud,
norma_temporario_para_compilacao_crud,
tipo_norma_crud)
norma_url_patterns = norma_temporario_para_compilacao_crud.urlpatterns
urlpatterns = [ urlpatterns = [
url(r'^norma/', include(norma_url_patterns,
norma_temporario_para_compilacao_crud.namespace,
norma_temporario_para_compilacao_crud.namespace)),
url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)), url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)),
url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)), url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)),
] ]

11
norma/views.py

@ -45,6 +45,17 @@ norma_crud = build_crud(
[('assunto_norma_FIXME', 12)]], [('assunto_norma_FIXME', 12)]],
]) ])
norma_temporario_para_compilacao_crud = build_crud(
NormaJuridica, 'norma', [
[_('Identificação Básica'),
[('tipo', 4), ('numero', 4), ('ano', 4)],
[('data', 4), ('esfera_federacao', 4)],
[('data_publicacao', 3)],
[('ementa', 12)]],
])
legislacao_citada_crud = build_crud( legislacao_citada_crud = build_crud(
LegislacaoCitada, '', [ LegislacaoCitada, '', [

1
sapl/settings.py

@ -43,6 +43,7 @@ INSTALLED_APPS = (
'base', 'base',
'parlamentares', 'parlamentares',
'comissoes', 'comissoes',
'compilacao',
'sessao', 'sessao',
'materia', 'materia',
'norma', 'norma',

2
sapl/urls.py

@ -29,6 +29,8 @@ urlpatterns = [
url(r'', include('lexml.urls')), url(r'', include('lexml.urls')),
url(r'', include('painel.urls')), url(r'', include('painel.urls')),
url(r'', include('compilacao.urls')),
# must come at the end # must come at the end
# so that base /sistema/ url doesn't capture its children # so that base /sistema/ url doesn't capture its children
url(r'', include('base.urls')), url(r'', include('base.urls')),

1
sapl/utils.py

@ -8,6 +8,7 @@ from django.utils.translation import ugettext_lazy as _
appconfs = [apps.get_app_config(n) for n in [ appconfs = [apps.get_app_config(n) for n in [
'parlamentares', 'parlamentares',
'comissoes', 'comissoes',
'compilacao',
'materia', 'materia',
'norma', 'norma',
'sessao', 'sessao',

1
sessao/views.py

@ -416,7 +416,6 @@ class EditMateriaOrdemDiaView(FormMixin, sessao_crud.CrudDetailView):
return reverse('sessaoplenaria:materiaordemdia_list', return reverse('sessaoplenaria:materiaordemdia_list',
kwargs={'pk': pk}) kwargs={'pk': pk})
class OradorForm(forms.Form): class OradorForm(forms.Form):
numero_ordem = forms.IntegerField(required=True) numero_ordem = forms.IntegerField(required=True)
parlamentar = forms.CharField(required=False, max_length=20) parlamentar = forms.CharField(required=False, max_length=20)

178
static/styles/compilacao.scss

@ -0,0 +1,178 @@
.articulacao div {
background-color: #fff;
}
.dispositivo {
background-color: #ddd !important;
transition: all .4s ease-in-out;
display:inline;
}
.dispositivo .ementa {
padding: 4em 0em 3em 50%;
font-weight: bold;
}
.dispositivo .anexo {
font-size: 1.4em;
text-align: center;
font-weight: bold;
margin-top: 3em;
}
.dispositivo .parte {
font-size: 1.5em;
text-align: center;
font-weight: bold;
margin-top: 2em;
}
.dispositivo .livro {
font-size: 1.5em;
text-align: center;
font-weight: bold;
margin-top: 2em;
}
.dispositivo .titulo {
font-size: 1.5em;
text-align: center;
font-weight: bold;
margin-top: 2em;
}
.dispositivo .capitulo {
margin-top: 1.5em;
font-size: 1.3em;
text-align: center;
font-weight: bold;
}
.dispositivo .secao {
margin-top: 0.8em;
font-size: 1.2em;
text-align: center;
font-weight: bold;
}
.dispositivo .subsecao, .dispositivo .itemsecao {
margin-top: 0.8em;
font-size: 1.2em;
text-align: center;
font-style: italic;
font-weight: bold;
}
.dispositivo .artigo {
font-size: 1.15em;
float:left;
}
.dispositivo .caput {
font-size: 1.15em;
margin-bottom: 0.5em;
display: block;
}
.dispositivo .paragrafo {
margin-left: 1.5em;
font-size: 1.1em;
margin-top: 5px;
margin-bottom: 3px;
}
.dispositivo .inciso {
font-size: 1.1em;
margin-left: 2.5em;
margin-top: 5px;
margin-bottom: 3px;
}
.dispositivo .alinea {
font-size: 1.0em;
margin-left: 3.5em;
}
.dispositivo .item {
font-size: 1.0em;
margin-left: 4.5em;
}
.dispositivo .desativado, .dispositivo .desativado * {
text-decoration: line-through;
color: #777 !important;
}
.dispositivo .desativado table, .dispositivo .desativado table td {
border: 1px dotted #ccc;
text-decoration: line-through;
}
.dispositivo a {
color: #444444 !important;
}
.dispositivo a.link_alterador {
color: #2980B9 !important;
font-size: 0.9rem;
}
.dispositivo .bloco_alteracao {
margin-left: 5em;
font-style: italic;
}
.dispositivo .bloco_alteracao:hover a {
text-decoration: underline;
}
.dispositivo .bloco_alteracao,
.dispositivo .bloco_alteracao a,
.dispositivo .bloco_alteracao table,
.dispositivo .bloco_alteracao table td {
color: #018 !important;
}
.compilacao .top-bar-section li:not(.has-form) a:not(.button),
.compilacao .top-bar {
line-height: 1.6rem;
height: auto;
background: #2980B9;
z-index:1;
margin: 0 auto;
max-width: 62.5rem;
}
.compilacao .top-bar-section li:not(.has-form) a:not(.button).selected,
.compilacao .top-bar-section li:not(.has-form) a:not(.button):hover {
background: #1056A0;
}
.compilacao .top-bar-section li:not(.has-form) a:not(.button) {
padding: 0 0.43333rem;
}
.compilacao ul.nav {
background: #2980B9;
display:block;
width: 100%;
z-index:1;
}
.compilacao .tipo-vigencias {
border-top: 1px solid #62B5B5;
}
.compilacao .vigencias {
margin: 2.5em 0 0 0;
transition: all .4s ease-in-out;
background: #2980B9;
}
.compilacao .fixed{
z-index:98;
}
.displaynone {
display: none !important;
}

1
templates/base.html

@ -19,6 +19,7 @@
<link rel="stylesheet" href="{% static 'components-font-awesome/css/font-awesome.css' %}"> <link rel="stylesheet" href="{% static 'components-font-awesome/css/font-awesome.css' %}">
<link rel="stylesheet" href="{% static 'foundation-icon-fonts/foundation-icons.css' %}"> <link rel="stylesheet" href="{% static 'foundation-icon-fonts/foundation-icons.css' %}">
<link rel="stylesheet" href="{% sass_src 'styles/app.scss' %}" type="text/css"> <link rel="stylesheet" href="{% sass_src 'styles/app.scss' %}" type="text/css">
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
{# Scripts #} {# Scripts #}
{# modernizr must be in head (see http://modernizr.com/docs/#installing) #} {# modernizr must be in head (see http://modernizr.com/docs/#installing) #}

10
templates/compilacao/bloco_alteracao.html

@ -0,0 +1,10 @@
{% load compilacao_filters %}
{% for ch in dispositivo.pk|get_bloco %}
{% spaceless %}
<div class="dispositivo" id="d{{ch.id}}">
<div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}">
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{ch.pk}}" href="{%url 'compilacao' ch.norma.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
</div>
</div>
{% endspaceless %}
{% endfor %}

101
templates/compilacao/index.html

@ -0,0 +1,101 @@
{% extends "base.html" %}
{% load i18n %}
{% load compilacao_filters %}
{% block title%}
<h1>{{ view.get_norma }}</h1>
{% endblock %}
{% block base_content %}
<script type="text/javascript">
$( window ).scroll(function() {
if (window.pageYOffset <= 180) {
$( "section.vigencias" ).removeClass("fixed");
}
else if (!$( "section.vigencias" ).hasClass("fixed")){
$( "section.vigencias" ).addClass("fixed");
}
});
function textoMultiVigente(item) {
$(".compilacao .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected")
$(".desativado").removeClass("displaynone");
$(".link_alterador").removeClass("displaynone");
}
function textoVigente(item, link) {
$(".compilacao .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected")
$(".desativado").addClass("displaynone");
$(".link_alterador").removeClass("displaynone");
if (!link)
$(".link_alterador").addClass("displaynone");
}
</script>
<div class="compilacao">
{% for key, values in view.get_vigencias.items %}
{% if forloop.first %}
<section class="vigencias">
<nav class="top-bar" data-topbar="" role="navigation">
<section class="top-bar-section">
<ul class="nav left">
{%endif%}
<li class="nav__item has-dropdown">
{% if forloop.first %}
{% for dispositivo in values %}
<a class="nav__link {% if view.inicio_vigencia == dispositivo.inicio_vigencia %}selected{%endif%}" href="{%url 'vigencia' dispositivo.norma.pk dispositivo|get_sign_vigencia %}" title="{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}">{% trans 'Norma Original'%}</a>
{% endfor %}
{% elif forloop.last %}
{% for dispositivo in values %}
<a class="nav__link {% if view.inicio_vigencia == None %}selected{%endif%}" href="{%url 'compilacao' dispositivo.norma.pk %}" title="{% trans 'Compilação atual'%}.&#013;{% trans 'Vigência a partir de'%} {{dispositivo.inicio_vigencia}}&#013;{{dispositivo.norma_publicada}}">{% trans 'Norma Atual'%}</a>
{% endfor %}
{% else %}
<a class="nav__link {% if view.inicio_vigencia.year == key %}selected{%endif%}">{{ key }}</a>
{%endif%}
{% if not forloop.first and not forloop.last %}
<ul class="nav__sub-nav dropdown">
{% for dispositivo in values %}
<li class="nav__sub-item">
{% if not forloop.parentloop.first %}
<a class="nav__sub-link" href="{%url 'vigencia' dispositivo.norma.pk dispositivo|get_sign_vigencia %}" title="{{ dispositivo.norma_publicada }}">{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}</a>
{%endif%}
</li>
{% endfor %}
</ul>
{%endif%}
</li>
{% if forloop.last %}
</ul>
<ul class="nav left tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this);">{% trans 'Texto Multivigente'%}</a></li>
<li><a onclick="textoVigente(this, true);">{% trans 'Texto Vigente COM Links para Normas Alteradoras'%}</a></li>
<li><a onclick="textoVigente(this, false);">{% trans 'Texto Vigente SEM Links para Normas Alteradoras'%}</a></li>
</ul>
</section>
</nav>
</section>
{%endif%}
{% endfor %}
<br>
{% if view.inicio_vigencia != None and view.fim_vigencia != None %}
{% trans 'Vigência entre'%} <b>{{view.inicio_vigencia}}</b> {% trans 'e'%} <b>{{view.fim_vigencia}}</b>.
{%endif%}
{% include 'compilacao/template_render_bloco.html'%}
</div>
{% endblock base_content %}

35
templates/compilacao/template_render_bloco.html

@ -0,0 +1,35 @@
{% load i18n %}
{% load compilacao_filters %}
{% for dispositivo in view.get_queryset %}
{% if dispositivo.nivel == view.flag_nivel_old %}
</div>
{% elif dispositivo.nivel < view.flag_nivel_old %}
{% close_div view.flag_nivel_old dispositivo.nivel %}
{% endif%}
<div class="dispositivo" id="d{{dispositivo.id}}">
<div class="{% dispositivo_desativado dispositivo view.inicio_vigencia view.fim_vigencia %} {{ dispositivo.tipo_dispositivo.class_css }}" id="id{{dispositivo.id}}">
{% spaceless %}
{{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }}
<a name="{{dispositivo.pk}}">{{ dispositivo.rotulo }}</a>
{{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }}
{{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }}
{{ dispositivo.texto|safe }}
{% if dispositivo.norma_publicada_id != None %}
<a class="link_alterador" href="{%url 'compilacao' dispositivo.norma_publicada.pk %}#{{dispositivo.dispositivo_atualizador_id}}">
{{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica dispositivo %}
{{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif %}
{% endspaceless %}
{% if view.is_norma_alteradora and dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%}
{%with node=dispositivo template_name='compilacao/bloco_alteracao.html' %}
{%include template_name%}
{%endwith%}
{% endif%}
</div>
{% set_nivel_old view dispositivo.nivel %}
{% endfor %}
{% close_div view.flag_nivel_old view.flag_nivel_ini %}

9
templates/norma/normajuridica_detail.html

@ -0,0 +1,9 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% block sections_nav %}
<dl class="sub-nav left">
<dd><a href="{% url 'normajuridica:detail' object.pk %}" class="button secondary">{% trans 'Início' %}</a></dd>
<dd><a href="{% url 'compilacao' object.pk %}" class="button secondary">{% trans 'Texto Integral' %}</a></dd>
</dl>
{% endblock sections_nav %}

2
templates/sessao/materia_ordemdia_list.html

@ -34,5 +34,5 @@ Matérias da Ordem do Dia
<button>Reordenar Matérias na Ordem do Dia</button> <button>Reordenar Matérias na Ordem do Dia</button>
<button>Atualizar</button> <button>Atualizar</button>
--> -->
{% endblock detail_content %} {% endblock detail_content %}
Loading…
Cancel
Save