diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index d925c2cc8..ec420c135 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -1,5 +1,4 @@ -import reversion from django.contrib import messages from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType @@ -13,6 +12,8 @@ from django.utils import timezone from django.utils.decorators import classonlymethod from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +import reversion + from sapl.compilacao.utils import (get_integrations_view_names, int_to_letter, int_to_roman) from sapl.utils import YES_NO_CHOICES, get_settings_auth_user_model @@ -103,6 +104,14 @@ class PerfilEstruturalTextoArticulado(BaseModel): def __str__(self): return self.nome + @property + def parents(self): + if not self.parent: + return [] + + parents = self.parent.parents + [self.parent, ] + return parents + @reversion.register() class TipoTextoArticulado(models.Model): diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 73a9994a9..523de19a2 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -1,7 +1,7 @@ -import logging -import sys from collections import OrderedDict from datetime import timedelta +import logging +import sys from braces.views import FormMessagesMixin from django import forms @@ -19,13 +19,14 @@ from django.http.response import (HttpResponse, HttpResponseRedirect, from django.shortcuts import get_object_or_404, redirect from django.utils.dateparse import parse_date from django.utils.encoding import force_text -from django.utils.translation import ugettext_lazy as _ from django.utils.translation import string_concat +from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView from django.views.generic.detail import DetailView from django.views.generic.edit import (CreateView, DeleteView, FormView, UpdateView) from django.views.generic.list import ListView + from sapl.compilacao.forms import (DispositivoDefinidorVigenciaForm, DispositivoEdicaoAlteracaoForm, DispositivoEdicaoBasicaForm, @@ -49,6 +50,7 @@ from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED, from sapl.crud.base import Crud, CrudListView, make_pagination from sapl.settings import BASE_DIR + TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota') TipoVideCrud = Crud.build(TipoVide, 'tipo_vide') TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao') @@ -2187,12 +2189,18 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): else: raise Exception('Não existe perfil padrão!') + perfil_parents = PerfilEstruturalTextoArticulado.objects.get( + pk=context['perfil_pk']) + perfil_parents = perfil_parents.parents + [perfil_parents, ] + perfil_parents.reverse() + dp_irmao = None dp_pai = None for dp in parents: if dp.tipo_dispositivo == tipo: dp_irmao = dp break + if tipo.permitido_inserir_in( dp.tipo_dispositivo, perfil_pk=context['perfil_pk']): @@ -2230,24 +2238,25 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): # verificar se existe restrição de quantidade de itens if dp.dispositivo_pai: - pp = dp.tipo_dispositivo.possiveis_pais.filter( - pai_id=dp.dispositivo_pai.tipo_dispositivo_id, - perfil_id=context['perfil_pk']) + for perfil in perfil_parents: + pp = dp.tipo_dispositivo.possiveis_pais.filter( + pai_id=dp.dispositivo_pai.tipo_dispositivo_id, + perfil=perfil) - 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, - dispositivo_pai=dp.dispositivo_pai).count() - - if qtd_existente >= pp[0].quantidade_permitida: - 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 + 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, + dispositivo_pai=dp.dispositivo_pai).count() + + if qtd_existente >= pp[0].quantidade_permitida: + 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, local=local_add) @@ -2261,22 +2270,26 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): count_auto_insert = 0 if create_auto_inserts: - tipos_dp_auto_insert = tipo.filhos_permitidos.filter( - filho_de_insercao_automatica=True, - perfil_id=context['perfil_pk']) - - for tipoauto in tipos_dp_auto_insert: - qtdp = tipoauto.quantidade_permitida - if qtdp >= 0: - qtdp -= Dispositivo.objects.filter( - ta_id=dp.ta_id, - dispositivo_pai_id=dp.id, - tipo_dispositivo_id=tipoauto.filho_permitido.pk - ).count() - if qtdp > 0: + for perfil in perfil_parents: + tipos_dp_auto_insert = tipo.filhos_permitidos.filter( + filho_de_insercao_automatica=True, + perfil=perfil) + + for tipoauto in tipos_dp_auto_insert: + qtdp = tipoauto.quantidade_permitida + if qtdp >= 0: + qtdp -= Dispositivo.objects.filter( + ta_id=dp.ta_id, + dispositivo_pai_id=dp.id, + tipo_dispositivo_id=tipoauto.filho_permitido.pk + ).count() + if qtdp > 0: + count_auto_insert += 1 + else: count_auto_insert += 1 - else: - count_auto_insert += 1 + + if count_auto_insert: + break # Inserção automática if count_auto_insert: diff --git a/scripts/hooks/pre-commit b/scripts/hooks/pre-commit old mode 100755 new mode 100644