Browse Source

Construction of the first views on app compilacao

Portuguese in message:
- primeira visualização de normas sem controle de vigências
- visualização e lincagem das normas alteradoras
- sem notas e vides
pull/6/head
LeandroRoberto 9 years ago
parent
commit
cd2179c0c1
  1. 34
      compilacao/migrations/0004_auto_20150914_0842.py
  2. 6
      compilacao/models.py
  3. 51
      compilacao/templatetags/compilacao_filters.py
  4. 4
      compilacao/urls.py
  5. 102
      compilacao/views.py
  6. 7
      norma/models.py
  7. 9
      norma/urls.py
  8. 11
      norma/views.py
  9. 130
      static/styles/compilacao.scss
  10. 18
      templates/compilacao/bloco_alteracao.html
  11. 34
      templates/compilacao/index.html
  12. 42
      templates/compilacao/template_render_bloco.html
  13. 9
      templates/norma/normajuridica_detail.html

34
compilacao/migrations/0004_auto_20150914_0842.py

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0003_auto_20150911_1735'),
]
operations = [
migrations.AlterField(
model_name='dispositivo',
name='dispositivo_pai',
field=models.ForeignKey(to='compilacao.Dispositivo', verbose_name='Dispositivo Pai', blank=True, related_name='dispositivos_filhos_set', null=True, default=None),
),
migrations.AlterField(
model_name='dispositivo',
name='norma',
field=models.ForeignKey(related_name='dispositivos_set', to='norma.NormaJuridica', verbose_name='Norma Jurídica'),
),
migrations.AlterField(
model_name='dispositivo',
name='norma_publicada',
field=models.ForeignKey(to='norma.NormaJuridica', verbose_name='Norma Jurídica Publicada', blank=True, related_name='dispositivos_alterados_pela_norma_set', null=True, default=None),
),
migrations.AlterField(
model_name='dispositivo',
name='tipo_dispositivo',
field=models.ForeignKey(related_name='dispositivos_do_tipo_set', to='compilacao.TipoDispositivo', verbose_name='Tipo do Dispositivo'),
),
]

6
compilacao/models.py

