From 3506b8ac970624949ced4f123afba99adda5ddcc Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 11 Nov 2016 13:38:21 -0200 Subject: [PATCH] =?UTF-8?q?implementa=20heran=C3=A7a=20em=20perfis=20de=20?= =?UTF-8?q?Textos=20Articulados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/compilacao_data_tables.sql | 9 ++- ..._perfilestruturaltextoarticulado_parent.py | 21 +++++++ sapl/compilacao/models.py | 58 ++++++++++++------- sapl/materia/forms.py | 4 +- .../migrations/0070_auto_20161111_1301.py | 21 +++++++ sapl/materia/models.py | 2 +- sapl/templates/materia/layouts.yaml | 2 +- 7 files changed, 90 insertions(+), 27 deletions(-) create mode 100644 sapl/compilacao/migrations/0070_perfilestruturaltextoarticulado_parent.py create mode 100644 sapl/materia/migrations/0070_auto_20161111_1301.py diff --git a/sapl/compilacao/compilacao_data_tables.sql b/sapl/compilacao/compilacao_data_tables.sql index d0d815b58..7681eedcd 100644 --- a/sapl/compilacao/compilacao_data_tables.sql +++ b/sapl/compilacao/compilacao_data_tables.sql @@ -1,6 +1,7 @@ -INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (2, 'LC95-v', 'Lei Complementar 95 com Variação', false); INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (1, 'LC95', 'Lei Complementar 95', true); -SELECT pg_catalog.setval('compilacao_perfilestruturaltextoarticulado_id_seq', 2, true); +INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (2, 'LC95-v', 'Lei Complementar 95 com Variação', false); +INSERT INTO compilacao_perfilestruturaltextoarticulado (id, sigla, nome, padrao) VALUES (3, 'PLOL', 'Projeto de Lei Ordinária do Legislativo', false); +SELECT pg_catalog.setval('compilacao_perfilestruturaltextoarticulado_id_seq', 3, true); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true, false); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); @@ -24,7 +25,9 @@ INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (123, 'Alinea', 'alinea', '', '', 0, ')', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (124, 'Item', 'item', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false, false); INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (125, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false); -SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 125, true); + +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (126, 'Justificativa', 'titulo', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false); +SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 126, true); delete from compilacao_tipodispositivorelationship; diff --git a/sapl/compilacao/migrations/0070_perfilestruturaltextoarticulado_parent.py b/sapl/compilacao/migrations/0070_perfilestruturaltextoarticulado_parent.py new file mode 100644 index 000000000..480d9c15c --- /dev/null +++ b/sapl/compilacao/migrations/0070_perfilestruturaltextoarticulado_parent.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-11 13:01 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0069_auto_20161107_1932'), + ] + + operations = [ + migrations.AddField( + model_name='perfilestruturaltextoarticulado', + name='parent', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='perfil_parent_set', to='compilacao.PerfilEstruturalTextoArticulado', verbose_name='Perfil Herdado'), + ), + ] diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index 9e589f65b..80d21c744 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -6,6 +6,7 @@ from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import F, Q from django.db.models.aggregates import Max +from django.db.models.deletion import PROTECT from django.http.response import Http404 from django.template import defaultfilters from django.utils.decorators import classonlymethod @@ -657,39 +658,49 @@ class TipoDispositivo(BaseModel): def permitido_inserir_in( self, pai_relativo, include_relative_autos=True, perfil_pk=None): + perfil = PerfilEstruturalTextoArticulado.objects.all() if not perfil_pk: - perfis = PerfilEstruturalTextoArticulado.objects.filter( - padrao=True)[:1] + perfil = perfil.filter(padrao=True) - if not perfis.exists(): - return False + else: + perfil = perfil.filter(pk=perfil_pk) - perfil_pk = perfis[0].pk + if not perfil.exists(): + return False - pp = self.possiveis_pais.filter(pai=pai_relativo, perfil_id=perfil_pk) - if pp.exists(): - if not include_relative_autos: - if pp[0].filho_de_insercao_automatica: - return False - return True + perfil = perfil[0] + + while perfil: + pp = self.possiveis_pais.filter(pai=pai_relativo, perfil=perfil) + if pp.exists(): + if not include_relative_autos: + if pp[0].filho_de_insercao_automatica: + return False + return True + perfil = perfil.parent return False def permitido_variacao( self, base, perfil_pk=None): + perfil = PerfilEstruturalTextoArticulado.objects.all() if not perfil_pk: - perfis = PerfilEstruturalTextoArticulado.objects.filter( - padrao=True)[:1] + perfil = perfil.filter(padrao=True) - if not perfis.exists(): - return False + else: + perfil = perfil.filter(pk=perfil_pk) - perfil_pk = perfis[0].pk + if not perfil.exists(): + return False - pp = self.possiveis_pais.filter(pai=base, perfil_id=perfil_pk) - if pp.exists(): - if pp[0].permitir_variacao: - return True + perfil = perfil[0] + + while perfil: + pp = self.possiveis_pais.filter(pai=base, perfil=perfil) + if pp.exists(): + if pp[0].permitir_variacao: + return True + perfil = perfil.parent return False @@ -701,6 +712,13 @@ class PerfilEstruturalTextoArticulado(BaseModel): default=False, choices=YES_NO_CHOICES, verbose_name=_('Padrão')) + parent = models.ForeignKey( + 'self', + blank=True, null=True, default=None, + related_name='perfil_parent_set', + on_delete=PROTECT, + verbose_name=_('Perfil Herdado')) + class Meta: verbose_name = _('Perfil Estrutural de Texto Articulado') verbose_name_plural = _('Perfis Estruturais de Textos Articulados') diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index f9f8ad7c1..d1742521a 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -834,7 +834,7 @@ class ProposicaoForm(forms.ModelForm): label=_('Tipo do Texto da Proposição'), required=False, choices=TIPO_TEXTO_CHOICE, - widget=widgets.CheckboxSelectMultiple()) + widget=widgets.RadioSelect()) materia_de_vinculo = forms.ModelChoiceField( queryset=MateriaLegislativa.objects.all(), @@ -885,7 +885,7 @@ class ProposicaoForm(forms.ModelForm): if self.texto_articulado_proposicao: fields.append( - to_column((InlineCheckboxes('tipo_texto'), 5)),) + to_column((InlineRadios('tipo_texto'), 5)),) fields.append(to_column(( 'texto_original', 7 if self.texto_articulado_proposicao else 12))) diff --git a/sapl/materia/migrations/0070_auto_20161111_1301.py b/sapl/materia/migrations/0070_auto_20161111_1301.py new file mode 100644 index 000000000..38a53d9cd --- /dev/null +++ b/sapl/materia/migrations/0070_auto_20161111_1301.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-11-11 13:01 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0069_tipoproposicao_perfis'), + ] + + operations = [ + migrations.AlterField( + model_name='tipoproposicao', + name='perfis', + field=models.ManyToManyField(blank=True, help_text='\n Mesmo que em Configurações da Aplicação nas\n Tabelas Auxiliares esteja definido que Proposições possam\n utilizar Textos Articulados, ao gerar uma proposição,\n a solução de Textos Articulados será disponibilizada se\n o Tipo escolhido para a Proposição estiver associado a ao\n menos um Perfil Estrutural de Texto Articulado.\n ', + to='compilacao.PerfilEstruturalTextoArticulado', verbose_name='Perfis Estruturais de Textos Articulados'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index dccdb66e7..a96b1209b 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -47,7 +47,7 @@ class TipoProposicao(models.Model): Tabelas Auxiliares esteja definido que Proposições possam utilizar Textos Articulados, ao gerar uma proposição, a solução de Textos Articulados será disponibilizada se - o Tipo escolhido para a Proposição estiver associada a ao + o Tipo escolhido para a Proposição estiver associado a ao menos um Perfil Estrutural de Texto Articulado. """)) diff --git a/sapl/templates/materia/layouts.yaml b/sapl/templates/materia/layouts.yaml index d1c5f7911..79edce4ee 100644 --- a/sapl/templates/materia/layouts.yaml +++ b/sapl/templates/materia/layouts.yaml @@ -75,7 +75,7 @@ Relatoria: TipoProposicao: {% trans 'Tipo Proposição' %}: - descricao content_type - - tipo_conteudo_related + - tipo_conteudo_related perfis Proposicao: {% trans 'Proposição' %}: