From cd2179c0c1899590274f10caa66cd047612c69ca Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 15 Sep 2015 11:52:36 -0300 Subject: [PATCH] Construction of the first views on app compilacao MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Portuguese in message: - primeira visualização de normas sem controle de vigências - visualização e lincagem das normas alteradoras - sem notas e vides --- .../migrations/0004_auto_20150914_0842.py | 34 +++++ compilacao/models.py | 6 +- compilacao/templatetags/compilacao_filters.py | 51 ++++++- compilacao/urls.py | 4 +- compilacao/views.py | 104 ++++++++++++-- norma/models.py | 7 +- norma/urls.py | 9 +- norma/views.py | 11 ++ static/styles/compilacao.scss | 130 +++++++++++++++++- templates/compilacao/bloco_alteracao.html | 18 +++ templates/compilacao/index.html | 36 +---- .../compilacao/template_render_bloco.html | 42 ++++++ templates/norma/normajuridica_detail.html | 9 ++ 13 files changed, 405 insertions(+), 56 deletions(-) create mode 100644 compilacao/migrations/0004_auto_20150914_0842.py create mode 100644 templates/compilacao/bloco_alteracao.html create mode 100644 templates/compilacao/template_render_bloco.html create mode 100644 templates/norma/normajuridica_detail.html diff --git a/compilacao/migrations/0004_auto_20150914_0842.py b/compilacao/migrations/0004_auto_20150914_0842.py new file mode 100644 index 000000000..991257507 --- /dev/null +++ b/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'), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 37ea8f2ba..ffc7f68e6 100644 --- a/compilacao/models.py +++ b/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', diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 0e802bd9c..ce7c18df6 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/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 '' * (int(value_max) - int(value_min) + 1) diff --git a/compilacao/urls.py b/compilacao/urls.py index 158ce9fc1..0997d5747 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -3,6 +3,8 @@ from django.conf.urls import url from compilacao import views urlpatterns = [ - url(r'^norma/(?P\d+)/compilacao/', + url(r'^norma/(?P[0-9]+)/compilacao/$', views.CompilacaoView.as_view(), name='compilacao'), + url(r'^norma/(?P[0-9]+)/compilacao/(?P[0-9]+)/$', + views.DispositivoView.as_view(), name='dispositivo'), ] diff --git a/compilacao/views.py b/compilacao/views.py index ec70879d9..ff4e7edc1 100644 --- a/compilacao/views.py +++ b/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 = -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(*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): - return Dispositivo.objects.filter( - ordem__gt=0, - norma_id=self.kwargs['norma_id']).select_related() + 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 diff --git a/norma/models.py b/norma/models.py index 32d616dce..62512d500 100644 --- a/norma/models.py +++ b/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 nº %(numero)s - %(data)s - %(ano)s') % { + return _('%(tipo)s nº %(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): diff --git a/norma/urls.py b/norma/urls.py index 300e80c72..1db761f8c 100644 --- a/norma/urls.py +++ b/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)), ] diff --git a/norma/views.py b/norma/views.py index 4c4102e83..24dd52009 100644 --- a/norma/views.py +++ b/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, '', [ diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 2df3a5ea6..566b82cac 100644 --- a/static/styles/compilacao.scss +++ b/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; - background-color: rgba(100,100,100,0.3); - margin: 1em; +} + +.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; +} + +.dispositivo .bloco_alteracao, +.dispositivo .bloco_alteracao a, +.dispositivo .bloco_alteracao table, +.dispositivo .bloco_alteracao table td { + color: #018 !important; } \ No newline at end of file diff --git a/templates/compilacao/bloco_alteracao.html b/templates/compilacao/bloco_alteracao.html new file mode 100644 index 000000000..3104bc978 --- /dev/null +++ b/templates/compilacao/bloco_alteracao.html @@ -0,0 +1,18 @@ +{% load compilacao_filters %} + +{% for ch in dispositivo.pk|get_bloco %} + +
+
+ + {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }} + + {{ ch.rotulo }} + + {{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }} + + {{ ch.tipo_dispositivo.texto_prefixo_html|safe }} + {{ ch.texto|safe }} +
+
+{% endfor %} \ No newline at end of file diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index c9f9e40f7..e31422c53 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -7,40 +7,10 @@

{{ view.get_norma }}

{% endblock %} -{% block base_content %} - {% for dispositivo in view.get_queryset %} - {% if dispositivo.tipo_dispositivo.class_css == 'articulacao'%} - {%if not forloop.first%} - - {% endif%} -
- {% else %} - - - - -
- {{ dispositivo.tipo_dispositivo.class_css }} - {{ dispositivo.rotulo }} - {{ dispositivo.texto|safe }} -
- - {% if view.is_norma_alteradora %} - {% if dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%} - {% for alterado in dispositivo.id|get_bloco %} -
- {{ alterado.tipo_dispositivo.class_css }} - {{ alterado.rotulo }} - {{ alterado.texto }} -
-
- - {% endfor %} - {% endif%} - {% endif%} +{% block base_content %} + + {% include 'compilacao/template_render_bloco.html'%} -
- {% endif%} - {%if forloop.last %} -
- {% endif%} - {% endfor %} {% endblock base_content %} \ No newline at end of file diff --git a/templates/compilacao/template_render_bloco.html b/templates/compilacao/template_render_bloco.html new file mode 100644 index 000000000..6c8969e56 --- /dev/null +++ b/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 %} + + {% elif dispositivo.nivel < view.flag_nivel_old %} + {% close_div view.flag_nivel_old dispositivo.nivel %} + {% endif%} +
+ {% spaceless %} +
+ + {{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }} + {{ dispositivo.rotulo }} + {{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }} + + {{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }} + {{ dispositivo.texto|safe }} + + {% if dispositivo.norma_publicada_id != None %} + + + {{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }} + {% nota_automatica dispositivo %} + {{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }} + + {% 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%} +
+ {% endspaceless %} + + {% set_nivel_old view dispositivo.nivel %} +{% endfor %} +{% close_div view.flag_nivel_old view.flag_nivel_ini %} \ No newline at end of file diff --git a/templates/norma/normajuridica_detail.html b/templates/norma/normajuridica_detail.html new file mode 100644 index 000000000..360bfc43f --- /dev/null +++ b/templates/norma/normajuridica_detail.html @@ -0,0 +1,9 @@ +{% extends "crud/detail.html" %} +{% load i18n %} + +{% block sections_nav %} + +{% endblock sections_nav %}