diff --git a/compilacao/migrations/0014_auto_20151107_1836.py b/compilacao/migrations/0014_auto_20151107_1836.py new file mode 100644 index 000000000..1e1cf3138 --- /dev/null +++ b/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'), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 228d2f15d..223702435 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -77,12 +77,6 @@ class TipoVide(models.Model): 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, bloco_alteracao, artigo, caput e paragrafo são palavras chaves usadas no código e de existência obrigatória. @@ -244,6 +238,10 @@ class TipoDispositivo(BaseModel): symmetrical=False, related_name='+') + quantidade_permitida = models.IntegerField( + default=-1, + verbose_name=_('Quantidade permitida dentro de uma Norma')) + class Meta: verbose_name = _('Tipo de Dispositivo') verbose_name_plural = _('Tipos de Dispositivo') @@ -779,7 +777,7 @@ class Dispositivo(BaseModel): d.save() ordem -= 1000""" - def incrementar_irmaos(self, variacao=0, tipo=[]): + def incrementar_irmaos(self, variacao=0, tipoadd=[]): if not self.tipo_dispositivo.contagem_continua: irmaos = list(Dispositivo.objects.filter( @@ -787,7 +785,7 @@ class Dispositivo(BaseModel): dispositivo_pai_id=self.dispositivo_pai_id, 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( ordem__gt=self.ordem, norma_id=self.norma_id, @@ -860,7 +858,7 @@ class Dispositivo(BaseModel): if (irmao.dispositivo0 == 0 or irmao.ordem <= self.ordem) and variacao == 0: - if 'add_in' in tipo: + if 'add_in' in tipoadd: irmao.dispositivo0 = 2 irmao.rotulo = irmao.rotulo_padrao() self.dispositivo0 = 1 @@ -896,15 +894,13 @@ class Dispositivo(BaseModel): return False def get_raiz(self): - raiz = self.get_parents_asc() - if len(raiz) > 0: - raiz = raiz[0] - else: - raiz = self - return raiz + dp = self + while dp.dispositivo_pai is not None: + dp = dp.dispositivo_pai + return dp @staticmethod - def init_with_base(dispositivo_base, tipo_base): + def new_instance_based_on(dispositivo_base, tipo_base): dp = Dispositivo() dp.tipo_dispositivo = tipo_base diff --git a/compilacao/urls.py b/compilacao/urls.py index 39b7db482..b3c74e3d1 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -6,7 +6,7 @@ from compilacao.views import (tipo_dispositivo_crud, tipo_nota_crud, veiculo_publicacao_crud) urlpatterns_compilacao = [ - url(r'^(?P[0-9]+)/compilacao/$', + url(r'^(?P[0-9]+)/compilacao$', views.CompilacaoView.as_view(), name='compilacao'), url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), diff --git a/compilacao/views.py b/compilacao/views.py index d805c1060..2b4f47556 100644 --- a/compilacao/views.py +++ b/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 r.reverse() - if len(r) > 0 and dp.tipo_dispositivo.class_css in [ - 'articulacao', 'ementa']: + if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \ + TipoDispositivo.FNCN: r = [r[0], ] if dp.tipo_dispositivo == base.tipo_dispositivo: @@ -525,21 +529,17 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): 'dispositivo_base': base.pk}] if paradentro == 1: - if (tipb.class_css == 'caput' and + """if (tipb.class_css == 'caput' and td.class_css == 'paragrafo'): result[0]['itens'].insert(0, r[0]) - else: - result[1]['itens'] += r + else:""" + result[1]['itens'] += r else: if td.pk < tipb.pk: result[2]['itens'] += r result[0]['itens'] += r - if tipb.class_css == 'caput': - result.pop() - - # retira inserir após e inserir antes - if tipb.class_css == 'articulacao': + if len(result[0]['itens']) < len(result[1]['itens']): r = result[0] result.remove(result[0]) result.insert(1, r) @@ -580,7 +580,7 @@ class ActionsEditMixin(object): 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.dispositivo_pai = base @@ -594,7 +594,7 @@ class ActionsEditMixin(object): dp.ordem = ordem - dp.incrementar_irmaos(tipo=['add_in']) + dp.incrementar_irmaos(tipoadd=['add_in']) dp.clean() dp.save() @@ -624,70 +624,48 @@ class ActionsEditMixin(object): def add_next(self, context): try: base = Dispositivo.objects.get(pk=context['dispositivo_id']) - dp = Dispositivo.objects.get(pk=context['dispositivo_id']) - tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) variacao = int(context['variacao']) - - while dp.dispositivo_pai is not None and \ - dp.tipo_dispositivo_id != tipo.pk: - 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.rotulo = dp.rotulo_padrao() - - if dp.tipo_dispositivo.class_css == 'artigo': - ordem = base.criar_espaco(espaco_a_criar=2, local=1) + 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: - ordem = base.criar_espaco(espaco_a_criar=1, local=1) + count_auto_insert += 1 - dp.ordem = ordem + ordem = base.criar_espaco( + espaco_a_criar=1 + count_auto_insert, local=1) - # Incrementar irmãos - - dp.incrementar_irmaos(variacao) - - dp.clean() - dp.save() + 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 - # 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) - - # Inserção de dispositivo sem precedente de mesmo tipo + if dp_irmao is not None: + dp = Dispositivo.new_instance_based_on(dp_irmao, tipo) + dp.transform_in_next(variacao) 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) + # Inserção sem precedente + dp = Dispositivo.new_instance_based_on(dp_pai, tipo) + dp.dispositivo_pai = dp_pai + dp.nivel += 1 if tipo.contagem_continua: ultimo_irmao = Dispositivo.objects.order_by( @@ -708,28 +686,47 @@ class ActionsEditMixin(object): 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.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.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 = base.criar_espaco(espaco_a_criar=1, local=1) - - # 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) - - ''' 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: - irmao.dispositivo0 += 1 - irmao.rotulo = irmao.rotulo_padrao() - irmao.clean() - irmao.save() + dp.ordem = ordem + Dispositivo.INTERVALO_ORDEM dp.clean() dp.save() + dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id) ''' Reenquadrar todos os dispositivos que possuem pai antes da inserção atual e que são inferiores a dp, diff --git a/norma/urls.py b/norma/urls.py index b4fff7815..a27a6b879 100644 --- a/norma/urls.py +++ b/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 - -norma_url_patterns = norma_temporario_para_compilacao_crud.urlpatterns +from norma.views import NormaIncluirView, tipo_norma_crud, assunto_norma_crud urlpatterns = [ # url(r'^norma/', include(norma_url_patterns, # 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/assunto/', include(assunto_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'^norma/incluir', NormaIncluirView.as_view(), name='norma-incluir'), ] diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index c3949264d..143265ba7 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -287,7 +287,7 @@ $color_actions_border: #CCC; .semtexto { font-weight: bold; - color: #cedefe; + color: #BFD1F6; } .artigo { @@ -377,9 +377,9 @@ $color_actions_border: #CCC; } .semtexto { - color: #fff; + color: #999; } - + .bloco { opacity: 0.5; &:hover { diff --git a/templates/ajuda/impressos.html b/templates/ajuda/impressos.html index db2756275..30884eb35 100644 --- a/templates/ajuda/impressos.html +++ b/templates/ajuda/impressos.html @@ -10,8 +10,11 @@

Impressos


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.
-

Etiquetas - 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 combo box e o período desejado, preenchendo as datas inicial e final.

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 checkbox, 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.

Fichas - 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. Guias de Remessa - 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". +

Etiquetas - 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 combo box e o período desejado, preenchendo as datas inicial e final.

+

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 checkbox, 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.

+

Fichas - 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.

+

Guias de Remessa - 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".


-

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. +

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.

{% endblock base_content %} diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index 66379e447..d0b436f15 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -35,13 +35,13 @@ $(window).load(function() { }); function textoMultiVigente(item) { - $(".compilacao .tipo-vigencias a").removeClass("selected") + $(".cp .tipo-vigencias a").removeClass("selected") $(item).addClass("selected") $(".desativado").removeClass("displaynone"); $(".link_alterador").removeClass("displaynone"); } function textoVigente(item, link) { - $(".compilacao .tipo-vigencias a").removeClass("selected") + $(".cp .tipo-vigencias a").removeClass("selected") $(item).addClass("selected") $(".desativado").addClass("displaynone"); $(".link_alterador").removeClass("displaynone"); @@ -51,11 +51,11 @@ function textoVigente(item, link) { $(document).ready(function() { $("#btn_font_menos").click(function() { - $(".dispositivo").css("font-size", "-=1"); + $(".dpt").css("font-size", "-=1"); }); $("#btn_font_mais").click(function() { - $(".dispositivo").css("font-size", "+=1"); + $(".dpt").css("font-size", "+=1"); }); diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/index_bloco.html index 7066cf042..def483898 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -10,7 +10,7 @@
{% spaceless %} - {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{{ dpt.texto|safe }} + {{ 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%}{{ dpt.texto|safe }}{%else%} {%endif%} {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}