Browse Source

finish first simp. version of Dispositivo editor

pull/10/head
LeandroRoberto 9 years ago
parent
commit
ced41a513b
  1. 95
      compilacao/models.py
  2. 198
      compilacao/views.py
  3. 5
      static/js/compilacao.js
  4. 73
      static/styles/compilacao.scss
  5. 23
      templates/compilacao/edit_bloco.html
  6. 2
      templates/compilacao/edit_bloco_alteracao.html

95
compilacao/models.py

@ -527,17 +527,36 @@ class Dispositivo(BaseModel):
r += self.get_nomenclatura_completa()
else:
r += prefixo[1].strip()
r += self.get_nomenclatura_completa()
if local_insert:
r += prefixo[1].strip()
r += self.get_nomenclatura_completa()
else:
self.dispositivo0 = 1
r += prefixo[0]
r += self.get_nomenclatura_completa()
else:
if local_insert == 1 and irmaos_mesmo_tipo.count() == 1:
r += 'Transformar %s em %s%s e criar %s 2%s' % (
prefixo[1].strip(),
prefixo[0],
self.get_nomenclatura_completa(),
prefixo[0],
'º' if
self.tipo_dispositivo.rotulo_ordinal >= 0 else '',)
if Dispositivo.objects.filter(
ordem__gt=self.ordem,
ordem__lt=irmaos_mesmo_tipo[0].ordem).exists():
self.dispositivo0 = 2
r += 'Transformar %s em %s%s e criar %s1%s' % (
prefixo[1].strip(),
prefixo[0],
self.get_nomenclatura_completa(),
prefixo[0],
'º' if
self.tipo_dispositivo.rotulo_ordinal >= 0
else '',)
else:
r += 'Transformar %s em %s%s e criar %s 2%s' % (
prefixo[1].strip(),
prefixo[0],
self.get_nomenclatura_completa(),
prefixo[0],
'º' if
self.tipo_dispositivo.rotulo_ordinal >= 0 else '',)
else:
r += prefixo[0]
r += self.get_nomenclatura_completa()
@ -693,17 +712,13 @@ class Dispositivo(BaseModel):
return result
def criar_espaco(self, espaco_a_criar, local):
"""
-1 = Imediatamente antes
0 = Imediatamente Depois
1 = Depois - antes do proximo bloco do mesmo tipo"""
if local == 1:
if local == 'add_next':
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=self.ordem,
nivel__lte=self.nivel,
norma_id=self.norma_id)[:1]
elif local == 0:
elif local == 'add_in':
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=self.ordem,
nivel__lte=self.nivel + 1,
@ -764,19 +779,6 @@ class Dispositivo(BaseModel):
def get_parents_asc(self):
return self.get_parents(ordem='asc')
def recalcular_ordem(self):
pass
"""try:
dispositivos = Dispositivo.objects.order_by('-ordem').filter(
norma_id=self.norma_id)
except:
return
ordem = dispositivos.count() * 1000
for d in dispositivos:
d.ordem = ordem
d.save()
ordem -= 1000"""
def incrementar_irmaos(self, variacao=0, tipoadd=[]):
if not self.tipo_dispositivo.contagem_continua:
@ -840,13 +842,22 @@ class Dispositivo(BaseModel):
irmao.transform_in_next()
irmao.rotulo = irmao.rotulo_padrao()
irmaos_a_salvar.append(irmao)
elif irmao.get_numero_completo() == self.get_numero_completo():
irmao_numero = irmao.get_numero_completo()
irmao_numero[dp_profundidade] += 1
irmao.set_numero_completo(irmao_numero)
irmao.rotulo = irmao.rotulo_padrao()
irmaos_a_salvar.append(irmao)
else:
if dp_profundidade == irmao_profundidade and \
if dp_profundidade < irmao_profundidade and \
dp_profundidade > 0 and \
self.get_numero_completo()[:dp_profundidade] < \
irmao.get_numero_completo()[:dp_profundidade]:
self.get_numero_completo()[:dp_profundidade] >= \
irmao.get_numero_completo()[:dp_profundidade] and\
ultimo_irmao is None:
break
else:
ultimo_irmao = irmao
irmao_numero = irmao.get_numero_completo()
irmao_numero[dp_profundidade] += 1
irmao.set_numero_completo(irmao_numero)
@ -855,19 +866,19 @@ class Dispositivo(BaseModel):
irmaos_a_salvar.reverse()
for irmao in irmaos_a_salvar:
if (irmao.dispositivo0 == 0 or
if (irmao.dispositivo0 == 0 and
irmao.ordem <= self.ordem) and variacao == 0:
irmao.dispositivo0 = 1
irmao.rotulo = irmao.rotulo_padrao()
self.dispositivo0 = 2
self.rotulo = self.rotulo_padrao()
elif (irmao.dispositivo0 == 0 and
irmao.ordem > self.ordem) and variacao == 0:
irmao.dispositivo0 = 2
irmao.rotulo = irmao.rotulo_padrao()
self.dispositivo0 = 1
self.rotulo = self.rotulo_padrao()
if 'add_in' in tipoadd:
irmao.dispositivo0 = 2
irmao.rotulo = irmao.rotulo_padrao()
self.dispositivo0 = 1
self.rotulo = self.rotulo_padrao()
else:
irmao.dispositivo0 = 1
irmao.rotulo = irmao.rotulo_padrao()
self.dispositivo0 = 2
self.rotulo = self.rotulo_padrao()
irmao.clean()
irmao.save()

198
compilacao/views.py

@ -298,6 +298,7 @@ class CompilacaoEditView(CompilacaoView):
e.inicio_eficacia = norma.data_publicacao
e.timestamp = datetime.now()
e.texto = norma.ementa
e.dispositivo_pai = a
e.save()
a.pk = None
@ -329,7 +330,7 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
d.texto = texto
d.save()
return self.get(request, *args, **kwargs)
d.texto = texto
d.texto = texto.strip()
d.save()
if texto != '':
@ -410,6 +411,16 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
else:
base = Dispositivo.objects.get(pk=self.pk_add)
proximo_possivel = Dispositivo.objects.filter(
ordem__gt=base.ordem,
nivel__lte=base.nivel,
norma_id=base.norma_id)[:1]
if proximo_possivel.exists():
proximo_possivel = proximo_possivel[0]
else:
proximo_possivel = None
result = [{'tipo_insert': 'Inserir Depois',
'icone': '&#8631;&nbsp;',
'action': 'add_next',
@ -425,10 +436,10 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
]
# Possíveis inserções sequenciais já existentes
dps = base.get_parents()
dps.insert(0, base)
parents = base.get_parents()
parents.insert(0, base)
nivel = sys.maxsize
for dp in dps:
for dp in parents:
if dp.nivel >= nivel:
continue
@ -436,6 +447,15 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
if dp.is_relative_auto_insert():
continue
if proximo_possivel and \
dp.tipo_dispositivo != base.tipo_dispositivo and\
dp.nivel < proximo_possivel.nivel and\
not proximo_possivel.tipo_dispositivo.permitido_inserir_in(
dp.tipo_dispositivo):
if dp.tipo_dispositivo != proximo_possivel.tipo_dispositivo:
continue
nivel = dp.nivel
# um do mesmo para inserção antes
@ -445,7 +465,7 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
'tipo_pk': dp.tipo_dispositivo.pk,
'variacao': 0,
'provavel': '%s (%s)' % (
dp.rotulo_padrao(),
dp.rotulo_padrao(local_insert=1),
dp.tipo_dispositivo.nome,),
'dispositivo_base': base.pk})
@ -501,6 +521,9 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
for c in result[0]['itens']:
if c['class_css'] not in classes_ja_inseridas:
classes_ja_inseridas.append(c['class_css'])
for c in result[1]['itens']:
if c['class_css'] not in classes_ja_inseridas:
classes_ja_inseridas.append(c['class_css'])
otds = TipoDispositivo.objects.order_by(
'-contagem_continua', 'id').all().exclude(
class_css__in=classes_ja_inseridas)
@ -514,11 +537,41 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
base.tipo_dispositivo = td
if not paradentro:
if not td.permitido_inserir_in(
raiz.tipo_dispositivo, excluir_autos=True):
flag_insercao = False
for possivelpai in parents:
if td.permitido_inserir_in(
possivelpai.tipo_dispositivo,
excluir_autos=True):
flag_insercao = True
break
if not flag_insercao:
continue
if possivelpai.is_relative_auto_insert():
continue
Dispositivo.set_numero_for_add_in(base, base, td)
if proximo_possivel:
if proximo_possivel.nivel == base.nivel:
if proximo_possivel.tipo_dispositivo != td and\
not proximo_possivel.tipo_dispositivo.\
permitido_inserir_in(td):
continue
else:
if possivelpai.tipo_dispositivo != \
proximo_possivel.tipo_dispositivo and\
not proximo_possivel.tipo_dispositivo.\
permitido_inserir_in(
possivelpai.tipo_dispositivo) and \
possivelpai.nivel < \
proximo_possivel.nivel:
continue
base.dispositivo_pai = possivelpai
Dispositivo.set_numero_for_add_in(
possivelpai, base, td)
else:
Dispositivo.set_numero_for_add_in(base, base, td)
r = [{'class_css': td.class_css,
'tipo_pk': td.pk,
@ -535,18 +588,16 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
else:"""
result[1]['itens'] += r
else:
if td.pk < tipb.pk:
result[2]['itens'] += r
result[0]['itens'] += r
result[2]['itens'] += r
result[0]['itens'] += r
if len(result[0]['itens']) < len(result[1]['itens']):
r = result[0]
result.remove(result[0])
result.insert(1, r)
# if len(result[0]['itens']) < len(result[1]['itens']):
# r = result[0]
# result.remove(result[0])
# result.insert(1, r)
# remover temporariamente a opção inserir antes
# confirmar falta de necessidade
if len(result) > 2:
result.pop()
@ -573,55 +624,9 @@ class ActionsEditMixin(object):
pass
def add_in(self, context):
return self.add_next(context, local_add='add_in')
try:
# Tipo do dispositivo a ser inserido
tipo = TipoDispositivo.objects.get(pk=context['tipo_pk'])
base = Dispositivo.objects.get(pk=context['dispositivo_id'])
dp = Dispositivo.new_instance_based_on(base, tipo)
dp.nivel += 1
dp.dispositivo_pai = base
Dispositivo.set_numero_for_add_in(base, dp, tipo)
dp.rotulo = dp.rotulo_padrao()
if dp.tipo_dispositivo.class_css == 'artigo':
ordem = base.criar_espaco(espaco_a_criar=2, local=0)
else:
ordem = base.criar_espaco(espaco_a_criar=1, local=0)
dp.ordem = ordem
dp.incrementar_irmaos(tipoadd=['add_in'])
dp.clean()
dp.save()
# Inserção automática do caput para artigos
if dp.tipo_dispositivo.class_css == 'artigo':
tipocaput = TipoDispositivo.objects.filter(
class_css='caput')
dp.dispositivo_pai_id = dp.pk
dp.pk = None
dp.nivel += 1
dp.tipo_dispositivo = tipocaput[0]
dp.set_numero_completo([1, 0, 0, 0, 0, 0, ])
dp.rotulo = dp.rotulo_padrao()
dp.texto = ''
dp.ordem = ordem + Dispositivo.INTERVALO_ORDEM
dp.clean()
dp.save()
dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id)
except Exception as e:
print(e)
data = self.get_json_for_refresh(dp)
return data
def add_next(self, context):
def add_next(self, context, local_add='add_next'):
try:
base = Dispositivo.objects.get(pk=context['dispositivo_id'])
tipo = TipoDispositivo.objects.get(pk=context['tipo_pk'])
@ -645,7 +650,7 @@ class ActionsEditMixin(object):
count_auto_insert += 1
ordem = base.criar_espaco(
espaco_a_criar=1 + count_auto_insert, local=1)
espaco_a_criar=1 + count_auto_insert, local=local_add)
dp_irmao = None
dp_pai = None
@ -689,44 +694,31 @@ class ActionsEditMixin(object):
dp.rotulo = dp.rotulo_padrao()
dp.ordem = ordem
dp.incrementar_irmaos(variacao)
''' inserção sem precedente é feita sem variação
portanto, não é necessário usar transform_next() para
incrementar, e sim, apenas somar no atributo dispositivo0
dada a possibilidade de existir irmãos com viariação
# Incrementar irmãos
irmaos = Dispositivo.objects.order_by('-ordem').filter(
dispositivo_pai_id=dp.dispositivo_pai_id,
ordem__gt=dp.ordem,
tipo_dispositivo_id=tipo.pk)
for irmao in irmaos:
irmao.dispositivo0 += 1
irmao.rotulo = irmao.rotulo_padrao()
irmao.clean()
irmao.save()'''
dp.incrementar_irmaos(variacao, [local_add, ])
dp.clean()
dp.save()
# Inserção automática do caput para artigos
dp_auto_insert = None
# Inserção automática
if count_auto_insert:
tipocaput = TipoDispositivo.objects.filter(
class_css='caput')
dp.dispositivo_pai_id = dp.pk
dp.pk = None
dp_pk = dp.pk
dp.nivel += 1
dp.tipo_dispositivo = tipocaput[0]
dp.set_numero_completo([1, 0, 0, 0, 0, 0, ])
dp.rotulo = dp.rotulo_padrao()
dp.texto = ''
dp.ordem = ordem + Dispositivo.INTERVALO_ORDEM
dp.clean()
dp.save()
dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id)
for tipoauto in tipos_dp_auto_insert:
dp.dispositivo_pai_id = dp_pk
dp.pk = None
dp.tipo_dispositivo = tipoauto.filho_permitido
if ';' in dp.tipo_dispositivo.rotulo_prefixo_texto:
dp.set_numero_completo([0, 0, 0, 0, 0, 0, ])
else:
dp.set_numero_completo([1, 0, 0, 0, 0, 0, ])
dp.rotulo = dp.rotulo_padrao()
dp.texto = ''
dp.ordem = dp.ordem + Dispositivo.INTERVALO_ORDEM
dp.clean()
dp.save()
dp_auto_insert = dp
dp = Dispositivo.objects.get(pk=dp_pk)
''' Reenquadrar todos os dispositivos que possuem pai
antes da inserção atual e que são inferiores a dp,
@ -743,14 +735,15 @@ class ActionsEditMixin(object):
if filho.nivel > nivel:
continue
if filho.tipo_dispositivo_id <= dp.tipo_dispositivo_id:
break
if filho.dispositivo_pai.ordem >= dp.ordem:
continue
nivel = filho.nivel
if not filho.tipo_dispositivo.permitido_inserir_in(
dp.tipo_dispositivo):
continue
filho.dispositivo_pai = dp
filho.clean()
filho.save()
@ -853,7 +846,10 @@ class ActionsEditMixin(object):
except Exception as e:
print(e)
data = self.get_json_for_refresh(dp)
if dp_auto_insert is None:
data = self.get_json_for_refresh(dp)
else:
data = self.get_json_for_refresh(dp_auto_insert)
return data

5
static/js/compilacao.js

@ -89,6 +89,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
}
url = pk_refresh+'/refresh?pkadd='+pk_edit+url;
$("#message_block").css("display", "block");
}
else {
@ -119,7 +120,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
}
reloadFunctionClicks();
var _editortype = editortype;
if ( $('.edt-'+_editortype).length == 0) {
_editortype = 'construct';
@ -246,7 +247,7 @@ $(document).ready(function() {
editortype = ReadCookie("editortype")
if (editortype == null || editortype == "") {
editortype = "construct"
editortype = "textarea"
SetCookie("editortype", editortype, 30)
}

73
static/styles/compilacao.scss

@ -13,6 +13,7 @@ $color_actions_border: #CCC;
-webkit-border-radius: $radius;
-moz-border-radius: $radius;
-ms-border-radius: $radius;
-o-border-radius: $radius;
border-radius: $radius;
}
@ -274,7 +275,7 @@ $color_actions_border: #CCC;
@extend .cp;
margin-bottom: 30em;
margin-bottom: 15em;
margin-left: 0.8em;
a {
@ -355,6 +356,21 @@ $color_actions_border: #CCC;
display:block;
}
}
.bloco_alteracao {
@extend .articulacao;
margin: 0;
padding-top: 3em;
background: #ddd;
&::before {
content: "Bloco de Alteração";
position:absolute;
left: 0;
right: 0;
top: 0;
display: block;
}
}
.btns-action {
opacity: 0;
}
@ -365,7 +381,7 @@ $color_actions_border: #CCC;
border: 0px solid $color_actions_border;
margin: 1em -2em 1em -2.8em;
padding: 2.2em 2.2em 1.6em 2.2em;
box-shadow: -4px 18px 18px rgba(0, 0, 0, 0.19), 0px 6px 6px rgba(0, 0, 0, 0.23);
box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23);
@include background-top-down(#eaeaee, #ddd);
@ -391,6 +407,12 @@ $color_actions_border: #CCC;
}
.bloco_alteracao {
&::before {
display: none;
}
}
& > .bloco {
padding: 1em 0;
opacity: 1;
@ -440,7 +462,7 @@ $color_actions_border: #CCC;
display: table-cell;
vertical-align: top;
&:hover {
background-color: rgba(0,0,0,0.1);
background-color: rgba(0,0,0,0.08);
& > a {
text-shadow: 0 0 5px #777;
color: #ff0;
@ -477,6 +499,9 @@ $color_actions_border: #CCC;
div {
padding: 0 0.4em;
font-stretch: condensed;
font-variant: small-caps;
font-weight: bold;
text-shadow: 0 0 10px #fff;
}
& > li {
&:hover a{
@ -558,7 +583,7 @@ $color_actions_border: #CCC;
& > a {
@include background-top-down(#3498DB, #2980C9);
border-right: 1px solid #fff;
padding: 0.3em;
padding: 0.2em;
display: block;
color: white;
text-align: center;
@ -591,6 +616,7 @@ $color_actions_border: #CCC;
height: 100%;
width: 2em;
}
} /* btn-excluir */
&.btn-salvar {
@ -625,7 +651,7 @@ $color_actions_border: #CCC;
color: white;
background: #2980C9;
font-size: 80%;
padding: 0.33em 1em;
padding: 0.23em 1em;
&:hover {
background: #0a5ea4;
}
@ -637,6 +663,28 @@ $color_actions_border: #CCC;
@include li_flutuante();
display: block;
}
&.opc_excluir {
@include li_flutuante();
display: block;
& > ul {
li {
a {
background-color: #A70808;
&:hover {
background: #c70808;
}
}
}
&::before {
border-color: transparent transparent #A70808;
}
}
}
}
} /* actions_inserts */
@ -695,9 +743,8 @@ $color_actions_border: #CCC;
.clear {
clear:both;
}
.mce-container {
border-color: #ccc !important;
.mce-panel {
border: 0px solid #ccc !important;
}
.mce-btn button:hover {
background-color: rgba(0,0,0,0.1) !important;
@ -774,6 +821,16 @@ $color_actions_border: #CCC;
left: auto;
}
}
&.opc_excluir > ul {
left: 30% !important;
right: 0 !important;
margin-left: 0;
margin-right: 0.5em;
&::before {
right: 35%;
left: auto;
}
}
}
}
}

23
templates/compilacao/edit_bloco.html

@ -57,8 +57,19 @@
{% endfor %}
{%endif%}
<li><a href="#" class="btn-excluir">&nbsp;<span>Excluir</span></a></li>
<li><a onclick="onSubmitEditForm()" class="btn-salvar">&nbsp<span>Salvar</span></a></li>
<li class="opc_excluir"><a class="btn-excluir">&nbsp;<span>Excluir</span></a>
<ul>
<li><a href="#" class="btn-excluir">&nbsp;<span>Excluir apenas este dispositivo</span></a></li>
<li><a href="#" class="btn-excluir">&nbsp;<span>Excluir toda a estrutura deste dispositivo</span></a></li>
</ul>
</li>
<li><a onclick="onSubmitEditForm()" class="btn-salvar">&nbsp<span>Salvar</span></a></li>
</ul>
<div class="fields">
@ -93,13 +104,9 @@
<div class="bloco {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %} {{ dpt.tipo_dispositivo.class_css }}">
{% spaceless %}
<a 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%}
</a>
<a 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%}</a>
{% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<a class="link_alterador" href="{%url 'compilacao' dpt.norma_publicada.pk %}#{{dpt.dispositivo_atualizador_id}}">
<a class="link_alterador" href="{%url 'comp_edit' dpt.norma_publicada.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica dpt %}
{{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}

2
templates/compilacao/edit_bloco_alteracao.html

@ -3,7 +3,7 @@
{% spaceless %}
<div class="dpt" id="d{{ch.id}}">
<div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}">
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{ch.pk}}" href="{%url 'compilacao' ch.norma.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{ch.pk}}" href="{%url 'comp_edit' ch.norma.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
</div>
</div>
{% endspaceless %}

Loading…
Cancel
Save