From 9e13e8d310bc104d0c7583fb43589fdcd82936d0 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 14 Sep 2016 15:41:22 -0300 Subject: [PATCH] =?UTF-8?q?Redir=20Sel=20de=20Disp=20Alterados=20dentro=20?= =?UTF-8?q?do=20hist=C3=B3rico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Redireciona Seleção de Dispositivos a ser alterado para o intervalo vazio de Dispositivos alerados cujo intervalo de datas de inicio de vigência relativo esteja o bloco de alteração. --- sapl/compilacao/forms.py | 21 +++++- sapl/compilacao/models.py | 10 +++ .../templatetags/compilacao_filters.py | 2 +- sapl/compilacao/views.py | 73 ++++++++++++------- sapl/static/styles/compilacao.scss | 6 +- .../dispositivo_form_search_fragment.html | 6 +- .../layout/dispositivo_checkbox.html | 2 +- .../compilacao/layout/dispositivo_radio.html | 2 +- .../templates/compilacao/text_edit_bloco.html | 4 +- .../compilacao/text_notificacoes.html | 2 +- 10 files changed, 92 insertions(+), 36 deletions(-) diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py index 3cc1970d6..88e847690 100644 --- a/sapl/compilacao/forms.py +++ b/sapl/compilacao/forms.py @@ -1125,6 +1125,19 @@ class DispositivoEdicaoAlteracaoForm(ModelForm): 'Dispositivo sem haver um ' 'Dispositivo Alterador.')) + """if dst.inicio_vigencia > self.instance.inicio_vigencia: + raise ValidationError(_('Não é permitido substituir um ' + 'Dispositivo que sua data de início ' + 'de vigência é superior a do dispositivo ' + 'em edição.')) + + if dsq.inicio_vigencia <= self.instance.fim_vigencia: + raise ValidationError(_('Não é permitido possuir um Dispositivo ' + 'Subsequente que sua data de início ' + 'de vigência seja inferior a data de fim ' + 'de vigência do dispositivo em edição.')) + """ + def save(self): data = self.cleaned_data @@ -1135,17 +1148,23 @@ class DispositivoEdicaoAlteracaoForm(ModelForm): ndsq = data['dispositivo_subsequente'] nda = data['dispositivo_atualizador'] + # Se o dispositivo substituído foi trocado na edição if ndst != od.dispositivo_substituido: + # Se existia uma substituído, limpar seu subsequente e suas datas + # de fim de vigencia e eficacia if od.dispositivo_substituido: odst = od.dispositivo_substituido - odst.dispositivo_subsequente = None odst.fim_vigencia = None odst.fim_eficacia = None odst.save() + # se foi selecionado um dispositivo para ser substituído + # self.instance é seu subsequente if ndst: + # e se esse novo substituido possuia um outro sequente if ndst.dispositivo_subsequente: + # o substituido desse subsequente não é mais ndst ndst.dispositivo_subsequente.dispositivo_substituido = None ndst.dispositivo_subsequente.save() diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index cd493b040..11b135e82 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -1149,6 +1149,16 @@ class Dispositivo(BaseModel, TimestampedMixin): dp = dp.dispositivo_pai return dp + def history(self): + primeiro = self + while primeiro.dispositivo_substituido: + primeiro = primeiro.dispositivo_substituido + + yield primeiro + while primeiro.dispositivo_subsequente: + primeiro = primeiro.dispositivo_subsequente + yield primeiro + @staticmethod def new_instance_based_on(dispositivo_base, tipo_base): dp = Dispositivo() diff --git a/sapl/compilacao/templatetags/compilacao_filters.py b/sapl/compilacao/templatetags/compilacao_filters.py index 4846e71be..2d4d512fd 100644 --- a/sapl/compilacao/templatetags/compilacao_filters.py +++ b/sapl/compilacao/templatetags/compilacao_filters.py @@ -212,7 +212,7 @@ def heranca(request, d, ignore_ultimo=0, ignore_primeiro=0): ta_id = str(d.ta_id) d_pk = str(d.pk) if ta_id not in ta_dpts_parents or d_pk not in ta_dpts_parents[ta_id]: - print('recarregando estrutura temporaria de heranças') + #print('recarregando estrutura temporaria de heranças') dpts_parents = {} ta_dpts_parents[ta_id] = dpts_parents update_dispositivos_parents(dpts_parents, ta_id) diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 46cb7600e..c1642d96b 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -2077,6 +2077,26 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, perfil_pk = self.request.session['perfil_estrutural'] data = {} + data.update({'pk': bloco_alteracao.pk, + 'pai': [bloco_alteracao.pk, ]}) + + history = list(dispositivo_a_alterar.history()) + history.reverse() + + for d in history: + if d.inicio_vigencia < bloco_alteracao.inicio_vigencia: + dispositivo_a_alterar = d + break + + if (dispositivo_a_alterar.inicio_vigencia > + bloco_alteracao.inicio_vigencia): + self.set_message( + data, 'danger', + _('Não é possível alterar um Dispositivo com início de ' + 'Vigência posterior a data de Vigência do Dispositivo ' + 'Alterador!'), time=10000) + return data + ndp = Dispositivo.new_instance_based_on( dispositivo_a_alterar, dispositivo_a_alterar.tipo_dispositivo) @@ -2093,35 +2113,37 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, ndp.inicio_vigencia = bloco_alteracao.inicio_vigencia try: - with transaction.atomic(): - ordem = dispositivo_a_alterar.criar_espaco( - espaco_a_criar=1, local='json_add_in') + 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 + ndp.ordem = ordem + ndp.dispositivo_atualizador = bloco_alteracao + ndp.ta_publicado = bloco_alteracao.ta - p = dispositivo_a_alterar - n = dispositivo_a_alterar.dispositivo_subsequente + p = dispositivo_a_alterar + n = dispositivo_a_alterar.dispositivo_subsequente - ndp.dispositivo_substituido = p - ndp.dispositivo_subsequente = n + 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: + ndp.fim_eficacia = n.inicio_eficacia - \ + timedelta(days=1) + ndp.fim_vigencia = n.inicio_vigencia - \ + timedelta(days=1) + ndp.save() - if n: - n.dispositivo_substituido = ndp - n.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: + # a ordem desse objeto foi alterada pela função criar_espaco + # deve ser recarregado para atualização + n.refresh_from_db() + n.dispositivo_substituido = ndp + n.save() filhos_diretos = dispositivo_a_alterar.dispositivos_filhos_set for d in filhos_diretos.all(): @@ -3020,7 +3042,8 @@ class TextNotificacoesView(CompMixin, ListView, FormView): _('Dispositivo está substituindo um Dispositivo que não ' 'possui este como seu Dispositivo Subsequente.')) - padd(r, type_notificacao, + padd(r, + type_notificacao, 'sapl.compilacao:dispositivo_edit_alteracao', r.dispositivo_subsequente and r.dispositivo_subsequente.dispositivo_substituido != r, diff --git a/sapl/static/styles/compilacao.scss b/sapl/static/styles/compilacao.scss index 970444b9b..792a21bd9 100644 --- a/sapl/static/styles/compilacao.scss +++ b/sapl/static/styles/compilacao.scss @@ -396,7 +396,7 @@ a:link:after, a:visited:after { & > a { color: #444444; &.nota-alteracao { - color: #2980B9; + color: #02baf2; font-size: 0.75em; &:hover { text-decoration: underline; @@ -519,6 +519,10 @@ a:link:after, a:visited:after { table, table td { border: 1px dotted #ccc; } + + a.nota-alteracao * { + color: #02baf2 !important; + } } .dpt { display: block; diff --git a/sapl/templates/compilacao/dispositivo_form_search_fragment.html b/sapl/templates/compilacao/dispositivo_form_search_fragment.html index 4d5191773..a66b59245 100644 --- a/sapl/templates/compilacao/dispositivo_form_search_fragment.html +++ b/sapl/templates/compilacao/dispositivo_form_search_fragment.html @@ -40,7 +40,7 @@ {{ dpt.dispositivo_pai.tipo_dispositivo.rotulo_sufixo_html|safe }} {{ dpt.dispositivo_pai.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.dispositivo_pai.texto %}{{ dpt.dispositivo_pai.texto|safe }}{%else%}{%if not dpt.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao %} {% endif %}{% endif %} {% if dpt.dispositivo_pai.ta_publicado_id %} - + {{ dpt.dispositivo_pai.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt.dispositivo_pai ta_pub_list %} {{ dpt.dispositivo_pai.tipo_dispositivo.nota_automatica_sufixo_html|safe }} @@ -72,7 +72,7 @@ pks="{{dpt.dispositivo_substituido_id|default:''}}" pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% endif %}{% endif %} {% if dpt.ta_publicado_id %} - + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt ta_pub_list %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} @@ -108,7 +108,7 @@ {{ df.tipo_dispositivo.rotulo_sufixo_html|safe }} {{ df.tipo_dispositivo.texto_prefixo_html|safe }}{%if df.texto %}{{ df.texto|safe }}{%else%}{%if not df.tipo_dispositivo.dispositivo_de_articulacao %} {% endif %}{% endif %} {% if df.ta_publicado_id %} - + {{ df.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica df ta_pub_list %} {{ df.tipo_dispositivo.nota_automatica_sufixo_html|safe }} diff --git a/sapl/templates/compilacao/layout/dispositivo_checkbox.html b/sapl/templates/compilacao/layout/dispositivo_checkbox.html index dc08ddff9..3ae16e169 100644 --- a/sapl/templates/compilacao/layout/dispositivo_checkbox.html +++ b/sapl/templates/compilacao/layout/dispositivo_checkbox.html @@ -34,7 +34,7 @@ {{ choice.1.tipo_dispositivo.rotulo_sufixo_html|safe }} {{ choice.1.tipo_dispositivo.texto_prefixo_html|safe }}{%if choice.1.texto %}{{ choice.1.texto|safe }}{%else%}{%if not choice.1.tipo_dispositivo.dispositivo_de_articulacao %} {% endif %}{% endif %} {% if choice.1.ta_publicado_id and not choice.1.tipo_dispositivo.dispositivo_de_articulacao %} - + {{ choice.1.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica choice.1 ta_pub_list %} {{ choice.1.tipo_dispositivo.nota_automatica_sufixo_html|safe }} diff --git a/sapl/templates/compilacao/layout/dispositivo_radio.html b/sapl/templates/compilacao/layout/dispositivo_radio.html index 1e0a8d430..a189ca03a 100644 --- a/sapl/templates/compilacao/layout/dispositivo_radio.html +++ b/sapl/templates/compilacao/layout/dispositivo_radio.html @@ -30,7 +30,7 @@ pks="{{dpt.dispositivo_substituido_id|default:''}}" pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% endif %}{% endif %} {% if dpt.ta_publicado_id and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt ta_pub_list %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} diff --git a/sapl/templates/compilacao/text_edit_bloco.html b/sapl/templates/compilacao/text_edit_bloco.html index ff272e0d5..d055ed447 100644 --- a/sapl/templates/compilacao/text_edit_bloco.html +++ b/sapl/templates/compilacao/text_edit_bloco.html @@ -99,7 +99,7 @@ {% endif %} <<<<<<< d5a8cdb5d563a8353942e0dc3c3b2484bd636ea6:templates/compilacao/text_edit_bloco.html {% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt ta_pub_list %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} @@ -113,7 +113,7 @@
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%}
{% endif %} {% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} -
+ {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt ta_pub_list %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} diff --git a/sapl/templates/compilacao/text_notificacoes.html b/sapl/templates/compilacao/text_notificacoes.html index 501f70244..c2e880ba6 100644 --- a/sapl/templates/compilacao/text_notificacoes.html +++ b/sapl/templates/compilacao/text_notificacoes.html @@ -32,7 +32,7 @@ pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% endif %}{% endif %} {%if dpt.ta_publicado_id %} - + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt None %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}