From 2405beda241a04b7ec573743f62dc029b7fbab3e Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Fri, 2 Oct 2020 10:44:59 -0300 Subject: [PATCH] Fix: #3263 --- sapl/norma/models.py | 47 ++++++++++++++++++- sapl/norma/views.py | 20 +++++--- .../templates/norma/normajuridica_filter.html | 4 +- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/sapl/norma/models.py b/sapl/norma/models.py index 099ae6ade..b6c63b9dc 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -1,8 +1,8 @@ from django.contrib.contenttypes.fields import GenericRelation from django.db import models from django.template import defaultfilters -from django.utils.translation import ugettext_lazy as _ from django.utils import timezone +from django.utils.translation import ugettext_lazy as _ from model_utils import Choices import reversion @@ -10,7 +10,7 @@ from sapl.base.models import Autor from sapl.compilacao.models import TextoArticulado from sapl.materia.models import MateriaLegislativa from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, - restringe_tipos_de_arquivo_txt, + restringe_tipos_de_arquivo_txt, texto_upload_path, get_settings_auth_user_model, OverwriteStorage) @@ -70,8 +70,51 @@ def norma_upload_path(instance, filename): return texto_upload_path(instance, filename, subpath=instance.ano) +class NormaJuridicaManager(models.Manager): + + use_for_related_fields = True + + def normas_com_textos_articulados_pendentes(self): + qs = self.get_queryset() + qs = qs.filter( + texto_articulado__editable_only_by_owners=False) + + q = models.Q( + texto_articulado__privacidade=0 + ) | models.Q( + texto_articulado__isnull=True + ) + qs = qs.exclude(q) + + for n in qs: + ta = n.texto_articulado.first() + count = ta.dispositivos_set.count() + if count == 1: + count = 0 + elif count == 2: + d = ta.dispositivos_set.last() + if d.auto_inserido or not d.texto or d.texto == n.ementa: + count = 0 + elif count == 3: + ds = ta.dispositivos_set.all() + if ds[1].auto_inserido and \ + not d[2].dispositivo_pai and\ + d[2].tipo_dispositivo.dispositivo_de_articulacao: + count = 0 + + if not count: + ta.dispositivos_set.filter( + dispositivo_pai__isnull=False).delete() + ta.delete() + + return qs + + @reversion.register() class NormaJuridica(models.Model): + + objects = NormaJuridicaManager() + ESFERA_FEDERACAO_CHOICES = Choices( ('M', 'municipal', _('Municipal')), ('E', 'estadual', _('Estadual')), diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 02d57990c..4bcc95ecb 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -6,6 +6,7 @@ from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import ObjectDoesNotExist from django.db.models import Q from django.http import HttpResponse, JsonResponse +from django.http.response import HttpResponseRedirect from django.template import RequestContext, loader from django.urls import reverse from django.utils import timezone @@ -245,13 +246,20 @@ class NormaCrud(Crud): class ListView(Crud.ListView): + def get(self, request, *args, **kwargs): + if AppConfig.attr('texto_articulado_norma'): + return Crud.ListView.get(self, request, *args, **kwargs) + else: + url = self.get_redirect_url(*args, **kwargs) + return HttpResponseRedirect(url) + + def get_redirect_url(self, *args, **kwargs): + namespace = self.model._meta.app_config.name + return reverse('%s:%s' % (namespace, 'norma_pesquisa')) + def get_queryset(self): - qs = Crud.ListView.get_queryset(self) - q = Q( - texto_articulado__privacidade=0 - ) | Q( - texto_articulado__isnull=True) - qs = qs.exclude(q) + qs = NormaJuridica.objects.normas_com_textos_articulados_pendentes() + return qs.order_by('-texto_articulado__privacidade', '-ano', '-numero') def get_context_data(self, **kwargs): diff --git a/sapl/templates/norma/normajuridica_filter.html b/sapl/templates/norma/normajuridica_filter.html index d8eef093b..2adba9610 100644 --- a/sapl/templates/norma/normajuridica_filter.html +++ b/sapl/templates/norma/normajuridica_filter.html @@ -1,10 +1,10 @@ {% extends "crud/detail.html" %} {% load i18n %} -{% load crispy_forms_tags %} +{% load crispy_forms_tags common_tags %} {% block actions %}
- {% if perms.compilacao.lock_unlock_textoarticulado %} + {% if perms.compilacao.lock_unlock_textoarticulado and 'texto_articulado_norma'|get_config_attr %} {% blocktrans with verbose_name=view.verbose_name %}PendĂȘncias nos Textos Articulados{% endblocktrans %}