diff --git a/.gitignore b/.gitignore index 0740715ca..b30c9723f 100644 --- a/.gitignore +++ b/.gitignore @@ -82,6 +82,9 @@ target/ .vagrant *.sublime-project *.sublime-workspace +.ipynb_checkpoints/ +*.ipynb + # specific to this project collected_static diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py index c4e4dce43..3cc1970d6 100644 --- a/sapl/compilacao/forms.py +++ b/sapl/compilacao/forms.py @@ -636,27 +636,26 @@ class DispositivoEdicaoBasicaForm(ModelForm): btns_excluir = [] - if not inst.is_relative_auto_insert(): - btns_excluir = [ - HTML('%s' % (_('Excluir apenas este dispositivo.'), - inst.pk, - _('Excluir Dispositivo')))] - - if inst.dispositivos_filhos_set.exists(): - btns_excluir.append( - HTML( - '%s' % (_('Excluir este dispositivo ' - 'e toda sua estrutura.'), - inst.pk, - _('Excluir Bloco de Dispositivo.')))) + btns_excluir = [ + HTML('%s' % (_('Excluir apenas este dispositivo.'), + inst.pk, + _('Excluir Dispositivo')))] + + if inst.dispositivos_filhos_set.exists(): + btns_excluir.append( + HTML( + '%s' % (_('Excluir este dispositivo ' + 'e toda sua estrutura.'), + inst.pk, + _('Excluir Bloco de Dispositivo.')))) if btns_excluir: css_class = 'btn-group pull-right btns-excluir' @@ -856,7 +855,7 @@ class DispositivoEdicaoVigenciaForm(ModelForm): def clean_dispositivo_vigencia(self): dv = self.cleaned_data['dispositivo_vigencia'] - if dv and dv.is_relative_auto_insert(): + if dv and dv.auto_inserido: dv = dv.dispositivo_pai return dv @@ -871,7 +870,7 @@ class DispositivoEdicaoVigenciaForm(ModelForm): if extensao: dv = data['dispositivo_vigencia'] - if dv and dv.is_relative_auto_insert(): + if dv and dv.auto_inserido: dv = dv.dispositivo_pai dv_pk = dv.pk if dv else None diff --git a/sapl/compilacao/migrations/0051_dispositivo_auto_inserido.py b/sapl/compilacao/migrations/0051_dispositivo_auto_inserido.py new file mode 100644 index 000000000..9b75fabf5 --- /dev/null +++ b/sapl/compilacao/migrations/0051_dispositivo_auto_inserido.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-12 16:24 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0050_auto_20160503_0926'), + ] + + operations = [ + migrations.AddField( + model_name='dispositivo', + name='auto_inserido', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Auto Inserido'), + ), + ] diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index 129e88d44..cd493b040 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -578,7 +578,10 @@ class Dispositivo(BaseModel, TimestampedMixin): default=False, choices=YES_NO_CHOICES, verbose_name=_('Declarado Inconstitucional')) - # Relevant attribute only in altering norms + auto_inserido = models.BooleanField( + default=False, + choices=YES_NO_CHOICES, + verbose_name=_('Auto Inserido')) visibilidade = models.BooleanField( default=False, choices=YES_NO_CHOICES, @@ -1120,7 +1123,8 @@ class Dispositivo(BaseModel, TimestampedMixin): ta_id=self.ta_id) return niveis_zero - def is_relative_auto_insert(self, perfil_pk=None): + # metodo obsoleto, foi acrescentado o campo auto_inserido no modelo + def is_relative_auto_insert__obsoleto(self, perfil_pk=None): if self.dispositivo_pai is not None: # pp possiveis_pais diff --git a/sapl/compilacao/templatetags/compilacao_filters.py b/sapl/compilacao/templatetags/compilacao_filters.py index bd45fb475..4846e71be 100644 --- a/sapl/compilacao/templatetags/compilacao_filters.py +++ b/sapl/compilacao/templatetags/compilacao_filters.py @@ -126,11 +126,6 @@ def select_provaveis_inserts(view, request): return view.select_provaveis_inserts(request) -@register.filter -def is_relative_auto_insert(dpt, request): - return dpt.is_relative_auto_insert(request.session['perfil_estrutural']) - - @register.filter def isinst(value, class_str): classe = value.__class__.__name__ diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 847502316..46cb7600e 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -1041,10 +1041,12 @@ class TextEditView(TemplateView): class ActionsCommonsMixin: - def set_message(self, data, _type, message): + def set_message(self, data, _type, message, time=None): data['message'] = { 'type': _type, 'value': str(message)} + if time: + data['message']['time'] = time return def get_json_for_refresh(self, dp, dpauto=None): @@ -1203,7 +1205,7 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin): p.fim_eficacia = None for d in base.dispositivos_filhos_set.all(): - if d.is_relative_auto_insert(): + if d.auto_inserido: self.remover_dispositivo(d, bloco) elif not bloco: p.dispositivos_filhos_set.add(d) @@ -1226,7 +1228,7 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin): transferir para o caput imediatamente acima visto se tratar de uma exclusão de item?""" d_nivel_old = d.nivel - if d.is_relative_auto_insert(): + if d.auto_inserido: d.delete() continue @@ -1506,7 +1508,7 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): if dp.nivel >= nivel: continue - if dp.is_relative_auto_insert(perfil_pk): + if dp.auto_inserido: continue if prox_possivel and \ @@ -1605,7 +1607,7 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): if paradentro and not td.permitido_inserir_in( tipb, - include_relative_autos=False, + include_relative_autos=True, perfil_pk=perfil_pk): continue @@ -1617,7 +1619,7 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): for possivelpai in parents: if td.permitido_inserir_in( possivelpai.tipo_dispositivo, - include_relative_autos=False, + include_relative_autos=True, perfil_pk=perfil_pk): flag_insercao = True break @@ -1625,7 +1627,7 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): if not flag_insercao: continue - if possivelpai.is_relative_auto_insert(perfil_pk): + if possivelpai.auto_inserido: continue if prox_possivel: @@ -1694,7 +1696,7 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): # Dispositivo de Vigência do Texto Original e de Dpts Alterados dvt = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id']) - if dvt.is_relative_auto_insert(): + if dvt.auto_inserido: dvt = dvt.dispositivo_pai try: @@ -1823,15 +1825,17 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): if pp.exists() and pp[0].quantidade_permitida >= 0: qtd_existente = Dispositivo.objects.filter( ta_id=dp.ta_id, - tipo_dispositivo_id=dp.tipo_dispositivo_id).count() + tipo_dispositivo_id=dp.tipo_dispositivo_id, + dispositivo_pai=dp.dispositivo_pai).count() if qtd_existente >= pp[0].quantidade_permitida: - return {'pk': base.pk, - 'pai': [base.dispositivo_pai.pk, ], - 'message': str(_('Limite de inserções de ' - 'dispositivos deste tipo ' - 'foi excedido.')) - } + data = {'pk': base.pk, + 'pai': [base.dispositivo_pai.pk, ]} + self.set_message(data, 'warning', + _('Limite de inserções de ' + 'dispositivos deste tipo ' + 'foi excedido.'), time=6000) + return data ordem = base.criar_espaco( espaco_a_criar=1 + count_auto_insert, local=local_add) @@ -1860,6 +1864,7 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): dp.ordem = dp.ordem + Dispositivo.INTERVALO_ORDEM dp.publicacao = pub_last + dp.auto_inserido = True dp.save() dp_auto_insert = dp dp = Dispositivo.objects.get(pk=dp_pk) @@ -2071,74 +2076,69 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, perfil_pk = self.request.session['perfil_estrutural'] - """Se o usuário selecionar um dispositivo de auto inserção, - como um caput, por exemplo, a alteração é - migrada para o pai imediato""" - if dispositivo_a_alterar.is_relative_auto_insert(perfil_pk=perfil_pk): - dispositivo_a_alterar = dispositivo_a_alterar.dispositivo_pai + data = {} + ndp = Dispositivo.new_instance_based_on( + dispositivo_a_alterar, dispositivo_a_alterar.tipo_dispositivo) - if dispositivo_a_alterar.tipo_dispositivo.dispositivo_de_articulacao: - pass + ndp.rotulo = dispositivo_a_alterar.rotulo + ndp.texto = dispositivo_a_alterar.texto + ndp.publicacao = bloco_alteracao.publicacao + ndp.dispositivo_vigencia = bloco_alteracao.dispositivo_vigencia + if ndp.dispositivo_vigencia: + ndp.inicio_eficacia = ndp.dispositivo_vigencia.inicio_eficacia + ndp.inicio_vigencia = ndp.dispositivo_vigencia.inicio_vigencia else: - ndp = Dispositivo.new_instance_based_on( - dispositivo_a_alterar, dispositivo_a_alterar.tipo_dispositivo) + ndp.inicio_eficacia = bloco_alteracao.inicio_eficacia + ndp.inicio_vigencia = bloco_alteracao.inicio_vigencia - ndp.rotulo = dispositivo_a_alterar.rotulo - ndp.texto = dispositivo_a_alterar.texto - ndp.publicacao = bloco_alteracao.publicacao + try: + with transaction.atomic(): + ordem = dispositivo_a_alterar.criar_espaco( + espaco_a_criar=1, local='json_add_in') - ndp.dispositivo_vigencia = bloco_alteracao.dispositivo_vigencia - if ndp.dispositivo_vigencia: - ndp.inicio_eficacia = ndp.dispositivo_vigencia.inicio_eficacia - ndp.inicio_vigencia = ndp.dispositivo_vigencia.inicio_vigencia - else: - ndp.inicio_eficacia = bloco_alteracao.inicio_eficacia - ndp.inicio_vigencia = bloco_alteracao.inicio_vigencia + ndp.ordem = ordem + ndp.dispositivo_atualizador = bloco_alteracao + ndp.ta_publicado = bloco_alteracao.ta - try: - with transaction.atomic(): - ordem = dispositivo_a_alterar.criar_espaco( - espaco_a_criar=1, local='json_add_in') - - ndp.ordem = ordem - ndp.dispositivo_atualizador = bloco_alteracao - ndp.ta_publicado = bloco_alteracao.ta - - p = dispositivo_a_alterar - n = dispositivo_a_alterar.dispositivo_subsequente - - ndp.dispositivo_substituido = p - ndp.dispositivo_subsequente = n - - if n: - ndp.fim_eficacia = n.inicio_eficacia - \ - timedelta(days=1) - ndp.fim_vigencia = n.inicio_vigencia - \ - timedelta(days=1) - ndp.save() - - p.dispositivo_subsequente = ndp - p.fim_eficacia = ndp.inicio_eficacia - timedelta(days=1) - p.fim_vigencia = ndp.inicio_vigencia - timedelta(days=1) - p.save() - - if n: - n.dispositivo_substituido = ndp - n.save() - - filhos_diretos = dispositivo_a_alterar.dispositivos_filhos_set - for d in filhos_diretos.all(): - d.dispositivo_pai = ndp - d.save() + p = dispositivo_a_alterar + n = dispositivo_a_alterar.dispositivo_subsequente - except Exception as e: - print(e) + ndp.dispositivo_substituido = p + ndp.dispositivo_subsequente = n + + if n: + ndp.fim_eficacia = n.inicio_eficacia - \ + timedelta(days=1) + ndp.fim_vigencia = n.inicio_vigencia - \ + timedelta(days=1) + ndp.save() + + p.dispositivo_subsequente = ndp + p.fim_eficacia = ndp.inicio_eficacia - timedelta(days=1) + p.fim_vigencia = ndp.inicio_vigencia - timedelta(days=1) + p.save() - data = {'pk': ndp.pk, - 'pai': [bloco_alteracao.pk, ]} + if n: + n.dispositivo_substituido = ndp + n.save() - return data + filhos_diretos = dispositivo_a_alterar.dispositivos_filhos_set + for d in filhos_diretos.all(): + d.dispositivo_pai = ndp + d.save() + + self.set_message( + data, 'success', + _('Dispositivo de Alteração adicionado com sucesso.')) + + except Exception as e: + print(e) + + data.update({'pk': ndp.pk, + 'pai': [bloco_alteracao.pk, ]}) + + return data class DispositivoDinamicEditView( @@ -2226,9 +2226,6 @@ class DispositivoDinamicEditView( data = self.registra_alteracao(d, dispositivo_a_alterar) - self.set_message( - data, 'success', - _('Dispositivo de Alteração adicionado com sucesso.')) elif formtype == 'get_form_base': texto = request.POST['texto'].strip() texto_atualizador = request.POST['texto_atualizador'].strip() diff --git a/sapl/static/js/compilacao_view.js b/sapl/static/js/compilacao_view.js index b5f70b89c..ffb96dd8b 100644 --- a/sapl/static/js/compilacao_view.js +++ b/sapl/static/js/compilacao_view.js @@ -36,7 +36,7 @@ function textoMultiVigente(item, diff) { $(".dptt.desativado").removeClass("displaynone"); $(".dtxt").removeClass("displaynone"); $(".dtxt.diff").remove(); - $(".link_alterador").removeClass("displaynone"); + $(".nota-alteracao").removeClass("displaynone"); if (diff) { $(".dtxt[id^='da'").each(function() { @@ -126,9 +126,9 @@ function textoVigente(item, link) { $(item).addClass("selected") $(".dptt.desativado").addClass("displaynone"); - $(".link_alterador").removeClass("displaynone"); + $(".nota-alteracao").removeClass("displaynone"); if (!link) - $(".link_alterador").addClass("displaynone"); + $(".nota-alteracao").addClass("displaynone"); if (elv) { try { diff --git a/sapl/static/styles/compilacao.scss b/sapl/static/styles/compilacao.scss index 839fc6677..970444b9b 100644 --- a/sapl/static/styles/compilacao.scss +++ b/sapl/static/styles/compilacao.scss @@ -166,7 +166,7 @@ a:link:after, a:visited:after { .cp { .desativado { - .dtxt, .dtxt * { + .dtxt, .dtxt *, .dpt-link, .dpt-link * { text-decoration: line-through; color: #999 !important; @@ -524,8 +524,8 @@ a:link:after, a:visited:after { display: block; & > .dpt-actions-fixed { position: absolute; - right: -0.25em; - top: 0px; + right: -0.5em; + top: -0.5em; z-index: 3; opacity: 0; @@ -547,10 +547,10 @@ a:link:after, a:visited:after { display: none; } & > .dpt-text { - cursor: pointer; + cursor: text; min-height: 30px; border: 1px solid transparent; - &:hover { + &:hover, &.hover-fixed { background-color: rgba(0, 0, 0, 0.01); color: $color_buttons; border: 1px solid #eee; @@ -568,9 +568,14 @@ a:link:after, a:visited:after { &:hover { & > .dpt-actions-fixed { - opacity: 0.8; + opacity: 1; &:hover { - opacity: 1; + & ~ .dpt-text { + background-color: rgba(0, 0, 0, 0.01); + color: $color_buttons; + border: 1px solid #eee; + transition: color 0.3s ease; + } } } } diff --git a/sapl/templates/compilacao/dispositivo_form_search_fragment.html b/sapl/templates/compilacao/dispositivo_form_search_fragment.html index 721fdddfa..4d5191773 100644 --- a/sapl/templates/compilacao/dispositivo_form_search_fragment.html +++ b/sapl/templates/compilacao/dispositivo_form_search_fragment.html @@ -24,7 +24,7 @@ {% endif %} {% endifchanged %} - {% if dpt.tipo_dispositivo.dispositivo_de_alteracao or dpt.dispositivo_pai.nivel > 0 and dpt.is_relative_auto_insert and dpt.dispositivo_pai not in object_list %} + {% if dpt.tipo_dispositivo.dispositivo_de_alteracao or dpt.dispositivo_pai.nivel > 0 and dpt.auto_inserido and dpt.dispositivo_pai not in object_list %}