From a767cd1545666773e61b58092db39855fe16d537 Mon Sep 17 00:00:00 2001 From: Leandro Roberto da Silva Date: Fri, 3 Aug 2018 14:02:03 -0300 Subject: [PATCH] Fix #2088 (#2106) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Corrige erro na exclusão de dispositivo base inicial * Fix #2088 --- sapl/compilacao/models.py | 9 +++++- sapl/compilacao/views.py | 67 ++++++++++++++++++++++----------------- sapl/rules/apps.py | 4 +-- 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index f677cf97a..6ffb738b1 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -69,8 +69,15 @@ class BaseModel(models.Model): def save(self, force_insert=False, force_update=False, using=None, update_fields=None, clean=True): - if clean: + # método clean não pode ser chamado no caso do save que está sendo + # executado é o save de revision_pre_delete_signal + import inspect + funcs = list(filter(lambda x: x == 'revision_pre_delete_signal', + map(lambda x: x[3], inspect.stack()))) + + if clean and not funcs: self.clean() + return models.Model.save( self, force_insert=force_insert, diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index a68c456a1..0efa36be0 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -15,7 +15,7 @@ from django.db import connection, transaction from django.db.models import Q from django.db.utils import IntegrityError from django.http.response import (HttpResponse, HttpResponseRedirect, - JsonResponse) + JsonResponse, Http404) from django.shortcuts import get_object_or_404, redirect from django.utils.dateparse import parse_date from django.utils.encoding import force_text @@ -51,7 +51,6 @@ from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED, from sapl.crud.base import Crud, CrudAux, CrudListView, make_pagination from sapl.settings import BASE_DIR - TipoNotaCrud = CrudAux.build(TipoNota, 'tipo_nota') TipoVideCrud = CrudAux.build(TipoVide, 'tipo_vide') TipoPublicacaoCrud = CrudAux.build(TipoPublicacao, 'tipo_publicacao') @@ -104,7 +103,7 @@ class IntegracaoTaView(TemplateView): ) % self.model._meta.verbose_name_plural) return redirect('/') - def get(self, request, *args, **kwargs): + def get(self, request, *args, **kwargs): try: if settings.DEBUG or not TipoDispositivo.objects.exists(): @@ -211,8 +210,12 @@ class CompMixin(PermissionRequiredMixin): @property def ta(self): - ta = TextoArticulado.objects.get( - pk=self.kwargs.get('ta_id', self.kwargs.get('pk', 0))) + try: + ta = TextoArticulado.objects.get( + pk=self.kwargs.get('ta_id', self.kwargs.get('pk', 0))) + except TextoArticulado.DoesNotExist: + raise Http404() + return ta def get_context_data(self, **kwargs): @@ -1237,9 +1240,9 @@ class TextEditView(CompMixin, TemplateView): 'filhos': [], 'alts': [], 'pai': None, - 'st': None, # dispositivo substituido - 'sq': None, # dispositivo subsequente - 'da': None, # dispositivo atualizador + 'st': None, # dispositivo substituido + 'sq': None, # dispositivo subsequente + 'da': None, # dispositivo atualizador 'td': tds[d.tipo_dispositivo_id], # tipo do dispositivo 'na': self.nota_alteracao(d, lista_ta_publicado)\ if d.ta_id == ta_id else None @@ -1480,30 +1483,36 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin): ).first() data = {} - if base_anterior: - data = self.get_json_for_refresh(base_anterior) - else: + if not base_anterior or base == base.get_raiz(): base_anterior = base.get_nivel_zero_anterior() - data = self.get_json_for_refresh(base_anterior) - - data['pai'] = [base.get_raiz().pk] + if not base_anterior: + base_anterior = base + data = self.get_json_for_refresh(base_anterior) + + if base == base_anterior: + data['pk'] = base.pk + self.set_message(data, 'danger', _( + 'Base Inicial não pode ser removida!'), modal=True) + else: + if base != base.get_raiz(): + data['pai'] = [base.get_raiz().pk] - if ta_base.id != int(self.kwargs['ta_id']): - data['pai'] = [base.dispositivo_atualizador.pk] - data['pk'] = base.dispositivo_atualizador.pk + if ta_base.id != int(self.kwargs['ta_id']): + data['pai'] = [base.dispositivo_atualizador.pk] + data['pk'] = base.dispositivo_atualizador.pk - try: - with transaction.atomic(): - message = str(self.remover_dispositivo(base, bloco)) - if message: - self.set_message(data, 'warning', message, modal=True) - else: - self.set_message(data, 'success', _( - 'Exclusão efetuada com sucesso!'), modal=True) - ta_base.reagrupar_ordem_de_dispositivos() - except Exception as e: - data['pk'] = self.kwargs['dispositivo_id'] - self.set_message(data, 'danger', str(e), modal=True) + try: + with transaction.atomic(): + message = str(self.remover_dispositivo(base, bloco)) + if message: + self.set_message(data, 'warning', message, modal=True) + else: + self.set_message(data, 'success', _( + 'Exclusão efetuada com sucesso!'), modal=True) + ta_base.reagrupar_ordem_de_dispositivos() + except Exception as e: + data['pk'] = self.kwargs['dispositivo_id'] + self.set_message(data, 'danger', str(e), modal=True) return data diff --git a/sapl/rules/apps.py b/sapl/rules/apps.py index 606190110..dbdfce8ce 100644 --- a/sapl/rules/apps.py +++ b/sapl/rules/apps.py @@ -1,15 +1,15 @@ from builtins import LookupError import django -import reversion from django.apps import apps from django.contrib.auth import get_user_model from django.contrib.auth.management import _get_all_permissions from django.core import exceptions from django.db import models, router from django.db.utils import DEFAULT_DB_ALIAS -from django.utils.translation import ugettext_lazy as _ from django.utils.translation import string_concat +from django.utils.translation import ugettext_lazy as _ +import reversion from sapl.rules import (SAPL_GROUP_ADMINISTRATIVO, SAPL_GROUP_COMISSOES, SAPL_GROUP_GERAL, SAPL_GROUP_MATERIA, SAPL_GROUP_NORMA,