Browse Source

Merge pull request #383 from interlegis/compilacao

Adição de Lista de Pendências e ajustes na integração
pull/384/head
Leandro Roberto da Silva 9 years ago
parent
commit
b2053934c9
  1. 17
      compilacao/forms.py
  2. 3
      compilacao/urls.py
  3. 166
      compilacao/views.py
  4. 3
      materia/urls.py
  5. 20
      norma/urls.py
  6. 1
      norma/views.py
  7. 2
      protocoloadm/views.py
  8. 1
      static/js/compilacao_edit.js
  9. 21
      static/js/compilacao_notas.js
  10. 24
      static/styles/compilacao.scss
  11. 8
      templates/compilacao/text_list_bloco.html
  12. 52
      templates/compilacao/text_pendencias.html
  13. 9
      templates/norma/subnav.yaml

17
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)

3
compilacao/urls.py

@ -27,6 +27,9 @@ urlpatterns_compilacao = [
url(r'^(?P<ta_id>[0-9]+)/text/edit',
views.TextEditView.as_view(), name='ta_text_edit'),
url(r'^(?P<ta_id>[0-9]+)/text/pendencias',
views.TextPendenciasView.as_view(), name='ta_text_pendencias'),
url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/$',
views.DispositivoView.as_view(), name='dispositivo'),

166
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

3
materia/urls.py

@ -29,13 +29,12 @@ urlpatterns = [
DespachoInicialCrud.get_urls() +
NumeracaoCrud.get_urls())),
# Integração com Compilação
url(r'^materia/(?P<pk>[0-9]+)/ta$',
MateriaTaView.as_view(), name='materia_ta'),
url(r'^materia/proposicao/(?P<pk>[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())),

20
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<pk>[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<pk>[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<pk>[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$',

1
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, '')

2
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 _

1
static/js/compilacao_edit.js

@ -1,6 +1,5 @@
var editortype = "textarea";
var gets = 0;
var onSubmitEditForm = function(event) {
var texto = '';

21
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()
});

24
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;*/
}

8
templates/compilacao/text_list_bloco.html

@ -72,9 +72,9 @@
<div class="ntitulo">Vide: </div>
<div class="ntexto">
{% if vide.dispositivo_ref.dispositivo_pai.nivel != 0 and vide.dispositivo_ref.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao %}
<a href="{%url 'compilacao:ta_text' vide.dispositivo_ref.dispositivo_pai.ta.pk%}#{{vide.dispositivo_ref.dispositivo_pai.pk }}">{{ vide.dispositivo_ref.dispositivo_pai}}</a>
<a href="{%url 'compilacao:ta_text' vide.dispositivo_ref.dispositivo_pai.ta.pk%}#{{vide.dispositivo_ref.dispositivo_pai.pk }}">{{ vide.dispositivo_ref}} {% trans 'do'%} {{ vide.dispositivo_ref.dispositivo_pai}} - {{ vide.dispositivo_ref.dispositivo_pai.ta}}</a>
{% else %}
<a href="{%url 'compilacao:ta_text' vide.dispositivo_ref.ta.pk%}#{{vide.dispositivo_ref.pk }}">{{ vide.dispositivo_ref}}</a>
<a href="{%url 'compilacao:ta_text' vide.dispositivo_ref.ta.pk%}#{{vide.dispositivo_ref.pk }}">{{ vide.dispositivo_ref}} - {{vide.dispositivo_ref.ta}}</a>
{% endif %}
{% if vide.texto %} - {{vide.texto}}{% endif %}
</div>
@ -100,9 +100,9 @@
<div class="ntitulo">Citado em: </div>
<div class="ntexto">
{% if vide.dispositivo_base.dispositivo_pai.nivel != 0 and vide.dispositivo_base.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao%}
<a href="{%url 'compilacao:ta_text' vide.dispositivo_base.dispositivo_pai.ta.pk%}#{{vide.dispositivo_base.dispositivo_pai.pk }}">{{ vide.dispositivo_base.dispositivo_pai}}</a>
<a href="{%url 'compilacao:ta_text' vide.dispositivo_base.dispositivo_pai.ta.pk%}#{{vide.dispositivo_base.dispositivo_pai.pk }}">{{ vide.dispositivo_base}} {% trans 'do'%} {{ vide.dispositivo_base.dispositivo_pai}} - {{ vide.dispositivo_base.dispositivo_pai.ta}}</a>
{% else %}
<a href="{%url 'compilacao:ta_text' vide.dispositivo_base.ta.pk%}#{{vide.dispositivo_base.pk }}">{{ vide.dispositivo_base}}</a>
<a href="{%url 'compilacao:ta_text' vide.dispositivo_base.ta.pk%}#{{vide.dispositivo_base.pk }}">{{ vide.dispositivo_base}} - {{ vide.dispositivo_base.ta}}</a>
{% endif %}
{% if vide.texto %} - {{vide.texto}}{% endif %}
</div>

52
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}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
{% endblock %}
<table class="table table-striped table-hover table-pendencias">
<thead>
<tr>
<th>{% trans "Dispositivos" %}</th>
<th>{% trans "Pendências" %}</th>
</tr>
</thead>
<tbody>
{% for dpt in object_list %}
<tr class="{{dpt.contextual_class}}">
<td class="cp" width="63%" {% if not dpt.contextual_class %}colspan=2{% endif %} >
<div class="dpt">
<div class="{{ dpt.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado dpt None None %}" id="dptt{{dpt.pk}}" >
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}
<a href="{% url 'compilacao:ta_text_edit' dpt.ta_id %}#{{dpt.pk}}">{% 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 %}</a>
{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}
<span class="dtxt"
id="d{% if not dpt.dispositivo_subsequente_id and dpt.dispositivo_substituido_id %}a{% endif %}{{dpt.pk}}"
pks="{{dpt.dispositivo_substituido_id|default:''}}"
pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}&nbsp;{% endif %}{% endif %}</span>
</div>
</div>
</div>
</td>
{% if dpt.contextual_class %}
<td>
<ul>
{% for p in dpt.pendencias %}
<li>
{%if p.2 %}
<a target="_blank" class="text-{{p.0}}" href="{{p.2}}{%if p.3 %}#{{p.3}}{% endif %}"><u>{{p.1}}</u></a>
{% else%}
<span class="text-{{p.0}}">{{p.1}}</span>
{% endif %}</li>
{% endfor %}
</ul>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

9
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
Loading…
Cancel
Save