From 43f69f1a12a064165c517229332fb48a73206740 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 4 Dec 2015 09:37:54 -0200 Subject: [PATCH 01/21] customize unique message for Vide add --- compilacao/forms.py | 21 ++++++++++++++------- compilacao/models.py | 3 ++- static/styles/compilacao.scss | 6 +++++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/compilacao/forms.py b/compilacao/forms.py index ff5d31c9f..9cb8617bc 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,6 +1,7 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Column, Div, Field, Layout, Row from django import forms +from django.core.exceptions import NON_FIELD_ERRORS from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ @@ -14,7 +15,7 @@ class UpLoadImportFileForm(forms.Form): required=True, label=_('Arquivo formato ODF para Importanção')) -error_messages = { +nota_error_messages = { 'required': _('Este campo é obrigatório'), 'invalid': _('URL inválida.') } @@ -37,11 +38,11 @@ class NotaForm(ModelForm): texto = forms.CharField( label='', widget=forms.Textarea, - error_messages=error_messages) + error_messages=nota_error_messages) url_externa = forms.URLField( label='', required=False, - error_messages=error_messages) + error_messages=nota_error_messages) publicidade = forms.ChoiceField( required=True, label=_('Publicidade'), @@ -60,7 +61,7 @@ class NotaForm(ModelForm): required=True, widget=forms.DateInput( format='%d/%m/%Y'), - error_messages=error_messages + error_messages=nota_error_messages ) efetividade = forms.DateField( label=_('Efetividade'), @@ -68,7 +69,7 @@ class NotaForm(ModelForm): required=True, widget=forms.DateInput( format='%d/%m/%Y'), - error_messages=error_messages) + error_messages=nota_error_messages) dispositivo = forms.ModelChoiceField(queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()) pk = forms.IntegerField(widget=forms.HiddenInput(), @@ -137,12 +138,12 @@ class VideForm(ModelForm): texto = forms.CharField( label='', widget=forms.Textarea, - error_messages=error_messages, required=False) tipo = forms.ModelChoiceField( label=_('Tipo do Vide'), queryset=TipoVide.objects.all(), - required=True) + required=True, + error_messages=nota_error_messages) busca_dispositivo = forms.CharField( label=_('Buscar Dispositivo a Referenciar'), @@ -157,6 +158,12 @@ class VideForm(ModelForm): 'texto', 'tipo', 'pk'] + error_messages = { + NON_FIELD_ERRORS: { + 'unique_together': + "Ja existe um Vide deste tipo para o Dispositivo Referido ", + } + } def __init__(self, *args, **kwargs): diff --git a/compilacao/models.py b/compilacao/models.py index e6df58898..124d9af90 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,6 +1,7 @@ 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 @@ -1048,7 +1049,7 @@ class Vide(TimestampedMixin): class Meta: verbose_name = _('Vide') verbose_name_plural = _('Vides') - unique_together = ['dispositivo_base', 'dispositivo_ref'] + unique_together = ['dispositivo_base', 'dispositivo_ref', 'tipo'] def __str__(self): return _('Vide %s') % self.texto diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index f51ab838a..3f5364bcb 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -447,7 +447,7 @@ a:link:after, a:visited:after { } .title_form { font-size: 2.5em; - padding: 0.5em 0.3em 0.2em; + padding: 0.5em 0.3em 0.3em; background: #e5e5e5; color: #777; margin-bottom: 0.4em; @@ -461,6 +461,9 @@ a:link:after, a:visited:after { border: 0px; outline:0px; } + .alert-box { + margin-bottom: 0; + } .row:first-of-type { margin-top: 1em; display: inline-block; @@ -1173,6 +1176,7 @@ a:link:after, a:visited:after { cursor: pointer; opacity: 0.7; transform: rotate(45deg); + z-index: 98; .icon-close{ background: #FFF; From 8aec31abc1f81ea450d426e3b58a7b6bdfea1578 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 4 Dec 2015 09:40:00 -0200 Subject: [PATCH 02/21] commit migration file of last update --- .../migrations/0030_auto_20151203_1514.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 compilacao/migrations/0030_auto_20151203_1514.py diff --git a/compilacao/migrations/0030_auto_20151203_1514.py b/compilacao/migrations/0030_auto_20151203_1514.py new file mode 100644 index 000000000..3bff2a458 --- /dev/null +++ b/compilacao/migrations/0030_auto_20151203_1514.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0029_auto_20151201_1611'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='vide', + unique_together=set([('dispositivo_base', 'dispositivo_ref', 'tipo')]), + ), + ] From 894e02920bbf9ec113df3d0223d678b8c1336c08 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sun, 13 Dec 2015 01:50:45 -0200 Subject: [PATCH 03/21] =?UTF-8?q?Criado=20quatro=20formatos=20de=20visuali?= =?UTF-8?q?za=C3=A7=C3=A3o=20de=20uma=20Norma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TMS - Texto Multivigente Sequencial - TMI - Texto Multivigente Integrado com Realce de Aterações - TVL - Texto Vigente COM Link para Normas Alteradoras - TVT - Texto Vigente --- .../migrations/0030_auto_20151203_1114.py | 19 ------ .../migrations/0030_auto_20151203_1117.py | 19 ------ compilacao/models.py | 1 - compilacao/templatetags/compilacao_filters.py | 5 +- compilacao/views.py | 44 +++++++++--- sapl/settings.py | 1 + sessao/views.py | 1 + static/js/compilacao_edit.js | 5 +- static/js/compilacao_view.js | 67 ++++++++++++++++++- static/styles/compilacao.scss | 17 +++++ templates/compilacao/edit.html | 4 +- templates/compilacao/edit_bloco.html | 6 +- templates/compilacao/index.html | 28 ++++++-- templates/compilacao/index_bloco.html | 22 +++--- 14 files changed, 167 insertions(+), 72 deletions(-) delete mode 100644 compilacao/migrations/0030_auto_20151203_1114.py delete mode 100644 compilacao/migrations/0030_auto_20151203_1117.py diff --git a/compilacao/migrations/0030_auto_20151203_1114.py b/compilacao/migrations/0030_auto_20151203_1114.py deleted file mode 100644 index 27b47f052..000000000 --- a/compilacao/migrations/0030_auto_20151203_1114.py +++ /dev/null @@ -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'), - ), - ] diff --git a/compilacao/migrations/0030_auto_20151203_1117.py b/compilacao/migrations/0030_auto_20151203_1117.py deleted file mode 100644 index 4daa1e950..000000000 --- a/compilacao/migrations/0030_auto_20151203_1117.py +++ /dev/null @@ -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='+'), - ), - ] diff --git a/compilacao/models.py b/compilacao/models.py index 124d9af90..a96818b60 100644 --- a/compilacao/models.py +++ b/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 diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 74d3b06ee..7a59720c9 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/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 diff --git a/compilacao/views.py b/compilacao/views.py index ed14100b0..8f86e0229 100644 --- a/compilacao/views.py +++ b/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): diff --git a/sapl/settings.py b/sapl/settings.py index 3ee00751d..d47795f61 100644 --- a/sapl/settings.py +++ b/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 diff --git a/sessao/views.py b/sessao/views.py index 0193d31a1..275def8df 100644 --- a/sessao/views.py +++ b/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', [ diff --git a/static/js/compilacao_edit.js b/static/js/compilacao_edit.js index 1c7cb9226..307b8d491 100644 --- a/static/js/compilacao_edit.js +++ b/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'); diff --git a/static/js/compilacao_view.js b/static/js/compilacao_view.js index d196ef3e4..b661399cd 100644 --- a/static/js/compilacao_view.js +++ b/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('') > 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"); }); + + + + }); diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 3f5364bcb..0906e6649 100644 --- a/static/styles/compilacao.scss +++ b/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); diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html index 404949703..8038d6910 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/edit.html @@ -19,6 +19,8 @@ {% block base_content %} + +
{% trans 'Aguarde... Atualizando informações!!!'%}
@@ -26,7 +28,7 @@
-{% if user.is_authenticated and False %} +{% if False %}
{% csrf_token %} diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 2a188f636..16e58f84a 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -46,10 +46,10 @@ - + + {% comment %} + + + {% endcomment %} + + + + + + diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/index_bloco.html index 3cb398859..8ea584c9a 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -1,6 +1,8 @@ {% load i18n %} {% load compilacao_filters %} +
+ {% for dpt in object_list %} {% if dpt.nivel == view.flag_nivel_old %} @@ -16,8 +18,8 @@ {% spaceless %}
-
- {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%} {%endif%} +
+ {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%} {%endif%} {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} @@ -41,8 +43,11 @@ {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%}
{# Dispostivo Nota e Vides #}
+ {%endif%} {% endspaceless %} {% endfor %} From 82ec6885ebfe85eade68162471b0ec6b50cb9e3c Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sun, 13 Dec 2015 01:50:45 -0200 Subject: [PATCH 06/21] =?UTF-8?q?Criado=20quatro=20formatos=20de=20visuali?= =?UTF-8?q?za=C3=A7=C3=A3o=20de=20uma=20Norma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TMS - Texto Multivigente Sequencial - TMI - Texto Multivigente Integrado com Realce de Aterações - TVL - Texto Vigente COM Link para Normas Alteradoras - TVT - Texto Vigente --- .../migrations/0030_auto_20151203_1114.py | 19 ------------------- .../migrations/0030_auto_20151203_1117.py | 19 ------------------- static/js/compilacao_view.js | 5 +++-- 3 files changed, 3 insertions(+), 40 deletions(-) delete mode 100644 compilacao/migrations/0030_auto_20151203_1114.py delete mode 100644 compilacao/migrations/0030_auto_20151203_1117.py diff --git a/compilacao/migrations/0030_auto_20151203_1114.py b/compilacao/migrations/0030_auto_20151203_1114.py deleted file mode 100644 index 27b47f052..000000000 --- a/compilacao/migrations/0030_auto_20151203_1114.py +++ /dev/null @@ -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'), - ), - ] diff --git a/compilacao/migrations/0030_auto_20151203_1117.py b/compilacao/migrations/0030_auto_20151203_1117.py deleted file mode 100644 index 4daa1e950..000000000 --- a/compilacao/migrations/0030_auto_20151203_1117.py +++ /dev/null @@ -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='+'), - ), - ] diff --git a/static/js/compilacao_view.js b/static/js/compilacao_view.js index 372e44e93..1e44e635e 100644 --- a/static/js/compilacao_view.js +++ b/static/js/compilacao_view.js @@ -17,6 +17,7 @@ $(window).load(function() { }, 100); }); + function isElementInViewport (el) { //special bonus for those using jQuery @@ -46,8 +47,6 @@ function textoMultiVigente(item, diff) { } } - - $(".cp .tipo-vigencias a").removeClass("selected") $(item).addClass("selected") $(".dptt.desativado").removeClass("displaynone"); @@ -79,6 +78,7 @@ function textoMultiVigente(item, diff) { if (diff.length > 0) { $('#d'+pks).closest('.desativado').addClass("displaynone"); + var clone = $('#da'+pk).clone(); $('#da'+pk).after( clone ); $('#da'+pk).addClass('displaynone'); @@ -141,6 +141,7 @@ function textoVigente(item, link) { scrollTop: $(elv).parent().offset().top - 60 }, 0); } + } $(document).ready(function() { From ec17ae5fce57d1d37c6d199327f591e5b82eca3c Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sun, 13 Dec 2015 01:50:45 -0200 Subject: [PATCH 07/21] =?UTF-8?q?Criado=20quatro=20formatos=20de=20visuali?= =?UTF-8?q?za=C3=A7=C3=A3o=20de=20uma=20Norma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TMS - Texto Multivigente Sequencial - TMI - Texto Multivigente Integrado com Realce de Aterações - TVL - Texto Vigente COM Link para Normas Alteradoras - TVT - Texto Vigente --- .../migrations/0030_auto_20151203_1114.py | 19 +++++++++++++++++++ .../migrations/0030_auto_20151203_1117.py | 19 +++++++++++++++++++ static/js/compilacao_view.js | 6 ++++-- 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 compilacao/migrations/0030_auto_20151203_1114.py create mode 100644 compilacao/migrations/0030_auto_20151203_1117.py diff --git a/compilacao/migrations/0030_auto_20151203_1114.py b/compilacao/migrations/0030_auto_20151203_1114.py new file mode 100644 index 000000000..27b47f052 --- /dev/null +++ b/compilacao/migrations/0030_auto_20151203_1114.py @@ -0,0 +1,19 @@ +# -*- 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'), + ), + ] diff --git a/compilacao/migrations/0030_auto_20151203_1117.py b/compilacao/migrations/0030_auto_20151203_1117.py new file mode 100644 index 000000000..4daa1e950 --- /dev/null +++ b/compilacao/migrations/0030_auto_20151203_1117.py @@ -0,0 +1,19 @@ +# -*- 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='+'), + ), + ] diff --git a/static/js/compilacao_view.js b/static/js/compilacao_view.js index 1e44e635e..e02bd2471 100644 --- a/static/js/compilacao_view.js +++ b/static/js/compilacao_view.js @@ -46,7 +46,7 @@ function textoMultiVigente(item, diff) { break; } } - + $(".cp .tipo-vigencias a").removeClass("selected") $(item).addClass("selected") $(".dptt.desativado").removeClass("displaynone"); @@ -56,8 +56,9 @@ function textoMultiVigente(item, diff) { if (diff) { $(".dtxt[id^='da'").each(function() { - + if ( $(this).html().search( /<\/\w+>/g ) > 0) + return; var pk = $(this).attr('pk') @@ -142,6 +143,7 @@ function textoVigente(item, link) { }, 0); } + } $(document).ready(function() { From 5d0272b3c7c0a57e493904a4b183c165bb3114a5 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 23 Dec 2015 19:36:11 -0200 Subject: [PATCH 08/21] Criar Texto Articulado e seu CRUD --- compilacao/file2dispositivo.py | 327 ---- compilacao/forms.py | 76 +- compilacao/insert_inicial_TipoDispositivo.sql | 349 ----- .../migrations/0033_auto_20151222_1608.py | 119 ++ .../migrations/0034_auto_20151222_1609.py | 22 + .../migrations/0035_auto_20151223_1709.py | 32 + compilacao/models.py | 114 +- compilacao/templatetags/compilacao_filters.py | 8 +- compilacao/urls.py | 66 +- compilacao/utils.py | 83 + compilacao/views.py | 1351 +---------------- compilacao/views2.py | 1351 +++++++++++++++++ materia/urls.py | 10 +- norma/urls.py | 5 +- requirements/requirements.txt | 1 - sapl/utils.py | 27 - static/styles/compilacao.scss | 2 +- .../dispositivo_search_fragment_form.html | 8 +- templates/compilacao/edit.html | 2 +- templates/compilacao/edit_bloco.html | 8 +- .../compilacao/edit_bloco_alteracao.html | 2 +- templates/compilacao/form.html | 6 + templates/compilacao/index.html | 14 +- templates/compilacao/index_bloco.html | 14 +- .../compilacao/index_bloco_alteracao.html | 2 +- .../compilacao/textoarticulado_detail.html | 71 + .../compilacao/textoarticulado_list.html | 61 + 27 files changed, 2005 insertions(+), 2126 deletions(-) delete mode 100644 compilacao/file2dispositivo.py delete mode 100644 compilacao/insert_inicial_TipoDispositivo.sql create mode 100644 compilacao/migrations/0033_auto_20151222_1608.py create mode 100644 compilacao/migrations/0034_auto_20151222_1609.py create mode 100644 compilacao/migrations/0035_auto_20151223_1709.py create mode 100644 compilacao/utils.py create mode 100644 compilacao/views2.py create mode 100644 templates/compilacao/form.html create mode 100644 templates/compilacao/textoarticulado_detail.html create mode 100644 templates/compilacao/textoarticulado_list.html diff --git a/compilacao/file2dispositivo.py b/compilacao/file2dispositivo.py deleted file mode 100644 index e6bbb6ae8..000000000 --- a/compilacao/file2dispositivo.py +++ /dev/null @@ -1,327 +0,0 @@ -import re - -from odf.element import Node, Text -from odf.opendocument import load -from odf.table import Table, TableCell, TableRow -from odf.text import (List, ListHeader, ListItem, ListLevelStyleBullet, - ListLevelStyleNumber, ListStyle, Note) - -from sapl import utils - - -class Parser(object): - - parser_list = [] - - def parser(self, _filepath): - - self.filepath = _filepath - - return self.re_parser() - - def re_parser(self): - - self.parser_list = [] - - # odt identificado pela extensão ou teste caso o arquivo sem extensão - if self.filepath.endswith('.odt') or\ - not re.search(r"(\w+)\.(\w+)", self.filepath): - - try: - odtparser = OdtParser() - - self.parser_list = odtparser.parser(self.filepath) - - return self.parser_list - except Exception as e: - print(e) - # TODO: Continue para outros formatos - pass - - # doc identificado pela extensão ou teste caso o arquivo sem extensão - if self.filepath.endswith(('.doc', 'docx')) or\ - not re.search(r"(\w+)\.(\w+)", self.filepath): - - try: - # TODO - return [] - except Exception as e: - # TODO: Continue para outros formatos - pass - - return [] - - def _reduce_terms(self, _nodes=None, level=0): - print(level) - if not _nodes: - nodes = self.parser_list - else: - nodes = _nodes - - fstr = True - i = -1 - for nd in nodes: - i += 1 - # print(nd) - - if not _nodes: - fstr = False - if nd[0] == 'table:table': - continue - - if isinstance(nd, list): - fstr = False - nodes[i] = self._reduce_terms(nd, level=level + 1) - - if fstr: - return ' '.join(nodes) - return nodes - - -class OdtParser(Parser): - FNC1 = '1' - FNCI = 'I' - FNCi = 'i' - FNCA = 'A' - FNCa = 'a' - FNC8 = '*' - FNCN = 'N' - - def re_parser(self): - - self.textdoc = load(self.filepath) - self.level_list = 0 - self.control_list = {} - - # mm = ODF2MoinMoin(self.filepath) - # self.parser_list = [mm.toString(), ] - - self.parser_list = self._import_itens(self.textdoc.text, level=0) - - # self._reduce_terms() - - return self.parser_list - - def _import_itens(self, element, level=0): - try: - result = [] - for el in element.childNodes: - print(level, el.tagName) - _r = '' - if el.tagName == 'Text': - _r = str(el) - else: - if el.isInstanceOf(Note): - continue - elif el.isInstanceOf(Table): - _r = self._import_table(el, level=level + 1) - elif el.isInstanceOf(List): - _r = self._import_list(el, level=level + 1) - # elif el.isInstanceOf(P): - # _r = [self.extractText(el),] - elif el.hasChildNodes(): - _r = self._import_itens(el, level=level + 1) - else: - _r = str(el) - - if _r: - if isinstance(_r, str): - result += [_r, ] - else: - result += _r - - return result - except Exception as e: - print(e) - - def _import_table(self, element, level=0): - result = '' - print(level) - try: - if element.isInstanceOf(Table): - result += '' - - for el in element.childNodes: - _r = '' - if isinstance(el, Text): - _r = str(el) - else: - if el.isInstanceOf(TableRow): - _r = self._import_table(el, level=level + 1) - _r = '%s' % (''.join(_r)) - result += ''.join(_r) - elif el.isInstanceOf(TableCell): - _r = self._import_table(el, level=level + 1) - if el.getAttribute('numberrowsspanned'): - _r = '' % ( - el.getAttribute('numberrowsspanned'), - ''.join(_r)) - elif el.getAttribute('numbercolumnsspanned'): - _r = '' % ( - el.getAttribute('numbercolumnsspanned'), - ''.join(_r)) - else: - _r = '' % (''.join(_r)) - - result += ''.join(_r) - else: - _r = self.extractText(el) - # _r = self._reduce_terms(_r) - if isinstance(_r, list): - result += '
'.join(_r) - else: - if _r: - result += _r + '
' - - if element.isInstanceOf(Table): - result += '
%s%s%s
' - - return [result, ] - except Exception as e: - print(e) - - def _import_list(self, element, level=0): - self.level_list += 1 - result = [] - print(level) - - numsufixo = '' - numformat = '' - startvalue = '' - - count_list_item = 0 - - try: - if element.isInstanceOf(List): - _stylename = element.getAttribute('stylename') - - if _stylename: - self.stylename = _stylename - - liststyles = self.textdoc.getElementsByType(ListStyle) - - for liststyle in liststyles: - if liststyle.getAttribute('name') == self.stylename: - break - - stylesnumbers = liststyle.getElementsByType( - ListLevelStyleNumber) - - for item in stylesnumbers: - if item.getAttribute('level') == str(self.level_list): - numsufixo = item.getAttribute('numsuffix') or '' - numformat = item.getAttribute('numformat') or '' - startvalue = item.getAttribute('startvalue') or '' - break - - if not numformat: - stylesbullets = liststyle.getElementsByType( - ListLevelStyleBullet) - for item in stylesbullets: - if item.getAttribute('level') == str(self.level_list): - numformat = '*' - break - - _id = element.getAttribute('id') - if _id: - self.id_last_list = _id - - if self.id_last_list not in self.control_list: - self.control_list[self.id_last_list] = [0, ] * 10 - - if _id: - if not element.getAttribute('continuelist') and\ - self.level_list == 1: - self.control_list[self.id_last_list] = [0, ] * 10 - - except Exception as e: - print(e) - - try: - flag_first = True - for el in element.childNodes: - prefixo = '' - if isinstance(el, Text): - _r = [str(el), ] - else: - if el.isInstanceOf(ListHeader) or\ - el.isInstanceOf(ListItem): - - if startvalue and flag_first: - self.control_list[self.id_last_list][ - self.level_list - 1] = int(startvalue) - 1 - flag_first = False - - self.control_list[self.id_last_list][ - self.level_list - 1] += 1 - count_list_item = self.control_list[self.id_last_list][ - self.level_list - 1] - - if numformat == OdtParser.FNC1: - prefixo = str(count_list_item) - elif numformat == OdtParser.FNCI: - prefixo = utils.int_to_roman(count_list_item) - elif numformat == OdtParser.FNCi: - prefixo = utils.int_to_roman( - count_list_item).lower() - elif numformat == OdtParser.FNCA: - prefixo = utils.int_to_letter(count_list_item) - elif numformat == OdtParser.FNCa: - prefixo = utils.int_to_letter( - count_list_item).lower() - elif numformat == OdtParser.FNC8: - prefixo = '*' - else: - prefixo = str(count_list_item) - - prefixo += numsufixo - - _r = self._import_itens(el, level=level + 1) - - if _r: - if prefixo: - _r[0] = '%s %s' % (prefixo, _r[0]) - result += _r - else: - result += _r - - self.level_list -= 1 - return result - - except Exception as e: - print(e) - - def extractText(self, odfElement): - """ Extract text content from an Element, with whitespace represented - properly. Returns the text, with tabs, spaces, and newlines - correctly evaluated. This method recursively descends through the - children of the given element, accumulating text and "unwrapping" - , , and elements along the way. - """ - result = [] - - if len(odfElement.childNodes) != 0: - for child in odfElement.childNodes: - if child.nodeType == Node.TEXT_NODE: - result.append(child.data) - elif child.nodeType == Node.ELEMENT_NODE: - subElement = child - tagName = subElement.qname - if tagName == (u"urn:oasis:names:tc:opendocument:xmlns:" + - "text:1.0", u"line-break"): - result.append("\n") - elif tagName == (u"urn:oasis:names:tc:opendocument:" + - "xmlns:text:1.0", u"tab"): - result.append("\t") - elif tagName == (u"urn:oasis:names:tc:opendocument:" + - "xmlns:text:1.0", u"s"): - c = subElement.getAttribute('c') - if c: - spaceCount = int(c) - else: - spaceCount = 1 - - result.append(" " * spaceCount) - else: - result.append(self.extractText(subElement)) - return ''.join(result) diff --git a/compilacao/forms.py b/compilacao/forms.py index 9cb8617bc..46b899bb5 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,13 +1,18 @@ + from crispy_forms.helper import FormHelper -from crispy_forms.layout import HTML, Button, Column, Div, Field, Layout, Row +from crispy_forms_foundation.layout import (HTML, Column, Div, Fieldset, + Layout, Row, Submit) +from crispy_forms_foundation.layout.buttons import Button, ButtonHolder +from crispy_forms_foundation.layout.fields import Field from django import forms from django.core.exceptions import NON_FIELD_ERRORS from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ -from compilacao.models import Dispositivo, Nota, TipoNota, TipoVide, Vide +from compilacao.models import Dispositivo, Nota, TipoNota, TipoVide, Vide,\ + TextoArticulado, TipoTextoArticulado +from compilacao.utils import to_row, to_column from norma.models import TipoNormaJuridica -from sapl.layout import to_column, to_row class UpLoadImportFileForm(forms.Form): @@ -20,6 +25,71 @@ nota_error_messages = { 'invalid': _('URL inválida.') } +ta_error_messages = { + 'required': _('Este campo é obrigatório'), +} + + +class TaForm(ModelForm): + tipo_ta = forms.ModelChoiceField( + label=_('Tipo do Texto Articulado'), + queryset=TipoTextoArticulado.objects.all(), + required=True, + empty_label=None) + numero = forms.IntegerField(label=_('Número'), required=True) + ano = forms.IntegerField(label=_('Ano'), required=True) + + data = forms.DateField( + label=_('Data'), + input_formats=['%d/%m/%Y'], + required=True, + widget=forms.DateInput( + format='%d/%m/%Y'), + error_messages=ta_error_messages + ) + ementa = forms.CharField( + label='', + widget=forms.Textarea, + error_messages=ta_error_messages) + observacao = forms.CharField( + label='', + widget=forms.Textarea, + error_messages=ta_error_messages, + required=False) + + class Meta: + model = TextoArticulado + fields = ['tipo_ta', + 'numero', + 'ano', + 'data', + 'ementa', + 'observacao', + ] + + def __init__(self, *args, **kwargs): + + row1 = to_row([ + ('tipo_ta', 5), + ('numero', 2), + ('ano', 2), + ('data', 3), + ]) + + self.helper = FormHelper() + self.helper.layout = Layout( + row1, + Fieldset(_('Ementa'), Column('ementa'), css_class="large-12"), + Fieldset( + _('Observações'), Column('observacao'), css_class="large-12"), + ButtonHolder( + Submit('Save', 'Save', + css_class='radius') + ) + ) + + super(TaForm, self).__init__(*args, **kwargs) + class NotaForm(ModelForm): NPRIV = 1 diff --git a/compilacao/insert_inicial_TipoDispositivo.sql b/compilacao/insert_inicial_TipoDispositivo.sql deleted file mode 100644 index c37f5f14c..000000000 --- a/compilacao/insert_inicial_TipoDispositivo.sql +++ /dev/null @@ -1,349 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.4.5 --- Dumped by pg_dump version 9.4.5 --- Started on 2015-11-19 19:39:23 BRST - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - --- --- TOC entry 2567 (class 0 OID 40610) --- Dependencies: 366 --- Data for Name: compilacao_perfilestruturaltextosnormativos; Type: TABLE DATA; Schema: public; Owner: sapl --- - -INSERT INTO compilacao_perfilestruturaltextosnormativos (id, nome, padrao, sigla) VALUES (1, 'Perfil Lei Complementar 95', false, 'LC95'); -INSERT INTO compilacao_perfilestruturaltextosnormativos (id, nome, padrao, sigla) VALUES (2, 'Perfil Jataí - Goiás', true, 'PJTIGO'); - - --- --- TOC entry 2575 (class 0 OID 0) --- Dependencies: 365 --- Name: compilacao_perfilestruturaltextosnormativos_id_seq; Type: SEQUENCE SET; Schema: public; Owner: sapl --- - -SELECT pg_catalog.setval('compilacao_perfilestruturaltextosnormativos_id_seq', 2, true); - - --- --- TOC entry 2562 (class 0 OID 38245) --- Dependencies: 204 --- Data for Name: compilacao_tipodispositivo; Type: TABLE DATA; Schema: public; Owner: sapl --- - -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (125, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (102, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '', '
', '', '
', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (103, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '', '
', '', '
', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (104, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '', '
', '', '
', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (122, 'Inciso', 'inciso', '', '', 0, '', ' – ', '', '', '', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (120, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (118, 'Item de Seção', 'itemsecao', '', 'Item ', 0, '', '
', '', '
', '
', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (117, 'SubSeção', 'subsecao', '', 'SubSeção ', 0, '', '
', '', '
', '
', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (116, 'Seção', 'secao', '', 'Seção ', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (114, 'Título', 'titulo', '', 'Título ', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (113, 'Livro', 'livro', '', 'Livro ', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (112, 'Parte', 'parte', '', 'Parte ', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (111, 'Anexo', 'anexo', '', 'Anexo ', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (115, 'Capítulo', 'capitulo', '', 'Capítulo ', 0, '', '
', '', '
', '
', '', false, 'I', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (124, 'Item', 'item', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (121, 'Parágrafo', 'paragrafo', '', '§ ;Parágrafo Único ', 9, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (101, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '', '
', '', '
', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (119, 'Artigo', 'artigo', '', 'Art. ', 9, '.', ' – ', '', '', '', '', true, '1', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', true, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (123, 'Alinea', 'alinea', '', '', 0, ')', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (3, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true, true); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (4, 'Omissis', 'omissis', '', '', 0, '', '', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, true); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); - - --- --- TOC entry 2576 (class 0 OID 0) --- Dependencies: 205 --- Name: compilacao_tipodispositivo_id_seq; Type: SEQUENCE SET; Schema: public; Owner: sapl --- - -SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 28, true); - - --- --- TOC entry 2564 (class 0 OID 38253) --- Dependencies: 206 --- Data for Name: compilacao_tipodispositivorelationship; Type: TABLE DATA; Schema: public; Owner: sapl --- - -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (318, 119, 113, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (319, 115, 114, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (320, 116, 114, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (321, 117, 114, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (323, 119, 114, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (324, 116, 115, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (325, 117, 115, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (327, 119, 115, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (328, 117, 116, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (330, 119, 116, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (332, 119, 117, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (334, 120, 119, true, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (336, 125, 119, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (337, 122, 120, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (338, 123, 120, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (339, 124, 120, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (340, 125, 120, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (342, 101, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (343, 102, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (344, 103, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (345, 104, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (346, 111, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (347, 112, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (348, 113, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (349, 114, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (350, 115, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (351, 116, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (352, 117, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (354, 119, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (355, 125, 1, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (356, 101, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (357, 102, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (358, 103, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (359, 104, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (360, 111, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (361, 112, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (362, 113, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (363, 114, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (364, 115, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (365, 116, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (366, 117, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (368, 119, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (369, 122, 121, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (370, 123, 121, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (371, 124, 121, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (372, 125, 121, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (373, 123, 122, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (374, 124, 122, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (375, 125, 122, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (376, 124, 123, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (377, 125, 123, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (378, 125, 124, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (379, 3, 119, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (380, 3, 121, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (381, 3, 122, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (382, 3, 123, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (383, 3, 124, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (384, 3, 120, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (126, 1, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (127, 2, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (128, 4, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (147, 125, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (146, 124, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (145, 123, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (144, 122, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (143, 121, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (142, 120, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (148, 111, 101, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (149, 112, 101, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (150, 113, 101, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (151, 114, 101, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (152, 115, 101, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (153, 116, 101, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (154, 117, 101, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (156, 119, 101, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (157, 111, 102, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (158, 112, 102, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (159, 113, 102, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (160, 114, 102, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (161, 115, 102, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (162, 116, 102, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (163, 117, 102, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (165, 119, 102, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (166, 111, 103, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (167, 112, 103, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (168, 113, 103, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (169, 114, 103, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (170, 115, 103, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (171, 116, 103, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (172, 117, 103, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (174, 119, 103, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (175, 111, 104, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (176, 112, 104, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (177, 113, 104, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (178, 114, 104, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (179, 115, 104, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (180, 116, 104, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (181, 117, 104, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (183, 119, 104, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (185, 112, 111, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (186, 113, 111, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (187, 114, 111, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (188, 115, 111, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (189, 116, 111, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (190, 117, 111, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (192, 119, 111, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (193, 113, 112, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (194, 114, 112, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (195, 115, 112, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (196, 116, 112, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (197, 117, 112, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (199, 119, 112, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (200, 114, 113, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (201, 115, 113, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (202, 116, 113, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (203, 117, 113, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (205, 119, 113, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (206, 115, 114, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (207, 116, 114, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (208, 117, 114, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (210, 119, 114, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (211, 116, 115, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (212, 117, 115, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (214, 119, 115, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (215, 117, 116, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (217, 119, 116, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (219, 119, 117, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (221, 120, 119, true, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (222, 121, 119, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (226, 125, 119, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (227, 122, 120, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (228, 123, 120, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (229, 124, 120, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (230, 125, 120, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (112, 101, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (111, 2, 1, true, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (322, 118, 114, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (326, 118, 115, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (329, 118, 116, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (331, 118, 117, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (353, 118, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (367, 118, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (333, 119, 118, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (113, 102, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (114, 103, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (115, 104, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (116, 111, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (117, 112, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (118, 113, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (119, 114, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (120, 115, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (121, 116, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (122, 117, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (124, 119, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 125, 1, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (129, 101, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (130, 102, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (131, 103, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (132, 104, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (133, 111, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (134, 112, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (135, 113, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (136, 114, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (137, 115, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (138, 116, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (139, 117, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (141, 119, 3, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (231, 122, 121, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (232, 123, 121, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (233, 124, 121, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (234, 125, 121, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (235, 123, 122, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (236, 124, 122, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (237, 125, 122, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (238, 124, 123, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (239, 125, 123, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (240, 125, 124, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (243, 3, 119, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (247, 3, 121, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (248, 3, 122, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (249, 3, 123, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (250, 3, 124, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (251, 3, 120, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (253, 1, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (254, 2, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (255, 4, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (256, 125, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (257, 124, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (258, 123, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (259, 122, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (260, 121, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (261, 120, 3, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (262, 111, 101, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (263, 112, 101, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (264, 113, 101, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (265, 114, 101, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (266, 115, 101, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (267, 116, 101, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (268, 117, 101, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (270, 119, 101, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (271, 111, 102, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (272, 112, 102, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (273, 113, 102, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (274, 114, 102, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (275, 115, 102, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (276, 116, 102, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (277, 117, 102, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (279, 119, 102, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (280, 111, 103, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (281, 112, 103, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (282, 113, 103, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (283, 114, 103, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (284, 115, 103, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (285, 116, 103, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (286, 117, 103, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (288, 119, 103, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (289, 111, 104, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (290, 112, 104, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (291, 113, 104, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (292, 114, 104, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (293, 115, 104, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (294, 116, 104, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (295, 117, 104, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (297, 119, 104, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (298, 112, 111, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (299, 113, 111, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (300, 114, 111, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (301, 115, 111, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (302, 116, 111, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (303, 117, 111, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (305, 119, 111, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (306, 113, 112, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (307, 114, 112, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (308, 115, 112, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (309, 116, 112, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (310, 117, 112, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (312, 119, 112, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (313, 114, 113, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (314, 115, 113, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (315, 116, 113, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (316, 117, 113, false, 1, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (341, 2, 1, true, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (287, 118, 103, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (269, 118, 101, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (278, 118, 102, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (296, 118, 104, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (304, 118, 111, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (311, 118, 112, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (317, 118, 113, false, 2, -1, true); -INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (335, 121, 119, false, 1, -1, false); - - --- --- TOC entry 2577 (class 0 OID 0) --- Dependencies: 207 --- Name: compilacao_tipodispositivorelationship_id_seq; Type: SEQUENCE SET; Schema: public; Owner: sapl --- - -SELECT pg_catalog.setval('compilacao_tipodispositivorelationship_id_seq', 384, true); - - --- Completed on 2015-11-19 19:39:24 BRST - --- --- PostgreSQL database dump complete --- - diff --git a/compilacao/migrations/0033_auto_20151222_1608.py b/compilacao/migrations/0033_auto_20151222_1608.py new file mode 100644 index 000000000..ae5f7a647 --- /dev/null +++ b/compilacao/migrations/0033_auto_20151222_1608.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0032_auto_20151213_1538'), + ] + + operations = [ + migrations.CreateModel( + name='PerfilEstruturalTextoArticulado', + fields=[ + ('id', models.AutoField( + auto_created=True, serialize=False, primary_key=True, + verbose_name='ID')), + ('sigla', models.CharField( + unique=True, max_length=10, verbose_name='Sigla')), + ('nome', models.CharField(max_length=50, verbose_name='Nome')), + ('padrao', models.BooleanField( + choices=[(True, 'Sim'), (False, 'Não')], default=False, + verbose_name='Padrão')), + ], + options={ + 'verbose_name_plural': 'Perfis Estruturais de' + ' Textos Articulados', + 'verbose_name': 'Perfil Estrutural de Texto Articulado', + 'ordering': ['-padrao', 'sigla'], + }, + ), + migrations.CreateModel( + name='TextoArticulado', + fields=[ + ('id', models.AutoField( + auto_created=True, + serialize=False, primary_key=True, verbose_name='ID')), + ('created', models.DateTimeField( + auto_now_add=True, verbose_name='created')), + ('modified', models.DateTimeField( + auto_now=True, verbose_name='modified')), + ('data', models.DateField( + blank=True, null=True, verbose_name='Data')), + ('ementa', models.TextField(verbose_name='Ementa')), + ('observacao', models.TextField( + blank=True, null=True, verbose_name='Observação')), + ('numero', models.PositiveIntegerField(verbose_name='Número')), + ('ano', models.PositiveSmallIntegerField(verbose_name='Ano')), + ], + options={ + 'verbose_name_plural': 'Textos Articulados', + 'verbose_name': 'Texto Articulado', + }, + ), + migrations.AlterModelOptions( + name='dispositivo', + options={'verbose_name_plural': 'Dispositivos', + 'verbose_name': 'Dispositivo'}, + ), + migrations.RemoveField( + model_name='publicacao', + name='norma', + ), + migrations.AlterField( + model_name='dispositivo', + name='visibilidade', + field=models.BooleanField(choices=[( + True, 'Sim'), (False, 'Não')], default=False, + verbose_name='Visibilidade no Texto Articulado Publicado'), + ), + migrations.AlterField( + model_name='tipodispositivorelationship', + name='perfil', + field=models.ForeignKey( + to='compilacao.PerfilEstruturalTextoArticulado'), + ), + migrations.AlterUniqueTogether( + name='dispositivo', + unique_together=set([]), + ), + migrations.DeleteModel( + name='PerfilEstruturalTextosNormativos', + ), + migrations.RemoveField( + model_name='dispositivo', + name='norma', + ), + migrations.RemoveField( + model_name='dispositivo', + name='norma_publicada', + ), + migrations.AddField( + model_name='dispositivo', + name='ta', + field=models.ForeignKey( + related_name='dispositivos_set', + verbose_name='Texto Articulado', + to='compilacao.TextoArticulado', default=1), + preserve_default=False, + ), + migrations.AddField( + model_name='dispositivo', + name='ta_publicado', + field=models.ForeignKey( + related_name='dispositivos_alterados_pelo_ta_set', blank=True, + verbose_name='Texto Articulado Publicado', + default=None, to='compilacao.TextoArticulado', null=True), + ), + migrations.AddField( + model_name='publicacao', + name='ta', + field=models.ForeignKey( + verbose_name='Texto Articulado', + to='compilacao.TextoArticulado', default=1), + preserve_default=False, + ), + ] diff --git a/compilacao/migrations/0034_auto_20151222_1609.py b/compilacao/migrations/0034_auto_20151222_1609.py new file mode 100644 index 000000000..f77cd2634 --- /dev/null +++ b/compilacao/migrations/0034_auto_20151222_1609.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0033_auto_20151222_1608'), + ] + + operations = [ + migrations.AlterModelOptions( + name='dispositivo', + options={'ordering': ['ta', 'ordem'], 'verbose_name_plural': 'Dispositivos', 'verbose_name': 'Dispositivo'}, + ), + migrations.AlterUniqueTogether( + name='dispositivo', + unique_together=set([('ta', 'dispositivo0', 'dispositivo1', 'dispositivo2', 'dispositivo3', 'dispositivo4', 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', 'ta_publicado', 'publicacao'), ('ta', 'ordem')]), + ), + ] diff --git a/compilacao/migrations/0035_auto_20151223_1709.py b/compilacao/migrations/0035_auto_20151223_1709.py new file mode 100644 index 000000000..071cf3da5 --- /dev/null +++ b/compilacao/migrations/0035_auto_20151223_1709.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0034_auto_20151222_1609'), + ] + + operations = [ + migrations.CreateModel( + name='TipoTextoArticulado', + fields=[ + ('id', models.AutoField(auto_created=True, serialize=False, primary_key=True, verbose_name='ID')), + ('sigla', models.CharField(max_length=3, verbose_name='Sigla')), + ('descricao', models.CharField(max_length=50, verbose_name='Descrição')), + ], + options={ + 'verbose_name_plural': 'Tipos de Texto Articulados', + 'verbose_name': 'Tipo de Texto Articulado', + }, + ), + migrations.AddField( + model_name='textoarticulado', + name='tipo_ta', + field=models.ForeignKey(to='compilacao.TipoTextoArticulado', default=1, verbose_name='Tipo de Texto Articulado'), + preserve_default=False, + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index a96818b60..8c213c57d 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -4,11 +4,11 @@ from django.contrib.auth.models import User from django.db import models from django.db.models import F, Q from django.db.models.aggregates import Max +from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ -from norma.models import NormaJuridica -from sapl import utils -from sapl.utils import YES_NO_CHOICES +from compilacao import utils +from compilacao.utils import YES_NO_CHOICES class TimestampedMixin(models.Model): @@ -58,6 +58,41 @@ class BaseModel(models.Model): raise ValidationError(msg) +class TipoTextoArticulado(models.Model): + sigla = models.CharField(max_length=3, verbose_name=_('Sigla')) + descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) + + class Meta: + verbose_name = _('Tipo de Texto Articulado') + verbose_name_plural = _('Tipos de Texto Articulados') + + def __str__(self): + return self.descricao + + +class TextoArticulado(TimestampedMixin): + data = models.DateField(blank=True, null=True, verbose_name=_('Data')) + ementa = models.TextField(verbose_name=_('Ementa')) + observacao = models.TextField( + blank=True, null=True, verbose_name=_('Observação')) + numero = models.PositiveIntegerField(verbose_name=_('Número')) + ano = models.PositiveSmallIntegerField(verbose_name=_('Ano')) + tipo_ta = models.ForeignKey( + TipoTextoArticulado, + verbose_name=_('Tipo de Texto Articulado')) + + class Meta: + verbose_name = _('Texto Articulado') + verbose_name_plural = _('Textos Articulados') + ordering = ['-data', '-numero'] + + def __str__(self): + return _('Texto Articulado nº %(numero)s de %(data)s') % { + 'tipo': self.tipo_ta, + 'numero': self.numero, + 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} + + class TipoNota(models.Model): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) @@ -259,7 +294,7 @@ class TipoDispositivo(BaseModel): self, pai_relativo, include_relative_autos=True, perfil_pk=None): if not perfil_pk: - perfis = PerfilEstruturalTextosNormativos.objects.filter( + perfis = PerfilEstruturalTextoArticulado.objects.filter( padrao=True)[:1] if not perfis.exists(): @@ -279,7 +314,7 @@ class TipoDispositivo(BaseModel): self, base, perfil_pk=None): if not perfil_pk: - perfis = PerfilEstruturalTextosNormativos.objects.filter( + perfis = PerfilEstruturalTextoArticulado.objects.filter( padrao=True)[:1] if not perfis.exists(): @@ -294,7 +329,7 @@ class TipoDispositivo(BaseModel): return False -class PerfilEstruturalTextosNormativos(BaseModel): +class PerfilEstruturalTextoArticulado(BaseModel): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) nome = models.CharField(max_length=50, verbose_name=_('Nome')) @@ -303,8 +338,8 @@ class PerfilEstruturalTextosNormativos(BaseModel): choices=YES_NO_CHOICES, verbose_name=_('Padrão')) class Meta: - verbose_name = _('Perfil Estrutural de Textos Normativos') - verbose_name_plural = _('Perfis Estruturais de Textos Normativos') + verbose_name = _('Perfil Estrutural de Texto Articulado') + verbose_name_plural = _('Perfis Estruturais de Textos Articulados') ordering = ['-padrao', 'sigla'] @@ -317,7 +352,7 @@ class TipoDispositivoRelationship(BaseModel): filho_permitido = models.ForeignKey( TipoDispositivo, related_name='possiveis_pais') - perfil = models.ForeignKey(PerfilEstruturalTextosNormativos) + perfil = models.ForeignKey(PerfilEstruturalTextoArticulado) filho_de_insercao_automatica = models.BooleanField( default=False, choices=YES_NO_CHOICES, verbose_name=_('Filho de Inserção Automática')) @@ -369,8 +404,8 @@ class VeiculoPublicacao(models.Model): class Publicacao(TimestampedMixin): - norma = models.ForeignKey( - NormaJuridica, verbose_name=_('Norma Jurídica')) + ta = models.ForeignKey( + TextoArticulado, verbose_name=_('Texto Articulado')) veiculo_publicacao = models.ForeignKey( VeiculoPublicacao, verbose_name=_('Veículo de Publicação')) tipo_publicacao = models.ForeignKey( @@ -467,7 +502,7 @@ class Dispositivo(BaseModel, TimestampedMixin): visibilidade = models.BooleanField( default=False, choices=YES_NO_CHOICES, - verbose_name=_('Visibilidade na Norma Publicada')) + verbose_name=_('Visibilidade no Texto Articulado Publicado')) tipo_dispositivo = models.ForeignKey( TipoDispositivo, @@ -478,15 +513,15 @@ class Dispositivo(BaseModel, TimestampedMixin): Publicacao, blank=True, null=True, default=None, verbose_name=_('Publicação')) - norma = models.ForeignKey( - NormaJuridica, + ta = models.ForeignKey( + TextoArticulado, related_name='dispositivos_set', - verbose_name=_('Norma Jurídica')) - norma_publicada = models.ForeignKey( - NormaJuridica, + verbose_name=_('Texto Articulado')) + ta_publicado = models.ForeignKey( + TextoArticulado, blank=True, null=True, default=None, - related_name='dispositivos_alterados_pela_norma_set', - verbose_name=_('Norma Jurídica Publicada')) + related_name='dispositivos_alterados_pelo_ta_set', + verbose_name=_('Texto Articulado Publicado')) dispositivo_subsequente = models.ForeignKey( 'self', @@ -517,10 +552,10 @@ class Dispositivo(BaseModel, TimestampedMixin): class Meta: verbose_name = _('Dispositivo') verbose_name_plural = _('Dispositivos') - ordering = ['norma', 'ordem'] + ordering = ['ta', 'ordem'] unique_together = ( - ('norma', 'ordem',), - ('norma', + ('ta', 'ordem',), + ('ta', 'dispositivo0', 'dispositivo1', 'dispositivo2', @@ -529,14 +564,14 @@ class Dispositivo(BaseModel, TimestampedMixin): 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', - 'norma_publicada', + 'ta_publicado', 'publicacao',), ) def __str__(self): - return '%(rotulo)s - %(norma)s' % { + return '%(rotulo)s - %(ta)s' % { 'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo), - 'norma': self.norma} + 'ta': self.ta} def rotulo_padrao(self, local_insert=0, for_insert_in=0): """ @@ -774,36 +809,37 @@ class Dispositivo(BaseModel, TimestampedMixin): proximo_bloco = Dispositivo.objects.filter( ordem__gt=self.ordem, nivel__lte=self.nivel, - norma_id=self.norma_id)[:1] + ta_id=self.ta_id)[:1] elif local == 'add_in': proximo_bloco = Dispositivo.objects.filter( ordem__gt=self.ordem, nivel__lte=self.nivel + 1, - norma_id=self.norma_id).exclude( + ta_id=self.ta_id).exclude( tipo_dispositivo__class_css='caput')[:1] else: proximo_bloco = Dispositivo.objects.filter( ordem__gte=self.ordem, - norma_id=self.norma_id)[:1] + ta_id=self.ta_id)[:1] if proximo_bloco.exists(): ordem = proximo_bloco[0].ordem proximo_bloco = Dispositivo.objects.order_by('-ordem').filter( ordem__gte=ordem, - norma_id=self.norma_id) + ta_id=self.ta_id) proximo_bloco.update(ordem=F('ordem') + 1) proximo_bloco.update( ordem=F('ordem') + ( Dispositivo.INTERVALO_ORDEM * espaco_a_criar - 1)) else: - # inserção no fim da norma + # inserção no fim da ta ordem_max = Dispositivo.objects.order_by( - 'ordem').filter(norma_id=self.norma_id).aggregate( + 'ordem').filter( + ta_id=self.ta_id).aggregate( Max('ordem')) if ordem_max['ordem__max'] is None: raise Exception( - 'Não existem registros base nesta Norma') + 'Não existem registros base neste Texto Articulado') ordem = ordem_max['ordem__max'] + Dispositivo.INTERVALO_ORDEM return ordem @@ -847,7 +883,7 @@ class Dispositivo(BaseModel, TimestampedMixin): elif self.dispositivo_pai is None: irmaos = list(Dispositivo.objects.filter( ordem__gt=self.ordem, - norma_id=self.norma_id, + ta_id=self.ta_id, tipo_dispositivo_id=self.tipo_dispositivo.pk)) else: # contagem continua restrita a articulacao @@ -856,13 +892,13 @@ class Dispositivo(BaseModel, TimestampedMixin): if proxima_articulacao is None: irmaos = list(Dispositivo.objects.filter( ordem__gt=self.ordem, - norma_id=self.norma_id, + ta_id=self.ta_id, tipo_dispositivo_id=self.tipo_dispositivo.pk)) else: irmaos = list(Dispositivo.objects.filter( Q(ordem__gt=self.ordem) & Q(ordem__lt=proxima_articulacao.ordem), - norma_id=self.norma_id, + ta_id=self.ta_id, tipo_dispositivo_id=self.tipo_dispositivo.pk)) dp_profundidade = self.get_profundidade() @@ -943,7 +979,7 @@ class Dispositivo(BaseModel, TimestampedMixin): proxima_articulacao = Dispositivo.objects.filter( ordem__gt=self.ordem, nivel=0, - norma_id=self.norma_id)[:1] + ta_id=self.ta_id)[:1] if not proxima_articulacao.exists(): return None @@ -955,7 +991,7 @@ class Dispositivo(BaseModel, TimestampedMixin): # pp possiveis_pais if not perfil_pk: - perfis = PerfilEstruturalTextosNormativos.objects.filter( + perfis = PerfilEstruturalTextoArticulado.objects.filter( padrao=True)[:1] if perfis.exists(): perfil_pk = perfis[0].pk @@ -985,7 +1021,7 @@ class Dispositivo(BaseModel, TimestampedMixin): dispositivo_base.get_numero_completo()) dp.nivel = dispositivo_base.nivel dp.texto = '' - dp.norma = dispositivo_base.norma + dp.ta = dispositivo_base.ta dp.dispositivo_pai = dispositivo_base.dispositivo_pai dp.inicio_eficacia = dispositivo_base.inicio_eficacia dp.inicio_vigencia = dispositivo_base.inicio_vigencia @@ -1005,7 +1041,7 @@ class Dispositivo(BaseModel, TimestampedMixin): tipo_dispositivo_id=tipo_base.pk, ordem__lte=dispositivo_base.ordem, ordem__gt=raiz.ordem, - norma_id=dispositivo_base.norma_id)[:1] + ta_id=dispositivo_base.ta_id)[:1] if disps.exists(): dispositivo.set_numero_completo( diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 7a59720c9..3934d7705 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -43,7 +43,7 @@ def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia): @register.simple_tag def nota_automatica(dispositivo): - if dispositivo.norma_publicada is not None: + if dispositivo.ta_publicado is not None: d = dispositivo.dispositivo_atualizador.dispositivo_pai if dispositivo.texto == Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO: return 'Revogado pelo %s.' % d @@ -152,3 +152,9 @@ def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0): d = d.dispositivo_pai return result + + + +@register.simple_tag +def verbose_name(instance, field_name): + return instance._meta.get_field(field_name).verbose_name.title() diff --git a/compilacao/urls.py b/compilacao/urls.py index 571794788..352f3931d 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,70 +1,66 @@ from django.conf.urls import include, url from compilacao import views -from compilacao.views import (perfil_estr_txt_norm, tipo_dispositivo_crud, - tipo_nota_crud, tipo_publicacao_crud, - tipo_vide_crud, veiculo_publicacao_crud) urlpatterns_compilacao = [ - url(r'^(?P[0-9]+)/compilacao$', + + url(r'^$', views.TaListView.as_view(), name='ta_list'), + url(r'^(?P[0-9]+)$', views.TaDetailView.as_view(), name='ta_detail'), + url(r'^(?P[0-9]+)/edit$', + views.TaUpdateView.as_view(), name='ta_edit'), + +] + +urlpatterns = [ + url(r'^ta/', include(urlpatterns_compilacao)), + + + +] + + +""" + url(r'^(?P[0-9]+)/compilacao$', views.CompilacaoView.as_view(), name='compilacao'), - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), - url(r'^(?P[0-9]+)/compilacao/vigencia/(?P.+)/$', + url(r'^(?P[0-9]+)/compilacao/vigencia/(?P.+)/$', views.CompilacaoView.as_view(), name='vigencia'), - url(r'^(?P[0-9]+)/compilacao/edit', + url(r'^(?P[0-9]+)/compilacao/edit', views.CompilacaoEditView.as_view(), name='comp_edit'), - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/refresh', + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/refresh', views.DispositivoEditView.as_view(), name='dispositivo_edit'), - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/actions', + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/actions', views.ActionsEditView.as_view(), name='dispositivo_actions'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/compilacao/' '(?P[0-9]+)/nota/create$', views.NotasCreateView.as_view(), name='nota_create'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/compilacao/' '(?P[0-9]+)/nota/(?P[0-9]+)/edit$', views.NotasEditView.as_view(), name='nota_edit'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/compilacao/' '(?P[0-9]+)/nota/(?P[0-9]+)/delete$', views.NotasDeleteView.as_view(), name='nota_delete'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/compilacao/' '(?P[0-9]+)/vide/create$', views.VideCreateView.as_view(), name='vide_create'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/compilacao/' '(?P[0-9]+)/vide/(?P[0-9]+)/edit$', views.VideEditView.as_view(), name='vide_edit'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/compilacao/' '(?P[0-9]+)/vide/(?P[0-9]+)/delete$', views.VideDeleteView.as_view(), name='vide_delete'), - url(r'^(?P[0-9]+)/compilacao/search$', + url(r'^(?P[0-9]+)/compilacao/search$', views.DispositivoSearchFragmentFormView.as_view(), name='search_dispositivo'), - -] - -urlpatterns = [ - url(r'^norma/', include(urlpatterns_compilacao)), - - url(r'^sistema/compilacao/tipo-nota/', - include(tipo_nota_crud.urls)), - url(r'^sistema/compilacao/tipo-vide/', - include(tipo_vide_crud.urls)), - url(r'^sistema/compilacao/tipo-publicacao/', - include(tipo_publicacao_crud.urls)), - url(r'^sistema/compilacao/tipo-dispositivo/', - include(tipo_dispositivo_crud.urls)), - url(r'^sistema/compilacao/veiculo-publicacao/', - include(veiculo_publicacao_crud.urls)), - url(r'^sistema/compilacao/perfil-estrutural-textos-normativos/', - include(perfil_estr_txt_norm.urls)), -] +""" diff --git a/compilacao/utils.py b/compilacao/utils.py new file mode 100644 index 000000000..f07d47a07 --- /dev/null +++ b/compilacao/utils.py @@ -0,0 +1,83 @@ +from crispy_forms_foundation.layout import (HTML, Column, Div, Fieldset, + Layout, Row, Submit) +from django.apps import apps +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ + + +def to_column(name_span): + fieldname, span = name_span + return Column(fieldname, css_class='large-%d' % span) + + +def to_row(names_spans): + return Row(*list(map(to_column, names_spans))) + + +def make_choices(*choice_pairs): + assert len(choice_pairs) % 2 == 0 + ipairs = iter(choice_pairs) + choices = list(zip(ipairs, ipairs)) + yield choices + for key, value in choices: + yield key + +YES_NO_CHOICES = [(True, _('Sim')), (False, _('Não'))] + + +def int_to_roman(int_value): + # if isinstance(int_value, type(1)): + # raise TypeError("expected integer, got %s" % type(int_value)) + if not 0 < int_value < 4000: + raise ValueError("Argument must be between 1 and 3999") + ints = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1) + nums = ('M', 'CM', 'D', 'CD', 'C', 'XC', + 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I') + result = "" + for i in range(len(ints)): + count = int(int_value / ints[i]) + result += nums[i] * count + int_value -= ints[i] * count + return result + + +def int_to_letter(int_value): + result = '' + int_value -= 1 + while int_value >= 26: + rest = int_value % 26 + int_value = int(int_value / 26) - 1 + result = chr(rest + 65) + result + result = chr(int_value + 65) + result + return result + + +def from_to(start, end): + return list(range(start, end + 1)) + + +def make_pagination(index, num_pages): + '''Make a list of adjacent page ranges interspersed with "None"s + + The list starts with [1, 2] and end with [num_pages-1, num_pages]. + The list includes [index-1, index, index+1] + "None"s separate those ranges and mean ellipsis (...) + + Example: [1, 2, None, 10, 11, 12, None, 29, 30] + ''' + + PAGINATION_LENGTH = 10 + if num_pages <= PAGINATION_LENGTH: + return from_to(1, num_pages) + else: + if index - 1 <= 5: + tail = [num_pages - 1, num_pages] + head = from_to(1, PAGINATION_LENGTH - 3) + else: + if index + 1 >= num_pages - 3: + tail = from_to(index - 1, num_pages) + else: + tail = [index - 1, index, index + 1, + None, num_pages - 1, num_pages] + head = from_to(1, PAGINATION_LENGTH - len(tail) - 1) + return head + [None] + tail diff --git a/compilacao/views.py b/compilacao/views.py index 8f86e0229..e3fb96522 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -3,1351 +3,72 @@ from datetime import datetime, timedelta from os.path import sys from django.contrib.auth.decorators import login_required +from django.contrib.messages.api import success from django.core.signing import Signer -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import Q from django.http.response import (HttpResponse, HttpResponseRedirect, JsonResponse) from django.shortcuts import get_object_or_404, render from django.utils.dateparse import parse_date from django.utils.decorators import method_decorator +from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView -from django.views.generic.edit import FormMixin, UpdateView +from django.views.generic.detail import DetailView +from django.views.generic.edit import FormMixin, UpdateView, CreateView from django.views.generic.list import ListView -from vanilla.model_views import CreateView -from compilacao import forms -from compilacao.file2dispositivo import Parser +from compilacao import forms, utils from compilacao.models import (Dispositivo, Nota, - PerfilEstruturalTextosNormativos, + PerfilEstruturalTextoArticulado, TipoDispositivo, TipoNota, TipoPublicacao, - TipoVide, VeiculoPublicacao, Vide) -from norma.models import NormaJuridica -from sapl.crud import build_crud + TipoVide, VeiculoPublicacao, Vide, + TextoArticulado) + DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', - 'norma_publicada', - 'norma', + 'ta_publicado', + 'ta', 'dispositivo_atualizador', 'dispositivo_atualizador__dispositivo_pai', - 'dispositivo_atualizador__dispositivo_pai__norma', - 'dispositivo_atualizador__dispositivo_pai__norma__tipo', + 'dispositivo_atualizador__dispositivo_pai__ta', + 'dispositivo_atualizador__dispositivo_pai__ta__tipo', 'dispositivo_pai', 'dispositivo_pai__tipo_dispositivo') -tipo_nota_crud = build_crud( - TipoNota, 'tipo_nota', [ - - [_('Tipo da Nota'), - [('sigla', 2), ('nome', 10)], - [('modelo', 12)]], - ]) - -tipo_vide_crud = build_crud( - TipoVide, 'tipo_vide', [ - - [_('Tipo de Vide'), - [('sigla', 2), ('nome', 10)]], - ]) - -tipo_publicacao_crud = build_crud( - TipoPublicacao, 'tipo_publicacao', [ - - [_('Tipo de Publicação'), - [('sigla', 2), ('nome', 10)]], - ]) - -perfil_estr_txt_norm = build_crud( - PerfilEstruturalTextosNormativos, 'perfil_estrutural', [ - - [_('Perfil Estrutural de Textos Normativos'), - [('sigla', 2), ('nome', 10)]], - ]) - - -veiculo_publicacao_crud = build_crud( - VeiculoPublicacao, 'veiculo_publicacao', [ - - [_('Veículo de Publicação'), - [('sigla', 2), ('nome', 10)]], - ]) - -tipo_dispositivo_crud = build_crud( - TipoDispositivo, 'tipo_dispositivo', [ - - [_('Dados Básicos'), - [('nome', 8), ('class_css', 4)]], - - [_('Configurações para Edição do Rótulo'), - [('rotulo_prefixo_texto', 3), - ('rotulo_sufixo_texto', 3), - ('rotulo_ordinal', 3), - ('contagem_continua', 3)], - - ], - - [_('Configurações para Renderização de Rótulo e Texto'), - [('rotulo_prefixo_html', 6), - ('rotulo_sufixo_html', 6), ], - - [('texto_prefixo_html', 4), - ('dispositivo_de_articulacao', 4), - ('texto_sufixo_html', 4)], - ], - [_('Configurações para Nota Automática'), - [('nota_automatica_prefixo_html', 6), - ('nota_automatica_sufixo_html', 6), - ], - ], - - [_('Configurações para Variações Numéricas'), - - [('formato_variacao0', 12)], - [('rotulo_separador_variacao01', 5), ('formato_variacao1', 7), ], - [('rotulo_separador_variacao12', 5), ('formato_variacao2', 7), ], - [('rotulo_separador_variacao23', 5), ('formato_variacao3', 7), ], - [('rotulo_separador_variacao34', 5), ('formato_variacao4', 7), ], - [('rotulo_separador_variacao45', 5), ('formato_variacao5', 7), ], - - ], - - ]) - - -class CompilacaoView(ListView): - template_name = 'compilacao/index.html' - - flag_alteradora = -1 - - flag_nivel_ini = 0 - flag_nivel_old = -1 - - itens_de_vigencia = {} - - inicio_vigencia = None - fim_vigencia = None +class TaListView(ListView): + model = TextoArticulado + paginate_by = 10 + title = TextoArticulado._meta.verbose_name_plural def get_context_data(self, **kwargs): - context = super(CompilacaoView, self).get_context_data(**kwargs) - - 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']).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) + context = super(TaListView, self).get_context_data(**kwargs) + paginator = context['paginator'] + page_obj = context['page_obj'] + context['page_range'] = utils.make_pagination( + page_obj.number, paginator.num_pages) return context - def get_queryset(self): - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - self.inicio_vigencia = None - self.fim_vigencia = None - if 'sign' in self.kwargs: - signer = Signer() - try: - string = signer.unsign(self.kwargs['sign']).split(',') - self.inicio_vigencia = parse_date(string[0]) - self.fim_vigencia = parse_date(string[1]) - except: - return{} - - return Dispositivo.objects.filter( - inicio_vigencia__lte=self.fim_vigencia, - ordem__gt=0, - norma_id=self.kwargs['norma_id'], - ).select_related(*DISPOSITIVO_SELECT_RELATED) - else: - - r = Dispositivo.objects.filter( - ordem__gt=0, - norma_id=self.kwargs['norma_id'], - ).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', - 'dispositivo_pai__tipo_dispositivo') - - return r - - def get_vigencias(self): - itens = Dispositivo.objects.filter( - norma_id=self.kwargs['norma_id'], - ).order_by( - 'inicio_vigencia' - ).distinct( - 'inicio_vigencia' - ).select_related( - 'norma_publicada', - 'norma', - 'norma_publicada__tipo', - 'norma__tipo',) - - ajuste_datas_vigencia = [] - - for item in itens: - ajuste_datas_vigencia.append(item) - - lenLista = len(ajuste_datas_vigencia) - for i in range(lenLista): - if i + 1 < lenLista: - ajuste_datas_vigencia[ - i].fim_vigencia = ajuste_datas_vigencia[ - i + 1].inicio_vigencia - timedelta(days=1) - else: - ajuste_datas_vigencia[i].fim_vigencia = None - - self.itens_de_vigencia = {} - - idx = -1 - length = len(ajuste_datas_vigencia) - for item in ajuste_datas_vigencia: - idx += 1 - if idx == 0: - self.itens_de_vigencia[0] = [item, ] - continue - - if idx + 1 < length: - ano = item.norma_publicada.ano - if ano in self.itens_de_vigencia: - self.itens_de_vigencia[ano].append(item) - else: - self.itens_de_vigencia[ano] = [item, ] - else: - self.itens_de_vigencia[9999] = [item, ] - - if len(self.itens_de_vigencia.keys()) <= 1: - return {} - - self.itens_de_vigencia = OrderedDict( - sorted(self.itens_de_vigencia.items(), key=lambda t: t[0])) - - return self.itens_de_vigencia - - 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(CompilacaoView): - # template_name = 'compilacao/index.html' - template_name = 'compilacao/index_bloco.html' - - def get_queryset(self): - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - 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_id=self.kwargs['norma_id'])[:1] - - if proximo_bloco.count() == 0: - itens = Dispositivo.objects.filter( - ordem__gte=bloco.ordem, - 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_id=self.kwargs['norma_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - return itens - - -def handle_uploaded_file(f, outfilepath): - with open(outfilepath, 'wb+') as destination: - for chunk in f.chunks(): - destination.write(chunk) - - -class CompilacaoEditView(CompilacaoView, FormMixin): - - template_name = 'compilacao/edit.html' - - flag_alteradora = -1 - - flag_nivel_ini = 0 - flag_nivel_old = -1 - - pk_edit = 0 - pk_view = 0 - - def post(self, request, *args, **kwargs): - form = forms.UpLoadImportFileForm(request.POST, request.FILES) - message = "Arquivo Submetido com sucesso" - - self.object_list = self.get_queryset() - - if form.is_valid(): - try: - f = request.FILES['import_file'] - outfilepath = '/tmp/' + f.name - handle_uploaded_file(f, outfilepath) - - p = Parser() - p.parser(outfilepath) - - except Exception as e: - print(e) - - context = self.get_context_data( - object_list=self.object_list, - form=form, - message=message, - view=self, - parser_list=p.parser_list) - return render(request, self.template_name, context) - else: - context = self.get_context_data( - object_list=self.object_list, - form=form, - message=form.errors, - view=self) - return self.form_invalid(context) - - return self.render_to_response({'form': form}) - - def form_invalid(self, context): - return self.render_to_response(context) - - def get(self, request, *args, **kwargs): - - self.object_list = self.get_queryset() - form_class = forms.UpLoadImportFileForm - self.form = self.get_form(form_class) - context = self.get_context_data( - object_list=self.object_list, - form=self.form) - - return self.render_to_response(context) - - def get_queryset(self): - self.pk_edit = 0 - self.pk_view = 0 - - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - result = Dispositivo.objects.filter( - norma_id=self.kwargs['norma_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - - if not result.exists(): - - norma = NormaJuridica.objects.get(pk=self.kwargs['norma_id']) - - td = TipoDispositivo.objects.filter(class_css='articulacao')[0] - a = Dispositivo() - a.nivel = 0 - a.ordem = Dispositivo.INTERVALO_ORDEM - a.ordem_bloco_atualizador = 0 - a.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - a.norma = norma - a.tipo_dispositivo = td - a.inicio_vigencia = norma.data_publicacao - a.inicio_eficacia = norma.data_publicacao - a.timestamp = datetime.now() - a.save() - - td = TipoDispositivo.objects.filter(class_css='ementa')[0] - e = Dispositivo() - e.nivel = 1 - e.ordem = a.ordem + Dispositivo.INTERVALO_ORDEM - e.ordem_bloco_atualizador = 0 - e.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - e.norma = norma - e.tipo_dispositivo = td - e.inicio_vigencia = norma.data_publicacao - e.inicio_eficacia = norma.data_publicacao - e.timestamp = datetime.now() - e.texto = norma.ementa - e.dispositivo_pai = a - e.save() - - a.pk = None - a.nivel = 0 - a.ordem = e.ordem + Dispositivo.INTERVALO_ORDEM - a.ordem_bloco_atualizador = 0 - a.set_numero_completo([2, 0, 0, 0, 0, 0, ]) - a.timestamp = datetime.now() - a.save() - - result = Dispositivo.objects.filter( - norma_id=self.kwargs['norma_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - - return result - - def set_perfil_in_session(self, request=None, perfil_id=0): - if not request: - return None - - if perfil_id: - perfil = PerfilEstruturalTextosNormativos.objects.get( - pk=perfil_id) - request.session['perfil_estrutural'] = perfil.pk - else: - perfis = PerfilEstruturalTextosNormativos.objects.filter( - padrao=True)[:1] - - if not perfis.exists(): - request.session.pop('perfil_estrutural') - else: - request.session['perfil_estrutural'] = perfis[0].pk - - -class DispositivoEditView(CompilacaoEditView): - template_name = 'compilacao/edit_bloco.html' - - def post(self, request, *args, **kwargs): - - d = Dispositivo.objects.get( - pk=self.kwargs['dispositivo_id']) - - texto = request.POST['texto'] - - if d.texto != '': - d.texto = texto - d.save() - return self.get(request, *args, **kwargs) - d.texto = texto.strip() - d.save() - - if texto != '': - dnext = Dispositivo.objects.filter( - norma_id=d.norma_id, - ordem__gt=d.ordem, - texto='', - tipo_dispositivo__dispositivo_de_articulacao=False)[:1] - - if not dnext.exists(): - return self.get(request, *args, **kwargs) - - if dnext[0].nivel > d.nivel: - pais = [d.pk, ] - else: - if dnext[0].dispositivo_pai_id == d.dispositivo_pai_id: - pais = [dnext[0].dispositivo_pai_id, ] - else: - pais = [ - dnext[0].dispositivo_pai_id, d.dispositivo_pai_id, ] - data = {'pk': dnext[0].pk, 'pai': pais} - else: - data = {'pk': d.pk, 'pai': [d.pk, ]} - - return JsonResponse(data, safe=False) - - def get_queryset_perfil_estrutural(self): - perfis = PerfilEstruturalTextosNormativos.objects.all() - return perfis - - def get(self, request, *args, **kwargs): - - try: - if 'perfil_pk' in request.GET: - self.set_perfil_in_session( - request, request.GET['perfil_pk']) - elif 'perfil_estrutural' not in request.session: - self.set_perfil_in_session(request=request) - - self.object_list = self.get_queryset() - - self.perfil_estrutural_list = self.get_queryset_perfil_estrutural() - - context = self.get_context_data( - object_list=self.object_list, - perfil_estrutural_list=self.perfil_estrutural_list - ) - except Exception as e: - print(e) - - return self.render_to_response(context) - - def get_queryset(self): - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - try: - self.pk_edit = int(self.request.GET['edit']) - except: - self.pk_edit = 0 - self.pk_view = int(self.kwargs['dispositivo_id']) - - try: - if self.pk_edit == self.pk_view: - bloco = Dispositivo.objects.get( - pk=self.kwargs['dispositivo_id']) - else: - 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 - - if self.pk_edit == self.pk_view: - return [bloco, ] - - proximo_bloco = Dispositivo.objects.filter( - ordem__gt=bloco.ordem, - nivel__lte=bloco.nivel, - norma_id=self.kwargs['norma_id'])[:1] - - if proximo_bloco.count() == 0: - itens = Dispositivo.objects.filter( - ordem__gte=bloco.ordem, - 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_id=self.kwargs['norma_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - return itens - - def select_provaveis_inserts(self, request=None): - - try: - - if request and 'perfil_estrutural' not in request.session: - self.set_perfil_in_session(request) - - perfil_pk = request.session['perfil_estrutural'] - - # Não salvar d_base - if self.pk_edit == 0: - base = Dispositivo.objects.get(pk=self.pk_view) - else: - base = Dispositivo.objects.get(pk=self.pk_edit) - - prox_possivel = Dispositivo.objects.filter( - ordem__gt=base.ordem, - nivel__lte=base.nivel, - norma_id=base.norma_id)[:1] - - if prox_possivel.exists(): - prox_possivel = prox_possivel[0] - else: - prox_possivel = None - - result = [{'tipo_insert': 'Inserir Depois', - 'icone': '↷ ', - 'action': 'add_next', - 'itens': []}, - {'tipo_insert': 'Inserir Dentro', - 'icone': '⇲ ', - 'action': 'add_in', - 'itens': []}, - {'tipo_insert': 'Inserir Antes', - 'icone': '↶ ', - 'action': 'add_prior', - 'itens': []} - ] - - # Possíveis inserções sequenciais já existentes - parents = base.get_parents() - parents.insert(0, base) - nivel = sys.maxsize - for dp in parents: - - if dp.nivel >= nivel: - continue - - if dp.is_relative_auto_insert(perfil_pk): - continue - - if prox_possivel and \ - dp.tipo_dispositivo != base.tipo_dispositivo and\ - dp.nivel < prox_possivel.nivel and\ - not prox_possivel.tipo_dispositivo.permitido_inserir_in( - dp.tipo_dispositivo, - perfil_pk=perfil_pk): - - if dp.tipo_dispositivo != prox_possivel.tipo_dispositivo: - continue - - nivel = dp.nivel - - # um do mesmo para inserção antes - if dp == base: - result[2]['itens'].append({ - 'class_css': dp.tipo_dispositivo.class_css, - 'tipo_pk': dp.tipo_dispositivo.pk, - 'variacao': 0, - 'provavel': '%s (%s)' % ( - dp.rotulo_padrao(local_insert=1), - dp.tipo_dispositivo.nome,), - 'dispositivo_base': base.pk}) - - if dp.dispositivo_pai: - flag_pv = dp.tipo_dispositivo.permitido_variacao( - dp.dispositivo_pai.tipo_dispositivo, - perfil_pk=perfil_pk) - else: - flag_pv = False - - r = [] - flag_direcao = 1 - flag_variacao = 0 - while True: - if dp.dispositivo0 == 0: - local_insert = 1 - else: - local_insert = 0 - - rt = dp.transform_in_next(flag_direcao) - if not rt[0]: - break - flag_variacao += rt[1] - r.append({'class_css': dp.tipo_dispositivo.class_css, - 'tipo_pk': dp.tipo_dispositivo.pk, - 'variacao': flag_variacao, - 'provavel': '%s (%s)' % ( - dp.rotulo_padrao(local_insert), - dp.tipo_dispositivo.nome,), - 'dispositivo_base': base.pk}) - - flag_direcao = -1 - - r.reverse() - - if not flag_pv: - r = [r[0], ] - - if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \ - TipoDispositivo.FNCN: - r = [r[0], ] - - if dp.tipo_dispositivo == base.tipo_dispositivo: - result[0]['itens'] += r - else: - result[0]['itens'] += r - result[2]['itens'] += r - if nivel == 0: - break +class TaDetailView(DetailView): + model = TextoArticulado - # tipo do dispositivo base - tipb = base.tipo_dispositivo + @property + def title(self): + return self.get_object() - for paradentro in [1, 0]: - if paradentro: - # Outros Tipos de Dispositivos PARA DENTRO - otds = TipoDispositivo.objects.order_by( - '-contagem_continua', 'id').all() - else: - # Outros Tipos de Dispositivos PARA FORA - classes_ja_inseridas = [] - for c in result[0]['itens']: - if c['class_css'] not in classes_ja_inseridas: - classes_ja_inseridas.append(c['class_css']) - for c in result[1]['itens']: - if c['class_css'] not in classes_ja_inseridas: - classes_ja_inseridas.append(c['class_css']) - otds = TipoDispositivo.objects.order_by( - '-contagem_continua', 'id').all().exclude( - class_css__in=classes_ja_inseridas) - for td in otds: +class TaUpdateView(UpdateView): + model = TextoArticulado + form_class = forms.TaForm + template_name = "compilacao/form.html" - if paradentro and not td.permitido_inserir_in( - tipb, - include_relative_autos=False, - perfil_pk=perfil_pk): - continue - - base.tipo_dispositivo = td - - if not paradentro: - - flag_insercao = False - for possivelpai in parents: - if td.permitido_inserir_in( - possivelpai.tipo_dispositivo, - include_relative_autos=False, - perfil_pk=perfil_pk): - flag_insercao = True - break - - if not flag_insercao: - continue - - if possivelpai.is_relative_auto_insert(perfil_pk): - continue - - if prox_possivel: - if prox_possivel.nivel == base.nivel: - if prox_possivel.tipo_dispositivo != td and\ - not prox_possivel.tipo_dispositivo.\ - permitido_inserir_in( - td, perfil_pk=perfil_pk): - continue - else: - if possivelpai.tipo_dispositivo != \ - prox_possivel.tipo_dispositivo and\ - not prox_possivel.tipo_dispositivo.\ - permitido_inserir_in( - possivelpai.tipo_dispositivo, - perfil_pk=perfil_pk) and \ - possivelpai.nivel < \ - prox_possivel.nivel: - continue - base.dispositivo_pai = possivelpai - Dispositivo.set_numero_for_add_in( - possivelpai, base, td) - else: - Dispositivo.set_numero_for_add_in(base, base, td) - - r = [{'class_css': td.class_css, - 'tipo_pk': td.pk, - 'variacao': 0, - 'provavel': '%s (%s)' % ( - base.rotulo_padrao(1, paradentro), - td.nome,), - 'dispositivo_base': base.pk}] - - if paradentro == 1: - """if (tipb.class_css == 'caput' and - td.class_css == 'paragrafo'): - result[0]['itens'].insert(0, r[0]) - else:""" - result[1]['itens'] += r - else: - result[2]['itens'] += r - result[0]['itens'] += r - - # if len(result[0]['itens']) < len(result[1]['itens']): - # r = result[0] - # result.remove(result[0]) - # result.insert(1, r) - - # remover temporariamente a opção inserir antes - # confirmar falta de necessidade - if len(result) > 2: - result.pop() - - except Exception as e: - print(e) - - return result - - -class ActionsEditMixin(object): - - def render_to_json_response(self, context, **response_kwargs): - - action = getattr(self, context['action']) - return JsonResponse(action(context), safe=False) - - def delete_item_dispositivo(self, context): - return self.delete_bloco_dispositivo(context) - - def delete_bloco_dispositivo(self, context): - base = Dispositivo.objects.get(pk=context['dispositivo_id']) - - base_anterior = Dispositivo.objects.order_by('-ordem').filter( - norma_id=base.norma_id, - ordem__lt=base.ordem - )[:1] - base.delete() - - if base_anterior.exists(): - if base_anterior[0].dispositivo_pai_id: - data = {'pk': base_anterior[0].pk, 'pai': [ - base_anterior[0].dispositivo_pai_id, ]} - else: - data = {'pk': base_anterior[0].pk, 'pai': [-1, ]} - return data - else: - return {} - - def add_prior(self, context): - return {} - - def add_in(self, context): - return self.add_next(context, local_add='add_in') - - def add_next(self, context, local_add='add_next'): - try: - base = Dispositivo.objects.get(pk=context['dispositivo_id']) - tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) - variacao = int(context['variacao']) - parents = [base, ] + base.get_parents() - - tipos_dp_auto_insert = tipo.filhos_permitidos.filter( - filho_de_insercao_automatica=True, - perfil_id=context['perfil_pk']) - - count_auto_insert = 0 - for tipoauto in tipos_dp_auto_insert: - qtdp = tipoauto.quantidade_permitida - if qtdp >= 0: - qtdp -= Dispositivo.objects.filter( - norma_id=base.norma_id, - tipo_dispositivo_id=tipoauto.filho_permitido.pk - ).count() - if qtdp > 0: - count_auto_insert += 1 - else: - count_auto_insert += 1 - - dp_irmao = None - dp_pai = None - for dp in parents: - if dp.tipo_dispositivo == tipo: - dp_irmao = dp - break - if tipo.permitido_inserir_in( - dp.tipo_dispositivo, - perfil_pk=context['perfil_pk']): - dp_pai = dp - break - dp_pai = dp - - if dp_irmao is not None: - dp = Dispositivo.new_instance_based_on(dp_irmao, tipo) - dp.transform_in_next(variacao) - else: - # Inserção sem precedente - dp = Dispositivo.new_instance_based_on(dp_pai, tipo) - dp.dispositivo_pai = dp_pai - dp.nivel += 1 - - if tipo.contagem_continua: - ultimo_irmao = Dispositivo.objects.order_by( - '-ordem').filter( - ordem__lte=base.ordem, - tipo_dispositivo_id=tipo.pk, - norma_id=base.norma_id)[:1] - - if not ultimo_irmao.exists(): - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - else: - ultimo_irmao = ultimo_irmao[0] - dp.set_numero_completo( - ultimo_irmao.get_numero_completo()) - dp.transform_in_next() - else: - if ';' in tipo.rotulo_prefixo_texto: - dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) - else: - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - - # verificar se existe restrição de quantidade de itens - if dp.dispositivo_pai: - pp = dp.tipo_dispositivo.possiveis_pais.filter( - pai_id=dp.dispositivo_pai.tipo_dispositivo_id, - perfil_id=context['perfil_pk']) - - if pp.exists() and pp[0].quantidade_permitida >= 0: - qtd_existente = Dispositivo.objects.filter( - norma_id=dp.norma_id, - tipo_dispositivo_id=dp.tipo_dispositivo_id).count() - - if qtd_existente >= pp[0].quantidade_permitida: - return {'pk': base.pk, - 'pai': [base.dispositivo_pai.pk, ], - 'alert': str(_('Limite de inserções de ' - 'dispositivos deste tipo ' - 'foi excedido.')) - } - - ordem = base.criar_espaco( - espaco_a_criar=1 + count_auto_insert, local=local_add) - - dp.rotulo = dp.rotulo_padrao() - dp.ordem = ordem - dp.incrementar_irmaos(variacao, [local_add, ]) - - dp.clean() - dp.save() - - dp_auto_insert = None - - # Inserção automática - if count_auto_insert: - dp_pk = dp.pk - dp.nivel += 1 - for tipoauto in tipos_dp_auto_insert: - dp.dispositivo_pai_id = dp_pk - dp.pk = None - dp.tipo_dispositivo = tipoauto.filho_permitido - if ';' in dp.tipo_dispositivo.rotulo_prefixo_texto: - dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) - else: - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - dp.rotulo = dp.rotulo_padrao() - dp.texto = '' - dp.ordem = dp.ordem + Dispositivo.INTERVALO_ORDEM - dp.clean() - dp.save() - dp_auto_insert = dp - dp = Dispositivo.objects.get(pk=dp_pk) - - ''' Reenquadrar todos os dispositivos que possuem pai - antes da inserção atual e que são inferiores a dp, - redirecionando para o novo pai''' - - nivel = sys.maxsize - flag_niveis = False - - if not dp.tipo_dispositivo.dispositivo_de_alteracao: - possiveis_filhos = Dispositivo.objects.filter( - ordem__gt=dp.ordem, - norma_id=dp.norma_id) - - for filho in possiveis_filhos: - - if filho.nivel > nivel: - continue - - if filho.dispositivo_pai.ordem >= dp.ordem: - continue - - nivel = filho.nivel - - if not filho.tipo_dispositivo.permitido_inserir_in( - dp.tipo_dispositivo, - perfil_pk=context['perfil_pk']): - continue - - filho.dispositivo_pai = dp - filho.clean() - filho.save() - flag_niveis = True - - if flag_niveis: - dp.organizar_niveis() - - numtipos = {} - - ''' Renumerar filhos imediatos que - não possuam contagem continua''' - - if flag_niveis: - filhos = Dispositivo.objects.filter( - dispositivo_pai_id=dp.pk) - - for filho in filhos: - - if filho.tipo_dispositivo.contagem_continua: - continue - - if filho.tipo_dispositivo.class_css in numtipos: - if filho.dispositivo_substituido is None: - numtipos[filho.tipo_dispositivo.class_css] += 1 - else: - t = filho.tipo_dispositivo - prefixo = t.rotulo_prefixo_texto.split(';') - if len(prefixo) > 1: - count_irmaos_m_tipo = Dispositivo.objects.filter( - ~Q(pk=filho.pk), - tipo_dispositivo=t, - dispositivo_pai=filho.dispositivo_pai)[:1] - - if count_irmaos_m_tipo.exists(): - numtipos[filho.tipo_dispositivo.class_css] = 1 - else: - numtipos[filho.tipo_dispositivo.class_css] = 0 - else: - numtipos[filho.tipo_dispositivo.class_css] = 1 - - filho.dispositivo0 = numtipos[ - filho.tipo_dispositivo.class_css] - - filho.rotulo = filho.rotulo_padrao() - filho.clean() - filho.save() - - ''' Renumerar dispositivos de - contagem continua, caso a inserção seja uma articulação''' - - numtipos = {} - if dp.nivel == 0: - - proxima_articulacao = Dispositivo.objects.filter( - ordem__gt=dp.ordem, - nivel=0, - norma_id=dp.norma_id)[:1] - - if not proxima_articulacao.exists(): - filhos_continuos = list(Dispositivo.objects.filter( - ordem__gt=dp.ordem, - norma_id=dp.norma_id, - tipo_dispositivo__contagem_continua=True)) - else: - filhos_continuos = list(Dispositivo.objects.filter( - Q(ordem__gt=dp.ordem) & - Q(ordem__lt=proxima_articulacao[0].ordem), - norma_id=dp.norma_id, - tipo_dispositivo__contagem_continua=True)) - - for filho in filhos_continuos: - - if filho.tipo_dispositivo.class_css in numtipos: - if filho.dispositivo_substituido is None: - numtipos[filho.tipo_dispositivo.class_css] += 1 - else: - t = filho.tipo_dispositivo - prefixo = t.rotulo_prefixo_texto.split(';') - if len(prefixo) > 1: - count_irmaos_m_tipo = Dispositivo.objects.filter( - ~Q(pk=filho.pk), - tipo_dispositivo=t, - dispositivo_pai=filho.dispositivo_pai)[:1] - - if count_irmaos_m_tipo.exists(): - numtipos[filho.tipo_dispositivo.class_css] = 1 - else: - numtipos[filho.tipo_dispositivo.class_css] = 0 - else: - numtipos[filho.tipo_dispositivo.class_css] = 1 - - filho.dispositivo0 = numtipos[ - filho.tipo_dispositivo.class_css] - - filho.rotulo = filho.rotulo_padrao() - filho.clean() - filho.save() - - except Exception as e: - print(e) - - if dp_auto_insert is None: - data = self.get_json_for_refresh(dp) - else: - data = self.get_json_for_refresh(dp=dp, dpauto=dp_auto_insert) - - return data - - def get_json_for_refresh(self, dp, dpauto=None): - - if dp.tipo_dispositivo.contagem_continua: - pais = [] - if dp.dispositivo_pai is None: - data = {'pk': dp.pk, 'pai': [-1, ]} - else: - pkfilho = dp.pk - dp = dp.dispositivo_pai - - proxima_articulacao = dp.get_proximo_nivel_zero() - - if proxima_articulacao is not None: - parents = Dispositivo.objects.filter( - norma_id=dp.norma_id, - ordem__gte=dp.ordem, - ordem__lt=proxima_articulacao.ordem, - nivel__lte=dp.nivel) - else: - parents = Dispositivo.objects.filter( - norma_id=dp.norma_id, - ordem__gte=dp.ordem, - nivel__lte=dp.nivel) - - nivel = sys.maxsize - for p in parents: - if p.nivel > nivel: - continue - pais.append(p.pk) - nivel = p.nivel - data = { - 'pk': pkfilho if not dpauto else dpauto.pk, 'pai': pais} - else: - data = {'pk': dp.pk if not dpauto else dpauto.pk, 'pai': [ - dp.dispositivo_pai.pk, ]} - - return data - - -class ActionsEditView(ActionsEditMixin, TemplateView): - - def render_to_response(self, context, **response_kwargs): - context['action'] = self.request.GET['action'] - - if 'tipo_pk' in self.request.GET: - context['tipo_pk'] = self.request.GET['tipo_pk'] - - if 'variacao' in self.request.GET: - context['variacao'] = self.request.GET['variacao'] - - if 'perfil_estrutural' in self.request.session: - context['perfil_pk'] = self.request.session['perfil_estrutural'] - - return self.render_to_json_response(context, **response_kwargs) - - -class DispositivoSuccessUrlMixin(object): + @property + def title(self): + return self.get_object() def get_success_url(self): - return reverse( - 'dispositivo', kwargs={ - 'norma_id': self.kwargs[ - 'norma_id'], - 'dispositivo_id': self.kwargs[ - 'dispositivo_id']}) - - -class NotaMixin(DispositivoSuccessUrlMixin): - - def get_modelo_nota(self, request): - # TODO: permitir edição apenas das notas do usuário conectado - # TODO: tratar revalidação no método post - # TODO: não mostrar botão de edição na interface - if 'action' in request.GET and request.GET['action'] == 'modelo_nota': - tn = TipoNota.objects.get(pk=request.GET['id_tipo']) - return True, tn.modelo - return False, '' - - def get_initial(self): - dispositivo = get_object_or_404( - Dispositivo, pk=self.kwargs.get('dispositivo_id')) - initial = {'dispositivo': dispositivo} - - if 'pk' in self.kwargs: - initial['pk'] = self.kwargs.get('pk') - - return initial - - @method_decorator(login_required) - def dispatch(self, *args, **kwargs): - return super(NotaMixin, self).dispatch(*args, **kwargs) - - -class NotasCreateView(NotaMixin, FormMixin, CreateView): - template_name = 'compilacao/ajax_form.html' - form_class = forms.NotaForm - - def get(self, request, *args, **kwargs): - flag_action, modelo_nota = self.get_modelo_nota(request) - if flag_action: - return HttpResponse(modelo_nota) - - return super(NotasCreateView, self).get(request, *args, **kwargs) - - def post(self, request, *args, **kwargs): - try: - norma_id = kwargs.pop('norma_id') - dispositivo_id = kwargs.pop('dispositivo_id') - form = forms.NotaForm(request.POST, request.FILES, **kwargs) - kwargs['norma_id'] = norma_id - kwargs['dispositivo_id'] = dispositivo_id - - if form.is_valid(): - nt = form.save(commit=False) - nt.owner_id = request.user.pk - nt.save() - self.kwargs['pk'] = nt.pk - return self.form_valid(form) - else: - return self.form_invalid(form) - except Exception as e: - print(e) - return HttpResponse("post") - - -class NotasEditView(NotaMixin, UpdateView): - model = Nota - template_name = 'compilacao/ajax_form.html' - form_class = forms.NotaForm - - def get(self, request, *args, **kwargs): - flag_action, modelo_nota = self.get_modelo_nota(request) - if flag_action: - return HttpResponse(modelo_nota) - - return super(NotasEditView, self).get(request, *args, **kwargs) - - -class NotasDeleteView(NotaMixin, TemplateView): - - def get(self, request, *args, **kwargs): - nt = Nota.objects.get(pk=self.kwargs['pk']) - nt.delete() - return HttpResponseRedirect(self.get_success_url()) - - -class VideMixin(DispositivoSuccessUrlMixin): - - def get_initial(self): - dispositivo_base = get_object_or_404( - Dispositivo, pk=self.kwargs.get('dispositivo_id')) - - initial = {'dispositivo_base': dispositivo_base} - - if 'pk' in self.kwargs: - initial['pk'] = self.kwargs.get('pk') - - return initial - - @method_decorator(login_required) - def dispatch(self, *args, **kwargs): - return super(VideMixin, self).dispatch(*args, **kwargs) - - -class VideCreateView(VideMixin, FormMixin, CreateView): - template_name = 'compilacao/ajax_form.html' - form_class = forms.VideForm - - def post(self, request, *args, **kwargs): - try: - norma_id = kwargs.pop('norma_id') - dispositivo_id = kwargs.pop('dispositivo_id') - form = forms.VideForm(request.POST, request.FILES, **kwargs) - kwargs['norma_id'] = norma_id - kwargs['dispositivo_id'] = dispositivo_id - - if form.is_valid(): - vd = form.save(commit=False) - vd.save() - self.kwargs['pk'] = vd.pk - return self.form_valid(form) - else: - return self.form_invalid(form) - except Exception as e: - print(e) - return HttpResponse("post") - - -class VideEditView(VideMixin, UpdateView): - model = Vide - template_name = 'compilacao/ajax_form.html' - form_class = forms.VideForm - - -class VideDeleteView(VideMixin, TemplateView): - - def get(self, request, *args, **kwargs): - vd = Vide.objects.get(pk=self.kwargs['pk']) - vd.delete() - return HttpResponseRedirect(self.get_success_url()) - - -class DispositivoSearchFragmentFormView(ListView): - template_name = 'compilacao/dispositivo_search_fragment_form.html' - - @method_decorator(login_required) - def dispatch(self, *args, **kwargs): - return super( - DispositivoSearchFragmentFormView, - self).dispatch(*args, **kwargs) - - def get_queryset(self): - try: - busca = '' - - if 'busca' in self.request.GET: - busca = self.request.GET['busca'] - - q = Q(nivel__gt=0) - busca = busca.split(' ') - n = 10 - - for item in busca: - - if not item: - continue - - if q: - q = q & (Q(dispositivo_pai__rotulo__icontains=item) | - Q(rotulo__icontains=item) | - Q(texto__icontains=item) | - Q(texto_atualizador__icontains=item)) - n = 50 - else: - q = (Q(dispositivo_pai__rotulo__icontains=item) | - Q(rotulo__icontains=item) | - Q(texto__icontains=item) | - Q(texto_atualizador__icontains=item)) - n = 50 - - if 'tipo_norma' in self.request.GET: - tipo_norma = self.request.GET['tipo_norma'] - if tipo_norma: - q = q & Q(norma__tipo_id=tipo_norma) - n = 50 - - if 'num_norma' in self.request.GET: - num_norma = self.request.GET['num_norma'] - if num_norma: - q = q & Q(norma__numero=num_norma) - n = 50 - - if 'ano_norma' in self.request.GET: - ano_norma = self.request.GET['ano_norma'] - if ano_norma: - q = q & Q(norma__ano=ano_norma) - n = 50 - - if 'initial_ref' in self.request.GET: - initial_ref = self.request.GET['initial_ref'] - if initial_ref: - q = q & Q(pk=initial_ref) - n = 50 - - return Dispositivo.objects.filter(q)[:n] - - except Exception as e: - print(e) + return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']}) diff --git a/compilacao/views2.py b/compilacao/views2.py new file mode 100644 index 000000000..c2068fda7 --- /dev/null +++ b/compilacao/views2.py @@ -0,0 +1,1351 @@ +from collections import OrderedDict +from datetime import datetime, timedelta +from os.path import sys + +from django.contrib.auth.decorators import login_required +from django.core.signing import Signer +from django.core.urlresolvers import reverse +from django.db.models import Q +from django.http.response import (HttpResponse, HttpResponseRedirect, + JsonResponse) +from django.shortcuts import get_object_or_404, render +from django.utils.dateparse import parse_date +from django.utils.decorators import method_decorator +from django.utils.translation import ugettext_lazy as _ +from django.views.generic.base import TemplateView +from django.views.generic.edit import FormMixin, UpdateView, CreateView +from django.views.generic.list import ListView + +from compilacao import forms +from compilacao.models import (Dispositivo, Nota, + PerfilEstruturalTextoArticulado, + TipoDispositivo, TipoNota, TipoPublicacao, + TipoVide, VeiculoPublicacao, Vide, + TextoArticulado) +from sapl.crud import build_crud + +DISPOSITIVO_SELECT_RELATED = ( + 'tipo_dispositivo', + 'ta_publicado', + 'ta', + 'dispositivo_atualizador', + 'dispositivo_atualizador__dispositivo_pai', + 'dispositivo_atualizador__dispositivo_pai__ta', + 'dispositivo_atualizador__dispositivo_pai__ta__tipo', + 'dispositivo_pai', + 'dispositivo_pai__tipo_dispositivo') + +tipo_nota_crud = build_crud( + TipoNota, 'tipo_nota', [ + + [_('Tipo da Nota'), + [('sigla', 2), ('nome', 10)], + [('modelo', 12)]], + ]) + +tipo_vide_crud = build_crud( + TipoVide, 'tipo_vide', [ + + [_('Tipo de Vide'), + [('sigla', 2), ('nome', 10)]], + ]) + +tipo_publicacao_crud = build_crud( + TipoPublicacao, 'tipo_publicacao', [ + + [_('Tipo de Publicação'), + [('sigla', 2), ('nome', 10)]], + ]) + +perfil_estr_txt_norm = build_crud( + PerfilEstruturalTextoArticulado, 'perfil_estrutural', [ + + [_('Perfil Estrutural de Textos Articulados'), + [('sigla', 2), ('nome', 10)]], + ]) + + +veiculo_publicacao_crud = build_crud( + VeiculoPublicacao, 'veiculo_publicacao', [ + + [_('Veículo de Publicação'), + [('sigla', 2), ('nome', 10)]], + ]) + +tipo_dispositivo_crud = build_crud( + TipoDispositivo, 'tipo_dispositivo', [ + + [_('Dados Básicos'), + [('nome', 8), ('class_css', 4)]], + + [_('Configurações para Edição do Rótulo'), + [('rotulo_prefixo_texto', 3), + ('rotulo_sufixo_texto', 3), + ('rotulo_ordinal', 3), + ('contagem_continua', 3)], + + ], + + [_('Configurações para Renderização de Rótulo e Texto'), + [('rotulo_prefixo_html', 6), + ('rotulo_sufixo_html', 6), ], + + [('texto_prefixo_html', 4), + ('dispositivo_de_articulacao', 4), + ('texto_sufixo_html', 4)], + ], + + [_('Configurações para Nota Automática'), + [('nota_automatica_prefixo_html', 6), + ('nota_automatica_sufixo_html', 6), + ], + ], + + [_('Configurações para Variações Numéricas'), + + [('formato_variacao0', 12)], + [('rotulo_separador_variacao01', 5), ('formato_variacao1', 7), ], + [('rotulo_separador_variacao12', 5), ('formato_variacao2', 7), ], + [('rotulo_separador_variacao23', 5), ('formato_variacao3', 7), ], + [('rotulo_separador_variacao34', 5), ('formato_variacao4', 7), ], + [('rotulo_separador_variacao45', 5), ('formato_variacao5', 7), ], + + ], + + ]) + + +class CompilacaoView(ListView): + template_name = 'compilacao/index.html' + + flag_alteradora = -1 + + flag_nivel_ini = 0 + flag_nivel_old = -1 + + itens_de_vigencia = {} + + inicio_vigencia = None + fim_vigencia = None + + def get_context_data(self, **kwargs): + context = super(CompilacaoView, self).get_context_data(**kwargs) + + cita = Vide.objects.filter( + Q(dispositivo_base__ta_id=self.kwargs['ta_id'])).\ + select_related( + 'dispositivo_ref', + 'dispositivo_ref__ta', + 'dispositivo_ref__dispositivo_pai', + 'dispositivo_ref__dispositivo_pai__ta', '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__ta_id=self.kwargs['ta_id'])).\ + select_related( + 'dispositivo_base', + 'dispositivo_base__ta', + 'dispositivo_base__dispositivo_pai', + 'dispositivo_base__dispositivo_pai__ta', '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__ta_id=self.kwargs['ta_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): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + self.inicio_vigencia = None + self.fim_vigencia = None + if 'sign' in self.kwargs: + signer = Signer() + try: + string = signer.unsign(self.kwargs['sign']).split(',') + self.inicio_vigencia = parse_date(string[0]) + self.fim_vigencia = parse_date(string[1]) + except: + return{} + + return Dispositivo.objects.filter( + inicio_vigencia__lte=self.fim_vigencia, + ordem__gt=0, + ta_id=self.kwargs['ta_id'], + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + + r = Dispositivo.objects.filter( + ordem__gt=0, + ta_id=self.kwargs['ta_id'], + ).select_related( + 'tipo_dispositivo', + 'ta_publicado', + 'ta', + 'dispositivo_atualizador', + 'dispositivo_atualizador__dispositivo_pai', + 'dispositivo_atualizador__dispositivo_pai__ta', + 'dispositivo_atualizador__dispositivo_pai__ta__tipo', + 'dispositivo_pai', + 'dispositivo_pai__tipo_dispositivo') + + return r + + def get_vigencias(self): + itens = Dispositivo.objects.filter( + ta_id=self.kwargs['ta_id'], + ).order_by( + 'inicio_vigencia' + ).distinct( + 'inicio_vigencia' + ).select_related( + 'ta_publicado', + 'ta', + 'ta_publicado__tipo', + 'ta__tipo',) + + ajuste_datas_vigencia = [] + + for item in itens: + ajuste_datas_vigencia.append(item) + + lenLista = len(ajuste_datas_vigencia) + for i in range(lenLista): + if i + 1 < lenLista: + ajuste_datas_vigencia[ + i].fim_vigencia = ajuste_datas_vigencia[ + i + 1].inicio_vigencia - timedelta(days=1) + else: + ajuste_datas_vigencia[i].fim_vigencia = None + + self.itens_de_vigencia = {} + + idx = -1 + length = len(ajuste_datas_vigencia) + for item in ajuste_datas_vigencia: + idx += 1 + if idx == 0: + self.itens_de_vigencia[0] = [item, ] + continue + + if idx + 1 < length: + ano = item.ta_publicado.ano + if ano in self.itens_de_vigencia: + self.itens_de_vigencia[ano].append(item) + else: + self.itens_de_vigencia[ano] = [item, ] + else: + self.itens_de_vigencia[9999] = [item, ] + + if len(self.itens_de_vigencia.keys()) <= 1: + return {} + + self.itens_de_vigencia = OrderedDict( + sorted(self.itens_de_vigencia.items(), key=lambda t: t[0])) + + return self.itens_de_vigencia + + def get_ta(self): + return TextoArticulado.objects.select_related('tipo').get( + pk=self.kwargs['ta_id']) + + def is_ta_alterador(self): + if self.flag_alteradora == -1: + self.flag_alteradora = Dispositivo.objects.select_related( + 'dispositivos_alterados_pelo_texto_articulado_set' + ).filter(ta_id=self.kwargs['ta_id']).count() + return self.flag_alteradora > 0 + + +class DispositivoView(CompilacaoView): + # template_name = 'compilacao/index.html' + template_name = 'compilacao/index_bloco.html' + + def get_queryset(self): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + 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, + ta_id=self.kwargs['ta_id'])[:1] + + if proximo_bloco.count() == 0: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ordem__lt=proximo_bloco[0].ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + return itens + + +def handle_uploaded_file(f, outfilepath): + with open(outfilepath, 'wb+') as destination: + for chunk in f.chunks(): + destination.write(chunk) + + +class CompilacaoEditView(CompilacaoView, FormMixin): + + template_name = 'compilacao/edit.html' + + flag_alteradora = -1 + + flag_nivel_ini = 0 + flag_nivel_old = -1 + + pk_edit = 0 + pk_view = 0 + + def post(self, request, *args, **kwargs): + form = forms.UpLoadImportFileForm(request.POST, request.FILES) + message = "Arquivo Submetido com sucesso" + + self.object_list = self.get_queryset() + + if form.is_valid(): + try: + f = request.FILES['import_file'] + outfilepath = '/tmp/' + f.name + handle_uploaded_file(f, outfilepath) + + # p = Parser() + # p.parser(outfilepath) + + except Exception as e: + print(e) + + context = self.get_context_data( + object_list=self.object_list, + form=form, + message=message, + view=self, + parser_list=[]) + return render(request, self.template_name, context) + else: + context = self.get_context_data( + object_list=self.object_list, + form=form, + message=form.errors, + view=self) + return self.form_invalid(context) + + return self.render_to_response({'form': form}) + + def form_invalid(self, context): + return self.render_to_response(context) + + def get(self, request, *args, **kwargs): + + self.object_list = self.get_queryset() + form_class = forms.UpLoadImportFileForm + self.form = self.get_form(form_class) + context = self.get_context_data( + object_list=self.object_list, + form=self.form) + + return self.render_to_response(context) + + def get_queryset(self): + self.pk_edit = 0 + self.pk_view = 0 + + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + result = Dispositivo.objects.filter( + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + if not result.exists(): + + ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) + + td = TipoDispositivo.objects.filter(class_css='articulacao')[0] + a = Dispositivo() + a.nivel = 0 + a.ordem = Dispositivo.INTERVALO_ORDEM + a.ordem_bloco_atualizador = 0 + a.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + a.ta = ta + a.tipo_dispositivo = td + a.inicio_vigencia = ta.data_publicacao + a.inicio_eficacia = ta.data_publicacao + a.timestamp = datetime.now() + a.save() + + td = TipoDispositivo.objects.filter(class_css='ementa')[0] + e = Dispositivo() + e.nivel = 1 + e.ordem = a.ordem + Dispositivo.INTERVALO_ORDEM + e.ordem_bloco_atualizador = 0 + e.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + e.ta = ta + e.tipo_dispositivo = td + e.inicio_vigencia = ta.data_publicacao + e.inicio_eficacia = ta.data_publicacao + e.timestamp = datetime.now() + e.texto = ta.ementa + e.dispositivo_pai = a + e.save() + + a.pk = None + a.nivel = 0 + a.ordem = e.ordem + Dispositivo.INTERVALO_ORDEM + a.ordem_bloco_atualizador = 0 + a.set_numero_completo([2, 0, 0, 0, 0, 0, ]) + a.timestamp = datetime.now() + a.save() + + result = Dispositivo.objects.filter( + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + return result + + def set_perfil_in_session(self, request=None, perfil_id=0): + if not request: + return None + + if perfil_id: + perfil = PerfilEstruturalTextoArticulado.objects.get( + pk=perfil_id) + request.session['perfil_estrutural'] = perfil.pk + else: + perfis = PerfilEstruturalTextoArticulado.objects.filter( + padrao=True)[:1] + + if not perfis.exists(): + request.session.pop('perfil_estrutural') + else: + request.session['perfil_estrutural'] = perfis[0].pk + + +class DispositivoEditView(CompilacaoEditView): + template_name = 'compilacao/edit_bloco.html' + + def post(self, request, *args, **kwargs): + + d = Dispositivo.objects.get( + pk=self.kwargs['dispositivo_id']) + + texto = request.POST['texto'] + + if d.texto != '': + d.texto = texto + d.save() + return self.get(request, *args, **kwargs) + d.texto = texto.strip() + d.save() + + if texto != '': + dnext = Dispositivo.objects.filter( + ta_id=d.ta_id, + ordem__gt=d.ordem, + texto='', + tipo_dispositivo__dispositivo_de_articulacao=False)[:1] + + if not dnext.exists(): + return self.get(request, *args, **kwargs) + + if dnext[0].nivel > d.nivel: + pais = [d.pk, ] + else: + if dnext[0].dispositivo_pai_id == d.dispositivo_pai_id: + pais = [dnext[0].dispositivo_pai_id, ] + else: + pais = [ + dnext[0].dispositivo_pai_id, d.dispositivo_pai_id, ] + data = {'pk': dnext[0].pk, 'pai': pais} + else: + data = {'pk': d.pk, 'pai': [d.pk, ]} + + return JsonResponse(data, safe=False) + + def get_queryset_perfil_estrutural(self): + perfis = PerfilEstruturalTextoArticulado.objects.all() + return perfis + + def get(self, request, *args, **kwargs): + + try: + if 'perfil_pk' in request.GET: + self.set_perfil_in_session( + request, request.GET['perfil_pk']) + elif 'perfil_estrutural' not in request.session: + self.set_perfil_in_session(request=request) + + self.object_list = self.get_queryset() + + self.perfil_estrutural_list = self.get_queryset_perfil_estrutural() + + context = self.get_context_data( + object_list=self.object_list, + perfil_estrutural_list=self.perfil_estrutural_list + ) + except Exception as e: + print(e) + + return self.render_to_response(context) + + def get_queryset(self): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + try: + self.pk_edit = int(self.request.GET['edit']) + except: + self.pk_edit = 0 + self.pk_view = int(self.kwargs['dispositivo_id']) + + try: + if self.pk_edit == self.pk_view: + bloco = Dispositivo.objects.get( + pk=self.kwargs['dispositivo_id']) + else: + 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 + + if self.pk_edit == self.pk_view: + return [bloco, ] + + proximo_bloco = Dispositivo.objects.filter( + ordem__gt=bloco.ordem, + nivel__lte=bloco.nivel, + ta_id=self.kwargs['ta_id'])[:1] + + if proximo_bloco.count() == 0: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ordem__lt=proximo_bloco[0].ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + return itens + + def select_provaveis_inserts(self, request=None): + + try: + + if request and 'perfil_estrutural' not in request.session: + self.set_perfil_in_session(request) + + perfil_pk = request.session['perfil_estrutural'] + + # Não salvar d_base + if self.pk_edit == 0: + base = Dispositivo.objects.get(pk=self.pk_view) + else: + base = Dispositivo.objects.get(pk=self.pk_edit) + + prox_possivel = Dispositivo.objects.filter( + ordem__gt=base.ordem, + nivel__lte=base.nivel, + ta_id=base.ta_id)[:1] + + if prox_possivel.exists(): + prox_possivel = prox_possivel[0] + else: + prox_possivel = None + + result = [{'tipo_insert': 'Inserir Depois', + 'icone': '↷ ', + 'action': 'add_next', + 'itens': []}, + {'tipo_insert': 'Inserir Dentro', + 'icone': '⇲ ', + 'action': 'add_in', + 'itens': []}, + {'tipo_insert': 'Inserir Antes', + 'icone': '↶ ', + 'action': 'add_prior', + 'itens': []} + ] + + # Possíveis inserções sequenciais já existentes + parents = base.get_parents() + parents.insert(0, base) + nivel = sys.maxsize + for dp in parents: + + if dp.nivel >= nivel: + continue + + if dp.is_relative_auto_insert(perfil_pk): + continue + + if prox_possivel and \ + dp.tipo_dispositivo != base.tipo_dispositivo and\ + dp.nivel < prox_possivel.nivel and\ + not prox_possivel.tipo_dispositivo.permitido_inserir_in( + dp.tipo_dispositivo, + perfil_pk=perfil_pk): + + if dp.tipo_dispositivo != prox_possivel.tipo_dispositivo: + continue + + nivel = dp.nivel + + # um do mesmo para inserção antes + if dp == base: + result[2]['itens'].append({ + 'class_css': dp.tipo_dispositivo.class_css, + 'tipo_pk': dp.tipo_dispositivo.pk, + 'variacao': 0, + 'provavel': '%s (%s)' % ( + dp.rotulo_padrao(local_insert=1), + dp.tipo_dispositivo.nome,), + 'dispositivo_base': base.pk}) + + if dp.dispositivo_pai: + flag_pv = dp.tipo_dispositivo.permitido_variacao( + dp.dispositivo_pai.tipo_dispositivo, + perfil_pk=perfil_pk) + else: + flag_pv = False + + r = [] + flag_direcao = 1 + flag_variacao = 0 + while True: + if dp.dispositivo0 == 0: + local_insert = 1 + else: + local_insert = 0 + + rt = dp.transform_in_next(flag_direcao) + if not rt[0]: + break + flag_variacao += rt[1] + r.append({'class_css': dp.tipo_dispositivo.class_css, + 'tipo_pk': dp.tipo_dispositivo.pk, + 'variacao': flag_variacao, + 'provavel': '%s (%s)' % ( + dp.rotulo_padrao(local_insert), + dp.tipo_dispositivo.nome,), + 'dispositivo_base': base.pk}) + + flag_direcao = -1 + + r.reverse() + + if not flag_pv: + r = [r[0], ] + + if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \ + TipoDispositivo.FNCN: + r = [r[0], ] + + if dp.tipo_dispositivo == base.tipo_dispositivo: + result[0]['itens'] += r + else: + result[0]['itens'] += r + result[2]['itens'] += r + + if nivel == 0: + break + + # tipo do dispositivo base + tipb = base.tipo_dispositivo + + for paradentro in [1, 0]: + if paradentro: + # Outros Tipos de Dispositivos PARA DENTRO + otds = TipoDispositivo.objects.order_by( + '-contagem_continua', 'id').all() + else: + # Outros Tipos de Dispositivos PARA FORA + classes_ja_inseridas = [] + for c in result[0]['itens']: + if c['class_css'] not in classes_ja_inseridas: + classes_ja_inseridas.append(c['class_css']) + for c in result[1]['itens']: + if c['class_css'] not in classes_ja_inseridas: + classes_ja_inseridas.append(c['class_css']) + otds = TipoDispositivo.objects.order_by( + '-contagem_continua', 'id').all().exclude( + class_css__in=classes_ja_inseridas) + + for td in otds: + + if paradentro and not td.permitido_inserir_in( + tipb, + include_relative_autos=False, + perfil_pk=perfil_pk): + continue + + base.tipo_dispositivo = td + + if not paradentro: + + flag_insercao = False + for possivelpai in parents: + if td.permitido_inserir_in( + possivelpai.tipo_dispositivo, + include_relative_autos=False, + perfil_pk=perfil_pk): + flag_insercao = True + break + + if not flag_insercao: + continue + + if possivelpai.is_relative_auto_insert(perfil_pk): + continue + + if prox_possivel: + if prox_possivel.nivel == base.nivel: + if prox_possivel.tipo_dispositivo != td and\ + not prox_possivel.tipo_dispositivo.\ + permitido_inserir_in( + td, perfil_pk=perfil_pk): + continue + else: + if possivelpai.tipo_dispositivo != \ + prox_possivel.tipo_dispositivo and\ + not prox_possivel.tipo_dispositivo.\ + permitido_inserir_in( + possivelpai.tipo_dispositivo, + perfil_pk=perfil_pk) and \ + possivelpai.nivel < \ + prox_possivel.nivel: + continue + base.dispositivo_pai = possivelpai + Dispositivo.set_numero_for_add_in( + possivelpai, base, td) + else: + Dispositivo.set_numero_for_add_in(base, base, td) + + r = [{'class_css': td.class_css, + 'tipo_pk': td.pk, + 'variacao': 0, + 'provavel': '%s (%s)' % ( + base.rotulo_padrao(1, paradentro), + td.nome,), + 'dispositivo_base': base.pk}] + + if paradentro == 1: + """if (tipb.class_css == 'caput' and + td.class_css == 'paragrafo'): + result[0]['itens'].insert(0, r[0]) + else:""" + result[1]['itens'] += r + else: + result[2]['itens'] += r + result[0]['itens'] += r + + # if len(result[0]['itens']) < len(result[1]['itens']): + # r = result[0] + # result.remove(result[0]) + # result.insert(1, r) + + # remover temporariamente a opção inserir antes + # confirmar falta de necessidade + if len(result) > 2: + result.pop() + + except Exception as e: + print(e) + + return result + + +class ActionsEditMixin(object): + + def render_to_json_response(self, context, **response_kwargs): + + action = getattr(self, context['action']) + return JsonResponse(action(context), safe=False) + + def delete_item_dispositivo(self, context): + return self.delete_bloco_dispositivo(context) + + def delete_bloco_dispositivo(self, context): + base = Dispositivo.objects.get(pk=context['dispositivo_id']) + + base_anterior = Dispositivo.objects.order_by('-ordem').filter( + ta_id=base.ta_id, + ordem__lt=base.ordem + )[:1] + base.delete() + + if base_anterior.exists(): + if base_anterior[0].dispositivo_pai_id: + data = {'pk': base_anterior[0].pk, 'pai': [ + base_anterior[0].dispositivo_pai_id, ]} + else: + data = {'pk': base_anterior[0].pk, 'pai': [-1, ]} + return data + else: + return {} + + def add_prior(self, context): + return {} + + def add_in(self, context): + return self.add_next(context, local_add='add_in') + + def add_next(self, context, local_add='add_next'): + try: + base = Dispositivo.objects.get(pk=context['dispositivo_id']) + tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) + variacao = int(context['variacao']) + parents = [base, ] + base.get_parents() + + tipos_dp_auto_insert = tipo.filhos_permitidos.filter( + filho_de_insercao_automatica=True, + perfil_id=context['perfil_pk']) + + count_auto_insert = 0 + for tipoauto in tipos_dp_auto_insert: + qtdp = tipoauto.quantidade_permitida + if qtdp >= 0: + qtdp -= Dispositivo.objects.filter( + ta_id=base.ta_id, + tipo_dispositivo_id=tipoauto.filho_permitido.pk + ).count() + if qtdp > 0: + count_auto_insert += 1 + else: + count_auto_insert += 1 + + dp_irmao = None + dp_pai = None + for dp in parents: + if dp.tipo_dispositivo == tipo: + dp_irmao = dp + break + if tipo.permitido_inserir_in( + dp.tipo_dispositivo, + perfil_pk=context['perfil_pk']): + dp_pai = dp + break + dp_pai = dp + + if dp_irmao is not None: + dp = Dispositivo.new_instance_based_on(dp_irmao, tipo) + dp.transform_in_next(variacao) + else: + # Inserção sem precedente + dp = Dispositivo.new_instance_based_on(dp_pai, tipo) + dp.dispositivo_pai = dp_pai + dp.nivel += 1 + + if tipo.contagem_continua: + ultimo_irmao = Dispositivo.objects.order_by( + '-ordem').filter( + ordem__lte=base.ordem, + tipo_dispositivo_id=tipo.pk, + ta_id=base.ta_id)[:1] + + if not ultimo_irmao.exists(): + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + else: + ultimo_irmao = ultimo_irmao[0] + dp.set_numero_completo( + ultimo_irmao.get_numero_completo()) + dp.transform_in_next() + else: + if ';' in tipo.rotulo_prefixo_texto: + dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) + else: + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + + # verificar se existe restrição de quantidade de itens + if dp.dispositivo_pai: + pp = dp.tipo_dispositivo.possiveis_pais.filter( + pai_id=dp.dispositivo_pai.tipo_dispositivo_id, + perfil_id=context['perfil_pk']) + + if pp.exists() and pp[0].quantidade_permitida >= 0: + qtd_existente = Dispositivo.objects.filter( + ta_id=dp.ta_id, + tipo_dispositivo_id=dp.tipo_dispositivo_id).count() + + if qtd_existente >= pp[0].quantidade_permitida: + return {'pk': base.pk, + 'pai': [base.dispositivo_pai.pk, ], + 'alert': str(_('Limite de inserções de ' + 'dispositivos deste tipo ' + 'foi excedido.')) + } + + ordem = base.criar_espaco( + espaco_a_criar=1 + count_auto_insert, local=local_add) + + dp.rotulo = dp.rotulo_padrao() + dp.ordem = ordem + dp.incrementar_irmaos(variacao, [local_add, ]) + + dp.clean() + dp.save() + + dp_auto_insert = None + + # Inserção automática + if count_auto_insert: + dp_pk = dp.pk + dp.nivel += 1 + for tipoauto in tipos_dp_auto_insert: + dp.dispositivo_pai_id = dp_pk + dp.pk = None + dp.tipo_dispositivo = tipoauto.filho_permitido + if ';' in dp.tipo_dispositivo.rotulo_prefixo_texto: + dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) + else: + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + dp.rotulo = dp.rotulo_padrao() + dp.texto = '' + dp.ordem = dp.ordem + Dispositivo.INTERVALO_ORDEM + dp.clean() + dp.save() + dp_auto_insert = dp + dp = Dispositivo.objects.get(pk=dp_pk) + + ''' Reenquadrar todos os dispositivos que possuem pai + antes da inserção atual e que são inferiores a dp, + redirecionando para o novo pai''' + + nivel = sys.maxsize + flag_niveis = False + + if not dp.tipo_dispositivo.dispositivo_de_alteracao: + possiveis_filhos = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + ta_id=dp.ta_id) + + for filho in possiveis_filhos: + + if filho.nivel > nivel: + continue + + if filho.dispositivo_pai.ordem >= dp.ordem: + continue + + nivel = filho.nivel + + if not filho.tipo_dispositivo.permitido_inserir_in( + dp.tipo_dispositivo, + perfil_pk=context['perfil_pk']): + continue + + filho.dispositivo_pai = dp + filho.clean() + filho.save() + flag_niveis = True + + if flag_niveis: + dp.organizar_niveis() + + numtipos = {} + + ''' Renumerar filhos imediatos que + não possuam contagem continua''' + + if flag_niveis: + filhos = Dispositivo.objects.filter( + dispositivo_pai_id=dp.pk) + + for filho in filhos: + + if filho.tipo_dispositivo.contagem_continua: + continue + + if filho.tipo_dispositivo.class_css in numtipos: + if filho.dispositivo_substituido is None: + numtipos[filho.tipo_dispositivo.class_css] += 1 + else: + t = filho.tipo_dispositivo + prefixo = t.rotulo_prefixo_texto.split(';') + if len(prefixo) > 1: + count_irmaos_m_tipo = Dispositivo.objects.filter( + ~Q(pk=filho.pk), + tipo_dispositivo=t, + dispositivo_pai=filho.dispositivo_pai)[:1] + + if count_irmaos_m_tipo.exists(): + numtipos[filho.tipo_dispositivo.class_css] = 1 + else: + numtipos[filho.tipo_dispositivo.class_css] = 0 + else: + numtipos[filho.tipo_dispositivo.class_css] = 1 + + filho.dispositivo0 = numtipos[ + filho.tipo_dispositivo.class_css] + + filho.rotulo = filho.rotulo_padrao() + filho.clean() + filho.save() + + ''' Renumerar dispositivos de + contagem continua, caso a inserção seja uma articulação''' + + numtipos = {} + if dp.nivel == 0: + + proxima_articulacao = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + nivel=0, + ta_id=dp.ta_id)[:1] + + if not proxima_articulacao.exists(): + filhos_continuos = list(Dispositivo.objects.filter( + ordem__gt=dp.ordem, + ta_id=dp.ta_id, + tipo_dispositivo__contagem_continua=True)) + else: + filhos_continuos = list(Dispositivo.objects.filter( + Q(ordem__gt=dp.ordem) & + Q(ordem__lt=proxima_articulacao[0].ordem), + ta_id=dp.ta_id, + tipo_dispositivo__contagem_continua=True)) + + for filho in filhos_continuos: + + if filho.tipo_dispositivo.class_css in numtipos: + if filho.dispositivo_substituido is None: + numtipos[filho.tipo_dispositivo.class_css] += 1 + else: + t = filho.tipo_dispositivo + prefixo = t.rotulo_prefixo_texto.split(';') + if len(prefixo) > 1: + count_irmaos_m_tipo = Dispositivo.objects.filter( + ~Q(pk=filho.pk), + tipo_dispositivo=t, + dispositivo_pai=filho.dispositivo_pai)[:1] + + if count_irmaos_m_tipo.exists(): + numtipos[filho.tipo_dispositivo.class_css] = 1 + else: + numtipos[filho.tipo_dispositivo.class_css] = 0 + else: + numtipos[filho.tipo_dispositivo.class_css] = 1 + + filho.dispositivo0 = numtipos[ + filho.tipo_dispositivo.class_css] + + filho.rotulo = filho.rotulo_padrao() + filho.clean() + filho.save() + + except Exception as e: + print(e) + + if dp_auto_insert is None: + data = self.get_json_for_refresh(dp) + else: + data = self.get_json_for_refresh(dp=dp, dpauto=dp_auto_insert) + + return data + + def get_json_for_refresh(self, dp, dpauto=None): + + if dp.tipo_dispositivo.contagem_continua: + pais = [] + if dp.dispositivo_pai is None: + data = {'pk': dp.pk, 'pai': [-1, ]} + else: + pkfilho = dp.pk + dp = dp.dispositivo_pai + + proxima_articulacao = dp.get_proximo_nivel_zero() + + if proxima_articulacao is not None: + parents = Dispositivo.objects.filter( + ta_id=dp.ta_id, + ordem__gte=dp.ordem, + ordem__lt=proxima_articulacao.ordem, + nivel__lte=dp.nivel) + else: + parents = Dispositivo.objects.filter( + ta_id=dp.ta_id, + ordem__gte=dp.ordem, + nivel__lte=dp.nivel) + + nivel = sys.maxsize + for p in parents: + if p.nivel > nivel: + continue + pais.append(p.pk) + nivel = p.nivel + data = { + 'pk': pkfilho if not dpauto else dpauto.pk, 'pai': pais} + else: + data = {'pk': dp.pk if not dpauto else dpauto.pk, 'pai': [ + dp.dispositivo_pai.pk, ]} + + return data + + +class ActionsEditView(ActionsEditMixin, TemplateView): + + def render_to_response(self, context, **response_kwargs): + context['action'] = self.request.GET['action'] + + if 'tipo_pk' in self.request.GET: + context['tipo_pk'] = self.request.GET['tipo_pk'] + + if 'variacao' in self.request.GET: + context['variacao'] = self.request.GET['variacao'] + + if 'perfil_estrutural' in self.request.session: + context['perfil_pk'] = self.request.session['perfil_estrutural'] + + return self.render_to_json_response(context, **response_kwargs) + + +class DispositivoSuccessUrlMixin(object): + + def get_success_url(self): + return reverse( + 'dispositivo', kwargs={ + 'ta_id': self.kwargs[ + 'ta_id'], + 'dispositivo_id': self.kwargs[ + 'dispositivo_id']}) + + +class NotaMixin(DispositivoSuccessUrlMixin): + + def get_modelo_nota(self, request): + # TODO: permitir edição apenas das notas do usuário conectado + # TODO: tratar revalidação no método post + # TODO: não mostrar botão de edição na interface + if 'action' in request.GET and request.GET['action'] == 'modelo_nota': + tn = TipoNota.objects.get(pk=request.GET['id_tipo']) + return True, tn.modelo + return False, '' + + def get_initial(self): + dispositivo = get_object_or_404( + Dispositivo, pk=self.kwargs.get('dispositivo_id')) + initial = {'dispositivo': dispositivo} + + if 'pk' in self.kwargs: + initial['pk'] = self.kwargs.get('pk') + + return initial + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(NotaMixin, self).dispatch(*args, **kwargs) + + +class NotasCreateView(NotaMixin, CreateView): + template_name = 'compilacao/ajax_form.html' + form_class = forms.NotaForm + + def get(self, request, *args, **kwargs): + flag_action, modelo_nota = self.get_modelo_nota(request) + if flag_action: + return HttpResponse(modelo_nota) + + return super(NotasCreateView, self).get(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + try: + ta_id = kwargs.pop('ta_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.NotaForm(request.POST, request.FILES, **kwargs) + kwargs['ta_id'] = ta_id + kwargs['dispositivo_id'] = dispositivo_id + + if form.is_valid(): + nt = form.save(commit=False) + nt.owner_id = request.user.pk + nt.save() + self.kwargs['pk'] = nt.pk + return self.form_valid(form) + else: + return self.form_invalid(form) + except Exception as e: + print(e) + return HttpResponse("post") + + +class NotasEditView(NotaMixin, UpdateView): + model = Nota + template_name = 'compilacao/ajax_form.html' + form_class = forms.NotaForm + + def get(self, request, *args, **kwargs): + flag_action, modelo_nota = self.get_modelo_nota(request) + if flag_action: + return HttpResponse(modelo_nota) + + return super(NotasEditView, self).get(request, *args, **kwargs) + + +class NotasDeleteView(NotaMixin, TemplateView): + + def get(self, request, *args, **kwargs): + nt = Nota.objects.get(pk=self.kwargs['pk']) + nt.delete() + return HttpResponseRedirect(self.get_success_url()) + + +class VideMixin(DispositivoSuccessUrlMixin): + + def get_initial(self): + dispositivo_base = get_object_or_404( + Dispositivo, pk=self.kwargs.get('dispositivo_id')) + + initial = {'dispositivo_base': dispositivo_base} + + if 'pk' in self.kwargs: + initial['pk'] = self.kwargs.get('pk') + + return initial + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(VideMixin, self).dispatch(*args, **kwargs) + + +class VideCreateView(VideMixin, CreateView): + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm + + def post(self, request, *args, **kwargs): + try: + ta_id = kwargs.pop('ta_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.VideForm(request.POST, request.FILES, **kwargs) + kwargs['ta_id'] = ta_id + kwargs['dispositivo_id'] = dispositivo_id + + if form.is_valid(): + vd = form.save(commit=False) + vd.save() + self.kwargs['pk'] = vd.pk + return self.form_valid(form) + else: + return self.form_invalid(form) + except Exception as e: + print(e) + return HttpResponse("post") + + +class VideEditView(VideMixin, UpdateView): + model = Vide + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm + + +class VideDeleteView(VideMixin, TemplateView): + + def get(self, request, *args, **kwargs): + vd = Vide.objects.get(pk=self.kwargs['pk']) + vd.delete() + return HttpResponseRedirect(self.get_success_url()) + + +class DispositivoSearchFragmentFormView(ListView): + template_name = 'compilacao/dispositivo_search_fragment_form.html' + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super( + DispositivoSearchFragmentFormView, + self).dispatch(*args, **kwargs) + + def get_queryset(self): + try: + busca = '' + + if 'busca' in self.request.GET: + busca = self.request.GET['busca'] + + q = Q(nivel__gt=0) + busca = busca.split(' ') + n = 10 + + for item in busca: + + if not item: + continue + + if q: + q = q & (Q(dispositivo_pai__rotulo__icontains=item) | + Q(rotulo__icontains=item) | + Q(texto__icontains=item) | + Q(texto_atualizador__icontains=item)) + n = 50 + else: + q = (Q(dispositivo_pai__rotulo__icontains=item) | + Q(rotulo__icontains=item) | + Q(texto__icontains=item) | + Q(texto_atualizador__icontains=item)) + n = 50 + + if 'tipo_ta' in self.request.GET: + tipo_ta = self.request.GET['tipo_ta'] + if tipo_ta: + q = q & Q(ta__tipo_id=tipo_ta) + n = 50 + + if 'num_ta' in self.request.GET: + num_ta = self.request.GET['num_ta'] + if num_ta: + q = q & Q(ta__numero=num_ta) + n = 50 + + if 'ano_ta' in self.request.GET: + ano_ta = self.request.GET['ano_ta'] + if ano_ta: + q = q & Q(ta__ano=ano_ta) + n = 50 + + if 'initial_ref' in self.request.GET: + initial_ref = self.request.GET['initial_ref'] + if initial_ref: + q = q & Q(pk=initial_ref) + n = 50 + + return Dispositivo.objects.filter(q)[:n] + + except Exception as e: + print(e) diff --git a/materia/urls.py b/materia/urls.py index e728f31aa..17cff8167 100644 --- a/materia/urls.py +++ b/materia/urls.py @@ -17,7 +17,16 @@ from materia.views import (AutoriaEditView, AutoriaView, tipo_fim_relatoria_crud, tipo_materia_crud, tipo_proposicao_crud, unidade_tramitacao_crud) + +materia_legislativa_patterns = materia_legislativa_crud.urlpatterns +# + __url__compilacao + + urlpatterns = [ + url(r'^materia/', include(materia_legislativa_patterns, + materia_legislativa_crud.namespace, + materia_legislativa_crud.namespace)), + url(r'^sistema/proposicoes/tipo/', include(tipo_proposicao_crud.urls)), url(r'^sistema/proposicoes/autor/', include(autor_crud.urls)), url(r'^sistema/materia/tipo/', include(tipo_materia_crud.urls)), @@ -35,7 +44,6 @@ urlpatterns = [ url(r'^sistema/materia/status-tramitacao/', include(status_tramitacao_crud.urls)), url(r'^sistema/materia/orgao/', include(orgao_crud.urls)), - url(r'^materia/', include(materia_legislativa_crud.urls)), url(r'^materia/formulario-simplificado', FormularioSimplificadoView.as_view(), name='formulario_simplificado'), diff --git a/norma/urls.py b/norma/urls.py index 66ed716cf..fb3110513 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,9 +1,11 @@ from django.conf.urls import include, url +from compilacao.urls import urlpatterns as __url__compilacao from norma.views import (NormaIncluirView, assunto_norma_crud, norma_temporario_crud, tipo_norma_crud) -norma_url_patterns = norma_temporario_crud.urlpatterns + [] + +norma_url_patterns = norma_temporario_crud.urlpatterns # norma_url_patterns = norma_crud.urlpatterns + [] urlpatterns = [ @@ -11,7 +13,6 @@ urlpatterns = [ norma_temporario_crud.namespace, norma_temporario_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/requirements/requirements.txt b/requirements/requirements.txt index 451623c54..af7c3d8a2 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -9,7 +9,6 @@ django-crispy-forms django-extra-views django-vanilla-views git+git://github.com/interlegis/django-sass-processor.git -git+git://github.com/LeandroRoberto/odfpy.git libsass psycopg2 pytz diff --git a/sapl/utils.py b/sapl/utils.py index 139a504c2..62a96c0e2 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -37,30 +37,3 @@ def make_choices(*choice_pairs): yield key YES_NO_CHOICES = [(True, _('Sim')), (False, _('Não'))] - - -def int_to_roman(int_value): - # if isinstance(int_value, type(1)): - # raise TypeError("expected integer, got %s" % type(int_value)) - if not 0 < int_value < 4000: - raise ValueError("Argument must be between 1 and 3999") - ints = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1) - nums = ('M', 'CM', 'D', 'CD', 'C', 'XC', - 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I') - result = "" - for i in range(len(ints)): - count = int(int_value / ints[i]) - result += nums[i] * count - int_value -= ints[i] * count - return result - - -def int_to_letter(int_value): - result = '' - int_value -= 1 - while int_value >= 26: - rest = int_value % 26 - int_value = int(int_value / 26) - 1 - result = chr(rest + 65) + result - result = chr(int_value + 65) + result - return result diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 0906e6649..5d8abca8a 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -576,7 +576,7 @@ a:link:after, a:visited:after { } } } - .norma_title { + .ta_title { padding: 0.15em 0.7em; background-color: rgba(0, 0, 0, 0.15); margin: 0.1em 0.08em 0 0.1em; diff --git a/templates/compilacao/dispositivo_search_fragment_form.html b/templates/compilacao/dispositivo_search_fragment_form.html index 636818388..19244586c 100644 --- a/templates/compilacao/dispositivo_search_fragment_form.html +++ b/templates/compilacao/dispositivo_search_fragment_form.html @@ -8,9 +8,9 @@ {% endif %} {% for dpt in object_list %} - {% ifchanged dpt.norma%} + {% ifchanged dpt.ta%} {% if not forloop.first %}{% endif %} -
{{dpt.norma}}
+
{{dpt.ta}}
    {% endifchanged %} @@ -22,7 +22,7 @@
- {% nomenclatura_heranca dpt 1 1 %} + {% nomenclatura_heranca dpt 1 1 %}
{% endif%} @@ -34,7 +34,7 @@
- {% nomenclatura_heranca dpt 1 1 %} + {% nomenclatura_heranca dpt 1 1 %}
{% endif%} diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html index 8038d6910..c544995d5 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/edit.html @@ -14,7 +14,7 @@ {% block title%} -

Edição: {{ view.get_norma }} - {% trans 'Texto Multivigente' %}

+

Edição: {{ view.get_ta }} - {% trans 'Texto Multivigente' %}

{% endblock %} {% block base_content %} diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 16e58f84a..1d53cece5 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -23,7 +23,7 @@
  • E+
  • {%endif%}
  • E*
  • -
  • C
  • +
  • C
    • @@ -107,15 +107,15 @@
      {% spaceless %}
      {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%}
      - {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - + {% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} {% endif %} {% endspaceless %} - {% if view.is_norma_alteradora and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} + {% if view.is_ta_alterador and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} {%with node=dpt template_name='compilacao/edit_bloco_alteracao.html' %} {%include template_name%} {%endwith%} diff --git a/templates/compilacao/edit_bloco_alteracao.html b/templates/compilacao/edit_bloco_alteracao.html index 39b13058d..364d897ef 100644 --- a/templates/compilacao/edit_bloco_alteracao.html +++ b/templates/compilacao/edit_bloco_alteracao.html @@ -3,7 +3,7 @@ {% spaceless %}
      - {{ 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 }} + {{ 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 }}
      {% endspaceless %} diff --git a/templates/compilacao/form.html b/templates/compilacao/form.html new file mode 100644 index 000000000..e25d5d3ab --- /dev/null +++ b/templates/compilacao/form.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} +{% load i18n crispy_forms_tags %} + +{% block base_content %} + {% crispy form %} +{% endblock %} diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index 3f79eaf20..da97be8ac 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -18,7 +18,7 @@ {% block title%} -

      {{ view.get_norma }}

      +

      {{ view.get_ta }}

      {% endblock %} {% block base_content %} @@ -41,11 +41,11 @@ {% endfor %} @@ -69,8 +69,8 @@ {% comment %} {% endcomment %} @@ -78,7 +78,7 @@ diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/index_bloco.html index 8ea584c9a..082544e09 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -20,8 +20,8 @@
      {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%} {%endif%} - {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - + {% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} @@ -69,9 +69,9 @@
      Vide:
      @@ -91,9 +91,9 @@
      Citado em:
      {% if dpt.is_relative_auto_insert %} - {{ vide.dispositivo_base.dispositivo_pai}} + {{ vide.dispositivo_base.dispositivo_pai}} {% else %} - {{ vide.dispositivo_base}} + {{ vide.dispositivo_base}} {% endif %} {% if vide.texto %} - {{vide.texto}}{% endif %}
      @@ -162,7 +162,7 @@ {% endif%}
      {% endspaceless %} - {% if view.is_norma_alteradora and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} + {% if view.is_ta_alterador and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} {%with node=dpt template_name='compilacao/index_bloco_alteracao.html' %} {%include template_name%} {%endwith%} diff --git a/templates/compilacao/index_bloco_alteracao.html b/templates/compilacao/index_bloco_alteracao.html index 27a8c10cc..8e72c15f8 100644 --- a/templates/compilacao/index_bloco_alteracao.html +++ b/templates/compilacao/index_bloco_alteracao.html @@ -4,7 +4,7 @@ {% if ch.visibilidade %}
      - {{ 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 }} + {{ 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 }}
      {%endif%} diff --git a/templates/compilacao/textoarticulado_detail.html b/templates/compilacao/textoarticulado_detail.html new file mode 100644 index 000000000..64abc548f --- /dev/null +++ b/templates/compilacao/textoarticulado_detail.html @@ -0,0 +1,71 @@ +{% extends "base.html" %} +{% load i18n %} +{% load compilacao_filters %} + +{% block base_content %} + + {# FIXME is this the best markup to use? #} +
      + {% block actions %} + + {% endblock actions %} + {% block sections_nav %}{% endblock %} +
      + + {% block detail_content %} + {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #} + +
      + {%trans 'Identificação Básica'%} + +
      + +
      +
      + +

      {{ object.tipo_ta}}

      +
      +
      + +
      +
      + +

      {{ object.numero}}

      +
      +
      + +
      +
      + +

      {{ object.ano}}

      +
      +
      + +
      +
      + +

      {{ object.data}}

      +
      +
      +
      +
      + +
      +
      + +

      {{ object.ementa|safe}}

      +
      +
      + +
      + +
      + + + + {% endblock detail_content %} + +{% endblock base_content %} diff --git a/templates/compilacao/textoarticulado_list.html b/templates/compilacao/textoarticulado_list.html new file mode 100644 index 000000000..3e4632ff3 --- /dev/null +++ b/templates/compilacao/textoarticulado_list.html @@ -0,0 +1,61 @@ +{% extends "base.html" %} {% load i18n %} {% block base_content %} + + + + + + + + + + + + + {% for ta in object_list %} + + + + + + + + {% endfor %} + +
      {% trans 'Tipo'%}{% trans 'Número'%}{% trans 'Ano'%}{% trans 'Data'%}{% trans 'Ementa'%}
      {{ ta.tipo_ta }}{{ ta.numero }}{{ ta.ano }}{{ ta.data }}{{ ta.ementa }}
      + +{% if is_paginated %} +
      + +
      +{% endif %} +{% endblock %} From 232ae637e5599a6ecc0b129009377bdac2b57589 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 24 Dec 2015 16:31:36 -0200 Subject: [PATCH 09/21] CRUD TextoArticulado completado. --- compilacao/forms.py | 15 +- .../migrations/0036_auto_20151224_1341.py | 23 ++++ .../migrations/0037_auto_20151224_1348.py | 19 +++ .../migrations/0038_auto_20151224_1429.py | 24 ++++ compilacao/models.py | 16 +++ compilacao/urls.py | 8 +- compilacao/views.py | 34 ++++- norma/urls.py | 2 +- sapl/settings.py | 6 +- .../textoarticulado_confirm_delete.html | 20 +++ .../compilacao/textoarticulado_detail.html | 128 ++++++++---------- .../compilacao/textoarticulado_list.html | 14 +- 12 files changed, 224 insertions(+), 85 deletions(-) create mode 100644 compilacao/migrations/0036_auto_20151224_1341.py create mode 100644 compilacao/migrations/0037_auto_20151224_1348.py create mode 100644 compilacao/migrations/0038_auto_20151224_1429.py create mode 100644 templates/compilacao/textoarticulado_confirm_delete.html diff --git a/compilacao/forms.py b/compilacao/forms.py index 46b899bb5..11bf4bc1d 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -9,6 +9,7 @@ from django.core.exceptions import NON_FIELD_ERRORS from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ +from compilacao import utils, models from compilacao.models import Dispositivo, Nota, TipoNota, TipoVide, Vide,\ TextoArticulado, TipoTextoArticulado from compilacao.utils import to_row, to_column @@ -56,6 +57,10 @@ class TaForm(ModelForm): widget=forms.Textarea, error_messages=ta_error_messages, required=False) + participacao_social = forms.NullBooleanField( + label=_('Participação Social'), + widget=forms.Select(choices=models.PARTICIPACAO_SOCIAL_CHOICES), + required=False) class Meta: model = TextoArticulado @@ -65,25 +70,27 @@ class TaForm(ModelForm): 'data', 'ementa', 'observacao', + 'participacao_social', ] def __init__(self, *args, **kwargs): row1 = to_row([ - ('tipo_ta', 5), + ('tipo_ta', 3), ('numero', 2), ('ano', 2), - ('data', 3), + ('data', 2), + ('participacao_social', 3), ]) self.helper = FormHelper() self.helper.layout = Layout( - row1, + Fieldset(_('Identificação Básica'), row1, css_class="large-12"), Fieldset(_('Ementa'), Column('ementa'), css_class="large-12"), Fieldset( _('Observações'), Column('observacao'), css_class="large-12"), ButtonHolder( - Submit('Save', 'Save', + Submit('submit', _('Salvar'), css_class='radius') ) ) diff --git a/compilacao/migrations/0036_auto_20151224_1341.py b/compilacao/migrations/0036_auto_20151224_1341.py new file mode 100644 index 000000000..a90b7861c --- /dev/null +++ b/compilacao/migrations/0036_auto_20151224_1341.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0035_auto_20151223_1709'), + ] + + operations = [ + migrations.AlterModelOptions( + name='textoarticulado', + options={'verbose_name': 'Texto Articulado', 'verbose_name_plural': 'Textos Articulados', 'ordering': ['-data', '-numero']}, + ), + migrations.AddField( + model_name='textoarticulado', + name='participacao_social', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], verbose_name='Participação Social', default=False), + ), + ] diff --git a/compilacao/migrations/0037_auto_20151224_1348.py b/compilacao/migrations/0037_auto_20151224_1348.py new file mode 100644 index 000000000..9e355c45e --- /dev/null +++ b/compilacao/migrations/0037_auto_20151224_1348.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0036_auto_20151224_1341'), + ] + + operations = [ + migrations.AlterField( + model_name='textoarticulado', + name='participacao_social', + field=models.NullBooleanField(verbose_name='Participação Social', choices=[(True, 'Sim'), (False, 'Não')], default=False), + ), + ] diff --git a/compilacao/migrations/0038_auto_20151224_1429.py b/compilacao/migrations/0038_auto_20151224_1429.py new file mode 100644 index 000000000..0e73bb987 --- /dev/null +++ b/compilacao/migrations/0038_auto_20151224_1429.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0037_auto_20151224_1348'), + ] + + operations = [ + migrations.AddField( + model_name='tipotextoarticulado', + name='participacao_social', + field=models.NullBooleanField(default=False, verbose_name='Participação Social', choices=[(True, 'Sim'), (False, 'Não')]), + ), + migrations.AlterField( + model_name='textoarticulado', + name='participacao_social', + field=models.NullBooleanField(default=None, verbose_name='Participação Social', choices=[(None, 'Padrão definido no Tipo'), (True, 'Sim'), (False, 'Não')]), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 8c213c57d..2835141b1 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -61,6 +61,11 @@ class BaseModel(models.Model): class TipoTextoArticulado(models.Model): sigla = models.CharField(max_length=3, verbose_name=_('Sigla')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) + participacao_social = models.NullBooleanField( + default=False, + blank=True, null=True, + choices=utils.YES_NO_CHOICES, + verbose_name=_('Participação Social')) class Meta: verbose_name = _('Tipo de Texto Articulado') @@ -70,6 +75,12 @@ class TipoTextoArticulado(models.Model): return self.descricao +PARTICIPACAO_SOCIAL_CHOICES = [ + (None, _('Padrão definido no Tipo')), + (True, _('Sim')), + (False, _('Não'))] + + class TextoArticulado(TimestampedMixin): data = models.DateField(blank=True, null=True, verbose_name=_('Data')) ementa = models.TextField(verbose_name=_('Ementa')) @@ -80,6 +91,11 @@ class TextoArticulado(TimestampedMixin): tipo_ta = models.ForeignKey( TipoTextoArticulado, verbose_name=_('Tipo de Texto Articulado')) + participacao_social = models.NullBooleanField( + default=None, + blank=True, null=True, + choices=PARTICIPACAO_SOCIAL_CHOICES, + verbose_name=_('Participação Social')) class Meta: verbose_name = _('Texto Articulado') diff --git a/compilacao/urls.py b/compilacao/urls.py index 352f3931d..311c371a0 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -3,19 +3,17 @@ from django.conf.urls import include, url from compilacao import views urlpatterns_compilacao = [ - url(r'^$', views.TaListView.as_view(), name='ta_list'), + url(r'^create$', views.TaCreateView.as_view(), name='ta_create'), url(r'^(?P[0-9]+)$', views.TaDetailView.as_view(), name='ta_detail'), url(r'^(?P[0-9]+)/edit$', views.TaUpdateView.as_view(), name='ta_edit'), - + url(r'^(?P[0-9]+)/delete$', + views.TaDeleteView.as_view(), name='ta_delete'), ] urlpatterns = [ url(r'^ta/', include(urlpatterns_compilacao)), - - - ] diff --git a/compilacao/views.py b/compilacao/views.py index e3fb96522..b59cbd74b 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -2,6 +2,7 @@ from collections import OrderedDict from datetime import datetime, timedelta from os.path import sys +from braces.views import FormMessagesMixin from django.contrib.auth.decorators import login_required from django.contrib.messages.api import success from django.core.signing import Signer @@ -16,7 +17,8 @@ from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView from django.views.generic.detail import DetailView -from django.views.generic.edit import FormMixin, UpdateView, CreateView +from django.views.generic.edit import FormMixin, UpdateView, CreateView,\ + DeleteView from django.views.generic.list import ListView from compilacao import forms, utils @@ -42,7 +44,9 @@ DISPOSITIVO_SELECT_RELATED = ( class TaListView(ListView): model = TextoArticulado paginate_by = 10 - title = TextoArticulado._meta.verbose_name_plural + verbose_name = model._meta.verbose_name + title = model._meta.verbose_name_plural + create_url = reverse_lazy('ta_create') def get_context_data(self, **kwargs): context = super(TaListView, self).get_context_data(**kwargs) @@ -61,6 +65,17 @@ class TaDetailView(DetailView): return self.get_object() +class TaCreateView(FormMessagesMixin, CreateView): + model = TextoArticulado + form_class = forms.TaForm + template_name = "compilacao/form.html" + form_valid_message = _('Registro criado com sucesso!') + form_invalid_message = _('O registro não foi criado.') + + def get_success_url(self): + return reverse_lazy('ta_detail', kwargs={'pk': self.object.id}) + + class TaUpdateView(UpdateView): model = TextoArticulado form_class = forms.TaForm @@ -72,3 +87,18 @@ class TaUpdateView(UpdateView): def get_success_url(self): return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']}) + + +class TaDeleteView(DeleteView): + model = TextoArticulado + + @property + def title(self): + return self.get_object() + + @property + def detail_url(self): + return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']}) + + def get_success_url(self): + return reverse_lazy('ta_list') diff --git a/norma/urls.py b/norma/urls.py index fb3110513..5d22d640e 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -5,7 +5,7 @@ from norma.views import (NormaIncluirView, assunto_norma_crud, norma_temporario_crud, tipo_norma_crud) -norma_url_patterns = norma_temporario_crud.urlpatterns +norma_url_patterns = norma_temporario_crud.urlpatterns + __url__compilacao # norma_url_patterns = norma_crud.urlpatterns + [] urlpatterns = [ diff --git a/sapl/settings.py b/sapl/settings.py index d47795f61..c3971715d 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -59,8 +59,8 @@ INSTALLED_APPS = ( 'crispy_forms_foundation', 'sass_processor', ) -if DEBUG: - INSTALLED_APPS += ('debug_toolbar',) +# if DEBUG: +# INSTALLED_APPS += ('debug_toolbar',) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', @@ -117,7 +117,7 @@ DATABASES = { # https://docs.djangoproject.com/en/1.8/topics/i18n/ LANGUAGE_CODE = 'pt-br' TIME_ZONE = 'America/Sao_Paulo' -USE_I18N = False +USE_I18N = True USE_L10N = False USE_TZ = True # DATE_FORMAT = 'N j, Y' diff --git a/templates/compilacao/textoarticulado_confirm_delete.html b/templates/compilacao/textoarticulado_confirm_delete.html new file mode 100644 index 000000000..354db7f00 --- /dev/null +++ b/templates/compilacao/textoarticulado_confirm_delete.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block base_content %} +{% csrf_token %} +
      + +

      + {% blocktrans %} + Confirma exclusão de
      "{{ object }}"? + {% endblocktrans %} +

      + + +
      + +{% endblock %} diff --git a/templates/compilacao/textoarticulado_detail.html b/templates/compilacao/textoarticulado_detail.html index 64abc548f..321f51263 100644 --- a/templates/compilacao/textoarticulado_detail.html +++ b/templates/compilacao/textoarticulado_detail.html @@ -1,71 +1,61 @@ -{% extends "base.html" %} -{% load i18n %} -{% load compilacao_filters %} - -{% block base_content %} - - {# FIXME is this the best markup to use? #} -
      +{% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} {% block base_content %} {# FIXME is this the best markup to use? #} +
      {% block actions %} -
      - - {% block detail_content %} - {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #} - -
      - {%trans 'Identificação Básica'%} - -
      - -
      -
      - -

      {{ object.tipo_ta}}

      -
      -
      - -
      -
      - -

      {{ object.numero}}

      -
      -
      - -
      -
      - -

      {{ object.ano}}

      -
      -
      - -
      -
      - -

      {{ object.data}}

      -
      -
      -
      -
      - -
      -
      - -

      {{ object.ementa|safe}}

      -
      -
      - -
      - -
      - - - - {% endblock detail_content %} - -{% endblock base_content %} +
      {% trans 'Excluir' %}
      + + {% endblock actions %} {% block sections_nav %}{% endblock %} +
      + +{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #} + +
      + {%trans 'Identificação Básica'%} + +
      + +
      +
      + +

      {{ object.tipo_ta}}

      +
      +
      + +
      +
      + +

      {{ object.numero}}

      +
      +
      + +
      +
      + +

      {{ object.ano}}

      +
      +
      + +
      +
      + +

      {{ object.data}}

      +
      +
      +
      +
      +
      +
      +
      + +

      {{ object.ementa|safe}}

      +
      +
      + +
      + +
      + + + +{% endblock detail_content %} {% endblock base_content %} diff --git a/templates/compilacao/textoarticulado_list.html b/templates/compilacao/textoarticulado_list.html index 3e4632ff3..070ec3ff7 100644 --- a/templates/compilacao/textoarticulado_list.html +++ b/templates/compilacao/textoarticulado_list.html @@ -1,5 +1,17 @@ {% extends "base.html" %} {% load i18n %} {% block base_content %} + +{# FIXME is this the best markup to use? #} + + @@ -17,7 +29,7 @@ - + {% endfor %} From ff78abb928d5d0289a302a145a888aca5d1ac8b5 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 24 Dec 2015 20:29:50 -0200 Subject: [PATCH 10/21] Issue #76 em progresso MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Controles de Vigências e nomenclaturas de Norma para TextoArticulado --- compilacao/forms.py | 24 ++- .../migrations/0032_auto_20151213_1538.py | 3 +- .../migrations/0039_auto_20151224_1846.py | 19 ++ compilacao/models.py | 1 + compilacao/urls.py | 11 +- compilacao/utils.py | 10 + compilacao/views.py | 198 +++++++++++++++++- norma/migrations/0009_auto_20151224_1637.py | 49 +++++ norma/models.py | 10 +- norma/views.py | 5 +- sapl/crud.py | 8 + .../dispositivo_search_fragment_form.html | 4 +- .../compilacao/{index.html => text_list.html} | 8 +- ...{index_bloco.html => text_list_bloco.html} | 12 +- ...cao.html => text_list_blocoalteracao.html} | 2 +- .../compilacao/textoarticulado_detail.html | 17 +- 16 files changed, 345 insertions(+), 36 deletions(-) create mode 100644 compilacao/migrations/0039_auto_20151224_1846.py create mode 100644 norma/migrations/0009_auto_20151224_1637.py rename templates/compilacao/{index.html => text_list.html} (81%) rename templates/compilacao/{index_bloco.html => text_list_bloco.html} (89%) rename templates/compilacao/{index_bloco_alteracao.html => text_list_blocoalteracao.html} (66%) diff --git a/compilacao/forms.py b/compilacao/forms.py index 11bf4bc1d..e3e5b19f4 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -12,7 +12,7 @@ from django.utils.translation import ugettext_lazy as _ from compilacao import utils, models from compilacao.models import Dispositivo, Nota, TipoNota, TipoVide, Vide,\ TextoArticulado, TipoTextoArticulado -from compilacao.utils import to_row, to_column +from compilacao.utils import to_row, to_column, to_fieldsets from norma.models import TipoNormaJuridica @@ -31,6 +31,21 @@ ta_error_messages = { } +class FormLayout(Layout): + + def __init__(self, *fields): + buttons = Div( + HTML('%s' % _('Cancelar')), + Submit('submit', _('Enviar'), + css_class='button radius success right'), + css_class='radius clearfix' + ) + _fields = list(to_fieldsets(fields)) + \ + [Row(Column(buttons, css_class='clearfix'))] + super(FormLayout, self).__init__(*_fields) + + class TaForm(ModelForm): tipo_ta = forms.ModelChoiceField( label=_('Tipo do Texto Articulado'), @@ -84,15 +99,12 @@ class TaForm(ModelForm): ]) self.helper = FormHelper() - self.helper.layout = Layout( + self.helper.layout = FormLayout( Fieldset(_('Identificação Básica'), row1, css_class="large-12"), Fieldset(_('Ementa'), Column('ementa'), css_class="large-12"), Fieldset( _('Observações'), Column('observacao'), css_class="large-12"), - ButtonHolder( - Submit('submit', _('Salvar'), - css_class='radius') - ) + ) super(TaForm, self).__init__(*args, **kwargs) diff --git a/compilacao/migrations/0032_auto_20151213_1538.py b/compilacao/migrations/0032_auto_20151213_1538.py index db6a23ec7..3bd8555a7 100644 --- a/compilacao/migrations/0032_auto_20151213_1538.py +++ b/compilacao/migrations/0032_auto_20151213_1538.py @@ -13,6 +13,7 @@ class Migration(migrations.Migration): operations = [ migrations.AlterUniqueTogether( name='vide', - unique_together=set([('dispositivo_base', 'dispositivo_ref', 'tipo')]), + unique_together=set( + [('dispositivo_base', 'dispositivo_ref', 'tipo')]), ), ] diff --git a/compilacao/migrations/0039_auto_20151224_1846.py b/compilacao/migrations/0039_auto_20151224_1846.py new file mode 100644 index 000000000..51099c44f --- /dev/null +++ b/compilacao/migrations/0039_auto_20151224_1846.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0038_auto_20151224_1429'), + ] + + operations = [ + migrations.AlterField( + model_name='textoarticulado', + name='tipo_ta', + field=models.ForeignKey(default=None, null=True, to='compilacao.TipoTextoArticulado', blank=True, verbose_name='Tipo de Texto Articulado'), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 2835141b1..908effd82 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -90,6 +90,7 @@ class TextoArticulado(TimestampedMixin): ano = models.PositiveSmallIntegerField(verbose_name=_('Ano')) tipo_ta = models.ForeignKey( TipoTextoArticulado, + blank=True, null=True, default=None, verbose_name=_('Tipo de Texto Articulado')) participacao_social = models.NullBooleanField( default=None, diff --git a/compilacao/urls.py b/compilacao/urls.py index 311c371a0..f6bde1928 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -10,6 +10,12 @@ urlpatterns_compilacao = [ views.TaUpdateView.as_view(), name='ta_edit'), url(r'^(?P[0-9]+)/delete$', views.TaDeleteView.as_view(), name='ta_delete'), + + + url(r'^(?P[0-9]+)/text', + views.TextoView.as_view(), name='ta_text'), + url(r'^(?P[0-9]+)/text/vigencia/(?P.+)/$', + views.TextoView.as_view(), name='ta_vigencia'), ] urlpatterns = [ @@ -18,13 +24,10 @@ urlpatterns = [ """ - url(r'^(?P[0-9]+)/compilacao$', - views.CompilacaoView.as_view(), name='compilacao'), url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), - url(r'^(?P[0-9]+)/compilacao/vigencia/(?P.+)/$', - views.CompilacaoView.as_view(), name='vigencia'), + url(r'^(?P[0-9]+)/compilacao/edit', views.CompilacaoEditView.as_view(), name='comp_edit'), diff --git a/compilacao/utils.py b/compilacao/utils.py index f07d47a07..b5a494ed8 100644 --- a/compilacao/utils.py +++ b/compilacao/utils.py @@ -14,6 +14,16 @@ def to_row(names_spans): return Row(*list(map(to_column, names_spans))) +def to_fieldsets(fields): + for field in fields: + if isinstance(field, list): + legend, *row_specs = field + rows = [to_row(name_span_list) for name_span_list in row_specs] + yield Fieldset(legend, *rows) + else: + yield field + + def make_choices(*choice_pairs): assert len(choice_pairs) % 2 == 0 ipairs = iter(choice_pairs) diff --git a/compilacao/views.py b/compilacao/views.py index b59cbd74b..50105e1dd 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -36,7 +36,7 @@ DISPOSITIVO_SELECT_RELATED = ( 'dispositivo_atualizador', 'dispositivo_atualizador__dispositivo_pai', 'dispositivo_atualizador__dispositivo_pai__ta', - 'dispositivo_atualizador__dispositivo_pai__ta__tipo', + 'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta', 'dispositivo_pai', 'dispositivo_pai__tipo_dispositivo') @@ -102,3 +102,199 @@ class TaDeleteView(DeleteView): def get_success_url(self): return reverse_lazy('ta_list') + + +class TextoView(ListView): + template_name = 'compilacao/text_list.html' + + flag_alteradora = -1 + + flag_nivel_ini = 0 + flag_nivel_old = -1 + + itens_de_vigencia = {} + + inicio_vigencia = None + fim_vigencia = None + + def get_context_data(self, **kwargs): + context = super(TextoView, self).get_context_data(**kwargs) + + cita = Vide.objects.filter( + Q(dispositivo_base__ta_id=self.kwargs['ta_id'])).\ + select_related( + 'dispositivo_ref', + 'dispositivo_ref__ta', + 'dispositivo_ref__dispositivo_pai', + 'dispositivo_ref__dispositivo_pai__ta', '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__ta_id=self.kwargs['ta_id'])).\ + select_related( + 'dispositivo_base', + 'dispositivo_base__ta', + 'dispositivo_base__dispositivo_pai', + 'dispositivo_base__dispositivo_pai__ta', '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__ta_id=self.kwargs['ta_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): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + self.inicio_vigencia = None + self.fim_vigencia = None + if 'sign' in self.kwargs: + signer = Signer() + try: + string = signer.unsign(self.kwargs['sign']).split(',') + self.inicio_vigencia = parse_date(string[0]) + self.fim_vigencia = parse_date(string[1]) + except: + return{} + + return Dispositivo.objects.filter( + inicio_vigencia__lte=self.fim_vigencia, + ordem__gt=0, + ta_id=self.kwargs['ta_id'], + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + + r = Dispositivo.objects.filter( + ordem__gt=0, + ta_id=self.kwargs['ta_id'], + ).select_related( + 'tipo_dispositivo', + 'ta_publicado', + 'ta', + 'dispositivo_atualizador', + 'dispositivo_atualizador__dispositivo_pai', + 'dispositivo_atualizador__dispositivo_pai__ta', + 'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta', + 'dispositivo_pai', + 'dispositivo_pai__tipo_dispositivo') + + return r + + def get_vigencias(self): + itens = Dispositivo.objects.filter( + ta_id=self.kwargs['ta_id'], + ).order_by( + 'inicio_vigencia' + ).distinct( + 'inicio_vigencia' + ).select_related( + 'ta_publicado', + 'ta', + 'ta_publicado__tipo_ta', + 'ta__tipo_ta',) + + ajuste_datas_vigencia = [] + + for item in itens: + ajuste_datas_vigencia.append(item) + + lenLista = len(ajuste_datas_vigencia) + for i in range(lenLista): + if i + 1 < lenLista: + ajuste_datas_vigencia[ + i].fim_vigencia = ajuste_datas_vigencia[ + i + 1].inicio_vigencia - timedelta(days=1) + else: + ajuste_datas_vigencia[i].fim_vigencia = None + + self.itens_de_vigencia = {} + + idx = -1 + length = len(ajuste_datas_vigencia) + for item in ajuste_datas_vigencia: + idx += 1 + if idx == 0: + self.itens_de_vigencia[0] = [item, ] + continue + + if idx + 1 < length: + ano = item.ta_publicado.ano + if ano in self.itens_de_vigencia: + self.itens_de_vigencia[ano].append(item) + else: + self.itens_de_vigencia[ano] = [item, ] + else: + self.itens_de_vigencia[9999] = [item, ] + + if len(self.itens_de_vigencia.keys()) <= 1: + return {} + + self.itens_de_vigencia = OrderedDict( + sorted(self.itens_de_vigencia.items(), key=lambda t: t[0])) + + return self.itens_de_vigencia + + def get_ta(self): + return TextoArticulado.objects.select_related('tipo_ta').get( + pk=self.kwargs['ta_id']) + + def is_ta_alterador(self): + if self.flag_alteradora == -1: + self.flag_alteradora = Dispositivo.objects.select_related( + 'dispositivos_alterados_pelo_texto_articulado_set' + ).filter(ta_id=self.kwargs['ta_id']).count() + return self.flag_alteradora > 0 + + +class DispositivoView(TextoView): + # template_name = 'compilacao/index.html' + template_name = 'compilacao/text_list_bloco.html' + + def get_queryset(self): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + 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, + ta_id=self.kwargs['ta_id'])[:1] + + if proximo_bloco.count() == 0: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ordem__lt=proximo_bloco[0].ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + return itens diff --git a/norma/migrations/0009_auto_20151224_1637.py b/norma/migrations/0009_auto_20151224_1637.py new file mode 100644 index 000000000..5de7416b2 --- /dev/null +++ b/norma/migrations/0009_auto_20151224_1637.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0038_auto_20151224_1429'), + ('norma', '0008_normajuridica_texto_integral'), + ] + + operations = [ + migrations.AlterModelOptions( + name='normajuridica', + options={'verbose_name': 'Norma Jurídica', 'verbose_name_plural': 'Normas Jurídicas'}, + ), + migrations.RemoveField( + model_name='normajuridica', + name='ano', + ), + migrations.RemoveField( + model_name='normajuridica', + name='data', + ), + migrations.RemoveField( + model_name='normajuridica', + name='ementa', + ), + migrations.RemoveField( + model_name='normajuridica', + name='id', + ), + migrations.RemoveField( + model_name='normajuridica', + name='numero', + ), + migrations.RemoveField( + model_name='normajuridica', + name='observacao', + ), + migrations.AddField( + model_name='normajuridica', + name='textoarticulado_ptr', + field=models.OneToOneField(to='compilacao.TextoArticulado', primary_key=True, parent_link=True, auto_created=True, default=1, serialize=False), + preserve_default=False, + ), + ] diff --git a/norma/models.py b/norma/models.py index 66aefee18..cbbe1aeb4 100644 --- a/norma/models.py +++ b/norma/models.py @@ -2,6 +2,7 @@ from django.db import models from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ +from compilacao.models import TextoArticulado from materia.models import MateriaLegislativa from sapl.utils import YES_NO_CHOICES, make_choices @@ -61,7 +62,7 @@ def texto_upload_path(instance, filename): return get_norma_media_path(instance, instance.ano, filename) -class NormaJuridica(models.Model): +class NormaJuridica(TextoArticulado): ESFERA_FEDERACAO_CHOICES, ESTADUAL, FEDERAL, MUNICIPAL = make_choices( 'E', _('Estadual'), 'F', _('Federal'), @@ -74,13 +75,10 @@ class NormaJuridica(models.Model): verbose_name=_('Texto Integral')) tipo = models.ForeignKey(TipoNormaJuridica, verbose_name=_('Tipo')) materia = models.ForeignKey(MateriaLegislativa, blank=True, null=True) - numero = models.PositiveIntegerField(verbose_name=_('Número')) - ano = models.PositiveSmallIntegerField(verbose_name=_('Ano')) esfera_federacao = models.CharField( max_length=1, verbose_name=_('Esfera Federação'), choices=ESFERA_FEDERACAO_CHOICES) - data = models.DateField(blank=True, null=True, verbose_name=_('Data')) data_publicacao = models.DateField( blank=True, null=True, verbose_name=_('Data Publicação')) veiculo_publicacao = models.CharField( @@ -92,11 +90,8 @@ class NormaJuridica(models.Model): blank=True, null=True, verbose_name=_('Pg. Início')) pagina_fim_publicacao = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Pg. Fim')) - ementa = models.TextField(verbose_name=_('Ementa')) indexacao = models.TextField( blank=True, null=True, verbose_name=_('Indexação')) - observacao = models.TextField( - blank=True, null=True, verbose_name=_('Observação')) complemento = models.NullBooleanField( blank=True, verbose_name=_('Complementar ?'), choices=YES_NO_CHOICES) @@ -110,7 +105,6 @@ class NormaJuridica(models.Model): class Meta: verbose_name = _('Norma Jurídica') verbose_name_plural = _('Normas Jurídicas') - ordering = ['-data', '-numero'] def __str__(self): return _('%(tipo)s nº %(numero)s de %(data)s') % { diff --git a/norma/views.py b/norma/views.py index a5e680213..11f4cffe7 100644 --- a/norma/views.py +++ b/norma/views.py @@ -12,13 +12,14 @@ from django.utils.translation import ugettext_lazy as _ from django.views.generic.edit import FormMixin from vanilla import GenericView -import sapl from materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.crud import build_crud +import sapl from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica, TipoNormaJuridica) + assunto_norma_crud = build_crud( AssuntoNorma, 'assunto_norma_juridica', [ @@ -59,7 +60,7 @@ norma_temporario_crud = build_crud( NormaJuridica, 'normajuridica', [ [_('Identificação Básica'), - [('tipo', 5), ('numero', 2), ('ano', 2), ('data', 3)], + [('tipo_ta', 3), ('tipo', 3), ('numero', 2), ('ano', 2), ('data', 2)], [('ementa', 12)]], ]) diff --git a/sapl/crud.py b/sapl/crud.py index e99772ead..69f5f5779 100644 --- a/sapl/crud.py +++ b/sapl/crud.py @@ -169,6 +169,14 @@ def build_crud(model, help_path, layout): _('O registro não foi criado.')) cancel_url = BaseMixin.list_url + def form_invalid(self, form): + """ + If the form is invalid, re-render the context data with the + data-filled form and errors. + """ + print(form.errors) + return self.render_to_response(self.get_context_data(form=form)) + def get_success_url(self): return self.detail_url diff --git a/templates/compilacao/dispositivo_search_fragment_form.html b/templates/compilacao/dispositivo_search_fragment_form.html index 19244586c..6de6ba32d 100644 --- a/templates/compilacao/dispositivo_search_fragment_form.html +++ b/templates/compilacao/dispositivo_search_fragment_form.html @@ -22,7 +22,7 @@
      - {% nomenclatura_heranca dpt 1 1 %} + {% nomenclatura_heranca dpt 1 1 %}
      {% endif%} @@ -34,7 +34,7 @@
      - {% nomenclatura_heranca dpt 1 1 %} + {% nomenclatura_heranca dpt 1 1 %}
      {% endif%} diff --git a/templates/compilacao/index.html b/templates/compilacao/text_list.html similarity index 81% rename from templates/compilacao/index.html rename to templates/compilacao/text_list.html index da97be8ac..1dbc71c46 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/text_list.html @@ -41,11 +41,11 @@ {% endfor %} @@ -95,6 +95,6 @@ {% trans 'Vigência entre'%} {{view.inicio_vigencia}} {% trans 'e'%} {{view.fim_vigencia}}. {%endif%} -{% include 'compilacao/index_bloco.html'%} +{% include 'compilacao/text_list_bloco.html'%} {% endblock base_content %} diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/text_list_bloco.html similarity index 89% rename from templates/compilacao/index_bloco.html rename to templates/compilacao/text_list_bloco.html index 082544e09..c07b56d01 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/text_list_bloco.html @@ -21,7 +21,7 @@
      {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%} {%endif%} {% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} @@ -69,9 +69,9 @@
      Vide:
      @@ -91,9 +91,9 @@
      Citado em:
      {% if dpt.is_relative_auto_insert %} - {{ vide.dispositivo_base.dispositivo_pai}} + {{ vide.dispositivo_base.dispositivo_pai}} {% else %} - {{ vide.dispositivo_base}} + {{ vide.dispositivo_base}} {% endif %} {% if vide.texto %} - {{vide.texto}}{% endif %}
      @@ -163,7 +163,7 @@
      {% endspaceless %} {% if view.is_ta_alterador and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} - {%with node=dpt template_name='compilacao/index_bloco_alteracao.html' %} + {%with node=dpt template_name='compilacao/texto_list_blocoalteracao.html' %} {%include template_name%} {%endwith%} {% endif%} diff --git a/templates/compilacao/index_bloco_alteracao.html b/templates/compilacao/text_list_blocoalteracao.html similarity index 66% rename from templates/compilacao/index_bloco_alteracao.html rename to templates/compilacao/text_list_blocoalteracao.html index 8e72c15f8..0c099a22e 100644 --- a/templates/compilacao/index_bloco_alteracao.html +++ b/templates/compilacao/text_list_blocoalteracao.html @@ -4,7 +4,7 @@ {% if ch.visibilidade %}
      - {{ 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 }} + {{ 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 }}
      {%endif%} diff --git a/templates/compilacao/textoarticulado_detail.html b/templates/compilacao/textoarticulado_detail.html index 321f51263..afe849a8d 100644 --- a/templates/compilacao/textoarticulado_detail.html +++ b/templates/compilacao/textoarticulado_detail.html @@ -5,9 +5,24 @@
      {% trans 'Editar' %}
      {% trans 'Excluir' %}
      - {% endblock actions %} {% block sections_nav %}{% endblock %} + {% endblock actions %} + + + {% block sections_nav %} + + + {% endblock %} + + + + + {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
      From 16ddaca90a56ab774a10f6fb3097631a1b40809f Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sat, 26 Dec 2015 13:44:24 -0200 Subject: [PATCH 11/21] Ajustes iniciais em TextoArticulado --- .../migrations/0033_auto_20151222_1608.py | 119 ------------------ .../migrations/0033_auto_20151226_1320.py | 115 +++++++++++++++++ .../migrations/0034_auto_20151222_1609.py | 22 ---- .../migrations/0034_auto_20151226_1321.py | 18 +++ .../migrations/0035_auto_20151223_1709.py | 32 ----- .../migrations/0036_auto_20151224_1341.py | 23 ---- .../migrations/0037_auto_20151224_1348.py | 19 --- .../migrations/0038_auto_20151224_1429.py | 24 ---- .../migrations/0039_auto_20151224_1846.py | 19 --- compilacao/urls.py | 2 +- materia/urls.py | 1 - norma/migrations/0009_auto_20151224_1637.py | 49 -------- norma/models.py | 10 +- norma/urls.py | 2 +- sapl/settings.py | 2 +- templates/compilacao/text_list_bloco.html | 5 +- 16 files changed, 145 insertions(+), 317 deletions(-) delete mode 100644 compilacao/migrations/0033_auto_20151222_1608.py create mode 100644 compilacao/migrations/0033_auto_20151226_1320.py delete mode 100644 compilacao/migrations/0034_auto_20151222_1609.py create mode 100644 compilacao/migrations/0034_auto_20151226_1321.py delete mode 100644 compilacao/migrations/0035_auto_20151223_1709.py delete mode 100644 compilacao/migrations/0036_auto_20151224_1341.py delete mode 100644 compilacao/migrations/0037_auto_20151224_1348.py delete mode 100644 compilacao/migrations/0038_auto_20151224_1429.py delete mode 100644 compilacao/migrations/0039_auto_20151224_1846.py delete mode 100644 norma/migrations/0009_auto_20151224_1637.py diff --git a/compilacao/migrations/0033_auto_20151222_1608.py b/compilacao/migrations/0033_auto_20151222_1608.py deleted file mode 100644 index ae5f7a647..000000000 --- a/compilacao/migrations/0033_auto_20151222_1608.py +++ /dev/null @@ -1,119 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('compilacao', '0032_auto_20151213_1538'), - ] - - operations = [ - migrations.CreateModel( - name='PerfilEstruturalTextoArticulado', - fields=[ - ('id', models.AutoField( - auto_created=True, serialize=False, primary_key=True, - verbose_name='ID')), - ('sigla', models.CharField( - unique=True, max_length=10, verbose_name='Sigla')), - ('nome', models.CharField(max_length=50, verbose_name='Nome')), - ('padrao', models.BooleanField( - choices=[(True, 'Sim'), (False, 'Não')], default=False, - verbose_name='Padrão')), - ], - options={ - 'verbose_name_plural': 'Perfis Estruturais de' - ' Textos Articulados', - 'verbose_name': 'Perfil Estrutural de Texto Articulado', - 'ordering': ['-padrao', 'sigla'], - }, - ), - migrations.CreateModel( - name='TextoArticulado', - fields=[ - ('id', models.AutoField( - auto_created=True, - serialize=False, primary_key=True, verbose_name='ID')), - ('created', models.DateTimeField( - auto_now_add=True, verbose_name='created')), - ('modified', models.DateTimeField( - auto_now=True, verbose_name='modified')), - ('data', models.DateField( - blank=True, null=True, verbose_name='Data')), - ('ementa', models.TextField(verbose_name='Ementa')), - ('observacao', models.TextField( - blank=True, null=True, verbose_name='Observação')), - ('numero', models.PositiveIntegerField(verbose_name='Número')), - ('ano', models.PositiveSmallIntegerField(verbose_name='Ano')), - ], - options={ - 'verbose_name_plural': 'Textos Articulados', - 'verbose_name': 'Texto Articulado', - }, - ), - migrations.AlterModelOptions( - name='dispositivo', - options={'verbose_name_plural': 'Dispositivos', - 'verbose_name': 'Dispositivo'}, - ), - migrations.RemoveField( - model_name='publicacao', - name='norma', - ), - migrations.AlterField( - model_name='dispositivo', - name='visibilidade', - field=models.BooleanField(choices=[( - True, 'Sim'), (False, 'Não')], default=False, - verbose_name='Visibilidade no Texto Articulado Publicado'), - ), - migrations.AlterField( - model_name='tipodispositivorelationship', - name='perfil', - field=models.ForeignKey( - to='compilacao.PerfilEstruturalTextoArticulado'), - ), - migrations.AlterUniqueTogether( - name='dispositivo', - unique_together=set([]), - ), - migrations.DeleteModel( - name='PerfilEstruturalTextosNormativos', - ), - migrations.RemoveField( - model_name='dispositivo', - name='norma', - ), - migrations.RemoveField( - model_name='dispositivo', - name='norma_publicada', - ), - migrations.AddField( - model_name='dispositivo', - name='ta', - field=models.ForeignKey( - related_name='dispositivos_set', - verbose_name='Texto Articulado', - to='compilacao.TextoArticulado', default=1), - preserve_default=False, - ), - migrations.AddField( - model_name='dispositivo', - name='ta_publicado', - field=models.ForeignKey( - related_name='dispositivos_alterados_pelo_ta_set', blank=True, - verbose_name='Texto Articulado Publicado', - default=None, to='compilacao.TextoArticulado', null=True), - ), - migrations.AddField( - model_name='publicacao', - name='ta', - field=models.ForeignKey( - verbose_name='Texto Articulado', - to='compilacao.TextoArticulado', default=1), - preserve_default=False, - ), - ] diff --git a/compilacao/migrations/0033_auto_20151226_1320.py b/compilacao/migrations/0033_auto_20151226_1320.py new file mode 100644 index 000000000..db1b3b145 --- /dev/null +++ b/compilacao/migrations/0033_auto_20151226_1320.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0032_auto_20151213_1538'), + ] + + operations = [ + migrations.CreateModel( + name='PerfilEstruturalTextoArticulado', + fields=[ + ('id', models.AutoField(serialize=False, auto_created=True, primary_key=True, verbose_name='ID')), + ('sigla', models.CharField(unique=True, max_length=10, verbose_name='Sigla')), + ('nome', models.CharField(max_length=50, verbose_name='Nome')), + ('padrao', models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Padrão')), + ], + options={ + 'verbose_name_plural': 'Perfis Estruturais de Textos Articulados', + 'verbose_name': 'Perfil Estrutural de Texto Articulado', + 'ordering': ['-padrao', 'sigla'], + }, + ), + migrations.CreateModel( + name='TextoArticulado', + fields=[ + ('id', models.AutoField(serialize=False, auto_created=True, primary_key=True, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', models.DateTimeField(auto_now=True, verbose_name='modified')), + ('data', models.DateField(null=True, verbose_name='Data', blank=True)), + ('ementa', models.TextField(verbose_name='Ementa')), + ('observacao', models.TextField(null=True, verbose_name='Observação', blank=True)), + ('numero', models.PositiveIntegerField(verbose_name='Número')), + ('ano', models.PositiveSmallIntegerField(verbose_name='Ano')), + ('participacao_social', models.NullBooleanField(choices=[(None, 'Padrão definido no Tipo'), (True, 'Sim'), (False, 'Não')], default=None, verbose_name='Participação Social')), + ], + options={ + 'verbose_name_plural': 'Textos Articulados', + 'verbose_name': 'Texto Articulado', + 'ordering': ['-data', '-numero'], + }, + ), + migrations.CreateModel( + name='TipoTextoArticulado', + fields=[ + ('id', models.AutoField(serialize=False, auto_created=True, primary_key=True, verbose_name='ID')), + ('sigla', models.CharField(max_length=3, verbose_name='Sigla')), + ('descricao', models.CharField(max_length=50, verbose_name='Descrição')), + ('participacao_social', models.NullBooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Participação Social')), + ], + options={ + 'verbose_name_plural': 'Tipos de Texto Articulados', + 'verbose_name': 'Tipo de Texto Articulado', + }, + ), + migrations.AlterModelOptions( + name='dispositivo', + options={'verbose_name_plural': 'Dispositivos', 'verbose_name': 'Dispositivo', 'ordering': ['ta', 'ordem']}, + ), + migrations.RemoveField( + model_name='publicacao', + name='norma', + ), + migrations.AlterField( + model_name='dispositivo', + name='visibilidade', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Visibilidade no Texto Articulado Publicado'), + ), + migrations.AlterField( + model_name='tipodispositivorelationship', + name='perfil', + field=models.ForeignKey(to='compilacao.PerfilEstruturalTextoArticulado'), + ), + migrations.AlterUniqueTogether( + name='dispositivo', + unique_together=set([]), + ), + migrations.DeleteModel( + name='PerfilEstruturalTextosNormativos', + ), + migrations.AddField( + model_name='textoarticulado', + name='tipo_ta', + field=models.ForeignKey(to='compilacao.TipoTextoArticulado', default=None, blank=True, null=True, verbose_name='Tipo de Texto Articulado'), + ), + migrations.RemoveField( + model_name='dispositivo', + name='norma', + ), + migrations.RemoveField( + model_name='dispositivo', + name='norma_publicada', + ), + migrations.AddField( + model_name='dispositivo', + name='ta', + field=models.ForeignKey(default=1, to='compilacao.TextoArticulado', related_name='dispositivos_set', verbose_name='Texto Articulado'), + preserve_default=False, + ), + migrations.AddField( + model_name='dispositivo', + name='ta_publicado', + field=models.ForeignKey(to='compilacao.TextoArticulado', default=None, blank=True, null=True, related_name='dispositivos_alterados_pelo_ta_set', verbose_name='Texto Articulado Publicado'), + ), + migrations.AddField( + model_name='publicacao', + name='ta', + field=models.ForeignKey(default=1, to='compilacao.TextoArticulado', verbose_name='Texto Articulado'), + preserve_default=False, + ), + ] diff --git a/compilacao/migrations/0034_auto_20151222_1609.py b/compilacao/migrations/0034_auto_20151222_1609.py deleted file mode 100644 index f77cd2634..000000000 --- a/compilacao/migrations/0034_auto_20151222_1609.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('compilacao', '0033_auto_20151222_1608'), - ] - - operations = [ - migrations.AlterModelOptions( - name='dispositivo', - options={'ordering': ['ta', 'ordem'], 'verbose_name_plural': 'Dispositivos', 'verbose_name': 'Dispositivo'}, - ), - migrations.AlterUniqueTogether( - name='dispositivo', - unique_together=set([('ta', 'dispositivo0', 'dispositivo1', 'dispositivo2', 'dispositivo3', 'dispositivo4', 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', 'ta_publicado', 'publicacao'), ('ta', 'ordem')]), - ), - ] diff --git a/compilacao/migrations/0034_auto_20151226_1321.py b/compilacao/migrations/0034_auto_20151226_1321.py new file mode 100644 index 000000000..6f4c8f6d1 --- /dev/null +++ b/compilacao/migrations/0034_auto_20151226_1321.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0033_auto_20151226_1320'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='dispositivo', + unique_together=set([('ta', 'ordem'), ('ta', 'dispositivo0', 'dispositivo1', 'dispositivo2', 'dispositivo3', 'dispositivo4', 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', 'ta_publicado', 'publicacao')]), + ), + ] diff --git a/compilacao/migrations/0035_auto_20151223_1709.py b/compilacao/migrations/0035_auto_20151223_1709.py deleted file mode 100644 index 071cf3da5..000000000 --- a/compilacao/migrations/0035_auto_20151223_1709.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('compilacao', '0034_auto_20151222_1609'), - ] - - operations = [ - migrations.CreateModel( - name='TipoTextoArticulado', - fields=[ - ('id', models.AutoField(auto_created=True, serialize=False, primary_key=True, verbose_name='ID')), - ('sigla', models.CharField(max_length=3, verbose_name='Sigla')), - ('descricao', models.CharField(max_length=50, verbose_name='Descrição')), - ], - options={ - 'verbose_name_plural': 'Tipos de Texto Articulados', - 'verbose_name': 'Tipo de Texto Articulado', - }, - ), - migrations.AddField( - model_name='textoarticulado', - name='tipo_ta', - field=models.ForeignKey(to='compilacao.TipoTextoArticulado', default=1, verbose_name='Tipo de Texto Articulado'), - preserve_default=False, - ), - ] diff --git a/compilacao/migrations/0036_auto_20151224_1341.py b/compilacao/migrations/0036_auto_20151224_1341.py deleted file mode 100644 index a90b7861c..000000000 --- a/compilacao/migrations/0036_auto_20151224_1341.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('compilacao', '0035_auto_20151223_1709'), - ] - - operations = [ - migrations.AlterModelOptions( - name='textoarticulado', - options={'verbose_name': 'Texto Articulado', 'verbose_name_plural': 'Textos Articulados', 'ordering': ['-data', '-numero']}, - ), - migrations.AddField( - model_name='textoarticulado', - name='participacao_social', - field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], verbose_name='Participação Social', default=False), - ), - ] diff --git a/compilacao/migrations/0037_auto_20151224_1348.py b/compilacao/migrations/0037_auto_20151224_1348.py deleted file mode 100644 index 9e355c45e..000000000 --- a/compilacao/migrations/0037_auto_20151224_1348.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('compilacao', '0036_auto_20151224_1341'), - ] - - operations = [ - migrations.AlterField( - model_name='textoarticulado', - name='participacao_social', - field=models.NullBooleanField(verbose_name='Participação Social', choices=[(True, 'Sim'), (False, 'Não')], default=False), - ), - ] diff --git a/compilacao/migrations/0038_auto_20151224_1429.py b/compilacao/migrations/0038_auto_20151224_1429.py deleted file mode 100644 index 0e73bb987..000000000 --- a/compilacao/migrations/0038_auto_20151224_1429.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('compilacao', '0037_auto_20151224_1348'), - ] - - operations = [ - migrations.AddField( - model_name='tipotextoarticulado', - name='participacao_social', - field=models.NullBooleanField(default=False, verbose_name='Participação Social', choices=[(True, 'Sim'), (False, 'Não')]), - ), - migrations.AlterField( - model_name='textoarticulado', - name='participacao_social', - field=models.NullBooleanField(default=None, verbose_name='Participação Social', choices=[(None, 'Padrão definido no Tipo'), (True, 'Sim'), (False, 'Não')]), - ), - ] diff --git a/compilacao/migrations/0039_auto_20151224_1846.py b/compilacao/migrations/0039_auto_20151224_1846.py deleted file mode 100644 index 51099c44f..000000000 --- a/compilacao/migrations/0039_auto_20151224_1846.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('compilacao', '0038_auto_20151224_1429'), - ] - - operations = [ - migrations.AlterField( - model_name='textoarticulado', - name='tipo_ta', - field=models.ForeignKey(default=None, null=True, to='compilacao.TipoTextoArticulado', blank=True, verbose_name='Tipo de Texto Articulado'), - ), - ] diff --git a/compilacao/urls.py b/compilacao/urls.py index f6bde1928..15232998b 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -12,7 +12,7 @@ urlpatterns_compilacao = [ views.TaDeleteView.as_view(), name='ta_delete'), - url(r'^(?P[0-9]+)/text', + url(r'^(?P[0-9]+)/text$', views.TextoView.as_view(), name='ta_text'), url(r'^(?P[0-9]+)/text/vigencia/(?P.+)/$', views.TextoView.as_view(), name='ta_vigencia'), diff --git a/materia/urls.py b/materia/urls.py index 17cff8167..f081515a8 100644 --- a/materia/urls.py +++ b/materia/urls.py @@ -19,7 +19,6 @@ from materia.views import (AutoriaEditView, AutoriaView, materia_legislativa_patterns = materia_legislativa_crud.urlpatterns -# + __url__compilacao urlpatterns = [ diff --git a/norma/migrations/0009_auto_20151224_1637.py b/norma/migrations/0009_auto_20151224_1637.py deleted file mode 100644 index 5de7416b2..000000000 --- a/norma/migrations/0009_auto_20151224_1637.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('compilacao', '0038_auto_20151224_1429'), - ('norma', '0008_normajuridica_texto_integral'), - ] - - operations = [ - migrations.AlterModelOptions( - name='normajuridica', - options={'verbose_name': 'Norma Jurídica', 'verbose_name_plural': 'Normas Jurídicas'}, - ), - migrations.RemoveField( - model_name='normajuridica', - name='ano', - ), - migrations.RemoveField( - model_name='normajuridica', - name='data', - ), - migrations.RemoveField( - model_name='normajuridica', - name='ementa', - ), - migrations.RemoveField( - model_name='normajuridica', - name='id', - ), - migrations.RemoveField( - model_name='normajuridica', - name='numero', - ), - migrations.RemoveField( - model_name='normajuridica', - name='observacao', - ), - migrations.AddField( - model_name='normajuridica', - name='textoarticulado_ptr', - field=models.OneToOneField(to='compilacao.TextoArticulado', primary_key=True, parent_link=True, auto_created=True, default=1, serialize=False), - preserve_default=False, - ), - ] diff --git a/norma/models.py b/norma/models.py index cbbe1aeb4..66aefee18 100644 --- a/norma/models.py +++ b/norma/models.py @@ -2,7 +2,6 @@ from django.db import models from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ -from compilacao.models import TextoArticulado from materia.models import MateriaLegislativa from sapl.utils import YES_NO_CHOICES, make_choices @@ -62,7 +61,7 @@ def texto_upload_path(instance, filename): return get_norma_media_path(instance, instance.ano, filename) -class NormaJuridica(TextoArticulado): +class NormaJuridica(models.Model): ESFERA_FEDERACAO_CHOICES, ESTADUAL, FEDERAL, MUNICIPAL = make_choices( 'E', _('Estadual'), 'F', _('Federal'), @@ -75,10 +74,13 @@ class NormaJuridica(TextoArticulado): verbose_name=_('Texto Integral')) tipo = models.ForeignKey(TipoNormaJuridica, verbose_name=_('Tipo')) materia = models.ForeignKey(MateriaLegislativa, blank=True, null=True) + numero = models.PositiveIntegerField(verbose_name=_('Número')) + ano = models.PositiveSmallIntegerField(verbose_name=_('Ano')) esfera_federacao = models.CharField( max_length=1, verbose_name=_('Esfera Federação'), choices=ESFERA_FEDERACAO_CHOICES) + data = models.DateField(blank=True, null=True, verbose_name=_('Data')) data_publicacao = models.DateField( blank=True, null=True, verbose_name=_('Data Publicação')) veiculo_publicacao = models.CharField( @@ -90,8 +92,11 @@ class NormaJuridica(TextoArticulado): blank=True, null=True, verbose_name=_('Pg. Início')) pagina_fim_publicacao = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Pg. Fim')) + ementa = models.TextField(verbose_name=_('Ementa')) indexacao = models.TextField( blank=True, null=True, verbose_name=_('Indexação')) + observacao = models.TextField( + blank=True, null=True, verbose_name=_('Observação')) complemento = models.NullBooleanField( blank=True, verbose_name=_('Complementar ?'), choices=YES_NO_CHOICES) @@ -105,6 +110,7 @@ class NormaJuridica(TextoArticulado): class Meta: verbose_name = _('Norma Jurídica') verbose_name_plural = _('Normas Jurídicas') + ordering = ['-data', '-numero'] def __str__(self): return _('%(tipo)s nº %(numero)s de %(data)s') % { diff --git a/norma/urls.py b/norma/urls.py index 5d22d640e..fb3110513 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -5,7 +5,7 @@ from norma.views import (NormaIncluirView, assunto_norma_crud, norma_temporario_crud, tipo_norma_crud) -norma_url_patterns = norma_temporario_crud.urlpatterns + __url__compilacao +norma_url_patterns = norma_temporario_crud.urlpatterns # norma_url_patterns = norma_crud.urlpatterns + [] urlpatterns = [ diff --git a/sapl/settings.py b/sapl/settings.py index c3971715d..d2de6e1c1 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -105,7 +105,7 @@ WSGI_APPLICATION = 'sapl.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'sapl', + 'NAME': 'sapl_temp2_compilacao', 'USER': 'sapl', 'PASSWORD': 'sapl', 'HOST': 'localhost', diff --git a/templates/compilacao/text_list_bloco.html b/templates/compilacao/text_list_bloco.html index c07b56d01..26f908d46 100644 --- a/templates/compilacao/text_list_bloco.html +++ b/templates/compilacao/text_list_bloco.html @@ -152,9 +152,6 @@ {%endcomment%} {% endif %} - - - {% endfor %} {% endif %} @@ -163,7 +160,7 @@ {% endspaceless %} {% if view.is_ta_alterador and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} - {%with node=dpt template_name='compilacao/texto_list_blocoalteracao.html' %} + {%with node=dpt template_name='compilacao/text_list_blocoalteracao.html' %} {%include template_name%} {%endwith%} {% endif%} From 9b20e8ea3e69d3945e260c9073962403b071358c Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sat, 26 Dec 2015 18:35:40 -0200 Subject: [PATCH 12/21] =?UTF-8?q?Integra=C3=A7=C3=A3o=20com=20TextoArticul?= =?UTF-8?q?ado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Integração de NormaJuridica com TextoArticulado - Integração de Materia Legislativa com TextoArticulado --- compilacao/forms.py | 16 +- .../migrations/0035_auto_20151226_1349.py | 30 ++ .../migrations/0036_auto_20151226_1411.py | 19 + .../migrations/0037_auto_20151226_1414.py | 19 + .../0038_tipotextoarticulado_model.py | 19 + .../migrations/0039_auto_20151226_1433.py | 19 + compilacao/models.py | 26 +- compilacao/urls.py | 54 +-- compilacao/views.py | 327 +++++++++++++++++- compilacao/views2.py | 214 ------------ materia/urls.py | 8 +- materia/views.py | 89 +++-- norma/urls.py | 9 +- norma/views.py | 39 ++- sapl/settings.py | 4 +- static/js/compilacao_notas.js | 26 +- static/js/compilacao_view.js | 12 +- .../compilacao/{edit.html => text_edit.html} | 40 +-- .../{edit_bloco.html => text_edit_bloco.html} | 2 +- ...cao.html => text_edit_blocoalteracao.html} | 0 templates/compilacao/text_list.html | 21 +- .../compilacao/textoarticulado_detail.html | 45 +-- .../materia/materialegislativa_detail.html | 1 + templates/norma/normajuridica_detail.html | 14 +- 24 files changed, 676 insertions(+), 377 deletions(-) create mode 100644 compilacao/migrations/0035_auto_20151226_1349.py create mode 100644 compilacao/migrations/0036_auto_20151226_1411.py create mode 100644 compilacao/migrations/0037_auto_20151226_1414.py create mode 100644 compilacao/migrations/0038_tipotextoarticulado_model.py create mode 100644 compilacao/migrations/0039_auto_20151226_1433.py rename templates/compilacao/{edit.html => text_edit.html} (50%) rename templates/compilacao/{edit_bloco.html => text_edit_bloco.html} (98%) rename templates/compilacao/{edit_bloco_alteracao.html => text_edit_blocoalteracao.html} (100%) diff --git a/compilacao/forms.py b/compilacao/forms.py index e3e5b19f4..606691d28 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -218,11 +218,13 @@ class VideForm(ModelForm): queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()) - tipo_norma = forms.ModelChoiceField( - queryset=TipoNormaJuridica.objects.all(), + tipo_ta = forms.ModelChoiceField( + queryset=TipoTextoArticulado.objects.all(), required=False) - num_norma = forms.IntegerField(label=_('Núm. da Norma'), required=False) - ano_norma = forms.IntegerField(label=_('Ano da Norma'), required=False) + num_ta = forms.IntegerField( + label=_('Núm Texto Articulado'), required=False) + ano_ta = forms.IntegerField( + label=_('Ano Texto Articulado'), required=False) texto = forms.CharField( label='', @@ -280,9 +282,9 @@ class VideForm(ModelForm): ), 4)), to_column(( Div( - Div(to_column(('tipo_norma', 6))), - Div(to_column(('num_norma', 3)), - to_column(('ano_norma', 3))), + Div(to_column(('tipo_ta', 6))), + Div(to_column(('num_ta', 3)), + to_column(('ano_ta', 3))), Div(to_column( (Field( 'busca_dispositivo', diff --git a/compilacao/migrations/0035_auto_20151226_1349.py b/compilacao/migrations/0035_auto_20151226_1349.py new file mode 100644 index 000000000..ded460760 --- /dev/null +++ b/compilacao/migrations/0035_auto_20151226_1349.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import builtins + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('compilacao', '0034_auto_20151226_1321'), + ] + + operations = [ + migrations.AddField( + model_name='textoarticulado', + name='content_type', + field=models.ForeignKey( + to='contenttypes.ContentType', default=142), + preserve_default=False, + ), + migrations.AddField( + model_name='textoarticulado', + name='object_id', + field=models.PositiveIntegerField(default=1), + preserve_default=False, + ), + ] diff --git a/compilacao/migrations/0036_auto_20151226_1411.py b/compilacao/migrations/0036_auto_20151226_1411.py new file mode 100644 index 000000000..1ae7b9baf --- /dev/null +++ b/compilacao/migrations/0036_auto_20151226_1411.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0035_auto_20151226_1349'), + ] + + operations = [ + migrations.AlterField( + model_name='textoarticulado', + name='content_type', + field=models.ForeignKey(default=None, null=True, to='contenttypes.ContentType', blank=True), + ), + ] diff --git a/compilacao/migrations/0037_auto_20151226_1414.py b/compilacao/migrations/0037_auto_20151226_1414.py new file mode 100644 index 000000000..5420d7917 --- /dev/null +++ b/compilacao/migrations/0037_auto_20151226_1414.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0036_auto_20151226_1411'), + ] + + operations = [ + migrations.AlterField( + model_name='textoarticulado', + name='object_id', + field=models.PositiveIntegerField(blank=True, default=None, null=True), + ), + ] diff --git a/compilacao/migrations/0038_tipotextoarticulado_model.py b/compilacao/migrations/0038_tipotextoarticulado_model.py new file mode 100644 index 000000000..561196e71 --- /dev/null +++ b/compilacao/migrations/0038_tipotextoarticulado_model.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0037_auto_20151226_1414'), + ] + + operations = [ + migrations.AddField( + model_name='tipotextoarticulado', + name='model', + field=models.CharField(max_length=50, blank=True, default='', null=True, verbose_name='Modelagem Django'), + ), + ] diff --git a/compilacao/migrations/0039_auto_20151226_1433.py b/compilacao/migrations/0039_auto_20151226_1433.py new file mode 100644 index 000000000..807711408 --- /dev/null +++ b/compilacao/migrations/0039_auto_20151226_1433.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0038_tipotextoarticulado_model'), + ] + + operations = [ + migrations.AlterField( + model_name='tipotextoarticulado', + name='model', + field=models.CharField(verbose_name='Modelagem Django', default='', blank=True, null=True, max_length=50, unique=True), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 908effd82..9fc246519 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,6 +1,8 @@ from datetime import datetime from django.contrib.auth.models import User +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import F, Q from django.db.models.aggregates import Max @@ -61,6 +63,12 @@ class BaseModel(models.Model): class TipoTextoArticulado(models.Model): sigla = models.CharField(max_length=3, verbose_name=_('Sigla')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) + model = models.CharField( + default='', + blank=True, null=True, + max_length=50, + unique=True, + verbose_name=_('Modelagem Django')) participacao_social = models.NullBooleanField( default=False, blank=True, null=True, @@ -98,16 +106,26 @@ class TextoArticulado(TimestampedMixin): choices=PARTICIPACAO_SOCIAL_CHOICES, verbose_name=_('Participação Social')) + content_type = models.ForeignKey( + ContentType, + blank=True, null=True, default=None) + object_id = models.PositiveIntegerField( + blank=True, null=True, default=None) + content_object = GenericForeignKey('content_type', 'object_id') + class Meta: verbose_name = _('Texto Articulado') verbose_name_plural = _('Textos Articulados') ordering = ['-data', '-numero'] def __str__(self): - return _('Texto Articulado nº %(numero)s de %(data)s') % { - 'tipo': self.tipo_ta, - 'numero': self.numero, - 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} + if self.content_object: + return str(self.content_object) + else: + return _('Texto Articulado nº %(numero)s de %(data)s') % { + 'tipo': self.tipo_ta, + 'numero': self.numero, + 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} class TipoNota(models.Model): diff --git a/compilacao/urls.py b/compilacao/urls.py index 15232998b..109e7583a 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -13,55 +13,59 @@ urlpatterns_compilacao = [ url(r'^(?P[0-9]+)/text$', - views.TextoView.as_view(), name='ta_text'), + views.TextView.as_view(), name='ta_text'), url(r'^(?P[0-9]+)/text/vigencia/(?P.+)/$', - views.TextoView.as_view(), name='ta_vigencia'), -] + views.TextView.as_view(), name='ta_vigencia'), -urlpatterns = [ - url(r'^ta/', include(urlpatterns_compilacao)), -] + url(r'^(?P[0-9]+)/text/edit', + views.TextEditView.as_view(), name='ta_text_edit'), -""" - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', + url(r'^(?P[0-9]+)/text/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), - - - url(r'^(?P[0-9]+)/compilacao/edit', - views.CompilacaoEditView.as_view(), name='comp_edit'), - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/refresh', - views.DispositivoEditView.as_view(), name='dispositivo_edit'), - - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/actions', - views.ActionsEditView.as_view(), name='dispositivo_actions'), - - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/text/' '(?P[0-9]+)/nota/create$', views.NotasCreateView.as_view(), name='nota_create'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/text/' '(?P[0-9]+)/nota/(?P[0-9]+)/edit$', views.NotasEditView.as_view(), name='nota_edit'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/text/' '(?P[0-9]+)/nota/(?P[0-9]+)/delete$', views.NotasDeleteView.as_view(), name='nota_delete'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/text/' '(?P[0-9]+)/vide/create$', views.VideCreateView.as_view(), name='vide_create'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/text/' '(?P[0-9]+)/vide/(?P[0-9]+)/edit$', views.VideEditView.as_view(), name='vide_edit'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/text/' '(?P[0-9]+)/vide/(?P[0-9]+)/delete$', views.VideDeleteView.as_view(), name='vide_delete'), - url(r'^(?P[0-9]+)/compilacao/search$', + url(r'^(?P[0-9]+)/text/search$', views.DispositivoSearchFragmentFormView.as_view(), name='search_dispositivo'), +] + +urlpatterns = [ + url(r'^ta/', include(urlpatterns_compilacao)), +] + + +""" + + + + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/refresh', + views.DispositivoEditView.as_view(), name='dispositivo_edit'), + + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/actions', + views.ActionsEditView.as_view(), name='dispositivo_actions'), + """ diff --git a/compilacao/views.py b/compilacao/views.py index 50105e1dd..a98be81e2 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -104,7 +104,7 @@ class TaDeleteView(DeleteView): return reverse_lazy('ta_list') -class TextoView(ListView): +class TextView(ListView): template_name = 'compilacao/text_list.html' flag_alteradora = -1 @@ -118,7 +118,10 @@ class TextoView(ListView): fim_vigencia = None def get_context_data(self, **kwargs): - context = super(TextoView, self).get_context_data(**kwargs) + context = super(TextView, self).get_context_data(**kwargs) + + context['object'] = TextoArticulado.objects.get( + pk=self.kwargs['ta_id']) cita = Vide.objects.filter( Q(dispositivo_base__ta_id=self.kwargs['ta_id'])).\ @@ -185,16 +188,7 @@ class TextoView(ListView): r = Dispositivo.objects.filter( ordem__gt=0, ta_id=self.kwargs['ta_id'], - ).select_related( - 'tipo_dispositivo', - 'ta_publicado', - 'ta', - 'dispositivo_atualizador', - 'dispositivo_atualizador__dispositivo_pai', - 'dispositivo_atualizador__dispositivo_pai__ta', - 'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta', - 'dispositivo_pai', - 'dispositivo_pai__tipo_dispositivo') + ).select_related(*DISPOSITIVO_SELECT_RELATED) return r @@ -264,7 +258,7 @@ class TextoView(ListView): return self.flag_alteradora > 0 -class DispositivoView(TextoView): +class DispositivoView(TextView): # template_name = 'compilacao/index.html' template_name = 'compilacao/text_list_bloco.html' @@ -298,3 +292,310 @@ class DispositivoView(TextoView): ta_id=self.kwargs['ta_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) return itens + + +class TextEditView(TextView): + + template_name = 'compilacao/text_edit.html' + + flag_alteradora = -1 + + flag_nivel_ini = 0 + flag_nivel_old = -1 + + pk_edit = 0 + pk_view = 0 + """ + def get(self, request, *args, **kwargs): + + self.object_list = self.get_queryset() + context = self.get_context_data( + object_list=self.object_list) + + return self.render_to_response(context)""" + + def get_queryset(self): + self.pk_edit = 0 + self.pk_view = 0 + + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + result = Dispositivo.objects.filter( + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + if not result.exists(): + + ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) + + td = TipoDispositivo.objects.filter(class_css='articulacao')[0] + a = Dispositivo() + a.nivel = 0 + a.ordem = Dispositivo.INTERVALO_ORDEM + a.ordem_bloco_atualizador = 0 + a.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + a.ta = ta + a.tipo_dispositivo = td + a.inicio_vigencia = ta.data + a.inicio_eficacia = ta.data + a.timestamp = datetime.now() + a.save() + + td = TipoDispositivo.objects.filter(class_css='ementa')[0] + e = Dispositivo() + e.nivel = 1 + e.ordem = a.ordem + Dispositivo.INTERVALO_ORDEM + e.ordem_bloco_atualizador = 0 + e.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + e.ta = ta + e.tipo_dispositivo = td + e.inicio_vigencia = ta.data + e.inicio_eficacia = ta.data + e.timestamp = datetime.now() + e.texto = ta.ementa + e.dispositivo_pai = a + e.save() + + a.pk = None + a.nivel = 0 + a.ordem = e.ordem + Dispositivo.INTERVALO_ORDEM + a.ordem_bloco_atualizador = 0 + a.set_numero_completo([2, 0, 0, 0, 0, 0, ]) + a.timestamp = datetime.now() + a.save() + + result = Dispositivo.objects.filter( + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + return result + + def set_perfil_in_session(self, request=None, perfil_id=0): + if not request: + return None + + if perfil_id: + perfil = PerfilEstruturalTextoArticulado.objects.get( + pk=perfil_id) + request.session['perfil_estrutural'] = perfil.pk + else: + perfis = PerfilEstruturalTextoArticulado.objects.filter( + padrao=True)[:1] + + if not perfis.exists(): + request.session.pop('perfil_estrutural') + else: + request.session['perfil_estrutural'] = perfis[0].pk + + +class DispositivoSuccessUrlMixin(object): + + def get_success_url(self): + return reverse( + 'dispositivo', kwargs={ + 'ta_id': self.kwargs[ + 'ta_id'], + 'dispositivo_id': self.kwargs[ + 'dispositivo_id']}) + + +class NotaMixin(DispositivoSuccessUrlMixin): + + def get_modelo_nota(self, request): + if 'action' in request.GET and request.GET['action'] == 'modelo_nota': + tn = TipoNota.objects.get(pk=request.GET['id_tipo']) + return True, tn.modelo + return False, '' + + def get_initial(self): + dispositivo = get_object_or_404( + Dispositivo, pk=self.kwargs.get('dispositivo_id')) + initial = {'dispositivo': dispositivo} + + if 'pk' in self.kwargs: + initial['pk'] = self.kwargs.get('pk') + + return initial + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(NotaMixin, self).dispatch(*args, **kwargs) + + +class NotasCreateView(NotaMixin, CreateView): + template_name = 'compilacao/ajax_form.html' + form_class = forms.NotaForm + + def get(self, request, *args, **kwargs): + flag_action, modelo_nota = self.get_modelo_nota(request) + if flag_action: + return HttpResponse(modelo_nota) + + return super(NotasCreateView, self).get(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + try: + ta_id = kwargs.pop('ta_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.NotaForm(request.POST, request.FILES, **kwargs) + kwargs['ta_id'] = ta_id + kwargs['dispositivo_id'] = dispositivo_id + + if form.is_valid(): + nt = form.save(commit=False) + nt.owner_id = request.user.pk + nt.save() + self.kwargs['pk'] = nt.pk + return self.form_valid(form) + else: + return self.form_invalid(form) + except Exception as e: + print(e) + return HttpResponse("post") + + +class NotasEditView(NotaMixin, UpdateView): + model = Nota + template_name = 'compilacao/ajax_form.html' + form_class = forms.NotaForm + + def get(self, request, *args, **kwargs): + flag_action, modelo_nota = self.get_modelo_nota(request) + if flag_action: + return HttpResponse(modelo_nota) + + return super(NotasEditView, self).get(request, *args, **kwargs) + + +class NotasDeleteView(NotaMixin, TemplateView): + + def get(self, request, *args, **kwargs): + nt = Nota.objects.get(pk=self.kwargs['pk']) + nt.delete() + return HttpResponseRedirect(self.get_success_url()) + + +class VideMixin(DispositivoSuccessUrlMixin): + + def get_initial(self): + dispositivo_base = get_object_or_404( + Dispositivo, pk=self.kwargs.get('dispositivo_id')) + + initial = {'dispositivo_base': dispositivo_base} + + if 'pk' in self.kwargs: + initial['pk'] = self.kwargs.get('pk') + + return initial + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(VideMixin, self).dispatch(*args, **kwargs) + + +class VideCreateView(VideMixin, CreateView): + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm + + def post(self, request, *args, **kwargs): + try: + ta_id = kwargs.pop('ta_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.VideForm(request.POST, request.FILES, **kwargs) + kwargs['ta_id'] = ta_id + kwargs['dispositivo_id'] = dispositivo_id + + if form.is_valid(): + vd = form.save(commit=False) + vd.save() + self.kwargs['pk'] = vd.pk + return self.form_valid(form) + else: + return self.form_invalid(form) + except Exception as e: + print(e) + return HttpResponse("post") + + +class VideEditView(VideMixin, UpdateView): + model = Vide + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm + + +class VideDeleteView(VideMixin, TemplateView): + + def get(self, request, *args, **kwargs): + vd = Vide.objects.get(pk=self.kwargs['pk']) + vd.delete() + return HttpResponseRedirect(self.get_success_url()) + + +class DispositivoSearchFragmentFormView(ListView): + template_name = 'compilacao/dispositivo_search_fragment_form.html' + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super( + DispositivoSearchFragmentFormView, + self).dispatch(*args, **kwargs) + + def get_queryset(self): + try: + busca = '' + + if 'busca' in self.request.GET: + busca = self.request.GET['busca'] + + q = Q(nivel__gt=0) + busca = busca.split(' ') + n = 10 + + for item in busca: + + if not item: + continue + + if q: + q = q & (Q(dispositivo_pai__rotulo__icontains=item) | + Q(rotulo__icontains=item) | + Q(texto__icontains=item) | + Q(texto_atualizador__icontains=item)) + n = 50 + else: + q = (Q(dispositivo_pai__rotulo__icontains=item) | + Q(rotulo__icontains=item) | + Q(texto__icontains=item) | + Q(texto_atualizador__icontains=item)) + n = 50 + + if 'tipo_ta' in self.request.GET: + tipo_ta = self.request.GET['tipo_ta'] + if tipo_ta: + q = q & Q(ta__tipo_ta_id=tipo_ta) + n = 50 + + if 'num_ta' in self.request.GET: + num_ta = self.request.GET['num_ta'] + if num_ta: + q = q & Q(ta__numero=num_ta) + n = 50 + + if 'ano_ta' in self.request.GET: + ano_ta = self.request.GET['ano_ta'] + if ano_ta: + q = q & Q(ta__ano=ano_ta) + n = 50 + + if 'initial_ref' in self.request.GET: + initial_ref = self.request.GET['initial_ref'] + if initial_ref: + q = q & Q(pk=initial_ref) + n = 50 + + return Dispositivo.objects.filter(q)[:n] + + except Exception as e: + print(e) diff --git a/compilacao/views2.py b/compilacao/views2.py index c2068fda7..5afd1a3a0 100644 --- a/compilacao/views2.py +++ b/compilacao/views2.py @@ -1135,217 +1135,3 @@ class ActionsEditView(ActionsEditMixin, TemplateView): context['perfil_pk'] = self.request.session['perfil_estrutural'] return self.render_to_json_response(context, **response_kwargs) - - -class DispositivoSuccessUrlMixin(object): - - def get_success_url(self): - return reverse( - 'dispositivo', kwargs={ - 'ta_id': self.kwargs[ - 'ta_id'], - 'dispositivo_id': self.kwargs[ - 'dispositivo_id']}) - - -class NotaMixin(DispositivoSuccessUrlMixin): - - def get_modelo_nota(self, request): - # TODO: permitir edição apenas das notas do usuário conectado - # TODO: tratar revalidação no método post - # TODO: não mostrar botão de edição na interface - if 'action' in request.GET and request.GET['action'] == 'modelo_nota': - tn = TipoNota.objects.get(pk=request.GET['id_tipo']) - return True, tn.modelo - return False, '' - - def get_initial(self): - dispositivo = get_object_or_404( - Dispositivo, pk=self.kwargs.get('dispositivo_id')) - initial = {'dispositivo': dispositivo} - - if 'pk' in self.kwargs: - initial['pk'] = self.kwargs.get('pk') - - return initial - - @method_decorator(login_required) - def dispatch(self, *args, **kwargs): - return super(NotaMixin, self).dispatch(*args, **kwargs) - - -class NotasCreateView(NotaMixin, CreateView): - template_name = 'compilacao/ajax_form.html' - form_class = forms.NotaForm - - def get(self, request, *args, **kwargs): - flag_action, modelo_nota = self.get_modelo_nota(request) - if flag_action: - return HttpResponse(modelo_nota) - - return super(NotasCreateView, self).get(request, *args, **kwargs) - - def post(self, request, *args, **kwargs): - try: - ta_id = kwargs.pop('ta_id') - dispositivo_id = kwargs.pop('dispositivo_id') - form = forms.NotaForm(request.POST, request.FILES, **kwargs) - kwargs['ta_id'] = ta_id - kwargs['dispositivo_id'] = dispositivo_id - - if form.is_valid(): - nt = form.save(commit=False) - nt.owner_id = request.user.pk - nt.save() - self.kwargs['pk'] = nt.pk - return self.form_valid(form) - else: - return self.form_invalid(form) - except Exception as e: - print(e) - return HttpResponse("post") - - -class NotasEditView(NotaMixin, UpdateView): - model = Nota - template_name = 'compilacao/ajax_form.html' - form_class = forms.NotaForm - - def get(self, request, *args, **kwargs): - flag_action, modelo_nota = self.get_modelo_nota(request) - if flag_action: - return HttpResponse(modelo_nota) - - return super(NotasEditView, self).get(request, *args, **kwargs) - - -class NotasDeleteView(NotaMixin, TemplateView): - - def get(self, request, *args, **kwargs): - nt = Nota.objects.get(pk=self.kwargs['pk']) - nt.delete() - return HttpResponseRedirect(self.get_success_url()) - - -class VideMixin(DispositivoSuccessUrlMixin): - - def get_initial(self): - dispositivo_base = get_object_or_404( - Dispositivo, pk=self.kwargs.get('dispositivo_id')) - - initial = {'dispositivo_base': dispositivo_base} - - if 'pk' in self.kwargs: - initial['pk'] = self.kwargs.get('pk') - - return initial - - @method_decorator(login_required) - def dispatch(self, *args, **kwargs): - return super(VideMixin, self).dispatch(*args, **kwargs) - - -class VideCreateView(VideMixin, CreateView): - template_name = 'compilacao/ajax_form.html' - form_class = forms.VideForm - - def post(self, request, *args, **kwargs): - try: - ta_id = kwargs.pop('ta_id') - dispositivo_id = kwargs.pop('dispositivo_id') - form = forms.VideForm(request.POST, request.FILES, **kwargs) - kwargs['ta_id'] = ta_id - kwargs['dispositivo_id'] = dispositivo_id - - if form.is_valid(): - vd = form.save(commit=False) - vd.save() - self.kwargs['pk'] = vd.pk - return self.form_valid(form) - else: - return self.form_invalid(form) - except Exception as e: - print(e) - return HttpResponse("post") - - -class VideEditView(VideMixin, UpdateView): - model = Vide - template_name = 'compilacao/ajax_form.html' - form_class = forms.VideForm - - -class VideDeleteView(VideMixin, TemplateView): - - def get(self, request, *args, **kwargs): - vd = Vide.objects.get(pk=self.kwargs['pk']) - vd.delete() - return HttpResponseRedirect(self.get_success_url()) - - -class DispositivoSearchFragmentFormView(ListView): - template_name = 'compilacao/dispositivo_search_fragment_form.html' - - @method_decorator(login_required) - def dispatch(self, *args, **kwargs): - return super( - DispositivoSearchFragmentFormView, - self).dispatch(*args, **kwargs) - - def get_queryset(self): - try: - busca = '' - - if 'busca' in self.request.GET: - busca = self.request.GET['busca'] - - q = Q(nivel__gt=0) - busca = busca.split(' ') - n = 10 - - for item in busca: - - if not item: - continue - - if q: - q = q & (Q(dispositivo_pai__rotulo__icontains=item) | - Q(rotulo__icontains=item) | - Q(texto__icontains=item) | - Q(texto_atualizador__icontains=item)) - n = 50 - else: - q = (Q(dispositivo_pai__rotulo__icontains=item) | - Q(rotulo__icontains=item) | - Q(texto__icontains=item) | - Q(texto_atualizador__icontains=item)) - n = 50 - - if 'tipo_ta' in self.request.GET: - tipo_ta = self.request.GET['tipo_ta'] - if tipo_ta: - q = q & Q(ta__tipo_id=tipo_ta) - n = 50 - - if 'num_ta' in self.request.GET: - num_ta = self.request.GET['num_ta'] - if num_ta: - q = q & Q(ta__numero=num_ta) - n = 50 - - if 'ano_ta' in self.request.GET: - ano_ta = self.request.GET['ano_ta'] - if ano_ta: - q = q & Q(ta__ano=ano_ta) - n = 50 - - if 'initial_ref' in self.request.GET: - initial_ref = self.request.GET['initial_ref'] - if initial_ref: - q = q & Q(pk=initial_ref) - n = 50 - - return Dispositivo.objects.filter(q)[:n] - - except Exception as e: - print(e) diff --git a/materia/urls.py b/materia/urls.py index f081515a8..7876a613d 100644 --- a/materia/urls.py +++ b/materia/urls.py @@ -15,7 +15,8 @@ from materia.views import (AutoriaEditView, AutoriaView, regime_tramitacao_crud, status_tramitacao_crud, tipo_autor_crud, tipo_documento_crud, tipo_fim_relatoria_crud, tipo_materia_crud, - tipo_proposicao_crud, unidade_tramitacao_crud) + tipo_proposicao_crud, unidade_tramitacao_crud, + MateriaTaView) materia_legislativa_patterns = materia_legislativa_crud.urlpatterns @@ -26,6 +27,11 @@ urlpatterns = [ materia_legislativa_crud.namespace, materia_legislativa_crud.namespace)), + + url(r'^materia/(?P[0-9]+)/ta$', + MateriaTaView.as_view(), name='materia_ta'), + + url(r'^sistema/proposicoes/tipo/', include(tipo_proposicao_crud.urls)), url(r'^sistema/proposicoes/autor/', include(autor_crud.urls)), url(r'^sistema/materia/tipo/', include(tipo_materia_crud.urls)), diff --git a/materia/views.py b/materia/views.py index 49a918abd..4026f85a5 100644 --- a/materia/views.py +++ b/materia/views.py @@ -4,10 +4,11 @@ from re import sub from crispy_forms.helper import FormHelper from crispy_forms.layout import ButtonHolder, Column, Fieldset, Layout, Submit from django import forms +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, reverse_lazy from django.forms import ModelForm -from django.shortcuts import redirect +from django.shortcuts import redirect, get_object_or_404 from django.utils.html import strip_tags from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ @@ -15,11 +16,12 @@ from django.views.generic import ListView from django.views.generic.edit import FormMixin from vanilla import GenericView -import sapl from comissoes.models import Comissao, Composicao +from compilacao.models import TextoArticulado, TipoTextoArticulado from norma.models import LegislacaoCitada, NormaJuridica, TipoNormaJuridica from parlamentares.models import Parlamentar from sapl.crud import build_crud +import sapl from .models import (Anexada, Autor, Autoria, DespachoInicial, DocumentoAcessorio, MateriaLegislativa, Numeracao, Orgao, @@ -28,6 +30,7 @@ from .models import (Anexada, Autor, Autoria, DespachoInicial, TipoFimRelatoria, TipoMateriaLegislativa, TipoProposicao, Tramitacao, UnidadeTramitacao) + origem_crud = build_crud( Origem, 'origem', [ @@ -508,10 +511,10 @@ class MateriaAnexadaView(FormMixin, GenericView): error = 'A matéria a ser anexada não pode ser do mesmo \ tipo da matéria principal.' return self.render_to_response( - {'error': error, - 'form': form, - 'materialegislativa': mat_principal, - 'anexadas': anexadas}) + {'error': error, + 'form': form, + 'materialegislativa': mat_principal, + 'anexadas': anexadas}) anexada = Anexada() anexada.materia_principal = mat_principal @@ -527,17 +530,17 @@ class MateriaAnexadaView(FormMixin, GenericView): error = 'A matéria a ser anexada não existe no cadastro \ de matérias legislativas.' return self.render_to_response( - {'error': error, - 'form': form, - 'materialegislativa': mat_principal, - 'anexadas': anexadas}) + {'error': error, + 'form': form, + 'materialegislativa': mat_principal, + 'anexadas': anexadas}) return self.form_valid(form) else: return self.render_to_response( - {'form': form, - 'materialegislativa': mat_principal, - 'anexadas': anexadas}) + {'form': form, + 'materialegislativa': mat_principal, + 'anexadas': anexadas}) def get_success_url(self): pk = self.kwargs['pk'] @@ -615,14 +618,14 @@ class MateriaAnexadaEditView(FormMixin, GenericView): error = 'A matéria a ser anexada não existe no cadastro \ de matérias legislativas.' return self.render_to_response( - {'error': error, - 'form': form, - 'materialegislativa': mat_principal}) + {'error': error, + 'form': form, + 'materialegislativa': mat_principal}) else: return self.render_to_response( - {'form': form, - 'materialegislativa': mat_principal}) + {'form': form, + 'materialegislativa': mat_principal}) def get_success_url(self): pk = self.kwargs['pk'] @@ -1519,7 +1522,7 @@ class TramitacaoEditView(FormMixin, GenericView): if form.is_valid(): if 'excluir' in request.POST: if tramitacao == Tramitacao.objects.filter( - materia=materia).last(): + materia=materia).last(): tramitacao.delete() return self.form_valid(form) else: @@ -1765,7 +1768,7 @@ class ProposicaoForm(ModelForm): ButtonHolder( Submit('sumbmit', 'Salvar', css_class='button primary') - ), css_class='columns large-2')) + ), css_class='columns large-2')) self.helper = FormHelper() self.helper.layout = Layout( @@ -1836,7 +1839,7 @@ class ProposicaoListView(ListView): page_obj = context['page_obj'] context['page_range'] = sapl.crud.make_pagination( - page_obj.number, paginator.num_pages) + page_obj.number, paginator.num_pages) return context @@ -1907,7 +1910,7 @@ class MateriaLegislativaPesquisaForm(forms.Form): label='Tramitando', choices=em_tramitacao(), widget=forms.Select( - attrs={'class': 'selector'})) + attrs={'class': 'selector'})) # TODO: Verificar se esses campos estão corretos # assunto? # -> usado 'ementa' em 'assunto' @@ -1979,13 +1982,13 @@ class MateriaLegislativaPesquisaView(FormMixin, GenericView): if request.POST['data_apresentacao']: kwargs['data_apresentacao'] = datetime.strptime( - request.POST['data_apresentacao'], - '%d/%m/%Y').strftime('%Y-%m-%d') + request.POST['data_apresentacao'], + '%d/%m/%Y').strftime('%Y-%m-%d') if request.POST['data_publicacao']: kwargs['data_publicacao'] = datetime.strptime( - request.POST['data_publicacao'], - '%d/%m/%Y').strftime('%Y-%m-%d') + request.POST['data_publicacao'], + '%d/%m/%Y').strftime('%Y-%m-%d') if request.POST['tramitacao']: kwargs['em_tramitacao'] = request.POST['tramitacao'] @@ -2018,3 +2021,35 @@ class PesquisaMateriaListView(FormMixin, ListView): context['page_range'] = sapl.crud.make_pagination( page_obj.number, paginator.num_pages) return context + + +class MateriaTaView(GenericView): + + def get(self, *args, **kwargs): + materia = get_object_or_404(MateriaLegislativa, pk=kwargs['pk']) + related_object_type = ContentType.objects.get_for_model(materia) + + ta = TextoArticulado.objects.filter( + object_id=materia.pk, + content_type=related_object_type) + + if not ta.exists(): + tipo_ta = TipoTextoArticulado.objects.filter( + model=materia.__class__.__name__.lower())[:1] + + ta = TextoArticulado() + + if tipo_ta.exists(): + ta.tipo_ta = tipo_ta[0] + + ta.ementa = materia.ementa + ta.numero = materia.numero + ta.ano = materia.ano + ta.data = materia.data_apresentacao + ta.content_object = materia + ta.save() + + else: + ta = ta[0] + + return redirect(to=reverse_lazy('ta_text', kwargs={'ta_id': ta.pk})) diff --git a/norma/urls.py b/norma/urls.py index fb3110513..a63322ad3 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,8 +1,10 @@ from django.conf.urls import include, url -from compilacao.urls import urlpatterns as __url__compilacao +from compilacao.urls import urlpatterns as __url__compilacao,\ + urlpatterns_compilacao from norma.views import (NormaIncluirView, assunto_norma_crud, - norma_temporario_crud, tipo_norma_crud) + norma_temporario_crud, tipo_norma_crud, + NormaTaView) norma_url_patterns = norma_temporario_crud.urlpatterns @@ -13,6 +15,9 @@ urlpatterns = [ norma_temporario_crud.namespace, norma_temporario_crud.namespace)), + url(r'^norma/(?P[0-9]+)/ta$', + NormaTaView.as_view(), name='norma_ta'), + 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 11f4cffe7..3ed76f691 100644 --- a/norma/views.py +++ b/norma/views.py @@ -4,14 +4,19 @@ from re import sub from crispy_forms.helper import FormHelper from crispy_forms.layout import ButtonHolder, Fieldset, Layout, Submit from django import forms +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist +from django.core.urlresolvers import reverse_lazy from django.forms import ModelForm +from django.shortcuts import get_object_or_404, redirect from django.utils.html import strip_tags from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ +from django.views.generic.base import RedirectView from django.views.generic.edit import FormMixin from vanilla import GenericView +from compilacao.models import TextoArticulado, TipoTextoArticulado from materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.crud import build_crud import sapl @@ -60,7 +65,7 @@ norma_temporario_crud = build_crud( NormaJuridica, 'normajuridica', [ [_('Identificação Básica'), - [('tipo_ta', 3), ('tipo', 3), ('numero', 2), ('ano', 2), ('data', 2)], + [('tipo', 5), ('numero', 2), ('ano', 2), ('data', 3)], [('ementa', 12)]], ]) @@ -219,3 +224,35 @@ class NormaIncluirView(FormMixin, GenericView): return self.form_valid(form) else: return self.form_invalid(form) + + +class NormaTaView(GenericView): + + def get(self, *args, **kwargs): + norma = get_object_or_404(NormaJuridica, pk=kwargs['pk']) + related_object_type = ContentType.objects.get_for_model(norma) + + ta = TextoArticulado.objects.filter( + object_id=norma.pk, + content_type=related_object_type) + + if not ta.exists(): + tipo_ta = TipoTextoArticulado.objects.filter( + model=norma.__class__.__name__.lower())[:1] + + ta = TextoArticulado() + + if tipo_ta.exists(): + ta.tipo_ta = tipo_ta[0] + + ta.ementa = norma.ementa + ta.numero = norma.numero + ta.ano = norma.ano + ta.data = norma.data + ta.content_object = norma + ta.save() + + else: + ta = ta[0] + + return redirect(to=reverse_lazy('ta_text', kwargs={'ta_id': ta.pk})) diff --git a/sapl/settings.py b/sapl/settings.py index d2de6e1c1..18ec530fa 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -59,8 +59,8 @@ INSTALLED_APPS = ( 'crispy_forms_foundation', 'sass_processor', ) -# if DEBUG: -# INSTALLED_APPS += ('debug_toolbar',) +if DEBUG: + INSTALLED_APPS += ('debug_toolbar',) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/static/js/compilacao_notas.js b/static/js/compilacao_notas.js index 4c6a09bda..8d1168acd 100644 --- a/static/js/compilacao_notas.js +++ b/static/js/compilacao_notas.js @@ -21,7 +21,7 @@ function onEventsDneExec(pk) { $('#dne'+pk+" select[name='tipo']").change(function(event) { var url = ''; - url = 'compilacao/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value; + url = 'text/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value; $.get(url).done(function( data ) { $('#dne'+pk+" textarea[name='texto']").val(data); }); @@ -40,9 +40,9 @@ function onEventsDneExec(pk) { onChangeParamNorma(); } var onChangeParamNorma = function(event) { - var tipo_norma = $("select[name='tipo_norma']").val(); - var num_norma = $("input[name='num_norma']").val(); - var ano_norma = $("input[name='ano_norma']").val(); + var tipo_ta = $("select[name='tipo_ta']").val(); + var num_ta = $("input[name='num_ta']").val(); + var ano_ta = $("input[name='ano_ta']").val(); var busca_dispositivo = $("input[name='busca_dispositivo']").val(); var dispositivo_ref = $("#id_dispositivo_ref").val(); $('#id_dispositivo_ref').remove(); @@ -51,18 +51,18 @@ var onChangeParamNorma = function(event) { dispositivo_ref = '' var url = ''; - var pk = $("select[name='tipo_norma']").closest('.dne').attr('pk') + var pk = $("select[name='tipo_ta']").closest('.dne').attr('pk') var formData = { - 'tipo_norma' : tipo_norma, - 'num_norma' : num_norma, - 'ano_norma' : ano_norma, + 'tipo_ta' : tipo_ta, + 'num_ta' : num_ta, + 'ano_ta' : ano_ta, 'busca' : busca_dispositivo, 'tipo_form' : 'radio', 'initial_ref' : dispositivo_ref }; - url = 'compilacao/search'; + url = 'text/search'; $('.container-busca').html(''); insertWaitAjax('.container-busca') $.get(url, formData).done(function( data ) { @@ -85,7 +85,7 @@ var onSubmitEditForm = function(event) { } id_edit = $('#id_pk').val(); - url = 'compilacao/'+id_dispositivo+'/'+model+'/' + url = 'text/'+id_dispositivo+'/'+model+'/' if (id_edit == null || id_edit == '') url += 'create'; else @@ -119,7 +119,7 @@ var onDelete = function(event) { var id_dispositivo = $(event).closest('.dn').attr('pk'); var id_delete = $(event).attr('pk'); - var url = 'compilacao/'+id_dispositivo+'/'+model+'/'+id_delete+'/delete'; + var url = 'text/'+id_dispositivo+'/'+model+'/'+id_delete+'/delete'; $.get( url, function(data) { $('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data) @@ -140,12 +140,12 @@ function getForm(_this) { if (_this.className.indexOf('create') >= 0 ) { id_dispositivo = $(_this).attr('pk'); - url = 'compilacao/'+id_dispositivo+'/'+model+'/create'; + url = 'text/'+id_dispositivo+'/'+model+'/create'; } else if (_this.className.indexOf('edit') >= 0 ) { var id_edit = $(_this).attr('pk'); id_dispositivo = $(_this).closest('.dn').attr('pk'); - url = 'compilacao/'+id_dispositivo+'/'+model+'/'+id_edit+'/edit' + url = 'text/'+id_dispositivo+'/'+model+'/'+id_edit+'/edit' } $('#dne'+id_dispositivo).addClass('dne-nota'); diff --git a/static/js/compilacao_view.js b/static/js/compilacao_view.js index e02bd2471..55f474dd7 100644 --- a/static/js/compilacao_view.js +++ b/static/js/compilacao_view.js @@ -1,7 +1,7 @@ $( window ).scroll(function() { if (window.pageYOffset <= 180) $( "section.vigencias" ).removeClass("fixed"); - else if (!$( "section.vigencias" ).hasClass("fixed")) + else if ( ! $( "section.vigencias" ).hasClass("fixed") ) $( "section.vigencias" ).addClass("fixed"); }); @@ -41,7 +41,7 @@ function textoMultiVigente(item, diff) { for (var i = 0; i < ldpts.length; i++) { if ($(ldpts[i]).hasClass('displaynone')) continue; - if (isElementInViewport( ldpts[i])) { + if (isElementInViewport( ldpts[i])) { elv = ldpts[i]; break; } @@ -123,20 +123,20 @@ function textoVigente(item, link) { for (var i = 0; i < ldpts.length; i++) { if ($(ldpts[i]).hasClass('displaynone')) continue; - if (isElementInViewport( ldpts[i])) { + if (isElementInViewport( ldpts[i])) { elv = ldpts[i]; break; } } - + $(".cp .tipo-vigencias a").removeClass("selected") $(item).addClass("selected") - + $(".dptt.desativado").addClass("displaynone"); $(".link_alterador").removeClass("displaynone"); if (!link) $(".link_alterador").addClass("displaynone"); - + if (elv) { $('html, body').animate({ scrollTop: $(elv).parent().offset().top - 60 diff --git a/templates/compilacao/edit.html b/templates/compilacao/text_edit.html similarity index 50% rename from templates/compilacao/edit.html rename to templates/compilacao/text_edit.html index c544995d5..416c990a9 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/text_edit.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "compilacao/textoarticulado_detail.html" %} {% load i18n %} {% load compilacao_filters %} {% load staticfiles %} @@ -17,43 +17,19 @@

      Edição: {{ view.get_ta }} - {% trans 'Texto Multivigente' %}

      {% endblock %} -{% block base_content %} +{% block sections_nav %} +{% endblock %} + +{% block base_content %}{{block.super}} + {% block actions %}{% endblock %} + {% block detail_content %}{% endblock %}
      {% trans 'Aguarde... Atualizando informações!!!'%}
      - {% include 'compilacao/edit_bloco.html'%} + {% include 'compilacao/text_edit_bloco.html'%}
      - -{% if False %} -
      - {% csrf_token %} - - {% if message %} -
      - {{message}} - × -
      - {% endif %} - - -
      - {% trans 'Parser ODF' %} - {{ form.as_p }} - -
      - - -{% for parser in parser_list %} -
      - {{ parser|safe}} -
      -{% endfor %} -{% endif%} - - - {% endblock base_content %} diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/text_edit_bloco.html similarity index 98% rename from templates/compilacao/edit_bloco.html rename to templates/compilacao/text_edit_bloco.html index 1d53cece5..983f0a60d 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/text_edit_bloco.html @@ -116,7 +116,7 @@ {% endif %} {% endspaceless %} {% if view.is_ta_alterador and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} - {%with node=dpt template_name='compilacao/edit_bloco_alteracao.html' %} + {%with node=dpt template_name='compilacao/text_edit_blocoalteracao.html' %} {%include template_name%} {%endwith%} {% endif%} diff --git a/templates/compilacao/edit_bloco_alteracao.html b/templates/compilacao/text_edit_blocoalteracao.html similarity index 100% rename from templates/compilacao/edit_bloco_alteracao.html rename to templates/compilacao/text_edit_blocoalteracao.html diff --git a/templates/compilacao/text_list.html b/templates/compilacao/text_list.html index 1dbc71c46..150442c70 100644 --- a/templates/compilacao/text_list.html +++ b/templates/compilacao/text_list.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "compilacao/textoarticulado_detail.html" %} {% load i18n %} {% load compilacao_filters %} {% load staticfiles %} @@ -21,15 +21,24 @@

      {{ view.get_ta }}

      {% endblock %} -{% block base_content %} + +{% block sections_nav %}{{block.super}} +
      {% trans 'Edição do Texto' %}
      +{% endblock %} + +{% block base_content %}{{block.super}} + {% block actions %}{% endblock %} + {% block detail_content %}{% endblock %}
      -
      - a - A -
      + {% if object_list %} +
      + a + A +
      + {% endif %} {% for key, values in view.get_vigencias.items %} {% if forloop.first %} diff --git a/templates/compilacao/textoarticulado_detail.html b/templates/compilacao/textoarticulado_detail.html index afe849a8d..0aefd9bbd 100644 --- a/templates/compilacao/textoarticulado_detail.html +++ b/templates/compilacao/textoarticulado_detail.html @@ -1,4 +1,7 @@ -{% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} {% block base_content %} {# FIXME is this the best markup to use? #} +{% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} + +{% block base_content %} {# FIXME is this the best markup to use? #} +
      {% block actions %}
      - - - - + {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #} @@ -30,14 +29,23 @@
      -
      +

      {{ object.tipo_ta}}

      -
      + {% if object.content_object %} +
      +
      + +

      {{ object.content_object.tipo}}

      +
      +
      + {%endif%} + +

      {{ object.numero}}

      @@ -51,7 +59,7 @@
      -
      +

      {{ object.data}}

      @@ -69,8 +77,5 @@
      -
      - - - + {% endblock detail_content %} {% endblock base_content %} diff --git a/templates/materia/materialegislativa_detail.html b/templates/materia/materialegislativa_detail.html index 21b38fc09..ec4a3d8a8 100644 --- a/templates/materia/materialegislativa_detail.html +++ b/templates/materia/materialegislativa_detail.html @@ -12,5 +12,6 @@
      {% trans 'Numeração' %}
      {% trans 'Tramitação' %}
      {% trans 'Relatoria' %}
      +
      {% trans 'Texto' %}
      {% endblock sections_nav %} diff --git a/templates/norma/normajuridica_detail.html b/templates/norma/normajuridica_detail.html index 6cd1c0499..7d60e6fbc 100644 --- a/templates/norma/normajuridica_detail.html +++ b/templates/norma/normajuridica_detail.html @@ -1,7 +1,15 @@ {% extends "crud/detail.html" %} {% load i18n %} -{% block actions %} {% endblock %} +{% block actions %} + +{% endblock actions %} {% block sections_nav %} - + + {% endblock sections_nav %} From 77513ad63bf104e9797cd24b233f230bd6e387df Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sat, 26 Dec 2015 18:54:45 -0200 Subject: [PATCH 13/21] fix qa_check --- compilacao/forms.py | 11 +++++------ compilacao/templatetags/compilacao_filters.py | 1 - compilacao/urls.py | 3 --- compilacao/utils.py | 5 +---- compilacao/views.py | 17 +++++------------ compilacao/views2.py | 16 ++++++---------- materia/urls.py | 12 +++++------- materia/views.py | 5 ++--- norma/urls.py | 8 ++------ norma/views.py | 4 +--- sapl/settings.py | 2 +- sessao/views.py | 1 - 12 files changed, 28 insertions(+), 57 deletions(-) diff --git a/compilacao/forms.py b/compilacao/forms.py index 606691d28..1c6f59762 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -2,18 +2,17 @@ from crispy_forms.helper import FormHelper from crispy_forms_foundation.layout import (HTML, Column, Div, Fieldset, Layout, Row, Submit) -from crispy_forms_foundation.layout.buttons import Button, ButtonHolder +from crispy_forms_foundation.layout.buttons import Button from crispy_forms_foundation.layout.fields import Field from django import forms from django.core.exceptions import NON_FIELD_ERRORS from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ -from compilacao import utils, models -from compilacao.models import Dispositivo, Nota, TipoNota, TipoVide, Vide,\ - TextoArticulado, TipoTextoArticulado -from compilacao.utils import to_row, to_column, to_fieldsets -from norma.models import TipoNormaJuridica +from compilacao import models +from compilacao.models import (Dispositivo, Nota, TextoArticulado, TipoNota, + TipoTextoArticulado, TipoVide, Vide) +from compilacao.utils import to_column, to_fieldsets, to_row class UpLoadImportFileForm(forms.Form): diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 3934d7705..61e7353b2 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -154,7 +154,6 @@ def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0): return result - @register.simple_tag def verbose_name(instance, field_name): return instance._meta.get_field(field_name).verbose_name.title() diff --git a/compilacao/urls.py b/compilacao/urls.py index 109e7583a..933fcfebb 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -59,9 +59,6 @@ urlpatterns = [ """ - - - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/refresh', views.DispositivoEditView.as_view(), name='dispositivo_edit'), diff --git a/compilacao/utils.py b/compilacao/utils.py index b5a494ed8..244b27d55 100644 --- a/compilacao/utils.py +++ b/compilacao/utils.py @@ -1,7 +1,4 @@ -from crispy_forms_foundation.layout import (HTML, Column, Div, Fieldset, - Layout, Row, Submit) -from django.apps import apps -from django.contrib import admin +from crispy_forms_foundation.layout import Column, Fieldset, Row from django.utils.translation import ugettext_lazy as _ diff --git a/compilacao/views.py b/compilacao/views.py index a98be81e2..210aeb301 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,33 +1,26 @@ from collections import OrderedDict from datetime import datetime, timedelta -from os.path import sys from braces.views import FormMessagesMixin from django.contrib.auth.decorators import login_required -from django.contrib.messages.api import success from django.core.signing import Signer from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import Q -from django.http.response import (HttpResponse, HttpResponseRedirect, - JsonResponse) -from django.shortcuts import get_object_or_404, render +from django.http.response import HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404 from django.utils.dateparse import parse_date from django.utils.decorators import method_decorator -from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView from django.views.generic.detail import DetailView -from django.views.generic.edit import FormMixin, UpdateView, CreateView,\ - DeleteView +from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.views.generic.list import ListView from compilacao import forms, utils from compilacao.models import (Dispositivo, Nota, PerfilEstruturalTextoArticulado, - TipoDispositivo, TipoNota, TipoPublicacao, - TipoVide, VeiculoPublicacao, Vide, - TextoArticulado) - + TextoArticulado, TipoDispositivo, TipoNota, + Vide) DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', diff --git a/compilacao/views2.py b/compilacao/views2.py index 5afd1a3a0..33a90fd01 100644 --- a/compilacao/views2.py +++ b/compilacao/views2.py @@ -2,26 +2,22 @@ from collections import OrderedDict from datetime import datetime, timedelta from os.path import sys -from django.contrib.auth.decorators import login_required from django.core.signing import Signer -from django.core.urlresolvers import reverse from django.db.models import Q -from django.http.response import (HttpResponse, HttpResponseRedirect, - JsonResponse) -from django.shortcuts import get_object_or_404, render +from django.http.response import JsonResponse +from django.shortcuts import render from django.utils.dateparse import parse_date -from django.utils.decorators import method_decorator from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView -from django.views.generic.edit import FormMixin, UpdateView, CreateView +from django.views.generic.edit import FormMixin from django.views.generic.list import ListView from compilacao import forms from compilacao.models import (Dispositivo, Nota, PerfilEstruturalTextoArticulado, - TipoDispositivo, TipoNota, TipoPublicacao, - TipoVide, VeiculoPublicacao, Vide, - TextoArticulado) + TextoArticulado, TipoDispositivo, TipoNota, + TipoPublicacao, TipoVide, VeiculoPublicacao, + Vide) from sapl.crud import build_crud DISPOSITIVO_SELECT_RELATED = ( diff --git a/materia/urls.py b/materia/urls.py index 7876a613d..5768a807e 100644 --- a/materia/urls.py +++ b/materia/urls.py @@ -6,18 +6,16 @@ from materia.views import (AutoriaEditView, AutoriaView, FormularioCadastroView, FormularioSimplificadoView, LegislacaoCitadaEditView, LegislacaoCitadaView, MateriaAnexadaEditView, MateriaAnexadaView, - MateriaLegislativaPesquisaView, NumeracaoEditView, - NumeracaoView, PesquisaMateriaListView, - ProposicaoListView, ProposicaoView, - RelatoriaEditView, RelatoriaView, + MateriaLegislativaPesquisaView, MateriaTaView, + NumeracaoEditView, NumeracaoView, + PesquisaMateriaListView, ProposicaoListView, + ProposicaoView, RelatoriaEditView, RelatoriaView, TramitacaoEditView, TramitacaoView, autor_crud, materia_legislativa_crud, orgao_crud, origem_crud, regime_tramitacao_crud, status_tramitacao_crud, tipo_autor_crud, tipo_documento_crud, tipo_fim_relatoria_crud, tipo_materia_crud, - tipo_proposicao_crud, unidade_tramitacao_crud, - MateriaTaView) - + tipo_proposicao_crud, unidade_tramitacao_crud) materia_legislativa_patterns = materia_legislativa_crud.urlpatterns diff --git a/materia/views.py b/materia/views.py index 4026f85a5..aa21a2375 100644 --- a/materia/views.py +++ b/materia/views.py @@ -8,7 +8,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse, reverse_lazy from django.forms import ModelForm -from django.shortcuts import redirect, get_object_or_404 +from django.shortcuts import get_object_or_404, redirect from django.utils.html import strip_tags from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ @@ -16,12 +16,12 @@ from django.views.generic import ListView from django.views.generic.edit import FormMixin from vanilla import GenericView +import sapl from comissoes.models import Comissao, Composicao from compilacao.models import TextoArticulado, TipoTextoArticulado from norma.models import LegislacaoCitada, NormaJuridica, TipoNormaJuridica from parlamentares.models import Parlamentar from sapl.crud import build_crud -import sapl from .models import (Anexada, Autor, Autoria, DespachoInicial, DocumentoAcessorio, MateriaLegislativa, Numeracao, Orgao, @@ -30,7 +30,6 @@ from .models import (Anexada, Autor, Autoria, DespachoInicial, TipoFimRelatoria, TipoMateriaLegislativa, TipoProposicao, Tramitacao, UnidadeTramitacao) - origem_crud = build_crud( Origem, 'origem', [ diff --git a/norma/urls.py b/norma/urls.py index a63322ad3..862e535ed 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,11 +1,7 @@ from django.conf.urls import include, url -from compilacao.urls import urlpatterns as __url__compilacao,\ - urlpatterns_compilacao -from norma.views import (NormaIncluirView, assunto_norma_crud, - norma_temporario_crud, tipo_norma_crud, - NormaTaView) - +from norma.views import (NormaIncluirView, NormaTaView, assunto_norma_crud, + norma_temporario_crud, tipo_norma_crud) norma_url_patterns = norma_temporario_crud.urlpatterns # norma_url_patterns = norma_crud.urlpatterns + [] diff --git a/norma/views.py b/norma/views.py index 3ed76f691..90717e21a 100644 --- a/norma/views.py +++ b/norma/views.py @@ -12,19 +12,17 @@ from django.shortcuts import get_object_or_404, redirect from django.utils.html import strip_tags from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ -from django.views.generic.base import RedirectView from django.views.generic.edit import FormMixin from vanilla import GenericView +import sapl from compilacao.models import TextoArticulado, TipoTextoArticulado from materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.crud import build_crud -import sapl from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica, TipoNormaJuridica) - assunto_norma_crud = build_crud( AssuntoNorma, 'assunto_norma_juridica', [ diff --git a/sapl/settings.py b/sapl/settings.py index 18ec530fa..cc0b6ed57 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -105,7 +105,7 @@ WSGI_APPLICATION = 'sapl.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'sapl_temp2_compilacao', + 'NAME': 'sapl', 'USER': 'sapl', 'PASSWORD': 'sapl', 'HOST': 'localhost', diff --git a/sessao/views.py b/sessao/views.py index 275def8df..0193d31a1 100644 --- a/sessao/views.py +++ b/sessao/views.py @@ -25,7 +25,6 @@ from .models import (CargoMesa, ExpedienteMateria, ExpedienteSessao, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar) - tipo_sessao_crud = build_crud( TipoSessaoPlenaria, 'tipo_sessao_plenaria', [ From 37c1d5e37a659dd0bebc5094a2894ed562b5b1be Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sun, 27 Dec 2015 02:38:33 -0200 Subject: [PATCH 14/21] =?UTF-8?q?Conclus=C3=A3o=20da=20Issue=20#76?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compilacao/forms.py | 1 + compilacao/views.py | 8 ++- sapl/settings.py | 4 +- static/styles/compilacao.scss | 58 ++++++++++--------- .../dispositivo_search_fragment_form.html | 9 +-- templates/compilacao/text_list.html | 6 +- templates/compilacao/text_list_bloco.html | 24 +++----- 7 files changed, 52 insertions(+), 58 deletions(-) diff --git a/compilacao/forms.py b/compilacao/forms.py index 1c6f59762..6e387e29a 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -218,6 +218,7 @@ class VideForm(ModelForm): widget=forms.HiddenInput()) tipo_ta = forms.ModelChoiceField( + label='Tipo do Texto Articulado', queryset=TipoTextoArticulado.objects.all(), required=False) num_ta = forms.IntegerField( diff --git a/compilacao/views.py b/compilacao/views.py index 210aeb301..65f8ebb03 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -446,7 +446,7 @@ class NotasCreateView(NotaMixin, CreateView): return self.form_invalid(form) except Exception as e: print(e) - return HttpResponse("post") + return HttpResponse("error post") class NotasEditView(NotaMixin, UpdateView): @@ -489,11 +489,13 @@ class VideMixin(DispositivoSuccessUrlMixin): class VideCreateView(VideMixin, CreateView): + model = Vide template_name = 'compilacao/ajax_form.html' form_class = forms.VideForm - def post(self, request, *args, **kwargs): + def post_old(self, request, *args, **kwargs): try: + self.object = None ta_id = kwargs.pop('ta_id') dispositivo_id = kwargs.pop('dispositivo_id') form = forms.VideForm(request.POST, request.FILES, **kwargs) @@ -509,7 +511,7 @@ class VideCreateView(VideMixin, CreateView): return self.form_invalid(form) except Exception as e: print(e) - return HttpResponse("post") + return HttpResponse("error post") class VideEditView(VideMixin, UpdateView): diff --git a/sapl/settings.py b/sapl/settings.py index cc0b6ed57..c3971715d 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -59,8 +59,8 @@ INSTALLED_APPS = ( 'crispy_forms_foundation', 'sass_processor', ) -if DEBUG: - INSTALLED_APPS += ('debug_toolbar',) +# if DEBUG: +# INSTALLED_APPS += ('debug_toolbar',) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 5d8abca8a..42c33e747 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -1,7 +1,8 @@ $color_actions: #16407c; $color_actions_border: #CCC; +$color_buttons: #2980B9; + @mixin background-top-down($top, $bottom) { - background: $top; background-image: -webkit-linear-gradient(top, $top, $bottom); background-image: -moz-linear-gradient(top, $top, $bottom); background-image: -ms-linear-gradient(top, $top, $bottom); @@ -220,7 +221,7 @@ a:link:after, a:visited:after { font-size: 1.15em; float:left; .dptt { - z-index: 89; + z-index: 8; position: relative; } } @@ -383,16 +384,22 @@ a:link:after, a:visited:after { .dptt { .dne { text-decoration: none; - position: relative; + position: absolute; display: block; font-size: 0.8rem; font-weight: normal; line-height: 1rem; text-align: left; height: 0; - transform: scaleY(0); - transform-origin: top; + transform: scaleX(0); + transform-origin: right; transition: all 0.3s ease; + top: 0; + left: -1.6em; + right: -1.6em; + background-color: #2980b9; + z-index: 8; + * { font-size: 0.8rem; font-weight: normal; @@ -408,27 +415,22 @@ a:link:after, a:visited:after { clip: rect(0,0,0,0); opacity: 0; transition: opacity 1.5s linear, clip 1s linear; - transition-delay: 0s; border-collapse:separate; - border-spacing:0.5em; + border-spacing: 0; + top: 0px; + right: 0px; + z-index: 9; li { display: table-cell; + background-color: $color_buttons; a { - background-color: #DDD; - border-radius: 50%; - width: 3rem; - height: 3rem; + font-size: 155%; + padding: 0.4em 0.8em; display: inline-block; - font-size: 203%; - line-height: 3rem; - text-align: center; - &.btn-nota-create { - background: #ddd url(/static/img/hand-note.png) no-repeat 50% 50%; - } - &.btn-vide-create { - } + float: right; + color: #fff !important; &:hover { - background-color: #Cdc ; + background-color: rgba(0, 0, 0, 0.15); } } } @@ -437,12 +439,15 @@ a:link:after, a:visited:after { .dne-nota { box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23); @include background-top-down(#f5f5f5, #eee); - - transform: scaleY(1); + position: relative; + transform: scaleX(1); height: auto; - transition-delay: 0s; + left: 0; + right: 0; margin: 1em 0 2em 0; padding: 0em; + border: 0px; + z-index: 9; ul.btns-action { display: none; } @@ -590,15 +595,13 @@ a:link:after, a:visited:after { } &:hover { .dne { - height: 4.3em; - transform: scaleY(1); - transition-delay: 1s; + height: 0.1667rem; + transform: scaleX(1); ul.btns-action { clip: rect(-100px, 2000px, 2000px, -100px); opacity: 1; transition: opacity 0.5s linear, clip 0s 0.3s; - transition-delay: 0.5s; li { a { } @@ -606,7 +609,6 @@ a:link:after, a:visited:after { } } .dne-nota { - transition-delay: 0s; height: auto; } diff --git a/templates/compilacao/dispositivo_search_fragment_form.html b/templates/compilacao/dispositivo_search_fragment_form.html index 6de6ba32d..be999ad8d 100644 --- a/templates/compilacao/dispositivo_search_fragment_form.html +++ b/templates/compilacao/dispositivo_search_fragment_form.html @@ -14,8 +14,7 @@
        {% endifchanged %} - {% if dpt.is_relative_auto_insert and dpt.dispositivo_pai and dpt.dispositivo_pai.nivel != 0 %} - + {% if dpt.is_relative_auto_insert and dpt.dispositivo_pai.nivel != 0 %}
      • - {% endif%} - - {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao and not dpt.is_relative_auto_insert %} -
      • + {% elif not dpt.tipo_dispositivo.dispositivo_de_articulacao %} +
      • diff --git a/templates/compilacao/text_list.html b/templates/compilacao/text_list.html index 150442c70..cebee9566 100644 --- a/templates/compilacao/text_list.html +++ b/templates/compilacao/text_list.html @@ -11,9 +11,9 @@ - {# TODO: incluir javascript compilacao_notas apenas se houver usuário conectado e que possua permissão para cadastro de notas #} - - + {% if perms.compilacao.add_nota %} + + {% endif %} {% endblock %} diff --git a/templates/compilacao/text_list_bloco.html b/templates/compilacao/text_list_bloco.html index 26f908d46..6c614dd73 100644 --- a/templates/compilacao/text_list_bloco.html +++ b/templates/compilacao/text_list_bloco.html @@ -31,8 +31,8 @@ {% if perms.compilacao.add_nota or perms.compilacao.add_vide %}
        {# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#}
          - {% if perms.compilacao.add_nota %}
        •  
        • {% endif %} - {% if perms.compilacao.add_vide %}
        • V
        • {% endif %} + {% if perms.compilacao.add_nota %}
        • N
        • {% endif %} + {% if perms.compilacao.add_vide %}
        • V
        • {% endif %}
        @@ -68,7 +68,7 @@
      Vide:
      - {% if dpt.is_relative_auto_insert %} + {% if vide.dispositivo_ref.dispositivo_pai.nivel != 0 and vide.dispositivo_ref.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao %} {{ vide.dispositivo_ref.dispositivo_pai}} {% else %} {{ vide.dispositivo_ref}} @@ -80,6 +80,7 @@ {% endif %} {% if citado and citado|lookup:dpt.pk %} + {% if cita and cita|lookup:dpt.pk %}
    • {%endif%} {% for vide in citado|lookup:dpt.pk %} {%if not forloop.first %}
    • {%endif%}
    • @@ -90,7 +91,7 @@
      Citado em:
      - {% if dpt.is_relative_auto_insert %} + {% if vide.dispositivo_base.dispositivo_pai.nivel != 0 and vide.dispositivo_base.dispositivo_pai.tipo_dispositivo.dispositivo_de_articulacao%} {{ vide.dispositivo_base.dispositivo_pai}} {% else %} {{ vide.dispositivo_base}} @@ -98,13 +99,9 @@ {% if vide.texto %} - {{vide.texto}}{% endif %}
    • - {% endfor %} {% endif %} - - - {%if notas and dpt.pk in notas and dpt.pk in cita or dpt.pk in citado and notas%}
    • {%endif%} - + {%if notas and notas|lookup:dpt.pk and cita and cita|lookup:dpt.pk or notas and notas|lookup:dpt.pk and citado and citado|lookup:dpt.pk %}
    • {%endif%} {% if notas and notas|lookup:dpt.pk %} {% for nota in notas|lookup:dpt.pk %} @@ -131,16 +128,11 @@ {%if nota.titulo %}
      - {%if nota.url_externa %}{%endif%} - {{nota.titulo}} - - {%if nota.url_externa %}{%endif%} + {%if nota.url_externa %}{%endif%}{{nota.titulo}} - {%if nota.url_externa %}{%endif%}
      {%endif%} -
      - {%if nota.url_externa %}{%endif%} - {{ nota.texto}} - {%if nota.url_externa %}{%endif%} + {%if nota.url_externa %}{%endif%}{{ nota.texto}}{%if nota.url_externa %}{%endif%}
      {%comment%} From 7403bbbbba253b4d075e04d966f0508707b970d2 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sun, 27 Dec 2015 19:44:32 -0200 Subject: [PATCH 15/21] =?UTF-8?q?Conclus=C3=A3o=20da=20Issue=20#77?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compilacao/models.py | 2 +- compilacao/templatetags/compilacao_filters.py | 7 +- compilacao/urls.py | 20 +- compilacao/views.py | 805 ++++++++++++- compilacao/views2.py | 1043 +---------------- materia/views.py | 41 +- norma/models.py | 2 +- norma/views.py | 39 +- static/js/compilacao_edit.js | 2 +- static/styles/app.scss | 32 +- static/styles/compilacao.scss | 5 +- templates/base.html | 9 +- templates/compilacao/text_edit.html | 5 +- templates/compilacao/text_edit_bloco.html | 4 +- .../compilacao/text_edit_blocoalteracao.html | 2 +- templates/compilacao/text_list.html | 11 +- .../compilacao/textoarticulado_detail.html | 44 +- .../materia/materialegislativa_detail.html | 7 + templates/norma/normajuridica_detail.html | 15 +- templates/sistema.html | 10 - 20 files changed, 898 insertions(+), 1207 deletions(-) diff --git a/compilacao/models.py b/compilacao/models.py index 9fc246519..70cb373fd 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -122,7 +122,7 @@ class TextoArticulado(TimestampedMixin): if self.content_object: return str(self.content_object) else: - return _('Texto Articulado nº %(numero)s de %(data)s') % { + return _('%(tipo)s nº %(numero)s de %(data)s') % { 'tipo': self.tipo_ta, 'numero': self.numero, 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 61e7353b2..ed8eb757d 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -156,4 +156,9 @@ def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0): @register.simple_tag def verbose_name(instance, field_name): - return instance._meta.get_field(field_name).verbose_name.title() + return instance._meta.get_field(field_name).verbose_name + + +@register.filter +def urldetail_content_type(obj): + return '%s:detail' % obj.content_type.model diff --git a/compilacao/urls.py b/compilacao/urls.py index 933fcfebb..af134f869 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -11,7 +11,6 @@ urlpatterns_compilacao = [ url(r'^(?P[0-9]+)/delete$', views.TaDeleteView.as_view(), name='ta_delete'), - url(r'^(?P[0-9]+)/text$', views.TextView.as_view(), name='ta_text'), url(r'^(?P[0-9]+)/text/vigencia/(?P.+)/$', @@ -20,10 +19,17 @@ urlpatterns_compilacao = [ url(r'^(?P[0-9]+)/text/edit', views.TextEditView.as_view(), name='ta_text_edit'), - url(r'^(?P[0-9]+)/text/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), + url(r'^(?P[0-9]+)/text/(?P[0-9]+)/refresh', + views.DispositivoEditView.as_view(), name='dispositivo_edit'), + + url(r'^(?P[0-9]+)/text/(?P[0-9]+)/actions', + views.ActionsEditView.as_view(), name='dispositivo_actions'), + + + url(r'^(?P[0-9]+)/text/' '(?P[0-9]+)/nota/create$', views.NotasCreateView.as_view(), name='nota_create'), @@ -56,13 +62,3 @@ urlpatterns_compilacao = [ urlpatterns = [ url(r'^ta/', include(urlpatterns_compilacao)), ] - - -""" - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/refresh', - views.DispositivoEditView.as_view(), name='dispositivo_edit'), - - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/actions', - views.ActionsEditView.as_view(), name='dispositivo_actions'), - -""" diff --git a/compilacao/views.py b/compilacao/views.py index 65f8ebb03..1d45ef15e 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,13 +1,16 @@ +import sys from collections import OrderedDict from datetime import datetime, timedelta from braces.views import FormMessagesMixin from django.contrib.auth.decorators import login_required +from django.contrib.contenttypes.models import ContentType from django.core.signing import Signer from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import Q -from django.http.response import HttpResponse, HttpResponseRedirect -from django.shortcuts import get_object_or_404 +from django.http.response import (HttpResponse, HttpResponseRedirect, + JsonResponse) +from django.shortcuts import get_object_or_404, redirect from django.utils.dateparse import parse_date from django.utils.decorators import method_decorator from django.utils.translation import ugettext_lazy as _ @@ -20,7 +23,7 @@ from compilacao import forms, utils from compilacao.models import (Dispositivo, Nota, PerfilEstruturalTextoArticulado, TextoArticulado, TipoDispositivo, TipoNota, - Vide) + TipoTextoArticulado, Vide) DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', @@ -55,7 +58,13 @@ class TaDetailView(DetailView): @property def title(self): - return self.get_object() + if self.object.content_object: + return _( + 'Metadados para o Texto Articulado da %s - %s') % ( + self.get_object().content_object._meta.verbose_name_plural, + self.get_object().content_object) + else: + return self.get_object() class TaCreateView(FormMessagesMixin, CreateView): @@ -81,6 +90,10 @@ class TaUpdateView(UpdateView): def get_success_url(self): return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']}) + @property + def cancel_url(self): + return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']}) + class TaDeleteView(DeleteView): model = TextoArticulado @@ -97,6 +110,64 @@ class TaDeleteView(DeleteView): return reverse_lazy('ta_list') +class IntegracaoTaView(TemplateView): + + def get(self, *args, **kwargs): + item = get_object_or_404(self.model, pk=kwargs['pk']) + related_object_type = ContentType.objects.get_for_model(item) + + ta = TextoArticulado.objects.filter( + object_id=item.pk, + content_type=related_object_type) + + if not ta.exists(): + ta = TextoArticulado() + tipo_ta = TipoTextoArticulado.objects.filter( + model=item.__class__.__name__.lower())[:1] + if tipo_ta.exists(): + ta.tipo_ta = tipo_ta[0] + ta.content_object = item + else: + ta = ta[0] + + if hasattr(item, 'ementa') and item.ementa: + ta.ementa = item.ementa + else: + ta.ementa = 'Integração com %s sem ementa.' % item + + if hasattr(item, 'observacao') and item.observacao: + ta.observacao = item.observacao + else: + ta.observacao = 'Integração com %s sem observacao.' % item + + if hasattr(item, 'numero') and item.numero: + ta.numero = item.numero + else: + ta.numero = int('%s%s%s' % ( + int(datetime.now().year), + int(datetime.now().month), + int(datetime.now().day))) + + if hasattr(item, 'ano') and item.ano: + ta.ano = item.ano + else: + ta.ano = datetime.now().year + + if hasattr(item, 'data_apresentacao'): + ta.data = item.data_apresentacao + elif hasattr(item, 'data'): + ta.data = item.data + else: + ta.data = datetime.now() + + ta.save() + + return redirect(to=reverse_lazy('ta_text', kwargs={'ta_id': ta.pk})) + + class Meta: + abstract = True + + class TextView(ListView): template_name = 'compilacao/text_list.html' @@ -110,6 +181,45 @@ class TextView(ListView): inicio_vigencia = None fim_vigencia = None + def get(self, request, *args, **kwargs): + ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) + self.title = ta + if ta.content_object: + item = ta.content_object + self.title = item + if hasattr(item, 'ementa') and item.ementa: + ta.ementa = item.ementa + else: + ta.ementa = 'Integração com %s sem ementa.' % item + + if hasattr(item, 'observacao') and item.observacao: + ta.observacao = item.observacao + else: + ta.observacao = 'Integração com %s sem observacao.' % item + + if hasattr(item, 'numero') and item.numero: + ta.numero = item.numero + else: + ta.numero = int('%s%s%s' % ( + int(datetime.now().year), + int(datetime.now().month), + int(datetime.now().day))) + + if hasattr(item, 'ano') and item.ano: + ta.ano = item.ano + else: + ta.ano = datetime.now().year + + if hasattr(item, 'data_apresentacao'): + ta.data = item.data_apresentacao + elif hasattr(item, 'data'): + ta.data = item.data + else: + ta.data = datetime.now() + ta.save() + + return super(TextView, self).get(request, *args, **kwargs) + def get_context_data(self, **kwargs): context = super(TextView, self).get_context_data(**kwargs) @@ -288,7 +398,6 @@ class DispositivoView(TextView): class TextEditView(TextView): - template_name = 'compilacao/text_edit.html' flag_alteradora = -1 @@ -383,6 +492,692 @@ class TextEditView(TextView): request.session['perfil_estrutural'] = perfis[0].pk +class DispositivoEditView(TextEditView): + template_name = 'compilacao/text_edit_bloco.html' + + def post(self, request, *args, **kwargs): + + d = Dispositivo.objects.get( + pk=self.kwargs['dispositivo_id']) + + texto = request.POST['texto'] + + if d.texto != '': + d.texto = texto + d.save() + return self.get(request, *args, **kwargs) + d.texto = texto.strip() + d.save() + + if texto != '': + dnext = Dispositivo.objects.filter( + ta_id=d.ta_id, + ordem__gt=d.ordem, + texto='', + tipo_dispositivo__dispositivo_de_articulacao=False)[:1] + + if not dnext.exists(): + dnext = [] + dnext[0] = d + else: + + if dnext[0].nivel > d.nivel: + pais = [d.pk, ] + else: + if dnext[0].dispositivo_pai_id == d.dispositivo_pai_id: + pais = [dnext[0].dispositivo_pai_id, ] + else: + pais = [ + dnext[0].dispositivo_pai_id, + d.dispositivo_pai_id] + data = {'pk': dnext[0].pk, 'pai': pais} + else: + data = {'pk': d.pk, 'pai': [d.pk, ]} + + return JsonResponse(data, safe=False) + + def get_queryset_perfil_estrutural(self): + perfis = PerfilEstruturalTextoArticulado.objects.all() + return perfis + + def get(self, request, *args, **kwargs): + + try: + if 'perfil_pk' in request.GET: + self.set_perfil_in_session( + request, request.GET['perfil_pk']) + elif 'perfil_estrutural' not in request.session: + self.set_perfil_in_session(request=request) + + self.object_list = self.get_queryset() + + self.perfil_estrutural_list = self.get_queryset_perfil_estrutural() + + context = self.get_context_data( + object_list=self.object_list, + perfil_estrutural_list=self.perfil_estrutural_list + ) + except Exception as e: + print(e) + + return self.render_to_response(context) + + def get_queryset(self): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + try: + self.pk_edit = int(self.request.GET['edit']) + except: + self.pk_edit = 0 + self.pk_view = int(self.kwargs['dispositivo_id']) + + try: + if self.pk_edit == self.pk_view: + bloco = Dispositivo.objects.get( + pk=self.kwargs['dispositivo_id']) + else: + 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 + + if self.pk_edit == self.pk_view: + return [bloco, ] + + proximo_bloco = Dispositivo.objects.filter( + ordem__gt=bloco.ordem, + nivel__lte=bloco.nivel, + ta_id=self.kwargs['ta_id'])[:1] + + if proximo_bloco.count() == 0: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ordem__lt=proximo_bloco[0].ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + return itens + + def select_provaveis_inserts(self, request=None): + + try: + + if request and 'perfil_estrutural' not in request.session: + self.set_perfil_in_session(request) + + perfil_pk = request.session['perfil_estrutural'] + + # Não salvar d_base + if self.pk_edit == 0: + base = Dispositivo.objects.get(pk=self.pk_view) + else: + base = Dispositivo.objects.get(pk=self.pk_edit) + + prox_possivel = Dispositivo.objects.filter( + ordem__gt=base.ordem, + nivel__lte=base.nivel, + ta_id=base.ta_id)[:1] + + if prox_possivel.exists(): + prox_possivel = prox_possivel[0] + else: + prox_possivel = None + + result = [{'tipo_insert': 'Inserir Depois', + 'icone': '↷ ', + 'action': 'add_next', + 'itens': []}, + {'tipo_insert': 'Inserir Dentro', + 'icone': '⇲ ', + 'action': 'add_in', + 'itens': []}, + {'tipo_insert': 'Inserir Antes', + 'icone': '↶ ', + 'action': 'add_prior', + 'itens': []} + ] + + # Possíveis inserções sequenciais já existentes + parents = base.get_parents() + parents.insert(0, base) + nivel = sys.maxsize + for dp in parents: + + if dp.nivel >= nivel: + continue + + if dp.is_relative_auto_insert(perfil_pk): + continue + + if prox_possivel and \ + dp.tipo_dispositivo != base.tipo_dispositivo and\ + dp.nivel < prox_possivel.nivel and\ + not prox_possivel.tipo_dispositivo.permitido_inserir_in( + dp.tipo_dispositivo, + perfil_pk=perfil_pk): + + if dp.tipo_dispositivo != prox_possivel.tipo_dispositivo: + continue + + nivel = dp.nivel + + # um do mesmo para inserção antes + if dp == base: + result[2]['itens'].append({ + 'class_css': dp.tipo_dispositivo.class_css, + 'tipo_pk': dp.tipo_dispositivo.pk, + 'variacao': 0, + 'provavel': '%s (%s)' % ( + dp.rotulo_padrao(local_insert=1), + dp.tipo_dispositivo.nome,), + 'dispositivo_base': base.pk}) + + if dp.dispositivo_pai: + flag_pv = dp.tipo_dispositivo.permitido_variacao( + dp.dispositivo_pai.tipo_dispositivo, + perfil_pk=perfil_pk) + else: + flag_pv = False + + r = [] + flag_direcao = 1 + flag_variacao = 0 + while True: + if dp.dispositivo0 == 0: + local_insert = 1 + else: + local_insert = 0 + + rt = dp.transform_in_next(flag_direcao) + if not rt[0]: + break + flag_variacao += rt[1] + r.append({'class_css': dp.tipo_dispositivo.class_css, + 'tipo_pk': dp.tipo_dispositivo.pk, + 'variacao': flag_variacao, + 'provavel': '%s (%s)' % ( + dp.rotulo_padrao(local_insert), + dp.tipo_dispositivo.nome,), + 'dispositivo_base': base.pk}) + + flag_direcao = -1 + + r.reverse() + + if not flag_pv: + r = [r[0], ] + + if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \ + TipoDispositivo.FNCN: + r = [r[0], ] + + if dp.tipo_dispositivo == base.tipo_dispositivo: + result[0]['itens'] += r + else: + result[0]['itens'] += r + result[2]['itens'] += r + + if nivel == 0: + break + + # tipo do dispositivo base + tipb = base.tipo_dispositivo + + for paradentro in [1, 0]: + if paradentro: + # Outros Tipos de Dispositivos PARA DENTRO + otds = TipoDispositivo.objects.order_by( + '-contagem_continua', 'id').all() + else: + # Outros Tipos de Dispositivos PARA FORA + classes_ja_inseridas = [] + for c in result[0]['itens']: + if c['class_css'] not in classes_ja_inseridas: + classes_ja_inseridas.append(c['class_css']) + for c in result[1]['itens']: + if c['class_css'] not in classes_ja_inseridas: + classes_ja_inseridas.append(c['class_css']) + otds = TipoDispositivo.objects.order_by( + '-contagem_continua', 'id').all().exclude( + class_css__in=classes_ja_inseridas) + + for td in otds: + + if paradentro and not td.permitido_inserir_in( + tipb, + include_relative_autos=False, + perfil_pk=perfil_pk): + continue + + base.tipo_dispositivo = td + + if not paradentro: + + flag_insercao = False + for possivelpai in parents: + if td.permitido_inserir_in( + possivelpai.tipo_dispositivo, + include_relative_autos=False, + perfil_pk=perfil_pk): + flag_insercao = True + break + + if not flag_insercao: + continue + + if possivelpai.is_relative_auto_insert(perfil_pk): + continue + + if prox_possivel: + if prox_possivel.nivel == base.nivel: + if prox_possivel.tipo_dispositivo != td and\ + not prox_possivel.tipo_dispositivo.\ + permitido_inserir_in( + td, perfil_pk=perfil_pk): + continue + else: + if possivelpai.tipo_dispositivo != \ + prox_possivel.tipo_dispositivo and\ + not prox_possivel.tipo_dispositivo.\ + permitido_inserir_in( + possivelpai.tipo_dispositivo, + perfil_pk=perfil_pk) and \ + possivelpai.nivel < \ + prox_possivel.nivel: + continue + base.dispositivo_pai = possivelpai + Dispositivo.set_numero_for_add_in( + possivelpai, base, td) + else: + Dispositivo.set_numero_for_add_in(base, base, td) + + r = [{'class_css': td.class_css, + 'tipo_pk': td.pk, + 'variacao': 0, + 'provavel': '%s (%s)' % ( + base.rotulo_padrao(1, paradentro), + td.nome,), + 'dispositivo_base': base.pk}] + + if paradentro == 1: + """if (tipb.class_css == 'caput' and + td.class_css == 'paragrafo'): + result[0]['itens'].insert(0, r[0]) + else:""" + result[1]['itens'] += r + else: + result[2]['itens'] += r + result[0]['itens'] += r + + # if len(result[0]['itens']) < len(result[1]['itens']): + # r = result[0] + # result.remove(result[0]) + # result.insert(1, r) + + # remover temporariamente a opção inserir antes + # confirmar falta de necessidade + if len(result) > 2: + result.pop() + + except Exception as e: + print(e) + + return result + + +class ActionsEditMixin(object): + + def render_to_json_response(self, context, **response_kwargs): + + action = getattr(self, context['action']) + return JsonResponse(action(context), safe=False) + + def delete_item_dispositivo(self, context): + return self.delete_bloco_dispositivo(context) + + def delete_bloco_dispositivo(self, context): + base = Dispositivo.objects.get(pk=context['dispositivo_id']) + + base_anterior = Dispositivo.objects.order_by('-ordem').filter( + ta_id=base.ta_id, + ordem__lt=base.ordem + )[:1] + base.delete() + + if base_anterior.exists(): + if base_anterior[0].dispositivo_pai_id: + data = {'pk': base_anterior[0].pk, 'pai': [ + base_anterior[0].dispositivo_pai_id, ]} + else: + data = {'pk': base_anterior[0].pk, 'pai': [-1, ]} + return data + else: + return {} + + def add_prior(self, context): + return {} + + def add_in(self, context): + return self.add_next(context, local_add='add_in') + + def add_next(self, context, local_add='add_next'): + try: + base = Dispositivo.objects.get(pk=context['dispositivo_id']) + tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) + variacao = int(context['variacao']) + parents = [base, ] + base.get_parents() + + tipos_dp_auto_insert = tipo.filhos_permitidos.filter( + filho_de_insercao_automatica=True, + perfil_id=context['perfil_pk']) + + count_auto_insert = 0 + for tipoauto in tipos_dp_auto_insert: + qtdp = tipoauto.quantidade_permitida + if qtdp >= 0: + qtdp -= Dispositivo.objects.filter( + ta_id=base.ta_id, + tipo_dispositivo_id=tipoauto.filho_permitido.pk + ).count() + if qtdp > 0: + count_auto_insert += 1 + else: + count_auto_insert += 1 + + dp_irmao = None + dp_pai = None + for dp in parents: + if dp.tipo_dispositivo == tipo: + dp_irmao = dp + break + if tipo.permitido_inserir_in( + dp.tipo_dispositivo, + perfil_pk=context['perfil_pk']): + dp_pai = dp + break + dp_pai = dp + + if dp_irmao is not None: + dp = Dispositivo.new_instance_based_on(dp_irmao, tipo) + dp.transform_in_next(variacao) + else: + # Inserção sem precedente + dp = Dispositivo.new_instance_based_on(dp_pai, tipo) + dp.dispositivo_pai = dp_pai + dp.nivel += 1 + + if tipo.contagem_continua: + ultimo_irmao = Dispositivo.objects.order_by( + '-ordem').filter( + ordem__lte=base.ordem, + tipo_dispositivo_id=tipo.pk, + ta_id=base.ta_id)[:1] + + if not ultimo_irmao.exists(): + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + else: + ultimo_irmao = ultimo_irmao[0] + dp.set_numero_completo( + ultimo_irmao.get_numero_completo()) + dp.transform_in_next() + else: + if ';' in tipo.rotulo_prefixo_texto: + dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) + else: + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + + # verificar se existe restrição de quantidade de itens + if dp.dispositivo_pai: + pp = dp.tipo_dispositivo.possiveis_pais.filter( + pai_id=dp.dispositivo_pai.tipo_dispositivo_id, + perfil_id=context['perfil_pk']) + + if pp.exists() and pp[0].quantidade_permitida >= 0: + qtd_existente = Dispositivo.objects.filter( + ta_id=dp.ta_id, + tipo_dispositivo_id=dp.tipo_dispositivo_id).count() + + if qtd_existente >= pp[0].quantidade_permitida: + return {'pk': base.pk, + 'pai': [base.dispositivo_pai.pk, ], + 'alert': str(_('Limite de inserções de ' + 'dispositivos deste tipo ' + 'foi excedido.')) + } + + ordem = base.criar_espaco( + espaco_a_criar=1 + count_auto_insert, local=local_add) + + dp.rotulo = dp.rotulo_padrao() + dp.ordem = ordem + dp.incrementar_irmaos(variacao, [local_add, ]) + + dp.clean() + dp.save() + + dp_auto_insert = None + + # Inserção automática + if count_auto_insert: + dp_pk = dp.pk + dp.nivel += 1 + for tipoauto in tipos_dp_auto_insert: + dp.dispositivo_pai_id = dp_pk + dp.pk = None + dp.tipo_dispositivo = tipoauto.filho_permitido + if ';' in dp.tipo_dispositivo.rotulo_prefixo_texto: + dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) + else: + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + dp.rotulo = dp.rotulo_padrao() + dp.texto = '' + dp.ordem = dp.ordem + Dispositivo.INTERVALO_ORDEM + dp.clean() + dp.save() + dp_auto_insert = dp + dp = Dispositivo.objects.get(pk=dp_pk) + + ''' Reenquadrar todos os dispositivos que possuem pai + antes da inserção atual e que são inferiores a dp, + redirecionando para o novo pai''' + + nivel = sys.maxsize + flag_niveis = False + + if not dp.tipo_dispositivo.dispositivo_de_alteracao: + possiveis_filhos = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + ta_id=dp.ta_id) + + for filho in possiveis_filhos: + + if filho.nivel > nivel: + continue + + if filho.dispositivo_pai.ordem >= dp.ordem: + continue + + nivel = filho.nivel + + if not filho.tipo_dispositivo.permitido_inserir_in( + dp.tipo_dispositivo, + perfil_pk=context['perfil_pk']): + continue + + filho.dispositivo_pai = dp + filho.clean() + filho.save() + flag_niveis = True + + if flag_niveis: + dp.organizar_niveis() + + numtipos = {} + + ''' Renumerar filhos imediatos que + não possuam contagem continua''' + + if flag_niveis: + filhos = Dispositivo.objects.filter( + dispositivo_pai_id=dp.pk) + + for filho in filhos: + + if filho.tipo_dispositivo.contagem_continua: + continue + + if filho.tipo_dispositivo.class_css in numtipos: + if filho.dispositivo_substituido is None: + numtipos[filho.tipo_dispositivo.class_css] += 1 + else: + t = filho.tipo_dispositivo + prefixo = t.rotulo_prefixo_texto.split(';') + if len(prefixo) > 1: + count_irmaos_m_tipo = Dispositivo.objects.filter( + ~Q(pk=filho.pk), + tipo_dispositivo=t, + dispositivo_pai=filho.dispositivo_pai)[:1] + + if count_irmaos_m_tipo.exists(): + numtipos[filho.tipo_dispositivo.class_css] = 1 + else: + numtipos[filho.tipo_dispositivo.class_css] = 0 + else: + numtipos[filho.tipo_dispositivo.class_css] = 1 + + filho.dispositivo0 = numtipos[ + filho.tipo_dispositivo.class_css] + + filho.rotulo = filho.rotulo_padrao() + filho.clean() + filho.save() + + ''' Renumerar dispositivos de + contagem continua, caso a inserção seja uma articulação''' + + numtipos = {} + if dp.nivel == 0: + + proxima_articulacao = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + nivel=0, + ta_id=dp.ta_id)[:1] + + if not proxima_articulacao.exists(): + filhos_continuos = list(Dispositivo.objects.filter( + ordem__gt=dp.ordem, + ta_id=dp.ta_id, + tipo_dispositivo__contagem_continua=True)) + else: + filhos_continuos = list(Dispositivo.objects.filter( + Q(ordem__gt=dp.ordem) & + Q(ordem__lt=proxima_articulacao[0].ordem), + ta_id=dp.ta_id, + tipo_dispositivo__contagem_continua=True)) + + for filho in filhos_continuos: + + if filho.tipo_dispositivo.class_css in numtipos: + if filho.dispositivo_substituido is None: + numtipos[filho.tipo_dispositivo.class_css] += 1 + else: + t = filho.tipo_dispositivo + prefixo = t.rotulo_prefixo_texto.split(';') + if len(prefixo) > 1: + count_irmaos_m_tipo = Dispositivo.objects.filter( + ~Q(pk=filho.pk), + tipo_dispositivo=t, + dispositivo_pai=filho.dispositivo_pai)[:1] + + if count_irmaos_m_tipo.exists(): + numtipos[filho.tipo_dispositivo.class_css] = 1 + else: + numtipos[filho.tipo_dispositivo.class_css] = 0 + else: + numtipos[filho.tipo_dispositivo.class_css] = 1 + + filho.dispositivo0 = numtipos[ + filho.tipo_dispositivo.class_css] + + filho.rotulo = filho.rotulo_padrao() + filho.clean() + filho.save() + + except Exception as e: + print(e) + + if dp_auto_insert is None: + data = self.get_json_for_refresh(dp) + else: + data = self.get_json_for_refresh(dp=dp, dpauto=dp_auto_insert) + + return data + + def get_json_for_refresh(self, dp, dpauto=None): + + if dp.tipo_dispositivo.contagem_continua: + pais = [] + if dp.dispositivo_pai is None: + data = {'pk': dp.pk, 'pai': [-1, ]} + else: + pkfilho = dp.pk + dp = dp.dispositivo_pai + + proxima_articulacao = dp.get_proximo_nivel_zero() + + if proxima_articulacao is not None: + parents = Dispositivo.objects.filter( + ta_id=dp.ta_id, + ordem__gte=dp.ordem, + ordem__lt=proxima_articulacao.ordem, + nivel__lte=dp.nivel) + else: + parents = Dispositivo.objects.filter( + ta_id=dp.ta_id, + ordem__gte=dp.ordem, + nivel__lte=dp.nivel) + + nivel = sys.maxsize + for p in parents: + if p.nivel > nivel: + continue + pais.append(p.pk) + nivel = p.nivel + data = { + 'pk': pkfilho if not dpauto else dpauto.pk, 'pai': pais} + else: + data = {'pk': dp.pk if not dpauto else dpauto.pk, 'pai': [ + dp.dispositivo_pai.pk, ]} + + return data + + +class ActionsEditView(ActionsEditMixin, TemplateView): + + def render_to_response(self, context, **response_kwargs): + context['action'] = self.request.GET['action'] + + if 'tipo_pk' in self.request.GET: + context['tipo_pk'] = self.request.GET['tipo_pk'] + + if 'variacao' in self.request.GET: + context['variacao'] = self.request.GET['variacao'] + + if 'perfil_estrutural' in self.request.session: + context['perfil_pk'] = self.request.session['perfil_estrutural'] + + return self.render_to_json_response(context, **response_kwargs) + + class DispositivoSuccessUrlMixin(object): def get_success_url(self): diff --git a/compilacao/views2.py b/compilacao/views2.py index 33a90fd01..ab71973be 100644 --- a/compilacao/views2.py +++ b/compilacao/views2.py @@ -1,23 +1,8 @@ -from collections import OrderedDict -from datetime import datetime, timedelta -from os.path import sys - -from django.core.signing import Signer -from django.db.models import Q -from django.http.response import JsonResponse -from django.shortcuts import render -from django.utils.dateparse import parse_date from django.utils.translation import ugettext_lazy as _ -from django.views.generic.base import TemplateView -from django.views.generic.edit import FormMixin -from django.views.generic.list import ListView -from compilacao import forms -from compilacao.models import (Dispositivo, Nota, - PerfilEstruturalTextoArticulado, - TextoArticulado, TipoDispositivo, TipoNota, - TipoPublicacao, TipoVide, VeiculoPublicacao, - Vide) +from compilacao.models import (PerfilEstruturalTextoArticulado, + TipoDispositivo, TipoNota, TipoPublicacao, + TipoVide, VeiculoPublicacao) from sapl.crud import build_crud DISPOSITIVO_SELECT_RELATED = ( @@ -109,1025 +94,3 @@ tipo_dispositivo_crud = build_crud( ], ]) - - -class CompilacaoView(ListView): - template_name = 'compilacao/index.html' - - flag_alteradora = -1 - - flag_nivel_ini = 0 - flag_nivel_old = -1 - - itens_de_vigencia = {} - - inicio_vigencia = None - fim_vigencia = None - - def get_context_data(self, **kwargs): - context = super(CompilacaoView, self).get_context_data(**kwargs) - - cita = Vide.objects.filter( - Q(dispositivo_base__ta_id=self.kwargs['ta_id'])).\ - select_related( - 'dispositivo_ref', - 'dispositivo_ref__ta', - 'dispositivo_ref__dispositivo_pai', - 'dispositivo_ref__dispositivo_pai__ta', '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__ta_id=self.kwargs['ta_id'])).\ - select_related( - 'dispositivo_base', - 'dispositivo_base__ta', - 'dispositivo_base__dispositivo_pai', - 'dispositivo_base__dispositivo_pai__ta', '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__ta_id=self.kwargs['ta_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): - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - self.inicio_vigencia = None - self.fim_vigencia = None - if 'sign' in self.kwargs: - signer = Signer() - try: - string = signer.unsign(self.kwargs['sign']).split(',') - self.inicio_vigencia = parse_date(string[0]) - self.fim_vigencia = parse_date(string[1]) - except: - return{} - - return Dispositivo.objects.filter( - inicio_vigencia__lte=self.fim_vigencia, - ordem__gt=0, - ta_id=self.kwargs['ta_id'], - ).select_related(*DISPOSITIVO_SELECT_RELATED) - else: - - r = Dispositivo.objects.filter( - ordem__gt=0, - ta_id=self.kwargs['ta_id'], - ).select_related( - 'tipo_dispositivo', - 'ta_publicado', - 'ta', - 'dispositivo_atualizador', - 'dispositivo_atualizador__dispositivo_pai', - 'dispositivo_atualizador__dispositivo_pai__ta', - 'dispositivo_atualizador__dispositivo_pai__ta__tipo', - 'dispositivo_pai', - 'dispositivo_pai__tipo_dispositivo') - - return r - - def get_vigencias(self): - itens = Dispositivo.objects.filter( - ta_id=self.kwargs['ta_id'], - ).order_by( - 'inicio_vigencia' - ).distinct( - 'inicio_vigencia' - ).select_related( - 'ta_publicado', - 'ta', - 'ta_publicado__tipo', - 'ta__tipo',) - - ajuste_datas_vigencia = [] - - for item in itens: - ajuste_datas_vigencia.append(item) - - lenLista = len(ajuste_datas_vigencia) - for i in range(lenLista): - if i + 1 < lenLista: - ajuste_datas_vigencia[ - i].fim_vigencia = ajuste_datas_vigencia[ - i + 1].inicio_vigencia - timedelta(days=1) - else: - ajuste_datas_vigencia[i].fim_vigencia = None - - self.itens_de_vigencia = {} - - idx = -1 - length = len(ajuste_datas_vigencia) - for item in ajuste_datas_vigencia: - idx += 1 - if idx == 0: - self.itens_de_vigencia[0] = [item, ] - continue - - if idx + 1 < length: - ano = item.ta_publicado.ano - if ano in self.itens_de_vigencia: - self.itens_de_vigencia[ano].append(item) - else: - self.itens_de_vigencia[ano] = [item, ] - else: - self.itens_de_vigencia[9999] = [item, ] - - if len(self.itens_de_vigencia.keys()) <= 1: - return {} - - self.itens_de_vigencia = OrderedDict( - sorted(self.itens_de_vigencia.items(), key=lambda t: t[0])) - - return self.itens_de_vigencia - - def get_ta(self): - return TextoArticulado.objects.select_related('tipo').get( - pk=self.kwargs['ta_id']) - - def is_ta_alterador(self): - if self.flag_alteradora == -1: - self.flag_alteradora = Dispositivo.objects.select_related( - 'dispositivos_alterados_pelo_texto_articulado_set' - ).filter(ta_id=self.kwargs['ta_id']).count() - return self.flag_alteradora > 0 - - -class DispositivoView(CompilacaoView): - # template_name = 'compilacao/index.html' - template_name = 'compilacao/index_bloco.html' - - def get_queryset(self): - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - 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, - ta_id=self.kwargs['ta_id'])[:1] - - if proximo_bloco.count() == 0: - itens = Dispositivo.objects.filter( - ordem__gte=bloco.ordem, - ta_id=self.kwargs['ta_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - else: - itens = Dispositivo.objects.filter( - ordem__gte=bloco.ordem, - ordem__lt=proximo_bloco[0].ordem, - ta_id=self.kwargs['ta_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - return itens - - -def handle_uploaded_file(f, outfilepath): - with open(outfilepath, 'wb+') as destination: - for chunk in f.chunks(): - destination.write(chunk) - - -class CompilacaoEditView(CompilacaoView, FormMixin): - - template_name = 'compilacao/edit.html' - - flag_alteradora = -1 - - flag_nivel_ini = 0 - flag_nivel_old = -1 - - pk_edit = 0 - pk_view = 0 - - def post(self, request, *args, **kwargs): - form = forms.UpLoadImportFileForm(request.POST, request.FILES) - message = "Arquivo Submetido com sucesso" - - self.object_list = self.get_queryset() - - if form.is_valid(): - try: - f = request.FILES['import_file'] - outfilepath = '/tmp/' + f.name - handle_uploaded_file(f, outfilepath) - - # p = Parser() - # p.parser(outfilepath) - - except Exception as e: - print(e) - - context = self.get_context_data( - object_list=self.object_list, - form=form, - message=message, - view=self, - parser_list=[]) - return render(request, self.template_name, context) - else: - context = self.get_context_data( - object_list=self.object_list, - form=form, - message=form.errors, - view=self) - return self.form_invalid(context) - - return self.render_to_response({'form': form}) - - def form_invalid(self, context): - return self.render_to_response(context) - - def get(self, request, *args, **kwargs): - - self.object_list = self.get_queryset() - form_class = forms.UpLoadImportFileForm - self.form = self.get_form(form_class) - context = self.get_context_data( - object_list=self.object_list, - form=self.form) - - return self.render_to_response(context) - - def get_queryset(self): - self.pk_edit = 0 - self.pk_view = 0 - - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - result = Dispositivo.objects.filter( - ta_id=self.kwargs['ta_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - - if not result.exists(): - - ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) - - td = TipoDispositivo.objects.filter(class_css='articulacao')[0] - a = Dispositivo() - a.nivel = 0 - a.ordem = Dispositivo.INTERVALO_ORDEM - a.ordem_bloco_atualizador = 0 - a.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - a.ta = ta - a.tipo_dispositivo = td - a.inicio_vigencia = ta.data_publicacao - a.inicio_eficacia = ta.data_publicacao - a.timestamp = datetime.now() - a.save() - - td = TipoDispositivo.objects.filter(class_css='ementa')[0] - e = Dispositivo() - e.nivel = 1 - e.ordem = a.ordem + Dispositivo.INTERVALO_ORDEM - e.ordem_bloco_atualizador = 0 - e.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - e.ta = ta - e.tipo_dispositivo = td - e.inicio_vigencia = ta.data_publicacao - e.inicio_eficacia = ta.data_publicacao - e.timestamp = datetime.now() - e.texto = ta.ementa - e.dispositivo_pai = a - e.save() - - a.pk = None - a.nivel = 0 - a.ordem = e.ordem + Dispositivo.INTERVALO_ORDEM - a.ordem_bloco_atualizador = 0 - a.set_numero_completo([2, 0, 0, 0, 0, 0, ]) - a.timestamp = datetime.now() - a.save() - - result = Dispositivo.objects.filter( - ta_id=self.kwargs['ta_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - - return result - - def set_perfil_in_session(self, request=None, perfil_id=0): - if not request: - return None - - if perfil_id: - perfil = PerfilEstruturalTextoArticulado.objects.get( - pk=perfil_id) - request.session['perfil_estrutural'] = perfil.pk - else: - perfis = PerfilEstruturalTextoArticulado.objects.filter( - padrao=True)[:1] - - if not perfis.exists(): - request.session.pop('perfil_estrutural') - else: - request.session['perfil_estrutural'] = perfis[0].pk - - -class DispositivoEditView(CompilacaoEditView): - template_name = 'compilacao/edit_bloco.html' - - def post(self, request, *args, **kwargs): - - d = Dispositivo.objects.get( - pk=self.kwargs['dispositivo_id']) - - texto = request.POST['texto'] - - if d.texto != '': - d.texto = texto - d.save() - return self.get(request, *args, **kwargs) - d.texto = texto.strip() - d.save() - - if texto != '': - dnext = Dispositivo.objects.filter( - ta_id=d.ta_id, - ordem__gt=d.ordem, - texto='', - tipo_dispositivo__dispositivo_de_articulacao=False)[:1] - - if not dnext.exists(): - return self.get(request, *args, **kwargs) - - if dnext[0].nivel > d.nivel: - pais = [d.pk, ] - else: - if dnext[0].dispositivo_pai_id == d.dispositivo_pai_id: - pais = [dnext[0].dispositivo_pai_id, ] - else: - pais = [ - dnext[0].dispositivo_pai_id, d.dispositivo_pai_id, ] - data = {'pk': dnext[0].pk, 'pai': pais} - else: - data = {'pk': d.pk, 'pai': [d.pk, ]} - - return JsonResponse(data, safe=False) - - def get_queryset_perfil_estrutural(self): - perfis = PerfilEstruturalTextoArticulado.objects.all() - return perfis - - def get(self, request, *args, **kwargs): - - try: - if 'perfil_pk' in request.GET: - self.set_perfil_in_session( - request, request.GET['perfil_pk']) - elif 'perfil_estrutural' not in request.session: - self.set_perfil_in_session(request=request) - - self.object_list = self.get_queryset() - - self.perfil_estrutural_list = self.get_queryset_perfil_estrutural() - - context = self.get_context_data( - object_list=self.object_list, - perfil_estrutural_list=self.perfil_estrutural_list - ) - except Exception as e: - print(e) - - return self.render_to_response(context) - - def get_queryset(self): - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - try: - self.pk_edit = int(self.request.GET['edit']) - except: - self.pk_edit = 0 - self.pk_view = int(self.kwargs['dispositivo_id']) - - try: - if self.pk_edit == self.pk_view: - bloco = Dispositivo.objects.get( - pk=self.kwargs['dispositivo_id']) - else: - 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 - - if self.pk_edit == self.pk_view: - return [bloco, ] - - proximo_bloco = Dispositivo.objects.filter( - ordem__gt=bloco.ordem, - nivel__lte=bloco.nivel, - ta_id=self.kwargs['ta_id'])[:1] - - if proximo_bloco.count() == 0: - itens = Dispositivo.objects.filter( - ordem__gte=bloco.ordem, - ta_id=self.kwargs['ta_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - else: - itens = Dispositivo.objects.filter( - ordem__gte=bloco.ordem, - ordem__lt=proximo_bloco[0].ordem, - ta_id=self.kwargs['ta_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) - return itens - - def select_provaveis_inserts(self, request=None): - - try: - - if request and 'perfil_estrutural' not in request.session: - self.set_perfil_in_session(request) - - perfil_pk = request.session['perfil_estrutural'] - - # Não salvar d_base - if self.pk_edit == 0: - base = Dispositivo.objects.get(pk=self.pk_view) - else: - base = Dispositivo.objects.get(pk=self.pk_edit) - - prox_possivel = Dispositivo.objects.filter( - ordem__gt=base.ordem, - nivel__lte=base.nivel, - ta_id=base.ta_id)[:1] - - if prox_possivel.exists(): - prox_possivel = prox_possivel[0] - else: - prox_possivel = None - - result = [{'tipo_insert': 'Inserir Depois', - 'icone': '↷ ', - 'action': 'add_next', - 'itens': []}, - {'tipo_insert': 'Inserir Dentro', - 'icone': '⇲ ', - 'action': 'add_in', - 'itens': []}, - {'tipo_insert': 'Inserir Antes', - 'icone': '↶ ', - 'action': 'add_prior', - 'itens': []} - ] - - # Possíveis inserções sequenciais já existentes - parents = base.get_parents() - parents.insert(0, base) - nivel = sys.maxsize - for dp in parents: - - if dp.nivel >= nivel: - continue - - if dp.is_relative_auto_insert(perfil_pk): - continue - - if prox_possivel and \ - dp.tipo_dispositivo != base.tipo_dispositivo and\ - dp.nivel < prox_possivel.nivel and\ - not prox_possivel.tipo_dispositivo.permitido_inserir_in( - dp.tipo_dispositivo, - perfil_pk=perfil_pk): - - if dp.tipo_dispositivo != prox_possivel.tipo_dispositivo: - continue - - nivel = dp.nivel - - # um do mesmo para inserção antes - if dp == base: - result[2]['itens'].append({ - 'class_css': dp.tipo_dispositivo.class_css, - 'tipo_pk': dp.tipo_dispositivo.pk, - 'variacao': 0, - 'provavel': '%s (%s)' % ( - dp.rotulo_padrao(local_insert=1), - dp.tipo_dispositivo.nome,), - 'dispositivo_base': base.pk}) - - if dp.dispositivo_pai: - flag_pv = dp.tipo_dispositivo.permitido_variacao( - dp.dispositivo_pai.tipo_dispositivo, - perfil_pk=perfil_pk) - else: - flag_pv = False - - r = [] - flag_direcao = 1 - flag_variacao = 0 - while True: - if dp.dispositivo0 == 0: - local_insert = 1 - else: - local_insert = 0 - - rt = dp.transform_in_next(flag_direcao) - if not rt[0]: - break - flag_variacao += rt[1] - r.append({'class_css': dp.tipo_dispositivo.class_css, - 'tipo_pk': dp.tipo_dispositivo.pk, - 'variacao': flag_variacao, - 'provavel': '%s (%s)' % ( - dp.rotulo_padrao(local_insert), - dp.tipo_dispositivo.nome,), - 'dispositivo_base': base.pk}) - - flag_direcao = -1 - - r.reverse() - - if not flag_pv: - r = [r[0], ] - - if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \ - TipoDispositivo.FNCN: - r = [r[0], ] - - if dp.tipo_dispositivo == base.tipo_dispositivo: - result[0]['itens'] += r - else: - result[0]['itens'] += r - result[2]['itens'] += r - - if nivel == 0: - break - - # tipo do dispositivo base - tipb = base.tipo_dispositivo - - for paradentro in [1, 0]: - if paradentro: - # Outros Tipos de Dispositivos PARA DENTRO - otds = TipoDispositivo.objects.order_by( - '-contagem_continua', 'id').all() - else: - # Outros Tipos de Dispositivos PARA FORA - classes_ja_inseridas = [] - for c in result[0]['itens']: - if c['class_css'] not in classes_ja_inseridas: - classes_ja_inseridas.append(c['class_css']) - for c in result[1]['itens']: - if c['class_css'] not in classes_ja_inseridas: - classes_ja_inseridas.append(c['class_css']) - otds = TipoDispositivo.objects.order_by( - '-contagem_continua', 'id').all().exclude( - class_css__in=classes_ja_inseridas) - - for td in otds: - - if paradentro and not td.permitido_inserir_in( - tipb, - include_relative_autos=False, - perfil_pk=perfil_pk): - continue - - base.tipo_dispositivo = td - - if not paradentro: - - flag_insercao = False - for possivelpai in parents: - if td.permitido_inserir_in( - possivelpai.tipo_dispositivo, - include_relative_autos=False, - perfil_pk=perfil_pk): - flag_insercao = True - break - - if not flag_insercao: - continue - - if possivelpai.is_relative_auto_insert(perfil_pk): - continue - - if prox_possivel: - if prox_possivel.nivel == base.nivel: - if prox_possivel.tipo_dispositivo != td and\ - not prox_possivel.tipo_dispositivo.\ - permitido_inserir_in( - td, perfil_pk=perfil_pk): - continue - else: - if possivelpai.tipo_dispositivo != \ - prox_possivel.tipo_dispositivo and\ - not prox_possivel.tipo_dispositivo.\ - permitido_inserir_in( - possivelpai.tipo_dispositivo, - perfil_pk=perfil_pk) and \ - possivelpai.nivel < \ - prox_possivel.nivel: - continue - base.dispositivo_pai = possivelpai - Dispositivo.set_numero_for_add_in( - possivelpai, base, td) - else: - Dispositivo.set_numero_for_add_in(base, base, td) - - r = [{'class_css': td.class_css, - 'tipo_pk': td.pk, - 'variacao': 0, - 'provavel': '%s (%s)' % ( - base.rotulo_padrao(1, paradentro), - td.nome,), - 'dispositivo_base': base.pk}] - - if paradentro == 1: - """if (tipb.class_css == 'caput' and - td.class_css == 'paragrafo'): - result[0]['itens'].insert(0, r[0]) - else:""" - result[1]['itens'] += r - else: - result[2]['itens'] += r - result[0]['itens'] += r - - # if len(result[0]['itens']) < len(result[1]['itens']): - # r = result[0] - # result.remove(result[0]) - # result.insert(1, r) - - # remover temporariamente a opção inserir antes - # confirmar falta de necessidade - if len(result) > 2: - result.pop() - - except Exception as e: - print(e) - - return result - - -class ActionsEditMixin(object): - - def render_to_json_response(self, context, **response_kwargs): - - action = getattr(self, context['action']) - return JsonResponse(action(context), safe=False) - - def delete_item_dispositivo(self, context): - return self.delete_bloco_dispositivo(context) - - def delete_bloco_dispositivo(self, context): - base = Dispositivo.objects.get(pk=context['dispositivo_id']) - - base_anterior = Dispositivo.objects.order_by('-ordem').filter( - ta_id=base.ta_id, - ordem__lt=base.ordem - )[:1] - base.delete() - - if base_anterior.exists(): - if base_anterior[0].dispositivo_pai_id: - data = {'pk': base_anterior[0].pk, 'pai': [ - base_anterior[0].dispositivo_pai_id, ]} - else: - data = {'pk': base_anterior[0].pk, 'pai': [-1, ]} - return data - else: - return {} - - def add_prior(self, context): - return {} - - def add_in(self, context): - return self.add_next(context, local_add='add_in') - - def add_next(self, context, local_add='add_next'): - try: - base = Dispositivo.objects.get(pk=context['dispositivo_id']) - tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) - variacao = int(context['variacao']) - parents = [base, ] + base.get_parents() - - tipos_dp_auto_insert = tipo.filhos_permitidos.filter( - filho_de_insercao_automatica=True, - perfil_id=context['perfil_pk']) - - count_auto_insert = 0 - for tipoauto in tipos_dp_auto_insert: - qtdp = tipoauto.quantidade_permitida - if qtdp >= 0: - qtdp -= Dispositivo.objects.filter( - ta_id=base.ta_id, - tipo_dispositivo_id=tipoauto.filho_permitido.pk - ).count() - if qtdp > 0: - count_auto_insert += 1 - else: - count_auto_insert += 1 - - dp_irmao = None - dp_pai = None - for dp in parents: - if dp.tipo_dispositivo == tipo: - dp_irmao = dp - break - if tipo.permitido_inserir_in( - dp.tipo_dispositivo, - perfil_pk=context['perfil_pk']): - dp_pai = dp - break - dp_pai = dp - - if dp_irmao is not None: - dp = Dispositivo.new_instance_based_on(dp_irmao, tipo) - dp.transform_in_next(variacao) - else: - # Inserção sem precedente - dp = Dispositivo.new_instance_based_on(dp_pai, tipo) - dp.dispositivo_pai = dp_pai - dp.nivel += 1 - - if tipo.contagem_continua: - ultimo_irmao = Dispositivo.objects.order_by( - '-ordem').filter( - ordem__lte=base.ordem, - tipo_dispositivo_id=tipo.pk, - ta_id=base.ta_id)[:1] - - if not ultimo_irmao.exists(): - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - else: - ultimo_irmao = ultimo_irmao[0] - dp.set_numero_completo( - ultimo_irmao.get_numero_completo()) - dp.transform_in_next() - else: - if ';' in tipo.rotulo_prefixo_texto: - dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) - else: - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - - # verificar se existe restrição de quantidade de itens - if dp.dispositivo_pai: - pp = dp.tipo_dispositivo.possiveis_pais.filter( - pai_id=dp.dispositivo_pai.tipo_dispositivo_id, - perfil_id=context['perfil_pk']) - - if pp.exists() and pp[0].quantidade_permitida >= 0: - qtd_existente = Dispositivo.objects.filter( - ta_id=dp.ta_id, - tipo_dispositivo_id=dp.tipo_dispositivo_id).count() - - if qtd_existente >= pp[0].quantidade_permitida: - return {'pk': base.pk, - 'pai': [base.dispositivo_pai.pk, ], - 'alert': str(_('Limite de inserções de ' - 'dispositivos deste tipo ' - 'foi excedido.')) - } - - ordem = base.criar_espaco( - espaco_a_criar=1 + count_auto_insert, local=local_add) - - dp.rotulo = dp.rotulo_padrao() - dp.ordem = ordem - dp.incrementar_irmaos(variacao, [local_add, ]) - - dp.clean() - dp.save() - - dp_auto_insert = None - - # Inserção automática - if count_auto_insert: - dp_pk = dp.pk - dp.nivel += 1 - for tipoauto in tipos_dp_auto_insert: - dp.dispositivo_pai_id = dp_pk - dp.pk = None - dp.tipo_dispositivo = tipoauto.filho_permitido - if ';' in dp.tipo_dispositivo.rotulo_prefixo_texto: - dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) - else: - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - dp.rotulo = dp.rotulo_padrao() - dp.texto = '' - dp.ordem = dp.ordem + Dispositivo.INTERVALO_ORDEM - dp.clean() - dp.save() - dp_auto_insert = dp - dp = Dispositivo.objects.get(pk=dp_pk) - - ''' Reenquadrar todos os dispositivos que possuem pai - antes da inserção atual e que são inferiores a dp, - redirecionando para o novo pai''' - - nivel = sys.maxsize - flag_niveis = False - - if not dp.tipo_dispositivo.dispositivo_de_alteracao: - possiveis_filhos = Dispositivo.objects.filter( - ordem__gt=dp.ordem, - ta_id=dp.ta_id) - - for filho in possiveis_filhos: - - if filho.nivel > nivel: - continue - - if filho.dispositivo_pai.ordem >= dp.ordem: - continue - - nivel = filho.nivel - - if not filho.tipo_dispositivo.permitido_inserir_in( - dp.tipo_dispositivo, - perfil_pk=context['perfil_pk']): - continue - - filho.dispositivo_pai = dp - filho.clean() - filho.save() - flag_niveis = True - - if flag_niveis: - dp.organizar_niveis() - - numtipos = {} - - ''' Renumerar filhos imediatos que - não possuam contagem continua''' - - if flag_niveis: - filhos = Dispositivo.objects.filter( - dispositivo_pai_id=dp.pk) - - for filho in filhos: - - if filho.tipo_dispositivo.contagem_continua: - continue - - if filho.tipo_dispositivo.class_css in numtipos: - if filho.dispositivo_substituido is None: - numtipos[filho.tipo_dispositivo.class_css] += 1 - else: - t = filho.tipo_dispositivo - prefixo = t.rotulo_prefixo_texto.split(';') - if len(prefixo) > 1: - count_irmaos_m_tipo = Dispositivo.objects.filter( - ~Q(pk=filho.pk), - tipo_dispositivo=t, - dispositivo_pai=filho.dispositivo_pai)[:1] - - if count_irmaos_m_tipo.exists(): - numtipos[filho.tipo_dispositivo.class_css] = 1 - else: - numtipos[filho.tipo_dispositivo.class_css] = 0 - else: - numtipos[filho.tipo_dispositivo.class_css] = 1 - - filho.dispositivo0 = numtipos[ - filho.tipo_dispositivo.class_css] - - filho.rotulo = filho.rotulo_padrao() - filho.clean() - filho.save() - - ''' Renumerar dispositivos de - contagem continua, caso a inserção seja uma articulação''' - - numtipos = {} - if dp.nivel == 0: - - proxima_articulacao = Dispositivo.objects.filter( - ordem__gt=dp.ordem, - nivel=0, - ta_id=dp.ta_id)[:1] - - if not proxima_articulacao.exists(): - filhos_continuos = list(Dispositivo.objects.filter( - ordem__gt=dp.ordem, - ta_id=dp.ta_id, - tipo_dispositivo__contagem_continua=True)) - else: - filhos_continuos = list(Dispositivo.objects.filter( - Q(ordem__gt=dp.ordem) & - Q(ordem__lt=proxima_articulacao[0].ordem), - ta_id=dp.ta_id, - tipo_dispositivo__contagem_continua=True)) - - for filho in filhos_continuos: - - if filho.tipo_dispositivo.class_css in numtipos: - if filho.dispositivo_substituido is None: - numtipos[filho.tipo_dispositivo.class_css] += 1 - else: - t = filho.tipo_dispositivo - prefixo = t.rotulo_prefixo_texto.split(';') - if len(prefixo) > 1: - count_irmaos_m_tipo = Dispositivo.objects.filter( - ~Q(pk=filho.pk), - tipo_dispositivo=t, - dispositivo_pai=filho.dispositivo_pai)[:1] - - if count_irmaos_m_tipo.exists(): - numtipos[filho.tipo_dispositivo.class_css] = 1 - else: - numtipos[filho.tipo_dispositivo.class_css] = 0 - else: - numtipos[filho.tipo_dispositivo.class_css] = 1 - - filho.dispositivo0 = numtipos[ - filho.tipo_dispositivo.class_css] - - filho.rotulo = filho.rotulo_padrao() - filho.clean() - filho.save() - - except Exception as e: - print(e) - - if dp_auto_insert is None: - data = self.get_json_for_refresh(dp) - else: - data = self.get_json_for_refresh(dp=dp, dpauto=dp_auto_insert) - - return data - - def get_json_for_refresh(self, dp, dpauto=None): - - if dp.tipo_dispositivo.contagem_continua: - pais = [] - if dp.dispositivo_pai is None: - data = {'pk': dp.pk, 'pai': [-1, ]} - else: - pkfilho = dp.pk - dp = dp.dispositivo_pai - - proxima_articulacao = dp.get_proximo_nivel_zero() - - if proxima_articulacao is not None: - parents = Dispositivo.objects.filter( - ta_id=dp.ta_id, - ordem__gte=dp.ordem, - ordem__lt=proxima_articulacao.ordem, - nivel__lte=dp.nivel) - else: - parents = Dispositivo.objects.filter( - ta_id=dp.ta_id, - ordem__gte=dp.ordem, - nivel__lte=dp.nivel) - - nivel = sys.maxsize - for p in parents: - if p.nivel > nivel: - continue - pais.append(p.pk) - nivel = p.nivel - data = { - 'pk': pkfilho if not dpauto else dpauto.pk, 'pai': pais} - else: - data = {'pk': dp.pk if not dpauto else dpauto.pk, 'pai': [ - dp.dispositivo_pai.pk, ]} - - return data - - -class ActionsEditView(ActionsEditMixin, TemplateView): - - def render_to_response(self, context, **response_kwargs): - context['action'] = self.request.GET['action'] - - if 'tipo_pk' in self.request.GET: - context['tipo_pk'] = self.request.GET['tipo_pk'] - - if 'variacao' in self.request.GET: - context['variacao'] = self.request.GET['variacao'] - - if 'perfil_estrutural' in self.request.session: - context['perfil_pk'] = self.request.session['perfil_estrutural'] - - return self.render_to_json_response(context, **response_kwargs) diff --git a/materia/views.py b/materia/views.py index aa21a2375..11f4f054e 100644 --- a/materia/views.py +++ b/materia/views.py @@ -4,21 +4,20 @@ from re import sub from crispy_forms.helper import FormHelper from crispy_forms.layout import ButtonHolder, Column, Fieldset, Layout, Submit from django import forms -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist -from django.core.urlresolvers import reverse, reverse_lazy +from django.core.urlresolvers import reverse from django.forms import ModelForm -from django.shortcuts import get_object_or_404, redirect +from django.shortcuts import redirect from django.utils.html import strip_tags from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django.views.generic import ListView from django.views.generic.edit import FormMixin -from vanilla import GenericView +from vanilla.views import GenericView import sapl from comissoes.models import Comissao, Composicao -from compilacao.models import TextoArticulado, TipoTextoArticulado +from compilacao.views import IntegracaoTaView from norma.models import LegislacaoCitada, NormaJuridica, TipoNormaJuridica from parlamentares.models import Parlamentar from sapl.crud import build_crud @@ -2022,33 +2021,5 @@ class PesquisaMateriaListView(FormMixin, ListView): return context -class MateriaTaView(GenericView): - - def get(self, *args, **kwargs): - materia = get_object_or_404(MateriaLegislativa, pk=kwargs['pk']) - related_object_type = ContentType.objects.get_for_model(materia) - - ta = TextoArticulado.objects.filter( - object_id=materia.pk, - content_type=related_object_type) - - if not ta.exists(): - tipo_ta = TipoTextoArticulado.objects.filter( - model=materia.__class__.__name__.lower())[:1] - - ta = TextoArticulado() - - if tipo_ta.exists(): - ta.tipo_ta = tipo_ta[0] - - ta.ementa = materia.ementa - ta.numero = materia.numero - ta.ano = materia.ano - ta.data = materia.data_apresentacao - ta.content_object = materia - ta.save() - - else: - ta = ta[0] - - return redirect(to=reverse_lazy('ta_text', kwargs={'ta_id': ta.pk})) +class MateriaTaView(IntegracaoTaView): + model = MateriaLegislativa diff --git a/norma/models.py b/norma/models.py index 66aefee18..e1e0ec710 100644 --- a/norma/models.py +++ b/norma/models.py @@ -72,7 +72,7 @@ class NormaJuridica(models.Model): null=True, upload_to=texto_upload_path, verbose_name=_('Texto Integral')) - tipo = models.ForeignKey(TipoNormaJuridica, verbose_name=_('Tipo')) + tipo = models.ForeignKey(TipoNormaJuridica, verbose_name=_('Tipo da Norma Juridica')) materia = models.ForeignKey(MateriaLegislativa, blank=True, null=True) numero = models.PositiveIntegerField(verbose_name=_('Número')) ano = models.PositiveSmallIntegerField(verbose_name=_('Ano')) diff --git a/norma/views.py b/norma/views.py index 90717e21a..655b8e89a 100644 --- a/norma/views.py +++ b/norma/views.py @@ -4,19 +4,16 @@ from re import sub from crispy_forms.helper import FormHelper from crispy_forms.layout import ButtonHolder, Fieldset, Layout, Submit from django import forms -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist -from django.core.urlresolvers import reverse_lazy from django.forms import ModelForm -from django.shortcuts import get_object_or_404, redirect from django.utils.html import strip_tags from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django.views.generic.edit import FormMixin -from vanilla import GenericView +from vanilla.views import GenericView import sapl -from compilacao.models import TextoArticulado, TipoTextoArticulado +from compilacao.views import IntegracaoTaView from materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.crud import build_crud @@ -224,33 +221,5 @@ class NormaIncluirView(FormMixin, GenericView): return self.form_invalid(form) -class NormaTaView(GenericView): - - def get(self, *args, **kwargs): - norma = get_object_or_404(NormaJuridica, pk=kwargs['pk']) - related_object_type = ContentType.objects.get_for_model(norma) - - ta = TextoArticulado.objects.filter( - object_id=norma.pk, - content_type=related_object_type) - - if not ta.exists(): - tipo_ta = TipoTextoArticulado.objects.filter( - model=norma.__class__.__name__.lower())[:1] - - ta = TextoArticulado() - - if tipo_ta.exists(): - ta.tipo_ta = tipo_ta[0] - - ta.ementa = norma.ementa - ta.numero = norma.numero - ta.ano = norma.ano - ta.data = norma.data - ta.content_object = norma - ta.save() - - else: - ta = ta[0] - - return redirect(to=reverse_lazy('ta_text', kwargs={'ta_id': ta.pk})) +class NormaTaView(IntegracaoTaView): + model = NormaJuridica diff --git a/static/js/compilacao_edit.js b/static/js/compilacao_edit.js index 307b8d491..44ad142ba 100644 --- a/static/js/compilacao_edit.js +++ b/static/js/compilacao_edit.js @@ -167,7 +167,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, if (flag_actions_vibible == null || flag_actions_vibible) { $('#dpt'+pk_edit).addClass('dpt-selected'); $('html, body').animate({ - scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10 + scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 9 }, 0); } } diff --git a/static/styles/app.scss b/static/styles/app.scss index 286488098..cd874a6a0 100644 --- a/static/styles/app.scss +++ b/static/styles/app.scss @@ -25,8 +25,8 @@ $top-bar-dropdown-radius: $global-radius; } } -// Restyles to foundation top bar menu, in order to behave aesthetically different -/* +// Restyles to foundation top bar menu, in order to behave aesthetically different +/* XXX Is there a better way to implement these styles using best practices without the need to override this much of foundation? Or at least avoid too much nesting and @@ -38,7 +38,7 @@ $top-bar-dropdown-radius: $global-radius; .has-dropdown { // Default values for dropdowns, while also being hidden. .dropdown { - // Border-radius for the first and last dropdown items. We don't style the parent dropdown, as the items overflows it. + // Border-radius for the first and last dropdown items. We don't style the parent dropdown, as the items overflows it. @include radius(rem-calc($top-bar-dropdown-radius)); // Second child here actually targets the first item, since Foundation JS injects a hidden li before it for a mobile back button. > li:nth-child(2), > li:nth-child(2) > a { @@ -50,8 +50,8 @@ $top-bar-dropdown-radius: $global-radius; box-shadow: 0 10px 18px rgba(0, 0, 0, 0.19), 0 2px 6px rgba(0, 0, 0, 0.23); // For the transition effect. - opacity: 0; - // Show the dropdown accurately while it animates. + opacity: 0; + // Show the dropdown accurately while it animates. width: auto; // This will allow the triangle pip to be visible above the dropdown. overflow: visible; @@ -68,14 +68,14 @@ $top-bar-dropdown-radius: $global-radius; position: absolute; top: rem-calc(-12px); left: rem-calc(15px); - } - // This bridges the gap between the top bar and a dropdown. + } + // This bridges the gap between the top bar and a dropdown. &::after { content: ""; position: absolute; z-index: -1; left: 0; - top: rem-calc(-25px); + top: rem-calc(-25px); height: rem-calc(25px); width: 100%; // This transition is for hover-on. @@ -94,7 +94,7 @@ $top-bar-dropdown-radius: $global-radius; pointer-events: auto; // Animating with a beautiful cubic-bezier curve, or Google's "Swift out" easing :) transition: transform 0.3s cubic-bezier(0.55,0,0.1,1), - opacity 0.3s cubic-bezier(0.55,0,0.1,1), + opacity 0.3s cubic-bezier(0.55,0,0.1,1), // Here we make sure the clipping is set before any other transition. clip 0s 0s; // Don't forget to properly animate our bridge, so it keeps only between our gap. @@ -107,6 +107,8 @@ $top-bar-dropdown-radius: $global-radius; } } + + // Our app // - - - - - - - - - - - - - - - - - - - - - - - - - @@ -158,7 +160,7 @@ color: $primary-color; .fadein { -webkit-animation: fadeIn 0.25s ease-in-out; -moz-animation: fadeIn 0.25s ease-in-out; --o-animation: fadeIn 0.25s ease-in-out; +-o-animation: fadeIn 0.25s ease-in-out; } .container { @@ -181,7 +183,7 @@ color: #444444; display: table-row; box-sizing: content-box; } - + /* XXX find a better way to fix main layout box-sizing */ .page__row > .container > *{ box-sizing: border-box; @@ -196,6 +198,12 @@ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 1px 4px rgba(0, 0, 0, 0.23); max-width: 960px; } +.sub-nav { + dt a, dd a, li a { + color: white !important; + } +} + .icon-bar { vertical-align: top; @@ -301,7 +309,7 @@ text-align: center; .footer__block--about { padding-left: 0; - max-width: 195px; + max-width: 195px; } .footer__block--license { diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 42c33e747..c46dcdeef 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -79,7 +79,7 @@ a:link:after, a:visited:after { width: 0px; border-color: transparent transparent #3385CA; position: absolute; - top: -0.75rem; + top: -0.71rem; left: 0.9375rem; } &:hover::before { @@ -597,6 +597,7 @@ a:link:after, a:visited:after { .dne { height: 0.1667rem; transform: scaleX(1); + transition-delay: 1s; ul.btns-action { clip: rect(-100px, 2000px, 2000px, -100px); @@ -610,7 +611,7 @@ a:link:after, a:visited:after { } .dne-nota { height: auto; - + transition-delay: 0s; } } diff --git a/templates/base.html b/templates/base.html index 31f9d7858..be0d7b45d 100644 --- a/templates/base.html +++ b/templates/base.html @@ -117,12 +117,12 @@ {% block main_header %}
      -
      {# XXX Make better use of translation tags in html blocks ie. actually use the proper blocktrans tag efficiently #} @@ -158,7 +158,7 @@ {% block title %} {% if view.title %} -

      {{ view.title }}

      +

      {{ view.title|linebreaksbr }}

      {% endif %} {% endblock %} @@ -214,9 +214,10 @@ - + diff --git a/templates/compilacao/publicacao_detail.html b/templates/compilacao/publicacao_detail.html index 324dfbef1..919ccc038 100644 --- a/templates/compilacao/publicacao_detail.html +++ b/templates/compilacao/publicacao_detail.html @@ -19,24 +19,38 @@ {%trans 'Identificação Básica'%}
      -
      +

      {{ object.tipo_publicacao}}

      -
      -
      +
      +
      - -

      {{ object.data}}

      + +

      {{ object.veiculo_publicacao}}

      -
      +

      {{ object.ano}}

      +
      +
      +
      +
      + +

      {{ object.data}}

      +
      +
      +
      +
      + +

      {{ object.hora|time:"H:i:s"}}

      +
      +
      @@ -51,12 +65,6 @@
      -
      -
      - -

      {{ object.veiculo_publicacao}}

      -
      -
      @@ -69,9 +77,7 @@

      {{ object.pagina_fim|default:''}}

      -
      -
      -
      +

      {{ object.url_externa|default:''}}

      diff --git a/templates/compilacao/publicacao_list.html b/templates/compilacao/publicacao_list.html index 6be141c93..386712f20 100644 --- a/templates/compilacao/publicacao_list.html +++ b/templates/compilacao/publicacao_list.html @@ -21,6 +21,7 @@
      + @@ -32,6 +33,7 @@ {% for pub in object_list %} + diff --git a/templates/compilacao/textoarticulado_detail.html b/templates/compilacao/textoarticulado_detail.html index c22ab825a..8f8a9d1c1 100644 --- a/templates/compilacao/textoarticulado_detail.html +++ b/templates/compilacao/textoarticulado_detail.html @@ -19,19 +19,19 @@ {% endblock actions %} - + {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #} From 0ce818deb3f2c90ea2eea0c1520061306acaeb88 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 11 Jan 2016 11:31:02 -0200 Subject: [PATCH 21/21] =?UTF-8?q?Refatora=C3=A7=C3=A3o=20do=20design=20do?= =?UTF-8?q?=20section-nav?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/js/app.js | 33 +++++++++ static/styles/app.scss | 67 ++++++++++++++++--- templates/base.html | 60 +++++++---------- .../compilacao/textoarticulado_detail.html | 28 ++++---- .../tipotextoarticulado_detail.html | 16 ++--- templates/crud/detail.html | 2 +- .../materia/materialegislativa_detail.html | 22 +++--- .../parlamentares/parlamentares_detail.html | 5 +- 8 files changed, 151 insertions(+), 82 deletions(-) create mode 100644 static/js/app.js diff --git a/static/js/app.js b/static/js/app.js new file mode 100644 index 000000000..9f265dd7d --- /dev/null +++ b/static/js/app.js @@ -0,0 +1,33 @@ + +tinymce.init({selector:'textarea'}); +$(document).foundation(); + +$(document).ready(function(){ + + + $('.dateinput').fdatepicker({ + // TODO localize + format: 'dd/mm/yyyy', + language: 'pt', + endDate: '31/12/2100', + todayBtn: true + }); + + $('.telefone').mask("(99) 9999-9999", {placeholder:"(__) ____ -____"}); + $('.cpf').mask("000.000.000-00", {placeholder:"___.___.___-__"}); + $('.cep').mask("00000-000", {placeholder:"_____-___"}); + $('.rg').mask("0.000.000", {placeholder:"_.___.___"}); + $('.titulo_eleitor').mask("0000.0000.0000.0000", {placeholder:"____.____.____.____"}); + $('.hora').mask("00:00", {placeholder:"hh:mm"}); + $('.hora_hms').mask("00:00:00", {placeholder:"hh:mm:ss"}); + + var href = location.href.split('?') + $('.masthead .sub-nav a').each(function() { + + if (href.length >= 1) { + if (href[0].endsWith($(this).attr('href'))) + $(this).parent().addClass('active') + } + }); + +}); diff --git a/static/styles/app.scss b/static/styles/app.scss index 884572eb1..4368dccc9 100644 --- a/static/styles/app.scss +++ b/static/styles/app.scss @@ -175,7 +175,7 @@ position: relative; display: table; width: 100%; height: 100%; -background-color: #e9eaed; +background-color: #fafafa; color: #444444; } @@ -202,10 +202,15 @@ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 1px 4px rgba(0, 0, 0, 0.23); vertical-align: top; } - .masthead > .container { - padding-top: 20px; - border-bottom: 20px solid $primary-color; - background-color: #ffffff; + .masthead .container { + padding: 10px 0; + background-color: #e3e3e3; + } + + .masthead > .container { + padding: 0px; + max-width: none; + border-bottom: 1px solid $primary-color; } .masthead__logo { @@ -219,19 +224,19 @@ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 1px 4px rgba(0, 0, 0, 0.23); .masthead__logo img { width: auto; - height: 95px; + height: 85px; } .masthead__heading { display: inline-block; - margin-left: 15px; - vertical-align: middle; + margin-left: 10px; + vertical-align: top; } .masthead__heading h1 { color: #333333; text-shadow: 1px 1px 3px #dadada; - font-size: 150%; + font-size: 130%; } .masthead__heading h2 { @@ -239,9 +244,51 @@ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 1px 4px rgba(0, 0, 0, 0.23); color: #444444; text-shadow: 1px 1px 3px #dadada; font-weight: normal; - font-size: 100%; + font-size: 90%; } + + .masthead .sub-nav { + display: block; + overflow: hidden; + padding-top: 0.25rem; + width: auto; + position: absolute; + bottom: -1px; + margin: 0; + right: 0; + + + dd { + margin: 0; + border: 1px solid transparent; + border-bottom: 1px solid $primary-color; + border-top: 2px solid transparent; + border-radius: 5px 5px 0px 0px; + + a { + color: #18577A; + background-color: transparent; + display: inline-block; + padding: 2px 6px 0; + position: relative; + font-size: 90%; + &:hover { + color: #444; + background-color: transparent; + } + } + + &:hover, &.active { + background: #fff; + border: 1px solid $primary-color; + border-bottom: 1px solid #fff; + border-top: 2px solid $primary-color; + + } + } + } + .content { position: relative; display: table-cell; diff --git a/templates/base.html b/templates/base.html index 503b3bbfb..9c84d5c98 100644 --- a/templates/base.html +++ b/templates/base.html @@ -116,20 +116,28 @@ {# Header #} {% block main_header %}
      -
      - -
      - {# XXX Make better use of translation tags in html blocks ie. actually use the proper blocktrans tag efficiently #} -

      {{ parliament_type }} {% trans 'de' %} {{ city }} - {{ state }}

      -

      {% trans 'Sistema de Apoio ao Processo Legislativo' %}

      +
      +
      + +
      + {# XXX Make better use of translation tags in html blocks ie. actually use the proper blocktrans tag efficiently #} +

      {{ parliament_type }} {% trans 'de' %} {{ city }} - {{ state }}

      +

      {% trans 'Sistema de Apoio ao Processo Legislativo' %}

      +
      + + + {% block sections_nav %} + {% endblock sections_nav %} + + +
      -
      {% endblock main_header %} @@ -211,33 +219,11 @@ - - - - + {% block extra_js %} diff --git a/templates/compilacao/textoarticulado_detail.html b/templates/compilacao/textoarticulado_detail.html index 8f8a9d1c1..d37f4ffc0 100644 --- a/templates/compilacao/textoarticulado_detail.html +++ b/templates/compilacao/textoarticulado_detail.html @@ -1,5 +1,21 @@ {% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} + + {% block sections_nav %} + + {% endblock %} + {% block base_content %} {# FIXME is this the best markup to use? #}
      {% block actions %} @@ -19,19 +35,7 @@ {% endblock actions %} -
      {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #} diff --git a/templates/compilacao/tipotextoarticulado_detail.html b/templates/compilacao/tipotextoarticulado_detail.html index 95add3856..acb29c333 100644 --- a/templates/compilacao/tipotextoarticulado_detail.html +++ b/templates/compilacao/tipotextoarticulado_detail.html @@ -1,6 +1,9 @@ {% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} {% block base_content %} {# FIXME is this the best markup to use? #} + + {% block sections_nav %} + {% endblock %}
      {% block actions %} {% endblock actions %} - +
      {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
      {%trans 'Identificação Básica'%} - +
      - +

      {{ object.sigla}}

      - +

      {{ object.descricao}}

      - +
      diff --git a/templates/crud/detail.html b/templates/crud/detail.html index f6b89bb8d..b0fc0c6ce 100644 --- a/templates/crud/detail.html +++ b/templates/crud/detail.html @@ -11,7 +11,7 @@
      {% trans 'Excluir' %}
      {% endblock actions %} - {% block sections_nav %}{% endblock %} +
      {% block detail_content %} diff --git a/templates/materia/materialegislativa_detail.html b/templates/materia/materialegislativa_detail.html index f76aa2a26..aaa0a1bcd 100644 --- a/templates/materia/materialegislativa_detail.html +++ b/templates/materia/materialegislativa_detail.html @@ -2,16 +2,16 @@ {% load i18n %} {% block sections_nav %} -
      {{ ta.numero }} {{ ta.ano }} {{ ta.data }}{{ ta.ementa }}{{ ta.ementa|safe }}
      {% fieldclass_verbose_name 'Publicacao' 'data' %}{% fieldclass_verbose_name 'Publicacao' 'hora' %} {% fieldclass_verbose_name 'Publicacao' 'numero' %} {% fieldclass_verbose_name 'Publicacao' 'ano' %} {% fieldclass_verbose_name 'Publicacao' 'edicao' %}
      {{ pub.data }}{{ pub.hora|time:'H:i:s' }} {{ pub.numero|default:'' }} {{ pub.ano|default:'' }} {{ pub.edicao|default:'' }}