From ced41a513b136cc12dc8aed8bdf343ba531c17c3 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 9 Nov 2015 17:44:22 -0200 Subject: [PATCH] finish first simp. version of Dispositivo editor --- compilacao/models.py | 95 +++++---- compilacao/views.py | 198 +++++++++--------- static/js/compilacao.js | 5 +- static/styles/compilacao.scss | 73 ++++++- templates/compilacao/edit_bloco.html | 23 +- .../compilacao/edit_bloco_alteracao.html | 2 +- 6 files changed, 234 insertions(+), 162 deletions(-) diff --git a/compilacao/models.py b/compilacao/models.py index 223702435..3a41ae45e 100644 --- a/compilacao/models.py +++ b/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() diff --git a/compilacao/views.py b/compilacao/views.py index 2b4f47556..f052dc23e 100644 --- a/compilacao/views.py +++ b/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': '↷ ', '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 diff --git a/static/js/compilacao.js b/static/js/compilacao.js index 28f678986..f5ff95468 100644 --- a/static/js/compilacao.js +++ b/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) } diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 143265ba7..ddd0c06f6 100644 --- a/static/styles/compilacao.scss +++ b/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; + } + } } } } diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 28a345093..e0aa78341 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -57,8 +57,19 @@ {% endfor %} {%endif%} -
  •  Excluir
  • -
  •  Salvar
  • +
  •  Excluir + + + + + + +
  • +
  •  Salvar
  • @@ -93,13 +104,9 @@
    {% spaceless %} - - {{ 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 %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%} - - + {{ 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 %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%} {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} diff --git a/templates/compilacao/edit_bloco_alteracao.html b/templates/compilacao/edit_bloco_alteracao.html index 3f7b71744..39b13058d 100644 --- a/templates/compilacao/edit_bloco_alteracao.html +++ b/templates/compilacao/edit_bloco_alteracao.html @@ -3,7 +3,7 @@ {% spaceless %}
    - {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} + {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
    {% endspaceless %}