diff --git a/compilacao/__init__.py b/compilacao/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/admin.py b/compilacao/admin.py new file mode 100644 index 000000000..5c02ebd40 --- /dev/null +++ b/compilacao/admin.py @@ -0,0 +1,3 @@ +from sapl.utils import register_all_models_in_admin + +register_all_models_in_admin(__name__) diff --git a/compilacao/apps.py b/compilacao/apps.py new file mode 100644 index 000000000..8cab3c8fb --- /dev/null +++ b/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') diff --git a/compilacao/forms.py b/compilacao/forms.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/insert_inicial_TipoDispositivo.sql b/compilacao/insert_inicial_TipoDispositivo.sql new file mode 100644 index 000000000..987e0c81f --- /dev/null +++ b/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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', ' – ', '', '', '', '', 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, '-----', '', ' – ', '', '', '', '', 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, '.....', '', ' – ', '', '', '', '', 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, '.....', '', ' – ', '', '', '', '', 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, '.....', '', ' – ', '', '', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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, '-----', '', '
', '', '
', '', '', 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)); \ No newline at end of file diff --git a/compilacao/migrations/0001_initial.py b/compilacao/migrations/0001_initial.py new file mode 100644 index 000000000..d8e06c220 --- /dev/null +++ b/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')]), + ), + ] diff --git a/compilacao/migrations/0002_auto_20150907_2334.py b/compilacao/migrations/0002_auto_20150907_2334.py new file mode 100644 index 000000000..f92031d91 --- /dev/null +++ b/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), + ), + ] diff --git a/compilacao/migrations/0003_auto_20150911_1735.py b/compilacao/migrations/0003_auto_20150911_1735.py new file mode 100644 index 000000000..36cfd09af --- /dev/null +++ b/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), + ), + ] diff --git a/compilacao/migrations/0004_auto_20150914_0842.py b/compilacao/migrations/0004_auto_20150914_0842.py new file mode 100644 index 000000000..991257507 --- /dev/null +++ b/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'), + ), + ] diff --git a/compilacao/migrations/__init__.py b/compilacao/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/models.py b/compilacao/models.py new file mode 100644 index 000000000..7688efcb6 --- /dev/null +++ b/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] + ) diff --git a/compilacao/templatetags/__init__.py b/compilacao/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py new file mode 100644 index 000000000..ce0c223d1 --- /dev/null +++ b/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 '' * (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)) diff --git a/compilacao/urls.py b/compilacao/urls.py new file mode 100644 index 000000000..fede9a117 --- /dev/null +++ b/compilacao/urls.py @@ -0,0 +1,16 @@ +from django.conf.urls import url + +from compilacao import views + +urlpatterns = [ + url(r'^norma/(?P[0-9]+)/compilacao/$', + views.CompilacaoView.as_view(), name='compilacao'), + + + + url(r'^norma/(?P[0-9]+)/compilacao/vigencia/(?P.+)/$', + views.CompilacaoView.as_view(), name='vigencia'), + + url(r'^norma/(?P[0-9]+)/compilacao/(?P[0-9]+)/$', + views.DispositivoView.as_view(), name='dispositivo'), +] diff --git a/compilacao/views.py b/compilacao/views.py new file mode 100644 index 000000000..a063f9535 --- /dev/null +++ b/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 diff --git a/materia/migrations/0005_auto_20150923_0941.py b/materia/migrations/0005_auto_20150923_0941.py new file mode 100644 index 000000000..ae62096ef --- /dev/null +++ b/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')]), + ), + ] diff --git a/norma/migrations/0003_auto_20150906_0239.py b/norma/migrations/0003_auto_20150906_0239.py new file mode 100644 index 000000000..82dafbf88 --- /dev/null +++ b/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'), + ), + ] diff --git a/norma/migrations/0004_auto_20150907_0004.py b/norma/migrations/0004_auto_20150907_0004.py new file mode 100644 index 000000000..961acc32c --- /dev/null +++ b/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')]), + ), + ] diff --git a/norma/migrations/0005_auto_20150915_1141.py b/norma/migrations/0005_auto_20150915_1141.py new file mode 100644 index 000000000..67ed2e0a1 --- /dev/null +++ b/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']}, + ), + ] diff --git a/norma/models.py b/norma/models.py index 153ea948e..a6f24dce7 100644 --- a/norma/models.py +++ b/norma/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ from materia.models import MateriaLegislativa @@ -87,20 +88,32 @@ class NormaJuridica(models.Model): complemento = models.NullBooleanField( blank=True, verbose_name=_('Complementar ?')) # 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) timestamp = models.DateTimeField() class Meta: verbose_name = _('Norma Jurídica') verbose_name_plural = _('Normas Jurídicas') + ordering = ['-data'] def __str__(self): - return _('%(tipo)s nº %(numero)s - %(materia)s - %(ano)s') % { + return _('%(tipo)s nº %(numero)s de %(data)s') % { 'tipo': self.tipo, 'numero': self.numero, - 'materia': self.materia, - 'ano': self.ano} + 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} + + +class AssuntoNormaRelationship(models.Model): + assunto = models.ForeignKey(AssuntoNorma) + norma = models.ForeignKey(NormaJuridica) + + class Meta: + unique_together = ( + ('assunto', 'norma'), + ) class LegislacaoCitada(models.Model): diff --git a/norma/urls.py b/norma/urls.py index 300e80c72..f2900f535 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,8 +1,16 @@ 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 = [ + 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/assunto/', include(assunto_norma_crud.urls)), ] diff --git a/norma/views.py b/norma/views.py index 4c4102e83..24dd52009 100644 --- a/norma/views.py +++ b/norma/views.py @@ -45,6 +45,17 @@ norma_crud = build_crud( [('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( LegislacaoCitada, '', [ diff --git a/sapl/settings.py b/sapl/settings.py index f219be591..2abf2962d 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -43,6 +43,7 @@ INSTALLED_APPS = ( 'base', 'parlamentares', 'comissoes', + 'compilacao', 'sessao', 'materia', 'norma', diff --git a/sapl/urls.py b/sapl/urls.py index 4ebf95179..4be663a14 100644 --- a/sapl/urls.py +++ b/sapl/urls.py @@ -29,6 +29,8 @@ urlpatterns = [ url(r'', include('lexml.urls')), url(r'', include('painel.urls')), + url(r'', include('compilacao.urls')), + # must come at the end # so that base /sistema/ url doesn't capture its children url(r'', include('base.urls')), diff --git a/sapl/utils.py b/sapl/utils.py index 3312fd119..62a96c0e2 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -8,6 +8,7 @@ from django.utils.translation import ugettext_lazy as _ appconfs = [apps.get_app_config(n) for n in [ 'parlamentares', 'comissoes', + 'compilacao', 'materia', 'norma', 'sessao', diff --git a/sessao/views.py b/sessao/views.py index ecf9099c0..2604328c2 100644 --- a/sessao/views.py +++ b/sessao/views.py @@ -416,7 +416,6 @@ class EditMateriaOrdemDiaView(FormMixin, sessao_crud.CrudDetailView): return reverse('sessaoplenaria:materiaordemdia_list', kwargs={'pk': pk}) - class OradorForm(forms.Form): numero_ordem = forms.IntegerField(required=True) parlamentar = forms.CharField(required=False, max_length=20) diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss new file mode 100644 index 000000000..972ebad31 --- /dev/null +++ b/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; +} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index dac37e07c..507f8c602 100644 --- a/templates/base.html +++ b/templates/base.html @@ -19,6 +19,7 @@ + {# Scripts #} {# modernizr must be in head (see http://modernizr.com/docs/#installing) #} diff --git a/templates/compilacao/bloco_alteracao.html b/templates/compilacao/bloco_alteracao.html new file mode 100644 index 000000000..1aae4d260 --- /dev/null +++ b/templates/compilacao/bloco_alteracao.html @@ -0,0 +1,10 @@ +{% load compilacao_filters %} +{% for ch in dispositivo.pk|get_bloco %} +{% spaceless %} +
+
+ {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} +
+
+{% endspaceless %} +{% endfor %} \ No newline at end of file diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html new file mode 100644 index 000000000..3e7c099a9 --- /dev/null +++ b/templates/compilacao/index.html @@ -0,0 +1,101 @@ +{% extends "base.html" %} +{% load i18n %} +{% load compilacao_filters %} + +{% block title%} +

{{ view.get_norma }}

+{% endblock %} + +{% block base_content %} + + + +
+ {% for key, values in view.get_vigencias.items %} + {% if forloop.first %} +
+ +
+ {%endif%} + {% endfor %} +
+{% if view.inicio_vigencia != None and view.fim_vigencia != None %} + {% trans 'Vigência entre'%} {{view.inicio_vigencia}} {% trans 'e'%} {{view.fim_vigencia}}. +{%endif%} + + +{% include 'compilacao/template_render_bloco.html'%} +
+{% endblock base_content %} \ No newline at end of file diff --git a/templates/compilacao/template_render_bloco.html b/templates/compilacao/template_render_bloco.html new file mode 100644 index 000000000..accf8086b --- /dev/null +++ b/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 %} + + {% elif dispositivo.nivel < view.flag_nivel_old %} + {% close_div view.flag_nivel_old dispositivo.nivel %} + {% endif%} +
+
+{% spaceless %} + {{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }} + {{ dispositivo.rotulo }} + {{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }} + {{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }} + {{ dispositivo.texto|safe }} + + {% if dispositivo.norma_publicada_id != None %} + + {{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }} + {% nota_automatica dispositivo %} + {{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }} + + {% 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%} +
+ {% set_nivel_old view dispositivo.nivel %} +{% endfor %} +{% close_div view.flag_nivel_old view.flag_nivel_ini %} \ No newline at end of file diff --git a/templates/norma/normajuridica_detail.html b/templates/norma/normajuridica_detail.html new file mode 100644 index 000000000..360bfc43f --- /dev/null +++ b/templates/norma/normajuridica_detail.html @@ -0,0 +1,9 @@ +{% extends "crud/detail.html" %} +{% load i18n %} + +{% block sections_nav %} + +{% endblock sections_nav %} diff --git a/templates/sessao/materia_ordemdia_list.html b/templates/sessao/materia_ordemdia_list.html index f794037fa..3998a9d44 100644 --- a/templates/sessao/materia_ordemdia_list.html +++ b/templates/sessao/materia_ordemdia_list.html @@ -34,5 +34,5 @@ Matérias da Ordem do Dia --> - + {% endblock detail_content %} \ No newline at end of file