Browse Source

feat: impl import de TAs de ML para NJ

script-migracao-norma-materia
LeandroJatai 2 years ago
parent
commit
cc567c7c94
  1. 26
      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

26
sapl/compilacao/models.py

@ -1,7 +1,7 @@
from django.contrib import messages from django.contrib import messages
from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType 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 import F, Q
from django.db.models.aggregates import Max from django.db.models.aggregates import Max
from django.db.models.deletion import PROTECT from django.db.models.deletion import PROTECT
@ -475,30 +475,26 @@ class TextoArticulado(TimestampedMixin):
view_integracao = view_integracao[0] 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')
with transaction.atomic():
map_ids = {} map_ids = {}
for d in dispositivos: for d in dispositivos:
id_old = d.id 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: if d.dispositivo_subsequente:
continue continue
d.id = None d.id = None
d.inicio_vigencia = ta.data d.inicio_vigencia = destino.data
d.fim_vigencia = None d.fim_vigencia = None
d.inicio_eficacia = ta.data d.inicio_eficacia = destino.data
d.fim_eficacia = None d.fim_eficacia = None
d.publicacao = None d.publicacao = None
d.ta = ta d.ta = destino
d.ta_publicado = None d.ta_publicado = None
d.dispositivo_subsequente = None d.dispositivo_subsequente = None
d.dispositivo_substituido = None d.dispositivo_substituido = None
@ -507,7 +503,8 @@ class TextoArticulado(TimestampedMixin):
d.save() d.save()
map_ids[id_old] = d.id map_ids[id_old] = d.id
dispositivos = Dispositivo.objects.filter(ta=ta).order_by('ordem') dispositivos = Dispositivo.objects.filter(
ta=destino).order_by('ordem')
for d in dispositivos: for d in dispositivos:
if not d.dispositivo_pai: if not d.dispositivo_pai:
@ -515,8 +512,7 @@ class TextoArticulado(TimestampedMixin):
d.dispositivo_pai_id = map_ids[d.dispositivo_pai_id] d.dispositivo_pai_id = map_ids[d.dispositivo_pai_id]
d.save() d.save()
return destino
return ta
def reagrupar_ordem_de_dispositivos(self): def reagrupar_ordem_de_dispositivos(self):

48
sapl/compilacao/views.py

@ -6,6 +6,7 @@ import sys
from braces.views import FormMessagesMixin from braces.views import FormMessagesMixin
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from django import forms from django import forms
from django.apps.registry import apps
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
@ -1110,8 +1111,45 @@ class TextEditView(CompMixin, TemplateView):
self.object = self.ta self.object = self.ta
return self.object.has_edit_permission(self.request) 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): 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 self.object.editing_locked:
if 'unlock' not in request.GET: if 'unlock' not in request.GET:
messages.error( messages.error(
@ -1348,6 +1386,16 @@ class TextEditView(CompMixin, TemplateView):
return '' 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): def runBase(self):
result = Dispositivo.objects.filter(ta_id=self.kwargs['ta_id']) 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> <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 %} {% endif %}
</div> </div>
<div class="actions btn-group" role="group"> <div class="actions btn-group dropleft" role="group">
<a href="{% url 'sapl.compilacao:ta_edit' object.pk %}" class="btn btn-outline-primary">{% trans 'Editar Metadados do Texto Articulado' %}</a>
{% include 'compilacao/textoarticulado_menu_config.html' %} {% include 'compilacao/textoarticulado_menu_config.html' %}
</div> </div>
</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 %} {% endif %}
{% endblock actions %} {% endblock actions %}

1
sapl/templates/compilacao/textoarticulado_menu_config.html

@ -6,6 +6,7 @@
<i class="fas fa-cog"></i> <i class="fas fa-cog"></i>
</a> </a>
<ul class="dropdown-menu" role="menu"> <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_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 %} {% 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