Browse Source

Refat. de inserão e exclusão de Dispositivos Raiz

pull/299/head
LeandroRoberto 9 years ago
parent
commit
b3aa3c6aa1
  1. 47
      compilacao/forms.py
  2. 25
      compilacao/migrations/0046_auto_20160319_1542.py
  3. 36
      compilacao/models.py
  4. 339
      compilacao/views.py
  5. 4
      static/js/app.js
  6. 74
      static/js/compilacao.js
  7. 11
      static/styles/app.scss
  8. 1
      templates/compilacao/dispositivo_form.html
  9. 2
      templates/compilacao/dispositivo_search_fragment_form.html
  10. 38
      templates/compilacao/text_edit.html
  11. 2
      templates/compilacao/text_edit_bloco.html
  12. 4
      templates/compilacao/text_list.html

47
compilacao/forms.py

@ -273,35 +273,41 @@ class DispositivoSearchFragmentForm(ModelForm):
label=_('Tipos de...'), required=False)
num_ta = forms.IntegerField(
label=_('Núm Texto Articulado'), required=False)
label=_('Número'), required=False)
ano_ta = forms.IntegerField(
label=_('Ano Texto Articulado'), required=False)
label=_('Ano'), required=False)
busca_dispositivo = forms.CharField(
label=_('Buscar Dispositivo'),
rotulo_dispositivo = forms.CharField(
label=_('Rótulo'),
required=False)
texto_dispositivo = forms.CharField(
label=_('Pesquisa Textual'),
required=False)
def __init__(self, *args, **kwargs):
if 'fields_search' in kwargs:
fields_search = kwargs['fields_search'].fields
fields_search.append(
Row(
to_column(('tipo_ta', 6)),
to_column(('tipo_model', 6))))
fields_search.append(
fields_search.append(Fieldset(
_('Busca por um Dispositivo'),
Row(
to_column(('num_ta', 6)),
to_column(('ano_ta', 6))))
fields_search.append(
Row(to_column((FieldWithButtons(
Field(
'busca_dispositivo',
placeholder=_('Digite palavras, letras, '
'números ou algo'
' que estejam '
'no rótulo ou no texto.')),
StrictButton(_('Buscar'), css_class='btn-busca')), 12))))
to_column(('ano_ta', 6))),
Row(
to_column(('tipo_ta', 6)),
to_column(('tipo_model', 6))),
Row(to_column(('rotulo_dispositivo', 3)),
to_column((FieldWithButtons(
Field(
'texto_dispositivo',
placeholder=_('Digite palavras, letras, '
'números ou algo'
' que estejam no texto.')),
StrictButton(_('Buscar'), css_class='btn-busca')), 9)))
))
fields_search.append(
Row(to_column(
(Div(css_class='result-busca-dispositivo'), 12))))
@ -587,9 +593,10 @@ class DispositivoEdicaoBasicaForm(ModelForm):
self.helper = FormHelper()
self.helper.layout = SaplFormLayout(
*layout,
label_cancel=_('Retornar para o Editor Sequencial'))
self.helper.layout.fields += layout
super(DispositivoEdicaoBasicaForm, self).__init__(*args, **kwargs)
FIELD_NAME_MAPPING = {

25
compilacao/migrations/0046_auto_20160319_1542.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-03-19 18:42
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0045_auto_20160311_1117'),
]
operations = [
migrations.AlterField(
model_name='dispositivo',
name='inconstitucionalidade',
field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Declarado Inconstitucional'),
),
migrations.AlterField(
model_name='dispositivo',
name='texto',
field=models.TextField(blank=True, default='', verbose_name='Texto Original'),
),
]

36
compilacao/models.py

@ -1,3 +1,4 @@
from builtins import zip
from datetime import datetime
from django.contrib.auth.models import User
@ -136,17 +137,22 @@ class TextoArticulado(TimestampedMixin):
'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")}
def organizar_ordem_de_dispositivos(self):
dpts = Dispositivo.objects.filter(ta=self)
ordem_max = dpts.last().ordem
if not dpts.exists():
return
ordem_max = dpts.last().ordem
dpts.update(ordem=F('ordem') + ordem_max)
dpts = Dispositivo.objects.filter(
ta=self).values_list('pk', flat=True).order_by('ordem')
count = 0
for d in dpts:
count += Dispositivo.INTERVALO_ORDEM
d.ordem = count
d.save()
Dispositivo.objects.filter(pk=d).update(ordem=count)
class TipoNota(models.Model):
@ -728,6 +734,20 @@ class Dispositivo(BaseModel, TimestampedMixin):
'º' if
self.tipo_dispositivo.
rotulo_ordinal >= 0 else '',)
elif irmaos_mesmo_tipo.count() == 1 and\
irmaos_mesmo_tipo[0].dispositivo0 == 0 and\
self.dispositivo0 == 1:
irmao = irmaos_mesmo_tipo[0]
irmao.dispositivo0 = 1
rr = prefixo[0]
rr += irmao.get_nomenclatura_completa()
irmao.rotulo = rr + t.rotulo_sufixo_texto
irmao.save()
r += prefixo[0]
self.dispositivo0 = 2
r += self.get_nomenclatura_completa()
else:
r += prefixo[0]
r += self.get_nomenclatura_completa()
@ -803,19 +823,25 @@ class Dispositivo(BaseModel, TimestampedMixin):
return (flag_direcao, flag_variacao)
def transform_in_prior(self):
def transform_in_prior(self, profundidade=-1):
numero = self.get_numero_completo()
numero.reverse()
if profundidade != -1:
profundidade = len(numero) - profundidade - 1
for i in range(len(numero)):
if not numero[i]:
continue
if i > profundidade:
continue
numero[i] -= 1
numero.reverse()
break
numero.reverse()
self.set_numero_completo(numero)
def set_numero_completo(self, *numero):

339
compilacao/views.py

