Browse Source

Criado quatro formatos de visualização de uma Norma

- TMS - Texto Multivigente Sequencial
- TMI - Texto Multivigente Integrado com Realce de Aterações
- TVL - Texto Vigente COM Link para Normas Alteradoras
- TVT - Texto Vigente
pull/98/head
LeandroRoberto 9 years ago
parent
commit
894e02920b
  1. 19
      compilacao/migrations/0030_auto_20151203_1114.py
  2. 19
      compilacao/migrations/0030_auto_20151203_1117.py
  3. 1
      compilacao/models.py
  4. 5
      compilacao/templatetags/compilacao_filters.py
  5. 44
      compilacao/views.py
  6. 1
      sapl/settings.py
  7. 1
      sessao/views.py
  8. 5
      static/js/compilacao_edit.js
  9. 67
      static/js/compilacao_view.js
  10. 17
      static/styles/compilacao.scss
  11. 4
      templates/compilacao/edit.html
  12. 6
      templates/compilacao/edit_bloco.html
  13. 20
      templates/compilacao/index.html
  14. 22
      templates/compilacao/index_bloco.html

19
compilacao/migrations/0030_auto_20151203_1114.py

@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0029_auto_20151201_1611'),
]
operations = [
migrations.AlterField(
model_name='tipodispositivo',
name='relacoes_diretas_pai_filho',
field=models.ManyToManyField(to='compilacao.TipoDispositivo', related_name='+', through='compilacao.TipoDispositivoRelationship'),
),
]

19
compilacao/migrations/0030_auto_20151203_1117.py

@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0029_auto_20151201_1611'),
]
operations = [
migrations.AlterField(
model_name='tipodispositivo',
name='relacoes_diretas_pai_filho',
field=models.ManyToManyField(to='compilacao.TipoDispositivo', through='compilacao.TipoDispositivoRelationship', related_name='+'),
),
]

1
compilacao/models.py

@ -1,7 +1,6 @@
from datetime import datetime from datetime import datetime
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.db.models import F, Q from django.db.models import F, Q
from django.db.models.aggregates import Max from django.db.models.aggregates import Max

5
compilacao/templatetags/compilacao_filters.py

@ -22,8 +22,9 @@ def get_tipos_dispositivo(pk_atual):
@register.filter @register.filter
def get_field(value_dict, key): def lookup(d, key):
return value_dict[key] skey = str(key)
return d[str(key)] if skey in d else []
@register.simple_tag @register.simple_tag

44
compilacao/views.py

@ -133,17 +133,43 @@ class CompilacaoView(ListView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(CompilacaoView, self).get_context_data(**kwargs) context = super(CompilacaoView, self).get_context_data(**kwargs)
vides = Vide.objects.filter( cita = Vide.objects.filter(
Q(dispositivo_base__norma_id=self.kwargs['norma_id']) | Q(dispositivo_base__norma_id=self.kwargs['norma_id'])).\
Q(dispositivo_ref__norma_id=self.kwargs['norma_id'])) select_related(
'dispositivo_ref',
context['cita'] = [v.dispositivo_base_id for v in vides] 'dispositivo_ref__norma',
context['citado'] = [v.dispositivo_ref_id for v in vides] 'dispositivo_ref__dispositivo_pai',
'dispositivo_ref__dispositivo_pai__norma', 'tipo')
context['cita'] = {}
for c in cita:
if str(c.dispositivo_base_id) not in context['cita']:
context['cita'][str(c.dispositivo_base_id)] = []
context['cita'][str(c.dispositivo_base_id)].append(c)
citado = Vide.objects.filter(
Q(dispositivo_ref__norma_id=self.kwargs['norma_id'])).\
select_related(
'dispositivo_base',
'dispositivo_base__norma',
'dispositivo_base__dispositivo_pai',
'dispositivo_base__dispositivo_pai__norma', 'tipo')
context['citado'] = {}
for c in citado:
if str(c.dispositivo_ref_id) not in context['citado']:
context['citado'][str(c.dispositivo_ref_id)] = []
context['citado'][str(c.dispositivo_ref_id)].append(c)
notas = Nota.objects.filter( notas = Nota.objects.filter(
dispositivo__norma_id=self.kwargs['norma_id']) dispositivo__norma_id=self.kwargs['norma_id']).select_related(
'owner', 'tipo')
context['notas'] = [n.dispositivo_id for n in notas]
context['notas'] = {}
for n in notas:
if str(n.dispositivo_id) not in context['notas']:
context['notas'][str(n.dispositivo_id)] = []
context['notas'][str(n.dispositivo_id)].append(n)
return context return context
def get_queryset(self): def get_queryset(self):

1
sapl/settings.py

@ -160,6 +160,7 @@ BOWER_INSTALLED_APPS = (
'jquery-ui', 'jquery-ui',
'jquery-runner', 'jquery-runner',
'jQuery-Mask-Plugin', 'jQuery-Mask-Plugin',
'jsdiff',
) )
# Additional search paths for SASS files when using the @import statement # Additional search paths for SASS files when using the @import statement

