Browse Source

add internal inclusion options for Dispositivo

pull/10/head
LeandroRoberto 9 years ago
parent
commit
33731f76dc
  1. 30
      compilacao/migrations/0010_auto_20151105_1532.py
  2. 27
      compilacao/migrations/0011_auto_20151105_1540.py
  3. 34
      compilacao/migrations/0012_auto_20151105_1658.py
  4. 24
      compilacao/migrations/0013_auto_20151106_1843.py
  5. 328
      compilacao/models.py
  6. 524
      compilacao/views.py
  7. 399
      static/js/compilacao.js
  8. 18
      static/styles/compilacao.scss
  9. 19
      templates/compilacao/edit_bloco.html

30
compilacao/migrations/0010_auto_20151105_1532.py

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0009_auto_20151007_1635'),
]
operations = [
migrations.CreateModel(
name='TipoDispositivoRelationship',
fields=[
('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
('filho_permitido', models.ForeignKey(related_name='filho_permitido', to='compilacao.TipoDispositivo')),
('pai', models.ForeignKey(related_name='pai', to='compilacao.TipoDispositivo')),
],
options={
'abstract': False,
},
),
migrations.AddField(
model_name='tipodispositivo',
name='relacoes_diretas_pai_filho',
field=models.ManyToManyField(related_name='filhos_permitidos', through='compilacao.TipoDispositivoRelationship', to='compilacao.TipoDispositivo'),
),
]

27
compilacao/migrations/0011_auto_20151105_1540.py

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0010_auto_20151105_1532'),
]
operations = [
migrations.AlterModelOptions(
name='tipodispositivorelationship',
options={'verbose_name': 'Relação Direta Permitida', 'verbose_name_plural': 'Relaçõe Diretas Permitidas', 'ordering': ['pai', 'filho_permitido']},
),
migrations.AlterField(
model_name='tipodispositivorelationship',
name='filho_permitido',
field=models.ForeignKey(null=True, to='compilacao.TipoDispositivo', blank=True, default=None, related_name='filho_permitido'),
),
migrations.AlterUniqueTogether(
name='tipodispositivorelationship',
unique_together=set([('pai', 'filho_permitido')]),
),
]

34
compilacao/migrations/0012_auto_20151105_1658.py

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0011_auto_20151105_1540'),
]
operations = [
migrations.AddField(
model_name='tipodispositivorelationship',
name='filho_de_insercao_automatica',
field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Filho de Inserção Automática'),
),
migrations.AlterField(
model_name='tipodispositivo',
name='relacoes_diretas_pai_filho',
field=models.ManyToManyField(to='compilacao.TipoDispositivo', related_name='possiveis_pais', through='compilacao.TipoDispositivoRelationship'),
),
migrations.AlterField(
model_name='tipodispositivorelationship',
name='filho_permitido',
field=models.ForeignKey(blank=True, default=None, null=True, related_name='pais', to='compilacao.TipoDispositivo'),
),
migrations.AlterField(
model_name='tipodispositivorelationship',
name='pai',
field=models.ForeignKey(to='compilacao.TipoDispositivo', related_name='filhos_permitidos'),
),
]

24
compilacao/migrations/0013_auto_20151106_1843.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0012_auto_20151105_1658'),
]
operations = [
migrations.AlterField(
model_name='tipodispositivo',
name='relacoes_diretas_pai_filho',
field=models.ManyToManyField(to='compilacao.TipoDispositivo', related_name='_relacoes_diretas_pai_filho_+', through='compilacao.TipoDispositivoRelationship'),
),
migrations.AlterField(
model_name='tipodispositivorelationship',
name='filho_permitido',
field=models.ForeignKey(null=True, blank=True, related_name='possiveis_pais', to='compilacao.TipoDispositivo', default=None),
),
]

328
compilacao/models.py