@ -8,6 +8,7 @@ from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType
from django.core.signing import Signer
from django.core.urlresolvers import reverse_lazy
from django.db import transaction
from django.db.models import Q
from django.forms.models import model_to_dict
from django.http.response import (HttpResponse, HttpResponseRedirect,
@ -497,7 +498,8 @@ class TextView(ListView, CompMixin):
continue
if idx + 1 < length:
ano = item.ta_publicado.ano
ano = item.ta_publicado.ano if item.ta_publicado else\
item.ta.ano
if ano in self.itens_de_vigencia:
self.itens_de_vigencia[ano].append(item)
else:
@ -1024,7 +1026,15 @@ class ActionsEditMixin:
try:
Dispositivo.objects.filter(
ta=dvt.ta,
ta_publicado__isnull=True).update(dispositivo_vigencia=dvt)
ta_publicado__isnull=True).update(
dispositivo_vigencia=dvt,
inicio_vigencia=dvt.inicio_vigencia)
Dispositivo.objects.filter(
ta_publicado=dvt.ta).update(
dispositivo_vigencia=dvt,
inicio_vigencia=dvt.inicio_vigencia)
return {'message': str(_('Dispositivo de Vigência atualizado '
'com sucesso!!!'))}
except:
@ -1060,13 +1070,21 @@ class ActionsEditMixin:
# TODO: a linha abaixo causa atualização da tela inteira...
# retirar a linha abaixo e identificar atualizações pontuais
data['pai'] = [-1, ]
data['message'] = str(self.remover_dispositivo(base, bloco))
ta_base.organizar_ordem_de_dispositivos()
try:
with transaction.atomic():
data['message'] = str(self.remover_dispositivo(base, bloco))
ta_base.organizar_ordem_de_dispositivos()
except Exception as e:
print(e)
data['pk'] = context['dispositivo_id']
data['message'] = str(_('Ocorreu um erro ao '
'excluir esse Dispositivo'))
return data
def remover_dispositivo(self, base, bloco):
base_ordem = base.ordem
if base.dispositivo_subsequente or base.dispositivo_substituido:
p = base.dispositivo_substituido
n = base.dispositivo_subsequente
@ -1094,22 +1112,35 @@ class ActionsEditMixin:
p.save()
base.delete()
else:
proxima_articulacao = base.get_proximo_nivel_zero()
if not bloco:
# tranferir filhos para primeiro pai possível acima da base
# de exclusão
for d in base.dispositivos_filhos_set.all():
# inserções automáticas são excluidas junto com sua base,
# independente da escolha do usuário
""" TODO: Criar possibilidade de transferência de filhos
de dispositivos automáticos
ex: na exclusão de artigos, na versão atual,
os caputs serão excluidos automáticamente mesmo que a
exclusão não seja em bloco. O que fazer com os incisos?
transferir para o caput imediatamente acima visto se
tratar de uma exclusão de item?"""
d_nivel_old = d.nivel
if d.is_relative_auto_insert():
d.delete()
continue
# encontrar possível pai que será o primeiro parent
# possível dos parents do dispostivo
# imediatamente anterior ao dispositivo base
anterior = Dispositivo.objects.order_by('-ordem').filter(
ta_id=base.ta_id,
ordem__lt=base.ordem
).first()
ordem__lt=d.ordem).exclude(
pk=base.pk).exclude(
dispositivo_pai=base).first()
if not anterior:
return _('Não é possível excluir este Dispositivo sem'
@ -1144,6 +1175,13 @@ class ActionsEditMixin:
d.transform_in_next()
d.rotulo = d.rotulo_padrao()
break
elif (candidato.tipo_dispositivo ==
d.dispositivo_pai.tipo_dispositivo):
d.dispositivo_pai = candidato
d.nivel = candidato.nivel + 1
break
elif d.tipo_dispositivo.possiveis_pais.filter(
pai=candidato.tipo_dispositivo,
perfil__padrao=True).exists():
@ -1154,6 +1192,7 @@ class ActionsEditMixin:
else:
d.set_numero_completo([1, 0, 0, 0, 0, 0, ])
d.nivel = candidato.nivel + 1
d.rotulo = d.rotulo_padrao()
break
if not parents:
@ -1164,97 +1203,171 @@ class ActionsEditMixin:
if d.nivel != d_nivel_old:
d.organizar_niveis()
if base.nivel:
if not base.tipo_dispositivo.contagem_continua:
pai_base = base.dispositivo_pai
irmaos_posteriores = pai_base.dispositivos_filhos_set.\
filter(
ordem__gt=base.ordem,
tipo_dispositivo=base.tipo_dispositivo)
pai_base = base.dispositivo_pai
if pai_base:
# Localizar irmaos posteriores do mesmo tipo de base
# se não DCC
if not base.tipo_dispositivo.contagem_continua:
irmaos_posteriores = pai_base.dispositivos_filhos_set.\
filter(
ordem__gt=base_ordem,
tipo_dispositivo=base.tipo_dispositivo)
# se DCC
else:
irmaos_posteriores = Dispositivo.objects.order_by(
'ordem').filter(
ta_id=base.ta_id,
ordem__gt=base_ordem,
tipo_dispositivo_id=base.tipo_dispositivo_id)
# Religar numeração de dispositivos de contagem contínua
# que seram excluidos
if proxima_articulacao:
irmaos_posteriores = irmaos_posteriores.exclude(
ordem__gte=proxima_articulacao.ordem)
proximo_independente_base = irmaos_posteriores.first()
proxima_articulacao = base.get_proximo_nivel_zero()
# excluir e renumerar irmaos
profundidade_base = base.get_profundidade()
base.delete()
if not proximo_independente_base:
proximo_independente_base = Dispositivo.objects.\
order_by('ordem').filter(
ta_id=base.ta_id,
ordem__gt=base.ordem,
nivel__lte=base.nivel).first()
for irmao in irmaos_posteriores:
irmao.transform_in_prior(
profundidade=profundidade_base)
irmao.rotulo = irmao.rotulo_padrao()
irmao.save()
if proximo_independente_base:
dcc = Dispositivo.objects.order_by('ordem').filter(
ta_id=base.ta_id,
ordem__gt=base.ordem,
ordem__lt=proximo_independente_base.ordem,
tipo_dispositivo__contagem_continua=True)
religado = {}
for d in dcc:
if d.tipo_dispositivo.class_css in religado:
continue
religado[
d.tipo_dispositivo.class_css] = d.dispositivo0
if proxima_articulacao:
dcc_a_religar = Dispositivo.objects.filter(
ta_id=d.ta_id,
ordem__gt=proximo_independente_base.ordem,
tipo_dispositivo=d.tipo_dispositivo,
ordem__lt=proxima_articulacao.ordem)
else:
dcc_a_religar = Dispositivo.objects.filter(
ta_id=base.ta_id,
ordem__gt=proximo_independente_base.ordem,
tipo_dispositivo=d.tipo_dispositivo)
primeiro_a_religar = 0
for dr in dcc_a_religar:
if not primeiro_a_religar:
primeiro_a_religar = dr.dispositivo0
dr.dispositivo0 = (
dr.dispositivo0 -
primeiro_a_religar + d.dispositivo0)
dr.rotulo = dr.rotulo_padrao()
dr.save()
base.delete()
irmaos = pai_base.dispositivos_filhos_set.\
filter(tipo_dispositivo=base.tipo_dispositivo)
if (irmaos.count() == 1 and
';' in irmaos[0].
tipo_dispositivo.rotulo_prefixo_texto):
i = irmaos[0]
i.set_numero_completo([0, 0, 0, 0, 0, 0, ])
i.rotulo = i.rotulo_padrao(local_insert=1)
i.save()
else:
proxima_articulacao = base.get_proximo_nivel_zero()
# Renumerar Dispostivos de Contagem Contínua
# de dentro da base se pai
dcc = Dispositivo.objects.order_by('ordem').filter(
ta_id=base.ta_id,
ordem__gt=base.ordem,
tipo_dispositivo__contagem_continua=True)
if proxima_articulacao:
irmaos_posteriores = Dispositivo.objects.filter(
ta_id=base.ta_id,
ordem__gt=base.ordem,
tipo_dispositivo=base.tipo_dispositivo,
ordem__lt=proxima_articulacao.ordem)
dcc = dcc.exclude(
ordem__gte=proxima_articulacao.ordem)
base_adicao = {}
nivel_zero_anterior = base.get_nivel_zero_anterior()
if nivel_zero_anterior:
nivel_zero_anterior = nivel_zero_anterior.ordem
else:
irmaos_posteriores = Dispositivo.objects.filter(
ta_id=base.ta_id,
ordem__gt=base.ordem,
tipo_dispositivo=base.tipo_dispositivo)
nivel_zero_anterior = 0
dcc = list(dcc)
for d in dcc: # ultimo DCC do tipo encontrado
if d.tipo_dispositivo.class_css not in base_adicao:
ultimo_dcc = Dispositivo.objects.order_by(
'ordem').filter(
ta_id=base.ta_id,
ordem__lt=base.ordem,
ordem__gt=nivel_zero_anterior,
tipo_dispositivo__contagem_continua=True,
tipo_dispositivo=d.tipo_dispositivo).last()
if not ultimo_dcc:
break
base_adicao[
d.tipo_dispositivo.class_css] = ultimo_dcc.\
dispositivo0
d.dispositivo0 += base_adicao[
d.tipo_dispositivo.class_css]
d.rotulo = d.rotulo_padrao()
dcc.reverse()
for d in dcc:
d.save()
base.delete()
if (len(irmaos_posteriores) == 1 and
';' in irmaos_posteriores[0].
tipo_dispositivo.rotulo_prefixo_texto):
i = irmaos_posteriores[0]
i.set_numero_completo([0, 0, 0, 0, 0, 0, ])
i.rotulo = i.rotulo_padrao(local_insert=1)
i.save()
# em Bloco
else:
# Religar numeração de dispositivos de contagem contínua
# que serão excluidos
# pbi - proxima base independente
pbi = Dispositivo.objects.\
order_by('ordem').filter(
ta_id=base.ta_id,
ordem__gt=base_ordem,
nivel__lte=base.nivel).first()
if not pbi:
base.delete()
else:
for irmao in irmaos_posteriores:
irmao.transform_in_prior()
irmao.rotulo = irmao.rotulo_padrao()
irmao.save()
else:
proxima_articulacao = base.get_proximo_nivel_zero()
dcc_a_excluir = Dispositivo.objects.order_by(
'ordem').filter(
ta_id=base.ta_id,
ordem__gte=base_ordem,
ordem__lt=pbi.ordem,
tipo_dispositivo__contagem_continua=True)
if proxima_articulacao:
dcc_a_excluir = dcc_a_excluir.exclude(
ordem__gte=proxima_articulacao.ordem)
religado = {}
for d in dcc_a_excluir:
if d.tipo_dispositivo.class_css in religado:
continue
religado[
d.tipo_dispositivo.class_css] = d.dispositivo0
dcc_a_religar = Dispositivo.objects.filter(
ta_id=d.ta_id,
ordem__gte=pbi.ordem,
tipo_dispositivo=d.tipo_dispositivo)
if proxima_articulacao:
dcc_a_religar = dcc_a_religar.exclude(
ordem__gte=proxima_articulacao.ordem)
primeiro_a_religar = 0
for dr in dcc_a_religar:
if not primeiro_a_religar:
primeiro_a_religar = dr.dispositivo0
base.delete()
dr.dispositivo0 = (
dr.dispositivo0 -
primeiro_a_religar + d.dispositivo0)
dr.rotulo = dr.rotulo_padrao()
dr.save(clean=base != dr)
if base.pk:
base.delete()
return ''
"""
if proxima_articulacao:
irmaos_posteriores = Dispositivo.objects.filter(
ta_id=base.ta_id,
ordem__gt=base.ordem,
tipo_dispositivo=base.tipo_dispositivo,
ordem__lt=proxima_articulacao.ordem)
else:
irmaos_posteriores = Dispositivo.objects.filter(
ta_id=base.ta_id,
ordem__gt=base.ordem,
tipo_dispositivo=base.tipo_dispositivo)
proxima_articulacao = base.get_proximo_nivel_zero()
# Renumerar Dispostivos de Contagem Contínua de dentro da base
if not proxima_articulacao:
@ -1305,6 +1418,7 @@ class ActionsEditMixin:
base.delete()
return ''
"""
def add_prior(self, context):
return {}
@ -1314,11 +1428,21 @@ class ActionsEditMixin:
def add_next(self, context, local_add='add_next'):
try:
dp_auto_insert = None
base = Dispositivo.objects.get(pk=context['dispositivo_id'])
tipo = TipoDispositivo.objects.get(pk=context['tipo_pk'])
variacao = int(context['variacao'])
parents = [base, ] + base.get_parents()
if 'perfil_pk' not in context:
perfil_padrao = PerfilEstruturalTextoArticulado.objects.filter(
padrao=True).first()
if perfil_padrao:
context['perfil_pk'] = perfil_padrao.pk
else:
raise Exception('Não existe perfil padrão!')
tipos_dp_auto_insert = tipo.filhos_permitidos.filter(
filho_de_insercao_automatica=True,
perfil_id=context['perfil_pk'])
@ -1407,8 +1531,6 @@ class ActionsEditMixin:
dp.save()
dp_auto_insert = None
# Inserção automática
if count_auto_insert:
dp_pk = dp.pk
@ -1445,7 +1567,8 @@ class ActionsEditMixin:
if filho.nivel > nivel:
continue
if filho.dispositivo_pai.ordem >= dp.ordem:
if not filho.dispositivo_pai or\
filho.dispositivo_pai.ordem >= dp.ordem:
continue
nivel = filho.nivel
@ -1784,30 +1907,42 @@ class DispositivoSearchFragmentFormView(ListView):
def get_queryset(self):
try:
busca = ''
if 'busca' in self.request.GET:
busca = self.request.GET['busca']
if 'initial_ref' in self.request.GET:
initial_ref = self.request.GET['initial_ref']
if initial_ref:
q = Q(pk=initial_ref)
result = Dispositivo.objects.filter(q).select_related(
'ta').exclude(
tipo_dispositivo__dispositivo_de_alteracao=True)
return result
texto = ''
rotulo = ''
if 'texto' in self.request.GET:
texto = self.request.GET['texto']
q = Q(nivel__gt=0)
busca = busca.split(' ')
texto = texto.split(' ')
n = 10
for item in busca:
if 'rotulo' in self.request.GET:
rotulo = self.request.GET['rotulo']
if rotulo:
q = q & Q(rotulo__icontains=rotulo)
for item in texto:
if not item:
continue
if q:
q = q & (Q(dispositivo_pai__rotulo__icontains=item) |
Q(rotulo__icontains=item) |
Q(texto__icontains=item) |
q = q & (Q(texto__icontains=item) |
Q(texto_atualizador__icontains=item))
n = 50
else:
q = (Q(dispositivo_pai__rotulo__icontains=item) |
Q(rotulo__icontains=item) |
Q(texto__icontains=item) |
q = (Q(texto__icontains=item) |
Q(texto_atualizador__icontains=item))
n = 50
@ -1829,12 +1964,6 @@ class DispositivoSearchFragmentFormView(ListView):
q = q & Q(ta__ano=ano_ta)
n = 50
if 'initial_ref' in self.request.GET:
initial_ref = self.request.GET['initial_ref']
if initial_ref:
q = q & Q(pk=initial_ref)
n = 50
result = Dispositivo.objects.filter(q).select_related(
'ta').exclude(tipo_dispositivo__dispositivo_de_alteracao=True)

4
static/js/app.js

@ -1,5 +1,5 @@
function initTinymce() {
removeTinymce();
removeTinymce();
tinymce.init({
mode : "textareas",
force_br_newlines : false,
@ -45,7 +45,7 @@ function autorModal() {
height: 300,
show: {
effect: "blind",
duration: 500 },
duration: 500},
hide: {
effect: "explode",
duration: 500

74
static/js/compilacao.js

@ -26,38 +26,42 @@ function insertWaitAjax(element) {
var tipo_select = '';
var tipo_form = '';
var configFormSearchTA = function(container, _tipo_form, _tipo_select) {
tipo_select = _tipo_select;
tipo_form = _tipo_form;
tipo_select = _tipo_select;
tipo_form = _tipo_form;
var ta_select = $(container+" select[name='tipo_ta']");
$(container+" label[for='id_tipo_model']").html('Tipos de ' + ta_select[0].children[ta_select[0].selectedIndex].innerHTML);
$(container+" select[name='tipo_ta']").change(function(event) {
var url = '';
url = '/ta/search_fragment_form?action=get_tipos&tipo_ta='+this.value;
$(container+" label[for='id_tipo_model']").html('Tipos de ' + this.children[this.selectedIndex].innerHTML);
var select = $(container+" select[name='tipo_model']");
select.empty();
$('<option value="">Carregando...</option>').appendTo(select);
$.get(url).done(function( data ) {
select.empty();
for(var item in data) {
for (var i in data[item])
$('<option value="'+i+'">'+data[item][i]+'</option>').appendTo(select);
}
select.change(onChangeParamTA)
});
});
$(container+" input[name='num_ta'], "
+ container+" input[name='ano_ta'], "
+ container+" select[name='tipo_model'], "
+ container+" input[name='busca_dispositivo']"
).change(onChangeParamTA);
$(container+" .btn-busca").click(onChangeParamTA);
$(container+" select[name='tipo_ta']").change(function(event) {
var url = '';
url = '/ta/search_fragment_form?action=get_tipos&tipo_ta='+this.value;
$(container+" label[for='id_tipo_model']").html('Tipos de ' + this.children[this.selectedIndex].innerHTML);
var select = $(container+" select[name='tipo_model']");
select.empty();
$('<option value="">Carregando...</option>').appendTo(select);
$.get(url).done(function( data ) {
select.empty();
for(var item in data) {
for (var i in data[item])
select.append($("<option>").attr('value',i).text(data[item][i]));
//$('<option value="'+i+'">'+data[item][i]+'</option>').appendTo(select);
}
select.change(onChangeParamTA)
});
});
$(container+" input[name='num_ta'], "
+ container+" input[name='ano_ta'], "
+ container+" select[name='tipo_model'], "
+ container+" input[name='texto_dispositivo'], "
+ container+" input[name='rotulo_dispositivo']"
).change(onChangeParamTA);
$(container+" .btn-busca").click(onChangeParamTA);
}
var onChangeParamTA = function(event) {
@ -66,12 +70,13 @@ var onChangeParamTA = function(event) {
var num_ta = $("input[name='num_ta']").val();
var ano_ta = $("input[name='ano_ta']").val();
var rotulo_dispositivo = $("input[name='rotulo_dispositivo']").val();
var busca_dispositivo = $("input[name='busca_dispositivo']").val();
var texto_dispositivo = $("input[name='texto_dispositivo']").val();
var dispositivo_ref = $("#id_dispositivo_ref").val();
var dispositivo_select_ref = null;
$('#id_dispositivo_ref').remove();
if (dispositivo_ref == null)
dispositivo_ref = ''
dispositivo_select_ref = $("input[name='dispositivo_ref']:checked").val()
var url = '';
@ -80,7 +85,7 @@ var onChangeParamTA = function(event) {
'tipo_model' : tipo_model,
'num_ta' : num_ta,
'ano_ta' : ano_ta,
'busca' : busca_dispositivo,
'texto' : texto_dispositivo,
'rotulo' : rotulo_dispositivo,
'tipo_form' : tipo_form,
'tipo_select' : tipo_select,
@ -92,6 +97,9 @@ var onChangeParamTA = function(event) {
insertWaitAjax('.result-busca-dispositivo')
$.get(url, formData).done(function( data ) {
$('.result-busca-dispositivo').html(data);
//$("input[name='dispositivo_ref']").first().prop('checked', true);
if (dispositivo_ref != null)
$("input[name='dispositivo_ref']").filter('[value="'+dispositivo_ref+'"]').prop('checked', true);
else if (dispositivo_select_ref != null)
$("input[name='dispositivo_ref']").filter('[value="'+dispositivo_select_ref+'"]').prop('checked', true);
});
}

11
static/styles/app.scss

@ -126,3 +126,14 @@ body {
margin-bottom: 0;
}
}
fieldset {
fieldset {
font-size: 95%;
legend {
font-size: 18px;
}
}
}

1
templates/compilacao/dispositivo_form.html

@ -15,6 +15,7 @@
<li {% if request.get_full_path == edit_vigencia_url %}class="active"{%endif%}><a href="{{ edit_vigencia_url }}" >{% trans 'Vigência' %}</a></li>
<li><a href="#">{% trans 'Dispositivo Alterado' %}</a></li>
<li><a href="#">{% trans 'Dispositivo Alterador' %}</a></li>
<li><a href="#">{% trans 'Dispositivo de Vigência' %}</a></li>
</ul>
{% endblock sections_nav %}

2
templates/compilacao/dispositivo_search_fragment_form.html

@ -33,7 +33,7 @@
<a target="_blank" href="{% url 'compilacao:ta_text' dpt.ta.pk%}#{{dpt.pk}}" class="nomenclatura_heranca">{% nomenclatura_heranca dpt 1 1 %}</a>
</div>
</li>
{% elif dpt.tipo_dispositivo.dispositivo_de_articulacao and request.GET.tipo_select != 'select_for_vide'%}
{% elif dpt.tipo_dispositivo.dispositivo_de_articulacao%}
<li>
<div class="iteminput">
<input type="{{request.GET.tipo_form}}" name="dispositivo_ref" id="r{{dpt.pk}}" value="{{dpt.pk}}"/>

38
templates/compilacao/text_edit.html

@ -29,7 +29,7 @@
<div id="message_block"><div id="msg">{% trans 'Aguarde... Atualizando informações!!!'%}</div></div>
<div id="modal-message" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel">
<div id="modal-message" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
@ -66,7 +66,7 @@
<li><strong>(C) Construtor Estrutural:</strong> Neste modo, o editor foca na inserção de Dispositivos e busca deixar mais acessíveis as estas ações.</li>
</ol></li>
<li>A Edição Avançada é complexa e sensível a erros. É recomendável o uso cuidadoso e consciente das funcionalidades.</li>
<li>A Edição Avançada é complexa e sensível a erros de edição. É recomendável o uso cuidadoso e consciente das funcionalidades.</li>
<li>Gere toda a estrutura básica sem adicionar texto, isso evitará erros estruturais e otimizará seu trabalho por:
<ol>
<li>Facilitar o trabalho local aí, de seu navegador.</li>
@ -75,21 +75,35 @@
</ol>
</li>
<li>Inserir os Dispositivos na sequência natural é mais produtivo para você, além de ser também mais simples para o algorítmo que controla este processo. Quanto maior a mudança estutural, mais lento será o procedimento. </li>
<li>A exclusão de Dispositivos é um processo moroso e complicado, principalmente se o que está sendo excluido for, ou envolver, os DCC's - Dispositivos de Contagem Continua, como é o caso do Tipo de Dispositivo (Artigo), que é um tipo comum nos Textos Articulados Brasileiros.
As exclusões podem ser diretas, individuais ou em bloco:
<li>A Opção DVt (Dispositivo de Vigência do Texto) redefine o dispositivo em seleção, como o dispositivo de vigência de todos os outros, desde que estes sejam os dispositivos originais do texto.
<ol>
<li><strong>Diretas:</strong> Dispositivos que não possuam itens internos são excluidos diretamente.</li>
<li><strong>Individuais:</strong> Dispositivos que possuam itens internos e este podem ser reenquadrados no Dispositivo imediatamente anterior</li>
<li><strong>Em Bloco:</strong> Todo o conteúdo incluído no Dispositivo em edição será excluído.</li>
<li>O Dispositivo de Vigência de Dispositivos Alterados são controlados pelos seus Dispositivos Alteradores</li>
<li>Ao usar a opção DVt, todas as datas de início de vigência serão reenquadradas para a data de vigência do dispositivo de vigência. Posteriormente, alterações manuais poderão ser feitas.</li>
</ol>
<ul>
</li>
<li>A criação de Tipos de Dispositivos é dinâmica e deverão estar amarrados por perfis estuturais configuráveis. Por serem tarefas técnicas e complicadas, criar/editar tipos de dispositivos e perfis estuturais estão disponíveis apenas na área de edição técnica do SAPL (admin).
</li>
</ol>
<ul>
<li>As exclusões e inserções, quando acionadas, renumeram e redefinem os rótulos, tanto de dispositivos locais, quanto os DCC's.</li>
</ul>
</li>
<hr>
<h4>Exclusões</h4>
<ol>
<li>A exclusão de Dispositivos é um processo moroso e complicado, principalmente se o que está sendo excluido for, ou envolver, os DCC's - Dispositivos de Contagem Continua, como é o caso do Tipo de Dispositivo (Artigo), que é um tipo comum nos Textos Articulados Brasileiros.
As exclusões podem ser diretas, individuais ou em bloco:
<ol>
<li><strong>Diretas:</strong> Dispositivos que não possuam itens internos são excluidos diretamente.</li>
<li><strong>Individuais:</strong> Dispositivos que possuam itens internos e este podem ser reenquadrados no Dispositivo imediatamente anterior
<ul>
<li>Ainda Não foi implementado a transferência de conteúdo na exclusão individual de DCC's que estão estruturalmente separados. Ex: Um artigo possui parágrafos, se seu artigo imediatamente anterior estiver no mesmo sub-grupo, esses parágrafos, na exlcusão individual, serão transferidos para o artigo anterior, no entanto, se estiverem em sub-grupo separados, o artigo será completamente excluido como em uma exclusão em bloco.</li>
</ul>
</li>
<li><strong>Em Bloco:</strong> Todo o conteúdo incluído no Dispositivo em edição será excluído.</li>
</ol>
</li>
</ol>
<li>A criação de Tipos de Dispositivos é dinâmica e deverão estar amarrados por perfis estuturais configuráveis. Por serem tarefas técnicas e complicadas, criar/editar tipos de dispositivos e perfis estuturais estão disponíveis apenas na área de edição técnica do SAPL (admin).
</li>
</ol>
{% endblocktrans %}
</div>

2
templates/compilacao/text_edit_bloco.html

@ -121,7 +121,7 @@
{% endif %}
<div class="bloco {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %} {{ dpt.tipo_dispositivo.class_css }}">
{% spaceless %}
<div class="de" id="id{{dpt.id}}" pk="{{dpt.pk}}" ordem="{{dpt.ordem}}" name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}<span class="semtexto">({{dpt.tipo_dispositivo}} sem texto)</span>{%else%}{{ dpt.texto|safe }}{%endif%}</div>
<div class="de" id="id{{dpt.id}}" pk="{{dpt.pk}}" ordem="{{dpt.ordem}}" name="{{dpt.pk}}" title="{{dpt.pk}} - {{dpt.ordem}}">{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}<span class="semtexto">({{dpt.tipo_dispositivo}} sem texto)</span>{%else%}{{ dpt.texto|safe }}{%endif%}</div>
{% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<a class="link_alterador" href="{% url 'compilacao:ta_text_edit' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}

4
templates/compilacao/text_list.html

@ -45,7 +45,7 @@
{% elif forloop.last %}
{% for dispositivo in values %}
<li class="{% if not view.inicio_vigencia%}active{% endif %}">
<a href="{%url 'compilacao:ta_text' dispositivo.ta_id %}" title="{% trans 'Compilação atual'%}.&#013;{% trans 'Vigência a partir de'%} {{dispositivo.inicio_vigencia}}&#013;{% if dispositivo.ta_publicado_id in ta_pub_list %}{{ ta_pub_list|lookup:dispositivo.ta_publicado_id }}{%else%}{{dispositivo.ta_publicado}}{%endif%}">{% trans 'Texto Atual'%}</a>
<a href="{%url 'compilacao:ta_text' dispositivo.ta_id %}" title="{% trans 'Compilação atual'%}.&#013;{% trans 'Vigência a partir de'%} {{dispositivo.inicio_vigencia}}&#013;{% if dispositivo.ta_publicado_id in ta_pub_list %}{{ ta_pub_list|lookup:dispositivo.ta_publicado_id }}{%else%}{%if dispositivo.ta_publicado %}{{dispositivo.ta_publicado}}{%else%}{{dispositivo.ta}}{%endif%}{%endif%}">{% trans 'Texto Atual'%}</a>
</li>
{% if forloop.parentloop.last %}
</ul>
@ -75,7 +75,7 @@
{% for dispositivo in values %}
<li>
{% if not forloop.parentloop.first %}
<a href="{%url 'compilacao:ta_vigencia' dispositivo.ta_id dispositivo|get_sign_vigencia %}" title="{% if dispositivo.ta_publicado_id in ta_pub_list%}{{ ta_pub_list|lookup:dispositivo.ta_publicado_id }}{%else%}{{dispositivo.ta_publicado}}{%endif%}">{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}</a>
<a href="{%url 'compilacao:ta_vigencia' dispositivo.ta_id dispositivo|get_sign_vigencia %}" title="{% if dispositivo.ta_publicado_id in ta_pub_list%}{{ ta_pub_list|lookup:dispositivo.ta_publicado_id }}{%else%}{%if dispositivo.ta_publicado %}{{dispositivo.ta_publicado}}{%else%}{{dispositivo.ta}}{%endif%}{%endif%}">{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}</a>
{% endif %}
</li>
{% endfor %}

Loading…
Cancel
Save