diff --git a/compilacao/forms.py b/compilacao/forms.py index e98b5cc53..60e943bfe 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -7,6 +7,7 @@ from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, Layout, Row) from django import forms from django.core.exceptions import NON_FIELD_ERRORS, ValidationError +from django.db.models import Q from django.forms.forms import Form from django.forms.models import ModelForm from django.template import defaultfilters @@ -559,7 +560,7 @@ class DispositivoEdicaoBasicaForm(ModelForm): self.helper = FormHelper() self.helper.layout = SaplFormLayout( *layout, - label_cancel=_('Retornar para o Editor Sequencial')) + label_cancel=_('Ir para o Editor Sequencial')) super(DispositivoEdicaoBasicaForm, self).__init__(*args, **kwargs) @@ -727,17 +728,19 @@ class DispositivoEdicaoVigenciaForm(ModelForm): self.helper = FormHelper() self.helper.layout = SaplFormLayout( *layout, - label_cancel=_('Retornar para o Editor Sequencial')) + label_cancel=_('Ir para o Editor Sequencial')) super(DispositivoEdicaoVigenciaForm, self).__init__(*args, **kwargs) pubs = Publicacao.objects.order_by( - '-data', '-hora').filter(ta=self.instance.ta) + '-data', '-hora').filter(Q(ta=self.instance.ta) | + Q(ta=self.instance.ta_publicado)) self.fields['publicacao'].choices = [("", "---------")] + [( - p.pk, _('%s realizada em %s') % ( + p.pk, _('%s realizada em %s. %s') % ( p.tipo_publicacao, defaultfilters.date( - p.data, "d \d\e F \d\e Y"))) for p in pubs] + p.data, "d \d\e F \d\e Y"), + str(p.ta))) for p in pubs] dvs = Dispositivo.objects.order_by('ordem').filter( pk=self.instance.dispositivo_vigencia_id) @@ -816,7 +819,7 @@ class DispositivoDefinidorVigenciaForm(Form): self.helper = FormHelper() self.helper.layout = SaplFormLayout( *layout, - label_cancel=_('Retornar para o Editor Sequencial')) + label_cancel=_('Ir para o Editor Sequencial')) pk = kwargs.pop('pk') super(DispositivoDefinidorVigenciaForm, self).__init__(*args, **kwargs) @@ -955,7 +958,7 @@ class DispositivoEdicaoAlteracaoForm(ModelForm): self.helper = FormHelper() self.helper.layout = SaplFormLayout( *layout, - label_cancel=_('Retornar para o Editor Sequencial')) + label_cancel=_('Ir para o Editor Sequencial')) super(DispositivoEdicaoAlteracaoForm, self).__init__(*args, **kwargs) diff --git a/compilacao/urls.py b/compilacao/urls.py index 0a3c93222..4c8d0ed49 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -27,6 +27,9 @@ urlpatterns_compilacao = [ url(r'^(?P[0-9]+)/text/edit', views.TextEditView.as_view(), name='ta_text_edit'), + url(r'^(?P[0-9]+)/text/pendencias', + views.TextPendenciasView.as_view(), name='ta_text_pendencias'), + url(r'^(?P[0-9]+)/text/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), diff --git a/compilacao/views.py b/compilacao/views.py index 582c4ca70..eb55275f5 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -6,6 +6,7 @@ from braces.views import FormMessagesMixin from django import forms from django.contrib.auth.decorators import login_required from django.contrib.contenttypes.models import ContentType +from django.contrib.messages import constants from django.core.signing import Signer from django.core.urlresolvers import reverse_lazy from django.db import transaction @@ -2291,3 +2292,168 @@ class DispositivoEdicaoAlteracaoView(FormMessagesMixin, UpdateView): return self.form_invalid(form) else: return self.form_invalid(form) + + +class TextPendenciasView(ListView, CompMixin): + template_name = 'compilacao/text_pendencias.html' + + def get_queryset(self): + + result = Dispositivo.objects.filter( + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + p = [] + + def padd(r, type_pendencia, reverse_url=None, test=True, msg='', + kwargs=None, to_position=None): + + if not test: + return + + r.contextual_class = type_pendencia + if not kwargs: + kwargs = {'ta_id': r.ta_id, 'pk': r.pk} + if reverse_url: + p.append((type_pendencia, msg, + reverse_lazy(reverse_url, kwargs=kwargs), + to_position)) + else: + p.append((type_pendencia, msg, None, to_position)) + + def success(r): + type_pendencia = 'success' + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + r.inconstitucionalidade, + _('Declarado Inconstitucional.')) + + padd(r, type_pendencia, 'compilacao:ta_text_edit', + r.ta_publicado and r.dispositivo_atualizador, + _('Dispositivo alterado em %s' % r.ta_publicado), + {'ta_id': r.ta_publicado_id}, r.dispositivo_atualizador_id) + + def info(r): + type_pendencia = 'info' + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + r.publicacao and + r.dispositivo_vigencia and + r.publicacao.data != r.dispositivo_vigencia.inicio_vigencia, + _('Data da publicação associada ao Dispositivo difere da data' + ' de inicio de vigência do Dispositivo de vigência.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + r.publicacao and r.publicacao.data != r.inicio_vigencia, + _('Data da publicação associada ao Dispositivo difere ' + 'da data de inicio de vigência.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit', + r.rotulo != r.rotulo_padrao(local_insert=1), + _('Rótulo Diferente do Padrão')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit', + r.texto_atualizador and r.texto_atualizador != r.texto, + _('Texto do Dispositivo para o Documento ' + 'está diferente do texto para o Documento Alterador.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + r.texto_atualizador and r.texto_atualizador == r.texto, + _('Texto do Dispositivo no Documento Alterador ' + 'está igual ao Texto no Documento Original. ' + 'Não é necessário manter armazenado o texto no Documento ' + 'Alterador.')) + + def warning(r): + type_pendencia = 'warning' + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + r.dispositivo_vigencia and r.inicio_vigencia != + r.dispositivo_vigencia.inicio_vigencia, + _('Data de início de Vigência difere da data início de ' + 'Vigência do Dispositivo de Vigência')) + + padd(r, type_pendencia, 'compilacao:ta_text', + r.inconstitucionalidade and not r.notas.exists(), + _('Dispositivo está definido como inconstitucional. É ' + 'aconcelhavel inserir uma Nota informando esta condição.'), + kwargs={'ta_id': r.ta_id}, + to_position=r.pk) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + r.inconstitucionalidade and not ( + r.inicio_vigencia == r.fim_vigencia and + r.fim_vigencia == r.inicio_eficacia and + r.inicio_eficacia == r.fim_eficacia), + _('Dispositivo está definido como inconstitucional porém ' + 'existe diferença entre as datas início e fim de ' + 'vigência e eficácia.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + r.publicacao and + r.ta_publicado and r.ta_publicado != r.publicacao.ta, + _('A Publicação associada a este Dispositivo não é ' + 'uma publicação do Texto Articulado Alterador.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + not r.publicacao, + _('Dispositivo sem registro de publicação.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + r.texto and r.tipo_dispositivo.dispositivo_de_articulacao, + _('Dispositivos de Articulação não ' + 'deveriam armazenar texto.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + not r.texto and r.tipo_dispositivo.dispositivo_de_articulacao, + _('Dispositivo está sem texto.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + r.texto_atualizador and not r.ta_publicado, + _('Existe Texto Atualizador, porém este Dispositivo não ' + 'está associado a nenhum Documento Atualizador.')) + + def danger(r): + type_pendencia = 'danger' + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + not r.dispositivo_vigencia, + _('Dispositivo sem definição de Dispositivo de Vigência.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + r.inconstitucionalidade and + r.inicio_vigencia != r.fim_vigencia, + _('Dispositivo está definido como inconstitucional porém ' + 'existe período de vigência.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + r.ta_publicado and not r.dispositivo_atualizador, + _('Dispositivo está associado a um Texto Articulado ' + 'Atualizador mas, a nenhum Dispositivo Atualizador.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + not r.dispositivo_atualizador and + r.dispositivo_substituido, + _('Dispositivo está substituindo outro mas não foi informado ' + 'o Dispositivo Atualizador.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + r.dispositivo_substituido.tipo_dispositivo != + r.tipo_dispositivo, + _('Dispositivo está substituindo um Dispositivo ' + 'de outro tipo.')) + + padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + r.dispositivo_substituido.ta != r.ta, + _('Dispositivo está substituindo um Dispositivo de outro ' + 'Texto Articulado.')) + + for r in result: + p = [] + r.contextual_class = "" + + # sucess + success(r) + info(r) + warning(r) + danger(r) + + r.pendencias = p + + return result diff --git a/materia/urls.py b/materia/urls.py index 26982c318..c43738dcb 100644 --- a/materia/urls.py +++ b/materia/urls.py @@ -29,13 +29,12 @@ urlpatterns = [ DespachoInicialCrud.get_urls() + NumeracaoCrud.get_urls())), - + # Integração com Compilação url(r'^materia/(?P[0-9]+)/ta$', MateriaTaView.as_view(), name='materia_ta'), url(r'^materia/proposicao/(?P[0-9]+)/ta$', ProposicaoTaView.as_view(), name='proposicao_ta'), - url(r'^sistema/proposicao/tipo/', include(TipoProposicaoCrud.get_urls())), url(r'^sistema/proposicao/autor/', include(AutorCrud.get_urls())), diff --git a/norma/urls.py b/norma/urls.py index c75863a5f..d99713597 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,31 +1,19 @@ from django.conf.urls import include, url from norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView, - NormaTaView, NormaTemporarioCrud, - PesquisaNormaListView, TipoNormaCrud) + NormaTaView, PesquisaNormaListView, TipoNormaCrud) from .apps import AppConfig app_name = AppConfig.name -# @LeandroRoberto comentou em -# https://github.com/interlegis/sapl/pull/255#discussion_r55894269 -# -# esse código só está assim de forma temporária, criado no início do -# projeto para apenas dar uma tela básica de listagem de normas para a app -# compilação... a implementação da app norma é independente e não sei em -# que estágio está... para a compilação é relevante apenas que se mantenha -# o código abaixo: -# url(r'^norma/(?P[0-9]+)/ta$', NormaTaView.as_view(), name='ta') -# bem como a classe NormaTaView que está em norma.views -norma_url_patterns = NormaTemporarioCrud.get_urls() + [ - url(r'^(?P[0-9]+)/ta$', - NormaTaView.as_view(), name='ta') -] urlpatterns = [ url(r'^norma/', include(NormaCrud.get_urls())), + # Integração com Compilação + url(r'^norma/(?P[0-9]+)/ta$', NormaTaView.as_view(), name='norma_ta'), + url(r'^sistema/norma/tipo/', include(TipoNormaCrud.get_urls())), url(r'^sistema/norma/assunto/', include(AssuntoNormaCrud.get_urls())), url(r'^norma/pesquisa$', diff --git a/norma/views.py b/norma/views.py index 838e7a62b..711d3ff60 100644 --- a/norma/views.py +++ b/norma/views.py @@ -13,7 +13,6 @@ from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica, AssuntoNormaCrud = Crud.build(AssuntoNorma, 'assunto_norma_juridica') TipoNormaCrud = Crud.build(TipoNormaJuridica, 'tipo_norma_juridica') -NormaTemporarioCrud = Crud.build(NormaJuridica, 'norma') LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') diff --git a/protocoloadm/views.py b/protocoloadm/views.py index 851cf76f9..bc4b122d2 100644 --- a/protocoloadm/views.py +++ b/protocoloadm/views.py @@ -4,7 +4,7 @@ from datetime import date, datetime from braces.views import FormValidMessageMixin from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse -from django.db.models import Q, Max +from django.db.models import Max, Q from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _ diff --git a/static/js/compilacao_edit.js b/static/js/compilacao_edit.js index 0193d712e..4368325d9 100644 --- a/static/js/compilacao_edit.js +++ b/static/js/compilacao_edit.js @@ -1,6 +1,5 @@ var editortype = "textarea"; -var gets = 0; var onSubmitEditForm = function(event) { var texto = ''; diff --git a/static/js/compilacao_notas.js b/static/js/compilacao_notas.js index 487cfb5ec..6171d80e4 100644 --- a/static/js/compilacao_notas.js +++ b/static/js/compilacao_notas.js @@ -123,20 +123,21 @@ function getForm(_this) { function onReadyNotasVides() { - $('.dne-nota').removeClass('dne-nota'); - $('.dne-form').html(''); + $('.dne-nota').removeClass('dne-nota'); + $('.dne-form').html(''); - $('.dne .btn-action').off(); - $('.dn .btn-action').off(); + $('.dne .btn-action').off(); + $('.dn .btn-action').off(); - $('.dne .btn-action, .dn .btn-action').not('.btn-nota-delete').not('.btn-vide-delete').click(function(){ - getForm(this); - }); + $('.dne .btn-action, .dn .btn-action').not('.btn-nota-delete').not('.btn-vide-delete').click(function(){ + getForm(this); + }); - $('.dn .btn-nota-delete, .dn .btn-vide-delete').click(function(){ - onDelete(this); - }); + $('.dn .btn-nota-delete, .dn .btn-vide-delete').click(function(){ + onDelete(this); + }); } + $(document).ready(function() { onReadyNotasVides() }); diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 5dcffd295..3e58ac721 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -1063,6 +1063,28 @@ a:link:after, a:visited:after { } } +.table-pendencias { + tbody { + tr { + td { + border-top: 1px solid white; + padding: 5px; + vertical-align: middle; + ul { + margin: 0px; + /*padding: 0px; + list-style: none;*/ + li { + &:hover { + background-color: rgba(0, 0, 0, 0.1) + } + } + } + } + } + } +} + .btn-modal-open { float: right; } @@ -1071,9 +1093,11 @@ a:link:after, a:visited:after { .class_color_container { background: #ddd !important; } + .clear { clear:both; } + .mce-panel { /*border: 0px solid #ccc !important;*/ } diff --git a/templates/compilacao/text_list_bloco.html b/templates/compilacao/text_list_bloco.html index 5ee5de08d..5b10e7f75 100644 --- a/templates/compilacao/text_list_bloco.html +++ b/templates/compilacao/text_list_bloco.html @@ -72,9 +72,9 @@
Vide:
{% if vide.dispositivo_ref.dispositivo_pai.nivel != 0 and vide.dispositivo_ref.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao %} - {{ vide.dispositivo_ref.dispositivo_pai}} + {{ vide.dispositivo_ref}} {% trans 'do'%} {{ vide.dispositivo_ref.dispositivo_pai}} - {{ vide.dispositivo_ref.dispositivo_pai.ta}} {% else %} - {{ vide.dispositivo_ref}} + {{ vide.dispositivo_ref}} - {{vide.dispositivo_ref.ta}} {% endif %} {% if vide.texto %} - {{vide.texto}}{% endif %}
@@ -100,9 +100,9 @@
Citado em:
{% if vide.dispositivo_base.dispositivo_pai.nivel != 0 and vide.dispositivo_base.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao%} - {{ vide.dispositivo_base.dispositivo_pai}} + {{ vide.dispositivo_base}} {% trans 'do'%} {{ vide.dispositivo_base.dispositivo_pai}} - {{ vide.dispositivo_base.dispositivo_pai.ta}} {% else %} - {{ vide.dispositivo_base}} + {{ vide.dispositivo_base}} - {{ vide.dispositivo_base.ta}} {% endif %} {% if vide.texto %} - {{vide.texto}}{% endif %}
diff --git a/templates/compilacao/text_pendencias.html b/templates/compilacao/text_pendencias.html new file mode 100644 index 000000000..ba59856d7 --- /dev/null +++ b/templates/compilacao/text_pendencias.html @@ -0,0 +1,52 @@ +{% extends "base.html" %} +{% load i18n compilacao_filters common_tags sass_tags%} + +{% block base_content %} + + {% block head_content %}{{block.super}} + + {% endblock %} + + + + + + + + + {% for dpt in object_list %} + + + {% if dpt.contextual_class %} + + {% endif %} + + {% endfor %} + +
{% trans "Dispositivos" %}{% trans "Pendências" %}
+
+
+
+ {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }} + {% if dpt.rotulo or dpt.nivel = 1 %}{{ dpt.rotulo }}{%else%}[{{ dpt|nomenclatura}}{% if dpt.dispositivo_pai_id %} {% trans "de" %} {{ dpt.dispositivo_pai.rotulo }}{% endif %}] - {% endif %} + {{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }} + {{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% endif %}{% endif %} +
+
+
+
+
    + {% for p in dpt.pendencias %} +
  • + {%if p.2 %} + {{p.1}} + {% else%} + {{p.1}} + {% endif %}
  • + {% endfor %} +
+
+{% endblock %} diff --git a/templates/norma/subnav.yaml b/templates/norma/subnav.yaml new file mode 100644 index 000000000..638daf96e --- /dev/null +++ b/templates/norma/subnav.yaml @@ -0,0 +1,9 @@ +- title: Início + url: normajuridica_detail + +# Opção adicionada para chamar o TextoArticulado da norma. +# para integração foram necessárias apenas criar a url norma_ta em urls.py +# e a view NormaTaView(IntegracaoTaView) em views.py +# Em nada mais a integração interfere em NormaJuridica +- title: Texto + url: norma_ta