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. 28
      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 django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.db import models
from django.db.models import F, Q
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
def get_field(value_dict, key):
return value_dict[key]
def lookup(d, key):
skey = str(key)
return d[str(key)] if skey in d else []
@register.simple_tag

44
compilacao/views.py

@ -133,17 +133,43 @@ class CompilacaoView(ListView):
def get_context_data(self, **kwargs):
context = super(CompilacaoView, self).get_context_data(**kwargs)
vides = Vide.objects.filter(
Q(dispositivo_base__norma_id=self.kwargs['norma_id']) |
Q(dispositivo_ref__norma_id=self.kwargs['norma_id']))
context['cita'] = [v.dispositivo_base_id for v in vides]
context['citado'] = [v.dispositivo_ref_id for v in vides]
cita = Vide.objects.filter(
Q(dispositivo_base__norma_id=self.kwargs['norma_id'])).\
select_related(
'dispositivo_ref',
'dispositivo_ref__norma',
'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(
dispositivo__norma_id=self.kwargs['norma_id'])
context['notas'] = [n.dispositivo_id for n in notas]
dispositivo__norma_id=self.kwargs['norma_id']).select_related(
'owner', 'tipo')
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
def get_queryset(self):

1
sapl/settings.py

@ -160,6 +160,7 @@ BOWER_INSTALLED_APPS = (
'jquery-ui',
'jquery-runner',
'jQuery-Mask-Plugin',
'jsdiff',
)
# 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,
VotoParlamentar)
tipo_sessao_crud = build_crud(
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)
clearEditSelected();
//$( '#dpt' + pk_refresh+' > .bloco' ).addClass('displaynone' );
$( '#dpt' + pk_refresh ).prepend( data );
}
@ -167,7 +168,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
$('#dpt'+pk_edit).addClass('dpt-selected');
$('html, body').animate({
scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10
}, 300);
}, 0);
}
}
@ -217,6 +218,8 @@ function refreshScreenFocusPk(data) {
}
function clearEditSelected() {
$('.bloco' ).removeClass('displaynone' );
$(".container").removeClass('class_color_container');
tinymce.remove();
$('.dpt-selected').removeClass('dpt-selected');

67
static/js/compilacao_view.js

@ -14,17 +14,74 @@ $(window).load(function() {
}, 100);
});
function textoMultiVigente(item) {
function textoMultiVigente(item, diff) {
$(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected")
$(".desativado").removeClass("displaynone");
$(".dptt.desativado").removeClass("displaynone");
$(".dtxt").removeClass("displaynone");
$(".dtxt.diff").remove();
$(".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) {
$(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected")
$(".desativado").addClass("displaynone");
$(".dptt.desativado").addClass("displaynone");
$(".link_alterador").removeClass("displaynone");
if (!link)
$(".link_alterador").addClass("displaynone");
@ -37,4 +94,8 @@ $(document).ready(function() {
$("#btn_font_mais").click(function() {
$(".dpt").css("font-size", "+=1");
});
});

17
static/styles/compilacao.scss

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

4
templates/compilacao/edit.html

@ -19,6 +19,8 @@
{% block base_content %}
<div id="message_block"><div id="msg">{% trans 'Aguarde... Atualizando informações!!!'%}</div></div>
<div class="cpe">
@ -26,7 +28,7 @@
</div>
{% if user.is_authenticated and False %}
{% if False %}
<form method="POST" enctype="multipart/form-data">
{% 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%}">
{% if dpt.dispositivo_subsequente == None %}
{% 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}}" >
{% for item in inserts|get_field:'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>
{% for item in inserts|lookup:'itens' %}
<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 %}
</ul>
</li>

28
templates/compilacao/index.html

@ -6,12 +6,14 @@
{% block head_content %}{{block.super}}
<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_view.js' %}"></script>
{# 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>
{% endblock %}
@ -21,6 +23,7 @@
{% block base_content %}
<div class="cp">
<div style="float: right; clear:right;">
@ -62,11 +65,26 @@
</li>
{% if forloop.last %}
</ul>
<ul class="nav left tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this);">{% 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, false);">{% trans 'Texto Vigente SEM Links para Normas Alteradoras'%}</a></li>
</ul>
{% comment %}
<ul class="nav left tipo-vigencias">
<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, false);">{% trans 'Texto Vigente SEM Links para Normas Alteradoras'%}</a></li>
</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>
</nav>
</section>

22
templates/compilacao/index_bloco.html

@ -1,6 +1,8 @@
{% load i18n %}
{% load compilacao_filters %}
<div class="display"></div>
{% for dpt in object_list %}
{% if dpt.nivel == view.flag_nivel_old %}
</div>
@ -16,8 +18,8 @@
{% spaceless %}
<div class="{{ dpt.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}">
{{ 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%}
<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 }}<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 %}
<a class="link_alterador" href="{%url 'compilacao' dpt.norma_publicada.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
@ -41,8 +43,11 @@
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%}
<div class="dn" id="dn{{dpt.pk}}" pk="{{dpt.pk}}">{# Dispostivo Nota e Vides #}
<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%}
<li class="dnli" id="nt{{vide.pk}}">
@ -74,8 +79,8 @@
{% endfor %}
{% endif %}
{% if citado and dpt.pk in citado %}
{% for vide in dpt.citado.all %}
{% if citado and citado|lookup:dpt.pk %}
{% for vide in citado|lookup:dpt.pk %}
{%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%}
<li class="dnli" id="nt{{vide.pk}}">
<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 %}
{% for nota in dpt.notas.all %}
{% if notas and notas|lookup:dpt.pk %}
{% for nota in notas|lookup:dpt.pk %}
{% 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%}

Loading…
Cancel
Save