Browse Source

feat: impl import de TAs de ML para NJ

script-migracao-norma-materia
LeandroJatai 2 years ago
parent
commit
cc567c7c94
  1. 72
      sapl/compilacao/models.py
  2. 48
      sapl/compilacao/views.py
  3. 31
      sapl/templates/compilacao/text_edit.html
  4. 1
      sapl/templates/compilacao/textoarticulado_menu_config.html

72
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):

48
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'])

31
sapl/templates/compilacao/text_edit.html

@ -17,11 +17,38 @@
<a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}?{% if object.editing_locked %}unlock{%else%}lock{% endif %}" class="btn {% if object.editing_locked %}btn-outline-danger{%else%}btn-outline-primary{% endif %}">{% if object.editing_locked %}{% trans 'Desbloquear Edição' %}{%else%}{% trans 'Publicar Texto' %}{% endif %}</a>
{% endif %}
</div>
<div class="actions btn-group" role="group">
<a href="{% url 'sapl.compilacao:ta_edit' object.pk %}" class="btn btn-outline-primary">{% trans 'Editar Metadados do Texto Articulado' %}</a>
<div class="actions btn-group dropleft" role="group">
{% include 'compilacao/textoarticulado_menu_config.html' %}
</div>
</div>
{% if object.dispositivos_set.count == 1 %}
{% with view.materia_da_norma_deste_texto_articulado as materia %}
{% if materia %}
<div class="container">
<div class="card text-white bg-info mb-3">
<div class="card-header">
<strong>
Importação de Texto!
</strong>
</div>
<div class="card-body ">
<h3 class="card-title">Esta Norma Jurídica está vinculada a uma Matéria Legislativa - {{ materia }}.<br>
Esta Matéria possui Texto Articulado com {{materia.texto_articulado.all.first.dispositivos_set.count}} dispositivos.</h3>
<div class="container">
<h3 class="card-text text-dark float-right">Importar o texto da matéria?</h3>
<br><br>
<a href="?importar_texto_materia" class="btn btn-secondary float-right">Importar</a>
</div>
<div class="container">
Caso haja compilação da Matéria com Emendas, virá o texto compilado.<br>
É recomendado que, caso registre-se a compilação de emendas, o faça após terem sido aprovadas.
</div>
</div>
</div>
</div>
{% endif %}
{% endwith %}
{% endif %}
{% endif %}
{% endblock actions %}

1
sapl/templates/compilacao/textoarticulado_menu_config.html

@ -6,6 +6,7 @@
<i class="fas fa-cog"></i>
</a>
<ul class="dropdown-menu" role="menu">
<li class="dropdown-item"><a href="{% url 'sapl.compilacao:ta_edit' object.pk %}">{% trans 'Editar Metadados do Texto Articulado' %}</a></li>
{% if perms.compilacao.list_tipotextoarticulado %}<li class="dropdown-item"><a href="{% url 'sapl.compilacao:tipotextoarticulado_list' %}">{%model_verbose_name_plural 'sapl.compilacao.models.TipoTextoArticulado'%}</a></li>{% endif %}
{% if perms.compilacao.list_tipo_publicacao %}<li class="dropdown-item"><a href="{% url 'sapl.compilacao:tipopublicacao_list' %}">{%model_verbose_name_plural 'sapl.compilacao.models.TipoPublicacao'%}</a></li>{% endif %}

Loading…
Cancel
Save