From cc567c7c94d49a96f9caf95b89779124e0e29ddf Mon Sep 17 00:00:00 2001 From: LeandroJatai Date: Wed, 24 Aug 2022 00:26:49 -0300 Subject: [PATCH] feat: impl import de TAs de ML para NJ --- sapl/compilacao/models.py | 72 +++++++++---------- sapl/compilacao/views.py | 48 +++++++++++++ sapl/templates/compilacao/text_edit.html | 31 +++++++- .../textoarticulado_menu_config.html | 1 + 4 files changed, 112 insertions(+), 40 deletions(-) diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index 589f8377c..4cb452d4d 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -1,7 +1,7 @@ from django.contrib import messages from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType -from django.db import models +from django.db import models, transaction from django.db.models import F, Q from django.db.models.aggregates import Max from django.db.models.deletion import PROTECT @@ -475,48 +475,44 @@ class TextoArticulado(TimestampedMixin): view_integracao = view_integracao[0] - ta = TextoArticulado.update_or_create(view_integracao, obj) + origem = self + destino = TextoArticulado.update_or_create(view_integracao, obj) - dispositivos = Dispositivo.objects.filter(ta=self).order_by('ordem') + dispositivos = Dispositivo.objects.filter(ta=origem).order_by('ordem') - map_ids = {} - for d in dispositivos: - id_old = d.id + with transaction.atomic(): + map_ids = {} + for d in dispositivos: + id_old = d.id - # TODO - # validar isso: é o suficiente para pegar apenas o texto válido? - # exemplo: - # quando uma matéria for alterada por uma emenda - # ao usar esta função para gerar uma norma deve vir apenas - # o texto válido, compilado... - if d.dispositivo_subsequente: - continue - - d.id = None - d.inicio_vigencia = ta.data - d.fim_vigencia = None - d.inicio_eficacia = ta.data - d.fim_eficacia = None - d.publicacao = None - d.ta = ta - d.ta_publicado = None - d.dispositivo_subsequente = None - d.dispositivo_substituido = None - d.dispositivo_vigencia = None - d.dispositivo_atualizador = None - d.save() - map_ids[id_old] = d.id - - dispositivos = Dispositivo.objects.filter(ta=ta).order_by('ordem') - - for d in dispositivos: - if not d.dispositivo_pai: - continue + if d.dispositivo_subsequente: + continue - d.dispositivo_pai_id = map_ids[d.dispositivo_pai_id] - d.save() + d.id = None + d.inicio_vigencia = destino.data + d.fim_vigencia = None + d.inicio_eficacia = destino.data + d.fim_eficacia = None + d.publicacao = None + d.ta = destino + d.ta_publicado = None + d.dispositivo_subsequente = None + d.dispositivo_substituido = None + d.dispositivo_vigencia = None + d.dispositivo_atualizador = None + d.save() + map_ids[id_old] = d.id + + dispositivos = Dispositivo.objects.filter( + ta=destino).order_by('ordem') + + for d in dispositivos: + if not d.dispositivo_pai: + continue - return ta + d.dispositivo_pai_id = map_ids[d.dispositivo_pai_id] + d.save() + return destino def reagrupar_ordem_de_dispositivos(self): diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 70186cbc9..c6939a5fe 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -6,6 +6,7 @@ import sys from braces.views import FormMessagesMixin from bs4 import BeautifulSoup from django import forms +from django.apps.registry import apps from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin @@ -1110,8 +1111,45 @@ class TextEditView(CompMixin, TemplateView): self.object = self.ta return self.object.has_edit_permission(self.request) + def importar_texto_materia(self, request, *args, **kwargs): + rd = redirect(to=reverse_lazy( + 'sapl.compilacao:ta_text_edit', kwargs={ + 'ta_id': self.object.id})) + + if self.object.dispositivos_set.count() > 1: + messages.error( + request, + _('Este Texto Articulado possui conteúdo, ' + 'para fazer a importação você deve deixar ' + 'apenas uma única Articulação inicial.')) + return rd + + materia = self.materia_da_norma_deste_texto_articulado() + if not materia: + messages.error( + request, + _('A Norma [{}] não está vinculada a nenhuma matéria.'.format(self.object.content_object))) + return rd + + self.object.dispositivos_set.all().delete() + + ta_materia = materia.texto_articulado.first() + + try: + ta_materia.clone_for(self.object.content_object) + #TextoArticulado.clone(ta_materia, self.object) + except Exception as e: + messages.error( + request, + _('Ocorreu erro na importação e o procedimento foi cancelado!')) + + return rd + def get(self, request, *args, **kwargs): + if 'importar_texto_materia' in request.GET: + return self.importar_texto_materia(request, *args, **kwargs) + if self.object.editing_locked: if 'unlock' not in request.GET: messages.error( @@ -1348,6 +1386,16 @@ class TextEditView(CompMixin, TemplateView): return '' + def materia_da_norma_deste_texto_articulado(self): + NormaJuridica = apps.get_model( + 'norma', 'NormaJuridica') + ta = self.ta + + if isinstance(ta.content_object, NormaJuridica) and\ + ta.content_object.materia: + return ta.content_object.materia + return None + def runBase(self): result = Dispositivo.objects.filter(ta_id=self.kwargs['ta_id']) diff --git a/sapl/templates/compilacao/text_edit.html b/sapl/templates/compilacao/text_edit.html index aa161ffd6..ada437934 100644 --- a/sapl/templates/compilacao/text_edit.html +++ b/sapl/templates/compilacao/text_edit.html @@ -17,11 +17,38 @@ {% if object.editing_locked %}{% trans 'Desbloquear Edição' %}{%else%}{% trans 'Publicar Texto' %}{% endif %} {% endif %} -
- {% trans 'Editar Metadados do Texto Articulado' %} +
{% include 'compilacao/textoarticulado_menu_config.html' %}
+ {% if object.dispositivos_set.count == 1 %} + {% with view.materia_da_norma_deste_texto_articulado as materia %} + {% if materia %} +
+
+
+ + Importação de Texto! + +
+
+

Esta Norma Jurídica está vinculada a uma Matéria Legislativa - {{ materia }}.
+ Esta Matéria possui Texto Articulado com {{materia.texto_articulado.all.first.dispositivos_set.count}} dispositivos.

+
+

Importar o texto da matéria?

+

+ Importar +
+
+ Caso haja compilação da Matéria com Emendas, virá o texto compilado.
+ É recomendado que, caso registre-se a compilação de emendas, o faça após terem sido aprovadas. +
+
+
+
+ {% endif %} + {% endwith %} + {% endif %} {% endif %} {% endblock actions %} diff --git a/sapl/templates/compilacao/textoarticulado_menu_config.html b/sapl/templates/compilacao/textoarticulado_menu_config.html index 0790efaa7..10355d594 100644 --- a/sapl/templates/compilacao/textoarticulado_menu_config.html +++ b/sapl/templates/compilacao/textoarticulado_menu_config.html @@ -6,6 +6,7 @@