1
sessao/views.py

@ -25,6 +25,7 @@ from .models import (CargoMesa, ExpedienteMateria, ExpedienteSessao,
TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria,
VotoParlamentar) VotoParlamentar)
tipo_sessao_crud = build_crud( tipo_sessao_crud = build_crud(
TipoSessaoPlenaria, 'tipo_sessao_plenaria', [ TipoSessaoPlenaria, 'tipo_sessao_plenaria', [

5
static/js/compilacao_edit.js

@ -131,6 +131,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
if (flag_actions_vibible == null || flag_actions_vibible) if (flag_actions_vibible == null || flag_actions_vibible)
clearEditSelected(); clearEditSelected();
//$( '#dpt' + pk_refresh+' > .bloco' ).addClass('displaynone' );
$( '#dpt' + pk_refresh ).prepend( data ); $( '#dpt' + pk_refresh ).prepend( data );
} }
@ -167,7 +168,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
$('#dpt'+pk_edit).addClass('dpt-selected'); $('#dpt'+pk_edit).addClass('dpt-selected');
$('html, body').animate({ $('html, body').animate({
scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10 scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10
}, 300); }, 0);
} }
} }
@ -217,6 +218,8 @@ function refreshScreenFocusPk(data) {
} }
function clearEditSelected() { function clearEditSelected() {
$('.bloco' ).removeClass('displaynone' );
$(".container").removeClass('class_color_container'); $(".container").removeClass('class_color_container');
tinymce.remove(); tinymce.remove();
$('.dpt-selected').removeClass('dpt-selected'); $('.dpt-selected').removeClass('dpt-selected');

67
static/js/compilacao_view.js

@ -14,17 +14,74 @@ $(window).load(function() {
}, 100); }, 100);
}); });
function textoMultiVigente(item) { function textoMultiVigente(item, diff) {
$(".cp .tipo-vigencias a").removeClass("selected") $(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected") $(item).addClass("selected")
$(".desativado").removeClass("displaynone"); $(".dptt.desativado").removeClass("displaynone");
$(".dtxt").removeClass("displaynone");
$(".dtxt.diff").remove();
$(".link_alterador").removeClass("displaynone"); $(".link_alterador").removeClass("displaynone");
if (diff) {
$(".dtxt[id^='da'").each(function() {
if ($(this).html().indexOf('</table>') > 0)
return;
var pk = $(this).attr('pk')
var pks = $(this).attr('pks')
var a = $('#d'+pks).contents().filter(function () {
return this.nodeType === Node.TEXT_NODE;
});
var b = $('#da'+pk).contents().filter(function () {
return this.nodeType === Node.TEXT_NODE;
});
var diff = JsDiff.diffWordsWithSpace($(a).text(), $(b).text());
if (diff.length > 0) {
$('#d'+pk).addClass("displaynone");
var clone = $('#da'+pk).clone();
$('#da'+pk).after( clone );
$('#da'+pk).addClass('displaynone');
$(clone).addClass('diff').html('');
diff.forEach(function(part){
var color = part.added ? '#018' :
part.removed ? '#faa' : '';
var span = document.createElement('span');
var value = part.value;
if (part.removed) {
$(span).addClass('desativado')
value += ' ';
}
else if (part.added) {
$(span).addClass('added')
}
span.appendChild(document.createTextNode(value));
$(clone).append(span);
});
}
});
//textoVigente(item, true);
}
} }
function textoVigente(item, link) { function textoVigente(item, link) {
$(".cp .tipo-vigencias a").removeClass("selected") $(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected") $(item).addClass("selected")
$(".desativado").addClass("displaynone");
$(".dptt.desativado").addClass("displaynone");
$(".link_alterador").removeClass("displaynone"); $(".link_alterador").removeClass("displaynone");
if (!link) if (!link)
$(".link_alterador").addClass("displaynone"); $(".link_alterador").addClass("displaynone");
@ -37,4 +94,8 @@ $(document).ready(function() {
$("#btn_font_mais").click(function() { $("#btn_font_mais").click(function() {
$(".dpt").css("font-size", "+=1"); $(".dpt").css("font-size", "+=1");
}); });
}); });

17
static/styles/compilacao.scss

@ -150,6 +150,15 @@ a:link:after, a:visited:after {
border: 1px dotted #ccc; border: 1px dotted #ccc;
} }
} }
.diff {
.desativado, .desativado * {
text-decoration: line-through;
color: #dbb !important;
}
.added {
color: #018;
}
}
.dpt { .dpt {
font-size:1em; font-size:1em;
@ -250,6 +259,9 @@ a:link:after, a:visited:after {
&.link_alterador { &.link_alterador {
color: #2980B9; color: #2980B9;
font-size: 0.75em; font-size: 0.75em;
&:hover {
text-decoration: underline;
}
} }
&.desativado { &.desativado {
@extend .desativado; @extend .desativado;
@ -635,6 +647,10 @@ a:link:after, a:visited:after {
.tipo-vigencias { .tipo-vigencias {
border-top: 1px solid #62B5B5; border-top: 1px solid #62B5B5;
position: fixed;
bottom: 0;
transform: translate(-50%,0);
left: 50%;
} }
.vigencias { .vigencias {
@ -784,6 +800,7 @@ a:link:after, a:visited:after {
padding: 2.2em 2.2em 1.6em 2.2em; padding: 2.2em 2.2em 1.6em 2.2em;
box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 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); @include background-top-down(#eaeaee, #ddd);

4
templates/compilacao/edit.html

@ -19,6 +19,8 @@
{% block base_content %} {% block base_content %}
<div id="message_block"><div id="msg">{% trans 'Aguarde... Atualizando informações!!!'%}</div></div> <div id="message_block"><div id="msg">{% trans 'Aguarde... Atualizando informações!!!'%}</div></div>
<div class="cpe"> <div class="cpe">
@ -26,7 +28,7 @@
</div> </div>
{% if user.is_authenticated and False %} {% if False %}
<form method="POST" enctype="multipart/form-data"> <form method="POST" enctype="multipart/form-data">
{% csrf_token %} {% csrf_token %}

6
templates/compilacao/edit_bloco.html

@ -46,10 +46,10 @@
<ul class="actions_inserts {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}menu_flutuante{%endif%}"> <ul class="actions_inserts {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}menu_flutuante{%endif%}">
{% if dpt.dispositivo_subsequente == None %} {% if dpt.dispositivo_subsequente == None %}
{% for inserts in view|select_provaveis_inserts:request %} {% for inserts in view|select_provaveis_inserts:request %}
<li class="{{inserts|get_field:'action'}}"><a class="btn-inserts" action="" pk="{{dpt.pk}}">{{inserts|get_field:'icone'|safe}}<span>{{inserts|get_field:'tipo_insert'}}</span></a> <li class="{{inserts|lookup:'action'}}"><a class="btn-inserts" action="" pk="{{dpt.pk}}">{{inserts|lookup:'icone'|safe}}<span>{{inserts|lookup:'tipo_insert'}}</span></a>
<ul id="afe{{dpt.id}}" > <ul id="afe{{dpt.id}}" >
{% for item in inserts|get_field:'itens' %} {% for item in inserts|lookup:'itens' %}
<li><a class="btn-inserts btn-action" action="{{inserts|get_field:'action'}}" pk="{{item|get_field:'dispositivo_base'}}" variacao="{{item|get_field:'variacao'}}" tipo_pk="{{item|get_field:'tipo_pk'}}">{{item|get_field:'provavel'}}</a></li> <li><a class="btn-inserts btn-action" action="{{inserts|lookup:'action'}}" pk="{{item|lookup:'dispositivo_base'}}" variacao="{{item|lookup:'variacao'}}" tipo_pk="{{item|lookup:'tipo_pk'}}">{{item|lookup:'provavel'}}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>
</li> </li>

20
templates/compilacao/index.html

@ -6,12 +6,14 @@
{% block head_content %}{{block.super}} {% block head_content %}{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css"> <link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
<script type="text/javascript" src="{% static 'jsdiff/diff.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script> <script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_view.js' %}"></script> <script type="text/javascript" src="{% static 'js/compilacao_view.js' %}"></script>
{# TODO: incluir javascript compilacao_notas apenas se houver usuário conectado e que possua permissão para cadastro de notas #} {# TODO: incluir javascript compilacao_notas apenas se houver usuário conectado e que possua permissão para cadastro de notas #}
<script type="text/javascript" src="{% static 'js/compilacao_notas.js' %}"></script> <script type="text/javascript" src="{% static 'js/compilacao_notas.js' %}"></script>
{% endblock %} {% endblock %}
@ -21,6 +23,7 @@
{% block base_content %} {% block base_content %}
<div class="cp"> <div class="cp">
<div style="float: right; clear:right;"> <div style="float: right; clear:right;">
@ -62,11 +65,26 @@
</li> </li>
{% if forloop.last %} {% if forloop.last %}
</ul> </ul>
{% comment %}
<ul class="nav left tipo-vigencias"> <ul class="nav left tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this);">{% trans 'Texto Multivigente'%}</a></li> <li><a class="selected" onclick="textoMultiVigente(this);" title="">{% trans 'Texto Multivigente'%}</a></li>
<li><a onclick="textoVigente(this, true);">{% trans 'Texto Vigente COM Links para Normas Alteradoras'%}</a></li> <li><a onclick="textoVigente(this, true);">{% trans 'Texto Vigente COM Links para Normas Alteradoras'%}</a></li>
<li><a onclick="textoVigente(this, false);">{% trans 'Texto Vigente SEM Links para Normas Alteradoras'%}</a></li> <li><a onclick="textoVigente(this, false);">{% trans 'Texto Vigente SEM Links para Normas Alteradoras'%}</a></li>
</ul> </ul>
{% endcomment %}
<ul class="tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this, false);" title="{% trans 'Texto Multivigente Sequencial'%}">{% trans 'TMS'%}</a></li>
<li><a onclick="textoMultiVigente(this, true);" title="{% trans 'Texto Multivigente Integrado com Realce de Alterações'%}">{% trans 'TMI'%}</a></li>
<li><a onclick="textoVigente(this, true);" title="{% trans 'Texto Vigente COM Links para Normas Alteradoras'%}">{% trans 'TVL'%}</a></li>
<li><a onclick="textoVigente(this, false);" title="{% trans 'Texto Vigente'%}">{% trans 'TVT'%}</a></li>
</ul>
</section> </section>
</nav> </nav>
</section> </section>

22
templates/compilacao/index_bloco.html

@ -1,6 +1,8 @@
{% load i18n %} {% load i18n %}
{% load compilacao_filters %} {% load compilacao_filters %}
<div class="display"></div>
{% for dpt in object_list %} {% for dpt in object_list %}
{% if dpt.nivel == view.flag_nivel_old %} {% if dpt.nivel == view.flag_nivel_old %}
</div> </div>
@ -16,8 +18,8 @@
{% spaceless %} {% spaceless %}
<div class="{{ dpt.tipo_dispositivo.class_css }}"> <div class="{{ dpt.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}"> <div class="dptt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}" id="dptt{{dpt.pk}}" >
{{ 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%} {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.rotulo }}</a>{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}<span class="dtxt" id="d{% if not dpt.dispositivo_subsequente and dpt.dispositivo_substituido %}a{%endif%}{{dpt.pk}}" pks="{{dpt.dispositivo_substituido.pk}}" pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%}&nbsp;{%endif%}</span>
{% 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 }}
@ -41,8 +43,11 @@
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%} {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%}
<div class="dn" id="dn{{dpt.pk}}" pk="{{dpt.pk}}">{# Dispostivo Nota e Vides #} <div class="dn" id="dn{{dpt.pk}}" pk="{{dpt.pk}}">{# Dispostivo Nota e Vides #}
<ul class="dnl">{# Dispostivo Nota Lista#} <ul class="dnl">{# Dispostivo Nota Lista#}
{% if cita and dpt.pk in cita %}
{% for vide in dpt.cita.all %}
{% if cita and cita|lookup:dpt.pk %}
{% for vide in cita|lookup:dpt.pk %}
{%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%} {%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%}
<li class="dnli" id="nt{{vide.pk}}"> <li class="dnli" id="nt{{vide.pk}}">
@ -74,8 +79,8 @@
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% if citado and dpt.pk in citado %} {% if citado and citado|lookup:dpt.pk %}
{% for vide in dpt.citado.all %} {% for vide in citado|lookup:dpt.pk %}
{%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%} {%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%}
<li class="dnli" id="nt{{vide.pk}}"> <li class="dnli" id="nt{{vide.pk}}">
<ul> <ul>
@ -100,9 +105,8 @@
{%if notas and dpt.pk in notas and dpt.pk in cita or dpt.pk in citado and notas%}<li class="bullet">&#8226;</li>{%endif%} {%if notas and dpt.pk in notas and dpt.pk in cita or dpt.pk in citado and notas%}<li class="bullet">&#8226;</li>{%endif%}
{% if notas and dpt.pk in notas %} {% if notas and notas|lookup:dpt.pk %}
{% for nota in notas|lookup:dpt.pk %}
{% for nota in dpt.notas.all %}
{% if user.is_superuser or nota.publicidade == nota.NPUBL or nota.publicidade == nota.NINST and user.is_authenticated or nota.publicidade = nota.NPRIV and nota.owner == user %} {% if user.is_superuser or nota.publicidade == nota.NPUBL or nota.publicidade == nota.NINST and user.is_authenticated or nota.publicidade = nota.NPRIV and nota.owner == user %}
{%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%} {%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%}

Loading…
Cancel
Save