@ -264,6 +264,7 @@ class Dispositivo(models.Model):
tipo_dispositivo = models.ForeignKey(
TipoDispositivo,
related_name='dispositivos_do_tipo_set',
verbose_name=_('Tipo do Dispositivo'))
publicacao = models.ForeignKey(
@ -272,11 +273,12 @@ class Dispositivo(models.Model):
norma = models.ForeignKey(
NormaJuridica,
related_name='dispositivos_set',
verbose_name=_('Norma Jurídica'))
norma_publicada = models.ForeignKey(
NormaJuridica,
blank=True, null=True, default=None,
related_name='dispositivos_alterados_set',
related_name='dispositivos_alterados_pela_norma_set',
verbose_name=_('Norma Jurídica Publicada'))
dispositivo_subsequente = models.ForeignKey(
@ -292,7 +294,7 @@ class Dispositivo(models.Model):
dispositivo_pai = models.ForeignKey(
'self',
blank=True, null=True, default=None,
related_name='filhos',
related_name='dispositivos_filhos_set',
verbose_name=_('Dispositivo Pai'))
dispositivo_vigencia = models.ForeignKey(
'self',

51
compilacao/templatetags/compilacao_filters.py

@ -1,13 +1,58 @@
from builtins import ValueError
from django import template
from django.db.models import Q
from compilacao.models import Dispositivo
register = template.Library()
@register.filter
def get_bloco(pk):
def get_bloco(pk_atualizador):
return Dispositivo.objects.order_by('ordem_bloco_atualizador').filter(
Q(dispositivo_pai_id=pk) |
Q(dispositivo_atualizador=pk)).select_related()
Q(dispositivo_pai_id=pk_atualizador) |
Q(dispositivo_atualizador_id=pk_atualizador)).select_related()
@register.filter
def bloco_ja_incluso(view, bloco):
try:
return view.itens_de_bloco.index(bloco) >= 0
except ValueError:
return False
@register.simple_tag
def dispositivo_desativado(dispositivo):
if dispositivo.fim_vigencia is not None:
return 'desativado'
return ''
@register.simple_tag
def nota_automatica(dispositivo):
# return ''
if dispositivo.norma_publicada is not None and \
dispositivo.tipo_dispositivo.class_css != 'artigo':
d = dispositivo.dispositivo_atualizador.dispositivo_pai
return 'Alteração feita pelo %s.' % d
return ''
@register.simple_tag
def set_nivel_old(view, value):
view.flag_nivel_old = value
return ''
@register.simple_tag
def append_to_itens_de_bloco(view, value):
view.itens_de_bloco.append(value)
return ''
@register.simple_tag
def close_div(value_max, value_min):
return '</div>' * (int(value_max) - int(value_min) + 1)

4
compilacao/urls.py

@ -3,6 +3,8 @@ from django.conf.urls import url
from compilacao import views
urlpatterns = [
url(r'^norma/(?P<norma_id>\d+)/compilacao/',
url(r'^norma/(?P<norma_id>[0-9]+)/compilacao/$',
views.CompilacaoView.as_view(), name='compilacao'),
url(r'^norma/(?P<norma_id>[0-9]+)/compilacao/(?P<dispositivo_id>[0-9]+)/$',
views.DispositivoView.as_view(), name='dispositivo'),
]

102
compilacao/views.py

@ -3,25 +3,109 @@ from django.views.generic.list import ListView
from compilacao.models import Dispositivo
from norma.models import NormaJuridica
DISPOSITIVO_SELECT_RELATED = (
'tipo_dispositivo',
'norma_publicada',
'norma',
'dispositivo_atualizador',
'dispositivo_atualizador__dispositivo_pai',
'dispositivo_atualizador__dispositivo_pai__norma',
'dispositivo_atualizador__dispositivo_pai__norma__tipo',
'dispositivo_pai')
class CompilacaoView(ListView):
model = Dispositivo
template_name = 'compilacao/index.html'
flag_alteradora = None
flag_alteradora = -1
flag_nivel_ini = 0
flag_nivel_old = -1
itens_de_bloco = []
def get_queryset(self):
self.flag_alteradora = -1
self.flag_nivel_ini = 0
self.flag_nivel_old = -1
self.itens_de_bloco = []
if self.is_norma_alteradora():
return Dispositivo.objects.filter(
ordem__gt=0,
norma_id=self.kwargs['norma_id'],
).select_related(*DISPOSITIVO_SELECT_RELATED)
else:
return Dispositivo.objects.filter(
ordem__gt=0,
norma_id=self.kwargs['norma_id']).select_related()
norma_id=self.kwargs['norma_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
def get_norma(self):
return NormaJuridica.objects.select_related('tipo').get(
pk=self.kwargs['norma_id'])
def is_norma_alteradora(self):
if self.flag_alteradora == -1:
self.flag_alteradora = Dispositivo.objects.select_related(
'dispositivos_alterados_pela_norma_set'
).filter(norma_id=self.kwargs['norma_id']).count()
return self.flag_alteradora > 0
class DispositivoView(ListView):
#template_name = 'compilacao/index.html'
template_name = 'compilacao/template_render_bloco.html'
flag_alteradora = None
flag_nivel_ini = 0
flag_nivel_old = -1
itens_de_bloco = []
def get_queryset(self):
self.flag_alteradora = -1
self.flag_nivel_ini = 0
self.flag_nivel_old = -1
self.itens_de_bloco = []
try:
bloco = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
except Dispositivo.DoesNotExist:
return []
self.flag_nivel_old = bloco.nivel - 1
self.flag_nivel_ini = bloco.nivel
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=bloco.ordem,
nivel__lte=bloco.nivel,
norma_publicada=None,
norma_id=self.kwargs['norma_id'])[:1]
if proximo_bloco.count() == 0:
itens = Dispositivo.objects.filter(
ordem__gte=bloco.ordem,
norma_publicada=None,
norma_id=self.kwargs['norma_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
else:
itens = Dispositivo.objects.filter(
ordem__gte=bloco.ordem,
ordem__lt=proximo_bloco[0].ordem,
norma_publicada=None,
norma_id=self.kwargs['norma_id']
).select_related(*DISPOSITIVO_SELECT_RELATED)
return itens
def get_norma(self):
return NormaJuridica.objects.get(
return NormaJuridica.objects.select_related('tipo').get(
pk=self.kwargs['norma_id'])
def is_norma_alteradora(self):
if self.flag_alteradora is None:
self.flag_alteradora = NormaJuridica.objects.get(
pk=self.kwargs['norma_id']
).dispositivos_alterados_set.count() > 1
return self.flag_alteradora
if self.flag_alteradora == -1:
self.flag_alteradora = Dispositivo.objects.select_related(
'dispositivos_alterados_pela_norma_set'
).filter(norma_id=self.kwargs['norma_id']).count()
return self.flag_alteradora > 0

7
norma/models.py

@ -1,4 +1,5 @@
from django.db import models
from django.template import defaultfilters
from django.utils.translation import ugettext_lazy as _
from materia.models import MateriaLegislativa
@ -96,13 +97,13 @@ class NormaJuridica(models.Model):
class Meta:
verbose_name = _('Norma Jurídica')
verbose_name_plural = _('Normas Jurídicas')
ordering = ['-data']
def __str__(self):
return _('%(tipo)s%(numero)s - %(data)s - %(ano)s') % {
return _('%(tipo)s%(numero)s de %(data)s') % {
'tipo': self.tipo,
'numero': self.numero,
'data': self.data,
'ano': self.ano}
'data': defaultfilters.date(self.data, "d \d\e N \d\e Y")}
class AssuntoNormaRelationship(models.Model):

9
norma/urls.py

@ -1,8 +1,15 @@
from django.conf.urls import include, url
from norma.views import assunto_norma_crud, tipo_norma_crud
from norma.views import (assunto_norma_crud, tipo_norma_crud,
norma_temporario_para_compilacao_crud)
norma_url_patterns = norma_temporario_para_compilacao_crud.urlpatterns
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)),
]

11
norma/views.py

@ -45,6 +45,17 @@ norma_crud = build_crud(
[('assunto_norma_FIXME', 12)]],
])
norma_temporario_para_compilacao_crud = build_crud(
NormaJuridica, 'norma', [
[_('Identificação Básica'),
[('tipo', 4), ('numero', 4), ('ano', 4)],
[('data', 4), ('esfera_federacao', 4)],
[('data_publicacao', 3)],
[('ementa', 12)]],
])
legislacao_citada_crud = build_crud(
LegislacaoCitada, '', [

130
static/styles/compilacao.scss

@ -1,7 +1,131 @@
.articulacao {
.articulacao div {
background-color: #fff;
}
.dispositivo {
background-color: #ddd !important;
transition: all .4s ease-in-out;
display:inline;
}
.dispositivo .ementa {
padding: 2em 0em 3em 50%;
font-weight: bold;
}
.dispositivo .anexo {
font-size: 1.4em;
text-align: center;
font-weight: bold;
margin-top: 3em;
}
.dispositivo .parte {
font-size: 1.5em;
text-align: center;
font-weight: bold;
margin-top: 2em;
}
.dispositivo .livro {
font-size: 1.5em;
text-align: center;
font-weight: bold;
margin-top: 2em;
}
.dispositivo .titulo {
font-size: 1.5em;
text-align: center;
font-weight: bold;
margin-top: 2em;
}
.dispositivo .capitulo {
margin-top: 1.5em;
font-size: 1.3em;
text-align: center;
font-weight: bold;
}
.dispositivo .secao {
margin-top: 0.8em;
font-size: 1.2em;
text-align: center;
font-weight: bold;
}
.dispositivo .subsecao, .dispositivo .itemsecao {
margin-top: 0.8em;
font-size: 1.2em;
text-align: center;
font-style: italic;
font-weight: bold;
}
.dispositivo .artigo {
font-size: 1.15em;
float:left;
}
.dispositivo .caput {
font-size: 1.15em;
margin-bottom: 0.5em;
display: block;
}
.dispositivo .paragrafo {
margin-left: 1.5em;
font-size: 1.1em;
margin-top: 5px;
margin-bottom: 3px;
}
.dispositivo .inciso {
font-size: 1.1em;
margin-left: 2.5em;
margin-top: 5px;
margin-bottom: 3px;
}
.dispositivo .alinea {
font-size: 1.0em;
margin-left: 3.5em;
}
.dispositivo .item {
font-size: 1.0em;
margin-left: 4.5em;
}
.dispositivo .desativado, .dispositivo .desativado * {
text-decoration: line-through;
color: #777 !important;
}
.dispositivo .desativado table, .dispositivo .desativado table td {
border: 1px dotted #ccc;
text-decoration: line-through;
}
.dispositivo a {
color: #444444 !important;
}
.dispositivo a.link_alterador {
color: #2980B9 !important;
font-size: 0.9rem;
}
.dispositivo .bloco_alteracao{
margin-left: 5em;
}
background-color: rgba(100,100,100,0.3);
margin: 1em;
.dispositivo .bloco_alteracao,
.dispositivo .bloco_alteracao a,
.dispositivo .bloco_alteracao table,
.dispositivo .bloco_alteracao table td {
color: #018 !important;
}

18
templates/compilacao/bloco_alteracao.html

@ -0,0 +1,18 @@
{% load compilacao_filters %}
{% for ch in dispositivo.pk|get_bloco %}
<div class="dispositivo" id="d{{ch.id}}">
<div class="{{ ch.tipo_dispositivo.class_css }}" id="{{ch.id}}" nivel="{{ch.nivel}}">
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}
<a name="ch.pk" href="{%url 'compilacao' ch.norma.pk %}#{{ch.pk}}">
{{ ch.rotulo }}
</a>
{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}
{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}
{{ ch.texto|safe }}
</div>
</div>
{% endfor %}

34
templates/compilacao/index.html

@ -7,40 +7,10 @@
<h1>{{ view.get_norma }}</h1>
{% endblock %}
{% block base_content %}
{% for dispositivo in view.get_queryset %}
{% if dispositivo.tipo_dispositivo.class_css == 'articulacao'%}
{%if not forloop.first%}
</div>
{% endif%}
<div class="articulacao">
{% else %}
<div class="{{ dispositivo.tipo_dispositivo.class_css }}">
<b>{{ dispositivo.tipo_dispositivo.class_css }}</b> - {{ dispositivo.rotulo }} - {{ dispositivo.texto|safe }}
<br>
{% if view.is_norma_alteradora %}
{% if dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%}
{% for alterado in dispositivo.id|get_bloco %}
<div class="{{ alterado.tipo_dispositivo.class_css }}">
<b>{{ alterado.tipo_dispositivo.class_css }}</b> - {{ alterado.rotulo }} - {{ alterado.texto }}
<br>
</div>
{% block base_content %}
{% endfor %}
{% endif%}
{% endif%}
{% include 'compilacao/template_render_bloco.html'%}
</div>
{% endif%}
{%if forloop.last %}
</div>
{% endif%}
{% endfor %}
{% endblock base_content %}

42
templates/compilacao/template_render_bloco.html

@ -0,0 +1,42 @@
{% load i18n %}
{% load compilacao_filters %}
{% for dispositivo in view.get_queryset %}
{% if dispositivo.nivel == view.flag_nivel_old %}
</div>
{% elif dispositivo.nivel < view.flag_nivel_old %}
{% close_div view.flag_nivel_old dispositivo.nivel %}
{% endif%}
<div class="dispositivo" id="d{{dispositivo.id}}">
{% spaceless %}
<div class="{% dispositivo_desativado dispositivo %} {{ dispositivo.tipo_dispositivo.class_css }}" id="id{{dispositivo.id}}">
{{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }}
<a name="{{dispositivo.pk}}" >{{ dispositivo.rotulo }}</a>
{{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }}
{{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }}
{{ dispositivo.texto|safe }}
{% if dispositivo.norma_publicada_id != None %}
<a class="link_alterador" href="{%url 'compilacao' dispositivo.norma_publicada.pk %}#{{dispositivo.dispositivo_atualizador_idexit
}}">
{{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica dispositivo %}
{{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif%}
{% if view.is_norma_alteradora and dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%}
{%with node=dispositivo template_name='compilacao/bloco_alteracao.html' %}
{%include template_name%}
{%endwith%}
{% endif%}
</div>
{% endspaceless %}
{% set_nivel_old view dispositivo.nivel %}
{% endfor %}
{% close_div view.flag_nivel_old view.flag_nivel_ini %}

9
templates/norma/normajuridica_detail.html

@ -0,0 +1,9 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% block sections_nav %}
<dl class="sub-nav left">
<dd><a href="{% url 'normajuridica:detail' object.pk %}" class="button secondary">{% trans 'Início' %}</a></dd>
<dd><a href="{% url 'compilacao' object.pk %}" class="button secondary">{% trans 'Texto Integral' %}</a></dd>
</dl>
{% endblock sections_nav %}
Loading…
Cancel
Save