Browse Source

Refactor add_next in Dispositivo editor

pull/10/head
LeandroRoberto 9 years ago
parent
commit
254c55fe1f
  1. 19
      compilacao/migrations/0014_auto_20151107_1836.py
  2. 28
      compilacao/models.py
  3. 2
      compilacao/urls.py
  4. 149
      compilacao/views.py
  5. 10
      norma/urls.py
  6. 4
      static/styles/compilacao.scss
  7. 7
      templates/ajuda/impressos.html
  8. 8
      templates/compilacao/index.html
  9. 2
      templates/compilacao/index_bloco.html

19
compilacao/migrations/0014_auto_20151107_1836.py

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0013_auto_20151106_1843'),
]
operations = [
migrations.AddField(
model_name='tipodispositivo',
name='quantidade_permitida',
field=models.IntegerField(default=-1, verbose_name='Quantidade permitida dentro de uma Norma'),
),
]

28
compilacao/models.py

@ -77,12 +77,6 @@ class TipoVide(models.Model):
class TipoDispositivo(BaseModel): class TipoDispositivo(BaseModel):
""" """
- ids fazem parte da lógica do desenvolvimento quanto a
simulação de hierarquia
- ids de 1 a 100 são reservados.
- São registros inseridos e usados no desenvolvimento
- para class_css articulacao, omissis, ementa, - para class_css articulacao, omissis, ementa,
bloco_alteracao, artigo, caput e paragrafo bloco_alteracao, artigo, caput e paragrafo
são palavras chaves usadas no código e de existência obrigatória. são palavras chaves usadas no código e de existência obrigatória.
@ -244,6 +238,10 @@ class TipoDispositivo(BaseModel):
symmetrical=False, symmetrical=False,
related_name='+') related_name='+')
quantidade_permitida = models.IntegerField(
default=-1,
verbose_name=_('Quantidade permitida dentro de uma Norma'))
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')
@ -779,7 +777,7 @@ class Dispositivo(BaseModel):
d.save() d.save()
ordem -= 1000""" ordem -= 1000"""
def incrementar_irmaos(self, variacao=0, tipo=[]): def incrementar_irmaos(self, variacao=0, tipoadd=[]):
if not self.tipo_dispositivo.contagem_continua: if not self.tipo_dispositivo.contagem_continua:
irmaos = list(Dispositivo.objects.filter( irmaos = list(Dispositivo.objects.filter(
@ -787,7 +785,7 @@ class Dispositivo(BaseModel):
dispositivo_pai_id=self.dispositivo_pai_id, dispositivo_pai_id=self.dispositivo_pai_id,
tipo_dispositivo_id=self.tipo_dispositivo.pk)) tipo_dispositivo_id=self.tipo_dispositivo.pk))
elif self.tipo_dispositivo.class_css == 'articulacao': elif self.dispositivo_pai is None:
irmaos = list(Dispositivo.objects.filter( irmaos = list(Dispositivo.objects.filter(
ordem__gt=self.ordem, ordem__gt=self.ordem,
norma_id=self.norma_id, norma_id=self.norma_id,
@ -860,7 +858,7 @@ class Dispositivo(BaseModel):
if (irmao.dispositivo0 == 0 or if (irmao.dispositivo0 == 0 or
irmao.ordem <= self.ordem) and variacao == 0: irmao.ordem <= self.ordem) and variacao == 0:
if 'add_in' in tipo: if 'add_in' in tipoadd:
irmao.dispositivo0 = 2 irmao.dispositivo0 = 2
irmao.rotulo = irmao.rotulo_padrao() irmao.rotulo = irmao.rotulo_padrao()
self.dispositivo0 = 1 self.dispositivo0 = 1
@ -896,15 +894,13 @@ class Dispositivo(BaseModel):
return False return False
def get_raiz(self): def get_raiz(self):
raiz = self.get_parents_asc() dp = self
if len(raiz) > 0: while dp.dispositivo_pai is not None:
raiz = raiz[0] dp = dp.dispositivo_pai
else: return dp
raiz = self
return raiz
@staticmethod @staticmethod
def init_with_base(dispositivo_base, tipo_base): def new_instance_based_on(dispositivo_base, tipo_base):
dp = Dispositivo() dp = Dispositivo()
dp.tipo_dispositivo = tipo_base dp.tipo_dispositivo = tipo_base

2
compilacao/urls.py

@ -6,7 +6,7 @@ from compilacao.views import (tipo_dispositivo_crud, tipo_nota_crud,
veiculo_publicacao_crud) veiculo_publicacao_crud)
urlpatterns_compilacao = [ urlpatterns_compilacao = [
url(r'^(?P<norma_id>[0-9]+)/compilacao/$', url(r'^(?P<norma_id>[0-9]+)/compilacao$',
views.CompilacaoView.as_view(), name='compilacao'), views.CompilacaoView.as_view(), name='compilacao'),
url(r'^(?P<norma_id>[0-9]+)/compilacao/(?P<dispositivo_id>[0-9]+)/$', url(r'^(?P<norma_id>[0-9]+)/compilacao/(?P<dispositivo_id>[0-9]+)/$',
views.DispositivoView.as_view(), name='dispositivo'), views.DispositivoView.as_view(), name='dispositivo'),

149
compilacao/views.py

@ -97,6 +97,10 @@ tipo_dispositivo_crud = build_crud(
], ],
[_('Outras Configurações'),
[('quantidade_permitida', 12),
],
],
]) ])
@ -469,8 +473,8 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
flag_direcao = -1 flag_direcao = -1
r.reverse() r.reverse()
if len(r) > 0 and dp.tipo_dispositivo.class_css in [ if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \
'articulacao', 'ementa']: TipoDispositivo.FNCN:
r = [r[0], ] r = [r[0], ]
if dp.tipo_dispositivo == base.tipo_dispositivo: if dp.tipo_dispositivo == base.tipo_dispositivo:
@ -525,21 +529,17 @@ class DispositivoEditView(CompilacaoEditView, FormMixin):
'dispositivo_base': base.pk}] 'dispositivo_base': base.pk}]
if paradentro == 1: if paradentro == 1:
if (tipb.class_css == 'caput' and """if (tipb.class_css == 'caput' and
td.class_css == 'paragrafo'): td.class_css == 'paragrafo'):
result[0]['itens'].insert(0, r[0]) result[0]['itens'].insert(0, r[0])
else: else:"""
result[1]['itens'] += r result[1]['itens'] += r
else: else:
if td.pk < tipb.pk: if td.pk < tipb.pk:
result[2]['itens'] += r result[2]['itens'] += r
result[0]['itens'] += r result[0]['itens'] += r
if tipb.class_css == 'caput': if len(result[0]['itens']) < len(result[1]['itens']):
result.pop()
# retira inserir após e inserir antes
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)
@ -580,7 +580,7 @@ class ActionsEditMixin(object):
base = Dispositivo.objects.get(pk=context['dispositivo_id']) base = Dispositivo.objects.get(pk=context['dispositivo_id'])
dp = Dispositivo.init_with_base(base, tipo) dp = Dispositivo.new_instance_based_on(base, tipo)
dp.nivel += 1 dp.nivel += 1
dp.dispositivo_pai = base dp.dispositivo_pai = base
@ -594,7 +594,7 @@ class ActionsEditMixin(object):
dp.ordem = ordem dp.ordem = ordem
dp.incrementar_irmaos(tipo=['add_in']) dp.incrementar_irmaos(tipoadd=['add_in'])
dp.clean() dp.clean()
dp.save() dp.save()
@ -624,70 +624,48 @@ class ActionsEditMixin(object):
def add_next(self, context): def add_next(self, context):
try: try:
base = Dispositivo.objects.get(pk=context['dispositivo_id']) base = Dispositivo.objects.get(pk=context['dispositivo_id'])
dp = Dispositivo.objects.get(pk=context['dispositivo_id'])
tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) tipo = TipoDispositivo.objects.get(pk=context['tipo_pk'])
variacao = int(context['variacao']) variacao = int(context['variacao'])
parents = [base, ] + base.get_parents()
tipos_dp_auto_insert = tipo.filhos_permitidos.filter(
filho_de_insercao_automatica=True)
count_auto_insert = 0
for tipoauto in tipos_dp_auto_insert:
qtdp = tipoauto.filho_permitido.quantidade_permitida
if qtdp >= 0:
qtdp -= Dispositivo.objects.filter(
norma_id=base.norma_id,
tipo_dispositivo_id=tipoauto.filho_permitido.pk
).count()
if qtdp > 0:
count_auto_insert += 1
else:
count_auto_insert += 1
ordem = base.criar_espaco(
espaco_a_criar=1 + count_auto_insert, local=1)
dp_irmao = None
dp_pai = None
for dp in parents:
if dp.tipo_dispositivo == tipo:
dp_irmao = dp
break
if tipo.permitido_inserir_in(dp.tipo_dispositivo):
dp_pai = dp
break
dp_pai = dp
while dp.dispositivo_pai is not None and \ if dp_irmao is not None:
dp.tipo_dispositivo_id != tipo.pk: dp = Dispositivo.new_instance_based_on(dp_irmao, tipo)
dp = dp.dispositivo_pai
# Inserção interna a uma articulação de um tipo já existente
# ou de uma nova articulacao
if dp.dispositivo_pai is not None or \
tipo.class_css == 'articulacao':
dpbase = dp
dp = Dispositivo.init_with_base(dpbase, tipo)
dp.transform_in_next(variacao) dp.transform_in_next(variacao)
dp.rotulo = dp.rotulo_padrao()
if dp.tipo_dispositivo.class_css == 'artigo':
ordem = base.criar_espaco(espaco_a_criar=2, local=1)
else: else:
ordem = base.criar_espaco(espaco_a_criar=1, local=1) # Inserção sem precedente
dp = Dispositivo.new_instance_based_on(dp_pai, tipo)
dp.ordem = ordem dp.dispositivo_pai = dp_pai
# Incrementar irmãos
dp.incrementar_irmaos(variacao)
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.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)
# Inserção de dispositivo sem precedente de mesmo tipo
else:
dp = Dispositivo.objects.get(pk=context['dispositivo_id'])
# Encontrar primeiro irmão que contem um pai compativel
while True:
if dp.dispositivo_pai is not None and \
dp.dispositivo_pai.tipo_dispositivo_id > tipo.pk:
dp = dp.dispositivo_pai
else:
break
dpaux = dp
dp = Dispositivo.init_with_base(dpaux, tipo)
if tipo.contagem_continua: if tipo.contagem_continua:
ultimo_irmao = Dispositivo.objects.order_by( ultimo_irmao = Dispositivo.objects.order_by(
@ -708,9 +686,15 @@ class ActionsEditMixin(object):
dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) dp.set_numero_completo([0, 0, 0, 0, 0, 0, ])
else: else:
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.ordem = ordem
dp.ordem = base.criar_espaco(espaco_a_criar=1, local=1) 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 # Incrementar irmãos
irmaos = Dispositivo.objects.order_by('-ordem').filter( irmaos = Dispositivo.objects.order_by('-ordem').filter(
@ -718,18 +702,31 @@ class ActionsEditMixin(object):
ordem__gt=dp.ordem, ordem__gt=dp.ordem,
tipo_dispositivo_id=tipo.pk) tipo_dispositivo_id=tipo.pk)
''' 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'''
for irmao in irmaos: for irmao in irmaos:
irmao.dispositivo0 += 1 irmao.dispositivo0 += 1
irmao.rotulo = irmao.rotulo_padrao() irmao.rotulo = irmao.rotulo_padrao()
irmao.clean() irmao.clean()
irmao.save() irmao.save()'''
dp.clean()
dp.save()
# Inserção automática do caput para artigos
if count_auto_insert:
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.clean()
dp.save() dp.save()
dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id)
''' Reenquadrar todos os dispositivos que possuem pai ''' Reenquadrar todos os dispositivos que possuem pai
antes da inserção atual e que são inferiores a dp, antes da inserção atual e que são inferiores a dp,

10
norma/urls.py

@ -1,14 +1,12 @@
from django.conf.urls import url from django.conf.urls import url, include
from norma.views import NormaIncluirView, norma_temporario_para_compilacao_crud from norma.views import NormaIncluirView, tipo_norma_crud, assunto_norma_crud
norma_url_patterns = norma_temporario_para_compilacao_crud.urlpatterns
urlpatterns = [ urlpatterns = [
# url(r'^norma/', include(norma_url_patterns, # url(r'^norma/', include(norma_url_patterns,
# norma_temporario_para_compilacao_crud.namespace, # norma_temporario_para_compilacao_crud.namespace,
# norma_temporario_para_compilacao_crud.namespace)), # norma_temporario_para_compilacao_crud.namespace)),
# url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)), url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)),
# url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)), url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)),
url(r'^norma/incluir', NormaIncluirView.as_view(), name='norma-incluir'), url(r'^norma/incluir', NormaIncluirView.as_view(), name='norma-incluir'),
] ]

4
static/styles/compilacao.scss

@ -287,7 +287,7 @@ $color_actions_border: #CCC;
.semtexto { .semtexto {
font-weight: bold; font-weight: bold;
color: #cedefe; color: #BFD1F6;
} }
.artigo { .artigo {
@ -377,7 +377,7 @@ $color_actions_border: #CCC;
} }
.semtexto { .semtexto {
color: #fff; color: #999;
} }
.bloco { .bloco {

7
templates/ajuda/impressos.html

@ -10,8 +10,11 @@
<h1 class="firstHeading">Impressos</h1> <h1 class="firstHeading">Impressos</h1>
<br /> <br />
Esta função tem por objetivo a seleção de informações sobre matérias legislativas para a geração de Etiquetas, Fichas ou Guias de Remessa a serem impressas.<br /> Esta função tem por objetivo a seleção de informações sobre matérias legislativas para a geração de Etiquetas, Fichas ou Guias de Remessa a serem impressas.<br />
<p><b>Etiquetas</b> - Selecionar as matérias por faixa de número de processo ou selecionada por Tipo de matéria e intervalo de datas de entrada. Se a opção escolhida for por faixa de número de processo, informar o intervalo desejado: números inicial e final. Se a opção for a "selecionada", significa que deverão ser indicados o Tipo de Matéria por meio de seleção no <i>combo box</i> e o período desejado, preenchendo as datas inicial e final.<p> Em seguida, clicar em "gerar" para o sistema proceder à seleção das matérias. O resultado da consulta será a lista de matérias que atendem aos parâmetros informados. Ao lado de cada matéria é apresentado um <i>checkbox</i>, que deve ser assinalado se desejar gerar a etiqueta daquela matéria específica. Uma vez assinaladas as matérias, as quais se deseja gerar as etiquetas, clicar em "gerar" e o sistema irá apresentar as informações das matérias selecionadas já sob o formatado de etiquetas, uma para cada matéria selecionada, que conterá: tipo de matéria, número do processo, data de entrada, autor e o texto da ementa.<p><b>Fichas</b> - Os procedimentos necessários para a seleção de matérias e geração das respectivas fichas é análogo aos indicados para a Etiqueta, excetuando-se o formato da saída que será o de uma ficha. </><p<b>Guias de Remessa</b> - Assinalar se a Guia de Remessa será para Indicação ou Requerimento informando, também, a data e o número da sessão correspondente e clicar em "enviar". <p><b>Etiquetas</b> - Selecionar as matérias por faixa de número de processo ou selecionada por Tipo de matéria e intervalo de datas de entrada. Se a opção escolhida for por faixa de número de processo, informar o intervalo desejado: números inicial e final. Se a opção for a "selecionada", significa que deverão ser indicados o Tipo de Matéria por meio de seleção no <i>combo box</i> e o período desejado, preenchendo as datas inicial e final.</p>
<p>Em seguida, clicar em "gerar" para o sistema proceder à seleção das matérias. O resultado da consulta será a lista de matérias que atendem aos parâmetros informados. Ao lado de cada matéria é apresentado um <i>checkbox</i>, que deve ser assinalado se desejar gerar a etiqueta daquela matéria específica. Uma vez assinaladas as matérias, as quais se deseja gerar as etiquetas, clicar em "gerar" e o sistema irá apresentar as informações das matérias selecionadas já sob o formatado de etiquetas, uma para cada matéria selecionada, que conterá: tipo de matéria, número do processo, data de entrada, autor e o texto da ementa.</p>
<p><b>Fichas</b> - Os procedimentos necessários para a seleção de matérias e geração das respectivas fichas é análogo aos indicados para a Etiqueta, excetuando-se o formato da saída que será o de uma ficha. </p>
<p><b>Guias de Remessa</b> - Assinalar se a Guia de Remessa será para Indicação ou Requerimento informando, também, a data e o número da sessão correspondente e clicar em "enviar".</p>
<br /> <br />
<p>Após visualizar a lista contendo o resultado da seleção das matérias, colocar o formulário apropriado na impressora, de acordo com a opção escolhida, e acionar a função de impressão do navegador para imprimir efetivamente. <p>Após visualizar a lista contendo o resultado da seleção das matérias, colocar o formulário apropriado na impressora, de acordo com a opção escolhida, e acionar a função de impressão do navegador para imprimir efetivamente.</p>
{% endblock base_content %} {% endblock base_content %}

8
templates/compilacao/index.html

@ -35,13 +35,13 @@ $(window).load(function() {
}); });
function textoMultiVigente(item) { function textoMultiVigente(item) {
$(".compilacao .tipo-vigencias a").removeClass("selected") $(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected") $(item).addClass("selected")
$(".desativado").removeClass("displaynone"); $(".desativado").removeClass("displaynone");
$(".link_alterador").removeClass("displaynone"); $(".link_alterador").removeClass("displaynone");
} }
function textoVigente(item, link) { function textoVigente(item, link) {
$(".compilacao .tipo-vigencias a").removeClass("selected") $(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected") $(item).addClass("selected")
$(".desativado").addClass("displaynone"); $(".desativado").addClass("displaynone");
$(".link_alterador").removeClass("displaynone"); $(".link_alterador").removeClass("displaynone");
@ -51,11 +51,11 @@ function textoVigente(item, link) {
$(document).ready(function() { $(document).ready(function() {
$("#btn_font_menos").click(function() { $("#btn_font_menos").click(function() {
$(".dispositivo").css("font-size", "-=1"); $(".dpt").css("font-size", "-=1");
}); });
$("#btn_font_mais").click(function() { $("#btn_font_mais").click(function() {
$(".dispositivo").css("font-size", "+=1"); $(".dpt").css("font-size", "+=1");
}); });

2
templates/compilacao/index_bloco.html

@ -10,7 +10,7 @@
<div class="dpt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}" id="d{{dpt.id}}"> <div class="dpt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}" id="d{{dpt.id}}">
<div class="{{ dpt.tipo_dispositivo.class_css }}" id="id{{dpt.id}}"> <div class="{{ dpt.tipo_dispositivo.class_css }}" id="id{{dpt.id}}">
{% spaceless %} {% spaceless %}
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.rotulo }}</a>{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{{ dpt.texto|safe }} {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.rotulo }}</a>{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%}&nbsp;{%endif%}
{% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% 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 'compilacao' dpt.norma_publicada.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}

Loading…
Cancel
Save