@ -2,7 +2,7 @@ from datetime import datetime
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
from django.db.models import F from django.db.models import F, Q
from django.db.models.aggregates import Max from django.db.models.aggregates import Max
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -75,7 +75,7 @@ class TipoVide(models.Model):
return '%s: %s' % (self.sigla, self.nome) return '%s: %s' % (self.sigla, self.nome)
class TipoDispositivo(models.Model): class TipoDispositivo(BaseModel):
""" """
- ids fazem parte da lógica do desenvolvimento quanto a - ids fazem parte da lógica do desenvolvimento quanto a
simulação de hierarquia simulação de hierarquia
@ -237,6 +237,13 @@ class TipoDispositivo(models.Model):
default=FNC1, default=FNC1,
verbose_name=_('Formato da Variação 5')) verbose_name=_('Formato da Variação 5'))
relacoes_diretas_pai_filho = models.ManyToManyField(
'self',
through='TipoDispositivoRelationship',
through_fields=('pai', 'filho_permitido'),
symmetrical=False,
related_name='+')
class Meta: class Meta:
verbose_name = _('Tipo de Dispositivo') verbose_name = _('Tipo de Dispositivo')
verbose_name_plural = _('Tipos de Dispositivo') verbose_name_plural = _('Tipos de Dispositivo')
@ -245,6 +252,38 @@ class TipoDispositivo(models.Model):
def __str__(self): def __str__(self):
return self.nome return self.nome
def permitido_inserir_in(self, base, excluir_autos=False):
pp = self.possiveis_pais.filter(pai=base)
if pp.exists():
if excluir_autos:
if pp[0].filho_de_insercao_automatica:
return False
return True
return False
class TipoDispositivoRelationship(BaseModel):
pai = models.ForeignKey(TipoDispositivo, related_name='filhos_permitidos')
filho_permitido = models.ForeignKey(
TipoDispositivo,
blank=True, null=True, default=None,
related_name='possiveis_pais')
filho_de_insercao_automatica = models.BooleanField(
default=False,
choices=YES_NO_CHOICES, verbose_name=_('Filho de Inserção Automática'))
class Meta:
verbose_name = _('Relação Direta Permitida')
verbose_name_plural = _('Relaçõe Diretas Permitidas')
ordering = ['pai', 'filho_permitido']
unique_together = (
('pai', 'filho_permitido',),)
def __str__(self):
return '%s - %s' % (
self.pai.nome,
self.filho_permitido.nome if self.filho_permitido else '')
class TipoPublicacao(models.Model): class TipoPublicacao(models.Model):
sigla = models.CharField( sigla = models.CharField(
@ -445,65 +484,65 @@ class Dispositivo(BaseModel):
'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo), 'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo),
'norma': self.norma} 'norma': self.norma}
def rotulo_padrao(self, for_insertion=False, def rotulo_padrao(self, local_insert=0, for_insert_in=0):
d_base_for_insertion=None, """
insert_next=False): 0 = Sem inserção - com nomeclatura padrao
1 = Inserção com transformação de parágrafo único para §1º """
r = '' r = ''
t = self.tipo_dispositivo t = self.tipo_dispositivo
prefixo = t.rotulo_prefixo_texto.split(';') prefixo = t.rotulo_prefixo_texto.split(';')
if len(prefixo) > 1: if len(prefixo) > 1:
if (for_insertion and if for_insert_in:
d_base_for_insertion is not None and irmaos_mesmo_tipo = Dispositivo.objects.filter(
d_base_for_insertion.pk != self.pk and
d_base_for_insertion.tipo_dispositivo.pk <= t.pk) or \
for_insertion and d_base_for_insertion is None:
count_irmaos_mesmo_tipo = Dispositivo.objects.filter(
tipo_dispositivo=self.tipo_dispositivo, tipo_dispositivo=self.tipo_dispositivo,
dispositivo_pai=self).count() dispositivo_pai=self)
else: else:
count_irmaos_mesmo_tipo = Dispositivo.objects.filter( irmaos_mesmo_tipo = Dispositivo.objects.filter(
tipo_dispositivo=self.tipo_dispositivo, tipo_dispositivo=self.tipo_dispositivo,
dispositivo_pai=self.dispositivo_pai).count() dispositivo_pai=self.dispositivo_pai)
if count_irmaos_mesmo_tipo > 1 or ( if not irmaos_mesmo_tipo.exists():
self.dispositivo0 != 0 and not for_insertion): r += prefixo[1]
r += prefixo[0] else:
r += self.get_nomenclatura_completa() if self.dispositivo0 == 0:
elif count_irmaos_mesmo_tipo == 1 and for_insertion: if for_insert_in:
numero = self.get_numero_completo() if irmaos_mesmo_tipo.count() == 0:
r += prefixo[0]
if not insert_next: r += self.get_nomenclatura_completa()
self.transform_in_next() elif irmaos_mesmo_tipo.count() == 1:
self.transform_in_next() self.transform_in_next()
r += 'Transformar %s em %s%s e criar %s 1%s' % ( self.transform_in_next()
prefixo[1].strip(), r += 'Transformar %s em %s%s e criar %s1%s' % (
prefixo[0], prefixo[1].strip(),
self.get_nomenclatura_completa(), prefixo[0],
prefixo[0], self.get_nomenclatura_completa(),
'º' if prefixo[0],
self.tipo_dispositivo.rotulo_ordinal >= 0 else '',) 'º' if
self.tipo_dispositivo.rotulo_ordinal >= 0
else '',)
else:
self.dispositivo0 = 1
r += prefixo[0]
r += self.get_nomenclatura_completa()
else:
r += prefixo[1].strip()
r += self.get_nomenclatura_completa()
else: else:
if numero[0] != 0: if local_insert == 1 and irmaos_mesmo_tipo.count() == 1:
self.transform_in_next() r += 'Transformar %s em %s%s e criar %s 2%s' % (
r += 'Transformar %s em %s 1%s e criar %s%s' % (
prefixo[1].strip(), prefixo[1].strip(),
prefixo[0], prefixo[0],
'º' if self.get_nomenclatura_completa(),
self.tipo_dispositivo.rotulo_ordinal >= 0 else '',
prefixo[0], prefixo[0],
self.get_nomenclatura_completa()) 'º' if
self.tipo_dispositivo.rotulo_ordinal >= 0 else '',)
else: else:
r += '%s%s' % ( r += prefixo[0]
prefixo[1].strip(), r += self.get_nomenclatura_completa()
self.get_nomenclatura_completa())
self.set_numero_completo(numero)
else:
r += prefixo[1].strip() + self.get_nomenclatura_completa()
else: else:
r += prefixo[0] r += prefixo[0]
r += self.get_nomenclatura_completa() r += self.get_nomenclatura_completa()
@ -655,18 +694,34 @@ class Dispositivo(BaseModel):
return result return result
def criar_espaco_apos(self, espaco_a_criar): def criar_espaco(self, espaco_a_criar, local):
"""
proximo_bloco = Dispositivo.objects.filter( -1 = Imediatamente antes
ordem__gt=self.ordem, 0 = Imediatamente Depois
nivel__lte=self.nivel, 1 = Depois - antes do proximo bloco do mesmo tipo"""
norma_id=self.norma_id)[:1]
if local == 1:
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=self.ordem,
nivel__lte=self.nivel,
norma_id=self.norma_id)[:1]
elif local == 0:
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=self.ordem,
nivel__lte=self.nivel + 1,
norma_id=self.norma_id).exclude(
tipo_dispositivo__class_css='caput')[:1]
else:
proximo_bloco = Dispositivo.objects.filter(
ordem__gte=self.ordem,
norma_id=self.norma_id)[:1]
if proximo_bloco.count() != 0: if proximo_bloco.exists():
ordem = proximo_bloco[0].ordem ordem = proximo_bloco[0].ordem
proximo_bloco = Dispositivo.objects.order_by('-ordem').filter( proximo_bloco = Dispositivo.objects.order_by('-ordem').filter(
ordem__gte=ordem, ordem__gte=ordem,
norma_id=self.norma_id) norma_id=self.norma_id)
proximo_bloco.update(ordem=F('ordem') + 1) proximo_bloco.update(ordem=F('ordem') + 1)
proximo_bloco.update( proximo_bloco.update(
ordem=F('ordem') + ( ordem=F('ordem') + (
@ -712,7 +767,8 @@ class Dispositivo(BaseModel):
return self.get_parents(ordem='asc') return self.get_parents(ordem='asc')
def recalcular_ordem(self): def recalcular_ordem(self):
try: pass
"""try:
dispositivos = Dispositivo.objects.order_by('-ordem').filter( dispositivos = Dispositivo.objects.order_by('-ordem').filter(
norma_id=self.norma_id) norma_id=self.norma_id)
except: except:
@ -721,7 +777,131 @@ class Dispositivo(BaseModel):
for d in dispositivos: for d in dispositivos:
d.ordem = ordem d.ordem = ordem
d.save() d.save()
ordem -= 1000 ordem -= 1000"""
def incrementar_irmaos(self, variacao=0, tipo=[]):
if not self.tipo_dispositivo.contagem_continua:
irmaos = list(Dispositivo.objects.filter(
Q(ordem__gt=self.ordem) | Q(dispositivo0=0),
dispositivo_pai_id=self.dispositivo_pai_id,
tipo_dispositivo_id=self.tipo_dispositivo.pk))
elif self.tipo_dispositivo.class_css == 'articulacao':
irmaos = list(Dispositivo.objects.filter(
ordem__gt=self.ordem,
norma_id=self.norma_id,
tipo_dispositivo_id=self.tipo_dispositivo.pk))
else: # contagem continua restrita a articulacao
proxima_articulacao = self.get_proxima_articulacao()
if proxima_articulacao is None:
irmaos = list(Dispositivo.objects.filter(
ordem__gt=self.ordem,
norma_id=self.norma_id,
tipo_dispositivo_id=self.tipo_dispositivo.pk))
else:
irmaos = list(Dispositivo.objects.filter(
Q(ordem__gt=self.ordem) &
Q(ordem__lt=proxima_articulacao.ordem),
norma_id=self.norma_id,
tipo_dispositivo_id=self.tipo_dispositivo.pk))
dp_profundidade = self.get_profundidade()
irmaos_a_salvar = []
ultimo_irmao = None
for irmao in irmaos:
if irmao.ordem <= self.ordem or irmao.dispositivo0 == 0:
irmaos_a_salvar.append(irmao)
continue
irmao_profundidade = irmao.get_profundidade()
if irmao_profundidade < dp_profundidade:
break
if irmao.get_numero_completo() < self.get_numero_completo():
if irmao_profundidade > dp_profundidade:
if ultimo_irmao is None:
irmao.transform_in_next(
dp_profundidade - irmao_profundidade)
irmao.transform_in_next(
irmao_profundidade - dp_profundidade)
else:
irmao.set_numero_completo(
ultimo_irmao.get_numero_completo())
irmao.transform_in_next(
irmao_profundidade -
ultimo_irmao.get_profundidade())
ultimo_irmao = irmao
else:
irmao.transform_in_next()
irmao.rotulo = irmao.rotulo_padrao()
irmaos_a_salvar.append(irmao)
else:
if dp_profundidade == irmao_profundidade and \
dp_profundidade > 0 and \
self.get_numero_completo()[:dp_profundidade] < \
irmao.get_numero_completo()[:dp_profundidade]:
break
else:
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)
irmaos_a_salvar.reverse()
for irmao in irmaos_a_salvar:
if (irmao.dispositivo0 == 0 or
irmao.ordem <= self.ordem) and variacao == 0:
if 'add_in' in tipo:
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()
def get_proxima_articulacao(self):
proxima_articulacao = Dispositivo.objects.filter(
ordem__gt=self.ordem,
nivel=0,
norma_id=self.norma_id)[:1]
if not proxima_articulacao.exists():
return None
return proxima_articulacao[0]
def is_relative_auto_insert(self):
if self.dispositivo_pai is not None:
# pp possiveis_pais
pp = self.tipo_dispositivo.possiveis_pais.filter(
pai=self.dispositivo_pai.tipo_dispositivo)
if pp.exists():
if pp[0].filho_de_insercao_automatica:
return True
return False
def get_raiz(self):
raiz = self.get_parents_asc()
if len(raiz) > 0:
raiz = raiz[0]
else:
raiz = self
return raiz
@staticmethod @staticmethod
def init_with_base(dispositivo_base, tipo_base): def init_with_base(dispositivo_base, tipo_base):
@ -739,9 +919,45 @@ class Dispositivo(BaseModel):
dp.inicio_vigencia = dispositivo_base.inicio_vigencia dp.inicio_vigencia = dispositivo_base.inicio_vigencia
dp.publicacao = dispositivo_base.publicacao dp.publicacao = dispositivo_base.publicacao
dp.timestamp = datetime.now() dp.timestamp = datetime.now()
dp.ordem = dispositivo_base.ordem
return dp return dp
@staticmethod
def set_numero_for_add_in(dispositivo_base, dispositivo, tipo_base):
if tipo_base.contagem_continua:
raiz = dispositivo_base.get_raiz()
disps = Dispositivo.objects.order_by('-ordem').filter(
tipo_dispositivo_id=tipo_base.pk,
ordem__lte=dispositivo_base.ordem,
ordem__gt=raiz.ordem,
norma_id=dispositivo_base.norma_id)[:1]
if disps.exists():
dispositivo.set_numero_completo(
disps[0].get_numero_completo())
dispositivo.transform_in_next()
else:
dispositivo.set_numero_completo([1, 0, 0, 0, 0, 0, ])
else:
if ';' in tipo_base.rotulo_prefixo_texto:
if dispositivo != dispositivo_base:
irmaos_mesmo_tipo = Dispositivo.objects.filter(
tipo_dispositivo=tipo_base,
dispositivo_pai=dispositivo_base)
dispositivo.set_numero_completo([
1 if irmaos_mesmo_tipo.exists() else 0,
0, 0, 0, 0, 0, ])
else:
dispositivo.set_numero_completo([0, 0, 0, 0, 0, 0, ])
else:
dispositivo.set_numero_completo([1, 0, 0, 0, 0, 0, ])
class Vide(models.Model): class Vide(models.Model):
data_criacao = models.DateTimeField(verbose_name=_('Data de Criação')) data_criacao = models.DateTimeField(verbose_name=_('Data de Criação'))

524
compilacao/views.py

@ -2,10 +2,8 @@ from collections import OrderedDict
from datetime import datetime, timedelta from datetime import datetime, timedelta
from os.path import sys from os.path import sys
from django import forms
from django.core.signing import Signer from django.core.signing import Signer
from django.db.models import Q from django.db.models import Q
from django.db.models.aggregates import Max
from django.http.response import JsonResponse from django.http.response import JsonResponse
from django.utils.dateparse import parse_date from django.utils.dateparse import parse_date
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -313,13 +311,8 @@ class CompilacaoEditView(CompilacaoView):
return result return result
class DispositivoSimpleEditForm(forms.Form):
texto = forms.CharField(required=False, widget=forms.Textarea)
class DispositivoEditView(CompilacaoEditView, FormMixin): class DispositivoEditView(CompilacaoEditView, FormMixin):
template_name = 'compilacao/edit_bloco.html' template_name = 'compilacao/edit_bloco.html'
form_class = DispositivoSimpleEditForm
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
@ -327,10 +320,37 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
pk=self.kwargs['dispositivo_id']) pk=self.kwargs['dispositivo_id'])
texto = request.POST['texto'] texto = request.POST['texto']
if d.texto != '':
d.texto = texto
d.save()
return self.get(request, *args, **kwargs)
d.texto = texto d.texto = texto
d.save() d.save()
return self.get(request, *args, **kwargs) if texto != '':
dnext = Dispositivo.objects.filter(
norma_id=d.norma_id,
ordem__gt=d.ordem,
texto='',
tipo_dispositivo__dispositivo_de_articulacao=False)[:1]
if not dnext.exists():
return self.get(request, *args, **kwargs)
if dnext[0].nivel > d.nivel:
pais = [d.pk, ]
else:
if dnext[0].dispositivo_pai_id == d.dispositivo_pai_id:
pais = [dnext[0].dispositivo_pai_id, ]
else:
pais = [
dnext[0].dispositivo_pai_id, d.dispositivo_pai_id, ]
data = {'pk': dnext[0].pk, 'pai': pais}
else:
data = {'pk': d.pk, 'pai': [d.pk, ]}
return JsonResponse(data, safe=False)
def get_queryset(self): def get_queryset(self):
self.flag_alteradora = -1 self.flag_alteradora = -1
@ -379,183 +399,159 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
def select_provaveis_inserts(self): def select_provaveis_inserts(self):
# Não salvar d_base try:
if self.pk_add == 0: # Não salvar d_base
d_base = Dispositivo.objects.get(pk=self.pk_view) if self.pk_add == 0:
else: base = Dispositivo.objects.get(pk=self.pk_view)
d_base = Dispositivo.objects.get(pk=self.pk_add) else:
base = Dispositivo.objects.get(pk=self.pk_add)
result = [{'tipo_insert': 'Inserir Depois',
'icone': '&#8631;&nbsp;', result = [{'tipo_insert': 'Inserir Depois',
'action': 'add_next', 'icone': '&#8631;&nbsp;',
'itens': []}, 'action': 'add_next',
{'tipo_insert': 'Inserir Dentro', 'itens': []},
'icone': '&#8690;&nbsp;', {'tipo_insert': 'Inserir Dentro',
'action': 'add_in', 'icone': '&#8690;&nbsp;',
'itens': []}, 'action': 'add_in',
{'tipo_insert': 'Inserir Antes', 'itens': []},
'icone': '&#8630;&nbsp;', {'tipo_insert': 'Inserir Antes',
'action': 'add_prior', 'icone': '&#8630;&nbsp;',
'itens': []} 'action': 'add_prior',
] 'itens': []}
]
disps = Dispositivo.objects.order_by(
'-ordem').filter( # Possíveis inserções sequenciais já existentes
ordem__lte=d_base.ordem, dps = base.get_parents()
norma_id=d_base.norma_id) dps.insert(0, base)
nivel = sys.maxsize
nivel = sys.maxsize for dp in dps:
for d in disps:
if d.nivel >= nivel:
continue
if d.tipo_dispositivo.class_css == 'caput':
continue
nivel = d.nivel if dp.nivel >= nivel:
continue
r = []
if d == d_base:
result[2]['itens'].append({
'class_css': d.tipo_dispositivo.class_css,
'tipo_pk': d.pk,
'variacao': 0,
'provavel': '%s (%s)' % (
d.rotulo_padrao(True, d, False),
d.tipo_dispositivo.nome,),
'dispositivo_base': d_base.pk})
flag_direcao = 1
flag_variacao = 0
while True:
# rt resultado da transformacao
rt = d.transform_in_next(flag_direcao)
if not rt[0]:
break
flag_variacao += rt[1]
r.append({'class_css': d.tipo_dispositivo.class_css,
'tipo_pk': d.tipo_dispositivo.pk,
'variacao': flag_variacao,
'provavel': '%s (%s)' % (
d.rotulo_padrao(
True, d_base, True),
d.tipo_dispositivo.nome,),
'dispositivo_base': d_base.pk})
flag_direcao = -1 if dp.is_relative_auto_insert():
continue
r.reverse() nivel = dp.nivel
# um do mesmo para inserção antes
if dp == base:
result[2]['itens'].append({
'class_css': dp.tipo_dispositivo.class_css,
'tipo_pk': dp.tipo_dispositivo.pk,
'variacao': 0,
'provavel': '%s (%s)' % (
dp.rotulo_padrao(),
dp.tipo_dispositivo.nome,),
'dispositivo_base': base.pk})
r = []
flag_direcao = 1
flag_variacao = 0
while True:
if dp.dispositivo0 == 0:
local_insert = 1
else:
local_insert = 0
if len(r) > 0 and d.tipo_dispositivo.class_css == 'articulacao': rt = dp.transform_in_next(flag_direcao)
r = [r[0], ] if not rt[0]:
break
flag_variacao += rt[1]
r.append({'class_css': dp.tipo_dispositivo.class_css,
'tipo_pk': dp.tipo_dispositivo.pk,
'variacao': flag_variacao,
'provavel': '%s (%s)' % (
dp.rotulo_padrao(local_insert),
dp.tipo_dispositivo.nome,),
'dispositivo_base': base.pk})
flag_direcao = -1
r.reverse()
if len(r) > 0 and dp.tipo_dispositivo.class_css in [
'articulacao', 'ementa']:
r = [r[0], ]
if dp.tipo_dispositivo == base.tipo_dispositivo:
result[0]['itens'] += r
else:
result[0]['itens'] += r
result[2]['itens'] += r
if d.tipo_dispositivo == d_base.tipo_dispositivo: if nivel == 0:
result[0]['itens'] += r break
else:
result[0]['itens'] += r
result[2]['itens'] += r
if nivel == 0: # tipo do dispositivo base
break tipb = base.tipo_dispositivo
raiz = base.get_raiz()
# tipo do dispositivo base for paradentro in [1, 0]:
tipb = d_base.tipo_dispositivo if paradentro:
# Outros Tipos de Dispositivos PARA DENTRO
otds = TipoDispositivo.objects.order_by(
'-contagem_continua', 'id').all()
else:
# Outros Tipos de Dispositivos PARA FORA
classes_ja_inseridas = []
for c in result[0]['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)
for td in otds:
if paradentro and not td.permitido_inserir_in(
tipb, excluir_autos=True):
continue
for mudarnivel in [1, 0]: base.tipo_dispositivo = td
if mudarnivel:
# Outros Tipos de Dispositivos PARA DENTRO
otds = TipoDispositivo.objects.order_by(
'-contagem_continua', 'id').filter(
Q(id__gt=100) & Q(id__gt=d_base.tipo_dispositivo_id))
else:
# Outros Tipos de Dispositivos PARA FORA
classes_ja_inseridas = []
for c in result[0]['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').filter(
id__gt=100,
id__lt=d_base.tipo_dispositivo_id).exclude(
class_css__in=classes_ja_inseridas)
for td in otds:
if td.class_css == 'caput':
continue
d_base.tipo_dispositivo = td if not paradentro:
if not td.permitido_inserir_in(
raiz.tipo_dispositivo, excluir_autos=True):
continue
if td.contagem_continua: Dispositivo.set_numero_for_add_in(base, base, td)
disps = Dispositivo.objects.filter(
tipo_dispositivo_id=td.pk,
ordem__lte=d_base.ordem,
norma_id=d_base.norma_id).aggregate(
Max('dispositivo0'),
Max('dispositivo1'),
Max('dispositivo2'),
Max('dispositivo3'),
Max('dispositivo4'),
Max('dispositivo5'))
else: r = [{'class_css': td.class_css,
disps = Dispositivo.objects.filter( 'tipo_pk': td.pk,
tipo_dispositivo_id=td.pk, 'variacao': 0,
dispositivo_pai_id=d_base.pk).aggregate( 'provavel': '%s (%s)' % (
Max('dispositivo0'), base.rotulo_padrao(1, paradentro),
Max('dispositivo1'), td.nome,),
Max('dispositivo2'), 'dispositivo_base': base.pk}]
Max('dispositivo3'),
Max('dispositivo4'), if paradentro == 1:
Max('dispositivo5')) if (tipb.class_css == 'caput' and
td.class_css == 'paragrafo'):
if disps['dispositivo0__max'] is not None: result[0]['itens'].insert(0, r[0])
d_base.set_numero_completo([ else:
disps['dispositivo0__max'], result[1]['itens'] += r
disps['dispositivo1__max'],
disps['dispositivo2__max'],
disps['dispositivo3__max'],
disps['dispositivo4__max'],
disps['dispositivo5__max'],
])
d_base.transform_in_next()
else:
if ';' in td.rotulo_prefixo_texto:
d_base.set_numero_completo([0, 0, 0, 0, 0, 0, ])
else:
d_base.set_numero_completo([1, 0, 0, 0, 0, 0, ])
r = [{'class_css': td.class_css,
'tipo_pk': td.pk,
'variacao': 0,
'provavel': '%s (%s)' % (
d_base.rotulo_padrao(True, None, True),
td.nome,),
'dispositivo_base': d_base.pk}]
if mudarnivel == 1:
if (tipb.class_css == 'caput' and
td.class_css == 'paragrafo'):
result[0]['itens'].insert(0, r[0])
else: else:
result[1]['itens'] += r if td.pk < tipb.pk:
else: result[2]['itens'] += r
if td.pk < tipb.pk: result[0]['itens'] += r
result[2]['itens'] += r
result[0]['itens'] += r
if tipb.class_css == 'caput': if tipb.class_css == 'caput':
result.pop() result.pop()
# result.remove(result[0])
# retira inserir após e inserir antes # retira inserir após e inserir antes
if tipb.class_css == 'articulacao': if tipb.class_css == 'articulacao':
r = result[0] r = result[0]
result.remove(result[0]) result.remove(result[0])
result.insert(1, r) result.insert(1, r)
# remover temporariamente a opção inserir antes
# confirmar falta de necessidade
if len(result) > 2:
result.pop()
except Exception as e:
print(e)
return result return result
@ -577,13 +573,53 @@ class ActionsEditMixin(object):
pass pass
def add_in(self, context): def add_in(self, context):
# pai = Dispositivo.objects.get(pk=context['dispositivo_id'])
# dp = Dispositivo.objects.get(pk=context['dispositivo_id'])
# Tipo Filho try:
# tf = TipoDispositivo.objects.get(pk=context['tipo_pk']) # Tipo do dispositivo a ser inserido
print("aqui") tipo = TipoDispositivo.objects.get(pk=context['tipo_pk'])
return {}
base = Dispositivo.objects.get(pk=context['dispositivo_id'])
dp = Dispositivo.init_with_base(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(tipo=['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):
try: try:
@ -608,95 +644,15 @@ class ActionsEditMixin(object):
dp.rotulo = dp.rotulo_padrao() dp.rotulo = dp.rotulo_padrao()
if dp.tipo_dispositivo.class_css == 'artigo': if dp.tipo_dispositivo.class_css == 'artigo':
ordem = base.criar_espaco_apos(espaco_a_criar=2) ordem = base.criar_espaco(espaco_a_criar=2, local=1)
else: else:
ordem = base.criar_espaco_apos(espaco_a_criar=1) ordem = base.criar_espaco(espaco_a_criar=1, local=1)
dp.ordem = ordem dp.ordem = ordem
# Incrementar irmãos # Incrementar irmãos
if not tipo.contagem_continua: dp.incrementar_irmaos(variacao)
irmaos = list(Dispositivo.objects.filter(
Q(ordem__gt=dp.ordem) | Q(dispositivo0=0),
dispositivo_pai_id=dp.dispositivo_pai_id,
tipo_dispositivo_id=tipo.pk))
elif tipo.class_css == 'articulacao':
irmaos = list(Dispositivo.objects.filter(
ordem__gt=dp.ordem,
norma_id=dp.norma_id,
tipo_dispositivo_id=tipo.pk))
else: # contagem continua restrita a articulacao
proxima_articulacao = Dispositivo.objects.filter(
ordem__gt=dp.ordem,
nivel=0,
norma_id=dp.norma_id)[:1]
if not proxima_articulacao.exists():
irmaos = list(Dispositivo.objects.filter(
ordem__gt=dp.ordem,
norma_id=dp.norma_id,
tipo_dispositivo_id=tipo.pk))
else:
irmaos = list(Dispositivo.objects.filter(
Q(ordem__gt=dp.ordem) &
Q(ordem__lt=proxima_articulacao[0].ordem),
norma_id=dp.norma_id,
tipo_dispositivo_id=tipo.pk))
dp_profundidade = dp.get_profundidade()
irmaos_a_salvar = []
ultimo_irmao = None
for irmao in irmaos:
if irmao.ordem <= dp.ordem:
irmaos_a_salvar.append(irmao)
continue
irmao_profundidade = irmao.get_profundidade()
if irmao_profundidade < dp_profundidade:
break
if irmao.get_numero_completo() < dp.get_numero_completo():
if irmao_profundidade > dp_profundidade:
if ultimo_irmao is None:
irmao.transform_in_next(
dp_profundidade - irmao_profundidade)
irmao.transform_in_next(
irmao_profundidade - dp_profundidade)
else:
irmao.set_numero_completo(
ultimo_irmao.get_numero_completo())
irmao.transform_in_next(
irmao_profundidade -
ultimo_irmao.get_profundidade())
ultimo_irmao = irmao
else:
irmao.transform_in_next()
irmao.rotulo = irmao.rotulo_padrao()
irmaos_a_salvar.append(irmao)
else:
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)
irmaos_a_salvar.reverse()
for irmao in irmaos_a_salvar:
if irmao.dispositivo0 == 0 and \
irmao.ordem <= dp.ordem and variacao == 0:
irmao.dispositivo0 = 1
irmao.rotulo = irmao.rotulo_padrao()
dp.dispositivo0 = 2
dp.rotulo = dp.rotulo_padrao()
irmao.clean()
irmao.save()
dp.clean() dp.clean()
dp.save() dp.save()
@ -736,9 +692,9 @@ class ActionsEditMixin(object):
if tipo.contagem_continua: if tipo.contagem_continua:
ultimo_irmao = Dispositivo.objects.order_by( ultimo_irmao = Dispositivo.objects.order_by(
'-ordem').filter( '-ordem').filter(
ordem__lte=dp.ordem, ordem__lte=base.ordem,
tipo_dispositivo_id=tipo.pk, tipo_dispositivo_id=tipo.pk,
norma_id=dp.norma_id)[:1] norma_id=base.norma_id)[:1]
if not ultimo_irmao.exists(): if not ultimo_irmao.exists():
dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) dp.set_numero_completo([1, 0, 0, 0, 0, 0, ])
@ -754,7 +710,7 @@ class ActionsEditMixin(object):
dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) dp.set_numero_completo([1, 0, 0, 0, 0, 0, ])
dp.rotulo = dp.rotulo_padrao() dp.rotulo = dp.rotulo_padrao()
dp.texto = '' dp.texto = ''
dp.ordem = base.criar_espaco_apos(espaco_a_criar=1) dp.ordem = base.criar_espaco(espaco_a_criar=1, local=1)
# Incrementar irmãos # Incrementar irmãos
irmaos = Dispositivo.objects.order_by('-ordem').filter( irmaos = Dispositivo.objects.order_by('-ordem').filter(
@ -900,42 +856,44 @@ class ActionsEditMixin(object):
except Exception as e: except Exception as e:
print(e) print(e)
# data = serializers.serialize('json', dp) data = self.get_json_for_refresh(dp)
if tipo.contagem_continua:
# pais a atualizar
pais = [] return data
if dp.dispositivo_pai is None: def get_json_for_refresh(self, dispositivo):
data = {'pk': dp.pk, 'pai': [-1, ]}
if dispositivo.tipo_dispositivo.contagem_continua:
pais = []
if dispositivo.dispositivo_pai is None:
data = {'pk': dispositivo.pk, 'pai': [-1, ]}
else: else:
pkfilho = dp.pk pkfilho = dispositivo.pk
dp = dp.dispositivo_pai dispositivo = dispositivo.dispositivo_pai
if proxima_articulacao is not None and \ proxima_articulacao = dispositivo.get_proxima_articulacao()
proxima_articulacao.exists():
if proxima_articulacao is not None:
parents = Dispositivo.objects.filter( parents = Dispositivo.objects.filter(
norma_id=dp.norma_id, norma_id=dispositivo.norma_id,
ordem__gte=dp.ordem, ordem__gte=dispositivo.ordem,
ordem__lt=proxima_articulacao[0].ordem, ordem__lt=proxima_articulacao.ordem,
nivel__lte=dp.nivel) nivel__lte=dispositivo.nivel)
else: else:
parents = Dispositivo.objects.filter( parents = Dispositivo.objects.filter(
norma_id=dp.norma_id, norma_id=dispositivo.norma_id,
ordem__gte=dp.ordem, ordem__gte=dispositivo.ordem,
nivel__lte=dp.nivel) nivel__lte=dispositivo.nivel)
nivel = sys.maxsize nivel = sys.maxsize
for p in parents: for p in parents:
if p.nivel > nivel: if p.nivel > nivel:
continue continue
pais.append(p.pk) pais.append(p.pk)
nivel = p.nivel nivel = p.nivel
data = {'pk': pkfilho, 'pai': pais} data = {'pk': pkfilho, 'pai': pais}
else: else:
data = {'pk': dp.pk, 'pai': [dp.dispositivo_pai.pk, ]} data = {'pk': dispositivo.pk, 'pai': [
dispositivo.dispositivo_pai.pk, ]}
return data return data

399
static/js/compilacao.js

@ -1,210 +1,261 @@
var flag_add_next = false;
var flag_add_next_pk = 0;
var flag_add_next_pai = 0;
var editortype = "textarea"; var editortype = "textarea";
var gets = 0;
var onSubmitEditForm = function(event) { var onSubmitEditForm = function(event) {
var texto = ''; var texto = '';
var editorTiny = tinymce.get('editdi_texto'); var editorTiny = tinymce.get('editdi_texto');
if (editorTiny != null) if (editorTiny != null)
texto = editorTiny.getContent(); texto = editorTiny.getContent();
else else
texto = $('#editdi_texto').val(); texto = $('#editdi_texto').val();
var formData = { var formData = {
'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(), 'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(),
'texto' : texto 'texto' : texto
}; };
var url = $('.csform form').attr( "action_ajax" ); var url = $('.csform form').attr( "action_ajax" );
$("#message_block").css("display", "block"); $("#message_block").css("display", "block");
$.post(url,formData)
.done(function(data) { $.post(url, formData)
$('.dpt-selected').html(data); .done(function(data) {
clearEditSelected();
reloadFunctionClicks(); if (typeof data == "string") {
}).always(function() { $('.dpt-selected').html(data);
$("#message_block").css("display", "none"); clearEditSelected();
}); reloadFunctionClicks();
if (event != null) return;
event.preventDefault(); }
clearEditSelected();
if (data.pk != null)
refreshScreenFocusPk(data);
else {
alert('Erro na inserção!');
flag_refresh_all = false;
}
}).always(function() {
$("#message_block").css("display", "none");
});
if (event != null)
event.preventDefault();
} }
var clickEditDispositivo = function(event) { var clickEditDispositivo = function(event) {
var _pk = event.currentTarget.getAttribute('pk'); var _pk = event.currentTarget.getAttribute('pk');
if ($('#dpt'+_pk).hasClass("dpt-selected")) { if ($('#dpt'+_pk).hasClass("dpt-selected")) {
clearEditSelected(); clearEditSelected();
return; return;
} }
clearEditSelected(); clearEditSelected();
clickUpdateDispositivo(event); clickUpdateDispositivo(event);
} }
var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, flag_actions_vibible, flag_refresh_all) {
var _pk = __pk; var pk_refresh = __pk_refresh;
var _action = __action; var pk_edit = __pk_edit;
var _variacao = ''; var _action = __action;
var _tipo_pk = ''; var _variacao = '';
var _tipo_pk = '';
if (event != null) {
_pk = event.currentTarget.getAttribute('pk'); if (event != null) {
_action = $(this).attr('action'); pk_refresh = event.currentTarget.getAttribute('pk');
_variacao = $(this).attr('variacao'); _action = $(this).attr('action');
_tipo_pk = $(this).attr('tipo_pk'); _variacao = $(this).attr('variacao');
} _tipo_pk = $(this).attr('tipo_pk');
}
if (flag_add_next_pk == 0)
flag_add_next_pk = _pk if (pk_edit == null)
pk_edit = pk_refresh;
var url = ''
if (_action == '') var url = '';
return if (_action == '')
else if ( _action == null) return;
url = _pk+'/refresh?pkadd='+flag_add_next_pk; else if ( _action == null) {
else if (_action.startsWith('refresh')) { url = pk_refresh+'/refresh?pkadd='+pk_edit;
}
var str = _action.split(':'); else if (_action.startsWith('refresh')) {
if (str.length > 1) {
editortype = str[1]; var str = _action.split(':');
} if (str.length > 1) {
editortype = str[1];
url = _pk+'/refresh?pkadd='+flag_add_next_pk+url; SetCookie("editortype", editortype, 30)
}
else { }
url = _pk+'/actions?action='+_action; url = pk_refresh+'/refresh?pkadd='+pk_edit+url;
url += '&tipo_pk='+_tipo_pk; }
url += '&variacao='+_variacao; else {
if (addeditselected == null || addeditselected) {
$("#message_block").css("display", "block"); url = pk_refresh+'/actions?action='+_action;
} url += '&tipo_pk='+_tipo_pk;
} url += '&variacao='+_variacao;
$.get(url).done(function( data ) { $("#message_block").css("display", "block");
if ( _action == null || _action.startsWith('refresh')) { }
if (flag_add_next) { $.get(url).done(function( data ) {
if ( _action == null || _action.startsWith('refresh')) {
if (addeditselected)
if (flag_refresh_all) {
if (flag_actions_vibible)
clearEditSelected(); clearEditSelected();
$( '#dpt' + _pk ).html( data); $( '#dpt' + pk_refresh ).html( data);
flag_add_next = false }
} else {
else { //console.log(pk_refresh + ' - '+pk_edit)
clearEditSelected(); if (flag_actions_vibible == null || flag_actions_vibible)
$( '#dpt' + _pk ).prepend( data ); clearEditSelected();
}
reloadFunctionClicks(); $( '#dpt' + pk_refresh ).prepend( data );
}
if ( editortype == 'tinymce' ) {
initTinymce(); reloadFunctionClicks();
}
else if (editortype == 'textarea') { var _editortype = editortype;
$('.csform form').submit(onSubmitEditForm); if ( $('.edt-'+_editortype).length == 0) {
} _editortype = 'construct';
else if (editortype == 'construct') { }
$('.csform .btn-salvar').parent().remove();
$('.csform .btn-salvar, .csform textarea').remove(); if ( _editortype == 'tinymce' ) {
$('#dpt'+flag_add_next_pk).css('min-height', $('.actions_right').height()*2); initTinymce();
$('.actions_inserts').removeClass('menu_flutuante'); }
} else if (_editortype == 'textarea') {
$(".edt-"+editortype).addClass('selected'); $('.csform form').submit(onSubmitEditForm);
//$(".container").addClass('class_color_container'); }
else if (_editortype == 'construct') {
if (addeditselected == null || addeditselected) { $('.csform .btn-salvar').parent().addClass("displaynone");
$('html, body').animate({ $('.csform .btn-salvar, .csform .fields').addClass("displaynone");
scrollTop: $('#dpt' + flag_add_next_pk ).offset().top - window.innerHeight / 10 $('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2);
}, 300); $('.actions_inserts').removeClass('menu_flutuante');
$('#dpt'+flag_add_next_pk).addClass('dpt-selected'); }
flag_add_next_pk = 0; else if (_editortype == 'detail') {
} $('.csform .btn-salvar').parent().removeClass("displaynone");
} $('.csform .btn-salvar, .csform .fields').removeClass("displaynone");
$('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2);
else if (_action == 'add_next') { $('.actions_inserts').addClass('menu_flutuante');
}
clearEditSelected();
$(".edt-"+_editortype).addClass('selected');
flag_add_next_pk = data.pk; //$(".container").addClass('class_color_container');
flag_add_next_pai = data.pai;
if (flag_actions_vibible == null || flag_actions_vibible) {
if (flag_add_next_pk != null) $('html, body').animate({
for (var pai = 0; pai < flag_add_next_pai.length; pai++) scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10
if (flag_add_next_pai[pai] != -1) { }, 300);
flag_add_next = true; $('#dpt'+pk_edit).addClass('dpt-selected');
flag_add_next_pk = data.pk; }
clickUpdateDispositivo(null, flag_add_next_pai[pai], 'refresh', pai == 0); }
}
else { else if (_action == 'add_next' || _action == 'add_in') {
href = location.href.split('#')[0] clearEditSelected();
location.href = href+'#'+flag_add_next_pk if (data.pk != null) {
location.reload(true) refreshScreenFocusPk(data);
} }
else { else {
alert('Erro na inserção!'); alert('Erro na inserção!');
flag_add_next_pk = 0; }
flag_add_next = false; }
} else {
} clearEditSelected();
else { reloadFunctionClicks();
clearEditSelected(); }
reloadFunctionClicks(); }).always(function() {
flag_add_next_pk = 0; $("#message_block").css("display", "none");
} });
}).always(function() {
$("#message_block").css("display", "none");
});
} }
function refreshScreenFocusPk(data) {
for (var pai = 0; pai < data.pai.length; pai++)
if (data.pai[pai] != -1) {
clickUpdateDispositivo(null, data.pai[pai], data.pk, 'refresh', pai == 0, true);
}
else {
href = location.href.split('#')[0]
location.href = href+'#'+data.pk
location.reload(true)
}
}
function clearEditSelected() { function clearEditSelected() {
$(".container").removeClass('class_color_container'); $(".container").removeClass('class_color_container');
tinymce.remove(); tinymce.remove();
$('.dpt-selected').removeClass('dpt-selected'); $('.dpt-selected').removeClass('dpt-selected');
$('.dpt').css('min-height', ''); $('.dpt').css('min-height', '');
$('.csform').remove(); $('.csform').remove();
} }
function reloadFunctionClicks() { function reloadFunctionClicks() {
$('.dpt .de, .btn-action, .btn-inserts, .btn-edit').off(); $('.dpt .de, .btn-action, .btn-inserts, .btn-edit').off();
$('.dpt .de, .btn-edit').on('click', clickEditDispositivo);
$('.btn-action, .btn-inserts').on( $('.dpt .de, .btn-edit').on('click', clickEditDispositivo);
'click', clickUpdateDispositivo);
$('.btn-action, .btn-inserts').on('click', clickUpdateDispositivo);
$('#editdi_texto').focus(); $('#editdi_texto').focus();
} }
function initTinymce() { function initTinymce() {
tinymce.init({ tinymce.init({
mode : "textareas", mode : "textareas",
force_br_newlines : false, force_br_newlines : false,
force_p_newlines : false, force_p_newlines : false,
forced_root_block : '', forced_root_block : '',
plugins: ["table save code"], plugins: ["table save code"],
menubar: "edit format table tools", menubar: "edit format table tools",
toolbar: "save | undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent", toolbar: "save | undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent",
tools: "inserttable", tools: "inserttable",
save_onsavecallback: onSubmitEditForm, save_onsavecallback: onSubmitEditForm,
border_css: "/static/styles/compilacao_tinymce.css", border_css: "/static/styles/compilacao_tinymce.css",
content_css: "/static/styles/compilacao_tinymce.css" content_css: "/static/styles/compilacao_tinymce.css"
}); });
} }
//cookies
function SetCookie(cookieName,cookieValue,nDays) {
var today = new Date();
var expire = new Date();
if (nDays==null || nDays==0) nDays=1;
expire.setTime(today.getTime() + 3600000*24*nDays);
document.cookie = cookieName+"="+escape(cookieValue)
+ ";expires="+expire.toGMTString();
}
function ReadCookie(cookieName) {
var theCookie=" "+document.cookie;
var ind=theCookie.indexOf(" "+cookieName+"=");
if (ind==-1) ind=theCookie.indexOf(";"+cookieName+"=");
if (ind==-1 || cookieName=="") return "";
var ind1=theCookie.indexOf(";",ind+1);
if (ind1==-1) ind1=theCookie.length;
return unescape(theCookie.substring(ind+cookieName.length+2,ind1));
}
$(document).ready(function() { $(document).ready(function() {
editortype = ReadCookie("editortype")
if (editortype == null || editortype == "") {
editortype = "construct"
SetCookie("editortype", editortype, 30)
}
reloadFunctionClicks(); reloadFunctionClicks();
$("#message_block").css("display", "none"); $("#message_block").css("display", "none");
clickUpdateDispositivo(null, 60933, 'refresh', true); href = location.href.split('#')
if (href.length == 2) {
clickUpdateDispositivo(null, href[1], href[1], 'refresh', true);
}
}); });

18
static/styles/compilacao.scss

@ -8,6 +8,7 @@ $color_actions_border: #CCC;
background-image: -o-linear-gradient(top, $top, $bottom); background-image: -o-linear-gradient(top, $top, $bottom);
background-image: linear-gradient(to bottom, $top, $bottom); background-image: linear-gradient(to bottom, $top, $bottom);
} }
@mixin border-radius($radius) { @mixin border-radius($radius) {
-webkit-border-radius: $radius; -webkit-border-radius: $radius;
-moz-border-radius: $radius; -moz-border-radius: $radius;
@ -16,6 +17,7 @@ $color_actions_border: #CCC;
} }
@mixin li_flutuante() { @mixin li_flutuante() {
& > ul { & > ul {
transform: translateY(30px); transform: translateY(30px);
transition: transform 0.1s linear, transition: transform 0.1s linear,
@ -279,14 +281,15 @@ $color_actions_border: #CCC;
text-decoration: none; text-decoration: none;
} }
.semtexto {
font-weight: bold;
color: #8DA6D8;
}
.dpt { .dpt {
position: relative; position: relative;
display:block; display:block;
.semtexto {
font-weight: bold;
color: #cedefe;
}
.artigo { .artigo {
float: none; float: none;
} }
@ -373,6 +376,10 @@ $color_actions_border: #CCC;
padding: 0; padding: 0;
} }
.semtexto {
color: #fff;
}
.bloco { .bloco {
opacity: 0.5; opacity: 0.5;
&:hover { &:hover {
@ -655,6 +662,7 @@ $color_actions_border: #CCC;
&::-webkit-input-placeholder { &::-webkit-input-placeholder {
color: #c70808; color: #c70808;
opacity: 0.6; opacity: 0.6;
font-size: 80%;
} }
&:-moz-placeholder { /* Firefox 18- */ &:-moz-placeholder { /* Firefox 18- */
color: #c70808; color: #c70808;

19
templates/compilacao/edit_bloco.html

@ -21,9 +21,9 @@
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<li class="edt-textarea"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:textarea" title="{% trans 'Edição simples apenas do texto'%}">E</a></li> <li class="edt-textarea"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:textarea" title="{% trans 'Edição simples apenas do texto'%}">E</a></li>
<li class="edt-tinymce"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:tinymce" title="{% trans 'Editar o texto com TinyMCE'%}">E+</a></li> <li class="edt-tinymce"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:tinymce" title="{% trans 'Editar o texto com TinyMCE'%}">E+</a></li>
<li class="edt-detail"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:detail" title="{% trans 'TODO: Edição detalhada'%}">E*</a></li>
{%endif%} {%endif%}
<li class="edt-construct"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:construct" title="{% trans 'Construçao da estrutura da Norma'%}">C</a></li> <li class="edt-detail"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:detail" title="{% trans 'TODO: Edição detalhada'%}">E*</a></li>
<li class="edt-construct"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:construct" title="{% trans 'Construçao da estrutura da Norma'%}">C</a></li>
</ul> </ul>
<ul class="btns-action actions_right"> <ul class="btns-action actions_right">
<li><a class="btn-right btn-action" pk="{{dpt.pk}}" action="refresh" title="{% trans 'TODO: Reduzir nível do Dispositivo'%}">&#10092;</a></li> <li><a class="btn-right btn-action" pk="{{dpt.pk}}" action="refresh" title="{% trans 'TODO: Reduzir nível do Dispositivo'%}">&#10092;</a></li>
@ -34,7 +34,6 @@
<li><a class="btn-right btn-action" pk="{{dpt.pk}}" action="refresh" title="{% trans 'TODO: Descer uma posição com todos os subniveis'%}">&#8650;</a></li> <li><a class="btn-right btn-action" pk="{{dpt.pk}}" action="refresh" title="{% trans 'TODO: Descer uma posição com todos os subniveis'%}">&#8650;</a></li>
</ul> </ul>
<ul class="btns-action actions_left"> <ul class="btns-action actions_left">
<li><a class="btn-left btn-action" pk="{{dpt.pk}}" title="Button Left">BL</a></li> <li><a class="btn-left btn-action" pk="{{dpt.pk}}" title="Button Left">BL</a></li>
<li><a class="btn-left btn-action" pk="{{dpt.pk}}" title="Button Left">BL</a></li> <li><a class="btn-left btn-action" pk="{{dpt.pk}}" title="Button Left">BL</a></li>
@ -59,16 +58,18 @@
{%endif%} {%endif%}
<li><a href="#" class="btn-excluir">&nbsp;<span>Excluir</span></a></li> <li><a href="#" class="btn-excluir">&nbsp;<span>Excluir</span></a></li>
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<li><a onclick="onSubmitEditForm()" class="btn-salvar">&nbsp<span>Salvar</span></a></li> <li><a onclick="onSubmitEditForm()" class="btn-salvar">&nbsp<span>Salvar</span></a></li>
{%endif%}
</ul> </ul>
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} <div class="fields">
{% csrf_token %} {% csrf_token %}
<textarea id="editdi_texto" placeholder="{% trans "Insirir o texto do dispositivo aqui... Use, nos menus das bordas de edição, 'E+' ou 'E*' para outras opções de editores."%}" name="texto" rows="7">{{ dpt.texto|safe }}</textarea>
{%endif%}
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<textarea id="editdi_texto" placeholder="{% trans "Insirir o texto do dispositivo aqui... Use, nos menus das bordas de edição, 'E+' ou 'E*' para outras opções de editores."%}" name="texto" rows="7">{{ dpt.texto|safe }}</textarea>
{%endif%}
</div>
<div class="label_status" > <div class="label_status" >
<div>Ordem: {{dpt.ordem}}, Nivel: {{dpt.nivel}}, Número: {{dpt.get_numero_completo}}</div> <div>Ordem: {{dpt.ordem}}, Nivel: {{dpt.nivel}}, Número: {{dpt.get_numero_completo}}</div>

Loading…
Cancel
Save