From af03289d3179c7e30920d110540f1293f9409c26 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 8 Aug 2017 13:59:56 -0300 Subject: [PATCH 01/80] Fix #1180 --- sapl/base/templatetags/common_tags.py | 6 +++++- sapl/relatorios/views.py | 18 +++++------------ sapl/sessao/views.py | 5 ++--- .../sessao/blocos_resumo/lista_presenca.html | 4 +++- .../lista_presenca_ordem_dia.html | 4 +++- sapl/utils.py | 20 +++++++++++++++++++ 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 0f274ab29..a72eb6a54 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -4,7 +4,7 @@ from django import template from sapl.base.models import AppConfig from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa from sapl.norma.models import NormaJuridica -from sapl.parlamentares.models import Filiacao +from sapl.utils import filiacao_data register = template.Library() @@ -180,3 +180,7 @@ def urldetail_content_type(obj, value): def urldetail(obj): return '%s:%s_detail' % ( obj._meta.app_config.name, obj._meta.model_name) + +@register.filter +def filiacao_epoca_filter(parlamentar, sessao): + return filiacao_data(parlamentar, sessao.data_inicio) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index c00f770a2..ffd371600 100644 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -19,7 +19,7 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente) from sapl.settings import STATIC_ROOT -from sapl.utils import UF +from sapl.utils import filiacao_data, UF from .templates import (pdf_capa_processo_gerar, pdf_documento_administrativo_gerar, pdf_espelho_gerar, @@ -510,12 +510,8 @@ def get_sessao_plenaria(sessao, casa): for parlamentar in [p.parlamentar for p in presenca]: dic_presenca = {} dic_presenca["nom_parlamentar"] = parlamentar.nome_parlamentar - partido = Filiacao.objects.filter( - parlamentar=parlamentar).first() - if partido: - partido_sigla = partido.partido.sigla - else: - partido_sigla = '' + partido_sigla = filiacao_data(parlamentar, sessao.data_inicio) + dic_presenca['sgl_partido'] = partido_sigla lst_presenca_sessao.append(dic_presenca) @@ -651,12 +647,8 @@ def get_sessao_plenaria(sessao, casa): dic_presenca_ordem_dia = {} dic_presenca_ordem_dia['nom_parlamentar'] = ( parlamentar.nome_parlamentar) - partido_sigla = Filiacao.objects.filter( - parlamentar=parlamentar).first() - if not partido_sigla: - sigla = '' - else: - sigla = partido_sigla.partido.sigla + sigla = filiacao_data(parlamentar, sessao.data_inicio) + dic_presenca_ordem_dia['sgl_partido'] = sigla lst_presenca_ordem_dia.append(dic_presenca_ordem_dia) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 61cadbf71..c2012bd94 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -34,7 +34,6 @@ from sapl.parlamentares.models import (Filiacao, Legislatura, Parlamentar, SessaoLegislativa, Mandato) from sapl.sessao.apps import AppConfig from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm - from .forms import (AdicionarVariasMateriasFilterSet, ExpedienteForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, @@ -1458,9 +1457,9 @@ class VotacaoEditView(SessaoPermissionMixin): class VotacaoView(SessaoPermissionMixin): - ''' + """ Votação Simbólica e Secreta - ''' + """ template_name = 'sessao/votacao/votacao.html' form_class = VotacaoForm diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca.html b/sapl/templates/sessao/blocos_resumo/lista_presenca.html index c89f23588..60b487068 100644 --- a/sapl/templates/sessao/blocos_resumo/lista_presenca.html +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca.html @@ -1,8 +1,10 @@ +{% load common_tags %} +
Lista de Presença na Sessão
{% for p in presenca_sessao %} -
{{p.nome_parlamentar}} / {{ p.filiacao_atual }}
+
{{p.nome_parlamentar}} / {{ p|filiacao_epoca_filter:object }}
{% endfor %}
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html b/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html index 910e6a3d2..9ddb8fe1f 100644 --- a/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html @@ -1,8 +1,10 @@ +{% load common_tags %} +
Lista de Presença na Ordem do Dia
{% for p in presenca_ordem %} -
{{p.nome_parlamentar}} / {{ p.filiacao_atual }}
+
{{p.nome_parlamentar}} / {{ p|filiacao_epoca_filter:object }}
{% endfor %}
\ No newline at end of file diff --git a/sapl/utils.py b/sapl/utils.py index 7a4146fc5..2f56605a7 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -14,6 +14,7 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button from django import forms from django.apps import apps +from django.db.models import Q from django.conf import settings from django.contrib import admin from django.contrib.contenttypes.fields import (GenericForeignKey, GenericRel, @@ -26,6 +27,7 @@ from reversion.admin import VersionAdmin from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row from sapl.settings import BASE_DIR, PROJECT_DIR + sapl_logger = logging.getLogger(BASE_DIR.name) @@ -553,3 +555,21 @@ def texto_upload_path(instance, filename, subpath='', pk_first=False): } return path + + +def filiacao_data(parlamentar, data): + from sapl.parlamentares.models import Filiacao + + filiacoes_parlamentar = Filiacao.objects.filter( + parlamentar=parlamentar) + + filiacoes = filiacoes_parlamentar.filter(Q( + data__lte=data, + data_desfiliacao__isnull=True) | Q( + data__lte=data, + data_desfiliacao__gte=data)) + + if filiacoes: + return filiacoes.last().partido.sigla + else: + return '' \ No newline at end of file From e314f47f5dfc4676adc7e2feeb00957bfe29993a Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Tue, 8 Aug 2017 13:45:10 -0300 Subject: [PATCH 02/80] Verifica data de fim da comissao para definir status ativo Signed-off-by: Luciano Almeida --- sapl/legacy/migration.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 183b22dbd..fcf2f0837 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -898,13 +898,13 @@ def adjust_autor(new, old): def adjust_comissao(new, old): - if old.dat_extincao: - if date.today() < new.data_extincao: - new.ativa = True - else: - new.ativa = False - if not old.dat_extincao: + if not old.dat_extincao and not old.dat_fim_comissao: + new.ativa = True + elif old.dat_extincao and date.today() < new.data_extincao or \ + old.dat_fim_comissao and date.today() < new.data_fim_comissao: new.ativa = True + else: + new.ativa = False AJUSTE_ANTES_SALVAR = { From 39e41330ddbe2b0843b8ac5d4ec1b5a9c768741d Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Wed, 9 Aug 2017 12:37:50 -0300 Subject: [PATCH 03/80] =?UTF-8?q?Muda=20valor=20m=C3=A1ximo=20do=20campo?= =?UTF-8?q?=20nome=20da=20model=20Comissao?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luciano Almeida --- .../migrations/0002_auto_20170809_1236.py | 20 +++++++++++++++++++ sapl/comissoes/models.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 sapl/comissoes/migrations/0002_auto_20170809_1236.py diff --git a/sapl/comissoes/migrations/0002_auto_20170809_1236.py b/sapl/comissoes/migrations/0002_auto_20170809_1236.py new file mode 100644 index 000000000..b665a2186 --- /dev/null +++ b/sapl/comissoes/migrations/0002_auto_20170809_1236.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.12 on 2017-08-09 12:36 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('comissoes', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='comissao', + name='nome', + field=models.CharField(max_length=100, verbose_name='Nome'), + ), + ] diff --git a/sapl/comissoes/models.py b/sapl/comissoes/models.py index a21a20508..0b3c664ee 100644 --- a/sapl/comissoes/models.py +++ b/sapl/comissoes/models.py @@ -35,7 +35,7 @@ class Comissao(models.Model): tipo = models.ForeignKey(TipoComissao, on_delete=models.PROTECT, verbose_name=_('Tipo')) - nome = models.CharField(max_length=60, verbose_name=_('Nome')) + nome = models.CharField(max_length=100, verbose_name=_('Nome')) sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) data_criacao = models.DateField(verbose_name=_('Data de Criação')) data_extincao = models.DateField( From c114b1ac7afe598bf3061db822e1699a066f4f2a Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 9 Aug 2017 13:16:43 -0300 Subject: [PATCH 04/80] Fix #1353 --- sapl/materia/forms.py | 55 +++++++++++++++- sapl/materia/urls.py | 14 ++-- sapl/materia/views.py | 66 +++++++++++++++---- sapl/templates/materia/autoria_list.html | 4 +- .../materia/autoria_multicreate_form.html | 51 ++++++++++++++ sapl/templates/materia/layouts.yaml | 7 -- 6 files changed, 164 insertions(+), 33 deletions(-) create mode 100644 sapl/templates/materia/autoria_multicreate_form.html diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 1c6ad78b1..f31324ceb 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -14,20 +14,20 @@ from django.core.urlresolvers import reverse from django.db import models, transaction from django.db.models import Max from django.forms import ModelForm, ModelChoiceField, widgets -from django.forms.fields import BooleanField from django.forms.forms import Form -from django.forms.widgets import Select, HiddenInput +from django.forms.models import ModelMultipleChoiceField +from django.forms.widgets import Select, CheckboxSelectMultiple, HiddenInput from django.utils import six from django.utils.encoding import force_text from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django_filters.filterset import STRICTNESS +from jedi.evaluate import instance import django_filters from sapl.base.models import Autor, TipoAutor from sapl.comissoes.models import Comissao -from sapl.compilacao.forms import error_messages from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_PUBLIC, STATUS_TA_PRIVATE) from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, @@ -735,6 +735,55 @@ class AutoriaForm(ModelForm): return cd +class AutoriaMultiCreateForm(Form): + + tipo_autor = ModelChoiceField(label=_('Tipo Autor'), + required=False, + queryset=TipoAutor.objects.all(), + empty_label=_('Selecione'),) + + data_relativa = forms.DateField( + widget=forms.HiddenInput(), required=False) + + autor = ModelMultipleChoiceField( + queryset=Autor.objects.all(), + label=_('Possiveis Autores'), + required=False, + widget=CheckboxSelectMultiple) + + autores = ModelMultipleChoiceField( + queryset=Autor.objects.all(), + required=False, + widget=HiddenInput) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + row1 = to_row([('tipo_autor', 12), ]) + + row2 = to_row([('autor', 12), ]) + + self.helper = FormHelper() + self.helper.layout = Layout( + Fieldset( + _('Autorias'), row1, row2, 'data_relativa', 'autores', + form_actions(save_label='Incluir Autores Selecionados'))) + + self.fields['autor'].choices = [] + + def clean(self): + cd = super().clean() + + if 'autores' in self.errors: + del self.errors['autores'] + + if 'autor' not in cd or not cd['autor'].exists(): + raise ValidationError( + _('Ao menos um autor deve ser selecionado para inclusão')) + + return cd + + class AcessorioEmLoteFilterSet(django_filters.FilterSet): filter_overrides = {models.DateField: { diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index 600fadfc6..d588f1f20 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -2,8 +2,7 @@ from django.conf.urls import include, url from sapl.materia.views import (AcompanhamentoConfirmarView, AcompanhamentoExcluirView, - AcompanhamentoMateriaView, - AdicionarVariasAutorias, AnexadaCrud, + AcompanhamentoMateriaView, AnexadaCrud, AssuntoMateriaCrud, AutoriaCrud, ConfirmarProposicao, CriarProtocoloMateriaView, DespachoInicialCrud, DocumentoAcessorioCrud, @@ -21,11 +20,12 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, TipoFimRelatoriaCrud, TipoMateriaCrud, TipoProposicaoCrud, TramitacaoCrud, TramitacaoEmLoteView, UnidadeTramitacaoCrud, - proposicao_texto, recuperar_materia) + proposicao_texto, recuperar_materia, + AutoriaMultiCreateView) +from . import receivers from .apps import AppConfig -from . import receivers app_name = AppConfig.name @@ -60,9 +60,9 @@ urlpatterns_materia = [ AcompanhamentoExcluirView.as_view(), name='acompanhar_excluir'), - url(r'^materia/(?P\d+)/adicionar-varias-autorias/', - AdicionarVariasAutorias.as_view(), - name='adicionar_varias_autorias'), + url(r'^materia/(?P\d+)/autoria/multicreate', + AutoriaMultiCreateView.as_view(), + name='autoria_multicreate'), url(r'^materia/acessorio-em-lote', DocumentoAcessorioEmLoteView.as_view(), name='acessorio_em_lote'), diff --git a/sapl/materia/views.py b/sapl/materia/views.py index bfa996b68..70184bc27 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -16,7 +16,7 @@ from django.db.models import Q from django.http import HttpResponse, JsonResponse from django.http.response import Http404, HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect -from django.utils import formats +from django.utils import formats, deprecation from django.utils.translation import ugettext_lazy as _ from django.views.generic import CreateView, ListView, TemplateView, UpdateView from django.views.generic.base import RedirectView @@ -37,7 +37,7 @@ from sapl.crud.base import (ACTION_CREATE, ACTION_DELETE, ACTION_DETAIL, from sapl.materia.forms import (AnexadaForm, ConfirmarProposicaoForm, LegislacaoCitadaForm, AutoriaForm, ProposicaoForm, TipoProposicaoForm, TramitacaoForm, - TramitacaoUpdateForm) + TramitacaoUpdateForm, AutoriaMultiCreateForm) from sapl.materia.models import Autor from sapl.norma.models import LegislacaoCitada from sapl.parlamentares.models import Parlamentar @@ -1086,13 +1086,16 @@ class AutoriaCrud(MasterDetailCrud): parent_field = 'materia' help_path = '' public = [RP_LIST, RP_DETAIL] + list_field_names = ['autor', 'autor__tipo__descricao', 'primeiro_autor'] - class CreateView(MasterDetailCrud.CreateView): + class LocalBaseMixin(): form_class = AutoriaForm @property def layout_key(self): - return 'AutoriaCreate' + return None + + class CreateView(LocalBaseMixin, MasterDetailCrud.CreateView): def get_initial(self): initial = super().get_initial() @@ -1101,12 +1104,7 @@ class AutoriaCrud(MasterDetailCrud): initial['autor'] = [] return initial - class UpdateView(MasterDetailCrud.UpdateView): - form_class = AutoriaForm - - @property - def layout_key(self): - return 'AutoriaUpdate' + class UpdateView(LocalBaseMixin, MasterDetailCrud.UpdateView): def get_initial(self): initial = super().get_initial() @@ -1117,6 +1115,46 @@ class AutoriaCrud(MasterDetailCrud): return initial +class AutoriaMultiCreateView(FormView): + form_class = AutoriaMultiCreateForm + template_name = 'materia/autoria_multicreate_form.html' + + @classmethod + def get_url_regex(cls): + return r'^(?P\d+)/%s/multicreate' % cls.model._meta.model_name + + @property + def layout_key(self): + return None + + def get_initial(self): + initial = super().get_initial() + self.materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) + initial['data_relativa'] = self.materia.data_apresentacao + initial['autores'] = self.materia.autores.all() + return initial + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = '%s (%s)' % ( + _('Adicionar Várias Autorias'), self.materia) + return context + + def get_success_url(self): + messages.add_message( + self.request, messages.SUCCESS, + _('Autorias adicionadas com sucesso.')) + return reverse( + 'sapl.materia:autoria_list', kwargs={'pk': self.materia.pk}) + + def form_valid(self, form): + autores_selecionados = form.cleaned_data['autor'] + for autor in autores_selecionados: + Autoria.objects.create(materia=self.materia, autor=autor) + + return FormView.form_valid(self, form) + + class DespachoInicialCrud(MasterDetailCrud): model = DespachoInicial parent_field = 'materia' @@ -1694,10 +1732,10 @@ class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): context['primeira_tramitacao'] = False if ('tramitacao__status' in qr and - 'tramitacao__unidade_tramitacao_destino' in qr and - qr['tramitacao__status'] and - qr['tramitacao__unidade_tramitacao_destino'] - ): + 'tramitacao__unidade_tramitacao_destino' in qr and + qr['tramitacao__status'] and + qr['tramitacao__unidade_tramitacao_destino'] + ): lista = filtra_tramitacao_destino_and_status( qr['tramitacao__status'], qr['tramitacao__unidade_tramitacao_destino']) diff --git a/sapl/templates/materia/autoria_list.html b/sapl/templates/materia/autoria_list.html index 44b59c849..9574ed3b7 100644 --- a/sapl/templates/materia/autoria_list.html +++ b/sapl/templates/materia/autoria_list.html @@ -6,8 +6,8 @@ {% block more_buttons %} {% if perms|get_add_perm:view %} - - {% blocktrans with verbose_name=view.verbose_name %} Adicionar Várias Autorias {% endblocktrans %} + + {% trans "Adicionar Várias Autorias" %} {% endif %} diff --git a/sapl/templates/materia/autoria_multicreate_form.html b/sapl/templates/materia/autoria_multicreate_form.html new file mode 100644 index 000000000..59c3ece91 --- /dev/null +++ b/sapl/templates/materia/autoria_multicreate_form.html @@ -0,0 +1,51 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% load common_tags %} + +{% block extra_js %} + +{% endblock %} diff --git a/sapl/templates/materia/layouts.yaml b/sapl/templates/materia/layouts.yaml index aac494432..4a86fe945 100644 --- a/sapl/templates/materia/layouts.yaml +++ b/sapl/templates/materia/layouts.yaml @@ -61,13 +61,6 @@ Autoria: {% trans 'Autoria' %}: - autor primeiro_autor -AutoriaCreate: - {% trans 'Autoria' %}: - - tipo_autor autor primeiro_autor - -AutoriaUpdate: - {% trans 'Autoria' %}: - - tipo_autor autor primeiro_autor DocumentoAcessorio: {% trans 'Documento Acessório' %}: From 3e2001457febefc06806b2399ef12c25a2aa6a69 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 9 Aug 2017 13:37:49 -0300 Subject: [PATCH 05/80] retirar imports incorretos do ultimo commit --- sapl/materia/forms.py | 1 - sapl/materia/views.py | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index f31324ceb..812250309 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -23,7 +23,6 @@ from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django_filters.filterset import STRICTNESS -from jedi.evaluate import instance import django_filters from sapl.base.models import Autor, TipoAutor diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 70184bc27..a833904c1 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -16,7 +16,7 @@ from django.db.models import Q from django.http import HttpResponse, JsonResponse from django.http.response import Http404, HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect -from django.utils import formats, deprecation +from django.utils import formats from django.utils.translation import ugettext_lazy as _ from django.views.generic import CreateView, ListView, TemplateView, UpdateView from django.views.generic.base import RedirectView @@ -24,7 +24,6 @@ from django.views.generic.edit import FormView from django_filters.views import FilterView from sapl.base.models import Autor, CasaLegislativa -from sapl.comissoes.models import Comissao from sapl.comissoes.models import Comissao, Participacao from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT, STATUS_TA_PRIVATE) @@ -38,9 +37,8 @@ from sapl.materia.forms import (AnexadaForm, ConfirmarProposicaoForm, LegislacaoCitadaForm, AutoriaForm, ProposicaoForm, TipoProposicaoForm, TramitacaoForm, TramitacaoUpdateForm, AutoriaMultiCreateForm) -from sapl.materia.models import Autor + from sapl.norma.models import LegislacaoCitada -from sapl.parlamentares.models import Parlamentar from sapl.protocoloadm.models import Protocolo from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, autor_modal, gerar_hash_arquivo, get_base_url, From 9290eab51d201085c8191fa3feb40daad615826a Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 9 Aug 2017 13:55:54 -0300 Subject: [PATCH 06/80] =?UTF-8?q?Add=20mixin=20de=20permiss=C3=B5es=20na?= =?UTF-8?q?=20view=20multiplas=20autorias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index a833904c1..58f9862f4 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -37,7 +37,6 @@ from sapl.materia.forms import (AnexadaForm, ConfirmarProposicaoForm, LegislacaoCitadaForm, AutoriaForm, ProposicaoForm, TipoProposicaoForm, TramitacaoForm, TramitacaoUpdateForm, AutoriaMultiCreateForm) - from sapl.norma.models import LegislacaoCitada from sapl.protocoloadm.models import Protocolo from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, @@ -1113,7 +1112,8 @@ class AutoriaCrud(MasterDetailCrud): return initial -class AutoriaMultiCreateView(FormView): +class AutoriaMultiCreateView(PermissionRequiredForAppCrudMixin, FormView): + app_label = sapl.materia.apps.AppConfig.label form_class = AutoriaMultiCreateForm template_name = 'materia/autoria_multicreate_form.html' From 4ee52610db821cf30e7e80362801423c4d78a5d2 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 9 Aug 2017 14:11:12 -0300 Subject: [PATCH 07/80] Fix #1354 --- sapl/protocoloadm/forms.py | 29 ++++++++----- .../protocoloadm/protocolar_materia.html | 41 +++++++++++++++++++ 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index a3b71e998..7fb1d2d7a 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -1,6 +1,5 @@ from datetime import datetime -import django_filters from crispy_forms.bootstrap import InlineRadios from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Fieldset, Layout, Submit @@ -9,8 +8,9 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import models from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ +import django_filters -from sapl.base.models import Autor +from sapl.base.models import Autor, TipoAutor from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa, UnidadeTramitacao from sapl.utils import (RANGE_ANOS, AnoNumeroOrderingFilter, @@ -20,6 +20,7 @@ from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo, Protocolo, TipoDocumentoAdministrativo, TramitacaoAdministrativo) + TIPOS_PROTOCOLO = [('0', 'Recebido'), ('1', 'Enviado'), ('', 'Ambos')] TIPOS_PROTOCOLO_CREATE = [('0', 'Recebido'), ('1', 'Enviado')] @@ -239,12 +240,13 @@ class AnularProcoloAdmForm(ModelForm): numero_protocolo=protocolo.numero, ano=protocolo.ano).exists() elif protocolo.tipo_documento: exists = protocolo.documentoadministrativo_set.all( - ).order_by('-ano', '-numero').exists() + ).order_by('-ano', '-numero').exists() if exists: raise forms.ValidationError( _("Protocolo %s/%s não pode ser removido pois existem" "documentos vinculados a ele." % (numero, ano))) + class Meta: model = Protocolo fields = ['numero', @@ -345,9 +347,14 @@ class ProtocoloDocumentForm(ModelForm): class ProtocoloMateriaForm(ModelForm): autor = forms.ModelChoiceField(required=True, - empty_label='------', - queryset=Autor.objects.all() - ) + empty_label='------', + queryset=Autor.objects.all() + ) + + tipo_autor = forms.ModelChoiceField(required=True, + empty_label='------', + queryset=TipoAutor.objects.all() + ) tipo_materia = forms.ModelChoiceField( label=_('Tipo de Matéria'), @@ -364,12 +371,12 @@ class ProtocoloMateriaForm(ModelForm): assunto_ementa = forms.CharField(required=True, widget=forms.Textarea, label='Ementa') - class Meta: model = Protocolo fields = ['tipo_materia', 'numero_paginas', 'autor', + 'tipo_autor', 'assunto_ementa', 'observacao'] @@ -387,9 +394,9 @@ class ProtocoloMateriaForm(ModelForm): row1 = to_row( [('tipo_materia', 4), - ('numero_paginas', 4)]) - row2 = to_row( - [('autor', 4)]) + ('numero_paginas', 2), + ('tipo_autor', 3), + ('autor', 3)]) row3 = to_row( [('assunto_ementa', 12)]) row4 = to_row( @@ -398,7 +405,7 @@ class ProtocoloMateriaForm(ModelForm): self.helper = FormHelper() self.helper.layout = Layout( Fieldset(_('Identificação da Matéria'), - row1, row2, row3, + row1, row3, row4, form_actions(save_label='Protocolar Matéria'))) super(ProtocoloMateriaForm, self).__init__( diff --git a/sapl/templates/protocoloadm/protocolar_materia.html b/sapl/templates/protocoloadm/protocolar_materia.html index 744126f0d..21d0db47e 100644 --- a/sapl/templates/protocoloadm/protocolar_materia.html +++ b/sapl/templates/protocoloadm/protocolar_materia.html @@ -13,3 +13,44 @@ {% block detail_content %} {% crispy form %} {% endblock detail_content %} + +{% block extra_js %} + +{% endblock %} From a567efe3ebf6f150666c67f1ad862debcd3f8c92 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 9 Aug 2017 15:09:42 -0300 Subject: [PATCH 08/80] Add filtros de autores por tipo --- sapl/api/forms.py | 50 +++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/sapl/api/forms.py b/sapl/api/forms.py index d1445f7df..f70ffe2f2 100644 --- a/sapl/api/forms.py +++ b/sapl/api/forms.py @@ -168,13 +168,13 @@ class AutoresPossiveisFilterSet(FilterSet): if not hasattr(self, filter_for_model): return qs - return getattr(self, filter_for_model)(qs, data_relativa) - - def filter_parlamentar(self, queryset, data_relativa): - # não leva em conta afastamentos if not data_relativa: data_relativa = timezone.now() + return getattr(self, filter_for_model)(qs, data_relativa).distinct() + + def filter_parlamentar(self, queryset, data_relativa): + # não leva em conta afastamentos legislatura_relativa = Legislatura.objects.filter( data_inicio__lte=data_relativa, data_fim__gte=data_relativa).first() @@ -188,26 +188,42 @@ class AutoresPossiveisFilterSet(FilterSet): if legislatura_relativa.atual(): params['parlamentar_set__ativo'] = True - qs = queryset.filter(**params).distinct() + qs = queryset.filter(**params) return qs - def filter_frente(self, queryset, data_relativa): - # implementar regras específicas para frente - return queryset - def filter_comissao(self, queryset, data_relativa): - # implementar regras específicas para comissao - return queryset + return queryset.filter( + Q(comissao_set__data_extincao__isnull=True, + comissao_set__data_fim_comissao__isnull=True) | + Q(comissao_set__data_extincao__gte=data_relativa, + comissao_set__data_fim_comissao__isnull=True) | + Q(comissao_set__data_extincao__gte=data_relativa, + comissao_set__data_fim_comissao__isnull=True) | + Q(comissao_set__data_extincao__isnull=True, + comissao_set__data_fim_comissao__gte=data_relativa) | + Q(comissao_set__data_extincao__gte=data_relativa, + comissao_set__data_fim_comissao__gte=data_relativa), + comissao_set__data_criacao__lte=data_relativa) - def filter_orgao(self, queryset, data_relativa): - # implementar regras específicas para orgao - return queryset + def filter_frente(self, queryset, data_relativa): + return queryset.filter( + Q(frente_set__data_extincao__isnull=True) | + Q(frente_set__data_extincao__gte=data_relativa), + frente_set__data_criacao__lte=data_relativa) def filter_bancada(self, queryset, data_relativa): - # implementar regras específicas para bancada - return queryset + return queryset.filter( + Q(bancada_set__data_extincao__isnull=True) | + Q(bancada_set__data_extincao__gte=data_relativa), + bancada_set__data_criacao__lte=data_relativa) def filter_bloco(self, queryset, data_relativa): - # implementar regras específicas para bloco + return queryset.filter( + Q(bloco_set__data_extincao__isnull=True) | + Q(bloco_set__data_extincao__gte=data_relativa), + bloco_set__data_criacao__lte=data_relativa) + + def filter_orgao(self, queryset, data_relativa): + # na implementação, não havia regras a implementar para orgao return queryset From 24201a9f52e51bd8fce75c88f254cb44f5c3b985 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 9 Aug 2017 15:57:47 -0300 Subject: [PATCH 09/80] Faz checkout da pasta media vazia Fix #1278 --- .gitignore | 7 +++++-- media/.gitkeep | 0 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 media/.gitkeep diff --git a/.gitignore b/.gitignore index d66a04a22..3bf1301ec 100644 --- a/.gitignore +++ b/.gitignore @@ -91,9 +91,12 @@ whoosh_index collected_static bower bower_components -media whoosh/ solr-4.10.2/ postgres-data/ data/ -solr-*/ \ No newline at end of file +solr-*/ + +# ignora tudo dentro de media, mas cria a pasta no checkout +media/* +!media/.gitkeep diff --git a/media/.gitkeep b/media/.gitkeep new file mode 100644 index 000000000..e69de29bb From 41e3bc8e8dc0ac67ee770081ce055a017b7e3d54 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Wed, 9 Aug 2017 20:08:28 -0300 Subject: [PATCH 10/80] =?UTF-8?q?Reuso=20de=20c=C3=B3digo=20do=20django-fi?= =?UTF-8?q?lter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/forms.py | 7 ++++++- sapl/materia/forms.py | 42 +++--------------------------------------- sapl/utils.py | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 40 deletions(-) diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 8ecd74d5a..f95cc9bb8 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -24,7 +24,8 @@ from sapl.sessao.models import SessaoPlenaria from sapl.settings import MAX_IMAGE_UPLOAD_SIZE from sapl.utils import (RANGE_ANOS, ChoiceWithoutValidationField, ImageThumbnailFileInput, RangeWidgetOverride, - autor_label, autor_modal, models_with_gr_for_model) + autor_label, autor_modal, models_with_gr_for_model, + qs_override_django_filter) from .models import AppConfig, CasaLegislativa @@ -501,6 +502,10 @@ class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet): row1, form_actions(save_label='Pesquisar')) ) + @property + def qs(self): + return qs_override_django_filter(self) + class RelatorioHistoricoTramitacaoFilterSet(django_filters.FilterSet): diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 812250309..d56345179 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -17,12 +17,10 @@ from django.forms import ModelForm, ModelChoiceField, widgets from django.forms.forms import Form from django.forms.models import ModelMultipleChoiceField from django.forms.widgets import Select, CheckboxSelectMultiple, HiddenInput -from django.utils import six from django.utils.encoding import force_text from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ -from django_filters.filterset import STRICTNESS import django_filters from sapl.base.models import Autor, TipoAutor @@ -41,7 +39,8 @@ from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, ChoiceWithoutValidationField, MateriaPesquisaOrderingFilter, RangeWidgetOverride, - autor_label, autor_modal, models_with_gr_for_model) + autor_label, autor_modal, models_with_gr_for_model, + qs_override_django_filter) import sapl from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, @@ -591,42 +590,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): @property def qs(self): - if not hasattr(self, '_qs'): - valid = self.is_bound and self.form.is_valid() - - if self.is_bound and not valid: - if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR: - raise forms.ValidationError(self.form.errors) - elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS: - self._qs = self.queryset.none() - return self._qs - # else STRICTNESS.IGNORE... ignoring - - # start with all the results and filter from there - qs = self.queryset.all() - for name, filter_ in six.iteritems(self.filters): - value = None - if valid: - value = self.form.cleaned_data[name] - else: - raw_value = self.form[name].value() - try: - value = self.form.fields[name].clean(raw_value) - except forms.ValidationError: - if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR: - raise - elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS: - self._qs = self.queryset.none() - return self._qs - # else STRICTNESS.IGNORE... ignoring - - if value is not None: # valid & clean data - qs = qs._next_is_sticky() - qs = filter_.filter(qs, value) - - self._qs = qs - - return self._qs + return qs_override_django_filter(self) def pega_ultima_tramitacao(): diff --git a/sapl/utils.py b/sapl/utils.py index 7a4146fc5..5336e4c1c 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -3,6 +3,7 @@ import logging import os import re from datetime import date +from django_filters.filterset import STRICTNESS from functools import wraps from subprocess import PIPE, call from threading import Thread @@ -19,6 +20,7 @@ from django.contrib import admin from django.contrib.contenttypes.fields import (GenericForeignKey, GenericRel, GenericRelation) from django.core.exceptions import ValidationError +from django.utils import six from django.utils.translation import ugettext_lazy as _ from floppyforms import ClearableFileInput from reversion.admin import VersionAdmin @@ -553,3 +555,42 @@ def texto_upload_path(instance, filename, subpath='', pk_first=False): } return path + + +def qs_override_django_filter(self): + if not hasattr(self, '_qs'): + valid = self.is_bound and self.form.is_valid() + + if self.is_bound and not valid: + if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR: + raise forms.ValidationError(self.form.errors) + elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS: + self._qs = self.queryset.none() + return self._qs + # else STRICTNESS.IGNORE... ignoring + + # start with all the results and filter from there + qs = self.queryset.all() + for name, filter_ in six.iteritems(self.filters): + value = None + if valid: + value = self.form.cleaned_data[name] + else: + raw_value = self.form[name].value() + try: + value = self.form.fields[name].clean(raw_value) + except forms.ValidationError: + if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR: + raise + elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS: + self._qs = self.queryset.none() + return self._qs + # else STRICTNESS.IGNORE... ignoring + + if value is not None: # valid & clean data + qs = qs._next_is_sticky() + qs = filter_.filter(qs, value) + + self._qs = qs + + return self._qs \ No newline at end of file From 4a89630b04341d397edcb9b8a3743e75297a81c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 10 Aug 2017 11:26:10 -0300 Subject: [PATCH 11/80] Data obrigatoria em documentos acessorios (#1379) --- sapl/materia/forms.py | 1 + sapl/materia/tests/test_materia.py | 1 + sapl/materia/views.py | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index d56345179..5f5279d39 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -164,6 +164,7 @@ class AcompanhamentoMateriaForm(ModelForm): class DocumentoAcessorioForm(ModelForm): + data = forms.DateField(required=True) class Meta: model = DocumentoAcessorio diff --git a/sapl/materia/tests/test_materia.py b/sapl/materia/tests/test_materia.py index 5366959d2..0090376bf 100644 --- a/sapl/materia/tests/test_materia.py +++ b/sapl/materia/tests/test_materia.py @@ -226,6 +226,7 @@ def test_documento_acessorio_submit(admin_client): 'data_materia': '2016-03-21', 'autor': autor, 'ementa': 'teste_ementa', + 'data': '2016-03-21', 'salvar': 'salvar'}, follow=True) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 58f9862f4..c4cf64639 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1061,6 +1061,11 @@ class DocumentoAcessorioCrud(MasterDetailCrud): def __init__(self, **kwargs): super(MasterDetailCrud.CreateView, self).__init__(**kwargs) + + def get_initial(self): + self.initial['data'] = datetime.now().date() + + return self.initial def get_context_data(self, **kwargs): context = super( From 1f41fdcfc2e44951092e0da0a0d813a26a4de52a Mon Sep 17 00:00:00 2001 From: Eliseu Egewarth Date: Thu, 10 Aug 2017 11:36:55 -0300 Subject: [PATCH 12/80] =?UTF-8?q?Fix=20#741=20Adiciona=20configura=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20EMAIL=5FBACKEND=20(#1382)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Eliseu Egewarth --- sapl/settings.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sapl/settings.py b/sapl/settings.py index 0905edb1b..903b38b6a 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -39,7 +39,10 @@ ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' LOGIN_URL = '/login/?next=' -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +if DEBUG: + EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' +else: + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # SAPL business apps in dependency order From f61081a1be1748694930ab91e8e8b75b4c27d68f Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 10 Aug 2017 10:34:44 -0300 Subject: [PATCH 13/80] Adiciona campos data_hora para controle de atualizacao --- .../migrations/0010_auto_20170810_1033.py | 25 +++++++++++++++++++ sapl/sessao/models.py | 11 ++++++++ 2 files changed, 36 insertions(+) create mode 100644 sapl/sessao/migrations/0010_auto_20170810_1033.py diff --git a/sapl/sessao/migrations/0010_auto_20170810_1033.py b/sapl/sessao/migrations/0010_auto_20170810_1033.py new file mode 100644 index 000000000..b35f9e820 --- /dev/null +++ b/sapl/sessao/migrations/0010_auto_20170810_1033.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11 on 2017-08-10 10:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0009_auto_20170619_1441'), + ] + + operations = [ + migrations.AddField( + model_name='registrovotacao', + name='data_hora_atualizacao', + field=models.DateTimeField(auto_now=True, null=True, verbose_name='Data'), + ), + migrations.AddField( + model_name='registrovotacao', + name='data_hora_criacao', + field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Data Criação'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 5cd6c6501..027727731 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -400,6 +400,17 @@ class RegistroVotacao(models.Model): observacao = models.TextField( blank=True, verbose_name=_('Observações')) + data_hora_criacao = models.DateTimeField( + blank=True, null=True, + auto_now_add=True, + verbose_name=_('Data Criação')) + + data_hora_atualizacao = models.DateTimeField( + blank=True, null=True, + auto_now=True, + verbose_name=_('Data')) + + class Meta: verbose_name = _('Votação') verbose_name_plural = _('Votações') From 3f9827f1deae80c60aef95dea569dc59488d1d0a Mon Sep 17 00:00:00 2001 From: Edward Date: Thu, 10 Aug 2017 11:53:42 -0300 Subject: [PATCH 14/80] Fixes #1377 (#1383) --- sapl/base/models.py | 1 + sapl/protocoloadm/views.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/sapl/base/models.py b/sapl/base/models.py index 0a4c8d8f2..2917ea3ea 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -11,6 +11,7 @@ TIPO_DOCUMENTO_ADMINISTRATIVO = (('O', _('Ostensivo')), ('R', _('Restritivo'))) SEQUENCIA_NUMERACAO = (('A', _('Sequencial por ano')), + ('L', _('Sequencial por legislatura')), ('U', _('Sequencial único'))) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 9fffa3669..e26168d0d 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -287,6 +287,13 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, if numeracao == 'A': numero = Protocolo.objects.filter( ano=date.today().year).aggregate(Max('numero')) + elif numeracao == 'L': + legislatura = Legislatura.objects.last() + data_inicio = legislatura.data_inicio + data_fim = legislatura.data_fim + numero = Protocolo.objects.filter( + data__gte=data_inicio, data__lte=data_fim).aggregate( + Max('numero')) elif numeracao == 'U': numero = Protocolo.objects.all().aggregate(Max('numero')) From ec6e14d350dabb5b8fff824bf9ebf49fd80ca255 Mon Sep 17 00:00:00 2001 From: Edward Date: Thu, 10 Aug 2017 12:08:56 -0300 Subject: [PATCH 15/80] Fixes #1355 (#1384) --- sapl/static/styles/app.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/static/styles/app.scss b/sapl/static/styles/app.scss index f1a1ff684..56b5a002f 100644 --- a/sapl/static/styles/app.scss +++ b/sapl/static/styles/app.scss @@ -233,8 +233,8 @@ fieldset { } .avatar-parlamentar { - height: 84px; - width: 84px; + height: 106px; + width: 141px; margin: 0 auto; display: table; } From 4dabcf82be1db751047d50ea077f99ddf3764ad1 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 11 Aug 2017 10:29:07 -0300 Subject: [PATCH 16/80] add namespace a urls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Necessário para uso do sapl como app externo. --- sapl/templates/compilacao/dispositivo_form.html | 2 +- sapl/templates/compilacao/layout/dispositivo_radio.html | 2 +- sapl/templates/compilacao/text_edit_bloco.html | 2 +- sapl/templates/compilacao/text_notificacoes.html | 2 +- sapl/templates/email/confirma.html | 4 ++-- sapl/templates/materia/materialegislativa_filter.html | 6 +++--- sapl/templates/protocoloadm/anular_protocoloadm.html | 2 +- .../protocoloadm/documentoadministrativo_filter.html | 4 ++-- sapl/templates/protocoloadm/protocolar_documento.html | 2 +- sapl/templates/protocoloadm/protocolar_materia.html | 2 +- sapl/templates/protocoloadm/protocolo_filter.html | 8 ++++---- sapl/templates/protocoloadm/protocoloadm_detail.html | 6 +++--- .../protocoloadm/tramitacaoadministrativo_detail.html | 4 ++-- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/sapl/templates/compilacao/dispositivo_form.html b/sapl/templates/compilacao/dispositivo_form.html index 3de5b5b40..0e1d1f0f0 100644 --- a/sapl/templates/compilacao/dispositivo_form.html +++ b/sapl/templates/compilacao/dispositivo_form.html @@ -48,7 +48,7 @@
{%if object.ta_publicado_id %} - + {{ object.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica object None %} {{ object.tipo_dispositivo.nota_automatica_sufixo_html|safe }} diff --git a/sapl/templates/compilacao/layout/dispositivo_radio.html b/sapl/templates/compilacao/layout/dispositivo_radio.html index f5d9f7e7a..93d10eef1 100644 --- a/sapl/templates/compilacao/layout/dispositivo_radio.html +++ b/sapl/templates/compilacao/layout/dispositivo_radio.html @@ -30,7 +30,7 @@ pks="{{dpt.dispositivo_substituido_id|default:''}}" pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% endif %}{% endif %} {% if dpt.ta_publicado_id and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt ta_pub_list %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} diff --git a/sapl/templates/compilacao/text_edit_bloco.html b/sapl/templates/compilacao/text_edit_bloco.html index fce5b8657..f413e0a59 100644 --- a/sapl/templates/compilacao/text_edit_bloco.html +++ b/sapl/templates/compilacao/text_edit_bloco.html @@ -49,7 +49,7 @@ {% if node.da and node.dpt.texto_atualizador and node in node.da.alts%}{{ node.dpt.texto_atualizador|safe }}{% else %}{{ node.dpt.texto|safe }}{% endif %} {%endif%} {% if node.na %} - + {{ node.td.nota_automatica_prefixo_html|safe }} {{ node.na }} diff --git a/sapl/templates/compilacao/text_notificacoes.html b/sapl/templates/compilacao/text_notificacoes.html index c2e880ba6..ea43eb3f3 100644 --- a/sapl/templates/compilacao/text_notificacoes.html +++ b/sapl/templates/compilacao/text_notificacoes.html @@ -32,7 +32,7 @@ pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% endif %}{% endif %} {%if dpt.ta_publicado_id %} - + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt None %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} diff --git a/sapl/templates/email/confirma.html b/sapl/templates/email/confirma.html index 1dd9e1651..64dd05849 100644 --- a/sapl/templates/email/confirma.html +++ b/sapl/templates/email/confirma.html @@ -2,6 +2,6 @@ {% load i18n %} {% block detail_content %} -Sua conta foi confirmada via e-mail. Clique aqui para fazer seu login. +Sua conta foi confirmada via e-mail. Clique aqui para fazer seu login. -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index 0f7d99468..e048a6c8b 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -39,7 +39,7 @@ {% for m in page_obj %} - {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}} + {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}
Ementa: {{ m.ementa|safe }}
@@ -99,7 +99,7 @@ {% if m.anexo_de.exists %} {% for a in m.materia_anexada_set.all %} Matéria Anexadora:   - + {{ a.materia_principal }}  Data Anexação: {{a.data_anexacao}} @@ -109,7 +109,7 @@ {% if m.anexadas.all.exists %} {% for anexada in m.materia_principal_set.all %} Matéria Anexada:   - + {{ anexada.materia_anexada }}  Data Anexação: {{anexada.data_anexacao}} diff --git a/sapl/templates/protocoloadm/anular_protocoloadm.html b/sapl/templates/protocoloadm/anular_protocoloadm.html index b936ed7ad..cb4af2399 100644 --- a/sapl/templates/protocoloadm/anular_protocoloadm.html +++ b/sapl/templates/protocoloadm/anular_protocoloadm.html @@ -7,7 +7,7 @@ {{ block.super }} {% endblock %} diff --git a/sapl/templates/protocoloadm/documentoadministrativo_filter.html b/sapl/templates/protocoloadm/documentoadministrativo_filter.html index a5b29ad42..987299560 100644 --- a/sapl/templates/protocoloadm/documentoadministrativo_filter.html +++ b/sapl/templates/protocoloadm/documentoadministrativo_filter.html @@ -15,7 +15,7 @@ {% if filter_url %} {% endif %} {% endblock actions %} @@ -36,7 +36,7 @@ {% for d in page_obj %} - {{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}
+ {{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}
Interessado: {{ d.interessado|default_if_none:"Não informado"}}
Assunto: {{ d.assunto|safe }}
diff --git a/sapl/templates/protocoloadm/protocolar_documento.html b/sapl/templates/protocoloadm/protocolar_documento.html index 9f2213128..5cb1fa789 100644 --- a/sapl/templates/protocoloadm/protocolar_documento.html +++ b/sapl/templates/protocoloadm/protocolar_documento.html @@ -7,7 +7,7 @@ {{ block.super }} {% endblock %} diff --git a/sapl/templates/protocoloadm/protocolar_materia.html b/sapl/templates/protocoloadm/protocolar_materia.html index 21d0db47e..ca172eb92 100644 --- a/sapl/templates/protocoloadm/protocolar_materia.html +++ b/sapl/templates/protocoloadm/protocolar_materia.html @@ -6,7 +6,7 @@ {{ block.super }} {% endblock %} diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index 94c5c8b8a..37f529f10 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -10,7 +10,7 @@ {% if filter_url %} {% endif %} @@ -38,13 +38,13 @@ Protocolo: - {{ p.numero|stringformat:'06d' }}/{{ p.ano }}  -   - Etiqueta Individual + {{ p.numero|stringformat:'06d' }}/{{ p.ano }}  -   + Etiqueta Individual {% if p.anulado %}  ** NULO **{% endif %}
Assunto: {{ p.assunto_ementa|default_if_none:"Não informado"}}
Data Protocolo: {{ p.data|date:"d/m/Y"|default_if_none:"Não informado" }} - Horário: {{ p.hora|date:"G:i:s" }}
- + {% if p.tipo_processo == 0 %} Interessado: {{ p.interessado|default_if_none:"Não informado" }}
{% elif p.tipo_processo == 1 %} diff --git a/sapl/templates/protocoloadm/protocoloadm_detail.html b/sapl/templates/protocoloadm/protocoloadm_detail.html index dc91ac252..3cdabaacb 100644 --- a/sapl/templates/protocoloadm/protocoloadm_detail.html +++ b/sapl/templates/protocoloadm/protocoloadm_detail.html @@ -2,8 +2,8 @@ {% load i18n %} {% block editions %} {% endblock editions %} diff --git a/sapl/templates/protocoloadm/tramitacaoadministrativo_detail.html b/sapl/templates/protocoloadm/tramitacaoadministrativo_detail.html index e5caab499..c3493ee66 100644 --- a/sapl/templates/protocoloadm/tramitacaoadministrativo_detail.html +++ b/sapl/templates/protocoloadm/tramitacaoadministrativo_detail.html @@ -4,7 +4,7 @@ {% load common_tags %}
-{% trans 'Início' %} +{% trans 'Início' %} {% if perms|get_change_perm:view %} {% trans 'Editar' %} {% endif %} @@ -12,4 +12,4 @@ {% trans 'Excluir' %} {% endif %}
-{% endblock actions %} \ No newline at end of file +{% endblock actions %} From 72bb73ae09003639fcdabe452a6de8ddc5cbf718 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Fri, 11 Aug 2017 11:46:12 -0300 Subject: [PATCH 17/80] Fixes #1393 --- sapl/sessao/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 027727731..d746ac1e8 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -488,7 +488,7 @@ class Bloco(models.Model): nome = models.CharField( max_length=80, verbose_name=_('Nome do Bloco')) partidos = models.ManyToManyField( - Partido, blank=True, verbose_name=_('Bancadas')) + Partido, blank=True, verbose_name=_('Partidos')) data_criacao = models.DateField( blank=True, null=True, verbose_name=_('Data Criação')) data_extincao = models.DateField( From a07e53257e7cf0a108f17542160df2ca336f0beb Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 11 Aug 2017 15:05:23 -0300 Subject: [PATCH 18/80] Fix #1395 --- sapl/crud/base.py | 6 ++- sapl/parlamentares/views.py | 74 ++++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/sapl/crud/base.py b/sapl/crud/base.py index a00336fc7..70ea1c859 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -17,8 +17,8 @@ from django.http.response import Http404 from django.shortcuts import redirect from django.utils.decorators import classonlymethod from django.utils.encoding import force_text -from django.utils.translation import ugettext_lazy as _ from django.utils.translation import string_concat +from django.utils.translation import ugettext_lazy as _ from django.views.generic import (CreateView, DeleteView, DetailView, ListView, UpdateView) from django.views.generic.base import ContextMixin @@ -30,6 +30,7 @@ from sapl.rules.map_rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL, from sapl.settings import BASE_DIR from sapl.utils import normalize + logger = logging.getLogger(BASE_DIR.name) ACTION_LIST, ACTION_CREATE, ACTION_DETAIL, ACTION_UPDATE, ACTION_DELETE = \ @@ -955,7 +956,8 @@ class CrudAux(Crud): Se o valor de subnav_template_name é nulo faz o filter subnav não abrir o padrão e nem um outro arquivo. """ - context['subnav_template_name'] = self.subnav_template_name + if 'subnav_template_name' not in context: + context['subnav_template_name'] = self.subnav_template_name return context @classonlymethod diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 309c8b3cd..00c0c5aef 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -1,7 +1,12 @@ +import datetime +import json + from django.contrib import messages +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import F, Q +from django.db.models.aggregates import Count from django.http import JsonResponse from django.http.response import HttpResponseRedirect from django.templatetags.static import static @@ -9,11 +14,14 @@ from django.utils.datastructures import MultiValueDictKeyError from django.utils.translation import ugettext_lazy as _ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import FormView +from django.views.generic.edit import UpdateView +from sapl.base.models import Autor from sapl.comissoes.models import Participacao from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux, CrudBaseForListAndDetailExternalAppView, MasterDetailCrud) +from sapl.materia.models import Autoria from sapl.materia.models import Proposicao, Relatoria from sapl.parlamentares.apps import AppConfig @@ -25,14 +33,6 @@ from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar, TipoAfastamento, TipoDependente, Votante) -from sapl.base.models import Autor -from sapl.materia.models import Autoria -from django.contrib.contenttypes.models import ContentType -from django.db.models.aggregates import Count - -import datetime -import json - CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa') PartidoCrud = CrudAux.build(Partido, 'partidos') @@ -189,7 +189,8 @@ class ColigacaoCrud(CrudAux): ordering = ('-numero_votos', 'nome') def get_context_data(self, **kwargs): - context = super(ColigacaoCrud.ListView, self).get_context_data(kwargs=kwargs) + context = super(ColigacaoCrud.ListView, self).get_context_data( + kwargs=kwargs) rows = context['rows'] coluna_votos_recebidos = 2 for row in rows: @@ -201,15 +202,25 @@ class ColigacaoCrud(CrudAux): class DetailView(CrudAux.DetailView): def get_context_data(self, **kwargs): - context = super(ColigacaoCrud.DetailView, self).get_context_data(kwargs=kwargs) + context = super().get_context_data(kwargs=kwargs) coligacao = context['coligacao'] if not coligacao.numero_votos: coligacao.numero_votos = '0' + context['subnav_template_name'] = \ + 'parlamentares/subnav_coligacao.yaml' + return context - class BaseMixin(CrudAux.BaseMixin): - subnav_template_name = 'parlamentares/subnav_coligacao.yaml' + class UpdateView(CrudAux.UpdateView): + + def get_context_data(self, **kwargs): + context = super(UpdateView, self).get_context_data(kwargs=kwargs) + + context['subnav_template_name'] = \ + 'parlamentares/subnav_coligacao.yaml' + + return context def json_date_convert(date): @@ -295,6 +306,7 @@ class FrenteCrud(CrudAux): list_field_names = ['nome', 'data_criacao', 'parlamentares'] class CreateView(CrudAux.CreateView): + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -305,6 +317,7 @@ class FrenteCrud(CrudAux): return context class UpdateView(CrudAux.UpdateView): + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -343,7 +356,6 @@ class MandatoCrud(MasterDetailCrud): return context - class CreateView(MasterDetailCrud.CreateView): form_class = MandatoForm @@ -388,6 +400,7 @@ class LegislaturaCrud(CrudAux): form_class = LegislaturaUpdateForm class DetailView(CrudAux.DetailView): + def has_permission(self): return True @@ -396,6 +409,7 @@ class LegislaturaCrud(CrudAux): return super().get(request, *args, **kwargs) class ListView(CrudAux.ListView): + def has_permission(self): return True @@ -621,7 +635,7 @@ class ParlamentarMateriasView(FormView): 'materia__tipo__sigla', 'materia__tipo__descricao').annotate( total=Count('materia__tipo__pk')).order_by( - '-materia__ano', 'materia__tipo') + '-materia__ano', 'materia__tipo') autor_list = self.get_autoria(autoria) coautor_list = self.get_autoria(coautoria) @@ -823,24 +837,24 @@ def remove_parlamentar_composicao(request): '%s.delete_%s' % ( AppConfig.label, ComposicaoMesa._meta.model_name)): - if 'composicao_mesa' in request.POST: - try: - composicao = ComposicaoMesa.objects.get( - id=request.POST['composicao_mesa']) - except ObjectDoesNotExist: - return JsonResponse( - {'msg': ( - 'Composição da Mesa não pôde ser removida!', 0)}) - - composicao.delete() - - return JsonResponse( - {'msg': ( - 'Parlamentar excluido com sucesso!', 1)}) - else: + if 'composicao_mesa' in request.POST: + try: + composicao = ComposicaoMesa.objects.get( + id=request.POST['composicao_mesa']) + except ObjectDoesNotExist: return JsonResponse( {'msg': ( - 'Selecione algum parlamentar para ser excluido!', 0)}) + 'Composição da Mesa não pôde ser removida!', 0)}) + + composicao.delete() + + return JsonResponse( + {'msg': ( + 'Parlamentar excluido com sucesso!', 1)}) + else: + return JsonResponse( + {'msg': ( + 'Selecione algum parlamentar para ser excluido!', 0)}) def partido_parlamentar_sessao_legislativa(sessao, parlamentar): From 745fe8f364108e90ecfc89ae3c2a14fb5cd540ab Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Fri, 11 Aug 2017 17:00:46 -0300 Subject: [PATCH 19/80] Fixes #1399 --- sapl/templates/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 7c0a72ca2..554f08756 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -202,7 +202,7 @@
CEP: {{ cep }} | Telefone: {{ telefone }}
{% trans 'Site da Câmara' %} | - +
{% else %} From ac9d9d1560886674235e8b283fbd4d47c43c55f7 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Fri, 11 Aug 2017 17:21:02 -0300 Subject: [PATCH 20/80] Novo release: 3.1.19-BETA --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index ca771995a..df4e37f2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ sapldb: ports: - "5532:5432" sapl: - image: interlegis/sapl:3.1.18-BETA + image: interlegis/sapl:3.1.19-BETA volumes: - sapl_data:/var/interlegis/sapl/data - sapl_media:/var/interlegis/sapl/media From bffe5fc15fb5d73d52bc524a2934b65f8ab4acd9 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Fri, 11 Aug 2017 19:41:56 -0300 Subject: [PATCH 21/80] Fixes #1400 --- sapl/sessao/forms.py | 32 ++++++++++++++++++++++++++++++++ sapl/sessao/views.py | 6 +++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 91881b32c..c617364bc 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -51,6 +51,38 @@ ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'), ('oradores_exped', 'Oradores do Expediente'), ('oradores_expli', 'Oradores das Explicações Pessoais')] +class SessaoPlenariaForm(ModelForm): + + class Meta: + model = SessaoPlenaria + exclude = ['cod_andamento_sessao'] + + def clean(self): + super(SessaoPlenariaForm, self).clean() + + instance = self.instance + + num = self.cleaned_data['numero'] + sl = self.cleaned_data['sessao_legislativa'] + leg = self.cleaned_data['legislatura'] + + sessoes = SessaoPlenaria.objects.filter(numero=num, + sessao_legislativa=sl, + legislatura=leg).\ + values_list('id', flat=True) + + qtd_sessoes = len(sessoes) + + error = ValidationError('Número de Sessão Plenária Existente') + + if qtd_sessoes > 0: + if instance.pk: # update + if not instance.pk in sessoes or qtd_sessoes > 1: + raise error + else: # create + raise error + + return self.cleaned_data class BancadaForm(ModelForm): diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index f72f803e1..fb44472c9 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -37,7 +37,7 @@ from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm from .forms import (AdicionarVariasMateriasFilterSet, ExpedienteForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, - ResumoOrdenacaoForm, SessaoPlenariaFilterSet, + ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, VotacaoNominalForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, IntegranteMesa, @@ -542,11 +542,15 @@ class SessaoCrud(Crud): class UpdateView(Crud.UpdateView): + form_class = SessaoPlenariaForm + def get_initial(self): return {'sessao_legislativa': self.object.sessao_legislativa} class CreateView(Crud.CreateView): + form_class = SessaoPlenariaForm + @property def cancel_url(self): return self.search_url From a151e3ece2510a89f1fc4e529da64864108321fc Mon Sep 17 00:00:00 2001 From: Eliseu Egewarth Date: Mon, 14 Aug 2017 14:24:59 -0300 Subject: [PATCH 22/80] HOT-FIX: generate migrations for #1393 and #1377 Signed-off-by: Eliseu Egewarth --- .../migrations/0008_auto_20170814_1409.py | 20 +++++++++++++++++++ .../migrations/0011_auto_20170814_1409.py | 20 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 sapl/base/migrations/0008_auto_20170814_1409.py create mode 100644 sapl/sessao/migrations/0011_auto_20170814_1409.py diff --git a/sapl/base/migrations/0008_auto_20170814_1409.py b/sapl/base/migrations/0008_auto_20170814_1409.py new file mode 100644 index 000000000..deb735055 --- /dev/null +++ b/sapl/base/migrations/0008_auto_20170814_1409.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-08-14 14:09 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0007_auto_20170808_0850'), + ] + + operations = [ + migrations.AlterField( + model_name='appconfig', + name='sequencia_numeracao', + field=models.CharField(choices=[('A', 'Sequencial por ano'), ('L', 'Sequencial por legislatura'), ('U', 'Sequencial único')], default='A', max_length=1, verbose_name='Sequência de numeração'), + ), + ] diff --git a/sapl/sessao/migrations/0011_auto_20170814_1409.py b/sapl/sessao/migrations/0011_auto_20170814_1409.py new file mode 100644 index 000000000..316cd7a1a --- /dev/null +++ b/sapl/sessao/migrations/0011_auto_20170814_1409.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-08-14 14:09 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0010_auto_20170810_1033'), + ] + + operations = [ + migrations.AlterField( + model_name='bloco', + name='partidos', + field=models.ManyToManyField(blank=True, to='parlamentares.Partido', verbose_name='Partidos'), + ), + ] From b4e333ca88770bb2639034035ea398c1d0d15538 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 14 Aug 2017 16:06:28 -0300 Subject: [PATCH 23/80] Fixes #1386 --- .../templates/parlamentares/public_composicaomesa_form.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sapl/templates/parlamentares/public_composicaomesa_form.html b/sapl/templates/parlamentares/public_composicaomesa_form.html index d9150da59..5017a0ef1 100644 --- a/sapl/templates/parlamentares/public_composicaomesa_form.html +++ b/sapl/templates/parlamentares/public_composicaomesa_form.html @@ -46,7 +46,7 @@ {% for p in composicao_mesa %} {% if p.parlamentar.fotografia %} - + {% else %} {% endif %} @@ -119,8 +119,8 @@ function altera_field(id_legislatura, id_sessao=null){ // Garante que a Sessão atual será a selecionada previamente e, no caso em que // o campo modificado seja o de Legislatura, que a Sessão seja a última daquela // legislatura - $("#id_sessao_legislativa").val(data['sessao_selecionada']) - + $("#id_sessao_legislativa").val(data['sessao_selecionada']) + }); } From 9dcf58b3ebb33d73b7e1b227e5543ed4fb54e524 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 14 Aug 2017 16:19:40 -0300 Subject: [PATCH 24/80] Fixes #1391 --- .../migrations/0005_auto_20170814_1615.py | 19 +++++++++++++++ sapl/parlamentares/models.py | 4 ++-- .../migrations/0012_auto_20170814_1615.py | 23 +++++++++++++++++++ sapl/sessao/models.py | 8 +++---- sapl/templates/sistema.html | 10 ++++---- 5 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 sapl/parlamentares/migrations/0005_auto_20170814_1615.py create mode 100644 sapl/sessao/migrations/0012_auto_20170814_1615.py diff --git a/sapl/parlamentares/migrations/0005_auto_20170814_1615.py b/sapl/parlamentares/migrations/0005_auto_20170814_1615.py new file mode 100644 index 000000000..e71dd1fd8 --- /dev/null +++ b/sapl/parlamentares/migrations/0005_auto_20170814_1615.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11 on 2017-08-14 16:15 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0004_auto_20170711_1305'), + ] + + operations = [ + migrations.AlterModelOptions( + name='frente', + options={'verbose_name': 'Frente Parlamentar', 'verbose_name_plural': 'Frentes Parlamentares'}, + ), + ] diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index 5039be89e..34aa8b3e8 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -554,8 +554,8 @@ class Frente(models.Model): )) class Meta: - verbose_name = _('Frente') - verbose_name_plural = _('Frentes') + verbose_name = _('Frente Parlamentar') + verbose_name_plural = _('Frentes Parlamentares') def get_parlamentares(self): return Parlamentar.objects.filter(ativo=True) diff --git a/sapl/sessao/migrations/0012_auto_20170814_1615.py b/sapl/sessao/migrations/0012_auto_20170814_1615.py new file mode 100644 index 000000000..7060ad9db --- /dev/null +++ b/sapl/sessao/migrations/0012_auto_20170814_1615.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11 on 2017-08-14 16:15 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0011_auto_20170814_1409'), + ] + + operations = [ + migrations.AlterModelOptions( + name='bancada', + options={'ordering': ('-legislatura__numero',), 'verbose_name': 'Bancada Parlamentar', 'verbose_name_plural': 'Bancadas Parlamentares'}, + ), + migrations.AlterModelOptions( + name='bloco', + options={'verbose_name': 'Bloco Parlamentar', 'verbose_name_plural': 'Blocos Parlamentares'}, + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index d746ac1e8..89e986341 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -59,8 +59,8 @@ class Bancada(models.Model): )) class Meta: - verbose_name = _('Bancada') - verbose_name_plural = _('Bancadas') + verbose_name = _('Bancada Parlamentar') + verbose_name_plural = _('Bancadas Parlamentares') ordering = ('-legislatura__numero', ) def __str__(self): @@ -507,8 +507,8 @@ class Bloco(models.Model): )) class Meta: - verbose_name = _('Bloco') - verbose_name_plural = _('Blocos') + verbose_name = _('Bloco Parlamentar') + verbose_name_plural = _('Blocos Parlamentares') def __str__(self): return self.nome diff --git a/sapl/templates/sistema.html b/sapl/templates/sistema.html index e631d84a8..c8d31c179 100644 --- a/sapl/templates/sistema.html +++ b/sapl/templates/sistema.html @@ -39,12 +39,12 @@
-

Módulo Bancadas

+

Módulo Bancadas Parlamentares


From cd898ac3dc83c132ec01ef963e75fc71986d47cd Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 15 Aug 2017 14:12:11 -0300 Subject: [PATCH 25/80] =?UTF-8?q?HOT-FIX:=20adiciona=20espa=C3=A7o=20entre?= =?UTF-8?q?=20palavras?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/protocoloadm/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 7fb1d2d7a..24319ac05 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -244,7 +244,7 @@ class AnularProcoloAdmForm(ModelForm): if exists: raise forms.ValidationError( - _("Protocolo %s/%s não pode ser removido pois existem" + _("Protocolo %s/%s não pode ser removido pois existem " "documentos vinculados a ele." % (numero, ano))) class Meta: From 6ea7c0975c67d8ae134fa850e05cfeea413012b1 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 15 Aug 2017 16:24:21 -0300 Subject: [PATCH 26/80] Fix #1257 --- sapl/sessao/forms.py | 28 +++++++---- sapl/sessao/views.py | 49 +++++++++---------- .../adicionar_varias_materias_expediente.html | 12 +++-- .../adicionar_varias_materias_ordem.html | 2 +- 4 files changed, 51 insertions(+), 40 deletions(-) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index c617364bc..2b9e6788c 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -10,7 +10,8 @@ from django.utils.translation import ugettext_lazy as _ from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.forms import MateriaLegislativaFilterSet -from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa +from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa, + StatusTramitacao) from sapl.parlamentares.models import Parlamentar from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, MateriaPesquisaOrderingFilter, autor_label, @@ -287,10 +288,15 @@ class SessaoPlenariaFilterSet(django_filters.FilterSet): class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet): o = MateriaPesquisaOrderingFilter() + tramitacao__status = django_filters.ModelChoiceFilter( + required=True, + queryset=StatusTramitacao.objects.all(), + label=_('Status da Matéria')) class Meta: model = MateriaLegislativa - fields = ['numero', + fields = ['tramitacao__status', + 'numero', 'numero_protocolo', 'ano', 'tipo', @@ -312,15 +318,17 @@ class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet): self.filters['relatoria__parlamentar_id'].label = 'Relatoria' row1 = to_row( - [('tipo', 12)]) + [('tramitacao__status', 12)]) row2 = to_row( + [('tipo', 12)]) + row3 = to_row( [('numero', 4), ('ano', 4), ('numero_protocolo', 4)]) - row3 = to_row( + row4 = to_row( [('data_apresentacao', 6), ('data_publicacao', 6)]) - row4 = to_row( + row5 = to_row( [('autoria__autor', 0), (Button('pesquisar', 'Pesquisar Autor', @@ -328,17 +336,17 @@ class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet): (Button('limpar', 'limpar Autor', css_class='btn btn-primary btn-sm'), 10)]) - row5 = to_row( + row6 = to_row( [('autoria__autor__tipo', 6), # ('autoria__autor__partido', 6) ]) - row6 = to_row( + row7 = to_row( [('relatoria__parlamentar_id', 6), ('local_origem_externa', 6)]) - row7 = to_row( + row8 = to_row( [('em_tramitacao', 6), ('o', 6)]) - row8 = to_row( + row9 = to_row( [('ementa', 12)]) self.form.helper = FormHelper() @@ -348,7 +356,7 @@ class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet): row1, row2, row3, HTML(autor_label), HTML(autor_modal), - row4, row5, row6, row7, row8, + row4, row5, row6, row7, row8, row9, form_actions(save_label='Pesquisar')) ) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index fb44472c9..4ab7ea4f8 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -25,7 +25,7 @@ from sapl.base.models import AppConfig as AppsAppConfig from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, PermissionRequiredForAppCrudMixin, make_pagination) -from sapl.materia.forms import pega_ultima_tramitacao +from sapl.materia.forms import filtra_tramitacao_status from sapl.materia.models import (Autoria, DocumentoAcessorio, TipoMateriaLegislativa, Tramitacao) from sapl.materia.views import MateriaLegislativaPesquisaView @@ -2434,14 +2434,6 @@ class PesquisarPautaSessaoView(PesquisarSessaoPlenariaView): return context -def filtra_tramitacao_ordem_dia(): - lista = pega_ultima_tramitacao() - return Tramitacao.objects.filter( - id__in=lista, - status__descricao='Ordem do Dia').distinct().values_list( - 'materia_id', flat=True) - - def retira_materias_ja_adicionadas(id_sessao, model): lista = model.objects.filter( sessao_plenaria_id=id_sessao) @@ -2463,17 +2455,21 @@ class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin, qs = self.get_queryset() - lista_ordem_dia = filtra_tramitacao_ordem_dia() + if 'tramitacao__status' in self.request.GET: + if self.request.GET['tramitacao__status']: + lista_status = filtra_tramitacao_status( + self.request.GET['tramitacao__status']) - lista_materias_adicionadas = retira_materias_ja_adicionadas( - self.kwargs['pk'], ExpedienteMateria) + lista_materias_adicionadas = retira_materias_ja_adicionadas( + self.kwargs['pk'], ExpedienteMateria) - qs = qs.filter(id__in=lista_ordem_dia).exclude( - id__in=lista_materias_adicionadas).distinct() + qs = qs.filter(id__in=lista_status).exclude( + id__in=lista_materias_adicionadas).distinct() + + kwargs.update({ + 'queryset': qs, + }) - kwargs.update({ - 'queryset': qs, - }) return kwargs def get_context_data(self, **kwargs): @@ -2543,17 +2539,20 @@ class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente): qs = self.get_queryset() - lista_ordem_dia = filtra_tramitacao_ordem_dia() + if 'tramitacao__status' in self.request.GET: + if self.request.GET['tramitacao__status']: + lista_status = filtra_tramitacao_status( + self.request.GET['tramitacao__status']) - lista_materias_adicionadas = retira_materias_ja_adicionadas( - self.kwargs['pk'], OrdemDia) + lista_materias_adicionadas = retira_materias_ja_adicionadas( + self.kwargs['pk'], OrdemDia) - qs = qs.filter(id__in=lista_ordem_dia).exclude( - id__in=lista_materias_adicionadas).distinct() + qs = qs.filter(id__in=lista_status).exclude( + id__in=lista_materias_adicionadas).distinct() - kwargs.update({ - 'queryset': qs, - }) + kwargs.update({ + 'queryset': qs, + }) return kwargs def post(self, request, *args, **kwargs): diff --git a/sapl/templates/sessao/adicionar_varias_materias_expediente.html b/sapl/templates/sessao/adicionar_varias_materias_expediente.html index c8f25c923..362ba300d 100644 --- a/sapl/templates/sessao/adicionar_varias_materias_expediente.html +++ b/sapl/templates/sessao/adicionar_varias_materias_expediente.html @@ -9,7 +9,7 @@ {% block detail_content %} {% block buttons %} - {% if filter_url %} + {% if filter_url and not filter.form.errors %} @@ -22,12 +22,16 @@ {% endblock %} - {% if not filter_url %} + {% if filter.form.errors %} {% crispy filter.form %} - {% endif %} + {% else %} + {% if not filter_url %} + {% crispy filter.form %} + {% endif %} + {% endif %}

- {% if filter_url %} + {% if filter_url and not filter.form.errors %} diff --git a/sapl/templates/sessao/adicionar_varias_materias_ordem.html b/sapl/templates/sessao/adicionar_varias_materias_ordem.html index 381cae9d7..51d4fee23 100644 --- a/sapl/templates/sessao/adicionar_varias_materias_ordem.html +++ b/sapl/templates/sessao/adicionar_varias_materias_ordem.html @@ -4,7 +4,7 @@ {% block buttons %} - {% if filter_url %} + {% if filter_url and not filter.form.errors %}
{% trans 'Fazer nova pesquisa' %} From 3b6dce95631ac28bc7c50291e7dc8aff6d39d8c0 Mon Sep 17 00:00:00 2001 From: Mariana Mendes Date: Wed, 16 Aug 2017 17:50:37 -0300 Subject: [PATCH 27/80] Fix #1372 tipo votacao flag (#1401) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Insire novo campo em tipo resultado votaçaõ * Fix #1372 * Insere migração para o novo campo * Corrige o bug * Corrige conflito de migração --- sapl/painel/views.py | 4 +++ .../migrations/0010_auto_20170814_1804.py | 25 +++++++++++++++++++ .../migrations/0011_auto_20170814_1849.py | 20 +++++++++++++++ .../migrations/0012_auto_20170815_1244.py | 21 ++++++++++++++++ sapl/sessao/migrations/0013_merge.py | 16 ++++++++++++ sapl/sessao/models.py | 7 +++++- sapl/templates/painel/index.html | 2 +- sapl/templates/sessao/layouts.yaml | 1 + 8 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 sapl/sessao/migrations/0010_auto_20170814_1804.py create mode 100644 sapl/sessao/migrations/0011_auto_20170814_1849.py create mode 100644 sapl/sessao/migrations/0012_auto_20170815_1244.py create mode 100644 sapl/sessao/migrations/0013_merge.py diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 57ecf5c0e..e3271a309 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -425,6 +425,7 @@ def get_votos(response, materia): 'total_votos': total, 'tipo_votacao': tipo_votacao, 'tipo_resultado': registro.tipo_resultado_votacao.nome, + 'natureza_resultado': registro.tipo_resultado_votacao.natureza, }) else: response.update({ @@ -434,6 +435,7 @@ def get_votos(response, materia): 'total_votos': 0, 'tipo_votacao': tipo_votacao, 'tipo_resultado': 'Ainda não foi votada.', + 'natureza_resultado': None, }) return response @@ -463,6 +465,7 @@ def get_votos_nominal(response, materia): 'total_votos': 0, 'tipo_votacao': tipo_votacao, 'tipo_resultado': 'Não foi votado ainda', + 'natureza_resultado': None, 'votos': None }) @@ -505,6 +508,7 @@ def get_votos_nominal(response, materia): 'total_votos': total, 'tipo_votacao': tipo_votacao, 'tipo_resultado': registro.tipo_resultado_votacao.nome, + 'natureza_resultado': registro.tipo_resultado_votacao.natureza, 'votos': votos }) diff --git a/sapl/sessao/migrations/0010_auto_20170814_1804.py b/sapl/sessao/migrations/0010_auto_20170814_1804.py new file mode 100644 index 000000000..e4bc8393e --- /dev/null +++ b/sapl/sessao/migrations/0010_auto_20170814_1804.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-08-14 18:04 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0009_auto_20170619_1441'), + ] + + operations = [ + migrations.AddField( + model_name='tiporesultadovotacao', + name='natureza', + field=models.CharField(choices=[('A', 'Aprovado'), ('R', 'Rejeitado')], max_length=100, null=True, verbose_name='Natureza do Tipo'), + ), + migrations.AlterField( + model_name='tiporesultadovotacao', + name='nome', + field=models.CharField(max_length=100, verbose_name='Nome do Tipo'), + ), + ] diff --git a/sapl/sessao/migrations/0011_auto_20170814_1849.py b/sapl/sessao/migrations/0011_auto_20170814_1849.py new file mode 100644 index 000000000..b067ab5c1 --- /dev/null +++ b/sapl/sessao/migrations/0011_auto_20170814_1849.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-08-14 18:49 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0010_auto_20170814_1804'), + ] + + operations = [ + migrations.AlterField( + model_name='tiporesultadovotacao', + name='natureza', + field=models.CharField(blank=True, choices=[('A', 'Aprovado'), ('R', 'Rejeitado')], max_length=100, null=True, verbose_name='Natureza do Tipo'), + ), + ] diff --git a/sapl/sessao/migrations/0012_auto_20170815_1244.py b/sapl/sessao/migrations/0012_auto_20170815_1244.py new file mode 100644 index 000000000..03b570a70 --- /dev/null +++ b/sapl/sessao/migrations/0012_auto_20170815_1244.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-08-15 12:44 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0011_auto_20170814_1849'), + ] + + operations = [ + migrations.AlterField( + model_name='tiporesultadovotacao', + name='natureza', + field=models.CharField(blank=True, choices=[('A', 'Aprovado'), ('R', 'Rejeitado')], default='', max_length=100, verbose_name='Natureza do Tipo'), + preserve_default=False, + ), + ] diff --git a/sapl/sessao/migrations/0013_merge.py b/sapl/sessao/migrations/0013_merge.py new file mode 100644 index 000000000..e7d2d8deb --- /dev/null +++ b/sapl/sessao/migrations/0013_merge.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2017-08-15 13:42 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0012_auto_20170814_1615'), + ('sessao', '0012_auto_20170815_1244'), + ] + + operations = [ + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 89e986341..6789d647d 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -368,7 +368,12 @@ class PresencaOrdemDia(models.Model): # OrdemDiaPresenca @reversion.register() class TipoResultadoVotacao(models.Model): - nome = models.CharField(max_length=100, verbose_name=_('Tipo')) + nome = models.CharField(max_length=100, verbose_name=_('Nome do Tipo')) + natureza = models.CharField(max_length=100, + blank=True, + choices=(('A', 'Aprovado'), + ('R', 'Rejeitado')), + verbose_name=_('Natureza do Tipo')) class Meta: verbose_name = _('Tipo de Resultado de Votação') diff --git a/sapl/templates/painel/index.html b/sapl/templates/painel/index.html index 98eabb6ab..85fdf3050 100644 --- a/sapl/templates/painel/index.html +++ b/sapl/templates/painel/index.html @@ -182,7 +182,7 @@ presentes_ordem_dia = data["presentes_expediente"] } presentes.append('
'); - if( (data["tipo_resultado"] == "Aprovado por Unanimidade") || (data["tipo_resultado"] == "Aprovado por maioria") || (data["tipo_resultado"] == "Rejeitado")) { + if( data["natureza_resultado"] == "A" || data["natureza_resultado"] == "R" ) { if (data["tipo_votacao"] == "Nominal") { jQuery.each(data["votos"], function (index, parlamentar) { $('#parlamentares_list').append(' {% for p in parlamentares %} - + diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca.html b/sapl/templates/sessao/blocos_resumo/lista_presenca.html index 60b487068..56ecf9c17 100644 --- a/sapl/templates/sessao/blocos_resumo/lista_presenca.html +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca.html @@ -4,7 +4,7 @@ Lista de Presença na Sessão
{% for p in presenca_sessao %} -
{{p.nome_parlamentar}} / {{ p|filiacao_epoca_filter:object }}
+
{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }}
{% endfor %}
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html b/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html index 9ddb8fe1f..ea58e160e 100644 --- a/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html @@ -4,7 +4,7 @@ Lista de Presença na Ordem do Dia
{% for p in presenca_ordem %} -
{{p.nome_parlamentar}} / {{ p|filiacao_epoca_filter:object }}
+
{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }}
{% endfor %}
\ No newline at end of file diff --git a/sapl/utils.py b/sapl/utils.py index 0c0eb1cd3..f707a2c91 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -598,19 +598,48 @@ def qs_override_django_filter(self): return self._qs -def filiacao_data(parlamentar, data): +def filiacao_data(parlamentar, data_inicio, data_fim=None): from sapl.parlamentares.models import Filiacao filiacoes_parlamentar = Filiacao.objects.filter( parlamentar=parlamentar) filiacoes = filiacoes_parlamentar.filter(Q( - data__lte=data, + data__lte=data_inicio, data_desfiliacao__isnull=True) | Q( - data__lte=data, - data_desfiliacao__gte=data)) + data__lte=data_inicio, + data_desfiliacao__gte=data_inicio)) - if filiacoes: - return filiacoes.last().partido.sigla + if data_fim: + filiacoes = filiacoes | filiacoes_parlamentar.filter( + data__gte=data_inicio, + data__lte=data_fim) + + return ' | '.join([f.partido.sigla for f in filiacoes]) + + +def parlamentares_ativos(data_inicio, data_fim=None): + from sapl.parlamentares.models import Mandato, Parlamentar + ''' + :param data_inicio: define a data de inicial do período desejado + :param data_fim: define a data final do período desejado + :return: queryset dos parlamentares ativos naquele período + ''' + mandatos_ativos = Mandato.objects.filter(Q( + data_inicio_mandato__lte=data_inicio, + data_fim_mandato__isnull=True) | Q( + data_inicio_mandato__lte=data_inicio, + data_fim_mandato__gte=data_inicio)) + if data_fim: + mandatos_ativos = mandatos_ativos | Mandato.objects.filter( + data_inicio_mandato__gte=data_inicio, + data_inicio_mandato__lte=data_fim) else: - return '' \ No newline at end of file + mandatos_ativos = mandatos_ativos | Mandato.objects.filter( + data_inicio_mandato__gte=data_inicio) + + parlamentares_id = mandatos_ativos.values_list( + 'parlamentar_id', + flat=True).distinct('parlamentar_id') + + return Parlamentar.objects.filter(id__in=parlamentares_id) \ No newline at end of file From cc5b119beb1f8efdd298fa13a211ce28fc341cea Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Thu, 17 Aug 2017 16:33:45 -0300 Subject: [PATCH 31/80] Bug Fix --- sapl/sessao/tests/test_sessao.py | 0 sapl/templates/sessao/presenca.html | 4 ++-- sapl/templates/sessao/presenca_ordemdia.html | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 sapl/sessao/tests/test_sessao.py diff --git a/sapl/sessao/tests/test_sessao.py b/sapl/sessao/tests/test_sessao.py new file mode 100644 index 000000000..e69de29bb diff --git a/sapl/templates/sessao/presenca.html b/sapl/templates/sessao/presenca.html index af0221cf0..869848769 100644 --- a/sapl/templates/sessao/presenca.html +++ b/sapl/templates/sessao/presenca.html @@ -35,14 +35,14 @@
{% else %} {% endif %} diff --git a/sapl/templates/sessao/presenca_ordemdia.html b/sapl/templates/sessao/presenca_ordemdia.html index 9b5afdfb1..430d9c6f0 100644 --- a/sapl/templates/sessao/presenca_ordemdia.html +++ b/sapl/templates/sessao/presenca_ordemdia.html @@ -36,14 +36,14 @@
{% else %} {% endif %} From 3955575f4da4b36e84b4af88c43fde0abe60be17 Mon Sep 17 00:00:00 2001 From: Mariana Mendes Date: Thu, 17 Aug 2017 17:09:25 -0300 Subject: [PATCH 32/80] Corrige os erros relacionados a ordem dos imports --- create_admin.py | 2 ++ sapl/api/forms.py | 4 ++-- sapl/api/urls.py | 6 +++--- sapl/api/views.py | 4 ++-- sapl/base/forms.py | 5 ++--- sapl/base/models.py | 3 +-- sapl/base/urls.py | 3 +-- sapl/base/views.py | 6 +++--- sapl/crispy_layout_mixin.py | 2 +- sapl/crud/base.py | 3 +-- sapl/legacy/migration.py | 10 +++++----- sapl/materia/forms.py | 10 +++++----- sapl/materia/models.py | 3 +-- sapl/materia/signals.py | 4 +--- sapl/materia/tests/test_materia.py | 2 +- sapl/materia/urls.py | 9 ++++----- sapl/materia/views.py | 17 ++++++++-------- sapl/painel/urls.py | 4 ++-- sapl/painel/views.py | 4 ++-- sapl/parlamentares/models.py | 2 +- sapl/parlamentares/urls.py | 3 +-- sapl/parlamentares/views.py | 4 +--- sapl/protocoloadm/forms.py | 6 +++--- sapl/protocoloadm/views.py | 12 +++++------ sapl/redireciona_urls/urls.py | 32 ++++++++++++------------------ sapl/redireciona_urls/views.py | 4 +++- sapl/relatorios/views.py | 2 +- sapl/sessao/forms.py | 4 ++-- sapl/sessao/views.py | 13 ++++++------ sapl/settings.py | 1 - sapl/utils.py | 7 +++---- scripts/set_inicio_mandato.py | 2 +- 32 files changed, 88 insertions(+), 105 deletions(-) diff --git a/create_admin.py b/create_admin.py index eb60ac940..c69d18062 100644 --- a/create_admin.py +++ b/create_admin.py @@ -1,6 +1,8 @@ import os import sys + import django + from sapl import settings os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sapl.settings") diff --git a/sapl/api/forms.py b/sapl/api/forms.py index f70ffe2f2..f8ad6fee7 100644 --- a/sapl/api/forms.py +++ b/sapl/api/forms.py @@ -1,9 +1,9 @@ -from django.db.models import Q, F +from django.db.models import F, Q from django.forms.fields import CharField, MultiValueField from django.forms.widgets import MultiWidget, TextInput from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from django_filters.filters import MethodFilter, ModelChoiceFilter, DateFilter +from django_filters.filters import DateFilter, MethodFilter, ModelChoiceFilter from rest_framework import serializers from rest_framework.compat import django_filters from rest_framework.filters import FilterSet diff --git a/sapl/api/urls.py b/sapl/api/urls.py index 314b2b339..1f19e9d1f 100644 --- a/sapl/api/urls.py +++ b/sapl/api/urls.py @@ -2,9 +2,9 @@ from django.conf import settings from django.conf.urls import include, url from rest_framework.routers import DefaultRouter -from sapl.api.views import (AutorListView, MateriaLegislativaViewSet, - ModelChoiceView, SessaoPlenariaViewSet, - AutoresPossiveisListView, AutoresProvaveisListView) +from sapl.api.views import (AutoresPossiveisListView, AutoresProvaveisListView, + AutorListView, MateriaLegislativaViewSet, + ModelChoiceView, SessaoPlenariaViewSet) from .apps import AppConfig diff --git a/sapl/api/views.py b/sapl/api/views.py index 7c8ddcf8d..1eccaf5ef 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -9,8 +9,8 @@ from rest_framework.permissions import (AllowAny, IsAuthenticated, IsAuthenticatedOrReadOnly) from rest_framework.viewsets import GenericViewSet, ModelViewSet -from sapl.api.forms import AutorChoiceFilterSet, AutorSearchForFieldFilterSet,\ - AutoresPossiveisFilterSet +from sapl.api.forms import (AutorChoiceFilterSet, AutoresPossiveisFilterSet, + AutorSearchForFieldFilterSet) from sapl.api.serializers import (AutorChoiceSerializer, AutorSerializer, ChoiceSerializer, MateriaLegislativaSerializer, diff --git a/sapl/base/forms.py b/sapl/base/forms.py index f95cc9bb8..13880703c 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1,3 +1,4 @@ +import django_filters from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row @@ -12,9 +13,8 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db import models, transaction from django.forms import ModelForm -from django.utils.translation import string_concat from django.utils.translation import ugettext_lazy as _ -import django_filters +from django.utils.translation import string_concat from sapl.base.models import Autor, TipoAutor from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, @@ -29,7 +29,6 @@ from sapl.utils import (RANGE_ANOS, ChoiceWithoutValidationField, from .models import AppConfig, CasaLegislativa - ACTION_CREATE_USERS_AUTOR_CHOICE = [ ('C', _('Criar novo Usuário')), ('A', _('Associar um usuário existente')), diff --git a/sapl/base/models.py b/sapl/base/models.py index 2917ea3ea..c75091341 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -1,12 +1,11 @@ +import reversion from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils.translation import ugettext_lazy as _ -import reversion from sapl.utils import UF, YES_NO_CHOICES, get_settings_auth_user_model - TIPO_DOCUMENTO_ADMINISTRATIVO = (('O', _('Ostensivo')), ('R', _('Restritivo'))) diff --git a/sapl/base/urls.py b/sapl/base/urls.py index 500d44f04..ed55f1767 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -16,8 +16,7 @@ from .views import (AppConfigCrud, CasaLegislativaCrud, HelpView, RelatorioMateriasPorAnoAutorTipoView, RelatorioMateriasPorAutorView, RelatorioMateriasTramitacaoView, - RelatorioPresencaSessaoView, - SaplSearchView) + RelatorioPresencaSessaoView, SaplSearchView) app_name = AppConfig.name diff --git a/sapl/base/views.py b/sapl/base/views.py index 1450bc16b..f8c0832cf 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -14,7 +14,6 @@ from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView from django_filters.views import FilterView - from haystack.views import SearchView from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm @@ -22,7 +21,8 @@ from sapl.base.models import Autor, TipoAutor from sapl.crud.base import CrudAux from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.parlamentares.models import Parlamentar -from sapl.sessao.models import PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca +from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, + SessaoPlenariaPresenca) from sapl.utils import parlamentares_ativos, sapl_logger from .forms import (CasaLegislativaForm, ConfiguracoesAppForm, @@ -497,4 +497,4 @@ class SaplSearchView(SearchView): for m in models: context['models'] = context['models'] + '&models=' + m - return context \ No newline at end of file + return context diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py index e46a193e1..eec259190 100644 --- a/sapl/crispy_layout_mixin.py +++ b/sapl/crispy_layout_mixin.py @@ -1,5 +1,6 @@ from math import ceil +import rtyaml from crispy_forms.bootstrap import FormActions from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit @@ -7,7 +8,6 @@ from django import template from django.core.urlresolvers import reverse from django.utils import formats from django.utils.translation import ugettext as _ -import rtyaml def heads_and_tails(list_of_lists): diff --git a/sapl/crud/base.py b/sapl/crud/base.py index 70ea1c859..05c2b03a9 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -17,8 +17,8 @@ from django.http.response import Http404 from django.shortcuts import redirect from django.utils.decorators import classonlymethod from django.utils.encoding import force_text -from django.utils.translation import string_concat from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import string_concat from django.views.generic import (CreateView, DeleteView, DetailView, ListView, UpdateView) from django.views.generic.base import ContextMixin @@ -30,7 +30,6 @@ from sapl.rules.map_rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL, from sapl.settings import BASE_DIR from sapl.utils import normalize - logger = logging.getLogger(BASE_DIR.name) ACTION_LIST, ACTION_CREATE, ACTION_DETAIL, ACTION_UPDATE, ACTION_DELETE = \ diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index fcf2f0837..a405b8f0b 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -12,7 +12,7 @@ from django.contrib.auth.models import Group from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.db import OperationalError, ProgrammingError, connections, models -from django.db.models import CharField, Max, ProtectedError, TextField, Count +from django.db.models import CharField, Count, Max, ProtectedError, TextField from django.db.models.base import ModelBase from django.db.models.signals import post_delete, post_save from model_mommy import mommy @@ -26,11 +26,11 @@ from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, TipoProposicao, Tramitacao) -from sapl.norma.models import (AssuntoNorma, NormaJuridica, - TipoVinculoNormaJuridica, NormaRelacionada) -from sapl.parlamentares.models import (Legislatura,Mandato, Parlamentar, +from sapl.norma.models import (AssuntoNorma, NormaJuridica, NormaRelacionada, + TipoVinculoNormaJuridica) +from sapl.parlamentares.models import (Legislatura, Mandato, Parlamentar, TipoAfastamento) -from sapl.protocoloadm.models import (DocumentoAdministrativo,Protocolo, +from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, StatusTramitacaoAdministrativo) from sapl.sessao.models import ExpedienteMateria, OrdemDia, RegistroVotacao from sapl.settings import PROJECT_DIR diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 5f5279d39..21d1845d8 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1,7 +1,8 @@ -from datetime import date, datetime import os +from datetime import date, datetime +import django_filters from crispy_forms.bootstrap import Alert, FormActions, InlineRadios from crispy_forms.helper import FormHelper from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, @@ -13,16 +14,16 @@ from django.core.files.base import File from django.core.urlresolvers import reverse from django.db import models, transaction from django.db.models import Max -from django.forms import ModelForm, ModelChoiceField, widgets +from django.forms import ModelChoiceField, ModelForm, widgets from django.forms.forms import Form from django.forms.models import ModelMultipleChoiceField -from django.forms.widgets import Select, CheckboxSelectMultiple, HiddenInput +from django.forms.widgets import CheckboxSelectMultiple, HiddenInput, Select from django.utils.encoding import force_text from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ -import django_filters +import sapl from sapl.base.models import Autor, TipoAutor from sapl.comissoes.models import Comissao from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_PUBLIC, @@ -41,7 +42,6 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, MateriaPesquisaOrderingFilter, RangeWidgetOverride, autor_label, autor_modal, models_with_gr_for_model, qs_override_django_filter) -import sapl from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, DocumentoAcessorio, Numeracao, Proposicao, Relatoria, diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 36d375068..cd44363b4 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -1,5 +1,6 @@ from datetime import datetime +import reversion from django.contrib.auth.models import Group from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.models import ContentType @@ -8,7 +9,6 @@ from django.db import models from django.utils import formats from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -import reversion from sapl.base.models import Autor from sapl.comissoes.models import Comissao @@ -19,7 +19,6 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey, SaplGenericRelation, restringe_tipos_de_arquivo_txt, texto_upload_path) - EM_TRAMITACAO = [(1, 'Sim'), (0, 'Não')] diff --git a/sapl/materia/signals.py b/sapl/materia/signals.py index f1cf66e03..e774b0191 100644 --- a/sapl/materia/signals.py +++ b/sapl/materia/signals.py @@ -1,8 +1,6 @@ -from django.db.models.signals import post_delete, post_save - import django.dispatch +from django.db.models.signals import post_delete, post_save from .models import DocumentoAcessorio, MateriaLegislativa - tramitacao_signal = django.dispatch.Signal(providing_args=['post', 'request']) diff --git a/sapl/materia/tests/test_materia.py b/sapl/materia/tests/test_materia.py index 0090376bf..071d51d4c 100644 --- a/sapl/materia/tests/test_materia.py +++ b/sapl/materia/tests/test_materia.py @@ -1,9 +1,9 @@ +import pytest from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.core.files.uploadedfile import SimpleUploadedFile from django.core.urlresolvers import reverse from model_mommy import mommy -import pytest from sapl.base.models import Autor, TipoAutor from sapl.comissoes.models import Comissao, TipoComissao diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index d588f1f20..2cbb3a62b 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -4,8 +4,9 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, AcompanhamentoExcluirView, AcompanhamentoMateriaView, AnexadaCrud, AssuntoMateriaCrud, AutoriaCrud, - ConfirmarProposicao, CriarProtocoloMateriaView, - DespachoInicialCrud, DocumentoAcessorioCrud, + AutoriaMultiCreateView, ConfirmarProposicao, + CriarProtocoloMateriaView, DespachoInicialCrud, + DocumentoAcessorioCrud, DocumentoAcessorioEmLoteView, LegislacaoCitadaCrud, MateriaAssuntoCrud, MateriaLegislativaCrud, @@ -20,13 +21,11 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, TipoFimRelatoriaCrud, TipoMateriaCrud, TipoProposicaoCrud, TramitacaoCrud, TramitacaoEmLoteView, UnidadeTramitacaoCrud, - proposicao_texto, recuperar_materia, - AutoriaMultiCreateView) + proposicao_texto, recuperar_materia) from . import receivers from .apps import AppConfig - app_name = AppConfig.name urlpatterns_materia = [ diff --git a/sapl/materia/views.py b/sapl/materia/views.py index c4cf64639..a206ae06f 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1,4 +1,4 @@ -from datetime import datetime, date +from datetime import date, datetime from random import choice from string import ascii_letters, digits @@ -9,8 +9,7 @@ from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import (ObjectDoesNotExist, - MultipleObjectsReturned) +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.urlresolvers import reverse from django.db.models import Q from django.http import HttpResponse, JsonResponse @@ -23,6 +22,7 @@ from django.views.generic.base import RedirectView from django.views.generic.edit import FormView from django_filters.views import FilterView +import sapl from sapl.base.models import Autor, CasaLegislativa from sapl.comissoes.models import Comissao, Participacao from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT, @@ -33,16 +33,16 @@ from sapl.crud.base import (ACTION_CREATE, ACTION_DELETE, ACTION_DETAIL, ACTION_LIST, ACTION_UPDATE, RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, PermissionRequiredForAppCrudMixin, make_pagination) -from sapl.materia.forms import (AnexadaForm, ConfirmarProposicaoForm, - LegislacaoCitadaForm, AutoriaForm, ProposicaoForm, - TipoProposicaoForm, TramitacaoForm, - TramitacaoUpdateForm, AutoriaMultiCreateForm) +from sapl.materia.forms import (AnexadaForm, AutoriaForm, + AutoriaMultiCreateForm, + ConfirmarProposicaoForm, LegislacaoCitadaForm, + ProposicaoForm, TipoProposicaoForm, + TramitacaoForm, TramitacaoUpdateForm) from sapl.norma.models import LegislacaoCitada from sapl.protocoloadm.models import Protocolo from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, autor_modal, gerar_hash_arquivo, get_base_url, montar_row_autor) -import sapl from .email_utils import do_envia_email_confirmacao from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, @@ -62,7 +62,6 @@ from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria, TipoProposicao, Tramitacao, UnidadeTramitacao) from .signals import tramitacao_signal - AssuntoMateriaCrud = Crud.build(AssuntoMateria, 'assunto_materia') OrigemCrud = Crud.build(Origem, '') diff --git a/sapl/painel/urls.py b/sapl/painel/urls.py index 29890f30f..66ef92ac1 100644 --- a/sapl/painel/urls.py +++ b/sapl/painel/urls.py @@ -2,8 +2,8 @@ from django.conf.urls import url from .apps import AppConfig from .views import (cronometro_painel, get_dados_painel, painel_mensagem_view, - painel_parlamentar_view, painel_view, - painel_votacao_view, votante_view) + painel_parlamentar_view, painel_view, painel_votacao_view, + votante_view) app_name = AppConfig.name diff --git a/sapl/painel/views.py b/sapl/painel/views.py index e3271a309..13ee7883b 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -2,9 +2,9 @@ from datetime import date from django.contrib import messages from django.contrib.auth.decorators import user_passes_test -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned -from django.db.models import Q +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.urlresolvers import reverse +from django.db.models import Q from django.http import HttpResponse, JsonResponse from django.http.response import Http404, HttpResponseRedirect from django.shortcuts import render diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index 34aa8b3e8..8bbc3704f 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -1,9 +1,9 @@ from datetime import datetime +import reversion from django.db import models from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -import reversion from sapl.base.models import Autor from sapl.utils import (INDICADOR_AFASTAMENTO, UF, YES_NO_CHOICES, diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index 7b0f8f031..e383421c4 100644 --- a/sapl/parlamentares/urls.py +++ b/sapl/parlamentares/urls.py @@ -5,8 +5,7 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, FiliacaoCrud, FrenteCrud, FrenteList, LegislaturaCrud, MandatoCrud, MesaDiretoraView, NivelInstrucaoCrud, - ParlamentarCrud, - ParlamentarMateriasView, + ParlamentarCrud, ParlamentarMateriasView, ParticipacaoParlamentarCrud, PartidoCrud, ProposicaoParlamentarCrud, RelatoriaParlamentarCrud, diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 9af917370..2890dc384 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -21,8 +21,7 @@ from sapl.comissoes.models import Participacao from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux, CrudBaseForListAndDetailExternalAppView, MasterDetailCrud) -from sapl.materia.models import Autoria -from sapl.materia.models import Proposicao, Relatoria +from sapl.materia.models import Autoria, Proposicao, Relatoria from sapl.parlamentares.apps import AppConfig from sapl.utils import parlamentares_ativos @@ -34,7 +33,6 @@ from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar, TipoAfastamento, TipoDependente, Votante) - CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa') PartidoCrud = CrudAux.build(Partido, 'partidos') SessaoLegislativaCrud = CrudAux.build(SessaoLegislativa, 'sessao_legislativa') diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 24319ac05..fc2b99dc8 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -1,5 +1,6 @@ from datetime import datetime +import django_filters from crispy_forms.bootstrap import InlineRadios from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Fieldset, Layout, Submit @@ -8,11 +9,11 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import models from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ -import django_filters from sapl.base.models import Autor, TipoAutor from sapl.crispy_layout_mixin import form_actions, to_row -from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa, UnidadeTramitacao +from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa, + UnidadeTramitacao) from sapl.utils import (RANGE_ANOS, AnoNumeroOrderingFilter, RangeWidgetOverride, autor_label, autor_modal) @@ -20,7 +21,6 @@ from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo, Protocolo, TipoDocumentoAdministrativo, TramitacaoAdministrativo) - TIPOS_PROTOCOLO = [('0', 'Recebido'), ('1', 'Enviado'), ('', 'Ambos')] TIPOS_PROTOCOLO_CREATE = [('0', 'Recebido'), ('1', 'Enviado')] diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index e26168d0d..dba1d9f6d 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -1,13 +1,12 @@ from datetime import date, datetime - from braces.views import FormValidMessageMixin from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin -from django.db.models import Q +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse -from django.db.models import Max +from django.db.models import Max, Q from django.http import (Http404, HttpResponse, HttpResponseRedirect, JsonResponse) from django.shortcuts import redirect @@ -18,8 +17,11 @@ from django_filters.views import FilterView import sapl from sapl.base.models import Autor +from sapl.comissoes.models import Comissao from sapl.crud.base import Crud, CrudAux, MasterDetailCrud, make_pagination from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa +from sapl.parlamentares.models import Parlamentar +from sapl.protocoloadm.models import Protocolo from sapl.utils import create_barcode, get_client_ip from .forms import (AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm, @@ -30,10 +32,6 @@ from .forms import (AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm, from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo, Protocolo, StatusTramitacaoAdministrativo, TipoDocumentoAdministrativo, TramitacaoAdministrativo) -from sapl.parlamentares.models import Parlamentar -from sapl.protocoloadm.models import Protocolo -from sapl.comissoes.models import Comissao -from django.contrib.contenttypes.models import ContentType TipoDocumentoAdministrativoCrud = CrudAux.build( TipoDocumentoAdministrativo, '') diff --git a/sapl/redireciona_urls/urls.py b/sapl/redireciona_urls/urls.py index 8e8ac7d99..63afd8b6b 100644 --- a/sapl/redireciona_urls/urls.py +++ b/sapl/redireciona_urls/urls.py @@ -1,24 +1,18 @@ -from .apps import AppConfig -from .views import ( - RedirecionaAtasList, - RedirecionaComissao, - RedirecionaHistoricoTramitacoesList, - RedirecionaMateriaLegislativaDetail, - RedirecionaMateriaLegislativaList, - RedirecionaMateriasPorAnoAutorTipo, - RedirecionaMateriasPorAutor, - RedirecionaMesaDiretoraView, - RedirecionaNormasJuridicasDetail, - RedirecionaNormasJuridicasList, - RedirecionaParlamentar, - RedirecionaPautaSessao, - RedirecionaPresencaParlamentares, - RedirecionaRelatoriosList, - RedirecionaRelatoriosMateriasEmTramitacaoList, - RedirecionaSessaoPlenaria, - RedirecionaSAPLIndex) from django.conf.urls import url +from .apps import AppConfig +from .views import (RedirecionaAtasList, RedirecionaComissao, + RedirecionaHistoricoTramitacoesList, + RedirecionaMateriaLegislativaDetail, + RedirecionaMateriaLegislativaList, + RedirecionaMateriasPorAnoAutorTipo, + RedirecionaMateriasPorAutor, RedirecionaMesaDiretoraView, + RedirecionaNormasJuridicasDetail, + RedirecionaNormasJuridicasList, RedirecionaParlamentar, + RedirecionaPautaSessao, RedirecionaPresencaParlamentares, + RedirecionaRelatoriosList, + RedirecionaRelatoriosMateriasEmTramitacaoList, + RedirecionaSAPLIndex, RedirecionaSessaoPlenaria) app_name = AppConfig.name diff --git a/sapl/redireciona_urls/views.py b/sapl/redireciona_urls/views.py index 42b0fcadd..3e29e8989 100644 --- a/sapl/redireciona_urls/views.py +++ b/sapl/redireciona_urls/views.py @@ -1,6 +1,6 @@ -from .exceptions import UnknownUrlNameError from django.core.urlresolvers import NoReverseMatch, reverse from django.views.generic import RedirectView + from sapl.base.apps import AppConfig as atasConfig from sapl.base.apps import AppConfig as presenca_sessaoConfig from sapl.base.apps import AppConfig as relatoriosConfig @@ -10,6 +10,8 @@ from sapl.norma.apps import AppConfig as normaConfig from sapl.parlamentares.apps import AppConfig as parlamentaresConfig from sapl.sessao.apps import AppConfig as sessaoConfig +from .exceptions import UnknownUrlNameError + EMPTY_STRING = '' app_parlamentares = parlamentaresConfig.name diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index ffd371600..48d4fee60 100644 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -19,7 +19,7 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente) from sapl.settings import STATIC_ROOT -from sapl.utils import filiacao_data, UF +from sapl.utils import UF, filiacao_data from .templates import (pdf_capa_processo_gerar, pdf_documento_administrativo_gerar, pdf_espelho_gerar, diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 2b9e6788c..8cc4d69d2 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -10,8 +10,8 @@ from django.utils.translation import ugettext_lazy as _ from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.forms import MateriaLegislativaFilterSet -from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa, - StatusTramitacao) +from sapl.materia.models import (MateriaLegislativa, StatusTramitacao, + TipoMateriaLegislativa) from sapl.parlamentares.models import Parlamentar from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, MateriaPesquisaOrderingFilter, autor_label, diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 83217c54e..2c1d30403 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -30,22 +30,23 @@ from sapl.materia.models import (Autoria, DocumentoAcessorio, TipoMateriaLegislativa, Tramitacao) from sapl.materia.views import MateriaLegislativaPesquisaView from sapl.norma.models import NormaJuridica -from sapl.parlamentares.models import (Filiacao, Legislatura, Parlamentar, - SessaoLegislativa, Mandato) +from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato, + Parlamentar, SessaoLegislativa) from sapl.sessao.apps import AppConfig from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm + from .forms import (AdicionarVariasMateriasFilterSet, ExpedienteForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, - ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, - VotacaoEditForm, VotacaoForm, VotacaoNominalForm) + ResumoOrdenacaoForm, SessaoPlenariaFilterSet, + SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, + VotacaoNominalForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, - TipoResultadoVotacao, TipoSessaoPlenaria, - VotoParlamentar) + TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar) TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente') diff --git a/sapl/settings.py b/sapl/settings.py index 903b38b6a..274e2ed0a 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -22,7 +22,6 @@ from unipath import Path from .temp_suppress_crispy_form_warnings import \ SUPRESS_CRISPY_FORM_WARNINGS_LOGGING - BASE_DIR = Path(__file__).ancestor(1) PROJECT_DIR = Path(__file__).ancestor(2) diff --git a/sapl/utils.py b/sapl/utils.py index f707a2c91..90581bd99 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -3,7 +3,6 @@ import logging import os import re from datetime import date -from django_filters.filterset import STRICTNESS from functools import wraps from subprocess import PIPE, call from threading import Thread @@ -15,21 +14,21 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button from django import forms from django.apps import apps -from django.db.models import Q from django.conf import settings from django.contrib import admin from django.contrib.contenttypes.fields import (GenericForeignKey, GenericRel, GenericRelation) from django.core.exceptions import ValidationError +from django.db.models import Q from django.utils import six from django.utils.translation import ugettext_lazy as _ +from django_filters.filterset import STRICTNESS from floppyforms import ClearableFileInput from reversion.admin import VersionAdmin from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row from sapl.settings import BASE_DIR, PROJECT_DIR - sapl_logger = logging.getLogger(BASE_DIR.name) @@ -642,4 +641,4 @@ def parlamentares_ativos(data_inicio, data_fim=None): 'parlamentar_id', flat=True).distinct('parlamentar_id') - return Parlamentar.objects.filter(id__in=parlamentares_id) \ No newline at end of file + return Parlamentar.objects.filter(id__in=parlamentares_id) diff --git a/scripts/set_inicio_mandato.py b/scripts/set_inicio_mandato.py index 37dfcfc0c..dca509ab6 100644 --- a/scripts/set_inicio_mandato.py +++ b/scripts/set_inicio_mandato.py @@ -7,4 +7,4 @@ def popula_campo_data_inicio(): m.save() if __name__ == '__main__': - popula_campo_data_inicio() \ No newline at end of file + popula_campo_data_inicio() From 0877f6c6a20d05d837a2e12995d26fa2bfe9c129 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 17 Aug 2017 17:09:49 -0300 Subject: [PATCH 33/80] Ajusta import triplicado --- sapl/redireciona_urls/views.py | 39 +++++++++++++++++----------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/sapl/redireciona_urls/views.py b/sapl/redireciona_urls/views.py index 42b0fcadd..7a293d994 100644 --- a/sapl/redireciona_urls/views.py +++ b/sapl/redireciona_urls/views.py @@ -1,17 +1,19 @@ -from .exceptions import UnknownUrlNameError from django.core.urlresolvers import NoReverseMatch, reverse from django.views.generic import RedirectView + from sapl.base.apps import AppConfig as atasConfig -from sapl.base.apps import AppConfig as presenca_sessaoConfig -from sapl.base.apps import AppConfig as relatoriosConfig from sapl.comissoes.apps import AppConfig as comissoesConfig from sapl.materia.apps import AppConfig as materiaConfig from sapl.norma.apps import AppConfig as normaConfig from sapl.parlamentares.apps import AppConfig as parlamentaresConfig from sapl.sessao.apps import AppConfig as sessaoConfig +from .exceptions import UnknownUrlNameError + EMPTY_STRING = '' +presenca_sessaoConfig = relatoriosConfig = atasConfig + app_parlamentares = parlamentaresConfig.name app_atas = atasConfig.name app_presenca_sessao = presenca_sessaoConfig.name @@ -50,14 +52,13 @@ relatorio_materia_por_ano_autor_tipo = ( historico_tramitacoes = (app_relatorios + ':historico_tramitacoes') - def has_iframe(url, request): iframe = request.GET.get( 'iframe', EMPTY_STRING) if iframe: - iframe_qs= ("iframe=" + iframe) + iframe_qs = ("iframe=" + iframe) url += ("&" if "?" in url else "?") url += iframe_qs @@ -486,30 +487,30 @@ class RedirecionaHistoricoTramitacoesList(RedirectView): inicio_intervalo_data_tramitacao = self.request.GET.get( 'txt_dat_inicio_periodo', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") fim_intervalo_data_tramitacao = self.request.GET.get( 'txt_dat_fim_periodo', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") tipo_materia = self.request.GET.get( 'lst_tip_materia', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") unidade_local_tramitacao = self.request.GET.get( 'lst_cod_unid_tram_dest', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") status_tramitacao = self.request.GET.get( 'lst_status', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") if ( - (inicio_intervalo_data_tramitacao != EMPTY_STRING) or - (fim_intervalo_data_tramitacao != EMPTY_STRING) or - (tipo_materia != EMPTY_STRING) or - (unidade_local_tramitacao != EMPTY_STRING) or - (status_tramitacao != EMPTY_STRING)): + (inicio_intervalo_data_tramitacao != EMPTY_STRING) or + (fim_intervalo_data_tramitacao != EMPTY_STRING) or + (tipo_materia != EMPTY_STRING) or + (unidade_local_tramitacao != EMPTY_STRING) or + (status_tramitacao != EMPTY_STRING)): args += "?tramitacao__data_tramitacao_0=%s" % ( inicio_intervalo_data_tramitacao) @@ -543,11 +544,11 @@ class RedirecionaAtasList(RedirectView): inicio_intervalo_data_ata = self.request.GET.get( 'txt_dat_inicio', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") fim_intervalo_data_ata = self.request.GET.get( 'txt_dat_fim', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") args += "?data_inicio_0=%s" % ( inicio_intervalo_data_ata) @@ -577,11 +578,11 @@ class RedirecionaPresencaParlamentares(RedirectView): inicio_intervalo_data_presenca_parlamentar = self.request.GET.get( 'txt_dat_inicio', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") fim_intervalo_data_presenca_parlamentar = self.request.GET.get( 'txt_dat_fim', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") args += "?data_inicio_0=%s" % ( inicio_intervalo_data_presenca_parlamentar) From 541e98b48238d69eaffa0473de3f57811246920b Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 17 Aug 2017 17:09:49 -0300 Subject: [PATCH 34/80] Ajusta import triplicado --- sapl/redireciona_urls/views.py | 35 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/sapl/redireciona_urls/views.py b/sapl/redireciona_urls/views.py index 3e29e8989..7a293d994 100644 --- a/sapl/redireciona_urls/views.py +++ b/sapl/redireciona_urls/views.py @@ -2,8 +2,6 @@ from django.core.urlresolvers import NoReverseMatch, reverse from django.views.generic import RedirectView from sapl.base.apps import AppConfig as atasConfig -from sapl.base.apps import AppConfig as presenca_sessaoConfig -from sapl.base.apps import AppConfig as relatoriosConfig from sapl.comissoes.apps import AppConfig as comissoesConfig from sapl.materia.apps import AppConfig as materiaConfig from sapl.norma.apps import AppConfig as normaConfig @@ -14,6 +12,8 @@ from .exceptions import UnknownUrlNameError EMPTY_STRING = '' +presenca_sessaoConfig = relatoriosConfig = atasConfig + app_parlamentares = parlamentaresConfig.name app_atas = atasConfig.name app_presenca_sessao = presenca_sessaoConfig.name @@ -52,14 +52,13 @@ relatorio_materia_por_ano_autor_tipo = ( historico_tramitacoes = (app_relatorios + ':historico_tramitacoes') - def has_iframe(url, request): iframe = request.GET.get( 'iframe', EMPTY_STRING) if iframe: - iframe_qs= ("iframe=" + iframe) + iframe_qs = ("iframe=" + iframe) url += ("&" if "?" in url else "?") url += iframe_qs @@ -488,30 +487,30 @@ class RedirecionaHistoricoTramitacoesList(RedirectView): inicio_intervalo_data_tramitacao = self.request.GET.get( 'txt_dat_inicio_periodo', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") fim_intervalo_data_tramitacao = self.request.GET.get( 'txt_dat_fim_periodo', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") tipo_materia = self.request.GET.get( 'lst_tip_materia', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") unidade_local_tramitacao = self.request.GET.get( 'lst_cod_unid_tram_dest', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") status_tramitacao = self.request.GET.get( 'lst_status', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") if ( - (inicio_intervalo_data_tramitacao != EMPTY_STRING) or - (fim_intervalo_data_tramitacao != EMPTY_STRING) or - (tipo_materia != EMPTY_STRING) or - (unidade_local_tramitacao != EMPTY_STRING) or - (status_tramitacao != EMPTY_STRING)): + (inicio_intervalo_data_tramitacao != EMPTY_STRING) or + (fim_intervalo_data_tramitacao != EMPTY_STRING) or + (tipo_materia != EMPTY_STRING) or + (unidade_local_tramitacao != EMPTY_STRING) or + (status_tramitacao != EMPTY_STRING)): args += "?tramitacao__data_tramitacao_0=%s" % ( inicio_intervalo_data_tramitacao) @@ -545,11 +544,11 @@ class RedirecionaAtasList(RedirectView): inicio_intervalo_data_ata = self.request.GET.get( 'txt_dat_inicio', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") fim_intervalo_data_ata = self.request.GET.get( 'txt_dat_fim', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") args += "?data_inicio_0=%s" % ( inicio_intervalo_data_ata) @@ -579,11 +578,11 @@ class RedirecionaPresencaParlamentares(RedirectView): inicio_intervalo_data_presenca_parlamentar = self.request.GET.get( 'txt_dat_inicio', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") fim_intervalo_data_presenca_parlamentar = self.request.GET.get( 'txt_dat_fim', EMPTY_STRING - ).lstrip("0") + ).lstrip("0") args += "?data_inicio_0=%s" % ( inicio_intervalo_data_presenca_parlamentar) From 35df101b35a4caf56eb8ba6699f9b9f4941eaef0 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 17 Aug 2017 17:35:34 -0300 Subject: [PATCH 35/80] =?UTF-8?q?Adiciona=20corre=C3=A7=C3=A3o=20autom?= =?UTF-8?q?=C3=A1tica=20de=20erros=20de=20PEP=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fix_qa.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fix_qa.sh b/fix_qa.sh index a3ac9d843..264c01676 100755 --- a/fix_qa.sh +++ b/fix_qa.sh @@ -8,4 +8,5 @@ # Uma forma simples de fazer isso é adicionando antes suas mudanças à # "staging area" do git, com `git add .` e após usar o script `git diff`. -isort --recursive --skip='migrations' --skip='templates' --skip='ipython_log.py' . +isort --recursive --skip='migrations' --skip='templates' --skip='ipython_log.py*' . +autopep8 --in-place --recursive . --exclude='migrations,ipython_log.py*' From 0677a85471ebf8aca3e350931ac41342b21cbf18 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 17 Aug 2017 17:38:29 -0300 Subject: [PATCH 36/80] Corrige erros de PEP 8 com autopep8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Correções feitas usando o scrip fix_qa.sh na raiz do projeto que agora contém a linha autopep8 --in-place --recursive . --exclude='migrations,ipython_log.py*' --- create_admin.py | 10 +- sapl/api/serializers.py | 23 +- sapl/base/search_indexes.py | 2 +- sapl/base/templatetags/common_tags.py | 2 + sapl/base/tests/teststub_urls.py | 6 +- sapl/comissoes/views.py | 8 +- .../templatetags/compilacao_filters.py | 1 - .../management/commands/migracao_25_31.py | 2 +- .../commands/migracao_documentos.py | 2 +- sapl/legacy/migracao_documentos.py | 2 +- sapl/legacy/migration.py | 19 +- sapl/legacy/scripts/street_sweeper.py | 11 +- sapl/materia/admin.py | 1 + sapl/materia/email_utils.py | 3 +- sapl/materia/views.py | 10 +- sapl/norma/models.py | 8 +- sapl/parlamentares/forms.py | 8 +- sapl/protocoloadm/views.py | 43 +- sapl/redireciona_urls/exceptions.py | 6 +- sapl/redireciona_urls/tests.py | 47 +- .../pdf_capa_processo_preparar_pysc.py | 227 ++++----- .../templates/pdf_detalhe_materia_gerar.py | 456 +++++++++-------- .../pdf_detalhe_materia_preparar_pysc.py | 457 +++++++++--------- ..._documento_administrativo_preparar_pysc.py | 221 +++++---- .../relatorios/templates/pdf_espelho_gerar.py | 241 ++++----- .../templates/pdf_espelho_preparar_pysc.py | 290 +++++------ .../pdf_etiqueta_protocolo_preparar_pysc.py | 210 ++++---- .../relatorios/templates/pdf_materia_gerar.py | 152 +++--- .../templates/pdf_materia_preparar_pysc.py | 272 ++++++----- sapl/relatorios/templates/pdf_norma_gerar.py | 164 ++++--- .../templates/pdf_norma_preparar_pysc.py | 153 +++--- .../templates/pdf_ordem_dia_preparar_pysc.py | 180 ++++--- .../templates/pdf_pauta_sessao_gerar.py | 4 +- .../pdf_pauta_sessao_preparar_pysc.py | 183 ++++--- .../templates/pdf_protocolo_gerar.py | 189 ++++---- .../templates/pdf_protocolo_preparar_pysc.py | 217 +++++---- .../templates/pdf_sessao_plenaria_gerar.py | 20 +- .../pdf_sessao_plenaria_preparar_pysc.py | 285 ++++++----- sapl/relatorios/views.py | 28 +- sapl/sessao/forms.py | 8 +- sapl/sessao/models.py | 13 +- sapl/sessao/serializers.py | 1 + sapl/sessao/views.py | 89 ++-- 43 files changed, 2306 insertions(+), 1968 deletions(-) diff --git a/create_admin.py b/create_admin.py index c69d18062..6b3d52709 100644 --- a/create_admin.py +++ b/create_admin.py @@ -7,11 +7,13 @@ from sapl import settings os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sapl.settings") + def create_superuser(): from django.contrib.auth.models import User username = "admin" - password = os.environ['ADMIN_PASSWORD'] if 'ADMIN_PASSWORD' in os.environ else None + password = os.environ[ + 'ADMIN_PASSWORD'] if 'ADMIN_PASSWORD' in os.environ else None email = os.environ['ADMIN_EMAIL'] if 'ADMIN_EMAIL' in os.environ else '' if User.objects.filter(username=username).exists(): @@ -19,12 +21,14 @@ def create_superuser(): sys.exit('ADMIN_USER_EXISTS') else: if not password: - print("[SUPERUSER] Environment variable $ADMIN_PASSWORD for user %s was not set. Leaving..." % username) + print( + "[SUPERUSER] Environment variable $ADMIN_PASSWORD for user %s was not set. Leaving..." % username) sys.exit('MISSING_ADMIN_PASSWORD') print("[SUPERUSER] Creating superuser...") - u = User.objects.create_superuser(username=username, password=password, email=email) + u = User.objects.create_superuser( + username=username, password=password, email=email) u.save() print("[SUPERUSER] Done.") diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py index 4590e0186..9853d8718 100644 --- a/sapl/api/serializers.py +++ b/sapl/api/serializers.py @@ -64,14 +64,18 @@ class SessaoPlenariaSerializer(serializers.ModelSerializer): txtSiglaOrgao = serializers.SerializerMethodField('get_sigla_orgao') txtApelido = serializers.SerializerMethodField('get_name') txtNomeOrgao = serializers.SerializerMethodField('get_nome_orgao') - codEstadoReuniao = serializers.SerializerMethodField('get_estadoSessaoPlenaria') + codEstadoReuniao = serializers.SerializerMethodField( + 'get_estadoSessaoPlenaria') txtTipoReuniao = serializers.SerializerMethodField('get_tipo_sessao') txtObjeto = serializers.SerializerMethodField('get_assunto_sessao') txtLocal = serializers.SerializerMethodField('get_endereco_orgao') - bolReuniaoConjunta = serializers.SerializerMethodField('get_reuniao_conjunta') - bolHabilitarEventoInterativo = serializers.SerializerMethodField('get_iterativo') + bolReuniaoConjunta = serializers.SerializerMethodField( + 'get_reuniao_conjunta') + bolHabilitarEventoInterativo = serializers.SerializerMethodField( + 'get_iterativo') idYoutube = serializers.SerializerMethodField('get_url') - codEstadoTransmissaoYoutube = serializers.SerializerMethodField('get_estadoTransmissaoYoutube') + codEstadoTransmissaoYoutube = serializers.SerializerMethodField( + 'get_estadoTransmissaoYoutube') datReuniaoString = serializers.SerializerMethodField('get_date') # Constantes SessaoPlenaria (de 1-9) (apenas 3 serão usados) @@ -80,9 +84,9 @@ class SessaoPlenariaSerializer(serializers.ModelSerializer): SESSAO_CONVOCADA = 2 # Constantes EstadoTranmissaoYoutube (de 0 a 2) - TRANSMISSAO_ENCERRADA = 2 - TRANSMISSAO_EM_ANDAMENTO = 1 - SEM_TRANSMISSAO = 0 + TRANSMISSAO_ENCERRADA = 2 + TRANSMISSAO_EM_ANDAMENTO = 1 + SEM_TRANSMISSAO = 0 class Meta: model = SessaoPlenaria @@ -102,7 +106,7 @@ class SessaoPlenariaSerializer(serializers.ModelSerializer): 'idYoutube', 'codEstadoTransmissaoYoutube', 'datReuniaoString' - ) + ) def __init__(self, *args, **kwargs): super(SessaoPlenariaSerializer, self).__init__(args, kwargs) @@ -136,7 +140,7 @@ class SessaoPlenariaSerializer(serializers.ModelSerializer): obj.data_inicio.strftime("%d/%m/%Y"), obj.hora_inicio, ":00" - ) + ) def get_estadoTransmissaoYoutube(self, obj): if obj.url_video: @@ -146,6 +150,7 @@ class SessaoPlenariaSerializer(serializers.ModelSerializer): return self.TRANSMISSAO_EM_ANDAMENTO else: return self.SEM_TRANSMISSAO + def get_assunto_sessao(self, obj): pauta_sessao = '' ordem_dia = OrdemDia.objects.filter(sessao_plenaria=obj.pk) diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py index e614a2f79..cee126dd2 100644 --- a/sapl/base/search_indexes.py +++ b/sapl/base/search_indexes.py @@ -126,4 +126,4 @@ class NormaJuridicaIndex(DocumentoAcessorioIndex): template_name = 'norma/normajuridica_text.txt' def get_updated_field(self): - return 'data_ultima_atualizacao' + return 'data_ultima_atualizacao' diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 72dab26ba..928aeab5d 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -117,6 +117,7 @@ def str2intabs(value): except: return '' + @register.filter def has_iframe(request): @@ -181,6 +182,7 @@ def urldetail(obj): return '%s:%s_detail' % ( obj._meta.app_config.name, obj._meta.model_name) + @register.filter def filiacao_data_filter(parlamentar, data_inicio): return filiacao_data(parlamentar, data_inicio) diff --git a/sapl/base/tests/teststub_urls.py b/sapl/base/tests/teststub_urls.py index 3a3410f98..a105489c7 100644 --- a/sapl/base/tests/teststub_urls.py +++ b/sapl/base/tests/teststub_urls.py @@ -4,7 +4,7 @@ from django.views.generic.base import TemplateView from sapl.urls import urlpatterns as original_patterns urlpatterns = original_patterns + patterns('', url(r'^zzzz$', - TemplateView.as_view( - template_name='index.html'), - name='zzzz') + TemplateView.as_view( + template_name='index.html'), + name='zzzz') ) diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index 56151d414..713c8f03e 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -72,7 +72,7 @@ class ComposicaoCrud(MasterDetailCrud): context['participacao_set'] = Participacao.objects.filter( composicao__pk=context['composicao_pk'] - ).order_by('parlamentar') + ).order_by('parlamentar') return context @@ -82,21 +82,23 @@ class ComissaoCrud(Crud): public = [RP_LIST, RP_DETAIL, ] class BaseMixin(Crud.BaseMixin): - list_field_names = ['nome', 'sigla', 'tipo', 'data_criacao', 'data_extincao', 'ativa'] + list_field_names = ['nome', 'sigla', 'tipo', + 'data_criacao', 'data_extincao', 'ativa'] ordering = '-ativa', 'sigla' class ListView(Crud.ListView): + @xframe_options_exempt def get(self, request, *args, **kwargs): return super().get(request, *args, **kwargs) class DetailView(Crud.DetailView): + @xframe_options_exempt def get(self, request, *args, **kwargs): return super().get(request, *args, **kwargs) - class MateriasTramitacaoListView(ListView): template_name = "comissoes/materias_em_tramitacao.html" paginate_by = 10 diff --git a/sapl/compilacao/templatetags/compilacao_filters.py b/sapl/compilacao/templatetags/compilacao_filters.py index d1e957eff..54575bff1 100644 --- a/sapl/compilacao/templatetags/compilacao_filters.py +++ b/sapl/compilacao/templatetags/compilacao_filters.py @@ -286,7 +286,6 @@ def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0): return result - @register.filter def list(obj): return [obj, ] diff --git a/sapl/legacy/management/commands/migracao_25_31.py b/sapl/legacy/management/commands/migracao_25_31.py index 7e8671e38..bddb26a8c 100644 --- a/sapl/legacy/management/commands/migracao_25_31.py +++ b/sapl/legacy/management/commands/migracao_25_31.py @@ -5,7 +5,7 @@ from sapl.legacy import migration class Command(BaseCommand): - help ='Migração de dados do SAPL 2.5 para o SAPL 3.1' + help = 'Migração de dados do SAPL 2.5 para o SAPL 3.1' def add_arguments(self, parser): parser.add_argument( diff --git a/sapl/legacy/management/commands/migracao_documentos.py b/sapl/legacy/management/commands/migracao_documentos.py index 0af503b39..7cba09d5a 100644 --- a/sapl/legacy/management/commands/migracao_documentos.py +++ b/sapl/legacy/management/commands/migracao_documentos.py @@ -5,7 +5,7 @@ from sapl.legacy.migracao_documentos import migrar_documentos class Command(BaseCommand): - help ='Migração documentos do SAPL 2.5 para o SAPL 3.1' + help = 'Migração documentos do SAPL 2.5 para o SAPL 3.1' def handle(self, *args, **options): migrar_documentos() diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index 50fc1e694..ea29a9072 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -205,7 +205,7 @@ def migrar_documentos(): SessaoPlenaria, Proposicao, DocumentoAdministrativo, - DocumentoAcessorioAdministrativo, + DocumentoAcessorioAdministrativo, ]: migrar_docs_por_ids(tipo) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index a405b8f0b..791e6a7b5 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -162,7 +162,7 @@ def get_fk_related(field, value, label=None): value = TipoProposicao.objects.create( id=value, descricao='Erro', content_type=ct) ultimo_valor = get_last_value(type(value)) - alter_sequence(type(value), ultimo_valor+1) + alter_sequence(type(value), ultimo_valor + 1) else: value = tipo[0] else: @@ -252,7 +252,7 @@ def problema_duplicatas(model, lista_duplicatas, argumentos): string_pks = "" problema = "%s de PK %s não é único." % (model.__name__, obj.pk) args_dict = {k: obj.__dict__[k] - for k in set(argumentos) & set(obj.__dict__.keys())} + for k in set(argumentos) & set(obj.__dict__.keys())} for dup in model.objects.filter(**args_dict): pks.append(dup.pk) string_pks = "(" + ", ".join(map(str, pks)) + ")" @@ -407,7 +407,7 @@ def fill_vinculo_norma_juridica(): 'Julgada parcialmente inconstitucional')] lista_objs = [TipoVinculoNormaJuridica( sigla=item[0], descricao_ativa=item[1], descricao_passiva=item[2]) - for item in lista] + for item in lista] TipoVinculoNormaJuridica.objects.bulk_create(lista_objs) @@ -610,7 +610,7 @@ class DataMigrator: # necessário para ajustar sequence da tabela para o ultimo valor de id ultimo_valor = get_last_value(model) - alter_sequence(model, ultimo_valor+1) + alter_sequence(model, ultimo_valor + 1) def delete_ind_excluido(self): excluidos = 0 @@ -665,15 +665,15 @@ def adjust_documentoadministrativo(new, old): except Exception: try: protocolo = Protocolo.objects.get(numero=new.numero_protocolo, - ano=new.ano+1) + ano=new.ano + 1) new.protocolo = protocolo except Exception: protocolo = mommy.make(Protocolo, numero=new.numero_protocolo, ano=new.ano) with reversion.create_revision(): problema = 'Protocolo Vinculado [numero_protocolo=%s, '\ - 'ano=%s] não existe' % (new.numero_protocolo, - new.ano) + 'ano=%s] não existe' % (new.numero_protocolo, + new.ano) descricao = 'O protocolo inexistente foi criado' warn(problema + ' => ' + descricao) save_relation(obj=protocolo, problema=problema, @@ -751,7 +751,7 @@ def adjust_proposicao_antes_salvar(new, old): def adjust_proposicao_depois_salvar(new, old): if not hasattr(old.dat_envio, 'year') or old.dat_envio.year == 1800: msg = "O valor do campo data_envio (DateField) da model Proposicao"\ - " era inválido" + " era inválido" descricao = 'A data 1111-11-11 foi colocada no lugar' problema = 'O valor da data era nulo ou inválido' warn(msg + ' => ' + descricao) @@ -816,7 +816,6 @@ def adjust_tipoafastamento(new, old): new.indicador = 'A' - def adjust_tipoproposicao(new, old): if old.ind_mat_ou_doc == 'M': new.tipo_conteudo_related = TipoMateriaLegislativa.objects.get( @@ -870,7 +869,7 @@ def adjust_autor(new, old): except Exception: with reversion.create_revision(): msg = 'Um parlamentar relacionado de PK [%s] não existia' \ - % old.cod_parlamentar + % old.cod_parlamentar reversion.set_comment('Stub criado pela migração') value = make_stub(Parlamentar, old.cod_parlamentar) descricao = 'stub criado para entrada orfã!' diff --git a/sapl/legacy/scripts/street_sweeper.py b/sapl/legacy/scripts/street_sweeper.py index d600e900e..a33710b1a 100644 --- a/sapl/legacy/scripts/street_sweeper.py +++ b/sapl/legacy/scripts/street_sweeper.py @@ -19,7 +19,7 @@ EXCLUI_REGISTRO = "DELETE FROM %s WHERE ind_excluido=1" NORMA_DEP = "DELETE FROM vinculo_norma_juridica WHERE cod_norma_referente in (%s) OR \ cod_norma_referida in (%s) AND ind_excluido = 0 " -mapa = {} # mapa com tabela principal -> tabelas dependentes +mapa = {} # mapa com tabela principal -> tabelas dependentes mapa['tipo_autor'] = ['autor'] mapa['materia_legislativa'] = ['acomp_materia', 'autoria', 'despacho_inicial', @@ -43,6 +43,7 @@ mapa['parlamentar'] = ['autor', 'autoria', 'composicao_comissao', 'sessao_plenaria_presenca', 'unidade_tramitacao'] """ + def get_ids_excluidos(cursor, query): """ recupera as PKs de registros com ind_excluido = 1 da tabela principal @@ -58,7 +59,8 @@ def remove_tabelas(cursor, tabela_principal, pk, query_dependentes=None): QUERY = SELECT_EXCLUIDOS % (pk, tabela_principal, pk) ids_excluidos = get_ids_excluidos(cursor, QUERY) - print("\nRegistros da tabela '%s' com ind_excluido = 1: %s" % (tabela_principal.upper(), len(ids_excluidos))) + print("\nRegistros da tabela '%s' com ind_excluido = 1: %s" % + (tabela_principal.upper(), len(ids_excluidos))) """ Remove registros de tabelas que dependem da tabela principal, @@ -69,12 +71,13 @@ def remove_tabelas(cursor, tabela_principal, pk, query_dependentes=None): print("Dependencias inconsistentes") for tabela in mapa[tabela_principal]: - QUERY_DEP = REGISTROS_INCONSISTENTES % (tabela, pk, ','.join(ids_excluidos)) + QUERY_DEP = REGISTROS_INCONSISTENTES % ( + tabela, pk, ','.join(ids_excluidos)) # Trata caso especifico de norma_juridica if query_dependentes: QUERY_DEP = query_dependentes % (','.join(ids_excluidos), - ','.join(ids_excluidos)) + ','.join(ids_excluidos)) print(tabela.upper(), cursor.execute(QUERY_DEP)) diff --git a/sapl/materia/admin.py b/sapl/materia/admin.py index 6f5968c1f..cd6292c9c 100644 --- a/sapl/materia/admin.py +++ b/sapl/materia/admin.py @@ -11,6 +11,7 @@ if not DEBUG: admin.site.unregister(Proposicao) class ProposicaoAdmin(admin.ModelAdmin): + def has_add_permission(self, request, obj=None): return False diff --git a/sapl/materia/email_utils.py b/sapl/materia/email_utils.py index 78c0483b5..3cf53423d 100644 --- a/sapl/materia/email_utils.py +++ b/sapl/materia/email_utils.py @@ -206,6 +206,7 @@ def do_envia_email_tramitacao(base_url, materia, status, unidade_destino): # a conexão será fechada except Exception: connection.close() - raise Exception('Erro ao enviar e-mail de acompanhamento de matéria.') + raise Exception( + 'Erro ao enviar e-mail de acompanhamento de matéria.') connection.close() diff --git a/sapl/materia/views.py b/sapl/materia/views.py index a206ae06f..c7c1e2618 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1060,11 +1060,11 @@ class DocumentoAcessorioCrud(MasterDetailCrud): def __init__(self, **kwargs): super(MasterDetailCrud.CreateView, self).__init__(**kwargs) - + def get_initial(self): self.initial['data'] = datetime.now().date() - return self.initial + return self.initial def get_context_data(self, **kwargs): context = super( @@ -1735,9 +1735,9 @@ class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): if ('tramitacao__status' in qr and 'tramitacao__unidade_tramitacao_destino' in qr and - qr['tramitacao__status'] and - qr['tramitacao__unidade_tramitacao_destino'] - ): + qr['tramitacao__status'] and + qr['tramitacao__unidade_tramitacao_destino'] + ): lista = filtra_tramitacao_destino_and_status( qr['tramitacao__status'], qr['tramitacao__unidade_tramitacao_destino']) diff --git a/sapl/norma/models.py b/sapl/norma/models.py index a80f5a564..5f92f8a59 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -59,8 +59,10 @@ class TipoNormaJuridica(models.Model): def __str__(self): return self.descricao + def norma_upload_path(instance, filename): - return texto_upload_path(instance, filename, subpath=instance.ano) + return texto_upload_path(instance, filename, subpath=instance.ano) + @reversion.register() class NormaJuridica(models.Model): @@ -133,9 +135,9 @@ class NormaJuridica(models.Model): def get_normas_relacionadas(self): principais = NormaRelacionada.objects.filter( - norma_principal=self.id) + norma_principal=self.id) relacionadas = NormaRelacionada.objects.filter( - norma_relacionada=self.id) + norma_relacionada=self.id) return (principais, relacionadas) def __str__(self): diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index d36b3ff73..63a1bb0d9 100644 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -65,9 +65,9 @@ class MandatoForm(ModelForm): data = self.cleaned_data try: if 'legislatura' in data and 'parlamentar' in data: - Mandato.objects.get( - parlamentar__pk=self.initial['parlamentar'].pk, - legislatura__pk=data['legislatura'].pk) + Mandato.objects.get( + parlamentar__pk=self.initial['parlamentar'].pk, + legislatura__pk=data['legislatura'].pk) except ObjectDoesNotExist: pass else: @@ -323,7 +323,7 @@ class VotanteForm(ModelForm): def clean(self): super(VotanteForm, self).clean() - + cd = self.cleaned_data username = cd['username'] diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index dba1d9f6d..4e7a946c6 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -118,6 +118,7 @@ class DocumentoAdministrativoCrud(Crud): 'numero_protocolo': p.numero} class DetailView(DocumentoAdministrativoMixin, Crud.DetailView): + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) self.layout_display[0]['rows'][-1][0]['text'] = ( @@ -127,6 +128,7 @@ class DocumentoAdministrativoCrud(Crud): return context class DeleteView(DocumentoAdministrativoMixin, Crud.DeleteView): + def get_success_url(self): return reverse('sapl.protocoloadm:pesq_doc_adm', kwargs={}) @@ -451,28 +453,33 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): return redirect(self.get_success_url(protocolo)) def get_context_data(self, **kwargs): - context = super(CreateView, self).get_context_data(**kwargs) - autores_ativos = self.autores_ativos() + context = super(CreateView, self).get_context_data(**kwargs) + autores_ativos = self.autores_ativos() - autores = [] - autores.append(['0', '------']) - for a in autores_ativos: - autores.append([a.id, a.__str__()]) + autores = [] + autores.append(['0', '------']) + for a in autores_ativos: + autores.append([a.id, a.__str__()]) - context['form'].fields['autor'].choices = autores - return context + context['form'].fields['autor'].choices = autores + return context def autores_ativos(self): - lista_parlamentares = Parlamentar.objects.filter(ativo=True).values_list('id', flat=True) - model_parlamentar = ContentType.objects.get_for_model(Parlamentar) - autor_parlamentar = Autor.objects.filter(content_type=model_parlamentar, object_id__in=lista_parlamentares) - - lista_comissoes = Comissao.objects.filter(Q(data_extincao__isnull=True)|Q(data_extincao__gt=date.today())).values_list('id', flat=True) - model_comissao = ContentType.objects.get_for_model(Comissao) - autor_comissoes = Autor.objects.filter(content_type=model_comissao, object_id__in=lista_comissoes) - autores_outros = Autor.objects.exclude(content_type__in=[model_parlamentar, model_comissao]) - q = autor_parlamentar | autor_comissoes | autores_outros - return q + lista_parlamentares = Parlamentar.objects.filter( + ativo=True).values_list('id', flat=True) + model_parlamentar = ContentType.objects.get_for_model(Parlamentar) + autor_parlamentar = Autor.objects.filter( + content_type=model_parlamentar, object_id__in=lista_parlamentares) + + lista_comissoes = Comissao.objects.filter(Q(data_extincao__isnull=True) | Q( + data_extincao__gt=date.today())).values_list('id', flat=True) + model_comissao = ContentType.objects.get_for_model(Comissao) + autor_comissoes = Autor.objects.filter( + content_type=model_comissao, object_id__in=lista_comissoes) + autores_outros = Autor.objects.exclude( + content_type__in=[model_parlamentar, model_comissao]) + q = autor_parlamentar | autor_comissoes | autores_outros + return q class ProtocoloMateriaTemplateView(PermissionRequiredMixin, TemplateView): diff --git a/sapl/redireciona_urls/exceptions.py b/sapl/redireciona_urls/exceptions.py index e86aaefbb..e1a994bcb 100644 --- a/sapl/redireciona_urls/exceptions.py +++ b/sapl/redireciona_urls/exceptions.py @@ -8,6 +8,6 @@ class UnknownUrlNameError(Exception): def __str__(self): return repr( - _("Funcionalidade") - + " '%s' " % (self.url_name) - + _("pode ter sido removida ou movida para outra url.")) + _("Funcionalidade") + + " '%s' " % (self.url_name) + + _("pode ter sido removida ou movida para outra url.")) diff --git a/sapl/redireciona_urls/tests.py b/sapl/redireciona_urls/tests.py index f9ffa02ef..d8d713a2e 100644 --- a/sapl/redireciona_urls/tests.py +++ b/sapl/redireciona_urls/tests.py @@ -6,6 +6,7 @@ EMPTY_STRING = '' class RedirecionaURLsTests(TestCase): + def test_redireciona_index_SAPL(self): response = self.client.get(reverse( 'sapl.redireciona_urls:redireciona_sapl_index') @@ -34,7 +35,7 @@ class RedirecionaParlamentarTests(TestCase): url = "%s%s" % ( url, "?hdn_num_legislatura=%s" % (numero_legislatura) - ) + ) url_e = "%s%s" % (url_e, "?pk=%s" % numero_legislatura) response = self.client.get(url) @@ -49,7 +50,7 @@ class RedirecionaParlamentarTests(TestCase): url_e = reverse( 'sapl.parlamentares:parlamentar_detail', kwargs={'pk': pk_parlamentar} - ) + ) response = self.client.get(url) self.assertEqual(response.status_code, MovedPermanentlyHTTPStatusCode) self.assertEqual(response.url, url_e) @@ -65,7 +66,7 @@ class RedirecionaComissaoTests(TestCase): url_e = reverse( 'sapl.comissoes:comissao_detail', kwargs={'pk': pk_comissao} - ) + ) response = self.client.get(url) self.assertEqual(response.status_code, MovedPermanentlyHTTPStatusCode) self.assertEqual(response.url, url_e) @@ -89,7 +90,7 @@ class RedirecionaPautaSessaoTests(TestCase): url_e = reverse( 'sapl.sessao:pauta_sessao_detail', kwargs={'pk': pk_pauta_sessao} - ) + ) response = self.client.get(url) self.assertEqual(response.status_code, MovedPermanentlyHTTPStatusCode) self.assertEqual(response.url, url_e) @@ -153,7 +154,7 @@ class RedirecionaMesaDiretoraParlamentarTests(TestCase): url_e = reverse( 'sapl.parlamentares:parlamentar_detail', kwargs={'pk': pk_parlamentar} - ) + ) response = self.client.get(url) @@ -313,7 +314,7 @@ class RedirecionaNormasJuridicasDetailTests(TestCase): 'sapl.norma:normajuridica_detail', kwargs={ 'pk': pk_norma} - ) + ) response = self.client.get(url) self.assertEqual(response.status_code, MovedPermanentlyHTTPStatusCode) @@ -345,7 +346,7 @@ class RedirecionaSessaoPlenariaTests(TestCase): url_e = reverse( 'sapl.sessao:sessaoplenaria_detail', kwargs={'pk': pk_sessao_plenaria} - ) + ) response = self.client.get(url) @@ -532,18 +533,18 @@ class RedirecionaHistoricoTramitacoesListTests(TestCase): status_tramitacao = status_tramitacao.lstrip("0") if ( - (inicio_dt_tramitacao != EMPTY_STRING) or - (fim_dt_tramitacao != EMPTY_STRING) or - (tipo_materia != EMPTY_STRING) or - (unidade_local_tramitacao != EMPTY_STRING) or - (status_tramitacao != EMPTY_STRING)): + (inicio_dt_tramitacao != EMPTY_STRING) or + (fim_dt_tramitacao != EMPTY_STRING) or + (tipo_materia != EMPTY_STRING) or + (unidade_local_tramitacao != EMPTY_STRING) or + (status_tramitacao != EMPTY_STRING)): args_e += "?tramitacao__data_tramitacao_0=%s" % ( - inicio_dt_tramitacao) + inicio_dt_tramitacao) args_e += "&tramitacao__data_tramitacao_1=%s" % ( - fim_dt_tramitacao) + fim_dt_tramitacao) args_e += "&tipo=%s" % (tipo_materia) args_e += "&tramitacao__unidade_tramitacao_local=%s" % ( - unidade_local_tramitacao) + unidade_local_tramitacao) args_e += "&tramitacao__status=%s" % (status_tramitacao) args_e += "&salvar=%s" % ('Pesquisar') @@ -581,18 +582,18 @@ class RedirecionaHistoricoTramitacoesListTests(TestCase): status_tramitacao = status_tramitacao.lstrip("0") if ( - (inicio_dt_tramitacao != EMPTY_STRING) or - (fim_dt_tramitacao != EMPTY_STRING) or - (tipo_materia != EMPTY_STRING) or - (unidade_local_tramitacao != EMPTY_STRING) or - (status_tramitacao != EMPTY_STRING)): + (inicio_dt_tramitacao != EMPTY_STRING) or + (fim_dt_tramitacao != EMPTY_STRING) or + (tipo_materia != EMPTY_STRING) or + (unidade_local_tramitacao != EMPTY_STRING) or + (status_tramitacao != EMPTY_STRING)): args_e += "?tramitacao__data_tramitacao_0=%s" % ( - inicio_dt_tramitacao) + inicio_dt_tramitacao) args_e += "&tramitacao__data_tramitacao_1=%s" % ( - fim_dt_tramitacao) + fim_dt_tramitacao) args_e += "&tipo=%s" % (tipo_materia) args_e += "&tramitacao__unidade_tramitacao_local=%s" % ( - unidade_local_tramitacao) + unidade_local_tramitacao) args_e += "&tramitacao__status=%s" % (status_tramitacao) args_e += "&salvar=%s" % ('Pesquisar') diff --git a/sapl/relatorios/templates/pdf_capa_processo_preparar_pysc.py b/sapl/relatorios/templates/pdf_capa_processo_preparar_pysc.py index 789c2a50d..eacabf86e 100755 --- a/sapl/relatorios/templates/pdf_capa_processo_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_capa_processo_preparar_pysc.py @@ -1,138 +1,149 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION -data=DateTime().strftime('%d/%m/%Y') +data = DateTime().strftime('%d/%m/%Y') -#Abaixo é gerada a string para o rodapé da página -casa={} -aux=context.sapl_documentos.props_sapl.propertyItems() +# Abaixo é gerada a string para o rodapé da página +casa = {} +aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] -localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) -if len(casa["num_cep"])==8: - cep=casa["num_cep"][:4]+"-"+casa["num_cep"][5:] + casa[item[0]] = item[1] +localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) +if len(casa["num_cep"]) == 8: + cep = casa["num_cep"][:4] + "-" + casa["num_cep"][5:] else: - cep="" - -linha1=casa["end_casa"] -if cep!="": - if casa["end_casa"]!="" and casa["end_casa"]!=None: - linha1 = linha1 + " - " - linha1 = linha1 + "CEP "+cep -if localidade[0].nom_localidade!="" and localidade[0].nom_localidade!=None: - linha1 = linha1 + " - "+localidade[0].nom_localidade+" "+localidade[0].sgl_uf -if casa["num_tel"]!="" and casa["num_tel"]!=None: - linha1 = linha1 + " Tel.: "+ casa["num_tel"] - -linha2=casa["end_web_casa"] -if casa["end_email_casa"]!="" and casa["end_email_casa"]!=None: - if casa["end_web_casa"]!="" and casa["end_web_casa"]!=None: - linha2 = linha2 + " - " - linha2 = linha2 + "E-mail: "+casa["end_email_casa"] - -data_emissao=DateTime().strftime("%d/%m/%Y") -rodape=[linha1,linha2,data_emissao] - -#Por fim, gera-se as entradas para o cabeçalho -estados=context.zsql.localidade_obter_zsql(tip_localidade="u") + cep = "" + +linha1 = casa["end_casa"] +if cep != "": + if casa["end_casa"] != "" and casa["end_casa"] != None: + linha1 = linha1 + " - " + linha1 = linha1 + "CEP " + cep +if localidade[0].nom_localidade != "" and localidade[0].nom_localidade != None: + linha1 = linha1 + " - " + \ + localidade[0].nom_localidade + " " + localidade[0].sgl_uf +if casa["num_tel"] != "" and casa["num_tel"] != None: + linha1 = linha1 + " Tel.: " + casa["num_tel"] + +linha2 = casa["end_web_casa"] +if casa["end_email_casa"] != "" and casa["end_email_casa"] != None: + if casa["end_web_casa"] != "" and casa["end_web_casa"] != None: + linha2 = linha2 + " - " + linha2 = linha2 + "E-mail: " + casa["end_email_casa"] + +data_emissao = DateTime().strftime("%d/%m/%Y") +rodape = [linha1, linha2, data_emissao] + +# Por fim, gera-se as entradas para o cabeçalho +estados = context.zsql.localidade_obter_zsql(tip_localidade="u") for uf in estados: - if localidade[0].sgl_uf==uf.sgl_uf: - nom_estado=uf.nom_localidade - break -cabecalho={} -cabecalho["nom_casa"]=casa["nom_casa"] -cabecalho["nom_estado"]="Estado de "+nom_estado + if localidade[0].sgl_uf == uf.sgl_uf: + nom_estado = uf.nom_localidade + break +cabecalho = {} +cabecalho["nom_casa"] = casa["nom_casa"] +cabecalho["nom_estado"] = "Estado de " + nom_estado # tenta buscar o logotipo da casa LOGO_CASA -if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() +if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() else: - imagem = context.imagens.absolute_url() + "/brasao_transp.gif" + imagem = context.imagens.absolute_url() + "/brasao_transp.gif" -#Por fim, utiliza o PythonScript para pesquisar os protocolos e gerar os dados +# Por fim, utiliza o PythonScript para pesquisar os protocolos e gerar os dados -protocolos=[] -REQUEST=context.REQUEST -for protocolo in context.zsql.protocolo_pesquisar_zsql(tip_protocolo=REQUEST['rad_tip_protocolo'], - cod_protocolo=REQUEST['txt_num_protocolo'], ano_protocolo=REQUEST['txt_ano_protocolo'], - tip_documento=REQUEST['lst_tip_documento'], tip_processo=REQUEST['rad_tip_processo'], - tip_materia=REQUEST['lst_tip_materia'], des_assunto=REQUEST['txt_assunto'], - cod_autor=REQUEST['hdn_cod_autor'], des_interessado=REQUEST['txa_txt_interessado'], - dat_apres=REQUEST['dt_apres'], dat_apres2=REQUEST['dt_apres2']): - dic={} +protocolos = [] +REQUEST = context.REQUEST +for protocolo in context.zsql.protocolo_pesquisar_zsql(tip_protocolo=REQUEST['rad_tip_protocolo'], + cod_protocolo=REQUEST['txt_num_protocolo'], ano_protocolo=REQUEST[ + 'txt_ano_protocolo'], + tip_documento=REQUEST['lst_tip_documento'], tip_processo=REQUEST[ + 'rad_tip_processo'], + tip_materia=REQUEST[ + 'lst_tip_materia'], des_assunto=REQUEST['txt_assunto'], + cod_autor=REQUEST['hdn_cod_autor'], des_interessado=REQUEST[ + 'txa_txt_interessado'], + dat_apres=REQUEST['dt_apres'], dat_apres2=REQUEST['dt_apres2']): + dic = {} - dic['titulo']=str(protocolo.cod_protocolo) + dic['titulo'] = str(protocolo.cod_protocolo) - dic['ano']=str(protocolo.ano_protocolo) + dic['ano'] = str(protocolo.ano_protocolo) - dic['data']=context.pysc.iso_to_port_pysc(protocolo.dat_protocolo)+' - '+protocolo.hor_protocolo + dic['data'] = context.pysc.iso_to_port_pysc( + protocolo.dat_protocolo) + ' - ' + protocolo.hor_protocolo - dic['txt_assunto']=protocolo.txt_assunto_ementa + dic['txt_assunto'] = protocolo.txt_assunto_ementa - dic['txt_interessado']=protocolo.txt_interessado + dic['txt_interessado'] = protocolo.txt_interessado - dic['nom_autor'] = " " - if protocolo.cod_autor!=None: - for autor in context.zsql.autor_obter_zsql(cod_autor=protocolo.cod_autor): - if autor.des_tipo_autor=='Parlamentar': - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): - dic['nom_autor']=parlamentar.nom_completo - elif autor.des_tipo_autor=='Comissao': - for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): - dic['nom_autor']=comissao.nom_comissao - else: - dic['nom_autor']=autor.nom_autor - else: - dic['nom_autor']=protocolo.txt_interessado + dic['nom_autor'] = " " + if protocolo.cod_autor != None: + for autor in context.zsql.autor_obter_zsql(cod_autor=protocolo.cod_autor): + if autor.des_tipo_autor == 'Parlamentar': + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): + dic['nom_autor'] = parlamentar.nom_completo + elif autor.des_tipo_autor == 'Comissao': + for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): + dic['nom_autor'] = comissao.nom_comissao + else: + dic['nom_autor'] = autor.nom_autor + else: + dic['nom_autor'] = protocolo.txt_interessado - dic['natureza']='' - if protocolo.tip_processo==0: - dic['natureza']='Administrativo' - if protocolo.tip_processo==1: - dic['natureza']='Legislativo' - - dic['ident_processo']=protocolo.des_tipo_materia or protocolo.des_tipo_documento + dic['natureza'] = '' + if protocolo.tip_processo == 0: + dic['natureza'] = 'Administrativo' + if protocolo.tip_processo == 1: + dic['natureza'] = 'Legislativo' - dic['sgl_processo']=protocolo.sgl_tipo_materia or protocolo.sgl_tipo_documento + dic['ident_processo'] = protocolo.des_tipo_materia or protocolo.des_tipo_documento - dic['num_materia']='' - for materia in context.zsql.materia_obter_zsql(num_protocolo=protocolo.cod_protocolo,ano_ident_basica=protocolo.ano_protocolo): - dic['num_materia']=str(materia.num_ident_basica)+'/'+ str(materia.ano_ident_basica) + dic['sgl_processo'] = protocolo.sgl_tipo_materia or protocolo.sgl_tipo_documento - dic['num_documento']='' - for documento in context.zsql.documento_administrativo_obter_zsql(num_protocolo=protocolo.cod_protocolo): - dic['num_documento']=str(documento.num_documento)+'/'+ str(documento.ano_documento) + dic['num_materia'] = '' + for materia in context.zsql.materia_obter_zsql(num_protocolo=protocolo.cod_protocolo, ano_ident_basica=protocolo.ano_protocolo): + dic['num_materia'] = str(materia.num_ident_basica) + \ + '/' + str(materia.ano_ident_basica) - dic['num_processo']=dic['num_materia'] or dic['num_documento'] + dic['num_documento'] = '' + for documento in context.zsql.documento_administrativo_obter_zsql(num_protocolo=protocolo.cod_protocolo): + dic['num_documento'] = str( + documento.num_documento) + '/' + str(documento.ano_documento) - dic['numeracao']='' - for materia_num in context.zsql.materia_obter_zsql(num_protocolo=protocolo.cod_protocolo,ano_ident_basica=protocolo.ano_protocolo): - for numera in context.zsql.numeracao_obter_zsql(cod_materia=materia_num.cod_materia,ind_excluido=0): - dic['numeracao']='PROCESSO N° ' +str(numera.num_materia)+'/'+ str(numera.ano_materia) + dic['num_processo'] = dic['num_materia'] or dic['num_documento'] - dic['anulado']='' - if protocolo.ind_anulado==1: - dic['anulado']='Nulo' + dic['numeracao'] = '' + for materia_num in context.zsql.materia_obter_zsql(num_protocolo=protocolo.cod_protocolo, ano_ident_basica=protocolo.ano_protocolo): + for numera in context.zsql.numeracao_obter_zsql(cod_materia=materia_num.cod_materia, ind_excluido=0): + dic['numeracao'] = 'PROCESSO N° ' + \ + str(numera.num_materia) + '/' + str(numera.ano_materia) - protocolos.append(dic) + dic['anulado'] = '' + if protocolo.ind_anulado == 1: + dic['anulado'] = 'Nulo' -filtro={} # Dicionário que conterá os dados do filtro + protocolos.append(dic) + +filtro = {} # Dicionário que conterá os dados do filtro # Atribuições diretas do REQUEST -filtro['numero']=REQUEST.txt_num_protocolo -filtro['ano']=REQUEST.txt_ano_protocolo -filtro['tipo_protocolo']=REQUEST.rad_tip_protocolo -filtro['tipo_processo']=REQUEST.rad_tip_processo -filtro['assunto']=REQUEST.txt_assunto -filtro['autor']=REQUEST.hdn_cod_autor -filtro['interessado']=REQUEST.txa_txt_interessado - -sessao=session.id -caminho = context.pdf_capa_processo_gerar(sessao,imagem,data,protocolos,cabecalho,rodape,filtro) -if caminho=='aviso': - return response.redirect('mensagem_emitir_proc') +filtro['numero'] = REQUEST.txt_num_protocolo +filtro['ano'] = REQUEST.txt_ano_protocolo +filtro['tipo_protocolo'] = REQUEST.rad_tip_protocolo +filtro['tipo_processo'] = REQUEST.rad_tip_processo +filtro['assunto'] = REQUEST.txt_assunto +filtro['autor'] = REQUEST.hdn_cod_autor +filtro['interessado'] = REQUEST.txa_txt_interessado + +sessao = session.id +caminho = context.pdf_capa_processo_gerar( + sessao, imagem, data, protocolos, cabecalho, rodape, filtro) +if caminho == 'aviso': + return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_detalhe_materia_gerar.py b/sapl/relatorios/templates/pdf_detalhe_materia_gerar.py index dbe604872..43224d282 100755 --- a/sapl/relatorios/templates/pdf_detalhe_materia_gerar.py +++ b/sapl/relatorios/templates/pdf_detalhe_materia_gerar.py @@ -11,326 +11,402 @@ import time from trml2pdf import parseString -def cabecalho(dic_inf_basicas,imagem): +def cabecalho(dic_inf_basicas, imagem): """ Função que gera o código rml do cabeçalho da página """ - tmp='' - tmp+='\t\t\t\t\n' - tmp+='\t\t\t\t2cm 24.5cm 19cm 24.5cm\n' - if dic_inf_basicas['nom_camara']!="" and dic_inf_basicas['nom_camara']!=None: - tmp+='\t\t\t\t\n' - tmp+='\t\t\t\t' + dic_inf_basicas['nom_camara'] + '\n' - tmp+='\t\t\t\t\n' - tmp+='\t\t\t\tSistema de Apoio ao Processo Legislativo\n' + tmp = '' + tmp += '\t\t\t\t\n' + tmp += '\t\t\t\t2cm 24.5cm 19cm 24.5cm\n' + if dic_inf_basicas['nom_camara'] != "" and dic_inf_basicas['nom_camara'] != None: + tmp += '\t\t\t\t\n' + tmp += '\t\t\t\t' + \ + dic_inf_basicas['nom_camara'] + '\n' + tmp += '\t\t\t\t\n' + tmp += '\t\t\t\tSistema de Apoio ao Processo Legislativo\n' if str(dic_inf_basicas['nom_projeto']) != "" and str(dic_inf_basicas['nom_projeto']) != None: - tmp+='\t\t\t\t\n' - tmp+='\t\t\t\t' + str(dic_inf_basicas['nom_projeto']) + '\n' + tmp += '\t\t\t\t\n' + tmp += '\t\t\t\t' + \ + str(dic_inf_basicas['nom_projeto']) + '\n' if str(dic_inf_basicas['cod_projeto']) != "" and str(dic_inf_basicas['cod_projeto']) != None: - tmp+='\t\t\t\t\n' - tmp+='\t\t\t\t' + str(dic_inf_basicas['cod_projeto']) + '\n' + tmp += '\t\t\t\t\n' + tmp += '\t\t\t\t' + \ + str(dic_inf_basicas['cod_projeto']) + '\n' return tmp + def rodape(dic_rodape): """ Função que gera o codigo rml do rodape da pagina. """ - tmp='' + tmp = '' linha1 = dic_rodape['end_casa'] - if dic_rodape['end_casa']!="" and dic_rodape['end_casa']!=None: + if dic_rodape['end_casa'] != "" and dic_rodape['end_casa'] != None: linha1 = linha1 + " - " - if dic_rodape['num_cep']!="" and dic_rodape['num_cep']!=None: + if dic_rodape['num_cep'] != "" and dic_rodape['num_cep'] != None: linha1 = linha1 + "CEP " + dic_rodape['num_cep'] - if dic_rodape['nom_localidade']!="" and dic_rodape['nom_localidade']!=None: + if dic_rodape['nom_localidade'] != "" and dic_rodape['nom_localidade'] != None: linha1 = linha1 + " - " + dic_rodape['nom_localidade'] - if dic_rodape['sgl_uf']!="" and dic_rodape['sgl_uf']!=None: + if dic_rodape['sgl_uf'] != "" and dic_rodape['sgl_uf'] != None: inha1 = linha1 + " " + dic_rodape['sgl_uf'] - if dic_rodape['num_tel']!="" and dic_rodape['num_tel']!=None: - linha1 = linha1 + " Tel: "+ dic_rodape['num_tel'] - if dic_rodape['end_web_casa']!="" and dic_rodape['end_web_casa']!=None: + if dic_rodape['num_tel'] != "" and dic_rodape['num_tel'] != None: + linha1 = linha1 + " Tel: " + dic_rodape['num_tel'] + if dic_rodape['end_web_casa'] != "" and dic_rodape['end_web_casa'] != None: linha2 = dic_rodape['end_web_casa'] - if dic_rodape['end_email_casa']!="" and dic_rodape['end_email_casa']!=None: + if dic_rodape['end_email_casa'] != "" and dic_rodape['end_email_casa'] != None: linha2 = linha2 + " - E-mail: " + dic_rodape['end_email_casa'] - if dic_rodape['data_emissao']!="" and dic_rodape['data_emissao']!=None: + if dic_rodape['data_emissao'] != "" and dic_rodape['data_emissao'] != None: data_emissao = dic_rodape['data_emissao'] - tmp+='\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' - tmp+='\t\t\t\t\n' - tmp+='\t\t\t\t' + data_emissao + '\n' - tmp+='\t\t\t\tPágina \n' - tmp+='\t\t\t\t' + linha1 + '\n' - tmp+='\t\t\t\t' + linha2 + '\n' + tmp += '\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' + tmp += '\t\t\t\t\n' + tmp += '\t\t\t\t' + data_emissao + '\n' + tmp += '\t\t\t\tPágina \n' + tmp += '\t\t\t\t' + \ + linha1 + '\n' + tmp += '\t\t\t\t' + \ + linha2 + '\n' return tmp + def paraStyle(): """Função que gera o código rml que define o estilo dos parágrafos""" - - tmp='' - tmp+='\t\n' - tmp+='\t\t\n' - tmp+='\t\t\t\n' - tmp+='\t\t\t\n' - tmp+='\t\t\n' - tmp+='\t\t\n' - tmp+='\t\t\t\n' - tmp+='\t\t\n' - #titulo do parágrafo: é por default centralizado - tmp+='\t\t\n' - tmp+='\t\t\n' - tmp+='\t\t\n' - tmp+='\t\t\n' - tmp+='\t\n' + + tmp = '' + tmp += '\t\n' + tmp += '\t\t\n' + tmp += '\t\t\t\n' + tmp += '\t\t\t\n' + tmp += '\t\t\n' + tmp += '\t\t\n' + tmp += '\t\t\t\n' + tmp += '\t\t\n' + # titulo do parágrafo: é por default centralizado + tmp += '\t\t\n' + tmp += '\t\t\n' + tmp += '\t\t\n' + tmp += '\t\t\n' + tmp += '\t\n' return tmp + def inf_basicas(dic_inf_basicas): """ Função que gera o código rml das funções básicas do relatório """ - tmp='' - #Texto do projeto + tmp = '' + # Texto do projeto texto_projeto = str(dic_inf_basicas['texto_projeto']) - if texto_projeto != "" and texto_projeto != None : - tmp+='\t\t' + texto_projeto.replace('&','&') + '\n' + if texto_projeto != "" and texto_projeto != None: + tmp += '\t\t' + \ + texto_projeto.replace('&', '&') + '\n' - #início das informações básicas - tmp+='\t\tInformações Básicas\n' + # início das informações básicas + tmp += '\t\tInformações Básicas\n' if str(dic_inf_basicas['apresentada']) != "" and str(dic_inf_basicas['apresentada']) != None: - tmp+='\t\tApresentada em: ' + str(dic_inf_basicas['apresentada']) + '\n' + tmp += '\t\tApresentada em: ' + \ + str(dic_inf_basicas['apresentada']) + '\n' if str(dic_inf_basicas['formato']) != "" and str(dic_inf_basicas['formato']) != None: - tmp+='\t\tFormato: ' + str(dic_inf_basicas['formato']) + '\n' + tmp += '\t\tFormato: ' + \ + str(dic_inf_basicas['formato']) + '\n' - if dic_inf_basicas['publicada']==0: - tmp+='\t\tPublicada: Não\n' - else: - tmp+='\t\tPublicada: Sim\n' + if dic_inf_basicas['publicada'] == 0: + tmp += '\t\tPublicada: Não\n' + else: + tmp += '\t\tPublicada: Sim\n' if str(dic_inf_basicas['objeto']) != "" and str(dic_inf_basicas['objeto']) != None: - tmp+='\t\tObjeto: ' + str(dic_inf_basicas['objeto']) + '\n' + tmp += '\t\tObjeto: ' + \ + str(dic_inf_basicas['objeto']) + '\n' - if dic_inf_basicas['tramitacao']==0: - tmp+='\t\tTramitação: Não\n' + if dic_inf_basicas['tramitacao'] == 0: + tmp += '\t\tTramitação: Não\n' else: - tmp+='\t\tTramitação: Sim\n' + tmp += '\t\tTramitação: Sim\n' if str(dic_inf_basicas['reg_tramitacao']) != "" and str(dic_inf_basicas['reg_tramitacao']) != None: - tmp+='\t\tRegime: ' + str(dic_inf_basicas['reg_tramitacao']) + '\n' + tmp += '\t\tRegime: ' + \ + str(dic_inf_basicas['reg_tramitacao']) + '\n' if str(dic_inf_basicas['prazo']) != "" and str(dic_inf_basicas['prazo']) != None: - tmp+='\t\tDias de prazo: ' + str(dic_inf_basicas['prazo']) + '\n' + tmp += '\t\tDias de prazo: ' + \ + str(dic_inf_basicas['prazo']) + '\n' if str(dic_inf_basicas['fim_prazo']) != "" and str(dic_inf_basicas['fim_prazo']) != None: - tmp+='\t\tData do fim do prazo: ' + str(dic_inf_basicas['fim_prazo']) + '\n' + tmp += '\t\tData do fim do prazo: ' + \ + str(dic_inf_basicas['fim_prazo']) + '\n' if dic_inf_basicas['mat_complementar'] == 0: - tmp+='\t\tMatéria Complementar: Não\n' + tmp += '\t\tMatéria Complementar: Não\n' else: - tmp+='\t\tMatéria Complementar: Sim\n' + tmp += '\t\tMatéria Complementar: Sim\n' if dic_inf_basicas['polemica'] == 0: - tmp+='\t\tPolêmica: Não\n' + tmp += '\t\tPolêmica: Não\n' else: - tmp+='\t\tPolêmica: Sim\n' + tmp += '\t\tPolêmica: Sim\n' apelido = dic_inf_basicas['apelido'] if apelido != "" and apelido != None: - tmp+='\t\tApelido: ' + apelido.replace('&','&') + '\n' + tmp += '\t\tApelido: ' + \ + apelido.replace('&', '&') + '\n' indexacao = dic_inf_basicas['indexacao'] if indexacao != "" and indexacao != None: - tmp+='\t\tIndexação: ' + indexacao.replace('&','&') + '\n' + tmp += '\t\tIndexação: ' + \ + indexacao.replace('&', '&') + '\n' observacao = dic_inf_basicas['observacao'] if observacao != "" and observacao != None: - tmp+='\t\tObservação: ' + observacao.replace('&','&') + '\n' + tmp += '\t\tObservação: ' + \ + observacao.replace('&', '&') + '\n' return tmp + def orig_externa(dic_orig_externa): """ Função que gera o código rml da origem externa """ - tmp='' - tmp+='\t\tOrigem Externa\n' + tmp = '' + tmp += '\t\tOrigem Externa\n' try: if dic_orig_externa['local'] != "" and dic_orig_externa['local'] != None: - tmp+='\t\tLocal: ' + dic_orig_externa['local'] + '\n' + tmp += '\t\tLocal: ' + \ + dic_orig_externa['local'] + '\n' if dic_orig_externa['data'] != "" and dic_orig_externa['data'] != None: - tmp+='\t\tData: ' + dic_orig_externa['data'] + '\n' + tmp += '\t\tData: ' + \ + dic_orig_externa['data'] + '\n' if dic_orig_externa['tipo'] != "" and dic_orig_externa['tipo'] != None: - tmp+='\t\tTipo: ' + dic_orig_externa['tipo'] + '\n' + tmp += '\t\tTipo: ' + \ + dic_orig_externa['tipo'] + '\n' if dic_orig_externa['numero_ano'] != "" and dic_orig_externa['numero_ano'] != None: - tmp+='\t\tNúmero/Ano: ' + dic_orig_externa['numero_ano'] + '\n' - except: pass + tmp += '\t\tNúmero/Ano: ' + \ + dic_orig_externa['numero_ano'] + '\n' + except: + pass return tmp + def mat_anexadas(lst_mat_anexadas): - tmp='' - tmp+='\t\tMatérias Anexadas\n' - for dic_mat in lst_mat_anexadas: - if dic_mat['nom_mat']!="" and dic_mat['nom_mat']!= None: - tmp+='\t\tNome da matéria: ' + dic_mat['nom_mat'] + '\n' - tmp+='\t\tData: ' + dic_mat['data'] + '\n' - tmp+='\t\tData final: ' + str(dic_mat['data_fim']) + '\n' + tmp = '' + tmp += '\t\tMatérias Anexadas\n' + for dic_mat in lst_mat_anexadas: + if dic_mat['nom_mat'] != "" and dic_mat['nom_mat'] != None: + tmp += '\t\tNome da matéria: ' + \ + dic_mat['nom_mat'] + '\n' + tmp += '\t\tData: ' + \ + dic_mat['data'] + '\n' + tmp += '\t\tData final: ' + \ + str(dic_mat['data_fim']) + '\n' return tmp + def autoria(lst_autoria): - tmp='' - tmp+='\t\tAutores\n' + tmp = '' + tmp += '\t\tAutores\n' for dic_autor in lst_autoria: if dic_autor['nom_autor'] != "" and dic_autor['nom_autor'] != None: - tmp+='\t\tNome do Autor: ' + dic_autor['nom_autor'] + '\n' + tmp += '\t\tNome do Autor: ' + \ + dic_autor['nom_autor'] + '\n' if dic_autor['nom_autor'] != "" and dic_autor['cargo'] != None: - tmp+='\t\tCargo: ' + dic_autor['cargo'] + '\n' + tmp += '\t\tCargo: ' + \ + dic_autor['cargo'] + '\n' if dic_autor['nom_autor'] != "" and dic_autor['tipo'] != None: - tmp+='\t\tTipo: ' + dic_autor['tipo'] + '\n' + tmp += '\t\tTipo: ' + \ + dic_autor['tipo'] + '\n' return tmp + def despachos_iniciais(lst_des_iniciais): - tmp='' - tmp+='\t\tDespachos Iniciais\n' + tmp = '' + tmp += '\t\tDespachos Iniciais\n' for dic_dados in lst_des_iniciais: - if dic_dados['nom_comissao']==None: - dic_dados['nom_comissao']=" " - tmp+='\t\tNome da comissão: ' + dic_dados['nom_comissao'] + '\n' + if dic_dados['nom_comissao'] == None: + dic_dados['nom_comissao'] = " " + tmp += '\t\tNome da comissão: ' + \ + dic_dados['nom_comissao'] + '\n' return tmp + def tramitacoes(dic_tramitacoes): - tmp='' - tmp+='\t\tÚltima Tramitação\n' + tmp = '' + tmp += '\t\tÚltima Tramitação\n' try: - tmp+='\t\tData Ação: ' + str(dic_tramitacoes['data']) + '\n' - tmp+='\t\tUnidade Local: ' + dic_tramitacoes['unidade'] + '\n' - tmp+='\t\tEncaminhada em: ' + str(dic_tramitacoes['data_enc']) + '\n' - tmp+='\t\tDestino: ' + dic_tramitacoes['destino'] + '\n' - tmp+='\t\tTurno: ' + dic_tramitacoes['turno'] + '\n' - tmp+='\t\tStatus: ' + dic_tramitacoes['status'] + '\n' - if dic_tramitacoes['urgente']==0: - tmp+='\t\tUrgente: Não\n' - else: - tmp+='\t\tUrgente: Sim\n' - - tmp+='\t\tData do fim do prazo: ' + str(dic_tramitacoes['data_fim']) + '\n' - if dic_tramitacoes['texto_acao'] != "" and dic_tramitacoes['texto_acao'] != None : - tmp+='\t\tTexto da Ação: ' + dic_tramitacoes['texto_acao'].replace('&','&') + '\n' - - except: pass + tmp += '\t\tData Ação: ' + \ + str(dic_tramitacoes['data']) + '\n' + tmp += '\t\tUnidade Local: ' + \ + dic_tramitacoes['unidade'] + '\n' + tmp += '\t\tEncaminhada em: ' + \ + str(dic_tramitacoes['data_enc']) + '\n' + tmp += '\t\tDestino: ' + \ + dic_tramitacoes['destino'] + '\n' + tmp += '\t\tTurno: ' + \ + dic_tramitacoes['turno'] + '\n' + tmp += '\t\tStatus: ' + \ + dic_tramitacoes['status'] + '\n' + if dic_tramitacoes['urgente'] == 0: + tmp += '\t\tUrgente: Não\n' + else: + tmp += '\t\tUrgente: Sim\n' + + tmp += '\t\tData do fim do prazo: ' + \ + str(dic_tramitacoes['data_fim']) + '\n' + if dic_tramitacoes['texto_acao'] != "" and dic_tramitacoes['texto_acao'] != None: + tmp += '\t\tTexto da Ação: ' + \ + dic_tramitacoes['texto_acao'].replace( + '&', '&') + '\n' + + except: + pass return tmp + def relatorias(lst_relatorias): - tmp='' - tmp+='\t\tRelatorias\n' + tmp = '' + tmp += '\t\tRelatorias\n' for dic_comissao in lst_relatorias: - tmp+='\t\tComissão: ' + dic_comissao['nom_comissao'] + '\n' - tmp+='\t\tData Designação: ' + str(dic_comissao['data_desig']) + '\n' - tmp+='\t\tParlamentar: ' + dic_comissao['parlamentar'] + '\n' - tmp+='\t\tData Destituição: ' + str(dic_comissao['data_dest']) + '\n' - tmp+='\t\tMotivo Fim Relatoria: ' + dic_comissao['motivo'] + '\n' + tmp += '\t\tComissão: ' + \ + dic_comissao['nom_comissao'] + '\n' + tmp += '\t\tData Designação: ' + \ + str(dic_comissao['data_desig']) + '\n' + tmp += '\t\tParlamentar: ' + \ + dic_comissao['parlamentar'] + '\n' + tmp += '\t\tData Destituição: ' + \ + str(dic_comissao['data_dest']) + '\n' + tmp += '\t\tMotivo Fim Relatoria: ' + \ + dic_comissao['motivo'] + '\n' return tmp + def numeracoes(lst_numeracoes): - tmp='' - tmp+='\t\tNumerações\n' + tmp = '' + tmp += '\t\tNumerações\n' for dic_dados in lst_numeracoes: - tmp+='\t\tNome: ' + dic_dados['nome'] + '\n' - tmp+='\t\tAno: ' + str(dic_dados['ano']) + '\n' + tmp += '\t\tNome: ' + \ + dic_dados['nome'] + '\n' + tmp += '\t\tAno: ' + \ + str(dic_dados['ano']) + '\n' return tmp + def legislacoes_citadas(lst_leg_citadas): - tmp='' - tmp+='\t\tLegislações Citadas\n' + tmp = '' + tmp += '\t\tLegislações Citadas\n' for dic_dados in lst_leg_citadas: - tmp+='\t\tTipo Norma: ' + str(dic_dados['nome_lei']) + '\n' - tmp+='\t\tDisposição: ' + str(dic_dados['disposicao']) + '\n' - tmp+='\t\tParte: ' + str(dic_dados['parte']) + '\n' - tmp+='\t\tLivro: ' + str(dic_dados['livro']) + '\n' - tmp+='\t\tTí­tulo: ' + str(dic_dados['titulo']) + '\n' - tmp+='\t\tCapí­tulo: ' + str(dic_dados['capitulo']) + '\n' - tmp+='\t\tSeção: ' + str(dic_dados['secao']) + '\n' - tmp+='\t\tSubseção: ' + str(dic_dados['subsecao']) + '\n' - tmp+='\t\tArtigo: ' + str(dic_dados['artigo']) + '\n' - tmp+='\t\tParágrafo: ' + str(dic_dados['paragrafo']) + '\n' - tmp+='\t\tInciso: ' + str(dic_dados['inciso']) + '\n' - tmp+='\t\tAlí­nea: ' + str(dic_dados['alinea']) + '\n' - tmp+='\t\tItem: ' + str(dic_dados['item']) + '\n' + tmp += '\t\tTipo Norma: ' + \ + str(dic_dados['nome_lei']) + '\n' + tmp += '\t\tDisposição: ' + \ + str(dic_dados['disposicao']) + '\n' + tmp += '\t\tParte: ' + \ + str(dic_dados['parte']) + '\n' + tmp += '\t\tLivro: ' + \ + str(dic_dados['livro']) + '\n' + tmp += '\t\tTí­tulo: ' + \ + str(dic_dados['titulo']) + '\n' + tmp += '\t\tCapí­tulo: ' + \ + str(dic_dados['capitulo']) + '\n' + tmp += '\t\tSeção: ' + \ + str(dic_dados['secao']) + '\n' + tmp += '\t\tSubseção: ' + \ + str(dic_dados['subsecao']) + '\n' + tmp += '\t\tArtigo: ' + \ + str(dic_dados['artigo']) + '\n' + tmp += '\t\tParágrafo: ' + \ + str(dic_dados['paragrafo']) + '\n' + tmp += '\t\tInciso: ' + \ + str(dic_dados['inciso']) + '\n' + tmp += '\t\tAlí­nea: ' + \ + str(dic_dados['alinea']) + '\n' + tmp += '\t\tItem: ' + \ + str(dic_dados['item']) + '\n' return tmp + def documentos_acessorios(lst_acessorios): - tmp='' - tmp+='\t\tDocumentos Acessórios\n' + tmp = '' + tmp += '\t\tDocumentos Acessórios\n' for dic_dados in lst_acessorios: - if dic_dados['tipo']!=None: - tmp+='\t\tTipo: ' + dic_dados['tipo'] + '\n' - - if dic_dados['nome']!=None: - tmp+='\t\tNome: ' + dic_dados['nome'] + '\n' - - tmp+='\t\tData: ' + dic_dados['data'] + '\n' - if dic_dados['autor']!=None: - tmp+='\t\tAutor: ' + dic_dados['autor'] + '\n' - - if dic_dados['ementa']!=None: - tmp+='\t\tEmenta: ' + dic_dados['ementa'].replace('&','&') + '\n' - if dic_dados['indexacao']!=None: - tmp+='\t\tEmenta: ' + dic_dados['indexacao'].replace('&','&') + '\n' + if dic_dados['tipo'] != None: + tmp += '\t\tTipo: ' + \ + dic_dados['tipo'] + '\n' + + if dic_dados['nome'] != None: + tmp += '\t\tNome: ' + \ + dic_dados['nome'] + '\n' + + tmp += '\t\tData: ' + \ + dic_dados['data'] + '\n' + if dic_dados['autor'] != None: + tmp += '\t\tAutor: ' + \ + dic_dados['autor'] + '\n' + + if dic_dados['ementa'] != None: + tmp += '\t\tEmenta: ' + \ + dic_dados['ementa'].replace('&', '&') + '\n' + if dic_dados['indexacao'] != None: + tmp += '\t\tEmenta: ' + \ + dic_dados['indexacao'].replace('&', '&') + '\n' return tmp -def principal(imagem, dic_rodape,dic_inf_basicas,dic_orig_externa,lst_mat_anexadas,lst_autoria,lst_des_iniciais, - dic_tramitacoes,lst_relatorias,lst_numeracoes,lst_leg_citadas,lst_acessorios,sessao=''): + +def principal(imagem, dic_rodape, dic_inf_basicas, dic_orig_externa, lst_mat_anexadas, lst_autoria, lst_des_iniciais, + dic_tramitacoes, lst_relatorias, lst_numeracoes, lst_leg_citadas, lst_acessorios, sessao=''): """ Função principal responsável por chamar as funções que irão gerar o código rml apropriado """ - arquivoPdf=str(int(time.time()*100))+".pdf" - - tmp='' - tmp+='\n' - tmp+='\n' - tmp+='\n' - tmp+='\t\n' - tmp+=paraStyle() - tmp+='\t\n' - tmp+=inf_basicas(dic_inf_basicas) - tmp+=orig_externa(dic_orig_externa) - tmp+=mat_anexadas(lst_mat_anexadas) - tmp+=autoria(lst_autoria) - tmp+=despachos_iniciais(lst_des_iniciais) - tmp+=tramitacoes(dic_tramitacoes) - tmp+=relatorias(lst_relatorias) - tmp+=numeracoes(lst_numeracoes) - tmp+=legislacoes_citadas(lst_leg_citadas) - tmp+=documentos_acessorios(lst_acessorios) - tmp+='\t\n' - tmp+='\n' - tmp_pdf=parseString(tmp) + arquivoPdf = str(int(time.time() * 100)) + ".pdf" + + tmp = '' + tmp += '\n' + tmp += '\n' + tmp += '\n' + tmp += '\t\n' + tmp += paraStyle() + tmp += '\t\n' + tmp += inf_basicas(dic_inf_basicas) + tmp += orig_externa(dic_orig_externa) + tmp += mat_anexadas(lst_mat_anexadas) + tmp += autoria(lst_autoria) + tmp += despachos_iniciais(lst_des_iniciais) + tmp += tramitacoes(dic_tramitacoes) + tmp += relatorias(lst_relatorias) + tmp += numeracoes(lst_numeracoes) + tmp += legislacoes_citadas(lst_leg_citadas) + tmp += documentos_acessorios(lst_acessorios) + tmp += '\t\n' + tmp += '\n' + tmp_pdf = parseString(tmp) return tmp_pdf # if hasattr(context.temp_folder,arquivoPdf): @@ -339,9 +415,9 @@ def principal(imagem, dic_rodape,dic_inf_basicas,dic_orig_externa,lst_mat_anexad # arq=context.temp_folder[arquivoPdf] # arq.manage_edit(title='Arquivo PDF temporário.',filedata=tmp_pdf,content_type='application/pdf') -# # try: -# # tmp_pdf=parseString(unicode(tmp, 'utf-8')) -# # except: +# # try: +# # tmp_pdf=parseString(unicode(tmp, 'utf-8')) +# # except: # # tmp_pdf=parseString(unicode(tmp, 'utf-8')) # return "/temp_folder/"+arquivoPdf diff --git a/sapl/relatorios/templates/pdf_detalhe_materia_preparar_pysc.py b/sapl/relatorios/templates/pdf_detalhe_materia_preparar_pysc.py index f28adccb1..ebe3be006 100644 --- a/sapl/relatorios/templates/pdf_detalhe_materia_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_detalhe_materia_preparar_pysc.py @@ -1,89 +1,94 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION -cabecalho={} +cabecalho = {} # tenta buscar o logotipo da casa LOGO_CASA -if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() +if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() else: - imagem = context.imagens.absolute_url() + "/brasao_transp.gif" + imagem = context.imagens.absolute_url() + "/brasao_transp.gif" -#Abaixo é gerado o dic do rodapé da página (linha 7) -casa={} -aux=context.sapl_documentos.props_sapl.propertyItems() +# Abaixo é gerado o dic do rodapé da página (linha 7) +casa = {} +aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] -localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) -data_emissao= DateTime().strftime("%d/%m/%Y") -rodape= casa -rodape['data_emissao']= data_emissao + casa[item[0]] = item[1] +localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) +data_emissao = DateTime().strftime("%d/%m/%Y") +rodape = casa +rodape['data_emissao'] = data_emissao inf_basicas_dic = {} -inf_basicas_dic['nom_camara']= casa['nom_casa'] -REQUEST=context.REQUEST -for local in context.zsql.localidade_obter_zsql(cod_localidade = casa['cod_localidade']): - rodape['nom_localidade']= " "+local.nom_localidade - rodape['sgl_uf']= local.sgl_uf +inf_basicas_dic['nom_camara'] = casa['nom_casa'] +REQUEST = context.REQUEST +for local in context.zsql.localidade_obter_zsql(cod_localidade=casa['cod_localidade']): + rodape['nom_localidade'] = " " + local.nom_localidade + rodape['sgl_uf'] = local.sgl_uf orig_externa_dic = {} for materia in context.zsql.materia_obter_zsql(cod_materia=REQUEST['cod_materia']): -#Abaixo é gerado os dados para o bloco Informações Básicas (ln 23) - inf_basicas_dic['texto_projeto']= materia.txt_ementa - inf_basicas_dic['apresentada']= materia.dat_apresentacao - inf_basicas_dic['formato']= materia.tip_apresentacao - inf_basicas_dic['publicada']= materia.dat_publicacao - inf_basicas_dic['objeto']= materia.des_objeto - inf_basicas_dic['tramitacao']= materia.ind_tramitacao - inf_basicas_dic['cod_projeto']= materia.sgl_tipo_materia+" "+ str(materia.num_ident_basica)+" de "+ str(materia.ano_ident_basica) - inf_basicas_dic['nom_projeto']= materia.des_tipo_materia - - for tramitacao in context.zsql.regime_tramitacao_obter_zsql(cod_regime_tramitacao=materia.cod_regime_tramitacao): -# """#tratando possíveis erros""" -# if tramitacao.des_regime_tramitacao==None: tramitacao.des_regime_tramitacao="" -# if materia.num_dias_prazo==None: materia.num_dias_prazo="" -# if materia.dat_fim_prazo==None: materia.dat_fim_prazo="" -# if materia.ind_complementar==None: materia.ind_complementar="" -# if materia.ind_polemica==None: materia.ind_polemica="" -# if materia.nom_apelido==None: materia.nom_apelido="" -# if materia.txt_indexacao==None: materia.txt_indexacao="" -# if materia.txt_observacao==None: materia.txt_observacao="" -# """#atribuindo valores""" - inf_basicas_dic['reg_tramitacao']= tramitacao.des_regime_tramitacao - inf_basicas_dic['prazo']= materia.num_dias_prazo - inf_basicas_dic['fim_prazo']= materia.dat_fim_prazo - inf_basicas_dic['mat_complementar']= materia.ind_complementar - inf_basicas_dic['polemica']= materia.ind_polemica - inf_basicas_dic['apelido']= materia.nom_apelido - inf_basicas_dic['indexacao']= materia.txt_indexacao - inf_basicas_dic['observacao']= materia.txt_observacao + # Abaixo é gerado os dados para o bloco Informações Básicas (ln 23) + inf_basicas_dic['texto_projeto'] = materia.txt_ementa + inf_basicas_dic['apresentada'] = materia.dat_apresentacao + inf_basicas_dic['formato'] = materia.tip_apresentacao + inf_basicas_dic['publicada'] = materia.dat_publicacao + inf_basicas_dic['objeto'] = materia.des_objeto + inf_basicas_dic['tramitacao'] = materia.ind_tramitacao + inf_basicas_dic['cod_projeto'] = materia.sgl_tipo_materia + " " + \ + str(materia.num_ident_basica) + " de " + str(materia.ano_ident_basica) + inf_basicas_dic['nom_projeto'] = materia.des_tipo_materia + + for tramitacao in context.zsql.regime_tramitacao_obter_zsql(cod_regime_tramitacao=materia.cod_regime_tramitacao): + # """#tratando possíveis erros""" + # if tramitacao.des_regime_tramitacao==None: tramitacao.des_regime_tramitacao="" + # if materia.num_dias_prazo==None: materia.num_dias_prazo="" + # if materia.dat_fim_prazo==None: materia.dat_fim_prazo="" + # if materia.ind_complementar==None: materia.ind_complementar="" + # if materia.ind_polemica==None: materia.ind_polemica="" + # if materia.nom_apelido==None: materia.nom_apelido="" + # if materia.txt_indexacao==None: materia.txt_indexacao="" + # if materia.txt_observacao==None: materia.txt_observacao="" + # """#atribuindo valores""" + inf_basicas_dic['reg_tramitacao'] = tramitacao.des_regime_tramitacao + inf_basicas_dic['prazo'] = materia.num_dias_prazo + inf_basicas_dic['fim_prazo'] = materia.dat_fim_prazo + inf_basicas_dic['mat_complementar'] = materia.ind_complementar + inf_basicas_dic['polemica'] = materia.ind_polemica + inf_basicas_dic['apelido'] = materia.nom_apelido + inf_basicas_dic['indexacao'] = materia.txt_indexacao + inf_basicas_dic['observacao'] = materia.txt_observacao + - # #o bloco abaixo gera o dicionario da origem externa (ln 47) - for origem in context.zsql.origem_obter_zsql(cod_origem = materia.cod_local_origem_externa): -# #tratando possíveis erros -# if origem.sgl_origem==None: origem.sgl_origem="" -# if origem.nom_origem==None: origem.nom_origem="" -# if materia.tip_origem_externa==None: materia.tip_origem_externa="" -# if materia.dat_origem_externa==None: materia.dat_origem_externa="" -# if materia.num_origem_externa==None: materia.num_origem_externa="" -# if materia.ano_origem_externa==None: materia.ano_origem_externa="" - - orig_externa_dic['local']= origem.sgl_origem+ "-"+ origem.nom_origem - orig_externa_dic['tipo']= materia.tip_origem_externa - orig_externa_dic['data']= materia.dat_origem_externa - orig_externa_dic['numero_ano']= str(materia.num_origem_externa)+ "/"+ str(materia.ano_origem_externa) - + for origem in context.zsql.origem_obter_zsql(cod_origem=materia.cod_local_origem_externa): + # #tratando possíveis erros + # if origem.sgl_origem==None: origem.sgl_origem="" + # if origem.nom_origem==None: origem.nom_origem="" + # if materia.tip_origem_externa==None: materia.tip_origem_externa="" + # if materia.dat_origem_externa==None: materia.dat_origem_externa="" + # if materia.num_origem_externa==None: materia.num_origem_externa="" + # if materia.ano_origem_externa==None: materia.ano_origem_externa="" + + orig_externa_dic['local'] = origem.sgl_origem + "-" + origem.nom_origem + orig_externa_dic['tipo'] = materia.tip_origem_externa + orig_externa_dic['data'] = materia.dat_origem_externa + orig_externa_dic['numero_ano'] = str( + materia.num_origem_externa) + "/" + str(materia.ano_origem_externa) + # #o bloco abaixo gera o dicionario das materias anexadas (ln 55) - lst_mat_anexadas = [] - dic_mat = {} - for anexada in context.zsql.anexada_obter_zsql(cod_materia_principal=materia.cod_materia): - aux1 = context.zsql.materia_obter_zsql(cod_materia = anexada.cod_materia_anexada) - aux2 = context.zsql.tipo_materia_legislativa_obter_zsql(tip_materia = aux1[0].tip_id_basica) + lst_mat_anexadas = [] + dic_mat = {} + for anexada in context.zsql.anexada_obter_zsql(cod_materia_principal=materia.cod_materia): + aux1 = context.zsql.materia_obter_zsql( + cod_materia=anexada.cod_materia_anexada) + aux2 = context.zsql.tipo_materia_legislativa_obter_zsql( + tip_materia=aux1[0].tip_id_basica) # """#tratando possíveis erros""" # if aux2.sgl_tipo_materia==None: aux2.sgl_tipo_materia="" # if aux2.num_ident_basica==None: aux2.num_ident_basica="" @@ -91,33 +96,34 @@ for materia in context.zsql.materia_obter_zsql(cod_materia=REQUEST['cod_materia' # if anexadas.dat_anexacao==None: anexadas.dat_anexacao="" # if anexadas.dat_desanexacao==None: anexadas.dat_desanexacao="" # """#""" - dic_mat['nom_mat']= aux2[0].sgl_tipo_materia+ "/"+ str(aux1[0].num_ident_basica)+ "/"+ str(aux1[0].ano_ident_basica) - dic_mat['data']= anexada.dat_anexacao - dic_mat['data_fim']= anexada.dat_desanexacao - lst_mat_anexadas.append(dic_mat) - + dic_mat['nom_mat'] = aux2[0].sgl_tipo_materia + "/" + \ + str(aux1[0].num_ident_basica) + "/" + str(aux1[0].ano_ident_basica) + dic_mat['data'] = anexada.dat_anexacao + dic_mat['data_fim'] = anexada.dat_desanexacao + lst_mat_anexadas.append(dic_mat) + # #o bloco abaixo gera o dicionario dos autores(ln 66) - lst_autoria = [] + lst_autoria = [] # dic_autor = {} - for autoria in context.zsql.autoria_obter_zsql(cod_materia = materia.cod_materia): - dic_autor = {} - if autoria.ind_primeiro_autor: - dic_autor['tipo']= "primeiro autor" - else: - dic_autor['tipo']= " " - - for autor in context.zsql.autor_obter_zsql(cod_autor = autoria.cod_autor): - dic_autor['cargo']= " " - if autor.des_tipo_autor=='Parlamentar': - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): - dic_autor['nom_autor']=parlamentar.nom_completo - elif autor.des_tipo_autor=='Comissao': - for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): - dic_autor['nom_autor']=comissao.nom_comissao - else: - dic_autor['nom_autor']=autor.nom_autor - dic_autor['cargo']= autor.des_cargo - lst_autoria.append(dic_autor) + for autoria in context.zsql.autoria_obter_zsql(cod_materia=materia.cod_materia): + dic_autor = {} + if autoria.ind_primeiro_autor: + dic_autor['tipo'] = "primeiro autor" + else: + dic_autor['tipo'] = " " + + for autor in context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor): + dic_autor['cargo'] = " " + if autor.des_tipo_autor == 'Parlamentar': + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): + dic_autor['nom_autor'] = parlamentar.nom_completo + elif autor.des_tipo_autor == 'Comissao': + for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): + dic_autor['nom_autor'] = comissao.nom_comissao + else: + dic_autor['nom_autor'] = autor.nom_autor + dic_autor['cargo'] = autor.des_cargo + lst_autoria.append(dic_autor) # """#tratando possíveis erros""" # if autor.nom_autor==None: autor.nom_autor="" @@ -127,141 +133,152 @@ for materia in context.zsql.materia_obter_zsql(cod_materia=REQUEST['cod_materia' # dic_autor['cargo']= autor.des_cargo # if autoria.ind_primeiro_autor: # dic_autor['tipo']= "primeiro autor" -# else: +# else: # dic_autor['tipo']= " " - + # #o bloco abaixo gera o dicionario de despachos iniciais (ln 79) - lst_des_iniciais=[] - for despacho in context.zsql.despacho_inicial_obter_zsql(cod_materia = materia.cod_materia): - for comissao in context.zsql.comissao_obter_zsql(cod_comissao = despacho.cod_comissao_sel): - dic_dados={} - if comissao.nom_comissao==None: - comissao.nom_comissao='' - if comissao.sgl_comissao==None: - comissao.sgl_comissao='' - dic_dados['nom_comissao']=comissao.nom_comissao+ " - "+ comissao.sgl_comissao - lst_des_iniciais.append(dic_dados) - + lst_des_iniciais = [] + for despacho in context.zsql.despacho_inicial_obter_zsql(cod_materia=materia.cod_materia): + for comissao in context.zsql.comissao_obter_zsql(cod_comissao=despacho.cod_comissao_sel): + dic_dados = {} + if comissao.nom_comissao == None: + comissao.nom_comissao = '' + if comissao.sgl_comissao == None: + comissao.sgl_comissao = '' + dic_dados['nom_comissao'] = comissao.nom_comissao + \ + " - " + comissao.sgl_comissao + lst_des_iniciais.append(dic_dados) + # #o bloco abaixo gera o dicionário de Tramitacoes(ln 87) - dic_tramitacoes = {} - for tramitacao in context.zsql.tramitacao_obter_zsql(cod_materia=REQUEST['cod_materia'], ind_ult_tramitacao=1): - dic_tramitacoes['data']= tramitacao.dat_tramitacao - dic_tramitacoes['data_enc']= tramitacao.dat_encaminha - dic_tramitacoes['turno']= tramitacao.sgl_turno - dic_tramitacoes['status']= tramitacao.des_status - dic_tramitacoes['urgente']= tramitacao.ind_urgencia - dic_tramitacoes['data_fim']= tramitacao.dat_fim_prazo - dic_tramitacoes['texto_acao']= tramitacao.txt_tramitacao + dic_tramitacoes = {} + for tramitacao in context.zsql.tramitacao_obter_zsql(cod_materia=REQUEST['cod_materia'], ind_ult_tramitacao=1): + dic_tramitacoes['data'] = tramitacao.dat_tramitacao + dic_tramitacoes['data_enc'] = tramitacao.dat_encaminha + dic_tramitacoes['turno'] = tramitacao.sgl_turno + dic_tramitacoes['status'] = tramitacao.des_status + dic_tramitacoes['urgente'] = tramitacao.ind_urgencia + dic_tramitacoes['data_fim'] = tramitacao.dat_fim_prazo + dic_tramitacoes['texto_acao'] = tramitacao.txt_tramitacao + + for unidade in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao=tramitacao.cod_unid_tram_local): + #-----------------se unidade for comissao-------------------------- + if unidade.cod_orgao == None: + for comissao in context.zsql.comissao_obter_zsql(cod_comissao=unidade.cod_comissao): + if tramitacao.cod_unid_tram_dest != None: + for unidade_dest in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao=tramitacao.cod_unid_tram_dest): + # se unidade destino for comissao + if unidade_dest.cod_orgao == None: + for comissao_dest in context.zsql.comissao_obter_zsql(cod_comissao=unidade_dest.cod_comissao): + dic_tramitacoes[ + 'unidade'] = comissao.nom_comissao + dic_tramitacoes[ + 'destino'] = comissao_dest.nom_comissao + # se unidade destino for orgao + if unidade_dest.cod_comissao == None: + for orgao_dest in context.zsql.orgao_obter_zsql(cod_orgao=unidade_dest.cod_orgao): + dic_tramitacoes[ + 'unidade'] = comissao.nom_comissao + dic_tramitacoes[ + 'destino'] = orgao_dest.nom_orgao + else: + dic_tramitacoes['unidade'] = comissao.nom_comissao + dic_tramitacoes['destino'] = "None" + #---------------se unidade for orgao------------------------------- + if unidade.cod_comissao == None: + for orgao in context.zsql.orgao_obter_zsql(cod_orgao=unidade.cod_orgao): + if tramitacao.cod_unid_tram_dest != None: + for unidade_dest in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao=tramitacao.cod_unid_tram_dest): + # se unidade destino for comissao + if unidade_dest.cod_orgao == None: + for comissao_dest in context.zsql.comissao_obter_zsql(cod_comissao=unidade_dest.cod_comissao): + dic_tramitacoes[ + 'unidade'] = orgao.nom_orgao + dic_tramitacoes[ + 'destino'] = comissao_dest.nom_comissao + # se unidade destino for orgao + if unidade_dest.cod_comissao == None: + for orgao_dest in context.zsql.orgao_obter_zsql(cod_orgao=unidade_dest.cod_orgao): + dic_tramitacoes[ + 'unidade'] = orgao.nom_orgao + dic_tramitacoes[ + 'destino'] = orgao_dest.nom_orgao + else: + dic_tramitacoes['unidade'] = orgao.nom_orgao + dic_tramitacoes['destino'] = "None" - - for unidade in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao = tramitacao.cod_unid_tram_local): - #-----------------se unidade for comissao--------------------------------- - if unidade.cod_orgao==None: - for comissao in context.zsql.comissao_obter_zsql(cod_comissao = unidade.cod_comissao): - if tramitacao.cod_unid_tram_dest!=None: - for unidade_dest in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao = tramitacao.cod_unid_tram_dest): - #se unidade destino for comissao - if unidade_dest.cod_orgao==None: - for comissao_dest in context.zsql.comissao_obter_zsql(cod_comissao = unidade_dest.cod_comissao): - dic_tramitacoes['unidade']= comissao.nom_comissao - dic_tramitacoes['destino']= comissao_dest.nom_comissao - #se unidade destino for orgao - if unidade_dest.cod_comissao==None: - for orgao_dest in context.zsql.orgao_obter_zsql(cod_orgao = unidade_dest.cod_orgao): - dic_tramitacoes['unidade']= comissao.nom_comissao - dic_tramitacoes['destino']= orgao_dest.nom_orgao - else: - dic_tramitacoes['unidade']= comissao.nom_comissao - dic_tramitacoes['destino']= "None" - #---------------se unidade for orgao----------------------------------------- - if unidade.cod_comissao==None: - for orgao in context.zsql.orgao_obter_zsql(cod_orgao = unidade.cod_orgao): - if tramitacao.cod_unid_tram_dest!=None: - for unidade_dest in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao = tramitacao.cod_unid_tram_dest): - #se unidade destino for comissao - if unidade_dest.cod_orgao==None: - for comissao_dest in context.zsql.comissao_obter_zsql(cod_comissao = unidade_dest.cod_comissao): - dic_tramitacoes['unidade']= orgao.nom_orgao - dic_tramitacoes['destino']= comissao_dest.nom_comissao - #se unidade destino for orgao - if unidade_dest.cod_comissao==None: - for orgao_dest in context.zsql.orgao_obter_zsql(cod_orgao = unidade_dest.cod_orgao): - dic_tramitacoes['unidade']= orgao.nom_orgao - dic_tramitacoes['destino']= orgao_dest.nom_orgao - else: - dic_tramitacoes['unidade']= orgao.nom_orgao - dic_tramitacoes['destino']= "None" - # #o bloco abaixo gera o dicionario de relatorias(ln 106) - - lst_relatorias = [] - dic_comissao = {} - for relatoria in context.zsql.relatoria_obter_zsql(cod_materia = materia.cod_materia): - for comissao in context.zsql.comissao_obter_zsql(cod_comissao = relatoria.cod_comissao): - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar = relatoria.cod_parlamentar): - dic_comissao['nom_comissao']= comissao.nom_comissao - dic_comissao['data_desig']= relatoria.dat_desig_relator - dic_comissao['parlamentar']= parlamentar.nom_completo - dic_comissao['data_dest']= relatoria.dat_destit_relator - if relatoria.tip_fim_relatoria==None or relatoria.tip_fim_relatoria=='0': - num = 0 - dic_comissao['motivo']="" - else: - num=relatoria.tip_fim_relatoria - for tipo_fim in context.zsql.tipo_fim_relatoria_obter_zsql(tip_fim_relatoria = num): - dic_comissao['motivo']= tipo_fim.des_fim_relatoria - lst_relatorias.append(dic_comissao) - + + lst_relatorias = [] + dic_comissao = {} + for relatoria in context.zsql.relatoria_obter_zsql(cod_materia=materia.cod_materia): + for comissao in context.zsql.comissao_obter_zsql(cod_comissao=relatoria.cod_comissao): + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=relatoria.cod_parlamentar): + dic_comissao['nom_comissao'] = comissao.nom_comissao + dic_comissao['data_desig'] = relatoria.dat_desig_relator + dic_comissao['parlamentar'] = parlamentar.nom_completo + dic_comissao['data_dest'] = relatoria.dat_destit_relator + if relatoria.tip_fim_relatoria == None or relatoria.tip_fim_relatoria == '0': + num = 0 + dic_comissao['motivo'] = "" + else: + num = relatoria.tip_fim_relatoria + for tipo_fim in context.zsql.tipo_fim_relatoria_obter_zsql(tip_fim_relatoria=num): + dic_comissao['motivo'] = tipo_fim.des_fim_relatoria + lst_relatorias.append(dic_comissao) + # #o bloco abaixo gera o dicionario de Numeracoes(ln 121) - - lst_numeracoes = [] - dic_dados={} - for numeracao in context.zsql.numeracao_obter_zsql(cod_materia = materia.cod_materia): - for tipo_materia in context.zsql.tipo_materia_legislativa_obter_zsql(tip_materia = numeracao.tip_materia): - dic_dados['nome']= tipo_materia.sgl_tipo_materia+ "-"+ tipo_materia.des_tipo_materia+ "nº"+ numeracao.num_materia - dic_dados['ano']= numeracao.ano_materia - lst_numeracoes.append(dic_dados) - - + + lst_numeracoes = [] + dic_dados = {} + for numeracao in context.zsql.numeracao_obter_zsql(cod_materia=materia.cod_materia): + for tipo_materia in context.zsql.tipo_materia_legislativa_obter_zsql(tip_materia=numeracao.tip_materia): + dic_dados['nome'] = tipo_materia.sgl_tipo_materia + "-" + \ + tipo_materia.des_tipo_materia + "nº" + numeracao.num_materia + dic_dados['ano'] = numeracao.ano_materia + lst_numeracoes.append(dic_dados) + + # #o bloco abaixo gera o dicionário de legislacoes citadas(132) - - lst_legis_citadas = [] - dic_dados = {} - for legislacao in context.zsql.legislacao_citada_obter_zsql(cod_materia = materia.cod_materia): - norma = context.zsql.norma_juridica_obter_zsql(cod_norma = legislacao.cod_norma_sel) - dic_dados['nome_lei']= str(norma[0].tip_norma_sel) + " nº"+ str(norma[0].num_norma) + " de"+ str(norma[0].ano_norma) - dic_dados['disposicao']= legislacao.des_disposicoes - dic_dados['parte']= legislacao.des_parte - dic_dados['livro']= legislacao.des_livro - dic_dados['titulo']= legislacao.des_titulo - dic_dados['capitulo']= legislacao.des_capitulo - dic_dados['secao']= legislacao.des_secao - dic_dados['subsecao']= legislacao.des_subsecao - dic_dados['artigo']= legislacao.des_artigo - dic_dados['paragrafo']= legislacao.des_paragrafo - dic_dados['inciso']= legislacao.des_inciso - dic_dados['alinea']= legislacao.des_alinea - dic_dados['item']= legislacao.des_item - lst_legis_citadas.append(dic_dados) + + lst_legis_citadas = [] + dic_dados = {} + for legislacao in context.zsql.legislacao_citada_obter_zsql(cod_materia=materia.cod_materia): + norma = context.zsql.norma_juridica_obter_zsql( + cod_norma=legislacao.cod_norma_sel) + dic_dados['nome_lei'] = str(norma[0].tip_norma_sel) + " nº" + \ + str(norma[0].num_norma) + " de" + str(norma[0].ano_norma) + dic_dados['disposicao'] = legislacao.des_disposicoes + dic_dados['parte'] = legislacao.des_parte + dic_dados['livro'] = legislacao.des_livro + dic_dados['titulo'] = legislacao.des_titulo + dic_dados['capitulo'] = legislacao.des_capitulo + dic_dados['secao'] = legislacao.des_secao + dic_dados['subsecao'] = legislacao.des_subsecao + dic_dados['artigo'] = legislacao.des_artigo + dic_dados['paragrafo'] = legislacao.des_paragrafo + dic_dados['inciso'] = legislacao.des_inciso + dic_dados['alinea'] = legislacao.des_alinea + dic_dados['item'] = legislacao.des_item + lst_legis_citadas.append(dic_dados) # #o bloco abaixo gera o dicionario de Documentos Acessórios(153) - - lst_acessorios = [] - for documento in context.zsql.documento_acessorio_obter_zsql(cod_materia = materia.cod_materia): - dic_dados = {} - dic_dados['tipo']= documento.tip_documento - dic_dados['nome']= documento.nom_documento - dic_dados['data']= documento.dat_documento - dic_dados['autor']= documento.nom_autor_documento - dic_dados['ementa']= documento.txt_ementa - dic_dados['indexacao']= documento.txt_indexacao - lst_acessorios.append(dic_dados) -caminho=context.pdf_detalhe_materia_gerar(imagem, rodape,inf_basicas_dic,orig_externa_dic,lst_mat_anexadas,lst_autoria, - lst_des_iniciais,dic_tramitacoes,lst_relatorias,lst_numeracoes, - lst_legis_citadas,lst_acessorios,sessao=session.id) -if caminho=='aviso': - return response.redirect('mensagem_emitir_proc') + lst_acessorios = [] + for documento in context.zsql.documento_acessorio_obter_zsql(cod_materia=materia.cod_materia): + dic_dados = {} + dic_dados['tipo'] = documento.tip_documento + dic_dados['nome'] = documento.nom_documento + dic_dados['data'] = documento.dat_documento + dic_dados['autor'] = documento.nom_autor_documento + dic_dados['ementa'] = documento.txt_ementa + dic_dados['indexacao'] = documento.txt_indexacao + lst_acessorios.append(dic_dados) + +caminho = context.pdf_detalhe_materia_gerar(imagem, rodape, inf_basicas_dic, orig_externa_dic, lst_mat_anexadas, lst_autoria, + lst_des_iniciais, dic_tramitacoes, lst_relatorias, lst_numeracoes, + lst_legis_citadas, lst_acessorios, sessao=session.id) +if caminho == 'aviso': + return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_documento_administrativo_preparar_pysc.py b/sapl/relatorios/templates/pdf_documento_administrativo_preparar_pysc.py index d94a9ef21..cbaf7d0e3 100755 --- a/sapl/relatorios/templates/pdf_documento_administrativo_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_documento_administrativo_preparar_pysc.py @@ -1,124 +1,135 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION -data=DateTime().strftime('%d/%m/%Y') +data = DateTime().strftime('%d/%m/%Y') -#Abaixo é gerada a string para o rodapé da página -casa={} -aux=context.sapl_documentos.props_sapl.propertyItems() +# Abaixo é gerada a string para o rodapé da página +casa = {} +aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] -localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) -if len(casa["num_cep"])==8: - cep=casa["num_cep"][:4]+"-"+casa["num_cep"][5:] + casa[item[0]] = item[1] +localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) +if len(casa["num_cep"]) == 8: + cep = casa["num_cep"][:4] + "-" + casa["num_cep"][5:] else: - cep="" - -linha1=casa["end_casa"] -if cep!="": - if casa["end_casa"]!="" and casa["end_casa"]!=None: - linha1 = linha1 + " - " - linha1 = linha1 + "CEP "+cep -if localidade[0].nom_localidade!="" and localidade[0].nom_localidade!=None: - linha1 = linha1 + " - "+localidade[0].nom_localidade+" "+localidade[0].sgl_uf -if casa["num_tel"]!="" and casa["num_tel"]!=None: - linha1 = linha1 + " Tel.: "+ casa["num_tel"] - -linha2=casa["end_web_casa"] -if casa["end_email_casa"]!="" and casa["end_email_casa"]!=None: - if casa["end_web_casa"]!="" and casa["end_web_casa"]!=None: - linha2 = linha2 + " - " - linha2 = linha2 + "E-mail: "+casa["end_email_casa"] - -data_emissao=DateTime().strftime("%d/%m/%Y") -rodape=[linha1,linha2,data_emissao] - -#Por fim, gera-se as entradas para o cabeçalho -estados=context.zsql.localidade_obter_zsql(tip_localidade="u") + cep = "" + +linha1 = casa["end_casa"] +if cep != "": + if casa["end_casa"] != "" and casa["end_casa"] != None: + linha1 = linha1 + " - " + linha1 = linha1 + "CEP " + cep +if localidade[0].nom_localidade != "" and localidade[0].nom_localidade != None: + linha1 = linha1 + " - " + \ + localidade[0].nom_localidade + " " + localidade[0].sgl_uf +if casa["num_tel"] != "" and casa["num_tel"] != None: + linha1 = linha1 + " Tel.: " + casa["num_tel"] + +linha2 = casa["end_web_casa"] +if casa["end_email_casa"] != "" and casa["end_email_casa"] != None: + if casa["end_web_casa"] != "" and casa["end_web_casa"] != None: + linha2 = linha2 + " - " + linha2 = linha2 + "E-mail: " + casa["end_email_casa"] + +data_emissao = DateTime().strftime("%d/%m/%Y") +rodape = [linha1, linha2, data_emissao] + +# Por fim, gera-se as entradas para o cabeçalho +estados = context.zsql.localidade_obter_zsql(tip_localidade="u") for uf in estados: - if localidade[0].sgl_uf==uf.sgl_uf: - nom_estado=uf.nom_localidade - break -cabecalho={} -cabecalho["nom_casa"]=casa["nom_casa"] -cabecalho["nom_estado"]="Estado de "+nom_estado + if localidade[0].sgl_uf == uf.sgl_uf: + nom_estado = uf.nom_localidade + break +cabecalho = {} +cabecalho["nom_casa"] = casa["nom_casa"] +cabecalho["nom_estado"] = "Estado de " + nom_estado # tenta buscar o logotipo da casa LOGO_CASA -if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() +if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() else: - imagem = context.imagens.absolute_url() + "/brasao_transp.gif" - -#Por fim, utiliza o PythonScript para pesquisar os documentos e gerar os dados - -documentos=[] -REQUEST=context.REQUEST -for documento in context.zsql.documento_administrativo_pesquisar_zsql(tip_documento=REQUEST['lst_tip_documento'], - num_documento=REQUEST['txt_num_documento'], ano_documento=REQUEST['txt_ano_documento'], - num_protocolo=REQUEST['txt_num_protocolo'], ind_tramitacao=REQUEST['rad_tramitando'], - des_assunto=REQUEST['txa_txt_assunto'], cod_status=REQUEST['lst_status'], - txt_interessado=REQUEST['txa_txt_interessado'], dat_apres1=REQUEST['dt_apres1'], - dat_apres2=REQUEST['dt_apres2'], rd_ordem=REQUEST['rd_ordenacao']): - dic={} - - dic['titulo']=documento.sgl_tipo_documento+" "+str(documento.num_documento)+" "+str(documento.ano_documento)+" - "+documento.des_tipo_documento - dic['txt_assunto']=documento.txt_assunto - dic['txt_interessado']=documento.txt_interessado - - des_status = '' - txt_tramitacao='' - - dic['localizacao_atual']=" " - for tramitacao in context.zsql.tramitacao_administrativo_obter_zsql(cod_documento=documento.cod_documento,ind_ult_tramitacao=1): - if tramitacao.cod_unid_tram_dest: - cod_unid_tram = tramitacao.cod_unid_tram_dest + imagem = context.imagens.absolute_url() + "/brasao_transp.gif" + +# Por fim, utiliza o PythonScript para pesquisar os documentos e gerar os dados + +documentos = [] +REQUEST = context.REQUEST +for documento in context.zsql.documento_administrativo_pesquisar_zsql(tip_documento=REQUEST['lst_tip_documento'], + num_documento=REQUEST['txt_num_documento'], ano_documento=REQUEST[ + 'txt_ano_documento'], + num_protocolo=REQUEST[ + 'txt_num_protocolo'], ind_tramitacao=REQUEST['rad_tramitando'], + des_assunto=REQUEST[ + 'txa_txt_assunto'], cod_status=REQUEST['lst_status'], + txt_interessado=REQUEST[ + 'txa_txt_interessado'], dat_apres1=REQUEST['dt_apres1'], + dat_apres2=REQUEST['dt_apres2'], rd_ordem=REQUEST['rd_ordenacao']): + dic = {} + + dic['titulo'] = documento.sgl_tipo_documento + " " + \ + str(documento.num_documento) + " " + \ + str(documento.ano_documento) + " - " + documento.des_tipo_documento + dic['txt_assunto'] = documento.txt_assunto + dic['txt_interessado'] = documento.txt_interessado + + des_status = '' + txt_tramitacao = '' + + dic['localizacao_atual'] = " " + for tramitacao in context.zsql.tramitacao_administrativo_obter_zsql(cod_documento=documento.cod_documento, ind_ult_tramitacao=1): + if tramitacao.cod_unid_tram_dest: + cod_unid_tram = tramitacao.cod_unid_tram_dest + else: + cod_unid_tram = tramitacao.cod_unid_tram_local + + for unidade_tramitacao in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao=cod_unid_tram): + if unidade_tramitacao.cod_orgao: + dic['localizacao_atual'] = unidade_tramitacao.nom_orgao else: - cod_unid_tram = tramitacao.cod_unid_tram_local - - for unidade_tramitacao in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao = cod_unid_tram): - if unidade_tramitacao.cod_orgao: - dic['localizacao_atual']=unidade_tramitacao.nom_orgao - else: - dic['localizacao_atual']=unidade_tramitacao.nom_comissao - - des_status=tramitacao.des_status - txt_tramitacao=tramitacao.txt_tramitacao + dic['localizacao_atual'] = unidade_tramitacao.nom_comissao - dic['des_situacao']=des_status - dic['ultima_acao']=txt_tramitacao + des_status = tramitacao.des_status + txt_tramitacao = tramitacao.txt_tramitacao - documentos.append(dic) + dic['des_situacao'] = des_status + dic['ultima_acao'] = txt_tramitacao -filtro={} # Dicionário que conterá os dados do filtro + documentos.append(dic) + +filtro = {} # Dicionário que conterá os dados do filtro # Atribuições diretas do REQUEST -filtro['numero']=REQUEST.txt_num_documento -filtro['ano']=REQUEST.txt_ano_documento -filtro['interessado']=REQUEST.txa_txt_interessado -filtro['assunto']=REQUEST.txa_txt_assunto +filtro['numero'] = REQUEST.txt_num_documento +filtro['ano'] = REQUEST.txt_ano_documento +filtro['interessado'] = REQUEST.txa_txt_interessado +filtro['assunto'] = REQUEST.txa_txt_assunto -filtro['tipo_documento']='' -if REQUEST.lst_tip_documento!='': +filtro['tipo_documento'] = '' +if REQUEST.lst_tip_documento != '': for tipo_documento in context.zsql.tipo_documento_administrativo_obter_zsql(ind_excluido=0, tip_documento=REQUEST.lst_tip_documento): - filtro['tipo_documento']= tipo_documento.sgl_tipo_documento + ' - ' + tipo_documento.des_tipo_documento - -filtro['tramitando']='' -if REQUEST.rad_tramitando=='1': - filtro['tramitacao']='Sim' -elif REQUEST['rad_tramitando']=='0': - filtro['tramitacao']='Não' - -filtro['situacao_atual']='' -if REQUEST.lst_status!='': - for status in context.zsql.status_tramitacao_administrativo_obter_zsql(ind_exluido=0,cod_status=REQUEST.lst_status): - filtro['situacao_atual']=status.sgl_status + ' - ' + status.des_status - -sessao=session.id -caminho = context.pdf_documento_administrativo_gerar(sessao,imagem,data,documentos,cabecalho,rodape,filtro) -if caminho=='aviso': - return response.redirect('mensagem_emitir_proc') + filtro['tipo_documento'] = tipo_documento.sgl_tipo_documento + \ + ' - ' + tipo_documento.des_tipo_documento + +filtro['tramitando'] = '' +if REQUEST.rad_tramitando == '1': + filtro['tramitacao'] = 'Sim' +elif REQUEST['rad_tramitando'] == '0': + filtro['tramitacao'] = 'Não' + +filtro['situacao_atual'] = '' +if REQUEST.lst_status != '': + for status in context.zsql.status_tramitacao_administrativo_obter_zsql(ind_exluido=0, cod_status=REQUEST.lst_status): + filtro['situacao_atual'] = status.sgl_status + \ + ' - ' + status.des_status + +sessao = session.id +caminho = context.pdf_documento_administrativo_gerar( + sessao, imagem, data, documentos, cabecalho, rodape, filtro) +if caminho == 'aviso': + return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_espelho_gerar.py b/sapl/relatorios/templates/pdf_espelho_gerar.py index 1242f8040..ba3cd373c 100644 --- a/sapl/relatorios/templates/pdf_espelho_gerar.py +++ b/sapl/relatorios/templates/pdf_espelho_gerar.py @@ -12,147 +12,147 @@ from trml2pdf import parseString def cabecalho(dic_cabecalho, imagem): - """Gera o codigo rml do cabecalho""" - tmp_data = '' - tmp_data += '\t\t\t\t\n' - tmp_data += '\t\t\t\t2cm 25cm 19cm 25cm\n' - tmp_data += '\t\t\t\t\n' - tmp_data += '\t\t\t\t' + \ - dic_cabecalho['nom_casa'] + '\n' - tmp_data += '\t\t\t\t\n' - tmp_data += '\t\t\t\t' + \ - dic_cabecalho['nom_estado'] + '\n' - tmp_data += '\t\t\t\t\n' - tmp_data += '\t\t\t\tSECRETARIA\n' - return tmp_data + """Gera o codigo rml do cabecalho""" + tmp_data = '' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t2cm 25cm 19cm 25cm\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + dic_cabecalho['nom_casa'] + '\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + dic_cabecalho['nom_estado'] + '\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\tSECRETARIA\n' + return tmp_data def rodape(lst_rodape): - """Gera o codigo rml do rodape""" - tmp_data = '' - tmp_data += '\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' - tmp_data += '\t\t\t\t\n' - tmp_data += '\t\t\t\t' + \ - lst_rodape[2] + '\n' - tmp_data += '\t\t\t\t' + \ - lst_rodape[0] + '\n' - tmp_data += '\t\t\t\t' + \ - lst_rodape[1] + '\n' - return tmp_data - + """Gera o codigo rml do rodape""" + tmp_data = '' + tmp_data += '\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[2] + '\n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[0] + '\n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[1] + '\n' + return tmp_data + def paraStyle(): - """Gera o codigo rml que define o estilo dos paragrafos""" - tmp_data = '' - tmp_data += '\t\n' - tmp_data += '\t\t\n' - tmp_data += '\t\t\t\n' - tmp_data += '\t\t\t\n' - tmp_data += '\t\t\n' - tmp_data += '\t\t\n' - tmp_data += '\t\t\t\n' - tmp_data += '\t\t\n' - tmp_data += '\t\t\n' - tmp_data += '\t\t\n' - tmp_data += '\t\n' - return tmp_data + """Gera o codigo rml que define o estilo dos paragrafos""" + tmp_data = '' + tmp_data += '\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\n' + return tmp_data def materias(lst_materias): - """Gera o codigo rml do conteudo da pesquisa de materias""" - - tmp_data = '' - - # inicio do bloco que contem os flowables - tmp_data += '\t\n' - - for dic in lst_materias: - # espaco inicial -# tmp_data+='\t\t\n' -# tmp_data+='\t\t\t \n' -# tmp_data+='\t\t\n' -# tmp_data+='\t\t\n' -# tmp_data+='\t\t\t \n' -# tmp_data+='\t\t\n' - - # condicao para a quebra de pagina - tmp_data += '\t\t\n' - - # materias + """Gera o codigo rml do conteudo da pesquisa de materias""" + + tmp_data = '' + + # inicio do bloco que contem os flowables + tmp_data += '\t\n' + + for dic in lst_materias: + # espaco inicial + # tmp_data+='\t\t\n' + # tmp_data+='\t\t\t \n' + # tmp_data+='\t\t\n' + # tmp_data+='\t\t\n' + # tmp_data+='\t\t\t \n' + # tmp_data+='\t\t\n' + + # condicao para a quebra de pagina + tmp_data += '\t\t\n' + + # materias # if dic['titulo']!=None: # tmp_data+='\t\t' + dic['titulo'] + '\n' # tmp_data+='\t\t\n' # tmp_data+='\t\t\t \n' # tmp_data+='\t\t\n' - if dic['materia'] != None: - tmp_data += '\t\t\n' - tmp_data += '\t\t\t \n' - tmp_data += '\t\t\n' - tmp_data += '\t\tINDICAÇÃO: ' + \ - dic['materia'] + '\n' - tmp_data += '\t\t\n' - tmp_data += '\t\t\t \n' - tmp_data += '\t\t\n' - - if dic['dat_apresentacao'] != None: - tmp_data += '\t\tDATA DE ENTRADA: ' + \ - dic['dat_apresentacao'] + '\n' - tmp_data += '\t\t\n' - tmp_data += '\t\t\t \n' - tmp_data += '\t\t\n' - - if dic['nom_autor'] != None: - tmp_data += '\t\tAUTOR: ' + \ - dic['nom_autor'] + '\n' - tmp_data += '\t\t\n' - tmp_data += '\t\t\t \n' - tmp_data += '\t\t\n' - - if dic['txt_ementa'] != None: - txt_ementa = dic['txt_ementa'].replace('&', '&') - tmp_data += '\t\tEMENTA: ' + \ - dic['txt_ementa'] + '\n' - tmp_data += '\t\t\n' - tmp_data += '\t\t\t \n' - tmp_data += '\t\t\n' - - tmp_data += '\t\n' - return tmp_data + if dic['materia'] != None: + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + tmp_data += '\t\tINDICAÇÃO: ' + \ + dic['materia'] + '\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + + if dic['dat_apresentacao'] != None: + tmp_data += '\t\tDATA DE ENTRADA: ' + \ + dic['dat_apresentacao'] + '\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + + if dic['nom_autor'] != None: + tmp_data += '\t\tAUTOR: ' + \ + dic['nom_autor'] + '\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + + if dic['txt_ementa'] != None: + txt_ementa = dic['txt_ementa'].replace('&', '&') + tmp_data += '\t\tEMENTA: ' + \ + dic['txt_ementa'] + '\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + + tmp_data += '\t\n' + return tmp_data def principal(imagem, lst_materias, dic_cabecalho, lst_rodape): - """Funcao pricipal que gera a estrutura global do arquivo rml""" + """Funcao pricipal que gera a estrutura global do arquivo rml""" # if sessao: # arquivoPdf=sessao+".pdf" # else: # arquivoPdf=str(int(time.time()*100))+".pdf" - arquivoPdf = str(int(time.time() * 100)) + ".pdf" - - tmp_data = '' - tmp_data += '\n' - tmp_data += '\n' - tmp_data += '\n' - tmp_data += '\t\n' - tmp_data += paraStyle() - tmp_data += materias(lst_materias) - tmp_data += '\n' - tmp_pdf = parseString(tmp_data) - - return tmp_pdf -# try: -# tmp_pdf=parseString(unicode(tmp_data, 'utf-8')) -# except: + arquivoPdf = str(int(time.time() * 100)) + ".pdf" + + tmp_data = '' + tmp_data += '\n' + tmp_data += '\n' + tmp_data += '\n' + tmp_data += '\t\n' + tmp_data += paraStyle() + tmp_data += materias(lst_materias) + tmp_data += '\n' + tmp_pdf = parseString(tmp_data) + + return tmp_pdf +# try: +# tmp_pdf=parseString(unicode(tmp_data, 'utf-8')) +# except: # tmp_pdf=parseString(unicode(tmp_data, 'utf-8')) # if hasattr(context.temp_folder,arquivoPdf): @@ -163,4 +163,5 @@ def principal(imagem, lst_materias, dic_cabecalho, lst_rodape): # return "/temp_folder/"+arquivoPdf -# return principal(sessao,imagem,data,lst_materias,dic_cabecalho,lst_rodape,dic_filtro) +# return +# principal(sessao,imagem,data,lst_materias,dic_cabecalho,lst_rodape,dic_filtro) diff --git a/sapl/relatorios/templates/pdf_espelho_preparar_pysc.py b/sapl/relatorios/templates/pdf_espelho_preparar_pysc.py index 425d8db0c..e51fcd43c 100644 --- a/sapl/relatorios/templates/pdf_espelho_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_espelho_preparar_pysc.py @@ -1,200 +1,210 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION -data=DateTime().strftime('%d/%m/%Y') +data = DateTime().strftime('%d/%m/%Y') -#Abaixo é gerada a string para o rodapé da página -casa={} -aux=context.sapl_documentos.props_sapl.propertyItems() +# Abaixo é gerada a string para o rodapé da página +casa = {} +aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] -localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) -if len(casa["num_cep"])==8: - cep=casa["num_cep"][:4]+"-"+casa["num_cep"][5:] + casa[item[0]] = item[1] +localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) +if len(casa["num_cep"]) == 8: + cep = casa["num_cep"][:4] + "-" + casa["num_cep"][5:] else: - cep="" - -linha1=casa["end_casa"] -if cep!="": - if casa["end_casa"]!="" and casa["end_casa"]!=None: - linha1 = linha1 + " - " - linha1 = linha1 + "CEP "+cep -if localidade[0].nom_localidade!="" and localidade[0].nom_localidade!=None: - linha1 = linha1 + " - "+localidade[0].nom_localidade+" "+localidade[0].sgl_uf -if casa["num_tel"]!="" and casa["num_tel"]!=None: - linha1 = linha1 + " Tel.: "+ casa["num_tel"] - -linha2=casa["end_web_casa"] -if casa["end_email_casa"]!="" and casa["end_email_casa"]!=None: - if casa["end_web_casa"]!="" and casa["end_web_casa"]!=None: - linha2 = linha2 + " - " - linha2 = linha2 + "E-mail: "+casa["end_email_casa"] - -data_emissao=DateTime().strftime("%d/%m/%Y") -rodape=[linha1,linha2,data_emissao] - -#Por fim, gera-se as entradas para o cabeçalho -estados=context.zsql.localidade_obter_zsql(tip_localidade="u") + cep = "" + +linha1 = casa["end_casa"] +if cep != "": + if casa["end_casa"] != "" and casa["end_casa"] != None: + linha1 = linha1 + " - " + linha1 = linha1 + "CEP " + cep +if localidade[0].nom_localidade != "" and localidade[0].nom_localidade != None: + linha1 = linha1 + " - " + \ + localidade[0].nom_localidade + " " + localidade[0].sgl_uf +if casa["num_tel"] != "" and casa["num_tel"] != None: + linha1 = linha1 + " Tel.: " + casa["num_tel"] + +linha2 = casa["end_web_casa"] +if casa["end_email_casa"] != "" and casa["end_email_casa"] != None: + if casa["end_web_casa"] != "" and casa["end_web_casa"] != None: + linha2 = linha2 + " - " + linha2 = linha2 + "E-mail: " + casa["end_email_casa"] + +data_emissao = DateTime().strftime("%d/%m/%Y") +rodape = [linha1, linha2, data_emissao] + +# Por fim, gera-se as entradas para o cabeçalho +estados = context.zsql.localidade_obter_zsql(tip_localidade="u") for uf in estados: - if localidade[0].sgl_uf==uf.sgl_uf: - nom_estado=uf.nom_localidade - break -cabecalho={} -cabecalho["nom_casa"]=casa["nom_casa"] -cabecalho["nom_estado"]="Estado de "+nom_estado + if localidade[0].sgl_uf == uf.sgl_uf: + nom_estado = uf.nom_localidade + break +cabecalho = {} +cabecalho["nom_casa"] = casa["nom_casa"] +cabecalho["nom_estado"] = "Estado de " + nom_estado # tenta buscar o logotipo da casa LOGO_CASA -if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() +if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() else: - imagem = context.sapl_site.sapl_skin.imagens.absolute_url() + "/brasao_transp.gif" - -#Verifica o tamanho da lista das materias selecionadas vindas do form -REQUEST=context.REQUEST -if REQUEST.txt_check=='1': - cod_mat = REQUEST['check_ind'] - materias=[] - REQUEST=context.REQUEST - for materia in context.zsql.materia_obter_zsql(cod_materia=cod_mat): - dic={} - dic['titulo']="INDICAÇÃO: "+str(materia.num_ident_basica)+" "+str(materia.ano_ident_basica) - dic['materia']=str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica) - dic['dat_apresentacao']=materia.dat_apresentacao - dic['txt_ementa']=materia.txt_ementa + imagem = context.sapl_site.sapl_skin.imagens.absolute_url() + "/brasao_transp.gif" + +# Verifica o tamanho da lista das materias selecionadas vindas do form +REQUEST = context.REQUEST +if REQUEST.txt_check == '1': + cod_mat = REQUEST['check_ind'] + materias = [] + REQUEST = context.REQUEST + for materia in context.zsql.materia_obter_zsql(cod_materia=cod_mat): + dic = {} + dic['titulo'] = "INDICAÇÃO: " + \ + str(materia.num_ident_basica) + " " + str(materia.ano_ident_basica) + dic['materia'] = str(materia.num_ident_basica) + \ + "/" + str(materia.ano_ident_basica) + dic['dat_apresentacao'] = materia.dat_apresentacao + dic['txt_ementa'] = materia.txt_ementa dic['nom_autor'] = " " for autoria in context.zsql.autoria_obter_zsql(cod_materia=materia.cod_materia, ind_primeiro_autor=1): for autor in context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor): - if autor.des_tipo_autor=='Parlamentar': + if autor.des_tipo_autor == 'Parlamentar': for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): - dic['nom_autor']=parlamentar.nom_completo - elif autor.des_tipo_autor=='Comissao': + dic['nom_autor'] = parlamentar.nom_completo + elif autor.des_tipo_autor == 'Comissao': for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): - dic['nom_autor']=comissao.nom_comissao + dic['nom_autor'] = comissao.nom_comissao else: - dic['nom_autor']=autor.nom_autor + dic['nom_autor'] = autor.nom_autor des_status = '' - txt_tramitacao='' + txt_tramitacao = '' data_ultima_acao = '' - dic['localizacao_atual']=" " - for tramitacao in context.zsql.tramitacao_obter_zsql(cod_materia=materia.cod_materia,ind_ult_tramitacao=1): + dic['localizacao_atual'] = " " + for tramitacao in context.zsql.tramitacao_obter_zsql(cod_materia=materia.cod_materia, ind_ult_tramitacao=1): if tramitacao.cod_unid_tram_dest: cod_unid_tram = tramitacao.cod_unid_tram_dest else: cod_unid_tram = tramitacao.cod_unid_tram_local - for unidade_tramitacao in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao = cod_unid_tram): + for unidade_tramitacao in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao=cod_unid_tram): if unidade_tramitacao.cod_orgao: - dic['localizacao_atual']=unidade_tramitacao.nom_orgao + dic['localizacao_atual'] = unidade_tramitacao.nom_orgao elif unidade_tramitacao.cod_parlamentar: - dic['localizacao_atual']=unidade_tramitacao.nom_parlamentar + dic['localizacao_atual'] = unidade_tramitacao.nom_parlamentar else: - dic['localizacao_atual']=unidade_tramitacao.nom_comissao + dic['localizacao_atual'] = unidade_tramitacao.nom_comissao - des_status=tramitacao.des_status - txt_tramitacao=tramitacao.txt_tramitacao + des_status = tramitacao.des_status + txt_tramitacao = tramitacao.txt_tramitacao data_ultima_acao = tramitacao.dat_tramitacao - dic['des_situacao']=des_status - dic['ultima_acao']=txt_tramitacao - dic['data_ultima_acao']=data_ultima_acao + dic['des_situacao'] = des_status + dic['ultima_acao'] = txt_tramitacao + dic['data_ultima_acao'] = data_ultima_acao dic['norma_juridica_vinculada'] = "Não há nenhuma norma jurídica vinculada" for norma in context.zsql.materia_buscar_norma_juridica_zsql(cod_materia=materia.cod_materia): - dic['norma_juridica_vinculada']=norma.des_norma+" "+str(norma.num_norma)+"/"+str(norma.ano_norma) + dic['norma_juridica_vinculada'] = norma.des_norma + " " + \ + str(norma.num_norma) + "/" + str(norma.ano_norma) materias.append(dic) else: - codigo = REQUEST.check_ind - materias=[] - REQUEST=context.REQUEST - for cod_mat in codigo: - for materia in context.zsql.materia_obter_zsql(cod_materia=cod_mat): - dic={} - dic['titulo']="INDICAÇÃO: "+str(materia.num_ident_basica)+" "+str(materia.ano_ident_basica) - dic['materia']=str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica) - dic['dat_apresentacao']=materia.dat_apresentacao - dic['txt_ementa']=materia.txt_ementa - - dic['nom_autor'] = " " - for autoria in context.zsql.autoria_obter_zsql(cod_materia=materia.cod_materia, ind_primeiro_autor=1): - for autor in context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor): - if autor.des_tipo_autor=='Parlamentar': - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): - dic['nom_autor']=parlamentar.nom_completo - elif autor.des_tipo_autor=='Comissao': - for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): - dic['nom_autor']=comissao.nom_comissao + codigo = REQUEST.check_ind + materias = [] + REQUEST = context.REQUEST + for cod_mat in codigo: + for materia in context.zsql.materia_obter_zsql(cod_materia=cod_mat): + dic = {} + dic['titulo'] = "INDICAÇÃO: " + \ + str(materia.num_ident_basica) + " " + \ + str(materia.ano_ident_basica) + dic['materia'] = str(materia.num_ident_basica) + \ + "/" + str(materia.ano_ident_basica) + dic['dat_apresentacao'] = materia.dat_apresentacao + dic['txt_ementa'] = materia.txt_ementa + + dic['nom_autor'] = " " + for autoria in context.zsql.autoria_obter_zsql(cod_materia=materia.cod_materia, ind_primeiro_autor=1): + for autor in context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor): + if autor.des_tipo_autor == 'Parlamentar': + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): + dic['nom_autor'] = parlamentar.nom_completo + elif autor.des_tipo_autor == 'Comissao': + for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): + dic['nom_autor'] = comissao.nom_comissao + else: + dic['nom_autor'] = autor.nom_autor + + des_status = '' + txt_tramitacao = '' + data_ultima_acao = '' + + dic['localizacao_atual'] = " " + for tramitacao in context.zsql.tramitacao_obter_zsql(cod_materia=materia.cod_materia, ind_ult_tramitacao=1): + if tramitacao.cod_unid_tram_dest: + cod_unid_tram = tramitacao.cod_unid_tram_dest else: - dic['nom_autor']=autor.nom_autor - - des_status = '' - txt_tramitacao='' - data_ultima_acao = '' + cod_unid_tram = tramitacao.cod_unid_tram_local - dic['localizacao_atual']=" " - for tramitacao in context.zsql.tramitacao_obter_zsql(cod_materia=materia.cod_materia,ind_ult_tramitacao=1): - if tramitacao.cod_unid_tram_dest: - cod_unid_tram = tramitacao.cod_unid_tram_dest - else: - cod_unid_tram = tramitacao.cod_unid_tram_local - - for unidade_tramitacao in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao = cod_unid_tram): - if unidade_tramitacao.cod_orgao: - dic['localizacao_atual']=unidade_tramitacao.nom_orgao - elif unidade_tramitacao.cod_parlamentar: - dic['localizacao_atual']=unidade_tramitacao.nom_parlamentar - else: - dic['localizacao_atual']=unidade_tramitacao.nom_comissao - - des_status=tramitacao.des_status - txt_tramitacao=tramitacao.txt_tramitacao - data_ultima_acao = tramitacao.dat_tramitacao + for unidade_tramitacao in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao=cod_unid_tram): + if unidade_tramitacao.cod_orgao: + dic['localizacao_atual'] = unidade_tramitacao.nom_orgao + elif unidade_tramitacao.cod_parlamentar: + dic['localizacao_atual'] = unidade_tramitacao.nom_parlamentar + else: + dic['localizacao_atual'] = unidade_tramitacao.nom_comissao - dic['des_situacao']=des_status - dic['ultima_acao']=txt_tramitacao - dic['data_ultima_acao']=data_ultima_acao + des_status = tramitacao.des_status + txt_tramitacao = tramitacao.txt_tramitacao + data_ultima_acao = tramitacao.dat_tramitacao - dic['norma_juridica_vinculada'] = "Não há nenhuma norma jurídica vinculada" - for norma in context.zsql.materia_buscar_norma_juridica_zsql(cod_materia=materia.cod_materia): - dic['norma_juridica_vinculada']=norma.des_norma+" "+str(norma.num_norma)+"/"+str(norma.ano_norma) + dic['des_situacao'] = des_status + dic['ultima_acao'] = txt_tramitacao + dic['data_ultima_acao'] = data_ultima_acao - materias.append(dic) + dic['norma_juridica_vinculada'] = "Não há nenhuma norma jurídica vinculada" + for norma in context.zsql.materia_buscar_norma_juridica_zsql(cod_materia=materia.cod_materia): + dic['norma_juridica_vinculada'] = norma.des_norma + " " + \ + str(norma.num_norma) + "/" + str(norma.ano_norma) + + materias.append(dic) -filtro={} # Dicionário que conterá os dados do filtro +filtro = {} # Dicionário que conterá os dados do filtro # Atribuições diretas do REQUEST -#filtro['data_apres']=REQUEST.data +# filtro['data_apres']=REQUEST.data -#filtro['tipo_materia']='' -#for tipo_materia in context.zsql.tipo_materia_legislativa_obter_zsql(ind_excluido=0, tip_materia=9): +# filtro['tipo_materia']='' +# for tipo_materia in context.zsql.tipo_materia_legislativa_obter_zsql(ind_excluido=0, tip_materia=9): # filtro['tipo_materia']= tipo_materia.sgl_tipo_materia + ' - ' + tipo_materia.des_tipo_materia -#filtro['partido']='' -#if REQUEST.lst_cod_partido!='': +# filtro['partido']='' +# if REQUEST.lst_cod_partido!='': # for partido in context.zsql.partido_obter_zsql(ind_excluido=0,cod_partido=REQUEST.lst_cod_partido): # filtro['partido']=partido.sgl_partido + ' - ' + partido.nom_partido -#filtro['tramitando']='' -#if REQUEST.rad_tramitando=='1': +# filtro['tramitando']='' +# if REQUEST.rad_tramitando=='1': # filtro['tramitacao']='Sim' -#elif REQUEST['rad_tramitando']=='0': +# elif REQUEST['rad_tramitando']=='0': # filtro['tramitacao']='Não' -#filtro['situacao_atual']='' -#if REQUEST.lst_status!='': +# filtro['situacao_atual']='' +# if REQUEST.lst_status!='': # for status in context.zsql.status_tramitacao_obter_zsql(ind_exluido=0,cod_status=REQUEST.lst_status): # filtro['situacao_atual']=status.sgl_status + ' - ' + status.des_status -sessao=session.id -caminho = context.pdf_espelho_gerar(sessao,imagem,data,materias,cabecalho,rodape,filtro) -if caminho=='aviso': - return response.redirect('mensagem_emitir_proc') +sessao = session.id +caminho = context.pdf_espelho_gerar( + sessao, imagem, data, materias, cabecalho, rodape, filtro) +if caminho == 'aviso': + return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_etiqueta_protocolo_preparar_pysc.py b/sapl/relatorios/templates/pdf_etiqueta_protocolo_preparar_pysc.py index 12508e9d5..ee9b97330 100755 --- a/sapl/relatorios/templates/pdf_etiqueta_protocolo_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_etiqueta_protocolo_preparar_pysc.py @@ -1,127 +1,137 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION -data=DateTime().strftime('%d/%m/%Y') +data = DateTime().strftime('%d/%m/%Y') -#Abaixo é gerada a string para o rodapé da página -casa={} -aux=context.sapl_documentos.props_sapl.propertyItems() +# Abaixo é gerada a string para o rodapé da página +casa = {} +aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] -localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) -if len(casa["num_cep"])==8: - cep=casa["num_cep"][:4]+"-"+casa["num_cep"][5:] + casa[item[0]] = item[1] +localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) +if len(casa["num_cep"]) == 8: + cep = casa["num_cep"][:4] + "-" + casa["num_cep"][5:] else: - cep="" - -linha1=casa["end_casa"] -if cep!="": - if casa["end_casa"]!="" and casa["end_casa"]!=None: - linha1 = linha1 + " - " - linha1 = linha1 + "CEP "+cep -if localidade[0].nom_localidade!="" and localidade[0].nom_localidade!=None: - linha1 = linha1 + " - "+localidade[0].nom_localidade+" "+localidade[0].sgl_uf -if casa["num_tel"]!="" and casa["num_tel"]!=None: - linha1 = linha1 + " Tel.: "+ casa["num_tel"] - -linha2=casa["end_web_casa"] -if casa["end_email_casa"]!="" and casa["end_email_casa"]!=None: - if casa["end_web_casa"]!="" and casa["end_web_casa"]!=None: - linha2 = linha2 + " - " - linha2 = linha2 + "E-mail: "+casa["end_email_casa"] - -data_emissao=DateTime().strftime("%d/%m/%Y") -rodape=[linha1,linha2,data_emissao] - -#Por fim, gera-se as entradas para o cabeçalho -estados=context.zsql.localidade_obter_zsql(tip_localidade="u") + cep = "" + +linha1 = casa["end_casa"] +if cep != "": + if casa["end_casa"] != "" and casa["end_casa"] != None: + linha1 = linha1 + " - " + linha1 = linha1 + "CEP " + cep +if localidade[0].nom_localidade != "" and localidade[0].nom_localidade != None: + linha1 = linha1 + " - " + \ + localidade[0].nom_localidade + " " + localidade[0].sgl_uf +if casa["num_tel"] != "" and casa["num_tel"] != None: + linha1 = linha1 + " Tel.: " + casa["num_tel"] + +linha2 = casa["end_web_casa"] +if casa["end_email_casa"] != "" and casa["end_email_casa"] != None: + if casa["end_web_casa"] != "" and casa["end_web_casa"] != None: + linha2 = linha2 + " - " + linha2 = linha2 + "E-mail: " + casa["end_email_casa"] + +data_emissao = DateTime().strftime("%d/%m/%Y") +rodape = [linha1, linha2, data_emissao] + +# Por fim, gera-se as entradas para o cabeçalho +estados = context.zsql.localidade_obter_zsql(tip_localidade="u") for uf in estados: - if localidade[0].sgl_uf==uf.sgl_uf: - nom_estado=uf.nom_localidade - break -cabecalho={} -cabecalho["nom_casa"]=casa["nom_casa"] -cabecalho["nom_estado"]="Estado de "+nom_estado + if localidade[0].sgl_uf == uf.sgl_uf: + nom_estado = uf.nom_localidade + break +cabecalho = {} +cabecalho["nom_casa"] = casa["nom_casa"] +cabecalho["nom_estado"] = "Estado de " + nom_estado # tenta buscar o logotipo da casa LOGO_CASA -if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() +if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() else: - imagem = context.imagens.absolute_url() + "/brasao_transp.gif" + imagem = context.imagens.absolute_url() + "/brasao_transp.gif" -#Por fim, utiliza o PythonScript para pesquisar os protocolos e gerar os dados +# Por fim, utiliza o PythonScript para pesquisar os protocolos e gerar os dados -protocolos=[] -REQUEST=context.REQUEST -for protocolo in context.zsql.protocolo_pesquisar_zsql(tip_protocolo=REQUEST['rad_tip_protocolo'], - cod_protocolo=REQUEST['txt_num_protocolo'], ano_protocolo=REQUEST['txt_ano_protocolo'], - tip_documento=REQUEST['lst_tip_documento'], tip_processo=REQUEST['rad_tip_processo'], - tip_materia=REQUEST['lst_tip_materia'], des_assunto=REQUEST['txt_assunto'], - cod_autor=REQUEST['hdn_cod_autor'], des_interessado=REQUEST['txa_txt_interessado'], - dat_apres=REQUEST['dt_apres'], dat_apres2=REQUEST['dt_apres2']): - dic={} +protocolos = [] +REQUEST = context.REQUEST +for protocolo in context.zsql.protocolo_pesquisar_zsql(tip_protocolo=REQUEST['rad_tip_protocolo'], + cod_protocolo=REQUEST['txt_num_protocolo'], ano_protocolo=REQUEST[ + 'txt_ano_protocolo'], + tip_documento=REQUEST['lst_tip_documento'], tip_processo=REQUEST[ + 'rad_tip_processo'], + tip_materia=REQUEST[ + 'lst_tip_materia'], des_assunto=REQUEST['txt_assunto'], + cod_autor=REQUEST['hdn_cod_autor'], des_interessado=REQUEST[ + 'txa_txt_interessado'], + dat_apres=REQUEST['dt_apres'], dat_apres2=REQUEST['dt_apres2']): + dic = {} - dic['titulo']=str(protocolo.cod_protocolo) + dic['titulo'] = str(protocolo.cod_protocolo) - dic['data']='Data: '+context.pysc.iso_to_port_pysc(protocolo.dat_protocolo)+' Horário: '+protocolo.hor_protocolo[0:2]+':'+protocolo.hor_protocolo[3:5] + dic['data'] = 'Data: ' + context.pysc.iso_to_port_pysc( + protocolo.dat_protocolo) + ' Horário: ' + protocolo.hor_protocolo[0:2] + ':' + protocolo.hor_protocolo[3:5] - dic['txt_assunto']=protocolo.txt_assunto_ementa + dic['txt_assunto'] = protocolo.txt_assunto_ementa - dic['txt_interessado']=protocolo.txt_interessado + dic['txt_interessado'] = protocolo.txt_interessado - dic['nom_autor'] = " " - if protocolo.cod_autor!=None: - for autor in context.zsql.autor_obter_zsql(cod_autor=protocolo.cod_autor): - if autor.des_tipo_autor=='Parlamentar': - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): - dic['nom_autor']=parlamentar.nom_completo - elif autor.des_tipo_autor=='Comissao': - for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): - dic['nom_autor']=comissao.nom_comissao - else: - dic['nom_autor']=autor.nom_autor + dic['nom_autor'] = " " + if protocolo.cod_autor != None: + for autor in context.zsql.autor_obter_zsql(cod_autor=protocolo.cod_autor): + if autor.des_tipo_autor == 'Parlamentar': + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): + dic['nom_autor'] = parlamentar.nom_completo + elif autor.des_tipo_autor == 'Comissao': + for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): + dic['nom_autor'] = comissao.nom_comissao + else: + dic['nom_autor'] = autor.nom_autor - dic['natureza']='' - if protocolo.tip_processo==0: - dic['natureza']='Administrativo' - if protocolo.tip_processo==1: - dic['natureza']='Legislativo' - - dic['num_materia']='' - for materia in context.zsql.materia_obter_zsql(num_protocolo=protocolo.cod_protocolo,ano_ident_basica=protocolo.ano_protocolo): - dic['num_materia']=materia.sgl_tipo_materia+' '+str(materia.num_ident_basica)+'/'+str(materia.ano_ident_basica) + dic['natureza'] = '' + if protocolo.tip_processo == 0: + dic['natureza'] = 'Administrativo' + if protocolo.tip_processo == 1: + dic['natureza'] = 'Legislativo' - dic['num_documento']='' - for documento in context.zsql.documento_administrativo_obter_zsql(num_protocolo=protocolo.cod_protocolo): - dic['num_documento']=documento.sgl_tipo_documento+' '+str(documento.num_documento)+'/'+ str(documento.ano_documento) + dic['num_materia'] = '' + for materia in context.zsql.materia_obter_zsql(num_protocolo=protocolo.cod_protocolo, ano_ident_basica=protocolo.ano_protocolo): + dic['num_materia'] = materia.sgl_tipo_materia + ' ' + \ + str(materia.num_ident_basica) + '/' + str(materia.ano_ident_basica) - dic['ident_processo']=dic['num_materia'] or dic['num_documento'] + dic['num_documento'] = '' + for documento in context.zsql.documento_administrativo_obter_zsql(num_protocolo=protocolo.cod_protocolo): + dic['num_documento'] = documento.sgl_tipo_documento + ' ' + \ + str(documento.num_documento) + '/' + str(documento.ano_documento) - dic['processo']=protocolo.des_tipo_materia or protocolo.des_tipo_documento + dic['ident_processo'] = dic['num_materia'] or dic['num_documento'] - dic['anulado']='' - if protocolo.ind_anulado==1: - dic['anulado']='Nulo' + dic['processo'] = protocolo.des_tipo_materia or protocolo.des_tipo_documento - protocolos.append(dic) + dic['anulado'] = '' + if protocolo.ind_anulado == 1: + dic['anulado'] = 'Nulo' -filtro={} # Dicionário que conterá os dados do filtro + protocolos.append(dic) + +filtro = {} # Dicionário que conterá os dados do filtro # Atribuições diretas do REQUEST -filtro['numero']=REQUEST.txt_num_protocolo -filtro['ano']=REQUEST.txt_ano_protocolo -filtro['tipo_protocolo']=REQUEST.rad_tip_protocolo -filtro['tipo_processo']=REQUEST.rad_tip_processo -filtro['assunto']=REQUEST.txt_assunto -filtro['autor']=REQUEST.hdn_cod_autor -filtro['interessado']=REQUEST.txa_txt_interessado - -sessao=session.id -caminho = context.pdf_etiqueta_protocolo_gerar(sessao,imagem,data,protocolos,cabecalho,rodape,filtro) -if caminho=='aviso': - return response.redirect('mensagem_emitir_proc') +filtro['numero'] = REQUEST.txt_num_protocolo +filtro['ano'] = REQUEST.txt_ano_protocolo +filtro['tipo_protocolo'] = REQUEST.rad_tip_protocolo +filtro['tipo_processo'] = REQUEST.rad_tip_processo +filtro['assunto'] = REQUEST.txt_assunto +filtro['autor'] = REQUEST.hdn_cod_autor +filtro['interessado'] = REQUEST.txa_txt_interessado + +sessao = session.id +caminho = context.pdf_etiqueta_protocolo_gerar( + sessao, imagem, data, protocolos, cabecalho, rodape, filtro) +if caminho == 'aviso': + return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_materia_gerar.py b/sapl/relatorios/templates/pdf_materia_gerar.py index 7df5d766a..125d147e6 100755 --- a/sapl/relatorios/templates/pdf_materia_gerar.py +++ b/sapl/relatorios/templates/pdf_materia_gerar.py @@ -1,4 +1,4 @@ -##parameters=sessao,imagem,data,lst_materias,dic_cabecalho,lst_rodape,dic_filtro +# parameters=sessao,imagem,data,lst_materias,dic_cabecalho,lst_rodape,dic_filtro """relatorio_materia.py External method para gerar o arquivo rml do resultado de uma pesquisa de matérias @@ -11,100 +11,113 @@ import time from trml2pdf import parseString -def cabecalho(dic_cabecalho,imagem): +def cabecalho(dic_cabecalho, imagem): """Gera o codigo rml do cabecalho""" - tmp_data='' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t2cm 25cm 19cm 25cm\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t' + dic_cabecalho['nom_casa'] + '\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t' + dic_cabecalho['nom_estado'] + '\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\tRelatório de Matérias Legislativas\n' + tmp_data = '' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t2cm 25cm 19cm 25cm\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + dic_cabecalho['nom_casa'] + '\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + dic_cabecalho['nom_estado'] + '\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\tRelatório de Matérias Legislativas\n' return tmp_data + def rodape(lst_rodape): """Gera o codigo rml do rodape""" - tmp_data='' - tmp_data+='\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t' + lst_rodape[2] + '\n' - tmp_data+='\t\t\t\tPágina \n' - tmp_data+='\t\t\t\t' + lst_rodape[0] + '\n' - tmp_data+='\t\t\t\t' + lst_rodape[1] + '\n' + tmp_data = '' + tmp_data += '\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[2] + '\n' + tmp_data += '\t\t\t\tPágina \n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[0] + '\n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[1] + '\n' return tmp_data + def paraStyle(): """Gera o codigo rml que define o estilo dos paragrafos""" - tmp_data='' - tmp_data+='\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t\n' - tmp_data+='\t\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\n' + tmp_data = '' + tmp_data += '\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\n' return tmp_data + def materias(lst_materias): """Gera o codigo rml do conteudo da pesquisa de materias""" - tmp_data='' + tmp_data = '' - #inicio do bloco que contem os flowables - tmp_data+='\t\n' + # inicio do bloco que contem os flowables + tmp_data += '\t\n' for dic in lst_materias: - #espaco inicial - tmp_data+='\t\t\n' - tmp_data+='\t\t\t \n' - tmp_data+='\t\t\n' - - #condicao para a quebra de pagina - tmp_data+='\t\t\n' - - #materias - tmp_data+='\t\t '+ dic['titulo'] +' - Autor: ' + dic['nom_autor'] + ' \n' - if dic['txt_ementa']!=None: - txt_ementa = dic['txt_ementa'].replace('&','&') - tmp_data+='\t\t '+ txt_ementa +' \n' - tmp_data+='\t\tSituação: ' + dic['des_situacao'] + '/ Norma Jurídica Vinculada: ' + dic['norma_vinculada'] + '\n' - - tmp_data+='\t\n' + # espaco inicial + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + + # condicao para a quebra de pagina + tmp_data += '\t\t\n' + + # materias + tmp_data += '\t\t ' + \ + dic['titulo'] + ' - Autor: ' + \ + dic['nom_autor'] + ' \n' + if dic['txt_ementa'] != None: + txt_ementa = dic['txt_ementa'].replace('&', '&') + tmp_data += '\t\t ' + txt_ementa + ' \n' + tmp_data += '\t\tSituação: ' + \ + dic['des_situacao'] + '/ Norma Jurídica Vinculada: ' + \ + dic['norma_vinculada'] + '\n' + + tmp_data += '\t\n' return tmp_data + def principal(imagem, lst_materias, dic_cabecalho, lst_rodape): """Funcao pricipal que gera a estrutura global do arquivo rml""" - arquivoPdf=str(int(time.time()*100))+".pdf" - - tmp_data='' - tmp_data+='\n' - tmp_data+='\n' - tmp_data+='\n' - tmp_data+='\t\n' - tmp_data+=paraStyle() - tmp_data+=materias(lst_materias) - tmp_data+='\n' - tmp_pdf=parseString(tmp_data) + arquivoPdf = str(int(time.time() * 100)) + ".pdf" + + tmp_data = '' + tmp_data += '\n' + tmp_data += '\n' + tmp_data += '\n' + tmp_data += '\t\n' + tmp_data += paraStyle() + tmp_data += materias(lst_materias) + tmp_data += '\n' + tmp_pdf = parseString(tmp_data) return tmp_pdf @@ -116,4 +129,5 @@ def principal(imagem, lst_materias, dic_cabecalho, lst_rodape): # return "/temp_folder/"+arquivoPdf -# return principal(sessao,imagem,data,lst_materias,dic_cabecalho,lst_rodape,dic_filtro) +# return +# principal(sessao,imagem,data,lst_materias,dic_cabecalho,lst_rodape,dic_filtro) diff --git a/sapl/relatorios/templates/pdf_materia_preparar_pysc.py b/sapl/relatorios/templates/pdf_materia_preparar_pysc.py index 083621565..30ddaef9b 100644 --- a/sapl/relatorios/templates/pdf_materia_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_materia_preparar_pysc.py @@ -1,155 +1,169 @@ import os -request=context.REQUEST -#print request -#return printed -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +# print request +# return printed +response = request.RESPONSE +session = request.SESSION -data=DateTime().strftime('%d/%m/%Y') +data = DateTime().strftime('%d/%m/%Y') -#Abaixo é gerada a string para o rodapé da página -casa={} -aux=context.sapl_documentos.props_sapl.propertyItems() +# Abaixo é gerada a string para o rodapé da página +casa = {} +aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] -localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) -if len(casa["num_cep"])==8: - cep=casa["num_cep"][:4]+"-"+casa["num_cep"][5:] + casa[item[0]] = item[1] +localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) +if len(casa["num_cep"]) == 8: + cep = casa["num_cep"][:4] + "-" + casa["num_cep"][5:] else: - cep="" - -linha1=casa["end_casa"] -if cep!="": - if casa["end_casa"]!="" and casa["end_casa"]!=None: - linha1 = linha1 + " - " - linha1 = linha1 + "CEP "+cep -if localidade[0].nom_localidade!="" and localidade[0].nom_localidade!=None: - linha1 = linha1 + " - "+localidade[0].nom_localidade+" "+localidade[0].sgl_uf -if casa["num_tel"]!="" and casa["num_tel"]!=None: - linha1 = linha1 + " Tel.: "+ casa["num_tel"] - -linha2=casa["end_web_casa"] -if casa["end_email_casa"]!="" and casa["end_email_casa"]!=None: - if casa["end_web_casa"]!="" and casa["end_web_casa"]!=None: - linha2 = linha2 + " - " - linha2 = linha2 + "E-mail: "+casa["end_email_casa"] - -data_emissao=DateTime().strftime("%d/%m/%Y") -rodape=[linha1,linha2,data_emissao] - -#Por fim, gera-se as entradas para o cabeçalho -estados=context.zsql.localidade_obter_zsql(tip_localidade="u") + cep = "" + +linha1 = casa["end_casa"] +if cep != "": + if casa["end_casa"] != "" and casa["end_casa"] != None: + linha1 = linha1 + " - " + linha1 = linha1 + "CEP " + cep +if localidade[0].nom_localidade != "" and localidade[0].nom_localidade != None: + linha1 = linha1 + " - " + \ + localidade[0].nom_localidade + " " + localidade[0].sgl_uf +if casa["num_tel"] != "" and casa["num_tel"] != None: + linha1 = linha1 + " Tel.: " + casa["num_tel"] + +linha2 = casa["end_web_casa"] +if casa["end_email_casa"] != "" and casa["end_email_casa"] != None: + if casa["end_web_casa"] != "" and casa["end_web_casa"] != None: + linha2 = linha2 + " - " + linha2 = linha2 + "E-mail: " + casa["end_email_casa"] + +data_emissao = DateTime().strftime("%d/%m/%Y") +rodape = [linha1, linha2, data_emissao] + +# Por fim, gera-se as entradas para o cabeçalho +estados = context.zsql.localidade_obter_zsql(tip_localidade="u") for uf in estados: - if localidade[0].sgl_uf==uf.sgl_uf: - nom_estado=uf.nom_localidade - break -cabecalho={} -cabecalho["nom_casa"]=casa["nom_casa"] -cabecalho["nom_estado"]="Estado de "+nom_estado + if localidade[0].sgl_uf == uf.sgl_uf: + nom_estado = uf.nom_localidade + break +cabecalho = {} +cabecalho["nom_casa"] = casa["nom_casa"] +cabecalho["nom_estado"] = "Estado de " + nom_estado # tenta buscar o logotipo da casa LOGO_CASA -if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() +if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() else: - imagem = context.imagens.absolute_url() + "/brasao_transp.gif" + imagem = context.imagens.absolute_url() + "/brasao_transp.gif" -#Por fim, utiliza o PythonScript para pesquisar as matérias e gerar os dados +# Por fim, utiliza o PythonScript para pesquisar as matérias e gerar os dados -materias=[] -REQUEST=context.REQUEST +materias = [] +REQUEST = context.REQUEST for materia in context.zsql.materia_pesquisar_zsql(tip_id_basica=REQUEST['lst_tip_materia'], num_ident_basica=REQUEST['txt_numero'], - ano_ident_basica=REQUEST['txt_ano'], ind_tramitacao=REQUEST['rad_tramitando'], - des_assunto=REQUEST['txt_assunto'], nom_relator=REQUEST['txt_relator'], - cod_status=REQUEST['lst_status'], des_tipo_autor=REQUEST['lst_tip_autor'], - dat_apresentacao=REQUEST['dt_apres'], dat_apresentacao2=REQUEST['dt_apres2'], - dat_publicacao=REQUEST['dt_public'], dat_publicacao2=REQUEST['dt_public2'], - cod_partido=REQUEST['lst_cod_partido'],cod_autor=REQUEST['hdn_cod_autor'], - rd_ordem=REQUEST['rd_ordenacao'],rd_ordem_td=REQUEST['rd_ordem_td']): - - dic={} - - dic['titulo']=materia.sgl_tipo_materia+" "+materia.des_tipo_materia+" "+str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica) - dic['txt_ementa']=materia.txt_ementa - dic['nom_autor'] = " " - for autoria in context.zsql.autoria_obter_zsql(cod_materia=materia.cod_materia): - for autor in context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor): - if autor.des_tipo_autor=='Parlamentar': - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): - dic['nom_autor']=parlamentar.nom_completo - elif autor.des_tipo_autor=='Comissao': - for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): - dic['nom_autor']=comissao.nom_comissao - else: - dic['nom_autor']=autor.nom_autor - - des_status = '' - txt_tramitacao='' - - dic['localizacao_atual']=" " - for tramitacao in context.zsql.tramitacao_obter_zsql(cod_materia=materia.cod_materia,ind_ult_tramitacao=1): - if tramitacao.cod_unid_tram_dest: - cod_unid_tram = tramitacao.cod_unid_tram_dest + ano_ident_basica=REQUEST[ + 'txt_ano'], ind_tramitacao=REQUEST['rad_tramitando'], + des_assunto=REQUEST[ + 'txt_assunto'], nom_relator=REQUEST['txt_relator'], + cod_status=REQUEST['lst_status'], des_tipo_autor=REQUEST[ + 'lst_tip_autor'], + dat_apresentacao=REQUEST[ + 'dt_apres'], dat_apresentacao2=REQUEST['dt_apres2'], + dat_publicacao=REQUEST[ + 'dt_public'], dat_publicacao2=REQUEST['dt_public2'], + cod_partido=REQUEST['lst_cod_partido'], cod_autor=REQUEST[ + 'hdn_cod_autor'], + rd_ordem=REQUEST['rd_ordenacao'], rd_ordem_td=REQUEST['rd_ordem_td']): + + dic = {} + + dic['titulo'] = materia.sgl_tipo_materia + " " + materia.des_tipo_materia + \ + " " + str(materia.num_ident_basica) + "/" + \ + str(materia.ano_ident_basica) + dic['txt_ementa'] = materia.txt_ementa + dic['nom_autor'] = " " + for autoria in context.zsql.autoria_obter_zsql(cod_materia=materia.cod_materia): + for autor in context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor): + if autor.des_tipo_autor == 'Parlamentar': + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): + dic['nom_autor'] = parlamentar.nom_completo + elif autor.des_tipo_autor == 'Comissao': + for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): + dic['nom_autor'] = comissao.nom_comissao else: - cod_unid_tram = tramitacao.cod_unid_tram_local - - for unidade_tramitacao in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao = cod_unid_tram): - if unidade_tramitacao.cod_orgao: - dic['localizacao_atual']=unidade_tramitacao.nom_orgao - else: - dic['localizacao_atual']=unidade_tramitacao.nom_comissao - - des_status=tramitacao.des_status - txt_tramitacao=tramitacao.txt_tramitacao + dic['nom_autor'] = autor.nom_autor - dic['des_situacao']=des_status - dic['ultima_acao']=txt_tramitacao + des_status = '' + txt_tramitacao = '' + dic['localizacao_atual'] = " " + for tramitacao in context.zsql.tramitacao_obter_zsql(cod_materia=materia.cod_materia, ind_ult_tramitacao=1): + if tramitacao.cod_unid_tram_dest: + cod_unid_tram = tramitacao.cod_unid_tram_dest + else: + cod_unid_tram = tramitacao.cod_unid_tram_local - dic['norma_vinculada']=" " - for norma_vinculada in context.zsql.materia_buscar_norma_juridica_zsql(cod_materia=materia.cod_materia): - dic['norma_vinculada']=norma_vinculada.des_norma+" "+str(norma_vinculada.num_norma)+"/"+str(norma_vinculada.ano_norma) + for unidade_tramitacao in context.zsql.unidade_tramitacao_obter_zsql(cod_unid_tramitacao=cod_unid_tram): + if unidade_tramitacao.cod_orgao: + dic['localizacao_atual'] = unidade_tramitacao.nom_orgao + else: + dic['localizacao_atual'] = unidade_tramitacao.nom_comissao + + des_status = tramitacao.des_status + txt_tramitacao = tramitacao.txt_tramitacao + + dic['des_situacao'] = des_status + dic['ultima_acao'] = txt_tramitacao + + dic['norma_vinculada'] = " " + for norma_vinculada in context.zsql.materia_buscar_norma_juridica_zsql(cod_materia=materia.cod_materia): + dic['norma_vinculada'] = norma_vinculada.des_norma + " " + \ + str(norma_vinculada.num_norma) + "/" + \ + str(norma_vinculada.ano_norma) - materias.append(dic) + materias.append(dic) -filtro={} # Dicionário que conterá os dados do filtro +filtro = {} # Dicionário que conterá os dados do filtro # Atribuições diretas do REQUEST -filtro['numero']=REQUEST.txt_numero -filtro['ano']=REQUEST.txt_ano -filtro['autor']=REQUEST.hdn_txt_autor -filtro['tipo_autor']=REQUEST.lst_tip_autor -filtro['relator']=REQUEST.txt_relator -filtro['assunto']=REQUEST.txt_assunto +filtro['numero'] = REQUEST.txt_numero +filtro['ano'] = REQUEST.txt_ano +filtro['autor'] = REQUEST.hdn_txt_autor +filtro['tipo_autor'] = REQUEST.lst_tip_autor +filtro['relator'] = REQUEST.txt_relator +filtro['assunto'] = REQUEST.txt_assunto # Atribuição do restante dos dados que precisam de processamento -if REQUEST.hdn_txt_autor==' ': # Corrige bug do Netscape - filtro['autor']='' +if REQUEST.hdn_txt_autor == ' ': # Corrige bug do Netscape + filtro['autor'] = '' -filtro['tipo_materia']='' -if REQUEST.lst_tip_materia!='': +filtro['tipo_materia'] = '' +if REQUEST.lst_tip_materia != '': for tipo_materia in context.zsql.tipo_materia_legislativa_obter_zsql(ind_excluido=0, tip_materia=REQUEST.lst_tip_materia): - filtro['tipo_materia']= tipo_materia.sgl_tipo_materia + ' - ' + tipo_materia.des_tipo_materia - -filtro['partido']='' -if REQUEST.lst_cod_partido!='': - for partido in context.zsql.partido_obter_zsql(ind_excluido=0,cod_partido=REQUEST.lst_cod_partido): - filtro['partido']=partido.sgl_partido + ' - ' + partido.nom_partido - -filtro['tramitando']='' -if REQUEST.rad_tramitando=='1': - filtro['tramitacao']='Sim' -elif REQUEST['rad_tramitando']=='0': - filtro['tramitacao']='Não' - -filtro['situacao_atual']='' -if REQUEST.lst_status!='': - for status in context.zsql.status_tramitacao_obter_zsql(ind_excluido=0,cod_status=REQUEST.lst_status): - filtro['situacao_atual']=status.sgl_status + ' - ' + status.des_status - -sessao=session.id -caminho = context.pdf_materia_gerar(sessao,imagem,data,materias,cabecalho,rodape,filtro) -if caminho=='aviso': - return response.redirect('mensagem_emitir_proc') + filtro['tipo_materia'] = tipo_materia.sgl_tipo_materia + \ + ' - ' + tipo_materia.des_tipo_materia + +filtro['partido'] = '' +if REQUEST.lst_cod_partido != '': + for partido in context.zsql.partido_obter_zsql(ind_excluido=0, cod_partido=REQUEST.lst_cod_partido): + filtro['partido'] = partido.sgl_partido + ' - ' + partido.nom_partido + +filtro['tramitando'] = '' +if REQUEST.rad_tramitando == '1': + filtro['tramitacao'] = 'Sim' +elif REQUEST['rad_tramitando'] == '0': + filtro['tramitacao'] = 'Não' + +filtro['situacao_atual'] = '' +if REQUEST.lst_status != '': + for status in context.zsql.status_tramitacao_obter_zsql(ind_excluido=0, cod_status=REQUEST.lst_status): + filtro['situacao_atual'] = status.sgl_status + \ + ' - ' + status.des_status + +sessao = session.id +caminho = context.pdf_materia_gerar( + sessao, imagem, data, materias, cabecalho, rodape, filtro) +if caminho == 'aviso': + return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_norma_gerar.py b/sapl/relatorios/templates/pdf_norma_gerar.py index 47136b848..036169190 100755 --- a/sapl/relatorios/templates/pdf_norma_gerar.py +++ b/sapl/relatorios/templates/pdf_norma_gerar.py @@ -1,4 +1,4 @@ -##parameters=sessao,imagem,data,lst_normas,dic_cabecalho,lst_rodape,dic_filtro +# parameters=sessao,imagem,data,lst_normas,dic_cabecalho,lst_rodape,dic_filtro """relatorio_norma.py External method para gerar o arquivo rml do resultado de uma pesquisa de normas @@ -11,108 +11,117 @@ import time from trml2pdf import parseString -def cabecalho(inf_basicas_dic,imagem): +def cabecalho(inf_basicas_dic, imagem): """Gera o codigo rml do cabecalho""" - tmp_data='' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t2cm 25.4cm 19cm 25.4cm\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t' + dic_cabecalho['nom_casa'] + '\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\tSistema de Apoio ao Processo Legislativo\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\tRelatório de Normas Jurídicas\n' + tmp_data = '' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t2cm 25.4cm 19cm 25.4cm\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + dic_cabecalho['nom_casa'] + '\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\tSistema de Apoio ao Processo Legislativo\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\tRelatório de Normas Jurídicas\n' return tmp_data + def rodape(lst_rodape): """Gera o codigo rml do rodape""" - tmp_data='' - tmp_data+='\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t' + lst_rodape[2] + '\n' - tmp_data+='\t\t\t\tPágina \n' - tmp_data+='\t\t\t\t' + lst_rodape[0] + '\n' - tmp_data+='\t\t\t\t' + lst_rodape[1] + '\n' + tmp_data = '' + tmp_data += '\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[2] + '\n' + tmp_data += '\t\t\t\tPágina \n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[0] + '\n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[1] + '\n' return tmp_data + def paraStyle(): """Gera o codigo rml que define o estilo dos paragrafos""" - tmp_data='' - tmp_data+='\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t\n' - tmp_data+='\t\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\n' + tmp_data = '' + tmp_data += '\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\n' return tmp_data + def normas(lst_normas): """Gera o codigo rml do conteudo da pesquisa de normas""" - tmp_data='' + tmp_data = '' - #inicio do bloco que contem os flowables - tmp_data+='\t\n' + # inicio do bloco que contem os flowables + tmp_data += '\t\n' for dic in lst_normas: - #espaco inicial - tmp_data+='\t\t\n' - tmp_data+='\t\t\t \n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t \n' - tmp_data+='\t\t\n' - - #condicao para a quebra de pagina - tmp_data+='\t\t\n' - - #normas - if dic['titulo']!=None: - tmp_data+='\t\t' + dic['titulo'] + '\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t \n' - tmp_data+='\t\t\n' - if dic['txt_ementa']!=None: - txt_ementa = dic['txt_ementa'].replace('&','&') - tmp_data+='\t\t' + txt_ementa + '\n' - if dic['materia_vinculada']!=None: - tmp_data+='\t\tMatéria Legislativa: ' + dic['materia_vinculada'] + '\n' - - tmp_data+='\t\n' + # espaco inicial + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + + # condicao para a quebra de pagina + tmp_data += '\t\t\n' + + # normas + if dic['titulo'] != None: + tmp_data += '\t\t' + dic['titulo'] + '\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + if dic['txt_ementa'] != None: + txt_ementa = dic['txt_ementa'].replace('&', '&') + tmp_data += '\t\t' + txt_ementa + '\n' + if dic['materia_vinculada'] != None: + tmp_data += '\t\tMatéria Legislativa: ' + \ + dic['materia_vinculada'] + '\n' + + tmp_data += '\t\n' return tmp_data + def principal(imagem, lst_normas, dic_cabecalho, lst_rodape): """Funcao pricipal que gera a estrutura global do arquivo rml""" - arquivoPdf=str(int(time.time()*100))+".pdf" - - tmp_data='' - tmp_data+='\n' - tmp_data+='\n' - tmp_data+='\n' - tmp_data+='\t\n' - tmp_data+=paraStyle() - tmp_data+=normas(lst_normas) - tmp_data+='\n' - tmp_pdf=parseString(tmp_data) + arquivoPdf = str(int(time.time() * 100)) + ".pdf" + + tmp_data = '' + tmp_data += '\n' + tmp_data += '\n' + tmp_data += '\n' + tmp_data += '\t\n' + tmp_data += paraStyle() + tmp_data += normas(lst_normas) + tmp_data += '\n' + tmp_pdf = parseString(tmp_data) return tmp_pdf @@ -124,4 +133,5 @@ def principal(imagem, lst_normas, dic_cabecalho, lst_rodape): # return "/temp_folder/"+arquivoPdf -# return principal(sessao,imagem,data,lst_normas,dic_cabecalho,lst_rodape,dic_filtro) +# return +# principal(sessao,imagem,data,lst_normas,dic_cabecalho,lst_rodape,dic_filtro) diff --git a/sapl/relatorios/templates/pdf_norma_preparar_pysc.py b/sapl/relatorios/templates/pdf_norma_preparar_pysc.py index a75138e91..c8b5b056c 100755 --- a/sapl/relatorios/templates/pdf_norma_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_norma_preparar_pysc.py @@ -1,94 +1,105 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION -data=DateTime().strftime('%d/%m/%Y') +data = DateTime().strftime('%d/%m/%Y') -#Abaixo é gerada a string para o rodapé da página -casa={} -aux=context.sapl_documentos.props_sapl.propertyItems() +# Abaixo é gerada a string para o rodapé da página +casa = {} +aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] -localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) -if len(casa["num_cep"])==8: - cep=casa["num_cep"][:4]+"-"+casa["num_cep"][5:] + casa[item[0]] = item[1] +localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) +if len(casa["num_cep"]) == 8: + cep = casa["num_cep"][:4] + "-" + casa["num_cep"][5:] else: - cep="" - -linha1=casa["end_casa"] -if cep!="": - if casa["end_casa"]!="" and casa["end_casa"]!=None: - linha1 = linha1 + " - " - linha1 = linha1 + "CEP "+cep -if localidade[0].nom_localidade!="" and localidade[0].nom_localidade!=None: - linha1 = linha1 + " - "+localidade[0].nom_localidade+" "+localidade[0].sgl_uf -if casa["num_tel"]!="" and casa["num_tel"]!=None: - linha1 = linha1 + " Tel.: "+ casa["num_tel"] - -linha2=casa["end_web_casa"] -if casa["end_email_casa"]!="" and casa["end_email_casa"]!=None: - if casa["end_web_casa"]!="" and casa["end_web_casa"]!=None: - linha2 = linha2 + " - " - linha2 = linha2 + "E-mail: "+casa["end_email_casa"] - -data_emissao=DateTime().strftime("%d/%m/%Y") -rodape=[linha1,linha2,data_emissao] - -#Por fim, gera-se as entradas para o cabeçalho -estados=context.zsql.localidade_obter_zsql(tip_localidade="u") + cep = "" + +linha1 = casa["end_casa"] +if cep != "": + if casa["end_casa"] != "" and casa["end_casa"] != None: + linha1 = linha1 + " - " + linha1 = linha1 + "CEP " + cep +if localidade[0].nom_localidade != "" and localidade[0].nom_localidade != None: + linha1 = linha1 + " - " + \ + localidade[0].nom_localidade + " " + localidade[0].sgl_uf +if casa["num_tel"] != "" and casa["num_tel"] != None: + linha1 = linha1 + " Tel.: " + casa["num_tel"] + +linha2 = casa["end_web_casa"] +if casa["end_email_casa"] != "" and casa["end_email_casa"] != None: + if casa["end_web_casa"] != "" and casa["end_web_casa"] != None: + linha2 = linha2 + " - " + linha2 = linha2 + "E-mail: " + casa["end_email_casa"] + +data_emissao = DateTime().strftime("%d/%m/%Y") +rodape = [linha1, linha2, data_emissao] + +# Por fim, gera-se as entradas para o cabeçalho +estados = context.zsql.localidade_obter_zsql(tip_localidade="u") for uf in estados: - if localidade[0].sgl_uf==uf.sgl_uf: - nom_estado=uf.nom_localidade - break -cabecalho={} -cabecalho["nom_casa"]=casa["nom_casa"] -cabecalho["nom_estado"]="Estado de "+nom_estado + if localidade[0].sgl_uf == uf.sgl_uf: + nom_estado = uf.nom_localidade + break +cabecalho = {} +cabecalho["nom_casa"] = casa["nom_casa"] +cabecalho["nom_estado"] = "Estado de " + nom_estado # tenta buscar o logotipo da casa LOGO_CASA -if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() +if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() else: - imagem = context.imagens.absolute_url() + "/brasao_transp.gif" + imagem = context.imagens.absolute_url() + "/brasao_transp.gif" -#Por fim, utiliza o PythonScript para pesquisar as normas e gerar os dados +# Por fim, utiliza o PythonScript para pesquisar as normas e gerar os dados -normas=[] -REQUEST=context.REQUEST +normas = [] +REQUEST = context.REQUEST for norma in context.zsql.norma_juridica_obter_zsql(tip_norma=REQUEST['lst_tip_norma'], num_norma=REQUEST['txt_numero'], - ano_norma=REQUEST['txt_ano'], des_assunto=REQUEST['txt_assunto'], - cod_assunto=REQUEST['lst_assunto_norma'], dat_norma=REQUEST['dt_norma'], - dat_norma2=REQUEST['dt_norma2'], dat_publicacao=REQUEST['dt_public'], - dat_publicacao2=REQUEST['dt_public2'],rd_ordem=REQUEST['rd_ordenacao']): + ano_norma=REQUEST['txt_ano'], des_assunto=REQUEST[ + 'txt_assunto'], + cod_assunto=REQUEST[ + 'lst_assunto_norma'], dat_norma=REQUEST['dt_norma'], + dat_norma2=REQUEST[ + 'dt_norma2'], dat_publicacao=REQUEST['dt_public'], + dat_publicacao2=REQUEST['dt_public2'], rd_ordem=REQUEST['rd_ordenacao']): - dic={} + dic = {} - dic['titulo']=norma.sgl_tipo_norma+" Nº "+str(norma.num_norma)+" de "+str(norma.dat_norma)+" - "+norma.des_tipo_norma - dic['txt_ementa']=norma.txt_ementa + dic['titulo'] = norma.sgl_tipo_norma + " Nº " + \ + str(norma.num_norma) + " de " + \ + str(norma.dat_norma) + " - " + norma.des_tipo_norma + dic['txt_ementa'] = norma.txt_ementa - dic['materia_vinculada']=" " - if norma.cod_materia!=None: - for materia_vinculada in context.zsql.materia_obter_zsql(cod_materia=str(norma.cod_materia)): - dic['materia_vinculada']=materia_vinculada.sgl_tipo_materia+" "+str(materia_vinculada.num_ident_basica)+"/"+str(materia_vinculada.ano_ident_basica) + dic['materia_vinculada'] = " " + if norma.cod_materia != None: + for materia_vinculada in context.zsql.materia_obter_zsql(cod_materia=str(norma.cod_materia)): + dic['materia_vinculada'] = materia_vinculada.sgl_tipo_materia + " " + \ + str(materia_vinculada.num_ident_basica) + "/" + \ + str(materia_vinculada.ano_ident_basica) - normas.append(dic) + normas.append(dic) -filtro={} # Dicionário que conterá os dados do filtro +filtro = {} # Dicionário que conterá os dados do filtro # Atribuições diretas do REQUEST -filtro['numero']=REQUEST.txt_numero -filtro['ano']=REQUEST.txt_ano -filtro['assunto']=REQUEST.txt_assunto +filtro['numero'] = REQUEST.txt_numero +filtro['ano'] = REQUEST.txt_ano +filtro['assunto'] = REQUEST.txt_assunto -filtro['tipo_norma']='' -if REQUEST.lst_tip_norma!='': +filtro['tipo_norma'] = '' +if REQUEST.lst_tip_norma != '': for tipo_norma in context.zsql.tipo_norma_juridica_obter_zsql(ind_excluido=0, tip_norma=REQUEST.lst_tip_norma): - filtro['tipo_norma']= tipo_norma.sgl_tipo_norma + ' - ' + tipo_norma.des_tipo_norma - -sessao=session.id -caminho = context.pdf_norma_gerar(sessao,imagem,data,normas,cabecalho,rodape,filtro) -if caminho=='aviso': - return response.redirect('mensagem_emitir_proc') + filtro['tipo_norma'] = tipo_norma.sgl_tipo_norma + \ + ' - ' + tipo_norma.des_tipo_norma + +sessao = session.id +caminho = context.pdf_norma_gerar( + sessao, imagem, data, normas, cabecalho, rodape, filtro) +if caminho == 'aviso': + return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_ordem_dia_preparar_pysc.py b/sapl/relatorios/templates/pdf_ordem_dia_preparar_pysc.py index 928b1b943..4e765239f 100644 --- a/sapl/relatorios/templates/pdf_ordem_dia_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_ordem_dia_preparar_pysc.py @@ -1,97 +1,116 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION -if context.REQUEST['cod_sessao_plen']!='': +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION +if context.REQUEST['cod_sessao_plen'] != '': cod_sessao_plen = context.REQUEST['cod_sessao_plen'] - splen = [] # lista contendo as sessões plenárias na data indicada - pauta = [] # lista contendo a pauta da ordem do dia a ser impressa + splen = [] # lista contendo as sessões plenárias na data indicada + pauta = [] # lista contendo a pauta da ordem do dia a ser impressa data = "" - for dat_sessao in context.zsql.sessao_plenaria_obter_zsql(cod_sessao_plen=cod_sessao_plen,ind_excluido=0): - data = context.pysc.data_converter_pysc(dat_sessao.dat_inicio_sessao) # converte data para formato yyyy/mm/dd - dat_ordem = context.pysc.data_converter_pysc(dat_sessao.dat_inicio_sessao) # converte data para formato yyyy/mm/dd + for dat_sessao in context.zsql.sessao_plenaria_obter_zsql(cod_sessao_plen=cod_sessao_plen, ind_excluido=0): + # converte data para formato yyyy/mm/dd + data = context.pysc.data_converter_pysc(dat_sessao.dat_inicio_sessao) + dat_ordem = context.pysc.data_converter_pysc( + dat_sessao.dat_inicio_sessao) # converte data para formato yyyy/mm/dd # seleciona dados da sessão plenária for sp in context.zsql.sessao_plenaria_obter_zsql(dat_inicio_sessao=data, ind_excluido=0): - dicsp = {} # dicionário que armazenará os dados a serem impressos de uma sessão plenária - ts = context.zsql.tipo_sessao_plenaria_obter_zsql(tip_sessao=sp.tip_sessao)[0] - dicsp["sessao"] = str(sp.num_sessao_plen)+"ª Sessao "+ts.nom_sessao+" da "+str(sp.num_sessao_leg)+"ª Sessao Legislativa da "+str(sp.num_legislatura)+"ª Legislatura" - dia = context.pysc.data_converter_por_extenso_pysc(data=sp.dat_inicio_sessao) + dicsp = {} # dicionário que armazenará os dados a serem impressos de uma sessão plenária + ts = context.zsql.tipo_sessao_plenaria_obter_zsql( + tip_sessao=sp.tip_sessao)[0] + dicsp["sessao"] = str(sp.num_sessao_plen) + "ª Sessao " + ts.nom_sessao + " da " + str( + sp.num_sessao_leg) + "ª Sessao Legislativa da " + str(sp.num_legislatura) + "ª Legislatura" + dia = context.pysc.data_converter_por_extenso_pysc( + data=sp.dat_inicio_sessao) hora = context.pysc.hora_formatar_pysc(hora=sp.hr_inicio_sessao) - dicsp["datasessao"] = "Dia "+str(dia)+" ("+str(sp.dia_sessao)+") - Inicio as "+hora - splen.append(dicsp) + dicsp["datasessao"] = "Dia " + \ + str(dia) + " (" + str(sp.dia_sessao) + ") - Inicio as " + hora + splen.append(dicsp) # seleciona as matérias que compõem a pauta na data escolhida for ordem in context.zsql.ordem_dia_obter_zsql(dat_ordem=data, ind_excluido=0): - # seleciona os detalhes de uma matéria - materia = context.zsql.materia_obter_zsql(cod_materia=ordem.cod_materia)[0] - dic = {} # dicionário que armazenará os dados a serem impressos de uma matéria + # seleciona os detalhes de uma matéria + materia = context.zsql.materia_obter_zsql( + cod_materia=ordem.cod_materia)[0] + dic = {} # dicionário que armazenará os dados a serem impressos de uma matéria dic["num_ordem"] = ordem.num_ordem - dic["id_materia"] = materia.des_tipo_materia+" - Nº "+str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica) + dic["id_materia"] = materia.des_tipo_materia + " - Nº " + \ + str(materia.num_ident_basica) + "/" + str(materia.ano_ident_basica) # dic["id_materia"] = materia.sgl_tipo_materia+" - "+str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica)+" - "+materia.des_tipo_materia dic["txt_ementa"] = ordem.txt_observacao # numeracao do processo 26/02/2011 - dic["des_numeracao"]="" - numeracao = context.zsql.numeracao_obter_zsql(cod_materia=ordem.cod_materia) + dic["des_numeracao"] = "" + numeracao = context.zsql.numeracao_obter_zsql( + cod_materia=ordem.cod_materia) if len(numeracao): - numeracao = numeracao[0] - dic["des_numeracao"] = str(numeracao.num_materia)+"/"+str(numeracao.ano_materia) - dic["des_turno"]="" + numeracao = numeracao[0] + dic["des_numeracao"] = str( + numeracao.num_materia) + "/" + str(numeracao.ano_materia) + dic["des_turno"] = "" dic["des_situacao"] = "" - tramitacao = context.zsql.tramitacao_obter_zsql(cod_materia=ordem.cod_materia, ind_ult_tramitacao=1) + tramitacao = context.zsql.tramitacao_obter_zsql( + cod_materia=ordem.cod_materia, ind_ult_tramitacao=1) if len(tramitacao): tramitacao = tramitacao[0] - if tramitacao.sgl_turno != "": - for turno in [("P","Primeiro"), ("S","Segundo"), ("U","Único"), ("L","Suplementar"), ("A","Votação Única em Regime de Urgência"), ("B","1ª Votação"), ("C","2ª e 3ª Votações")]: + if tramitacao.sgl_turno != "": + for turno in [("P", "Primeiro"), ("S", "Segundo"), ("U", "Único"), ("L", "Suplementar"), ("A", "Votação Única em Regime de Urgência"), ("B", "1ª Votação"), ("C", "2ª e 3ª Votações")]: if tramitacao.sgl_turno == turno[0]: dic["des_turno"] = turno[1] dic["des_situacao"] = tramitacao.des_status - if dic["des_situacao"]==None: - dic["des_situacao"] = " " + if dic["des_situacao"] == None: + dic["des_situacao"] = " " dic["nom_autor"] = '' - autoria = context.zsql.autoria_obter_zsql(cod_materia=ordem.cod_materia, ind_primeiro_autor=1) - if len(autoria): # se existe autor + autoria = context.zsql.autoria_obter_zsql( + cod_materia=ordem.cod_materia, ind_primeiro_autor=1) + if len(autoria): # se existe autor autoria = autoria[0] try: - autor = context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor) - if len(autor): - autor = autor[0] + autor = context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor) + if len(autor): + autor = autor[0] - if autor.des_tipo_autor == "Parlamentar": - parlamentar = context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar)[0] - dic["nom_autor"] = parlamentar.nom_parlamentar + if autor.des_tipo_autor == "Parlamentar": + parlamentar = context.zsql.parlamentar_obter_zsql( + cod_parlamentar=autor.cod_parlamentar)[0] + dic["nom_autor"] = parlamentar.nom_parlamentar - elif autor.des_tipo_autor == "Comissao": - comissao = context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao)[0] - dic["nom_autor"] = comissao.nom_comissao - else: - dic["nom_autor"] = autor.nom_autor + elif autor.des_tipo_autor == "Comissao": + comissao = context.zsql.comissao_obter_zsql( + cod_comissao=autor.cod_comissao)[0] + dic["nom_autor"] = comissao.nom_comissao + else: + dic["nom_autor"] = autor.nom_autor except: - pass - lst_relator = [] # lista contendo os relatores da matéria + pass + lst_relator = [] # lista contendo os relatores da matéria for relatoria in context.zsql.relatoria_obter_zsql(cod_materia=ordem.cod_materia): - parlamentar = context.zsql.parlamentar_obter_zsql(cod_parlamentar=relatoria.cod_parlamentar)[0] - comissao = context.zsql.comissao_obter_zsql(cod_comissao=relatoria.cod_comissao)[0] - lst_relator.append(parlamentar.nom_parlamentar+" - "+comissao.nom_comissao) + parlamentar = context.zsql.parlamentar_obter_zsql( + cod_parlamentar=relatoria.cod_parlamentar)[0] + comissao = context.zsql.comissao_obter_zsql( + cod_comissao=relatoria.cod_comissao)[0] + lst_relator.append(parlamentar.nom_parlamentar + + " - " + comissao.nom_comissao) if not len(lst_relator): - lst_relator = [''] + lst_relator = [''] dic["lst_relator"] = lst_relator # adiciona o dicionário na pauta - pauta.append(dic) + pauta.append(dic) - # obtém as propriedades da casa legislativa para montar o cabeçalho e o rodapé da página - casa = {} - aux=context.sapl_documentos.props_sapl.propertyItems() + # obtém as propriedades da casa legislativa para montar o cabeçalho e o + # rodapé da página + casa = {} + aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: casa[item[0]] = item[1] # obtém a localidade - localidade = context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) - + localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) + # monta o cabeçalho da página - cabecalho = {} + cabecalho = {} estado = context.zsql.localidade_obter_zsql(tip_localidade="U") for uf in estado: if localidade[0].sgl_uf == uf.sgl_uf: @@ -99,40 +118,43 @@ if context.REQUEST['cod_sessao_plen']!='': break cabecalho["nom_casa"] = casa["nom_casa"] - cabecalho["nom_estado"] = "Estado do "+nom_estado + cabecalho["nom_estado"] = "Estado do " + nom_estado # tenta buscar o logotipo da casa LOGO_CASA - if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() + if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl[ + 'logo_casa.gif'].absolute_url() else: imagem = context.imagens.absolute_url() + "/brasao_transp.gif" - - # monta o rodapé da página + + # monta o rodapé da página num_cep = casa["num_cep"] if len(casa["num_cep"]) == 8: - num_cep=casa["num_cep"][:4]+"-"+casa["num_cep"][5:] - - linha1 = casa["end_casa"] - if num_cep!=None and num_cep!="": - if casa["end_casa"]!="" and casa["end_casa"]!=None: - linha1 = linha1 +" " - linha1 = linha1 +" CEP: "+num_cep - if localidade[0].nom_localidade!=None and localidade[0].nom_localidade!="": - linha1 = linha1 +" "+localidade[0].nom_localidade +" - "+localidade[0].sgl_uf - if casa["num_tel"]!=None and casa["num_tel"]!="": - linha1 = linha1 +" Tel.: "+casa["num_tel"] + num_cep = casa["num_cep"][:4] + "-" + casa["num_cep"][5:] + + linha1 = casa["end_casa"] + if num_cep != None and num_cep != "": + if casa["end_casa"] != "" and casa["end_casa"] != None: + linha1 = linha1 + " " + linha1 = linha1 + " CEP: " + num_cep + if localidade[0].nom_localidade != None and localidade[0].nom_localidade != "": + linha1 = linha1 + " " + \ + localidade[0].nom_localidade + " - " + localidade[0].sgl_uf + if casa["num_tel"] != None and casa["num_tel"] != "": + linha1 = linha1 + " Tel.: " + casa["num_tel"] linha2 = casa["end_web_casa"] - if casa["end_email_casa"]!=None and casa["end_email_casa"]!="": - if casa["end_web_casa"]!="" and casa["end_web_casa"]!=None: - linha2= linha2 + " - " - linha2 = linha2 +"E-mail: "+casa["end_email_casa"] + if casa["end_email_casa"] != None and casa["end_email_casa"] != "": + if casa["end_web_casa"] != "" and casa["end_web_casa"] != None: + linha2 = linha2 + " - " + linha2 = linha2 + "E-mail: " + casa["end_email_casa"] dat_emissao = DateTime().strftime("%d/%m/%Y") rodape = [linha1, linha2, dat_emissao] - - sessao=session.id - caminho = context.pdf_ordem_dia_gerar( sessao, imagem, dat_ordem, splen, pauta, cabecalho, rodape) - if caminho=='aviso': + + sessao = session.id + caminho = context.pdf_ordem_dia_gerar( + sessao, imagem, dat_ordem, splen, pauta, cabecalho, rodape) + if caminho == 'aviso': return response.redirect('mensagem_emitir_proc') else: response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py index b35aaadb3..621b8fb75 100755 --- a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py +++ b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py @@ -23,7 +23,9 @@ def cabecalho(inf_basicas_dic, imagem): tmp += '\t\t\t\t\n' tmp += '\t\t\t\tPauta da ' + str(inf_basicas_dic['num_sessao_plen']) + 'ª Reunião ' + str(inf_basicas_dic['nom_sessao']) + ' da ' + str( inf_basicas_dic['num_sessao_leg']) + 'ª Sessão Legislativa da \n' - tmp += '\t\t\t\t' + str(inf_basicas_dic['num_legislatura']) + ' Legislatura \n' + tmp += '\t\t\t\t' + \ + str(inf_basicas_dic['num_legislatura']) + \ + ' Legislatura \n' return tmp diff --git a/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py b/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py index 1db6443d4..d76545371 100755 --- a/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py @@ -1,20 +1,22 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION -if context.REQUEST['data']!='': +if context.REQUEST['data'] != '': dat_inicio_sessao = context.REQUEST['data'] - pauta = [] # lista contendo a pauta da ordem do dia a ser impressa - data = context.pysc.data_converter_pysc(dat_inicio_sessao) # converte data para formato yyyy/mm/dd + pauta = [] # lista contendo a pauta da ordem do dia a ser impressa + # converte data para formato yyyy/mm/dd + data = context.pysc.data_converter_pysc(dat_inicio_sessao) codigo = context.REQUEST['cod_sessao_plen'] # seleciona as matérias que compõem a pauta na data escolhida for sessao in context.zsql.sessao_plenaria_obter_zsql(dat_inicio_sessao=data, cod_sessao_plen=codigo, ind_excluido=0): - inf_basicas_dic = {} # dicionário que armazenará as informacoes basicas da sessao plenaria + inf_basicas_dic = {} # dicionário que armazenará as informacoes basicas da sessao plenaria # seleciona o tipo da sessao plenaria - tipo_sessao = context.zsql.tipo_sessao_plenaria_obter_zsql(tip_sessao=sessao.tip_sessao,ind_excluido=0)[0] + tipo_sessao = context.zsql.tipo_sessao_plenaria_obter_zsql( + tip_sessao=sessao.tip_sessao, ind_excluido=0)[0] inf_basicas_dic["nom_sessao"] = tipo_sessao.nom_sessao inf_basicas_dic["num_sessao_plen"] = sessao.num_sessao_plen inf_basicas_dic["nom_sessao"] = tipo_sessao.nom_sessao @@ -24,139 +26,164 @@ if context.REQUEST['data']!='': inf_basicas_dic["hr_inicio_sessao"] = sessao.hr_inicio_sessao inf_basicas_dic["dat_fim_sessao"] = sessao.dat_fim_sessao inf_basicas_dic["hr_fim_sessao"] = sessao.hr_fim_sessao - + # Lista das matérias do Expediente, incluindo o status da tramitação - lst_expediente_materia=[] - for expediente_materia in context.zsql.votacao_expediente_materia_obter_zsql(dat_ordem=data,cod_sessao_plen=codigo,ind_excluido=0): - + lst_expediente_materia = [] + for expediente_materia in context.zsql.votacao_expediente_materia_obter_zsql(dat_ordem=data, cod_sessao_plen=codigo, ind_excluido=0): + # seleciona os detalhes de uma matéria - materia = context.zsql.materia_obter_zsql(cod_materia=expediente_materia.cod_materia)[0] + materia = context.zsql.materia_obter_zsql( + cod_materia=expediente_materia.cod_materia)[0] dic_expediente_materia = {} dic_expediente_materia["num_ordem"] = expediente_materia.num_ordem - dic_expediente_materia["id_materia"] = materia.sgl_tipo_materia+" - "+materia.des_tipo_materia+" No. "+str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica) + dic_expediente_materia["id_materia"] = materia.sgl_tipo_materia + " - " + materia.des_tipo_materia + \ + " No. " + str(materia.num_ident_basica) + "/" + \ + str(materia.ano_ident_basica) dic_expediente_materia["txt_ementa"] = materia.txt_ementa - dic_expediente_materia["ordem_observacao"] = expediente_materia.ordem_observacao + dic_expediente_materia[ + "ordem_observacao"] = expediente_materia.ordem_observacao - dic_expediente_materia["des_numeracao"]="" - numeracao = context.zsql.numeracao_obter_zsql(cod_materia=expediente_materia.cod_materia) + dic_expediente_materia["des_numeracao"] = "" + numeracao = context.zsql.numeracao_obter_zsql( + cod_materia=expediente_materia.cod_materia) if len(numeracao): - numeracao = numeracao[0] - dic_expediente_materia["des_numeracao"] = str(numeracao.num_materia)+"/"+str(numeracao.ano_materia) + numeracao = numeracao[0] + dic_expediente_materia["des_numeracao"] = str( + numeracao.num_materia) + "/" + str(numeracao.ano_materia) dic_expediente_materia["nom_autor"] = '' - autoria = context.zsql.autoria_obter_zsql(cod_materia=expediente_materia.cod_materia, ind_primeiro_autor=1) - if len(autoria) > 0: # se existe autor + autoria = context.zsql.autoria_obter_zsql( + cod_materia=expediente_materia.cod_materia, ind_primeiro_autor=1) + if len(autoria) > 0: # se existe autor autoria = autoria[0] - autor = context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor) + autor = context.zsql.autor_obter_zsql( + cod_autor=autoria.cod_autor) if len(autor) > 0: autor = autor[0] - + if autor.des_tipo_autor == "Parlamentar": - parlamentar = context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar)[0] - dic_expediente_materia["nom_autor"] = parlamentar.nom_parlamentar + parlamentar = context.zsql.parlamentar_obter_zsql( + cod_parlamentar=autor.cod_parlamentar)[0] + dic_expediente_materia[ + "nom_autor"] = parlamentar.nom_parlamentar elif autor.des_tipo_autor == "Comissao": - comissao = context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao)[0] + comissao = context.zsql.comissao_obter_zsql( + cod_comissao=autor.cod_comissao)[0] dic_expediente_materia["nom_autor"] = comissao.nom_comissao else: dic_expediente_materia["nom_autor"] = autor.nom_autor - - dic_expediente_materia["des_turno"]="" + + dic_expediente_materia["des_turno"] = "" dic_expediente_materia["des_situacao"] = "" - tramitacao = context.zsql.tramitacao_obter_zsql(cod_materia=expediente_materia.cod_materia, ind_ult_tramitacao=1) + tramitacao = context.zsql.tramitacao_obter_zsql( + cod_materia=expediente_materia.cod_materia, ind_ult_tramitacao=1) if len(tramitacao): tramitacao = tramitacao[0] - if tramitacao.sgl_turno != "": - for turno in [("P","Primeiro"), ("S","Segundo"), ("U","Único"), ("F","Final"), ("L","Suplementar"), ("A","Votação Única em Regime de Urgência"), ("B","1ª Votação"), ("C","2ª e 3ª Votações")]: + if tramitacao.sgl_turno != "": + for turno in [("P", "Primeiro"), ("S", "Segundo"), ("U", "Único"), ("F", "Final"), ("L", "Suplementar"), ("A", "Votação Única em Regime de Urgência"), ("B", "1ª Votação"), ("C", "2ª e 3ª Votações")]: if tramitacao.sgl_turno == turno[0]: dic_expediente_materia["des_turno"] = turno[1] dic_expediente_materia["des_situacao"] = tramitacao.des_status - if dic_expediente_materia["des_situacao"]==None: - dic_expediente_materia["des_situacao"] = " " + if dic_expediente_materia["des_situacao"] == None: + dic_expediente_materia["des_situacao"] = " " lst_expediente_materia.append(dic_expediente_materia) - # Lista das matérias da Ordem do Dia, incluindo o status da tramitação - lst_votacao=[] - for votacao in context.zsql.votacao_ordem_dia_obter_zsql(dat_ordem=data,cod_sessao_plen=codigo,ind_excluido=0): - + lst_votacao = [] + for votacao in context.zsql.votacao_ordem_dia_obter_zsql(dat_ordem=data, cod_sessao_plen=codigo, ind_excluido=0): + # seleciona os detalhes de uma matéria - materia = context.zsql.materia_obter_zsql(cod_materia=votacao.cod_materia)[0] + materia = context.zsql.materia_obter_zsql( + cod_materia=votacao.cod_materia)[0] dic_votacao = {} dic_votacao["num_ordem"] = votacao.num_ordem - dic_votacao["id_materia"] = materia.sgl_tipo_materia+" - "+materia.des_tipo_materia+" No. "+str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica) + dic_votacao["id_materia"] = materia.sgl_tipo_materia + " - " + materia.des_tipo_materia + \ + " No. " + str(materia.num_ident_basica) + "/" + \ + str(materia.ano_ident_basica) dic_votacao["txt_ementa"] = materia.txt_ementa dic_votacao["ordem_observacao"] = votacao.ordem_observacao - dic_votacao["des_numeracao"]="" - numeracao = context.zsql.numeracao_obter_zsql(cod_materia=votacao.cod_materia) + dic_votacao["des_numeracao"] = "" + numeracao = context.zsql.numeracao_obter_zsql( + cod_materia=votacao.cod_materia) if len(numeracao): - numeracao = numeracao[0] - dic_votacao["des_numeracao"] = str(numeracao.num_materia)+"/"+str(numeracao.ano_materia) + numeracao = numeracao[0] + dic_votacao["des_numeracao"] = str( + numeracao.num_materia) + "/" + str(numeracao.ano_materia) dic_votacao["nom_autor"] = '' - autoria = context.zsql.autoria_obter_zsql(cod_materia=votacao.cod_materia, ind_primeiro_autor=1) - if len(autoria) > 0: # se existe autor + autoria = context.zsql.autoria_obter_zsql( + cod_materia=votacao.cod_materia, ind_primeiro_autor=1) + if len(autoria) > 0: # se existe autor autoria = autoria[0] - autor = context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor) + autor = context.zsql.autor_obter_zsql( + cod_autor=autoria.cod_autor) if len(autor) > 0: autor = autor[0] - + if autor.des_tipo_autor == "Parlamentar": - parlamentar = context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar)[0] + parlamentar = context.zsql.parlamentar_obter_zsql( + cod_parlamentar=autor.cod_parlamentar)[0] dic_votacao["nom_autor"] = parlamentar.nom_parlamentar elif autor.des_tipo_autor == "Comissao": - comissao = context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao)[0] + comissao = context.zsql.comissao_obter_zsql( + cod_comissao=autor.cod_comissao)[0] dic_votacao["nom_autor"] = comissao.nom_comissao else: dic_votacao["nom_autor"] = autor.nom_autor - dic_votacao["des_turno"]="" + dic_votacao["des_turno"] = "" dic_votacao["des_situacao"] = "" - tramitacao = context.zsql.tramitacao_obter_zsql(cod_materia=votacao.cod_materia, ind_ult_tramitacao=1) + tramitacao = context.zsql.tramitacao_obter_zsql( + cod_materia=votacao.cod_materia, ind_ult_tramitacao=1) if len(tramitacao): tramitacao = tramitacao[0] - if tramitacao.sgl_turno != "": - for turno in [("P","Primeiro"), ("S","Segundo"), ("U","Único"), ("L","Suplementar"), ("A","Votação Única em Regime de Urgência"), ("B","1ª Votação"), ("C","2ª e 3ª Votações")]: + if tramitacao.sgl_turno != "": + for turno in [("P", "Primeiro"), ("S", "Segundo"), ("U", "Único"), ("L", "Suplementar"), ("A", "Votação Única em Regime de Urgência"), ("B", "1ª Votação"), ("C", "2ª e 3ª Votações")]: if tramitacao.sgl_turno == turno[0]: dic_votacao["des_turno"] = turno[1] dic_votacao["des_situacao"] = tramitacao.des_status - if dic_votacao["des_situacao"]==None: - dic_votacao["des_situacao"] = " " + if dic_votacao["des_situacao"] == None: + dic_votacao["des_situacao"] = " " lst_votacao.append(dic_votacao) - # obtém as propriedades da casa legislativa para montar o cabeçalho e o rodapé da página - cabecalho={} + # obtém as propriedades da casa legislativa para montar o cabeçalho e o + # rodapé da página + cabecalho = {} # tenta buscar o logotipo da casa LOGO_CASA - if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() + if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl[ + 'logo_casa.gif'].absolute_url() else: imagem = context.imagens.absolute_url() + "/brasao_transp.gif" - - #Abaixo é gerado o dic do rodapé da página (linha 7) - casa={} - aux=context.sapl_documentos.props_sapl.propertyItems() + + # Abaixo é gerado o dic do rodapé da página (linha 7) + casa = {} + aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] - localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) - data_emissao= DateTime().strftime("%d/%m/%Y") - rodape= casa - rodape['data_emissao']= data_emissao - - inf_basicas_dic['nom_camara']= casa['nom_casa'] - REQUEST=context.REQUEST - for local in context.zsql.localidade_obter_zsql(cod_localidade = casa['cod_localidade']): - rodape['nom_localidade']= " "+local.nom_localidade - rodape['sgl_uf']= local.sgl_uf + casa[item[0]] = item[1] + localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) + data_emissao = DateTime().strftime("%d/%m/%Y") + rodape = casa + rodape['data_emissao'] = data_emissao + + inf_basicas_dic['nom_camara'] = casa['nom_casa'] + REQUEST = context.REQUEST + for local in context.zsql.localidade_obter_zsql(cod_localidade=casa['cod_localidade']): + rodape['nom_localidade'] = " " + local.nom_localidade + rodape['sgl_uf'] = local.sgl_uf # return lst_votacao - sessao=session.id - caminho = context.pdf_pauta_sessao_gerar(rodape, sessao, imagem, inf_basicas_dic, lst_votacao, lst_expediente_materia) - if caminho=='aviso': + sessao = session.id + caminho = context.pdf_pauta_sessao_gerar( + rodape, sessao, imagem, inf_basicas_dic, lst_votacao, lst_expediente_materia) + if caminho == 'aviso': return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_protocolo_gerar.py b/sapl/relatorios/templates/pdf_protocolo_gerar.py index 114dc05d4..a3fc82dd1 100755 --- a/sapl/relatorios/templates/pdf_protocolo_gerar.py +++ b/sapl/relatorios/templates/pdf_protocolo_gerar.py @@ -1,4 +1,4 @@ -##parameters=sessao,imagem,data,lst_protocolos,dic_cabecalho,lst_rodape,dic_filtro +# parameters=sessao,imagem,data,lst_protocolos,dic_cabecalho,lst_rodape,dic_filtro """relatorio_protocolo.py External method para gerar o arquivo rml do resultado de uma pesquisa de protocolos @@ -11,118 +11,132 @@ import time from trml2pdf import parseString -def cabecalho(dic_cabecalho,imagem): +def cabecalho(dic_cabecalho, imagem): """Gera o codigo rml do cabecalho""" - tmp_data='' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t2cm 25.4cm 19cm 25.4cm\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t' + dic_cabecalho['nom_casa'] + '\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\tSistema de Apoio ao Processo Legislativo\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\tRelatório de Controle do Protocolo\n' + tmp_data = '' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t2cm 25.4cm 19cm 25.4cm\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + dic_cabecalho['nom_casa'] + '\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\tSistema de Apoio ao Processo Legislativo\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\tRelatório de Controle do Protocolo\n' return tmp_data + def rodape(lst_rodape): """Gera o codigo rml do rodape""" - tmp_data='' - tmp_data+='\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' - tmp_data+='\t\t\t\t\n' - tmp_data+='\t\t\t\t' + lst_rodape[2] + '\n' - tmp_data+='\t\t\t\tPágina \n' - tmp_data+='\t\t\t\t' + lst_rodape[0] + '\n' - tmp_data+='\t\t\t\t' + lst_rodape[1] + '\n' + tmp_data = '' + tmp_data += '\t\t\t\t2cm 3.2cm 19cm 3.2cm\n' + tmp_data += '\t\t\t\t\n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[2] + '\n' + tmp_data += '\t\t\t\tPágina \n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[0] + '\n' + tmp_data += '\t\t\t\t' + \ + lst_rodape[1] + '\n' return tmp_data + def paraStyle(): """Gera o codigo rml que define o estilo dos paragrafos""" - tmp_data='' - tmp_data+='\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t\n' - tmp_data+='\t\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\n' + tmp_data = '' + tmp_data += '\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\n' return tmp_data + def protocolos(lst_protocolos): """Gera o codigo rml do conteudo da pesquisa de protocolos""" - tmp_data='' + tmp_data = '' - #inicio do bloco que contem os flowables - tmp_data+='\t\n' + # inicio do bloco que contem os flowables + tmp_data += '\t\n' for dic in lst_protocolos: - #espaco inicial - tmp_data+='\t\t\n' - tmp_data+='\t\t\t \n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t \n' - tmp_data+='\t\t\n' - - #condicao para a quebra de pagina - tmp_data+='\t\t\n' - - #protocolos - if dic['titulo']!=None: - tmp_data+='\t\tProtocolo ' + dic['titulo'] + '\n' - tmp_data+='\t\t\n' - tmp_data+='\t\t\t \n' - tmp_data+='\t\t\n' - if dic['txt_assunto']!=None: - txt_assunto = dic['txt_assunto'].replace('&','&') - tmp_data+='\t\t' + txt_assunto + '\n' - if dic['txt_interessado']!=None: - tmp_data+='\t\tInteressado: ' + dic['txt_interessado'] + '\n' - elif dic['nom_autor']!=None: - tmp_data+='\t\tAutor: ' + dic['nom_autor'] + '\n' - if dic['natureza']!=None: - tmp_data+='\t\tNatureza Processo: ' + dic['natureza'] + '\n' - if dic['processo']!=None: - tmp_data+='\t\tClassificação: ' + dic['processo'] + '\n' - if dic['data']!=None: - tmp_data+='\t\tData Protocolo: ' + dic['data'] + '\n' - if dic['anulado']!="": - tmp_data+='\t\t** PROTOCOLO ANULADO ** ' '\n' - - tmp_data+='\t\n' + # espaco inicial + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + + # condicao para a quebra de pagina + tmp_data += '\t\t\n' + + # protocolos + if dic['titulo'] != None: + tmp_data += '\t\tProtocolo ' + \ + dic['titulo'] + '\n' + tmp_data += '\t\t\n' + tmp_data += '\t\t\t \n' + tmp_data += '\t\t\n' + if dic['txt_assunto'] != None: + txt_assunto = dic['txt_assunto'].replace('&', '&') + tmp_data += '\t\t' + txt_assunto + '\n' + if dic['txt_interessado'] != None: + tmp_data += '\t\tInteressado: ' + \ + dic['txt_interessado'] + '\n' + elif dic['nom_autor'] != None: + tmp_data += '\t\tAutor: ' + \ + dic['nom_autor'] + '\n' + if dic['natureza'] != None: + tmp_data += '\t\tNatureza Processo: ' + \ + dic['natureza'] + '\n' + if dic['processo'] != None: + tmp_data += '\t\tClassificação: ' + \ + dic['processo'] + '\n' + if dic['data'] != None: + tmp_data += '\t\tData Protocolo: ' + \ + dic['data'] + '\n' + if dic['anulado'] != "": + tmp_data += '\t\t** PROTOCOLO ANULADO ** ' '\n' + + tmp_data += '\t\n' return tmp_data + def principal(imagem, lst_protocolos, dic_cabecalho, lst_rodape): """Funcao pricipal que gera a estrutura global do arquivo rml""" - arquivoPdf=str(int(time.time()*100))+".pdf" - - tmp_data='' - tmp_data+='\n' - tmp_data+='\n' - tmp_data+='\n' - tmp_data+='\t\n' - tmp_data+=paraStyle() - tmp_data+=protocolos(lst_protocolos) - tmp_data+='\n' - tmp_pdf=parseString(tmp_data) + arquivoPdf = str(int(time.time() * 100)) + ".pdf" + + tmp_data = '' + tmp_data += '\n' + tmp_data += '\n' + tmp_data += '\n' + tmp_data += '\t\n' + tmp_data += paraStyle() + tmp_data += protocolos(lst_protocolos) + tmp_data += '\n' + tmp_pdf = parseString(tmp_data) return tmp_pdf @@ -134,4 +148,5 @@ def principal(imagem, lst_protocolos, dic_cabecalho, lst_rodape): # return "/temp_folder/"+arquivoPdf -# return principal(sessao,imagem,data,lst_protocolos,dic_cabecalho,lst_rodape,dic_filtro) +# return +# principal(sessao,imagem,data,lst_protocolos,dic_cabecalho,lst_rodape,dic_filtro) diff --git a/sapl/relatorios/templates/pdf_protocolo_preparar_pysc.py b/sapl/relatorios/templates/pdf_protocolo_preparar_pysc.py index 6f53849e7..9a3a0d383 100755 --- a/sapl/relatorios/templates/pdf_protocolo_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_protocolo_preparar_pysc.py @@ -1,117 +1,126 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION -data=DateTime().strftime('%d/%m/%Y') +data = DateTime().strftime('%d/%m/%Y') -#Abaixo é gerada a string para o rodapé da página -casa={} -aux=context.sapl_documentos.props_sapl.propertyItems() +# Abaixo é gerada a string para o rodapé da página +casa = {} +aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] -localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) -if len(casa["num_cep"])==8: - cep=casa["num_cep"][:4]+"-"+casa["num_cep"][5:] + casa[item[0]] = item[1] +localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) +if len(casa["num_cep"]) == 8: + cep = casa["num_cep"][:4] + "-" + casa["num_cep"][5:] else: - cep="" - -linha1=casa["end_casa"] -if cep!="": - if casa["end_casa"]!="" and casa["end_casa"]!=None: - linha1 = linha1 + " - " - linha1 = linha1 + "CEP "+cep -if localidade[0].nom_localidade!="" and localidade[0].nom_localidade!=None: - linha1 = linha1 + " - "+localidade[0].nom_localidade+" "+localidade[0].sgl_uf -if casa["num_tel"]!="" and casa["num_tel"]!=None: - linha1 = linha1 + " Tel.: "+ casa["num_tel"] - -linha2=casa["end_web_casa"] -if casa["end_email_casa"]!="" and casa["end_email_casa"]!=None: - if casa["end_web_casa"]!="" and casa["end_web_casa"]!=None: - linha2 = linha2 + " - " - linha2 = linha2 + "E-mail: "+casa["end_email_casa"] - -data_emissao=DateTime().strftime("%d/%m/%Y") -rodape=[linha1,linha2,data_emissao] - -#Por fim, gera-se as entradas para o cabeçalho -estados=context.zsql.localidade_obter_zsql(tip_localidade="u") + cep = "" + +linha1 = casa["end_casa"] +if cep != "": + if casa["end_casa"] != "" and casa["end_casa"] != None: + linha1 = linha1 + " - " + linha1 = linha1 + "CEP " + cep +if localidade[0].nom_localidade != "" and localidade[0].nom_localidade != None: + linha1 = linha1 + " - " + \ + localidade[0].nom_localidade + " " + localidade[0].sgl_uf +if casa["num_tel"] != "" and casa["num_tel"] != None: + linha1 = linha1 + " Tel.: " + casa["num_tel"] + +linha2 = casa["end_web_casa"] +if casa["end_email_casa"] != "" and casa["end_email_casa"] != None: + if casa["end_web_casa"] != "" and casa["end_web_casa"] != None: + linha2 = linha2 + " - " + linha2 = linha2 + "E-mail: " + casa["end_email_casa"] + +data_emissao = DateTime().strftime("%d/%m/%Y") +rodape = [linha1, linha2, data_emissao] + +# Por fim, gera-se as entradas para o cabeçalho +estados = context.zsql.localidade_obter_zsql(tip_localidade="u") for uf in estados: - if localidade[0].sgl_uf==uf.sgl_uf: - nom_estado=uf.nom_localidade - break -cabecalho={} -cabecalho["nom_casa"]=casa["nom_casa"] -cabecalho["nom_estado"]="Estado de "+nom_estado + if localidade[0].sgl_uf == uf.sgl_uf: + nom_estado = uf.nom_localidade + break +cabecalho = {} +cabecalho["nom_casa"] = casa["nom_casa"] +cabecalho["nom_estado"] = "Estado de " + nom_estado # tenta buscar o logotipo da casa LOGO_CASA -if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() +if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() else: - imagem = context.imagens.absolute_url() + "/brasao_transp.gif" - -#Por fim, utiliza o PythonScript para pesquisar os protocolos e gerar os dados - -protocolos=[] -REQUEST=context.REQUEST -for protocolo in context.zsql.protocolo_pesquisar_zsql(tip_protocolo=REQUEST['rad_tip_protocolo'], - cod_protocolo=REQUEST['txt_num_protocolo'], ano_protocolo=REQUEST['txt_ano_protocolo'], - tip_documento=REQUEST['lst_tip_documento'], tip_processo=REQUEST['rad_tip_processo'], - tip_materia=REQUEST['lst_tip_materia'], des_assunto=REQUEST['txt_assunto'], - cod_autor=REQUEST['hdn_cod_autor'], des_interessado=REQUEST['txa_txt_interessado'], - dat_apres=REQUEST['dt_apres'], dat_apres2=REQUEST['dt_apres2']): - dic={} - - dic['titulo']=str(protocolo.cod_protocolo)+'/'+str(protocolo.ano_protocolo) - - dic['data']=context.pysc.iso_to_port_pysc(protocolo.dat_protocolo)+' - Horário:'+protocolo.hor_protocolo - - dic['txt_assunto']=protocolo.txt_assunto_ementa - - dic['txt_interessado']=protocolo.txt_interessado - - dic['nom_autor'] = " " - if protocolo.cod_autor!=None: - for autor in context.zsql.autor_obter_zsql(cod_autor=protocolo.cod_autor): - if autor.des_tipo_autor=='Parlamentar': - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): - dic['nom_autor']=parlamentar.nom_completo - elif autor.des_tipo_autor=='Comissao': - for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): - dic['nom_autor']=comissao.nom_comissao - else: - dic['nom_autor']=autor.nom_autor - - dic['natureza']='' - if protocolo.tip_processo==0: - dic['natureza']='Administrativo' - if protocolo.tip_processo==1: - dic['natureza']='Legislativo' - - dic['processo']=protocolo.des_tipo_materia or protocolo.des_tipo_documento - - dic['anulado']='' - if protocolo.ind_anulado==1: - dic['anulado']='Nulo' - - protocolos.append(dic) - -filtro={} # Dicionário que conterá os dados do filtro + imagem = context.imagens.absolute_url() + "/brasao_transp.gif" + +# Por fim, utiliza o PythonScript para pesquisar os protocolos e gerar os dados + +protocolos = [] +REQUEST = context.REQUEST +for protocolo in context.zsql.protocolo_pesquisar_zsql(tip_protocolo=REQUEST['rad_tip_protocolo'], + cod_protocolo=REQUEST['txt_num_protocolo'], ano_protocolo=REQUEST[ + 'txt_ano_protocolo'], + tip_documento=REQUEST['lst_tip_documento'], tip_processo=REQUEST[ + 'rad_tip_processo'], + tip_materia=REQUEST[ + 'lst_tip_materia'], des_assunto=REQUEST['txt_assunto'], + cod_autor=REQUEST['hdn_cod_autor'], des_interessado=REQUEST[ + 'txa_txt_interessado'], + dat_apres=REQUEST['dt_apres'], dat_apres2=REQUEST['dt_apres2']): + dic = {} + + dic['titulo'] = str(protocolo.cod_protocolo) + '/' + \ + str(protocolo.ano_protocolo) + + dic['data'] = context.pysc.iso_to_port_pysc( + protocolo.dat_protocolo) + ' - Horário:' + protocolo.hor_protocolo + + dic['txt_assunto'] = protocolo.txt_assunto_ementa + + dic['txt_interessado'] = protocolo.txt_interessado + + dic['nom_autor'] = " " + if protocolo.cod_autor != None: + for autor in context.zsql.autor_obter_zsql(cod_autor=protocolo.cod_autor): + if autor.des_tipo_autor == 'Parlamentar': + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar): + dic['nom_autor'] = parlamentar.nom_completo + elif autor.des_tipo_autor == 'Comissao': + for comissao in context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao): + dic['nom_autor'] = comissao.nom_comissao + else: + dic['nom_autor'] = autor.nom_autor + + dic['natureza'] = '' + if protocolo.tip_processo == 0: + dic['natureza'] = 'Administrativo' + if protocolo.tip_processo == 1: + dic['natureza'] = 'Legislativo' + + dic['processo'] = protocolo.des_tipo_materia or protocolo.des_tipo_documento + + dic['anulado'] = '' + if protocolo.ind_anulado == 1: + dic['anulado'] = 'Nulo' + + protocolos.append(dic) + +filtro = {} # Dicionário que conterá os dados do filtro # Atribuições diretas do REQUEST -filtro['numero']=REQUEST.txt_num_protocolo -filtro['ano']=REQUEST.txt_ano_protocolo -filtro['tipo_protocolo']=REQUEST.rad_tip_protocolo -filtro['tipo_processo']=REQUEST.rad_tip_processo -filtro['assunto']=REQUEST.txt_assunto -filtro['autor']=REQUEST.hdn_cod_autor -filtro['interessado']=REQUEST.txa_txt_interessado - -sessao=session.id -caminho = context.pdf_protocolo_gerar(sessao,imagem,data,protocolos,cabecalho,rodape,filtro) -if caminho=='aviso': - return response.redirect('mensagem_emitir_proc') +filtro['numero'] = REQUEST.txt_num_protocolo +filtro['ano'] = REQUEST.txt_ano_protocolo +filtro['tipo_protocolo'] = REQUEST.rad_tip_protocolo +filtro['tipo_processo'] = REQUEST.rad_tip_processo +filtro['assunto'] = REQUEST.txt_assunto +filtro['autor'] = REQUEST.hdn_cod_autor +filtro['interessado'] = REQUEST.txa_txt_interessado + +sessao = session.id +caminho = context.pdf_protocolo_gerar( + sessao, imagem, data, protocolos, cabecalho, rodape, filtro) +if caminho == 'aviso': + return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index 96fb7d581..119cdb761 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -26,7 +26,9 @@ def cabecalho(inf_basicas_dic, imagem): tmp += '\t\t\t\t\n' tmp += '\t\t\t\tResumo da ' + str(inf_basicas_dic['num_sessao_plen']) + 'ª Reunião ' + str(inf_basicas_dic['nom_sessao']) + ' da ' + str( inf_basicas_dic['num_sessao_leg']) + 'ª Sessão Legislativa da \n' - tmp += '\t\t\t\t' + str(inf_basicas_dic['num_legislatura']) + ' Legislatura \n' + tmp += '\t\t\t\t' + \ + str(inf_basicas_dic['num_legislatura']) + \ + ' Legislatura \n' return tmp @@ -159,7 +161,7 @@ def expedientes(lst_expedientes): for idx, expediente in enumerate(lst_expedientes): tmp += '\t\t' + '
' + \ expediente['nom_expediente'] + ':
\n' + \ - '' + \ + '' + \ expediente['txt_expediente'] + '\n' tmp += '\t\t\n' tmp += '\t\t\t \n' @@ -183,11 +185,12 @@ def expediente_materia(lst_expediente_materia): txt_ementa = expediente_materia['txt_ementa'].replace('&', '&') tmp += '
\n' tmp += '\n' tmp += '\t\t\n' @@ -242,11 +245,12 @@ def votacao(lst_votacao): txt_ementa = votacao['txt_ementa'].replace('&', '&') tmp += '\n' tmp += '\n' tmp += '\t\t\n' diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py b/sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py index 547e34b3f..b8f7adda2 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py @@ -1,20 +1,22 @@ import os -request=context.REQUEST -response=request.RESPONSE -session= request.SESSION +request = context.REQUEST +response = request.RESPONSE +session = request.SESSION -if context.REQUEST['data']!='': +if context.REQUEST['data'] != '': dat_inicio_sessao = context.REQUEST['data'] - pauta = [] # lista contendo a pauta da ordem do dia a ser impressa - data = context.pysc.data_converter_pysc(dat_inicio_sessao) # converte data para formato yyyy/mm/dd + pauta = [] # lista contendo a pauta da ordem do dia a ser impressa + # converte data para formato yyyy/mm/dd + data = context.pysc.data_converter_pysc(dat_inicio_sessao) codigo = context.REQUEST['cod_sessao_plen'] # seleciona as matérias que compõem a pauta na data escolhida for sessao in context.zsql.sessao_plenaria_obter_zsql(dat_inicio_sessao=data, cod_sessao_plen=codigo, ind_excluido=0): - inf_basicas_dic = {} # dicionário que armazenará as informacoes basicas da sessao plenaria + inf_basicas_dic = {} # dicionário que armazenará as informacoes basicas da sessao plenaria # seleciona o tipo da sessao plenaria - tipo_sessao = context.zsql.tipo_sessao_plenaria_obter_zsql(tip_sessao=sessao.tip_sessao,ind_excluido=0)[0] + tipo_sessao = context.zsql.tipo_sessao_plenaria_obter_zsql( + tip_sessao=sessao.tip_sessao, ind_excluido=0)[0] inf_basicas_dic["num_sessao_plen"] = sessao.num_sessao_plen inf_basicas_dic["nom_sessao"] = tipo_sessao.nom_sessao inf_basicas_dic["num_legislatura"] = sessao.num_legislatura @@ -23,11 +25,11 @@ if context.REQUEST['data']!='': inf_basicas_dic["hr_inicio_sessao"] = sessao.hr_inicio_sessao inf_basicas_dic["dat_fim_sessao"] = sessao.dat_fim_sessao inf_basicas_dic["hr_fim_sessao"] = sessao.hr_fim_sessao - + # Lista da composicao da mesa diretora lst_mesa = [] - for composicao in context.zsql.composicao_mesa_sessao_obter_zsql(cod_sessao_plen=sessao.cod_sessao_plen,ind_excluido=0): - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=composicao.cod_parlamentar,ind_excluido=0): + for composicao in context.zsql.composicao_mesa_sessao_obter_zsql(cod_sessao_plen=sessao.cod_sessao_plen, ind_excluido=0): + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=composicao.cod_parlamentar, ind_excluido=0): for cargo in context.zsql.cargo_mesa_obter_zsql(cod_cargo=composicao.cod_cargo, ind_excluido=0): dic_mesa = {} dic_mesa['nom_parlamentar'] = parlamentar.nom_parlamentar @@ -38,80 +40,98 @@ if context.REQUEST['data']!='': # Lista de presença na sessão lst_presenca_sessao = [] for presenca in context.zsql.presenca_sessao_obter_zsql(cod_sessao_plen=sessao.cod_sessao_plen, ind_excluido=0): - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=presenca.cod_parlamentar,ind_excluido=0): + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=presenca.cod_parlamentar, ind_excluido=0): dic_presenca = {} dic_presenca["nom_parlamentar"] = parlamentar.nom_parlamentar dic_presenca['sgl_partido'] = parlamentar.sgl_partido lst_presenca_sessao.append(dic_presenca) - # Exibe os Expedientes + # Exibe os Expedientes lst_expedientes = [] dic_expedientes = None for tip_expediente in context.zsql.tipo_expediente_obter_zsql(): - for expediente in context.zsql.expediente_obter_zsql(cod_sessao_plen=sessao.cod_sessao_plen,cod_expediente=tip_expediente.cod_expediente, ind_excluido=0): + for expediente in context.zsql.expediente_obter_zsql(cod_sessao_plen=sessao.cod_sessao_plen, cod_expediente=tip_expediente.cod_expediente, ind_excluido=0): dic_expedientes = {} - dic_expedientes["nom_expediente"] = tip_expediente.nom_expediente + dic_expedientes[ + "nom_expediente"] = tip_expediente.nom_expediente dic_expedientes["txt_expediente"] = expediente.txt_expediente if dic_expedientes: lst_expedientes.append(dic_expedientes) - + # Lista das matérias do Expediente, incluindo o resultado das votacoes - lst_expediente_materia=[] - for expediente_materia in context.zsql.votacao_expediente_materia_obter_zsql(dat_ordem = data, cod_sessao_plen=sessao.cod_sessao_plen, ind_excluido=0): - + lst_expediente_materia = [] + for expediente_materia in context.zsql.votacao_expediente_materia_obter_zsql(dat_ordem=data, cod_sessao_plen=sessao.cod_sessao_plen, ind_excluido=0): + # seleciona os detalhes de uma matéria - materia = context.zsql.materia_obter_zsql(cod_materia=expediente_materia.cod_materia)[0] + materia = context.zsql.materia_obter_zsql( + cod_materia=expediente_materia.cod_materia)[0] dic_expediente_materia = {} dic_expediente_materia["num_ordem"] = expediente_materia.num_ordem - dic_expediente_materia["id_materia"] = materia.sgl_tipo_materia+" "+materia.des_tipo_materia+" "+str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica) - dic_expediente_materia["des_numeracao"]="" + dic_expediente_materia["id_materia"] = materia.sgl_tipo_materia + " " + materia.des_tipo_materia + \ + " " + str(materia.num_ident_basica) + "/" + \ + str(materia.ano_ident_basica) + dic_expediente_materia["des_numeracao"] = "" - numeracao = context.zsql.numeracao_obter_zsql(cod_materia=expediente_materia.cod_materia) + numeracao = context.zsql.numeracao_obter_zsql( + cod_materia=expediente_materia.cod_materia) if len(numeracao): - numeracao = numeracao[0] - dic_expediente_materia["des_numeracao"] = str(numeracao.num_materia)+"/"+str(numeracao.ano_materia) + numeracao = numeracao[0] + dic_expediente_materia["des_numeracao"] = str( + numeracao.num_materia) + "/" + str(numeracao.ano_materia) - tram = context.zsql.tramitacao_turno_obter_zsql(cod_materia=materia.cod_materia, dat_inicio_sessao=data) - dic_expediente_materia["des_turno"]="" + tram = context.zsql.tramitacao_turno_obter_zsql( + cod_materia=materia.cod_materia, dat_inicio_sessao=data) + dic_expediente_materia["des_turno"] = "" if len(tram): - tram_turno = tram[0] - if tram_turno.sgl_turno != "": - for turno in [("P","Primeiro"), ("S","Segundo"), ("U","Único"), ("L","Suplementar"), ("A","Votação Única em Regime de Urgência"), ("B","1ª Votação"), ("C","2ª e 3ª Votações"), ("F", "Final")]: - if tram_turno.sgl_turno == turno[0]: - dic_expediente_materia["des_turno"] = turno[1] + tram_turno = tram[0] + if tram_turno.sgl_turno != "": + for turno in [("P", "Primeiro"), ("S", "Segundo"), ("U", "Único"), ("L", "Suplementar"), ("A", "Votação Única em Regime de Urgência"), ("B", "1ª Votação"), ("C", "2ª e 3ª Votações"), ("F", "Final")]: + if tram_turno.sgl_turno == turno[0]: + dic_expediente_materia["des_turno"] = turno[1] dic_expediente_materia["txt_ementa"] = materia.txt_ementa - dic_expediente_materia["ordem_observacao"] = expediente_materia.ordem_observacao + dic_expediente_materia[ + "ordem_observacao"] = expediente_materia.ordem_observacao dic_expediente_materia["nom_autor"] = "" - autoria = context.zsql.autoria_obter_zsql(cod_materia=expediente_materia.cod_materia, ind_primeiro_autor=1) - if len(autoria) > 0: # se existe autor + autoria = context.zsql.autoria_obter_zsql( + cod_materia=expediente_materia.cod_materia, ind_primeiro_autor=1) + if len(autoria) > 0: # se existe autor autoria = autoria[0] - autor = context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor) + autor = context.zsql.autor_obter_zsql( + cod_autor=autoria.cod_autor) if len(autor) > 0: autor = autor[0] try: - if autor.des_tipo_autor == "Parlamentar": - parlamentar = context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar)[0] - dic_expediente_materia["nom_autor"] = parlamentar.nom_parlamentar - elif autor.des_tipo_autor == "Comissao": - comissao = context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao)[0] - dic_expediente_materia["nom_autor"] = comissao.nom_comissao - elif autor.nom_autor != "": - dic_expediente_materia["nom_autor"] = autor.nom_autor - else: - dic_expediente_materia["nom_autor"] = autor.des_tipo_autor + if autor.des_tipo_autor == "Parlamentar": + parlamentar = context.zsql.parlamentar_obter_zsql( + cod_parlamentar=autor.cod_parlamentar)[0] + dic_expediente_materia[ + "nom_autor"] = parlamentar.nom_parlamentar + elif autor.des_tipo_autor == "Comissao": + comissao = context.zsql.comissao_obter_zsql( + cod_comissao=autor.cod_comissao)[0] + dic_expediente_materia[ + "nom_autor"] = comissao.nom_comissao + elif autor.nom_autor != "": + dic_expediente_materia[ + "nom_autor"] = autor.nom_autor + else: + dic_expediente_materia[ + "nom_autor"] = autor.des_tipo_autor except: - dic_expediente_materia["nom_autor"] = "NC-em" + dic_expediente_materia["nom_autor"] = "NC-em" - dic_expediente_materia["votacao_observacao"]="" + dic_expediente_materia["votacao_observacao"] = "" if expediente_materia.tip_resultado_votacao: - resultado = context.zsql.tipo_resultado_votacao_obter_zsql(tip_resultado_votacao=expediente_materia.tip_resultado_votacao, ind_excluido=0) + resultado = context.zsql.tipo_resultado_votacao_obter_zsql( + tip_resultado_votacao=expediente_materia.tip_resultado_votacao, ind_excluido=0) for i in resultado: dic_expediente_materia["nom_resultado"] = i.nom_resultado if expediente_materia.votacao_observacao: - dic_expediente_materia["votacao_observacao"] = expediente_materia.votacao_observacao + dic_expediente_materia[ + "votacao_observacao"] = expediente_materia.votacao_observacao else: dic_expediente_materia["nom_resultado"] = "Matéria não votada" dic_expediente_materia["votacao_observacao"] = "Vazio" @@ -120,78 +140,97 @@ if context.REQUEST['data']!='': # Lista dos oradores do Expediente lst_oradores_expediente = [] for orador_expediente in context.zsql.oradores_expediente_obter_zsql(cod_sessao_plen=sessao.cod_sessao_plen, ind_excluido=0): - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=orador_expediente.cod_parlamentar,ind_excluido=0): + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=orador_expediente.cod_parlamentar, ind_excluido=0): dic_oradores_expediente = {} - dic_oradores_expediente["num_ordem"] = orador_expediente.num_ordem - dic_oradores_expediente["nom_parlamentar"] = parlamentar.nom_parlamentar - dic_oradores_expediente['sgl_partido'] = parlamentar.sgl_partido + dic_oradores_expediente[ + "num_ordem"] = orador_expediente.num_ordem + dic_oradores_expediente[ + "nom_parlamentar"] = parlamentar.nom_parlamentar + dic_oradores_expediente[ + 'sgl_partido'] = parlamentar.sgl_partido lst_oradores_expediente.append(dic_oradores_expediente) # Lista presença na ordem do dia lst_presenca_ordem_dia = [] - for presenca_ordem_dia in context.zsql.presenca_ordem_dia_obter_zsql(cod_sessao_plen=sessao.cod_sessao_plen,ind_excluido=0): - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=presenca_ordem_dia.cod_parlamentar,ind_excluido=0): + for presenca_ordem_dia in context.zsql.presenca_ordem_dia_obter_zsql(cod_sessao_plen=sessao.cod_sessao_plen, ind_excluido=0): + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=presenca_ordem_dia.cod_parlamentar, ind_excluido=0): dic_presenca_ordem_dia = {} - dic_presenca_ordem_dia['nom_parlamentar'] = parlamentar.nom_parlamentar + dic_presenca_ordem_dia[ + 'nom_parlamentar'] = parlamentar.nom_parlamentar dic_presenca_ordem_dia['sgl_partido'] = parlamentar.sgl_partido lst_presenca_ordem_dia.append(dic_presenca_ordem_dia) - - # Lista das matérias da Ordem do Dia, incluindo o resultado das votacoes - lst_votacao=[] - for votacao in context.zsql.votacao_ordem_dia_obter_zsql(dat_ordem = data, cod_sessao_plen=sessao.cod_sessao_plen, ind_excluido=0): - + + # Lista das matérias da Ordem do Dia, incluindo o resultado das + # votacoes + lst_votacao = [] + for votacao in context.zsql.votacao_ordem_dia_obter_zsql(dat_ordem=data, cod_sessao_plen=sessao.cod_sessao_plen, ind_excluido=0): + # seleciona os detalhes de uma matéria - materia = context.zsql.materia_obter_zsql(cod_materia=votacao.cod_materia)[0] + materia = context.zsql.materia_obter_zsql( + cod_materia=votacao.cod_materia)[0] dic_votacao = {} dic_votacao["num_ordem"] = votacao.num_ordem - dic_votacao["id_materia"] = materia.sgl_tipo_materia+" "+materia.des_tipo_materia+" "+str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica) - dic_votacao["des_numeracao"]="" - numeracao = context.zsql.numeracao_obter_zsql(cod_materia=votacao.cod_materia) + dic_votacao["id_materia"] = materia.sgl_tipo_materia + " " + materia.des_tipo_materia + \ + " " + str(materia.num_ident_basica) + "/" + \ + str(materia.ano_ident_basica) + dic_votacao["des_numeracao"] = "" + numeracao = context.zsql.numeracao_obter_zsql( + cod_materia=votacao.cod_materia) if len(numeracao): - numeracao = numeracao[0] - dic_votacao["des_numeracao"] = str(numeracao.num_materia)+"/"+str(numeracao.ano_materia) - dic_votacao["des_turno"]="" - tramitacao = context.zsql.tramitacao_obter_zsql(cod_materia=materia.cod_materia, ind_ult_tramitacao=1) + numeracao = numeracao[0] + dic_votacao["des_numeracao"] = str( + numeracao.num_materia) + "/" + str(numeracao.ano_materia) + dic_votacao["des_turno"] = "" + tramitacao = context.zsql.tramitacao_obter_zsql( + cod_materia=materia.cod_materia, ind_ult_tramitacao=1) if len(tramitacao): - tramitacao = tramitacao[0] - tram = context.zsql.tramitacao_turno_obter_zsql(cod_materia=materia.cod_materia, dat_inicio_sessao=data) + tramitacao = tramitacao[0] + tram = context.zsql.tramitacao_turno_obter_zsql( + cod_materia=materia.cod_materia, dat_inicio_sessao=data) if len(tram): - tram_turno = tram[0] - if tram_turno.sgl_turno != "": - for turno in [("P","Primeiro"), ("S","Segundo"), ("U","Único"), ("L","Suplementar"), ("F","Final"), ("A","Votação Única em Regime de Urgência"), ("B","1ª Votação"), ("C","2ª e 3ª Votações")]: - if tram_turno.sgl_turno == turno[0]: - dic_votacao["des_turno"] = turno[1] + tram_turno = tram[0] + if tram_turno.sgl_turno != "": + for turno in [("P", "Primeiro"), ("S", "Segundo"), ("U", "Único"), ("L", "Suplementar"), ("F", "Final"), ("A", "Votação Única em Regime de Urgência"), ("B", "1ª Votação"), ("C", "2ª e 3ª Votações")]: + if tram_turno.sgl_turno == turno[0]: + dic_votacao["des_turno"] = turno[1] dic_votacao["txt_ementa"] = materia.txt_ementa dic_votacao["ordem_observacao"] = votacao.ordem_observacao dic_votacao["nom_autor"] = "" - autoria = context.zsql.autoria_obter_zsql(cod_materia=votacao.cod_materia, ind_primeiro_autor=1) - if len(autoria) > 0: # se existe autor + autoria = context.zsql.autoria_obter_zsql( + cod_materia=votacao.cod_materia, ind_primeiro_autor=1) + if len(autoria) > 0: # se existe autor autoria = autoria[0] - autor = context.zsql.autor_obter_zsql(cod_autor=autoria.cod_autor) + autor = context.zsql.autor_obter_zsql( + cod_autor=autoria.cod_autor) if len(autor) > 0: autor = autor[0] - try: - if autor.des_tipo_autor == "Parlamentar": - parlamentar = context.zsql.parlamentar_obter_zsql(cod_parlamentar=autor.cod_parlamentar)[0] - dic_votacao["nom_autor"] = parlamentar.nom_parlamentar - elif autor.des_tipo_autor == "Comissao": - comissao = context.zsql.comissao_obter_zsql(cod_comissao=autor.cod_comissao)[0] - dic_votacao["nom_autor"] = comissao.nom_comissao - elif autor.nom_autor != "": - dic_votacao["nom_autor"] = autor.nom_autor - else: - dic_votacao["nom_autor"] = autor.des_tipo_autor - except: - dic_votacao["nom_autor"] = "NC-od" - - dic_votacao["votacao_observacao"]="" + try: + if autor.des_tipo_autor == "Parlamentar": + parlamentar = context.zsql.parlamentar_obter_zsql( + cod_parlamentar=autor.cod_parlamentar)[0] + dic_votacao[ + "nom_autor"] = parlamentar.nom_parlamentar + elif autor.des_tipo_autor == "Comissao": + comissao = context.zsql.comissao_obter_zsql( + cod_comissao=autor.cod_comissao)[0] + dic_votacao["nom_autor"] = comissao.nom_comissao + elif autor.nom_autor != "": + dic_votacao["nom_autor"] = autor.nom_autor + else: + dic_votacao["nom_autor"] = autor.des_tipo_autor + except: + dic_votacao["nom_autor"] = "NC-od" + + dic_votacao["votacao_observacao"] = "" if votacao.tip_resultado_votacao: - resultado = context.zsql.tipo_resultado_votacao_obter_zsql(tip_resultado_votacao=votacao.tip_resultado_votacao, ind_excluido=0) + resultado = context.zsql.tipo_resultado_votacao_obter_zsql( + tip_resultado_votacao=votacao.tip_resultado_votacao, ind_excluido=0) for i in resultado: dic_votacao["nom_resultado"] = i.nom_resultado if votacao.votacao_observacao: - dic_votacao["votacao_observacao"] = votacao.votacao_observacao + dic_votacao[ + "votacao_observacao"] = votacao.votacao_observacao else: dic_votacao["nom_resultado"] = "Matéria não votada" dic_votacao["votacao_observacao"] = "Vazio" @@ -200,42 +239,46 @@ if context.REQUEST['data']!='': # Lista dos oradores nas Explicações Pessoais lst_oradores = [] for orador in context.zsql.oradores_obter_zsql(cod_sessao_plen=sessao.cod_sessao_plen, ind_excluido=0): - for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=orador.cod_parlamentar,ind_excluido=0): + for parlamentar in context.zsql.parlamentar_obter_zsql(cod_parlamentar=orador.cod_parlamentar, ind_excluido=0): dic_oradores = {} dic_oradores["num_ordem"] = orador.num_ordem dic_oradores["nom_parlamentar"] = parlamentar.nom_parlamentar dic_oradores['sgl_partido'] = parlamentar.sgl_partido lst_oradores.append(dic_oradores) - # obtém as propriedades da casa legislativa para montar o cabeçalho e o rodapé da página - cabecalho={} + # obtém as propriedades da casa legislativa para montar o cabeçalho e o + # rodapé da página + cabecalho = {} # tenta buscar o logotipo da casa LOGO_CASA - if hasattr(context.sapl_documentos.props_sapl,'logo_casa.gif'): - imagem = context.sapl_documentos.props_sapl['logo_casa.gif'].absolute_url() + if hasattr(context.sapl_documentos.props_sapl, 'logo_casa.gif'): + imagem = context.sapl_documentos.props_sapl[ + 'logo_casa.gif'].absolute_url() else: imagem = context.imagens.absolute_url() + "/brasao_transp.gif" - - #Abaixo é gerado o dic do rodapé da página (linha 7) - casa={} - aux=context.sapl_documentos.props_sapl.propertyItems() + + # Abaixo é gerado o dic do rodapé da página (linha 7) + casa = {} + aux = context.sapl_documentos.props_sapl.propertyItems() for item in aux: - casa[item[0]]=item[1] - localidade=context.zsql.localidade_obter_zsql(cod_localidade=casa["cod_localidade"]) - data_emissao= DateTime().strftime("%d/%m/%Y") - rodape= casa - rodape['data_emissao']= data_emissao - - inf_basicas_dic['nom_camara']= casa['nom_casa'] - REQUEST=context.REQUEST - for local in context.zsql.localidade_obter_zsql(cod_localidade = casa['cod_localidade']): - rodape['nom_localidade']= " "+local.nom_localidade - rodape['sgl_uf']= local.sgl_uf + casa[item[0]] = item[1] + localidade = context.zsql.localidade_obter_zsql( + cod_localidade=casa["cod_localidade"]) + data_emissao = DateTime().strftime("%d/%m/%Y") + rodape = casa + rodape['data_emissao'] = data_emissao + + inf_basicas_dic['nom_camara'] = casa['nom_casa'] + REQUEST = context.REQUEST + for local in context.zsql.localidade_obter_zsql(cod_localidade=casa['cod_localidade']): + rodape['nom_localidade'] = " " + local.nom_localidade + rodape['sgl_uf'] = local.sgl_uf # return lst_votacao - sessao=session.id - caminho = context.pdf_sessao_plenaria_gerar(rodape, sessao, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores) - if caminho=='aviso': + sessao = session.id + caminho = context.pdf_sessao_plenaria_gerar(rodape, sessao, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, + lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores) + if caminho == 'aviso': return response.redirect('mensagem_emitir_proc') else: - response.redirect(caminho) + response.redirect(caminho) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 48d4fee60..28e012817 100644 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -505,20 +505,20 @@ def get_sessao_plenaria(sessao, casa): # Lista de presença na sessão lst_presenca_sessao = [] presenca = SessaoPlenariaPresenca.objects.filter( - sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar') + sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar') for parlamentar in [p.parlamentar for p in presenca]: - dic_presenca = {} - dic_presenca["nom_parlamentar"] = parlamentar.nome_parlamentar - partido_sigla = filiacao_data(parlamentar, sessao.data_inicio) + dic_presenca = {} + dic_presenca["nom_parlamentar"] = parlamentar.nome_parlamentar + partido_sigla = filiacao_data(parlamentar, sessao.data_inicio) - dic_presenca['sgl_partido'] = partido_sigla - lst_presenca_sessao.append(dic_presenca) + dic_presenca['sgl_partido'] = partido_sigla + lst_presenca_sessao.append(dic_presenca) # Exibe os Expedientes lst_expedientes = [] expedientes = ExpedienteSessao.objects.filter( - sessao_plenaria=sessao).order_by('tipo__nome') + sessao_plenaria=sessao).order_by('tipo__nome') for e in expedientes: @@ -642,15 +642,15 @@ def get_sessao_plenaria(sessao, casa): # Lista presença na ordem do dia lst_presenca_ordem_dia = [] presenca_ordem_dia = PresencaOrdemDia.objects.filter( - sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar') + sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar') for parlamentar in [p.parlamentar for p in presenca_ordem_dia]: - dic_presenca_ordem_dia = {} - dic_presenca_ordem_dia['nom_parlamentar'] = ( - parlamentar.nome_parlamentar) - sigla = filiacao_data(parlamentar, sessao.data_inicio) + dic_presenca_ordem_dia = {} + dic_presenca_ordem_dia['nom_parlamentar'] = ( + parlamentar.nome_parlamentar) + sigla = filiacao_data(parlamentar, sessao.data_inicio) - dic_presenca_ordem_dia['sgl_partido'] = sigla - lst_presenca_ordem_dia.append(dic_presenca_ordem_dia) + dic_presenca_ordem_dia['sgl_partido'] = sigla + lst_presenca_ordem_dia.append(dic_presenca_ordem_dia) # Lista das matérias da Ordem do Dia, incluindo o resultado das votacoes lst_votacao = [] diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 8cc4d69d2..a1f65e960 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -52,6 +52,7 @@ ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'), ('oradores_exped', 'Oradores do Expediente'), ('oradores_expli', 'Oradores das Explicações Pessoais')] + class SessaoPlenariaForm(ModelForm): class Meta: @@ -70,21 +71,22 @@ class SessaoPlenariaForm(ModelForm): sessoes = SessaoPlenaria.objects.filter(numero=num, sessao_legislativa=sl, legislatura=leg).\ - values_list('id', flat=True) + values_list('id', flat=True) qtd_sessoes = len(sessoes) error = ValidationError('Número de Sessão Plenária Existente') if qtd_sessoes > 0: - if instance.pk: # update + if instance.pk: # update if not instance.pk in sessoes or qtd_sessoes > 1: raise error - else: # create + else: # create raise error return self.cleaned_data + class BancadaForm(ModelForm): class Meta: diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 6789d647d..dd136d3fd 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -406,15 +406,14 @@ class RegistroVotacao(models.Model): blank=True, verbose_name=_('Observações')) data_hora_criacao = models.DateTimeField( - blank=True, null=True, - auto_now_add=True, - verbose_name=_('Data Criação')) + blank=True, null=True, + auto_now_add=True, + verbose_name=_('Data Criação')) data_hora_atualizacao = models.DateTimeField( - blank=True, null=True, - auto_now=True, - verbose_name=_('Data')) - + blank=True, null=True, + auto_now=True, + verbose_name=_('Data')) class Meta: verbose_name = _('Votação') diff --git a/sapl/sessao/serializers.py b/sapl/sessao/serializers.py index c38509f93..b8e64358e 100644 --- a/sapl/sessao/serializers.py +++ b/sapl/sessao/serializers.py @@ -4,6 +4,7 @@ from .models import SessaoPlenaria class SessaoPlenariaSerializer(serializers.Serializer): + class Meta: model = SessaoPlenaria fields = ('tipo', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 2c1d30403..3e47a6da4 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -81,6 +81,7 @@ def reordernar_materias_ordem(request, pk): return HttpResponseRedirect( reverse('sapl.sessao:ordemdia_list', kwargs={'pk': pk})) + def verifica_presenca(request, model, spk): if not model.objects.filter(sessao_plenaria_id=spk).exists(): msg = _('Votação não pode ser aberta sem presenças') @@ -118,7 +119,7 @@ def abrir_votacao_expediente_view(request, pk, spk): if verifica_presenca(request, SessaoPlenariaPresenca, spk): verifica_votacoes_abertas(request, ExpedienteMateria, pk) return HttpResponseRedirect( - reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': spk})) + reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': spk})) @permission_required('sessao.change_ordemdia') @@ -126,7 +127,7 @@ def abrir_votacao_ordem_view(request, pk, spk): if verifica_presenca(request, PresencaOrdemDia, spk): verifica_votacoes_abertas(request, OrdemDia, pk) return HttpResponseRedirect( - reverse('sapl.sessao:ordemdia_list', kwargs={'pk': spk})) + reverse('sapl.sessao:ordemdia_list', kwargs={'pk': spk})) def put_link_materia(context): @@ -172,8 +173,9 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): self.initial['data_ordem'] = SessaoPlenaria.objects.get( pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') max_numero_ordem = OrdemDia.objects.filter( - sessao_plenaria=self.kwargs['pk']).aggregate(Max('numero_ordem'))['numero_ordem__max'] - self.initial['numero_ordem'] = (max_numero_ordem if max_numero_ordem else 0) + 1 + sessao_plenaria=self.kwargs['pk']).aggregate(Max('numero_ordem'))['numero_ordem__max'] + self.initial['numero_ordem'] = ( + max_numero_ordem if max_numero_ordem else 0) + 1 return self.initial def get_success_url(self): @@ -370,7 +372,7 @@ class ExpedienteMateriaCrud(MasterDetailCrud): else: url = '' resultado = obj.registrovotacao_set.get( - materia_id=obj.materia_id) + materia_id=obj.materia_id) resultado_descricao = resultado.tipo_resultado_votacao.nome resultado_observacao = resultado.observacao if self.request.user.has_module_perms(AppConfig.label): @@ -422,8 +424,9 @@ class ExpedienteMateriaCrud(MasterDetailCrud): self.initial['data_ordem'] = SessaoPlenaria.objects.get( pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') max_numero_ordem = ExpedienteMateria.objects.filter( - sessao_plenaria=self.kwargs['pk']).aggregate(Max('numero_ordem'))['numero_ordem__max'] - self.initial['numero_ordem'] = (max_numero_ordem if max_numero_ordem else 0) + 1 + sessao_plenaria=self.kwargs['pk']).aggregate(Max('numero_ordem'))['numero_ordem__max'] + self.initial['numero_ordem'] = ( + max_numero_ordem if max_numero_ordem else 0) + 1 return self.initial def get_success_url(self): @@ -618,12 +621,12 @@ class PresencaView(FormMixin, PresencaMixin, DetailView): if form.is_valid(): # Pegar os presentes salvos no banco presentes_banco = SessaoPlenariaPresenca.objects.filter( - sessao_plenaria_id=self.object.id).values_list( - 'parlamentar_id', flat=True).distinct() + sessao_plenaria_id=self.object.id).values_list( + 'parlamentar_id', flat=True).distinct() # Id dos parlamentares presentes marcados = request.POST.getlist('presenca_ativos') \ - + request.POST.getlist('presenca_inativos') + + request.POST.getlist('presenca_inativos') # Deletar os que foram desmarcados deletar = set(presentes_banco) - set(marcados) @@ -728,12 +731,12 @@ class PresencaOrdemDiaView(FormMixin, PresencaMixin, DetailView): if form.is_valid(): # Pegar os presentes salvos no banco presentes_banco = PresencaOrdemDia.objects.filter( - sessao_plenaria_id=self.object.id).values_list( - 'parlamentar_id', flat=True).distinct() + sessao_plenaria_id=self.object.id).values_list( + 'parlamentar_id', flat=True).distinct() # Id dos parlamentares presentes marcados = request.POST.getlist('presenca_ativos') \ - + request.POST.getlist('presenca_inativos') + + request.POST.getlist('presenca_inativos') # Deletar os que foram desmarcados deletar = set(presentes_banco) - set(marcados) @@ -1017,24 +1020,24 @@ def remove_parlamentar_composicao(request): '%s.delete_%s' % ( AppConfig.label, IntegranteMesa._meta.model_name)): - if 'composicao_mesa' in request.POST: - try: - composicao = IntegranteMesa.objects.get( - id=int(request.POST['composicao_mesa'])) - except ObjectDoesNotExist: - return JsonResponse( - {'msg': ( - 'Composição da Mesa não pôde ser removida!', 0)}) - - composicao.delete() - - return JsonResponse( - {'msg': ( - 'Parlamentar excluido com sucesso!', 1)}) - else: + if 'composicao_mesa' in request.POST: + try: + composicao = IntegranteMesa.objects.get( + id=int(request.POST['composicao_mesa'])) + except ObjectDoesNotExist: return JsonResponse( {'msg': ( - 'Selecione algum parlamentar para ser excluido!', 0)}) + 'Composição da Mesa não pôde ser removida!', 0)}) + + composicao.delete() + + return JsonResponse( + {'msg': ( + 'Parlamentar excluido com sucesso!', 1)}) + else: + return JsonResponse( + {'msg': ( + 'Selecione algum parlamentar para ser excluido!', 0)}) class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): @@ -1255,20 +1258,20 @@ class ResumoView(DetailView): # Oradores nas Explicações Pessoais oradores_explicacoes = [] for orador in Orador.objects.filter(sessao_plenaria_id=self.object.id).order_by('numero_ordem'): - for parlamentar in Parlamentar.objects.filter( - id=orador.parlamentar.id): - partido_sigla = Filiacao.objects.filter( - parlamentar=parlamentar).last() - if not partido_sigla: - sigla = '' - else: - sigla = partido_sigla.partido.sigla - oradores = { - 'numero_ordem': orador.numero_ordem, - 'parlamentar': parlamentar, - 'sgl_partido': sigla - } - oradores_explicacoes.append(oradores) + for parlamentar in Parlamentar.objects.filter( + id=orador.parlamentar.id): + partido_sigla = Filiacao.objects.filter( + parlamentar=parlamentar).last() + if not partido_sigla: + sigla = '' + else: + sigla = partido_sigla.partido.sigla + oradores = { + 'numero_ordem': orador.numero_ordem, + 'parlamentar': parlamentar, + 'sgl_partido': sigla + } + oradores_explicacoes.append(oradores) context.update({'oradores_explicacoes': oradores_explicacoes}) # ===================================================================== From 1ea08c670fabbcb14127cabd679e0dbb9cabfd9d Mon Sep 17 00:00:00 2001 From: Eliseu Egewarth Date: Fri, 18 Aug 2017 07:46:00 -0300 Subject: [PATCH 37/80] Implementa script check_migrations (#1411) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adiciona rotina de checagem de migração Signed-off-by: Eliseu Egewarth * Adiciona Campos sem gerar makemigrations Signed-off-by: Eliseu Egewarth * Move script check_migrations.sh para o estagio 'before_script' Signed-off-by: Eliseu Egewarth * Revert "Adiciona Campos sem gerar makemigrations" This reverts commit c61154ec862daa7540ef16741acf1e464fdb2797. * Adding color for check failures Signed-off-by: Eliseu Egewarth --- .travis.yml | 1 + check_migrations.sh | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100755 check_migrations.sh diff --git a/.travis.yml b/.travis.yml index 0e0a27ad4..eb6abe0c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ before_script: - cp sapl/.env_test sapl/.env - psql -c "CREATE USER sapl WITH PASSWORD 'sapl'" -U postgres; - psql -c "CREATE DATABASE sapl OWNER sapl;" -U postgres + - ./check_migrations.sh script: - ./manage.py migrate diff --git a/check_migrations.sh b/check_migrations.sh new file mode 100755 index 000000000..31f042207 --- /dev/null +++ b/check_migrations.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +python manage.py makemigrations --dry-run --exit + +MIGRATIONS=$? + +NC='\033[0m' + +if [ $MIGRATIONS -eq 0 ]; then + RED='\033[0;31m' + echo -e "${RED}You have unapplied code changes. run 'python manage.py makemigrations' before submitting your code...${NC}" + exit 1 +else + GREEN='\033[0;32m' + echo -e "Working normally..." + exit 0 +fi \ No newline at end of file From e87afd907245b749e5067a6ae3a32596fd596e34 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 18 Aug 2017 14:29:28 -0300 Subject: [PATCH 38/80] =?UTF-8?q?comenta=20linha=20de=20remo=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20rel=20de=20tipos=20em=20compilacao?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/compilacao_data_tables.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/compilacao/compilacao_data_tables.sql b/sapl/compilacao/compilacao_data_tables.sql index 663656548..03d9e93d9 100644 --- a/sapl/compilacao/compilacao_data_tables.sql +++ b/sapl/compilacao/compilacao_data_tables.sql @@ -33,7 +33,7 @@ INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 126, true); -delete from compilacao_tipodispositivorelationship; +#delete from compilacao_tipodispositivorelationship; SELECT pg_catalog.setval('compilacao_tipodispositivorelationship_id_seq', 1, false); INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (112, 1, false, 2, -1, true); INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (114, 1, false, 2, -1, true); From b4ba735fda5d1762267f693d58d59ffcf3e51e9a Mon Sep 17 00:00:00 2001 From: Mariana Mendes Date: Fri, 18 Aug 2017 15:38:30 -0300 Subject: [PATCH 39/80] Corrige erros de PEP 8 --- create_admin.py | 8 +++--- genkey.py | 4 ++- sapl/api/forms.py | 2 +- sapl/api/views.py | 2 +- sapl/base/templatetags/common_tags.py | 1 + sapl/base/tests/teststub_urls.py | 8 +++--- sapl/base/views.py | 3 +-- sapl/legacy/migracao_documentos.py | 4 +-- sapl/legacy/migration.py | 5 +--- sapl/legacy/scripts/street_sweeper.py | 3 ++- sapl/materia/forms.py | 7 +++--- sapl/materia/urls.py | 1 - sapl/materia/views.py | 10 +++----- sapl/norma/apps.py | 3 --- sapl/norma/signals.py | 3 --- sapl/painel/views.py | 5 ++-- sapl/protocoloadm/views.py | 7 +++--- sapl/relatorios/views.py | 5 ++-- sapl/sessao/forms.py | 2 +- sapl/sessao/views.py | 12 ++++++--- sapl/test_urls.py | 36 +++++++++++++-------------- sapl/urls.py | 3 ++- sapl/utils.py | 10 ++++---- 23 files changed, 67 insertions(+), 77 deletions(-) diff --git a/create_admin.py b/create_admin.py index 6b3d52709..6080fbd07 100644 --- a/create_admin.py +++ b/create_admin.py @@ -3,8 +3,6 @@ import sys import django -from sapl import settings - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sapl.settings") @@ -17,12 +15,14 @@ def create_superuser(): email = os.environ['ADMIN_EMAIL'] if 'ADMIN_EMAIL' in os.environ else '' if User.objects.filter(username=username).exists(): - print("[SUPERUSER] User %s already exists. Exiting without change." % username) + print("[SUPERUSER] User %s already exists." + " Exiting without change." % username) sys.exit('ADMIN_USER_EXISTS') else: if not password: print( - "[SUPERUSER] Environment variable $ADMIN_PASSWORD for user %s was not set. Leaving..." % username) + "[SUPERUSER] Environment variable $ADMIN_PASSWORD" + " for user %s was not set. Leaving..." % username) sys.exit('MISSING_ADMIN_PASSWORD') print("[SUPERUSER] Creating superuser...") diff --git a/genkey.py b/genkey.py index 248a67e8f..207989e92 100644 --- a/genkey.py +++ b/genkey.py @@ -2,7 +2,9 @@ import random def generate_secret(): - return ''.join([random.SystemRandom().choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)]) + return (''.join([random.SystemRandom().choice( + 'abcdefghijklmnopqrst' + 'uvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)])) if __name__ == '__main__': print(generate_secret()) diff --git a/sapl/api/forms.py b/sapl/api/forms.py index f8ad6fee7..e9900e0c0 100644 --- a/sapl/api/forms.py +++ b/sapl/api/forms.py @@ -1,4 +1,4 @@ -from django.db.models import F, Q +from django.db.models import Q from django.forms.fields import CharField, MultiValueField from django.forms.widgets import MultiWidget, TextInput from django.utils import timezone diff --git a/sapl/api/views.py b/sapl/api/views.py index 1eccaf5ef..2909d5a0a 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -7,7 +7,7 @@ from rest_framework.generics import ListAPIView from rest_framework.mixins import ListModelMixin, RetrieveModelMixin from rest_framework.permissions import (AllowAny, IsAuthenticated, IsAuthenticatedOrReadOnly) -from rest_framework.viewsets import GenericViewSet, ModelViewSet +from rest_framework.viewsets import GenericViewSet from sapl.api.forms import (AutorChoiceFilterSet, AutoresPossiveisFilterSet, AutorSearchForFieldFilterSet) diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 928aeab5d..9f306d833 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -4,6 +4,7 @@ from django import template from sapl.base.models import AppConfig from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa from sapl.norma.models import NormaJuridica +from sapl.parlamentares import Filiacao from sapl.utils import filiacao_data register = template.Library() diff --git a/sapl/base/tests/teststub_urls.py b/sapl/base/tests/teststub_urls.py index a105489c7..e81cbdb59 100644 --- a/sapl/base/tests/teststub_urls.py +++ b/sapl/base/tests/teststub_urls.py @@ -3,8 +3,6 @@ from django.views.generic.base import TemplateView from sapl.urls import urlpatterns as original_patterns -urlpatterns = original_patterns + patterns('', url(r'^zzzz$', - TemplateView.as_view( - template_name='index.html'), - name='zzzz') - ) +urlpatterns = original_patterns + patterns +('', url(r'^zzzz$', TemplateView.as_view( + template_name='index.html'), name='zzzz')) diff --git a/sapl/base/views.py b/sapl/base/views.py index f8c0832cf..b2ce6ad50 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -7,7 +7,7 @@ from django.contrib.auth.tokens import default_token_generator from django.core.exceptions import ObjectDoesNotExist from django.core.mail import send_mail from django.core.urlresolvers import reverse -from django.db.models import Count, Q +from django.db.models import Count from django.http import HttpResponseRedirect from django.utils.encoding import force_bytes from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode @@ -20,7 +20,6 @@ from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm from sapl.base.models import Autor, TipoAutor from sapl.crud.base import CrudAux from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa -from sapl.parlamentares.models import Parlamentar from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca) from sapl.utils import parlamentares_ativos, sapl_logger diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index ea29a9072..2e514942b 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -3,7 +3,6 @@ import os import re import magic -from django.db.models.signals import post_delete, post_save from sapl.base.models import CasaLegislativa from sapl.materia.models import (DocumentoAcessorio, MateriaLegislativa, @@ -86,7 +85,8 @@ DOCS = { DocumentoAcessorioAdministrativo: [( 'arquivo', 'administrativo/{}', - 'private/documentoacessorioadministrativo/{0}/{0}_acessorio_administrativo{1}') + 'private/documentoacessorioadministrativo/{0}/' + '{0}_acessorio_administrativo{1}') ], } diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 791e6a7b5..7b31f00f9 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -14,15 +14,12 @@ from django.core.exceptions import ObjectDoesNotExist from django.db import OperationalError, ProgrammingError, connections, models from django.db.models import CharField, Count, Max, ProtectedError, TextField from django.db.models.base import ModelBase -from django.db.models.signals import post_delete, post_save from model_mommy import mommy from model_mommy.mommy import foreign_key_required, make from sapl.base.models import Argumento, Autor, Constraint, ProblemaMigracao from sapl.comissoes.models import Comissao, Composicao, Participacao -from sapl.legacy.models import Protocolo as ProtocoloLegado -from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, - MateriaLegislativa, Proposicao, +from sapl.materia.models import (AcompanhamentoMateria, Proposicao, StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, TipoProposicao, Tramitacao) diff --git a/sapl/legacy/scripts/street_sweeper.py b/sapl/legacy/scripts/street_sweeper.py index a33710b1a..d01fd3b52 100644 --- a/sapl/legacy/scripts/street_sweeper.py +++ b/sapl/legacy/scripts/street_sweeper.py @@ -12,7 +12,8 @@ DB = '' SELECT_EXCLUIDOS = "SELECT %s FROM %s WHERE ind_excluido = 1 ORDER BY %s" -REGISTROS_INCONSISTENTES = "DELETE FROM %s WHERE %s in (%s) AND ind_excluido = 0 " +REGISTROS_INCONSISTENTES = "DELETE FROM %s WHERE %s " +"in (%s) AND ind_excluido = 0 " EXCLUI_REGISTRO = "DELETE FROM %s WHERE ind_excluido=1" diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 21d1845d8..f8aa30ea5 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -493,9 +493,10 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput()) - autoria__primeiro_autor = django_filters.BooleanFilter(required=False, - label='Primeiro Autor', - widget=forms.HiddenInput()) + autoria__primeiro_autor = django_filters.BooleanFilter( + required=False, + label='Primeiro Autor', + widget=forms.HiddenInput()) ementa = django_filters.CharFilter(lookup_expr='icontains') diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index 2cbb3a62b..e91505c24 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -23,7 +23,6 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, TramitacaoEmLoteView, UnidadeTramitacaoCrud, proposicao_texto, recuperar_materia) -from . import receivers from .apps import AppConfig app_name = AppConfig.name diff --git a/sapl/materia/views.py b/sapl/materia/views.py index c7c1e2618..9182a220f 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -4,14 +4,11 @@ from string import ascii_letters, digits from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML -from django import forms from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin -from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist +from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse -from django.db.models import Q from django.http import HttpResponse, JsonResponse from django.http.response import Http404, HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect @@ -1735,9 +1732,8 @@ class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): if ('tramitacao__status' in qr and 'tramitacao__unidade_tramitacao_destino' in qr and - qr['tramitacao__status'] and - qr['tramitacao__unidade_tramitacao_destino'] - ): + qr['tramitacao__status'] and + qr['tramitacao__unidade_tramitacao_destino']): lista = filtra_tramitacao_destino_and_status( qr['tramitacao__status'], qr['tramitacao__unidade_tramitacao_destino']) diff --git a/sapl/norma/apps.py b/sapl/norma/apps.py index c4d55ade0..effd4f271 100644 --- a/sapl/norma/apps.py +++ b/sapl/norma/apps.py @@ -6,6 +6,3 @@ class AppConfig(apps.AppConfig): name = 'sapl.norma' label = 'norma' verbose_name = _('Norma Jurídica') - - def ready(self): - from . import signals diff --git a/sapl/norma/signals.py b/sapl/norma/signals.py index 4a5472715..e69de29bb 100644 --- a/sapl/norma/signals.py +++ b/sapl/norma/signals.py @@ -1,3 +0,0 @@ -from django.db.models.signals import post_delete, post_save - -from .models import NormaJuridica diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 13ee7883b..3183c61db 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -1,8 +1,8 @@ -from datetime import date + from django.contrib import messages from django.contrib.auth.decorators import user_passes_test -from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist +from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.db.models import Q from django.http import HttpResponse, JsonResponse @@ -12,7 +12,6 @@ from django.utils.translation import ugettext_lazy as _ from sapl.crud.base import Crud from sapl.painel.apps import AppConfig -from sapl.painel.models import Painel from sapl.parlamentares.models import Filiacao, Votante from sapl.sessao.models import (ExpedienteMateria, OrdemDia, PresencaOrdemDia, RegistroVotacao, SessaoPlenaria, diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 4e7a946c6..fe2390a8c 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -7,11 +7,10 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.db.models import Max, Q -from django.http import (Http404, HttpResponse, HttpResponseRedirect, - JsonResponse) +from django.http import Http404, HttpResponse, JsonResponse from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _ -from django.views.generic import CreateView, DetailView, FormView, ListView +from django.views.generic import CreateView, DetailView, ListView from django.views.generic.base import TemplateView from django_filters.views import FilterView @@ -20,7 +19,7 @@ from sapl.base.models import Autor from sapl.comissoes.models import Comissao from sapl.crud.base import Crud, CrudAux, MasterDetailCrud, make_pagination from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa -from sapl.parlamentares.models import Parlamentar +from sapl.parlamentares.models import Legislatura, Parlamentar from sapl.protocoloadm.models import Protocolo from sapl.utils import create_barcode, get_client_ip diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 28e012817..b40372d3f 100644 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -15,9 +15,8 @@ from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, TramitacaoAdministrativo) from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, IntegranteMesa, Orador, OradorExpediente, - OrdemDia, PresencaOrdemDia, RegistroVotacao, - SessaoPlenaria, SessaoPlenariaPresenca, - TipoExpediente) + OrdemDia, PresencaOrdemDia, SessaoPlenaria, + SessaoPlenariaPresenca) from sapl.settings import STATIC_ROOT from sapl.utils import UF, filiacao_data diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index a1f65e960..150922f18 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -79,7 +79,7 @@ class SessaoPlenariaForm(ModelForm): if qtd_sessoes > 0: if instance.pk: # update - if not instance.pk in sessoes or qtd_sessoes > 1: + if instance.pk not in sessoes or qtd_sessoes > 1: raise error else: # create raise error diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 3e47a6da4..e29a9ee5e 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -173,7 +173,8 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): self.initial['data_ordem'] = SessaoPlenaria.objects.get( pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') max_numero_ordem = OrdemDia.objects.filter( - sessao_plenaria=self.kwargs['pk']).aggregate(Max('numero_ordem'))['numero_ordem__max'] + sessao_plenaria=(self.kwargs['pk']). + aggregate(Max('numero_ordem'))['numero_ordem__max']) self.initial['numero_ordem'] = ( max_numero_ordem if max_numero_ordem else 0) + 1 return self.initial @@ -424,7 +425,8 @@ class ExpedienteMateriaCrud(MasterDetailCrud): self.initial['data_ordem'] = SessaoPlenaria.objects.get( pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') max_numero_ordem = ExpedienteMateria.objects.filter( - sessao_plenaria=self.kwargs['pk']).aggregate(Max('numero_ordem'))['numero_ordem__max'] + sessao_plenaria=(self.kwargs['pk']). + aggregate(Max('numero_ordem'))['numero_ordem__max']) self.initial['numero_ordem'] = ( max_numero_ordem if max_numero_ordem else 0) + 1 return self.initial @@ -1257,7 +1259,8 @@ class ResumoView(DetailView): # ===================================================================== # Oradores nas Explicações Pessoais oradores_explicacoes = [] - for orador in Orador.objects.filter(sessao_plenaria_id=self.object.id).order_by('numero_ordem'): + for orador in Orador.objects.filter( + sessao_plenaria_id=self.object.id).order_by('numero_ordem'): for parlamentar in Parlamentar.objects.filter( id=orador.parlamentar.id): partido_sigla = Filiacao.objects.filter( @@ -2171,7 +2174,8 @@ class VotacaoExpedienteEditView(SessaoPermissionMixin): expediente_id = kwargs['oid'] if(int(request.POST['anular_votacao']) == 1): - for r in RegistroVotacao.objects.filter(expediente_id=expediente_id): + for r in RegistroVotacao.objects.filter( + expediente_id=expediente_id): r.delete() expediente = ExpedienteMateria.objects.get( diff --git a/sapl/test_urls.py b/sapl/test_urls.py index 8b5207276..9daa58fab 100644 --- a/sapl/test_urls.py +++ b/sapl/test_urls.py @@ -174,24 +174,24 @@ apps_url_patterns_prefixs_and_users = { ]}, 'redireciona_urls': { 'prefixs': [ - '/default_index_html', - '/consultas/parlamentar/parlamentar_', - '/consultas/comissao/comissao_', - '/consultas/pauta_sessao/pauta_sessao_', - '/consultas/sessao_plenaria/', - '/relatorios_administrativos/relatorios_administrativos_index_html', - '/tramitacaoMaterias/tramitacaoMaterias', - '/tramitacaoMaterias/materia_mostrar_proc', - '/generico/materia_pesquisar_', - '/consultas/mesa_diretora/mesa_diretora_index_html', - '/consultas/mesa_diretora/parlamentar/parlamentar_', - '/generico/norma_juridica_pesquisar_', - '/consultas/norma_juridica/norma_juridica_mostrar_proc', - '/historicoTramitacoes/historicoTramitacoes', - '/atasSessao', - '/presencaSessao', - '/resumoPropositurasAutor', - '/propositurasAnoAutorTipo', + '/default_index_html', + '/consultas/parlamentar/parlamentar_', + '/consultas/comissao/comissao_', + '/consultas/pauta_sessao/pauta_sessao_', + '/consultas/sessao_plenaria/', + '/relatorios_administrativos/relatorios_administrativos_index_html', + '/tramitacaoMaterias/tramitacaoMaterias', + '/tramitacaoMaterias/materia_mostrar_proc', + '/generico/materia_pesquisar_', + '/consultas/mesa_diretora/mesa_diretora_index_html', + '/consultas/mesa_diretora/parlamentar/parlamentar_', + '/generico/norma_juridica_pesquisar_', + '/consultas/norma_juridica/norma_juridica_mostrar_proc', + '/historicoTramitacoes/historicoTramitacoes', + '/atasSessao', + '/presencaSessao', + '/resumoPropositurasAutor', + '/propositurasAnoAutorTipo', ]}, 'lexml': { 'prefixs': [ diff --git a/sapl/urls.py b/sapl/urls.py index 91d3adeb6..38667b4e7 100644 --- a/sapl/urls.py +++ b/sapl/urls.py @@ -35,7 +35,8 @@ import sapl.relatorios.urls import sapl.sessao.urls urlpatterns = [ - url(r'^$', TemplateView.as_view(template_name='index.html'), name='sapl_index'), + url(r'^$', TemplateView.as_view(template_name='index.html'), + name='sapl_index'), url(r'^message$', TemplateView.as_view(template_name='base.html')), url(r'^admin/', include(admin.site.urls)), diff --git a/sapl/utils.py b/sapl/utils.py index 90581bd99..7c5e1697e 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -4,8 +4,6 @@ import os import re from datetime import date from functools import wraps -from subprocess import PIPE, call -from threading import Thread from unicodedata import normalize as unicodedata_normalize import django_filters @@ -27,7 +25,7 @@ from floppyforms import ClearableFileInput from reversion.admin import VersionAdmin from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row -from sapl.settings import BASE_DIR, PROJECT_DIR +from sapl.settings import BASE_DIR sapl_logger = logging.getLogger(BASE_DIR.name) @@ -541,10 +539,12 @@ def texto_upload_path(instance, filename, subpath='', pk_first=False): if isinstance(instance, (DocumentoAdministrativo, Proposicao)): prefix = 'private' - str_path = './sapl/%(prefix)s/%(model_name)s/%(subpath)s/%(pk)s/%(filename)s' + str_path = ('./sapl/%(prefix)s/%(model_name)s/' + '%(subpath)s/%(pk)s/%(filename)s') if pk_first: - str_path = './sapl/%(prefix)s/%(model_name)s/%(pk)s/%(subpath)s/%(filename)s' + str_path = ('./sapl/%(prefix)s/%(model_name)s/' + '%(pk)s/%(subpath)s/%(filename)s') path = str_path %\ { From 1ccec7c98f7e07522c421583be8748aaada67d9e Mon Sep 17 00:00:00 2001 From: Mariana Mendes Date: Fri, 18 Aug 2017 16:20:28 -0300 Subject: [PATCH 40/80] Corrige erro do import de Filiacao --- sapl/base/templatetags/common_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 9f306d833..ca8e3c40e 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -4,7 +4,7 @@ from django import template from sapl.base.models import AppConfig from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa from sapl.norma.models import NormaJuridica -from sapl.parlamentares import Filiacao +from sapl.parlamentares.models import Filiacao from sapl.utils import filiacao_data register = template.Library() From 1454742993f72087063fed7bbe4d08d086a3a44e Mon Sep 17 00:00:00 2001 From: Mariana Mendes Date: Fri, 18 Aug 2017 16:41:59 -0300 Subject: [PATCH 41/80] =?UTF-8?q?Corrige=20identa=C3=A7=C3=A3o=20de=20acor?= =?UTF-8?q?do=20com=20a=20PEP=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/tests/teststub_urls.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sapl/base/tests/teststub_urls.py b/sapl/base/tests/teststub_urls.py index e81cbdb59..a0ca479e4 100644 --- a/sapl/base/tests/teststub_urls.py +++ b/sapl/base/tests/teststub_urls.py @@ -3,6 +3,7 @@ from django.views.generic.base import TemplateView from sapl.urls import urlpatterns as original_patterns -urlpatterns = original_patterns + patterns -('', url(r'^zzzz$', TemplateView.as_view( - template_name='index.html'), name='zzzz')) +urlpatterns = original_patterns + patterns('', url(r'^zzzz$', + TemplateView.as_view( + template_name='index.html'), + name='zzzz')) From 6c660cf291ad2488af7dfb2ed31ec7e3c7c9e4fc Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 21 Aug 2017 10:17:26 -0300 Subject: [PATCH 42/80] corrige teste de exitencia em queryset exists --- sapl/compilacao/views.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 142b7f46d..1b21d9923 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -1,7 +1,7 @@ -import logging -import sys from collections import OrderedDict from datetime import timedelta +import logging +import sys from braces.views import FormMessagesMixin from django import forms @@ -19,8 +19,8 @@ from django.http.response import (HttpResponse, HttpResponseRedirect, from django.shortcuts import get_object_or_404, redirect from django.utils.dateparse import parse_date from django.utils.encoding import force_text -from django.utils.translation import ugettext_lazy as _ from django.utils.translation import string_concat +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 (CreateView, DeleteView, FormView, @@ -50,6 +50,7 @@ from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED, from sapl.crud.base import Crud, CrudListView, make_pagination from sapl.settings import BASE_DIR + TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota') TipoVideCrud = Crud.build(TipoVide, 'tipo_vide') TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao') @@ -2302,7 +2303,7 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, dispositivos_do_bloco = \ bloco_alteracao.dispositivos_alterados_set.order_by( 'ordem_bloco_atualizador') - if dispositivos_do_bloco.exists: + if dispositivos_do_bloco.exists(): ndp.ordem_bloco_atualizador = dispositivos_do_bloco.last( ).ordem_bloco_atualizador + Dispositivo.INTERVALO_ORDEM From b2aa9735e05f1a32e50ce4d434c95e36faa54cec Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 21 Aug 2017 10:55:26 -0300 Subject: [PATCH 43/80] Alt JS para compatib com alt de css em 0f5331c --- sapl/static/js/app.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/sapl/static/js/app.js b/sapl/static/js/app.js index 697564024..7b18b6aad 100644 --- a/sapl/static/js/app.js +++ b/sapl/static/js/app.js @@ -8,8 +8,6 @@ function initTinymce(elements, readonly=false) { menubar: "edit format table tools", toolbar: "undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent", tools: "inserttable", - border_css: "/static/styles/style_tinymce.css", - content_css: "/static/styles/style_tinymce.css", } if (readonly) { From 7decbc1e4baee7a2920ae1d6d43df90e2efce6af Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 21 Aug 2017 11:36:48 -0300 Subject: [PATCH 44/80] Fix #1412 --- sapl/templates/sessao/presenca.html | 2 +- sapl/templates/sessao/presenca_ordemdia.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/templates/sessao/presenca.html b/sapl/templates/sessao/presenca.html index 869848769..3b9ebf541 100644 --- a/sapl/templates/sessao/presenca.html +++ b/sapl/templates/sessao/presenca.html @@ -62,7 +62,7 @@ {% for parlamentar, check in view.get_presencas %} {% if check %}
-
+
{% endif %} {% endfor %} diff --git a/sapl/templates/sessao/presenca_ordemdia.html b/sapl/templates/sessao/presenca_ordemdia.html index 430d9c6f0..ccc730bcd 100644 --- a/sapl/templates/sessao/presenca_ordemdia.html +++ b/sapl/templates/sessao/presenca_ordemdia.html @@ -64,7 +64,7 @@ {% for parlamentar, check in view.get_presencas_ordem %} {% if check %}
-
+
{% endif %} {% endfor %} From 114d24c53beb15d3726a7c11c1f3c781972f19e7 Mon Sep 17 00:00:00 2001 From: Mariana Mendes Date: Mon, 21 Aug 2017 16:37:20 -0300 Subject: [PATCH 45/80] Fix #1410 --- sapl/api/serializers.py | 1 - sapl/api/views.py | 2 -- sapl/compilacao/views.py | 1 - sapl/materia/apps.py | 3 --- sapl/materia/signals.py | 2 -- sapl/materia/views.py | 2 +- sapl/protocoloadm/views.py | 7 ++++--- sapl/sessao/views.py | 2 -- 8 files changed, 5 insertions(+), 15 deletions(-) diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py index 9853d8718..9219bf0e4 100644 --- a/sapl/api/serializers.py +++ b/sapl/api/serializers.py @@ -110,7 +110,6 @@ class SessaoPlenariaSerializer(serializers.ModelSerializer): def __init__(self, *args, **kwargs): super(SessaoPlenariaSerializer, self).__init__(args, kwargs) - casa = CasaLegislativa.objects.first() def get_pk_sessao(self, obj): return obj.pk diff --git a/sapl/api/views.py b/sapl/api/views.py index 2909d5a0a..9853e6af0 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -173,8 +173,6 @@ class AutoresProvaveisListView(ListAPIView): serializer_class = ChoiceSerializer def get_queryset(self): - queryset = ListAPIView.get_queryset(self) - params = {'content_type__isnull': False} tipo = '' diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 142b7f46d..c0071cdd2 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -142,7 +142,6 @@ class IntegracaoTaView(TemplateView): implemente, ou passe `None` para as chaves que são fixas. """) - map_fields = self.map_fields ta_values = getattr(self, 'ta_values', {}) item = get_object_or_404(self.model, pk=kwargs['pk']) diff --git a/sapl/materia/apps.py b/sapl/materia/apps.py index ecc8d09de..3ac053d1b 100644 --- a/sapl/materia/apps.py +++ b/sapl/materia/apps.py @@ -6,6 +6,3 @@ class AppConfig(apps.AppConfig): name = 'sapl.materia' label = 'materia' verbose_name = _('Matéria') - - def ready(self): - from . import signals diff --git a/sapl/materia/signals.py b/sapl/materia/signals.py index e774b0191..b9afb6ee9 100644 --- a/sapl/materia/signals.py +++ b/sapl/materia/signals.py @@ -1,6 +1,4 @@ import django.dispatch -from django.db.models.signals import post_delete, post_save -from .models import DocumentoAcessorio, MateriaLegislativa tramitacao_signal = django.dispatch.Signal(providing_args=['post', 'request']) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 9182a220f..9e9b63e45 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1,4 +1,4 @@ -from datetime import date, datetime +from datetime import datetime from random import choice from string import ascii_letters, digits diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index fe2390a8c..4804849b9 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -10,7 +10,7 @@ from django.db.models import Max, Q from django.http import Http404, HttpResponse, JsonResponse from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _ -from django.views.generic import CreateView, DetailView, ListView +from django.views.generic import CreateView, ListView from django.views.generic.base import TemplateView from django_filters.views import FilterView @@ -29,7 +29,7 @@ from .forms import (AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm, ProtocoloFilterSet, ProtocoloMateriaForm, TramitacaoAdmEditForm, TramitacaoAdmForm) from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo, - Protocolo, StatusTramitacaoAdministrativo, + StatusTramitacaoAdministrativo, TipoDocumentoAdministrativo, TramitacaoAdministrativo) TipoDocumentoAdministrativoCrud = CrudAux.build( @@ -470,7 +470,8 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): autor_parlamentar = Autor.objects.filter( content_type=model_parlamentar, object_id__in=lista_parlamentares) - lista_comissoes = Comissao.objects.filter(Q(data_extincao__isnull=True) | Q( + lista_comissoes = Comissao.objects.filter(Q( + data_extincao__isnull=True) | Q( data_extincao__gt=date.today())).values_list('id', flat=True) model_comissao = ContentType.objects.get_for_model(Comissao) autor_comissoes = Autor.objects.filter( diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index e29a9ee5e..410f62ac7 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -728,8 +728,6 @@ class PresencaOrdemDiaView(FormMixin, PresencaMixin, DetailView): self.object = self.get_object() form = self.get_form() - pk = kwargs['pk'] - if form.is_valid(): # Pegar os presentes salvos no banco presentes_banco = PresencaOrdemDia.objects.filter( From dfefe2f2db8e3b5b348793464371a6b4a16f7de9 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 21 Aug 2017 15:44:41 -0300 Subject: [PATCH 46/80] Adiciona script pre-commit do git --- check_migrations.sh | 23 ++++++++++++++++------- scripts/hooks/instalar_hooks_git.sh | 5 +++++ scripts/hooks/pre-commit | 15 +++++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) create mode 100755 scripts/hooks/instalar_hooks_git.sh create mode 100755 scripts/hooks/pre-commit diff --git a/check_migrations.sh b/check_migrations.sh index 31f042207..ff545a3c5 100755 --- a/check_migrations.sh +++ b/check_migrations.sh @@ -1,5 +1,15 @@ #!/bin/bash +# TODO: Após migrar para Django 1.10 usar +# +# ./manage.py makemigrations --check --dry-run +# +# ATENÇÃO: a chamada atual termina com exit 1 se NÃO HÁ migração a ser aplicada +# ou seja, termina com "erro" se está tudo bem! +# A chamada do django 1.10 INVERTE ISSO. +# +# https://docs.djangoproject.com/en/1.10/ref/django-admin/#cmdoption-makemigrations-check + python manage.py makemigrations --dry-run --exit MIGRATIONS=$? @@ -7,11 +17,10 @@ MIGRATIONS=$? NC='\033[0m' if [ $MIGRATIONS -eq 0 ]; then - RED='\033[0;31m' - echo -e "${RED}You have unapplied code changes. run 'python manage.py makemigrations' before submitting your code...${NC}" - exit 1 -else - GREEN='\033[0;32m' - echo -e "Working normally..." - exit 0 + RED='\033[0;31m' + echo + echo -e "${RED}ALGUMAS ALTERAÇÕES EXIGEM MIGRAÇÃO.${NC}" + echo -e "${RED}RODE 'python manage.py makemigrations' ANTES DE SUBMETER SEU CÓDIGO...${NC}" + echo + exit 1 fi \ No newline at end of file diff --git a/scripts/hooks/instalar_hooks_git.sh b/scripts/hooks/instalar_hooks_git.sh new file mode 100755 index 000000000..4c276b069 --- /dev/null +++ b/scripts/hooks/instalar_hooks_git.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +ln -s -f `pwd`/scripts/hooks/pre-commit .git/hooks/pre-commit + + diff --git a/scripts/hooks/pre-commit b/scripts/hooks/pre-commit new file mode 100755 index 000000000..3df8427d6 --- /dev/null +++ b/scripts/hooks/pre-commit @@ -0,0 +1,15 @@ +#!/bin/bash + +# aqui apenas reportamos, não impedimos o commit +./check_qa.sh +if [ $? -eq 1 ] +then + RED='\033[0;31m' + echo + echo -e "${RED}#### POR FAVOR, CORRIJA OS PROBLEMAS APONTADOS!!! ####${NC}" + echo +fi + +# se os comandos a seguir falharem impedimos o commit +set -e +./check_migrations.sh From dea929d8bca5cd9b45554201927ffca249d9b87b Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 21 Aug 2017 19:15:36 -0300 Subject: [PATCH 47/80] Fixes #1284 (#1416) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes #1284 * Conserta bug em pesquisa * Adiciona condição de prosseguimento --- sapl/base/views.py | 50 ++++++++++++++++++- ...latorioMateriasPorAnoAutorTipo_filter.html | 48 +++++++++--------- 2 files changed, 72 insertions(+), 26 deletions(-) diff --git a/sapl/base/views.py b/sapl/base/views.py index b2ce6ad50..9f53e957f 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -19,7 +19,8 @@ from haystack.views import SearchView from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm from sapl.base.models import Autor, TipoAutor from sapl.crud.base import CrudAux -from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa +from sapl.materia.models import (Autoria, MateriaLegislativa, + TipoMateriaLegislativa) from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca) from sapl.utils import parlamentares_ativos, sapl_logger @@ -344,6 +345,47 @@ class RelatorioMateriasPorAnoAutorTipoView(FilterView): filterset_class = RelatorioMateriasPorAnoAutorTipoFilterSet template_name = 'base/RelatorioMateriasPorAnoAutorTipo_filter.html' + def get_materias_autor_ano(self, ano): + + autorias = Autoria.objects.filter(materia__ano=ano).values( + 'autor', + 'materia__tipo__sigla', + 'materia__tipo__descricao').annotate( + total=Count('materia__tipo')).order_by( + 'autor', + 'materia__tipo') + + autores_ids = set([i['autor'] for i in autorias]) + + autores = dict((a.id, a) for a in Autor.objects.filter( + id__in=autores_ids)) + + relatorio = [] + visitados = set() + curr = None + + for a in autorias: + # se mudou autor, salva atual, caso existente, e reinicia `curr` + if a['autor'] not in visitados: + if curr: + relatorio.append(curr) + + curr = {} + curr['autor'] = autores[a['autor']] + curr['materia'] = [] + curr['total'] = 0 + + visitados.add(a['autor']) + + # atualiza valores + curr['materia'].append((a['materia__tipo__descricao'], a['total'])) + curr['total'] += a['total'] + # adiciona o ultimo + relatorio.append(curr) + + return relatorio + + def get_filterset_kwargs(self, filterset_class): super(RelatorioMateriasPorAnoAutorTipoView, self).get_filterset_kwargs(filterset_class) @@ -368,6 +410,12 @@ class RelatorioMateriasPorAnoAutorTipoView(FilterView): qr = self.request.GET.copy() context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + if 'ano' in self.request.GET and self.request.GET['ano']: + ano = int(self.request.GET['ano']) + context['relatorio'] = self.get_materias_autor_ano(ano) + else: + context['relatorio'] = [] + return context diff --git a/sapl/templates/base/RelatorioMateriasPorAnoAutorTipo_filter.html b/sapl/templates/base/RelatorioMateriasPorAnoAutorTipo_filter.html index 2498c08be..23ef5e275 100644 --- a/sapl/templates/base/RelatorioMateriasPorAnoAutorTipo_filter.html +++ b/sapl/templates/base/RelatorioMateriasPorAnoAutorTipo_filter.html @@ -13,6 +13,29 @@



+ {% for r in relatorio %} +

{{r.autor}}


+
' + diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index 62494a856..53caa2db1 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -14,6 +14,7 @@ SessaoPlenaria: TipoResultadoVotacao: {% trans 'Tipo de Resultado da Votação' %}: - nome + - natureza TipoExpediente: {% trans 'Tipo de Expediente' %}: From b1a0fa1b76cf99c57900862123d7480d08609c16 Mon Sep 17 00:00:00 2001 From: Edward Date: Wed, 16 Aug 2017 17:54:40 -0300 Subject: [PATCH 28/80] Fixes #1358 (#1405) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes #1358 * Adiciona lembrete de mudança de campo observacao --- sapl/sessao/views.py | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 4ab7ea4f8..47329b761 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -161,7 +161,7 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): public = [RP_LIST, RP_DETAIL] class BaseMixin(MasterDetailCrud.BaseMixin): - list_field_names = ['numero_ordem', 'materia', 'observacao', + list_field_names = ['numero_ordem', 'materia', 'materia__ementa', 'resultado'] class CreateView(MasterDetailCrud.CreateView): @@ -312,7 +312,7 @@ class ExpedienteMateriaCrud(MasterDetailCrud): class BaseMixin(MasterDetailCrud.BaseMixin): list_field_names = ['numero_ordem', 'materia', - 'observacao', 'resultado'] + 'materia__ementa', 'resultado'] class ListView(MasterDetailCrud.ListView): ordering = ['numero_ordem', 'materia', 'resultado'] @@ -772,7 +772,7 @@ class ListMateriaOrdemDiaView(FormMixin, DetailView): materias_ordem = [] for o in ordem: - ementa = o.observacao + ementa = o.materia.ementa titulo = o.materia numero = o.numero_ordem @@ -832,7 +832,7 @@ class ListMateriaOrdemDiaView(FormMixin, DetailView): materias_ordem = [] for o in ordem: - ementa = o.observacao + ementa = o.materia.ementa titulo = o.materia numero = o.numero_ordem @@ -1162,7 +1162,7 @@ class ResumoView(DetailView): materias_expediente = [] for m in materias: - ementa = m.observacao + ementa = m.materia.ementa titulo = m.materia numero = m.numero_ordem @@ -1222,7 +1222,7 @@ class ResumoView(DetailView): sessao_plenaria_id=self.object.id) materias_ordem = [] for o in ordem: - ementa = o.observacao + ementa = o.materia.ementa titulo = o.materia numero = o.numero_ordem @@ -1432,7 +1432,7 @@ class VotacaoEditView(SessaoPermissionMixin): ordem = OrdemDia.objects.get(id=ordem_id) - materia = {'materia': ordem.materia, 'ementa': ordem.observacao} + materia = {'materia': ordem.materia, 'ementa': ordem.materia.ementa} context.update({'materia': materia}) votacao = RegistroVotacao.objects.filter( @@ -1486,7 +1486,7 @@ class VotacaoView(SessaoPermissionMixin): qtde_presentes = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.object.id).count() - materia = {'materia': ordem.materia, 'ementa': ordem.observacao} + materia = {'materia': ordem.materia, 'ementa': ordem.materia.ementa} context.update({'votacao_titulo': titulo, 'materia': materia, 'total_presentes': qtde_presentes}) @@ -1512,7 +1512,7 @@ class VotacaoView(SessaoPermissionMixin): qtde_presentes = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.object.id).count() - materia = {'materia': ordem.materia, 'ementa': ordem.observacao} + materia = {'materia': ordem.materia, 'ementa': ordem.materia.ementa} context.update({'votacao_titulo': titulo, 'materia': materia, 'total_presentes': qtde_presentes}) @@ -1649,7 +1649,7 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): materia = {'materia': materia_votacao.materia, 'ementa': sub( ' ', ' ', strip_tags( - materia_votacao.observacao))} + materia_votacao.materia.ementa))} context = {'materia': materia, 'object': self.get_object(), 'parlamentares': self.get_parlamentares(presentes), 'tipos': self.get_tipos_votacao(), @@ -1833,7 +1833,7 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): raise Http404() materia = ordem.materia - observacao = ordem.observacao + ementa = ordem.materia.ementa elif self.expediente: expediente_id = kwargs['oid'] @@ -1846,7 +1846,7 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): raise Http404() materia = expediente.materia - observacao = expediente.observacao + ementa = expediente.materia.ementa votos = VotoParlamentar.objects.filter(votacao_id=votacao.id) @@ -1859,7 +1859,7 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): materia = {'materia': materia, 'ementa': sub( - ' ', ' ', strip_tags(observacao))} + ' ', ' ', strip_tags(ementa))} context.update({'materia': materia}) votacao_existente = {'observacao': sub( @@ -1956,7 +1956,7 @@ class VotacaoNominalExpedienteDetailView(DetailView): materia = {'materia': expediente.materia, 'ementa': sub( - ' ', ' ', strip_tags(expediente.observacao))} + ' ', ' ', strip_tags(expediente.materia.ementa))} context.update({'materia': materia}) votacao_existente = {'observacao': sub( @@ -2007,7 +2007,7 @@ class VotacaoExpedienteView(SessaoPermissionMixin): sessao_plenaria_id=self.object.id).count() materia = {'materia': expediente.materia, - 'ementa': expediente.observacao} + 'ementa': expediente.materia.ementa} context.update({'votacao_titulo': titulo, 'materia': materia, 'total_presentes': qtde_presentes}) @@ -2034,7 +2034,7 @@ class VotacaoExpedienteView(SessaoPermissionMixin): sessao_plenaria_id=self.object.id).count() materia = {'materia': expediente.materia, - 'ementa': expediente.observacao} + 'ementa': expediente.materia.ementa} context.update({'votacao_titulo': titulo, 'materia': materia, 'total_presentes': qtde_presentes}) @@ -2137,7 +2137,7 @@ class VotacaoExpedienteEditView(SessaoPermissionMixin): expediente = ExpedienteMateria.objects.get(id=expediente_id) materia = {'materia': expediente.materia, - 'ementa': expediente.observacao} + 'ementa': expediente.materia.ementa} context.update({'materia': materia}) try: @@ -2232,7 +2232,7 @@ class PautaSessaoDetailView(DetailView): materias_expediente = [] for m in materias: - ementa = m.observacao + ementa = m.materia.ementa titulo = m.materia numero = m.numero_ordem situacao = m.materia.tramitacao_set.last().status @@ -2289,7 +2289,7 @@ class PautaSessaoDetailView(DetailView): materias_ordem = [] for o in ordem: - ementa = o.observacao + ementa = o.materia.ementa titulo = o.materia numero = o.numero_ordem situacao = o.materia.tramitacao_set.last().status @@ -2510,6 +2510,7 @@ class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin, expediente = ExpedienteMateria() expediente.sessao_plenaria_id = self.kwargs['pk'] expediente.materia_id = materia.id + # TODO: o campo observacao deve ser uma copia de ML.ementa? expediente.observacao = MateriaLegislativa.objects.get( pk=materia.id).ementa if lista_materias_expediente: @@ -2578,6 +2579,7 @@ class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente): ordem_dia = OrdemDia() ordem_dia.sessao_plenaria_id = self.kwargs['pk'] ordem_dia.materia_id = materia.id + # TODO: o campo observacao deve ser uma copia de ML.ementa? ordem_dia.observacao = MateriaLegislativa.objects.get( pk=materia.id).ementa if lista_materias_ordem_dia: From f897ddcd8272fc76f896b892d6e7f37fbd3141f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Thu, 17 Aug 2017 15:16:28 -0300 Subject: [PATCH 29/80] Fix #1406 (#1407) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolve ordenação de oradores das explicações pessoais no resumo da sessão --- sapl/sessao/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 47329b761..83217c54e 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1253,7 +1253,7 @@ class ResumoView(DetailView): # ===================================================================== # Oradores nas Explicações Pessoais oradores_explicacoes = [] - for orador in Orador.objects.filter(sessao_plenaria_id=self.object.id): + for orador in Orador.objects.filter(sessao_plenaria_id=self.object.id).order_by('numero_ordem'): for parlamentar in Parlamentar.objects.filter( id=orador.parlamentar.id): partido_sigla = Filiacao.objects.filter( From 90f29b89b31a01c85f935b41e0ad6e1a7f1d9d7b Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Thu, 17 Aug 2017 15:17:39 -0300 Subject: [PATCH 30/80] Fix #1178 refatora presenca parlamentar (#1398) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Iniciar a refatoração * Muda a lógica de geração do relatório * Adiciona filiações partidárias dos parlamentares no intervalo solicitado * Resolve detalhes após code review --- sapl/base/templatetags/common_tags.py | 9 +- sapl/base/views.py | 93 ++++++++++++------- sapl/parlamentares/views.py | 27 +----- .../base/RelatorioPresencaSessao_filter.html | 3 +- .../sessao/blocos_resumo/lista_presenca.html | 2 +- .../lista_presenca_ordem_dia.html | 2 +- sapl/utils.py | 43 +++++++-- 7 files changed, 106 insertions(+), 73 deletions(-) diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index a72eb6a54..72dab26ba 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -182,5 +182,10 @@ def urldetail(obj): obj._meta.app_config.name, obj._meta.model_name) @register.filter -def filiacao_epoca_filter(parlamentar, sessao): - return filiacao_data(parlamentar, sessao.data_inicio) +def filiacao_data_filter(parlamentar, data_inicio): + return filiacao_data(parlamentar, data_inicio) + + +@register.filter +def filiacao_intervalo_filter(parlamentar, date_range): + return filiacao_data(parlamentar, date_range[0], date_range[1]) diff --git a/sapl/base/views.py b/sapl/base/views.py index 718774d46..1450bc16b 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -4,6 +4,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.models import Group from django.contrib.auth.tokens import default_token_generator +from django.core.exceptions import ObjectDoesNotExist from django.core.mail import send_mail from django.core.urlresolvers import reverse from django.db.models import Count, Q @@ -21,8 +22,8 @@ from sapl.base.models import Autor, TipoAutor from sapl.crud.base import CrudAux from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.parlamentares.models import Parlamentar -from sapl.sessao.models import PresencaOrdemDia, SessaoPlenaria -from sapl.utils import sapl_logger +from sapl.sessao.models import PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca +from sapl.utils import parlamentares_ativos, sapl_logger from .forms import (CasaLegislativaForm, ConfiguracoesAppForm, RelatorioAtasFilterSet, @@ -209,15 +210,6 @@ class RelatorioPresencaSessaoView(FilterView): filterset_class = RelatorioPresencaSessaoFilterSet template_name = 'base/RelatorioPresencaSessao_filter.html' - def calcular_porcentagem_presenca(self, - parlamentares, - total_sessao, - total_ordemdia): - for p in parlamentares: - p.sessao_porc = round(p.sessao_count * 100 / total_sessao, 1) - p.ordemdia_porc = round(p.ordemdia_count * 100 / total_ordemdia, 1) - return parlamentares - def get_context_data(self, **kwargs): context = super(RelatorioPresencaSessaoView, self).get_context_data(**kwargs) @@ -234,37 +226,68 @@ class RelatorioPresencaSessaoView(FilterView): sufixo = 'sessao_plenaria__data_inicio__range' param0 = {'%s' % sufixo: _range} - param1 = {'presencaordemdia__%s' % sufixo: _range} - param2 = {'sessaoplenariapresenca__%s' % sufixo: _range} - - pls = Parlamentar.objects.filter( - (Q(**param1) | Q(presencaordemdia__isnull=True)) & - (Q(**param2) | Q(sessaoplenariapresenca__isnull=True)) - ).annotate( - sessao_count=Count( - 'sessaoplenariapresenca__sessao_plenaria', - distinct=True), - ordemdia_count=Count( - 'presencaordemdia__sessao_plenaria', - distinct=True), - sessao_porc=Count(0), - ordemdia_porc=Count(0) - ).exclude( - sessao_count=0, - ordemdia_count=0) + + # Parlamentares com Mandato no intervalo de tempo (Ativos) + parlamentares_qs = parlamentares_ativos( + _range[0], _range[1]).order_by('nome_parlamentar') + parlamentares_id = parlamentares_qs.values_list( + 'id', flat=True) + + # Presenças de cada Parlamentar em Sessões + presenca_sessao = SessaoPlenariaPresenca.objects.filter( + parlamentar_id__in=parlamentares_id, + sessao_plenaria__data_inicio__range=_range).values_list( + 'parlamentar_id').annotate( + sessao_count=Count('id')) + + # Presenças de cada Ordem do Dia + presenca_ordem = PresencaOrdemDia.objects.filter( + parlamentar_id__in=parlamentares_id, + sessao_plenaria__data_inicio__range=_range).values_list( + 'parlamentar_id').annotate( + sessao_count=Count('id')) total_ordemdia = PresencaOrdemDia.objects.filter( **param0).distinct('sessao_plenaria__id').order_by( 'sessao_plenaria__id').count() - self.calcular_porcentagem_presenca( - pls, - context['object_list'].count(), - total_ordemdia) - + total_sessao = context['object_list'].count() + + # Completa o dicionario as informacoes parlamentar/sessao/ordem + parlamentares_presencas = [] + for i, p in enumerate(parlamentares_qs): + parlamentares_presencas.append({ + 'parlamentar': p, + 'sessao_porc': 0, + 'ordemdia_porc': 0 + }) + try: + sessao_count = presenca_sessao.get(parlamentar_id=p.id)[1] + except ObjectDoesNotExist: + sessao_count = 0 + try: + ordemdia_count = presenca_ordem.get(parlamentar_id=p.id)[1] + except ObjectDoesNotExist: + ordemdia_count = 0 + + parlamentares_presencas[i].update({ + 'sessao_count': sessao_count, + 'ordemdia_count': ordemdia_count + }) + + if total_sessao != 0: + parlamentares_presencas[i].update( + {'sessao_porc': round( + sessao_count * 100 / total_sessao, 2)}) + if total_ordemdia != 0: + parlamentares_presencas[i].update( + {'ordemdia_porc': round( + ordemdia_count * 100 / total_ordemdia, 2)}) + + context['date_range'] = _range context['total_ordemdia'] = total_ordemdia context['total_sessao'] = context['object_list'].count() - context['parlamentares'] = pls + context['parlamentares'] = parlamentares_presencas context['periodo'] = ( self.request.GET['data_inicio_0'] + ' - ' + self.request.GET['data_inicio_1']) diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 00c0c5aef..9af917370 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -24,6 +24,7 @@ from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux, from sapl.materia.models import Autoria from sapl.materia.models import Proposicao, Relatoria from sapl.parlamentares.apps import AppConfig +from sapl.utils import parlamentares_ativos from .forms import (FiliacaoForm, LegislaturaCreateForm, LegislaturaUpdateForm, MandatoForm, ParlamentarCreateForm, ParlamentarForm, @@ -235,32 +236,6 @@ def json_date_convert(date): year=int(ano)) -def parlamentares_ativos(data_inicio, data_fim=None): - ''' - :param data_inicio: define a data de inicial do período desejado - :param data_fim: define a data final do período desejado - :return: queryset dos parlamentares ativos naquele período - ''' - mandatos_ativos = Mandato.objects.filter(Q( - data_inicio_mandato__lte=data_inicio, - data_fim_mandato__isnull=True) | Q( - data_inicio_mandato__lte=data_inicio, - data_fim_mandato__gte=data_inicio)) - if data_fim: - mandatos_ativos = mandatos_ativos | Mandato.objects.filter( - data_inicio_mandato__gte=data_inicio, - data_inicio_mandato__lte=data_fim) - else: - mandatos_ativos = mandatos_ativos | Mandato.objects.filter( - data_inicio_mandato__gte=data_inicio) - - parlamentares_id = mandatos_ativos.values_list( - 'parlamentar_id', - flat=True).distinct('parlamentar_id') - - return Parlamentar.objects.filter(id__in=parlamentares_id) - - def frente_atualiza_lista_parlamentares(request): ''' :param request: recebe os parâmetros do GET da chamada Ajax diff --git a/sapl/templates/base/RelatorioPresencaSessao_filter.html b/sapl/templates/base/RelatorioPresencaSessao_filter.html index c9c92328b..ea3b1fca2 100644 --- a/sapl/templates/base/RelatorioPresencaSessao_filter.html +++ b/sapl/templates/base/RelatorioPresencaSessao_filter.html @@ -1,6 +1,7 @@ {% extends "crud/list.html" %} {% load i18n %} {% load crispy_forms_tags %} +{% load common_tags %} {% block base_content %} {% if not filter_url %} @@ -37,7 +38,7 @@
{{p}} / {{p.filiacao_atual|default:"Sem Partido"}}{{p.parlamentar}} / {{p.parlamentar|filiacao_intervalo_filter:date_range|default:"Sem Partido"}} {{p.sessao_count}} {{p.sessao_porc}} {{p.ordemdia_count}} ' + txt_ementa + '' + \ - str(expediente_materia['nom_resultado']) + '\n' + '' + str(expediente_materia['nom_resultado']) + \ + '\n' + '' if expediente_materia['votacao_observacao'] != txt_ementa: - tmp += str(expediente_materia['votacao_observacao']) + tmp += str(expediente_materia['votacao_observacao']) else: - tmp += ' ' + tmp += ' ' tmp += '
' + txt_ementa + '' + \ - str(votacao['nom_resultado']) + '\n' + '' + str(votacao['nom_resultado']) + \ + '\n' + '' if votacao['votacao_observacao'] != txt_ementa: - tmp += str(votacao['votacao_observacao']) + tmp += str(votacao['votacao_observacao']) else: - tmp += ' ' + tmp += ' ' tmp += '
+ + + + + + + + {% for i in r.materia %} + + + + {% endfor %} + +
Natureza da ProposituraQuantidade
{{i.0}}{{i.1}}
+

Total: {{r.total}}


+
+
+ {% endfor %} +

+ @@ -30,31 +53,6 @@ {% endfor %}
QUADRO GERAL
- - - - - - - - - - - {% for materia in object_list %} - - - - - - {% endfor %} - -
MatériaEmentaAutor(es)
- {{materia.tipo.descricao}} - {{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}} - {{materia.ementa}} - {% for autor in materia.autoria_set.all %} - {{autor.autor}}
- {% endfor %} -
{% endif %} {% endblock base_content %} From c600e698ca673428d21057cbb72d07ac68dd827b Mon Sep 17 00:00:00 2001 From: Eliseu Egewarth Date: Tue, 22 Aug 2017 10:49:35 -0300 Subject: [PATCH 48/80] Fix #1370 remove criacao user de autor e votante (#1417) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix #1370 Remove Criação de usuário das telas de Autor e Votante Signed-off-by: Eliseu Egewarth * Minor QA Fix. Fix import ordering and remove unused import Signed-off-by: Eliseu Egewarth --- sapl/base/forms.py | 60 +------------------ sapl/compilacao/views.py | 7 +-- sapl/parlamentares/forms.py | 60 +++++-------------- sapl/parlamentares/views.py | 3 +- sapl/templates/base/autor_form.html | 6 +- .../templates/parlamentares/votante_list.html | 2 +- 6 files changed, 22 insertions(+), 116 deletions(-) diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 13880703c..3a751b64a 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -8,7 +8,6 @@ from django.contrib.auth import get_user_model from django.contrib.auth.forms import (AuthenticationForm, PasswordResetForm, SetPasswordForm) from django.contrib.auth.models import Group, User -from django.contrib.auth.password_validation import validate_password from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db import models, transaction @@ -29,15 +28,8 @@ from sapl.utils import (RANGE_ANOS, ChoiceWithoutValidationField, from .models import AppConfig, CasaLegislativa -ACTION_CREATE_USERS_AUTOR_CHOICE = [ - ('C', _('Criar novo Usuário')), - ('A', _('Associar um usuário existente')), - ('N', _('Autor sem Usuário de Acesso ao Sapl')), -] - ACTION_CREATE_USERS_AUTOR_CHOICE = [ - ('C', _('Criar novo Usuário')), ('A', _('Associar um usuário existente')), ('N', _('Autor sem Usuário de Acesso ao Sapl')), ] @@ -256,42 +248,7 @@ class AutorForm(ModelForm): if self.instance.user: qs_user = qs_user.exclude(pk=self.instance.user.pk) - if cd['action_user'] == 'C': - param_username = {get_user_model().USERNAME_FIELD: cd['username']} - if User.objects.filter(**param_username).exists(): - raise ValidationError( - _('Já existe usuário com o username "%s". ' - 'Para utilizar esse username você deve selecionar ' - '"Associar um usuário existente".') % cd['username']) - - if ('senha' not in cd or 'senha_confirma' not in cd or - not cd['senha'] or not cd['senha_confirma']): - raise ValidationError(_( - 'A senha e sua confirmação devem ser informadas.')) - msg = _('As senhas não conferem.') - self.valida_igualdade(cd['senha'], cd['senha_confirma'], msg) - - try: - validate_password(self.cleaned_data['senha']) - except ValidationError as error: - raise ValidationError(error) - - if ('email' not in cd or 'confirma_email' not in cd or - not cd['email'] or not cd['confirma_email']): - raise ValidationError(_( - 'O email e sua confirmação devem ser informados.')) - msg = _('Os emails não conferem.') - self.valida_igualdade(cd['email'], cd['confirma_email'], msg) - - if not settings.DEBUG: - if qs_user.filter(email=cd['email']).exists(): - raise ValidationError(_('Este email já foi cadastrado.')) - - if qs_autor.filter(user__email=cd['email']).exists(): - raise ValidationError( - _('Já existe um Autor com este email.')) - - elif cd['action_user'] == 'A': + if cd['action_user'] == 'A': param_username = {get_user_model().USERNAME_FIELD: cd['username']} if not User.objects.filter(**param_username).exists(): raise ValidationError( @@ -362,22 +319,7 @@ class AutorForm(ModelForm): if not u.is_active: u.is_active = settings.DEBUG u.save() - elif self.cleaned_data['action_user'] == 'C': - - param_username = { - get_user_model().USERNAME_FIELD: self.cleaned_data['username']} - - if get_user_model().USERNAME_FIELD != 'email': - param_username['email'] = self.cleaned_data['email'] - - u = get_user_model().objects.create(**param_username) - u.set_password(self.cleaned_data['senha']) - # Define usuário como ativo em ambiente de desenvolvimento - # pode logar sem a necessidade de passar pela validação de email - # troque par False para testar o envio de email em desenvolvimento - u.is_active = settings.DEBUG - u.save() autor.user = u if not autor.tipo.content_type: diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index e30e047ff..2096f9cb0 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -1,7 +1,7 @@ -from collections import OrderedDict -from datetime import timedelta import logging import sys +from collections import OrderedDict +from datetime import timedelta from braces.views import FormMessagesMixin from django import forms @@ -19,8 +19,8 @@ from django.http.response import (HttpResponse, HttpResponseRedirect, from django.shortcuts import get_object_or_404, redirect from django.utils.dateparse import parse_date from django.utils.encoding import force_text -from django.utils.translation import string_concat from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import string_concat from django.views.generic.base import TemplateView from django.views.generic.detail import DetailView from django.views.generic.edit import (CreateView, DeleteView, FormView, @@ -50,7 +50,6 @@ from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED, from sapl.crud.base import Crud, CrudListView, make_pagination from sapl.settings import BASE_DIR - TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota') TipoVideCrud = Crud.build(TipoVide, 'tipo_vide') TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao') diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 63a1bb0d9..e6cac615e 100644 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -275,44 +275,23 @@ class FrenteForm(ModelForm): class VotanteForm(ModelForm): - senha = forms.CharField( - max_length=20, - label=_('Senha'), - required=True, - widget=forms.PasswordInput()) - - senha_confirma = forms.CharField( - max_length=20, - label=_('Confirmar Senha'), - required=True, - widget=forms.PasswordInput()) username = forms.CharField( label=_('Usuário'), required=True, max_length=30) - email = forms.EmailField( - required=True, - label=_('Email')) - - email_confirma = forms.EmailField( - required=True, - label=_('Confirmar Email')) - class Meta: model = Votante - fields = ['username', 'senha', 'senha_confirma', 'email', - 'email_confirma'] + fields = ['username'] def __init__(self, *args, **kwargs): - row1 = to_row([('username', 4), ('senha', 4), ('senha_confirma', 4)]) - row2 = to_row([('email', 6), ('email_confirma', 6)]) + row1 = to_row([('username', 4)]) self.helper = FormHelper() self.helper.layout = Layout( Fieldset(_('Votante'), - row1, row2, form_actions(save_label='Salvar')) + row1, form_actions(save_label='Salvar')) ) super(VotanteForm, self).__init__(*args, **kwargs) @@ -327,23 +306,19 @@ class VotanteForm(ModelForm): cd = self.cleaned_data username = cd['username'] - if get_user_model().objects.filter(username=username).exists(): - raise ValidationError(_('Não foi possível salvar registro,\ - pois usuário existente')) - - if ('senha' not in cd or 'senha_confirma' not in cd or - not cd['senha'] or not cd['senha_confirma']): + user = get_user_model().objects.filter(username=username) + if not user.exists(): raise ValidationError(_( - 'A senha e sua confirmação devem ser informadas.')) - msg = _('As senhas não conferem.') - self.valida_igualdade(cd['senha'], cd['senha_confirma'], msg) - - if ('email' not in cd or 'email_confirma' not in cd or - not cd['email'] or not cd['email_confirma']): + "{} [{}] {}".format( + 'Não foi possível vincular usuário. Usuário', + username, + 'não existe'))) + if Votante.objects.filter(user=user[0].pk).exists(): raise ValidationError(_( - 'O email e sua confirmação devem ser informados.')) - msg = _('Os emails não conferem.') - self.valida_igualdade(cd['email'], cd['email_confirma'], msg) + "{} [{}] {}".format( + 'Não foi possível vincular usuário. Usuário', + username, + 'já esta vinculado à outro parlamentar'))) return self.cleaned_data @@ -352,12 +327,7 @@ class VotanteForm(ModelForm): votante = super(VotanteForm, self).save(commit) # Cria user - u = User.objects.create( - username=self.cleaned_data['username'], - email=self.cleaned_data['email']) - u.set_password(self.cleaned_data['senha']) - u.save() - + u = User.objects.get(username=self.cleaned_data['username']) # Adiciona user ao grupo g = Group.objects.filter(name=SAPL_GROUP_VOTANTE)[0] u.groups.add(g) diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 2890dc384..46a6dc7d4 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -66,8 +66,7 @@ class VotanteView(MasterDetailCrud): def delete(self, *args, **kwargs): obj = self.get_object() - if obj.user: - obj.user.delete() + obj.delete() return HttpResponseRedirect( reverse('sapl.parlamentares:votante_list', kwargs={'pk': obj.parlamentar.pk})) diff --git a/sapl/templates/base/autor_form.html b/sapl/templates/base/autor_form.html index ec7ddfe7e..b5c16fd9f 100644 --- a/sapl/templates/base/autor_form.html +++ b/sapl/templates/base/autor_form.html @@ -95,11 +95,7 @@ $(document).ready(function(){ $('#div_id_username input').prop('readonly', ''); - if (event.target.value == 'C') { - $('.new_user_fields, #div_id_username').removeClass('hidden'); - $('input[name=username]').val(''); - } - else if (event.target.value == 'N') { + if (event.target.value == 'N') { $('.new_user_fields').addClass('hidden'); if ($('input[name=username]').attr('data') != '') $('.radiogroup-status').removeClass('hidden'); diff --git a/sapl/templates/parlamentares/votante_list.html b/sapl/templates/parlamentares/votante_list.html index 8c9847846..58756f6be 100644 --- a/sapl/templates/parlamentares/votante_list.html +++ b/sapl/templates/parlamentares/votante_list.html @@ -7,7 +7,7 @@
{% if view.create_url %} - {% blocktrans with verbose_name=view.verbose_name %} Adicionar {{ verbose_name }} {% endblocktrans %} + {% blocktrans with verbose_name=view.verbose_name %} Vincular {{ verbose_name }} {% endblocktrans %} {% endif %} {% block more_buttons %}{% endblock more_buttons %} From 6b5077ccde0626335865c6e89e434169829a99ee Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 23 Aug 2017 12:17:01 -0300 Subject: [PATCH 49/80] =?UTF-8?q?ajst=20config=20de=20datas=20de=20vig?= =?UTF-8?q?=C3=AAncia=20na=20app=20compila=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/views.py | 79 +++++++++++++++++++++--------- sapl/static/styles/compilacao.scss | 5 ++ 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 2096f9cb0..54693dae1 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -1881,27 +1881,30 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): try: Dispositivo.objects.filter( - (Q(ta=dvt.ta) & Q(ta_publicado__isnull=True)) | - Q(ta_publicado=dvt.ta) + ta=dvt.ta, ta_publicado__isnull=True ).update( dispositivo_vigencia=dvt, inicio_vigencia=dvt.inicio_vigencia, inicio_eficacia=dvt.inicio_eficacia) - dps = Dispositivo.objects.filter(dispositivo_vigencia_id=dvt.pk, - ta_publicado_id=dvt.ta_id) - with transaction.atomic(): - for d in dps: - if d.dispositivo_substituido: - ds = d.dispositivo_substituido - ds.fim_vigencia = d.inicio_vigencia - timedelta(days=1) - ds.fim_eficacia = d.inicio_eficacia - timedelta(days=1) - d.save() + Dispositivo.objects.filter(ta_publicado=dvt.ta + ).update( + dispositivo_vigencia=dvt, + inicio_vigencia=dvt.inicio_eficacia, + inicio_eficacia=dvt.inicio_eficacia) - if d.dispositivo_subsequente: - ds = d.dispositivo_subsequente - d.fim_vigencia = ds.inicio_vigencia - timedelta(days=1) - d.fim_eficacia = ds.inicio_eficacia - timedelta(days=1) + dps = Dispositivo.objects.filter(dispositivo_vigencia=dvt) + for d in dps: + if d.dispositivo_substituido: + ds = d.dispositivo_substituido + ds.fim_vigencia = d.inicio_vigencia - timedelta(days=1) + ds.fim_eficacia = d.inicio_eficacia - timedelta(days=1) + ds.save() + + if d.dispositivo_subsequente: + ds = d.dispositivo_subsequente + d.fim_vigencia = ds.inicio_vigencia - timedelta(days=1) + d.fim_eficacia = ds.inicio_eficacia - timedelta(days=1) d.save() data = {'pk': dvt.pk, @@ -1948,6 +1951,19 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): else: raise Exception('Não existe perfil padrão!') + if not base.dispositivo_vigencia and tipo.dispositivo_de_alteracao: + data = {'pk': base.pk, + 'pai': [base.dispositivo_pai.pk, ]} + self.set_message( + data, 'danger', + _('Registros de Compilação só podem ser realizados ' + 'após a conclusão do lançamento deste ' + 'Texto Articulado.\nConclua o Lançamento, defina ' + 'o dispositivo de vigência e as datas de vigência e ' + 'eficácia. Só depois retorne ' + 'realizando Registros de Compilação.'), modal=True) + return data + dp_irmao = None dp_pai = None for dp in parents: @@ -2353,6 +2369,27 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, data.update({'pk': bloco_alteracao.pk, 'pai': [bloco_alteracao.pk, ]}) + if not bloco_alteracao.dispositivo_vigencia: + """ + essa restrição não é necessária pois os lançamentos podem ser + aleatórios, desde que se no fim do lançamento, datas de vigência + e eficácia, bem como o dispositivo de vigência da norma seja + configurado. Como nos primeiros testes com usuários ficou + demonstrado o esquecimento/desconhecimento dessa tarefa, + principalmente em documentos que possuem datas de vigência e/ou + eficácia diferentes da data de publicação. Apesar de já aparecer + na rotina de notificações, achei por bem colocr essa restrição. + """ + self.set_message( + data, 'danger', + _('Registros de Compilação só podem ser realizados ' + 'após a conclusão do lançamento deste ' + 'Texto Articulado.\r\nConclua o Lançamento, defina ' + 'o dispositivo de vigência e as datas de vigência e ' + 'eficácia. Só depois retorne ' + 'realizando Registros de Compilação.'), modal=True) + return data + history = dispositivo_a_alterar.history() for d in history: @@ -2377,11 +2414,10 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, ndp = Dispositivo.new_instance_based_on( dispositivo_a_alterar, dispositivo_a_alterar.tipo_dispositivo) - ndp.auto_inserido = dispositivo_a_alterar.auto_inserido - ndp.rotulo = dispositivo_a_alterar.rotulo ndp.publicacao = bloco_alteracao.publicacao + if not revogacao: ndp.texto = dispositivo_a_alterar.texto else: @@ -2389,12 +2425,8 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, ndp.dispositivo_de_revogacao = True ndp.dispositivo_vigencia = bloco_alteracao.dispositivo_vigencia - if ndp.dispositivo_vigencia: - ndp.inicio_eficacia = ndp.dispositivo_vigencia.inicio_eficacia - ndp.inicio_vigencia = ndp.dispositivo_vigencia.inicio_vigencia - else: - ndp.inicio_eficacia = bloco_alteracao.inicio_eficacia - ndp.inicio_vigencia = bloco_alteracao.inicio_vigencia + ndp.inicio_eficacia = ndp.dispositivo_vigencia.inicio_eficacia + ndp.inicio_vigencia = ndp.dispositivo_vigencia.inicio_eficacia try: ordem = dispositivo_a_alterar.criar_espaco( @@ -2420,6 +2452,7 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, dispositivos_do_bloco = \ bloco_alteracao.dispositivos_alterados_set.order_by( 'ordem_bloco_atualizador') + if dispositivos_do_bloco.exists(): ndp.ordem_bloco_atualizador = dispositivos_do_bloco.last( ).ordem_bloco_atualizador + Dispositivo.INTERVALO_ORDEM diff --git a/sapl/static/styles/compilacao.scss b/sapl/static/styles/compilacao.scss index 946852703..8646401bd 100644 --- a/sapl/static/styles/compilacao.scss +++ b/sapl/static/styles/compilacao.scss @@ -1355,6 +1355,11 @@ a:link:after, a:visited:after { display: inline; } } +.lista-dispositivo { + &.controls-radio-checkbox { + border: 0px; + } +} .cp-nav-parents { & > .dropdown-menu { left: 0; From fdb6eb9a8b0e07c8fb995d315fb11952c0087abc Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 23 Aug 2017 12:42:25 -0300 Subject: [PATCH 50/80] "Fixes" #1424 --- sapl/sessao/forms.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 150922f18..3f98f4e23 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -75,7 +75,10 @@ class SessaoPlenariaForm(ModelForm): qtd_sessoes = len(sessoes) - error = ValidationError('Número de Sessão Plenária Existente') + error = ValidationError( + "Número de Sessão Plenária já existente " + "para a Legislatura e Sessão Legislativa informadas. " + "Favor escolher um número distinto.") if qtd_sessoes > 0: if instance.pk: # update From cbe6ca024568573a737bdf6f99b1335d3ea4aed7 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 23 Aug 2017 12:59:49 -0300 Subject: [PATCH 51/80] =?UTF-8?q?alt=20layout=20das=20op=C3=A7=C3=B5es=20d?= =?UTF-8?q?e=20notif=20em=20app=20compila=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/forms.py | 1 - sapl/base/tests/teststub_urls.py | 6 +++--- sapl/base/views.py | 15 +++++++------ sapl/compilacao/forms.py | 13 ++++++------ sapl/compilacao/views.py | 16 ++++++++------ sapl/materia/signals.py | 1 - sapl/test_urls.py | 36 ++++++++++++++++---------------- 7 files changed, 45 insertions(+), 43 deletions(-) diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 3a751b64a..992ce558b 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -28,7 +28,6 @@ from sapl.utils import (RANGE_ANOS, ChoiceWithoutValidationField, from .models import AppConfig, CasaLegislativa - ACTION_CREATE_USERS_AUTOR_CHOICE = [ ('A', _('Associar um usuário existente')), ('N', _('Autor sem Usuário de Acesso ao Sapl')), diff --git a/sapl/base/tests/teststub_urls.py b/sapl/base/tests/teststub_urls.py index a0ca479e4..fbdcbb443 100644 --- a/sapl/base/tests/teststub_urls.py +++ b/sapl/base/tests/teststub_urls.py @@ -4,6 +4,6 @@ from django.views.generic.base import TemplateView from sapl.urls import urlpatterns as original_patterns urlpatterns = original_patterns + patterns('', url(r'^zzzz$', - TemplateView.as_view( - template_name='index.html'), - name='zzzz')) + TemplateView.as_view( + template_name='index.html'), + name='zzzz')) diff --git a/sapl/base/views.py b/sapl/base/views.py index 9f53e957f..cae2052c9 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -367,15 +367,15 @@ class RelatorioMateriasPorAnoAutorTipoView(FilterView): for a in autorias: # se mudou autor, salva atual, caso existente, e reinicia `curr` if a['autor'] not in visitados: - if curr: - relatorio.append(curr) + if curr: + relatorio.append(curr) - curr = {} - curr['autor'] = autores[a['autor']] - curr['materia'] = [] - curr['total'] = 0 + curr = {} + curr['autor'] = autores[a['autor']] + curr['materia'] = [] + curr['total'] = 0 - visitados.add(a['autor']) + visitados.add(a['autor']) # atualiza valores curr['materia'].append((a['materia__tipo__descricao'], a['total'])) @@ -385,7 +385,6 @@ class RelatorioMateriasPorAnoAutorTipoView(FilterView): return relatorio - def get_filterset_kwargs(self, filterset_class): super(RelatorioMateriasPorAnoAutorTipoView, self).get_filterset_kwargs(filterset_class) diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py index 64a2e48a3..c728bf230 100644 --- a/sapl/compilacao/forms.py +++ b/sapl/compilacao/forms.py @@ -1,7 +1,8 @@ from datetime import timedelta from crispy_forms.bootstrap import (Alert, FieldWithButtons, FormActions, - InlineRadios, StrictButton) + InlineCheckboxes, InlineRadios, + StrictButton) from crispy_forms.helper import FormHelper from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, Layout, Row, Submit) @@ -1249,20 +1250,20 @@ class DispositivoEdicaoAlteracaoForm(ModelForm): class TextNotificacoesForm(Form): - type_notificacoes = forms.ChoiceField( + type_notificacoes = forms.MultipleChoiceField( label=_('Níveis de Notificações'), choices=[('default', _('Dispositivos sem Notificações!')), ('success', _('Informações!')), ('info', _('Boas Práticas!')), ('warning', _('Alertas!')), ('danger', _('Erros!'))], - required=False) + required=False, + widget=widgets.CheckboxSelectMultiple()) def __init__(self, *args, **kwargs): - field_type_notificacoes = to_row([(Field( - 'type_notificacoes', - template="compilacao/layout/bootstrap_btn_checkbox.html"), 10), + field_type_notificacoes = to_row([(InlineCheckboxes( + 'type_notificacoes'), 10), (Submit('submit-form', _('Filtrar'), css_class='btn btn-primary pull-right'), 2)]) diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 54693dae1..cf0a2703e 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -2371,14 +2371,14 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, if not bloco_alteracao.dispositivo_vigencia: """ - essa restrição não é necessária pois os lançamentos podem ser - aleatórios, desde que se no fim do lançamento, datas de vigência + Essa restrição não é necessária pois os lançamentos podem ser + aleatórios, desde que no fim do lançamento, datas de vigência e eficácia, bem como o dispositivo de vigência da norma seja - configurado. Como nos primeiros testes com usuários ficou + configurado. Como nos primeiros testes com usuários ficou demonstrado o esquecimento/desconhecimento dessa tarefa, principalmente em documentos que possuem datas de vigência e/ou - eficácia diferentes da data de publicação. Apesar de já aparecer - na rotina de notificações, achei por bem colocr essa restrição. + eficácia diferentes da data de publicação, apesar de já aparecer + na rotina de notificações, achei por bem colocar essa restrição. """ self.set_message( data, 'danger', @@ -3070,10 +3070,14 @@ class TextNotificacoesView(CompMixin, ListView, FormView): self.object = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) return super(TextNotificacoesView, self).get(request, *args, **kwargs) + def post(self, request, *args, **kwargs): + self.object = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) + return FormView.post(self, request, *args, **kwargs) + def get_context_data(self, **kwargs): if 'object' not in kwargs: kwargs['object'] = self.object - return super(TextNotificacoesView, self).get_context_data(**kwargs) + return ListView.get_context_data(self, **kwargs) def get_success_url(self): return reverse_lazy('sapl.compilacao:ta_text_notificacoes', diff --git a/sapl/materia/signals.py b/sapl/materia/signals.py index b9afb6ee9..3381ff3a6 100644 --- a/sapl/materia/signals.py +++ b/sapl/materia/signals.py @@ -1,4 +1,3 @@ import django.dispatch - tramitacao_signal = django.dispatch.Signal(providing_args=['post', 'request']) diff --git a/sapl/test_urls.py b/sapl/test_urls.py index 9daa58fab..8b5207276 100644 --- a/sapl/test_urls.py +++ b/sapl/test_urls.py @@ -174,24 +174,24 @@ apps_url_patterns_prefixs_and_users = { ]}, 'redireciona_urls': { 'prefixs': [ - '/default_index_html', - '/consultas/parlamentar/parlamentar_', - '/consultas/comissao/comissao_', - '/consultas/pauta_sessao/pauta_sessao_', - '/consultas/sessao_plenaria/', - '/relatorios_administrativos/relatorios_administrativos_index_html', - '/tramitacaoMaterias/tramitacaoMaterias', - '/tramitacaoMaterias/materia_mostrar_proc', - '/generico/materia_pesquisar_', - '/consultas/mesa_diretora/mesa_diretora_index_html', - '/consultas/mesa_diretora/parlamentar/parlamentar_', - '/generico/norma_juridica_pesquisar_', - '/consultas/norma_juridica/norma_juridica_mostrar_proc', - '/historicoTramitacoes/historicoTramitacoes', - '/atasSessao', - '/presencaSessao', - '/resumoPropositurasAutor', - '/propositurasAnoAutorTipo', + '/default_index_html', + '/consultas/parlamentar/parlamentar_', + '/consultas/comissao/comissao_', + '/consultas/pauta_sessao/pauta_sessao_', + '/consultas/sessao_plenaria/', + '/relatorios_administrativos/relatorios_administrativos_index_html', + '/tramitacaoMaterias/tramitacaoMaterias', + '/tramitacaoMaterias/materia_mostrar_proc', + '/generico/materia_pesquisar_', + '/consultas/mesa_diretora/mesa_diretora_index_html', + '/consultas/mesa_diretora/parlamentar/parlamentar_', + '/generico/norma_juridica_pesquisar_', + '/consultas/norma_juridica/norma_juridica_mostrar_proc', + '/historicoTramitacoes/historicoTramitacoes', + '/atasSessao', + '/presencaSessao', + '/resumoPropositurasAutor', + '/propositurasAnoAutorTipo', ]}, 'lexml': { 'prefixs': [ From 37860c5be0a5c8abb0ab4a193e85768537e001bf Mon Sep 17 00:00:00 2001 From: Edward Date: Wed, 23 Aug 2017 16:22:50 -0300 Subject: [PATCH 52/80] Fixes #1423 (#1425) --- sapl/sessao/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 410f62ac7..b118b43f7 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -199,6 +199,7 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): return 'OrdemDiaDetail' class ListView(MasterDetailCrud.ListView): + paginated_by = None ordering = ['numero_ordem', 'materia', 'resultado'] def get_context_data(self, **kwargs): @@ -319,6 +320,7 @@ class ExpedienteMateriaCrud(MasterDetailCrud): 'materia__ementa', 'resultado'] class ListView(MasterDetailCrud.ListView): + paginated_by = None ordering = ['numero_ordem', 'materia', 'resultado'] def get_context_data(self, **kwargs): From 150e7b2acd8d8f35152f80b13c5201f8bfd97f20 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 23 Aug 2017 16:39:07 -0300 Subject: [PATCH 53/80] HOT-FIX: Fixes #1423 --- sapl/sessao/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index b118b43f7..e420c650d 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -199,7 +199,7 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): return 'OrdemDiaDetail' class ListView(MasterDetailCrud.ListView): - paginated_by = None + paginate_by = None ordering = ['numero_ordem', 'materia', 'resultado'] def get_context_data(self, **kwargs): @@ -320,7 +320,7 @@ class ExpedienteMateriaCrud(MasterDetailCrud): 'materia__ementa', 'resultado'] class ListView(MasterDetailCrud.ListView): - paginated_by = None + paginate_by = None ordering = ['numero_ordem', 'materia', 'resultado'] def get_context_data(self, **kwargs): From 74b0ba0bcd362885c397ac29b924fd68f9733d44 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 23 Aug 2017 16:50:00 -0300 Subject: [PATCH 54/80] =?UTF-8?q?alt=20exib=20de=20altera=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20disposit=20de=20articula=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templatetags/compilacao_filters.py | 8 ++- sapl/compilacao/views.py | 16 ++++-- sapl/static/js/compilacao_edit.js | 53 +++++++++---------- sapl/static/styles/compilacao.scss | 3 +- .../templates/compilacao/text_edit_bloco.html | 2 +- .../templates/compilacao/text_list_bloco.html | 8 ++- 6 files changed, 54 insertions(+), 36 deletions(-) diff --git a/sapl/compilacao/templatetags/compilacao_filters.py b/sapl/compilacao/templatetags/compilacao_filters.py index 54575bff1..e56478bae 100644 --- a/sapl/compilacao/templatetags/compilacao_filters.py +++ b/sapl/compilacao/templatetags/compilacao_filters.py @@ -93,8 +93,12 @@ def nota_automatica(dispositivo, ta_pub_list): return _('Inclusão feita pelo %s - %s.') % ( d, ta_publicado) else: - return _('Alteração feita pelo %s - %s.') % ( - d, ta_publicado) + if dispositivo.tipo_dispositivo.dispositivo_de_articulacao: + return _('Alteração de rótulo feita pelo %s - %s.') % ( + d, ta_publicado) + else: + return _('Alteração feita pelo %s - %s.') % ( + d, ta_publicado) return '' diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index cf0a2703e..61d720628 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -2412,6 +2412,15 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, 'Alterador!'), time=10000) return data + if dispositivo_a_alterar.tipo_dispositivo.dispositivo_de_articulacao\ + and not revogacao: + self.set_message( + data, 'warning', + _('Registrar alteração de um dispositivo de articulação ' + 'só é relevante para o caso de alterações de rótulo. ' + 'Se não é este o caso, a alteração deve ser específica ' + 'para o dispositivo que se quer alterar.'), modal=True) + ndp = Dispositivo.new_instance_based_on( dispositivo_a_alterar, dispositivo_a_alterar.tipo_dispositivo) ndp.auto_inserido = dispositivo_a_alterar.auto_inserido @@ -2481,9 +2490,10 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, bloco_alteracao.ordenar_bloco_alteracao() if not revogacao: - self.set_message( - data, 'success', - _('Dispositivo de Alteração adicionado com sucesso.')) + if 'message' not in data: + self.set_message( + data, 'success', + _('Dispositivo de Alteração adicionado com sucesso.')) else: self.set_message( data, 'success', diff --git a/sapl/static/js/compilacao_edit.js b/sapl/static/js/compilacao_edit.js index 722d4755a..6269c4cfe 100644 --- a/sapl/static/js/compilacao_edit.js +++ b/sapl/static/js/compilacao_edit.js @@ -42,19 +42,7 @@ function DispositivoEdit() { $.get(url, form_data).done(function(data) { instance.clearEditSelected(); if (data.pk != null) { - if (data.message !== undefined) { - if (data.message.modal) { - instance.modalMessage(data.message.value, 'alert-'+data.message.type, function() { - instance.waitShow(); - instance.refreshScreenFocusPk(data); - }); - return; - } - else { - instance.message(data) - } - } - instance.refreshScreenFocusPk(data); + instance.message(data); } }).fail(instance.waitHide).always(instance.waitHide); } @@ -275,16 +263,31 @@ function DispositivoEdit() { } instance.message = function(data) { - if (!('message' in data)) - return; - var cp_notify = $(".cp-notify") - cp_notify.removeClass('hide') - var msg = cp_notify.find('.message'); - msg.text(data.message.value); - msg.removeClass('bg-primary bg-success bg-info bg-warning bg-danger').addClass('bg-'+data.message.type); - setTimeout(function() { - cp_notify.addClass('hide'); - }, (data.message.time?data.message.time: 3000)); + if (data.message !== undefined) { + if (data.message.modal) { + instance.modalMessage(data.message.value, 'alert-'+data.message.type, function() { + instance.waitShow(); + instance.refreshScreenFocusPk(data); + }); + return; + } + else { + instance.refreshScreenFocusPk(data); + if (!('message' in data)) + return; + var cp_notify = $(".cp-notify") + cp_notify.removeClass('hide') + var msg = cp_notify.find('.message'); + msg.text(data.message.value); + msg.removeClass('bg-primary bg-success bg-info bg-warning bg-danger').addClass('bg-'+data.message.type); + setTimeout(function() { + cp_notify.addClass('hide'); + }, (data.message.time?data.message.time: 3000)); + } + } + else { + instance.refreshScreenFocusPk(data); + } } instance.offClicks = function() { $('.btn-dpt-edit').off() @@ -315,7 +318,6 @@ function DispositivoEdit() { instance.clearEditSelected(); if (data.pk != null) { - instance.refreshScreenFocusPk(data); instance.message(data); } else { @@ -346,7 +348,6 @@ function DispositivoEdit() { instance.clearEditSelected(); if (data.pk != null) { - instance.refreshScreenFocusPk(data); instance.message(data); } else { @@ -377,7 +378,6 @@ function DispositivoEdit() { instance.clearEditSelected(); if (data.pk != null) { - instance.refreshScreenFocusPk(data); instance.message(data); } else { @@ -437,7 +437,6 @@ function DispositivoEdit() { instance.clearEditSelected(); if (data.pk != null) { - instance.refreshScreenFocusPk(data); instance.message(data); } else { diff --git a/sapl/static/styles/compilacao.scss b/sapl/static/styles/compilacao.scss index 8646401bd..647b72a43 100644 --- a/sapl/static/styles/compilacao.scss +++ b/sapl/static/styles/compilacao.scss @@ -165,6 +165,7 @@ a:link:after, a:visited:after { .cp { .desativado { + .dtxt, .dtxt *, .dpt-link, .dpt-link * { text-decoration: line-through; color: #999 !important; @@ -390,7 +391,7 @@ a:link:after, a:visited:after { } .dptt { - + clear: left; & > a { color: #444444; &.nota-alteracao { diff --git a/sapl/templates/compilacao/text_edit_bloco.html b/sapl/templates/compilacao/text_edit_bloco.html index f413e0a59..27b6c38fc 100644 --- a/sapl/templates/compilacao/text_edit_bloco.html +++ b/sapl/templates/compilacao/text_edit_bloco.html @@ -17,7 +17,7 @@ {% if not node.dpt.rotulo and not node.dpt.texto and node.td.dispositivo_de_articulacao%} {% endif %}
-
+
{% if node.dpt.auto_inserido and node.da%} {{ node.dpt.dispositivo_pai.tipo_dispositivo.rotulo_prefixo_html|safe }} {% if node.da and node in node.da.alts %} diff --git a/sapl/templates/compilacao/text_list_bloco.html b/sapl/templates/compilacao/text_list_bloco.html index 41f6de04b..0c2900734 100644 --- a/sapl/templates/compilacao/text_list_bloco.html +++ b/sapl/templates/compilacao/text_list_bloco.html @@ -13,11 +13,11 @@ {% if forloop.first and not view|isinst:'TextView' %} {% else %} -
+
{% endif%} {% spaceless %} -
+
@@ -43,6 +43,7 @@   {% endif %} + {% endif %} {% if user.is_authenticated and not dpt.tipo_dispositivo.dispositivo_de_articulacao%} {% if perms.compilacao.add_nota or perms.compilacao.add_vide or perms.compilacao.change_dispositivo%} @@ -178,6 +179,9 @@
{% endif%}
+ {% if dpt.ta_publicado_id %} +
+ {% endif%} {% endspaceless %} {% if dpt.tipo_dispositivo.dispositivo_de_alteracao%} {%with node=dpt template_name='compilacao/text_list_blocoalteracao.html' %} From 49834582b7a5a26c999ca0346bfbeaec6702656e Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 23 Aug 2017 16:59:40 -0300 Subject: [PATCH 55/80] HOT-FIX: Fixes #1424 --- sapl/sessao/forms.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 3f98f4e23..f77a21ac0 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -67,17 +67,19 @@ class SessaoPlenariaForm(ModelForm): num = self.cleaned_data['numero'] sl = self.cleaned_data['sessao_legislativa'] leg = self.cleaned_data['legislatura'] + tipo = self.cleaned_data['tipo'] sessoes = SessaoPlenaria.objects.filter(numero=num, sessao_legislativa=sl, - legislatura=leg).\ - values_list('id', flat=True) + legislatura=leg, + tipo=tipo).\ + values_list('id', flat=True) qtd_sessoes = len(sessoes) error = ValidationError( "Número de Sessão Plenária já existente " - "para a Legislatura e Sessão Legislativa informadas. " + "para a Legislatura, Sessão Legislativa e Tipo informados. " "Favor escolher um número distinto.") if qtd_sessoes > 0: From 5bb3bb2990b6452728e3802503b8146870592d20 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 23 Aug 2017 18:43:45 -0300 Subject: [PATCH 56/80] =?UTF-8?q?HOT-FIX:=20valida=20campos=20obrigat?= =?UTF-8?q?=C3=B3rios=20de=20SessaoPlenariaForm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/sessao/forms.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index f77a21ac0..3be7db1fd 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -62,6 +62,9 @@ class SessaoPlenariaForm(ModelForm): def clean(self): super(SessaoPlenariaForm, self).clean() + if not self.is_valid(): + return self.cleaned_data + instance = self.instance num = self.cleaned_data['numero'] From 774b74f786d45c74dc028f0068b47d07c4630c1d Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 23 Aug 2017 19:32:02 -0300 Subject: [PATCH 57/80] Adiciona testes iniciais para SessaoPlenariaForm --- sapl/sessao/forms.py | 14 +++---- sapl/sessao/tests/test_sessao.py | 67 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 3be7db1fd..056fee35e 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -63,7 +63,7 @@ class SessaoPlenariaForm(ModelForm): super(SessaoPlenariaForm, self).clean() if not self.is_valid(): - return self.cleaned_data + return self.cleaned_data instance = self.instance @@ -72,18 +72,18 @@ class SessaoPlenariaForm(ModelForm): leg = self.cleaned_data['legislatura'] tipo = self.cleaned_data['tipo'] + error = ValidationError( + "Número de Sessão Plenária já existente " + "para a Legislatura, Sessão Legislativa e Tipo informados. " + "Favor escolher um número distinto.") + sessoes = SessaoPlenaria.objects.filter(numero=num, sessao_legislativa=sl, legislatura=leg, tipo=tipo).\ values_list('id', flat=True) - qtd_sessoes = len(sessoes) - - error = ValidationError( - "Número de Sessão Plenária já existente " - "para a Legislatura, Sessão Legislativa e Tipo informados. " - "Favor escolher um número distinto.") + qtd_sessoes = len(sessoes) if qtd_sessoes > 0: if instance.pk: # update diff --git a/sapl/sessao/tests/test_sessao.py b/sapl/sessao/tests/test_sessao.py index e69de29bb..b42ab54f1 100644 --- a/sapl/sessao/tests/test_sessao.py +++ b/sapl/sessao/tests/test_sessao.py @@ -0,0 +1,67 @@ +import pytest + +from sapl.parlamentares.models import Legislatura, SessaoLegislativa +from sapl.sessao import forms +from sapl.sessao.models import SessaoPlenaria, TipoSessaoPlenaria + +from django.utils.translation import ugettext_lazy as _ +from model_mommy import mommy + + +def test_valida_campos_obrigatorios_sessao_plenaria_form(): + form = forms.SessaoPlenariaForm(data={}) + + assert not form.is_valid() + + errors = form.errors + + assert errors['legislatura'] == ['Este campo é obrigatório.'] + assert errors['sessao_legislativa'] == ['Este campo é obrigatório.'] + assert errors['tipo'] == ['Este campo é obrigatório.'] + assert errors['numero'] == ['Este campo é obrigatório.'] + assert errors['data_inicio'] == ['Este campo é obrigatório.'] + assert errors['hora_inicio'] == ['Este campo é obrigatório.'] + + assert len(errors) == 6 + +@pytest.mark.django_db(transaction=False) +def test_sessao_plenaria_form_valido(): + legislatura = mommy.make(Legislatura) + sessao = mommy.make(SessaoLegislativa) + tipo = mommy.make(TipoSessaoPlenaria) + + form = forms.SessaoPlenariaForm(data={'legislatura': str(legislatura.pk), + 'numero': '1', + 'tipo': str(tipo.pk), + 'sessao_legislativa': str(sessao.pk), + 'data_inicio': '10/11/2017', + 'hora_inicio': '10:10' + }) + + assert form.is_valid() + +@pytest.mark.django_db(transaction=False) +def test_numero_duplicado_sessao_plenaria_form(): + legislatura = mommy.make(Legislatura) + sessao = mommy.make(SessaoLegislativa) + tipo = mommy.make(TipoSessaoPlenaria) + sessao_plenaria = mommy.make(SessaoPlenaria, + legislatura=legislatura, + sessao_legislativa=sessao, + tipo=tipo, + numero = 1) + + form = forms.SessaoPlenariaForm(data={'legislatura': str(legislatura.pk), + 'numero': '1', + 'tipo': str(tipo.pk), + 'sessao_legislativa': str(sessao.pk), + 'data_inicio': '10/11/2017', + 'hora_inicio': '10:10' + }) + + assert not form.is_valid() + + assert form.errors['__all__'] == ["Número de Sessão Plenária já existente " + "para a Legislatura, Sessão Legislativa " + "e Tipo informados. Favor escolher um " + "número distinto."] From 743eb557a80891dd576cb9eea13710bbf1ec02ad Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 23 Aug 2017 20:12:06 -0300 Subject: [PATCH 58/80] Adiciona teste para MandatoForm --- sapl/parlamentares/forms.py | 21 ++++++------ .../parlamentares/tests/test_parlamentares.py | 32 +++++++++++++++++++ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index e6cac615e..8c5ce16b5 100644 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -62,17 +62,18 @@ class MandatoForm(ModelForm): def clean(self): super(MandatoForm, self).clean() + if not self.is_valid(): + return self.cleaned_data + data = self.cleaned_data - try: - if 'legislatura' in data and 'parlamentar' in data: - Mandato.objects.get( - parlamentar__pk=self.initial['parlamentar'].pk, - legislatura__pk=data['legislatura'].pk) - except ObjectDoesNotExist: - pass - else: - raise ValidationError('Mandato nesta legislatura já existe.') - return data + + existe_mandato = Mandato.objects.filter( + parlamentar=data['parlamentar'], + legislatura=data['legislatura']).exists() + if existe_mandato: + raise ValidationError(_('Mandato nesta legislatura já existe.')) + + return self.cleaned_data class LegislaturaForm(ModelForm): diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py index f210a4551..f0de9cd8a 100644 --- a/sapl/parlamentares/tests/test_parlamentares.py +++ b/sapl/parlamentares/tests/test_parlamentares.py @@ -6,6 +6,8 @@ from sapl.parlamentares.models import (Dependente, Filiacao, Legislatura, Mandato, Parlamentar, Partido, TipoDependente) +from sapl.parlamentares.forms import MandatoForm + @pytest.mark.django_db(transaction=False) def test_cadastro_parlamentar(admin_client): @@ -149,3 +151,33 @@ def test_form_errors_mandato(admin_client): ['Este campo é obrigatório.']) assert (response.context_data['form'].errors['data_expedicao_diploma'] == ['Este campo é obrigatório.']) + +def test_mandato_form_invalido(): + + form = MandatoForm(data = {}) + + assert not form.is_valid() + + errors = form.errors + assert errors['legislatura'] == ['Este campo é obrigatório.'] + assert errors['parlamentar'] == ['Este campo é obrigatório.'] + assert errors['data_expedicao_diploma'] == ['Este campo é obrigatório.'] + +@pytest.mark.django_db(transaction=False) +def test_mandato_form_duplicado(): + parlamentar = mommy.make(Parlamentar, pk=1) + legislatura = mommy.make(Legislatura, pk=1) + + Mandato.objects.create(parlamentar=parlamentar, + legislatura=legislatura, + data_expedicao_diploma='2017-07-25') + + form = MandatoForm(data={ + 'parlamentar': str(parlamentar.pk), + 'legislatura': str(legislatura.pk), + 'data_expedicao_diploma': '01/07/2015' + }) + + assert not form.is_valid() + + assert form.errors['__all__'] == ['Mandato nesta legislatura já existe.'] From bbe19eddfc321cc9fbaa53d0013a8d9de7a5be44 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 24 Aug 2017 10:59:37 -0300 Subject: [PATCH 59/80] =?UTF-8?q?ajst=20txt=20na=20app=20comp=20p=20cria?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20json=20da=20app=20reversion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/models.py | 3 ++- sapl/parlamentares/forms.py | 4 ++-- sapl/parlamentares/tests/test_parlamentares.py | 15 ++++++++------- sapl/sessao/forms.py | 4 ++-- sapl/sessao/tests/test_sessao.py | 9 +++++---- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index 2b0e63473..fa0581b70 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -11,6 +11,7 @@ from django.db.models.deletion import PROTECT from django.http.response import Http404 from django.template import defaultfilters from django.utils.decorators import classonlymethod +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from sapl.compilacao.utils import (get_integrations_view_names, int_to_letter, @@ -843,7 +844,7 @@ class Publicacao(TimestampedMixin): @reversion.register() class Dispositivo(BaseModel, TimestampedMixin): - TEXTO_PADRAO_DISPOSITIVO_REVOGADO = _('(Revogado)') + TEXTO_PADRAO_DISPOSITIVO_REVOGADO = force_text(_('(Revogado)')) INTERVALO_ORDEM = 1000 ordem = models.PositiveIntegerField( default=0, diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 8c5ce16b5..6f29e0bf8 100644 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -68,8 +68,8 @@ class MandatoForm(ModelForm): data = self.cleaned_data existe_mandato = Mandato.objects.filter( - parlamentar=data['parlamentar'], - legislatura=data['legislatura']).exists() + parlamentar=data['parlamentar'], + legislatura=data['legislatura']).exists() if existe_mandato: raise ValidationError(_('Mandato nesta legislatura já existe.')) diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py index f0de9cd8a..b2a738851 100644 --- a/sapl/parlamentares/tests/test_parlamentares.py +++ b/sapl/parlamentares/tests/test_parlamentares.py @@ -2,12 +2,11 @@ import pytest from django.core.urlresolvers import reverse from model_mommy import mommy +from sapl.parlamentares.forms import MandatoForm from sapl.parlamentares.models import (Dependente, Filiacao, Legislatura, Mandato, Parlamentar, Partido, TipoDependente) -from sapl.parlamentares.forms import MandatoForm - @pytest.mark.django_db(transaction=False) def test_cadastro_parlamentar(admin_client): @@ -152,9 +151,10 @@ def test_form_errors_mandato(admin_client): assert (response.context_data['form'].errors['data_expedicao_diploma'] == ['Este campo é obrigatório.']) + def test_mandato_form_invalido(): - form = MandatoForm(data = {}) + form = MandatoForm(data={}) assert not form.is_valid() @@ -163,6 +163,7 @@ def test_mandato_form_invalido(): assert errors['parlamentar'] == ['Este campo é obrigatório.'] assert errors['data_expedicao_diploma'] == ['Este campo é obrigatório.'] + @pytest.mark.django_db(transaction=False) def test_mandato_form_duplicado(): parlamentar = mommy.make(Parlamentar, pk=1) @@ -173,10 +174,10 @@ def test_mandato_form_duplicado(): data_expedicao_diploma='2017-07-25') form = MandatoForm(data={ - 'parlamentar': str(parlamentar.pk), - 'legislatura': str(legislatura.pk), - 'data_expedicao_diploma': '01/07/2015' - }) + 'parlamentar': str(parlamentar.pk), + 'legislatura': str(legislatura.pk), + 'data_expedicao_diploma': '01/07/2015' + }) assert not form.is_valid() diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 056fee35e..9d4a7c0d3 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -81,9 +81,9 @@ class SessaoPlenariaForm(ModelForm): sessao_legislativa=sl, legislatura=leg, tipo=tipo).\ - values_list('id', flat=True) + values_list('id', flat=True) - qtd_sessoes = len(sessoes) + qtd_sessoes = len(sessoes) if qtd_sessoes > 0: if instance.pk: # update diff --git a/sapl/sessao/tests/test_sessao.py b/sapl/sessao/tests/test_sessao.py index b42ab54f1..d1a1ab8e6 100644 --- a/sapl/sessao/tests/test_sessao.py +++ b/sapl/sessao/tests/test_sessao.py @@ -1,12 +1,11 @@ import pytest +from django.utils.translation import ugettext_lazy as _ +from model_mommy import mommy from sapl.parlamentares.models import Legislatura, SessaoLegislativa from sapl.sessao import forms from sapl.sessao.models import SessaoPlenaria, TipoSessaoPlenaria -from django.utils.translation import ugettext_lazy as _ -from model_mommy import mommy - def test_valida_campos_obrigatorios_sessao_plenaria_form(): form = forms.SessaoPlenariaForm(data={}) @@ -24,6 +23,7 @@ def test_valida_campos_obrigatorios_sessao_plenaria_form(): assert len(errors) == 6 + @pytest.mark.django_db(transaction=False) def test_sessao_plenaria_form_valido(): legislatura = mommy.make(Legislatura) @@ -40,6 +40,7 @@ def test_sessao_plenaria_form_valido(): assert form.is_valid() + @pytest.mark.django_db(transaction=False) def test_numero_duplicado_sessao_plenaria_form(): legislatura = mommy.make(Legislatura) @@ -49,7 +50,7 @@ def test_numero_duplicado_sessao_plenaria_form(): legislatura=legislatura, sessao_legislativa=sessao, tipo=tipo, - numero = 1) + numero=1) form = forms.SessaoPlenariaForm(data={'legislatura': str(legislatura.pk), 'numero': '1', From 79eb3076443b1db6a4d087dbdce301d104cc57b0 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 24 Aug 2017 13:25:58 -0300 Subject: [PATCH 60/80] Fixes #1426 --- sapl/templates/navbar.yaml | 2 +- sapl/templates/protocoloadm/protocoloadm_detail.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/templates/navbar.yaml b/sapl/templates/navbar.yaml index 47d58eec4..38ac52ea8 100644 --- a/sapl/templates/navbar.yaml +++ b/sapl/templates/navbar.yaml @@ -15,7 +15,7 @@ - title: {% trans 'Protocolo' %} check_permission: protocoloadm.list_protocolo children: - - title: {% trans 'Pesquisar Protocolo' %} + - title: {% trans 'Protocolo Geral' %} url: sapl.protocoloadm:protocolo - title: {% trans 'Receber Proposições' %} url: sapl.materia:receber-proposicao diff --git a/sapl/templates/protocoloadm/protocoloadm_detail.html b/sapl/templates/protocoloadm/protocoloadm_detail.html index 3cdabaacb..5a3fe05d0 100644 --- a/sapl/templates/protocoloadm/protocoloadm_detail.html +++ b/sapl/templates/protocoloadm/protocoloadm_detail.html @@ -2,8 +2,8 @@ {% load i18n %} {% block editions %} {% endblock editions %} From 6df8bf28019df75cd6cf032133ecc466c239f989 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 24 Aug 2017 14:07:50 -0300 Subject: [PATCH 61/80] Fixes #1426 --- sapl/protocoloadm/forms.py | 2 +- sapl/protocoloadm/views.py | 2 +- sapl/templates/navbar.yaml | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index fc2b99dc8..f07ff1263 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -116,7 +116,7 @@ class ProtocoloFilterSet(django_filters.FilterSet): self.form.helper = FormHelper() self.form.helper.form_method = 'GET' self.form.helper.layout = Layout( - Fieldset('', + Fieldset(_('Pesquisar Protocolo'), row1, row2, row3, HTML(autor_label), diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 4804849b9..976f259f9 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -177,7 +177,7 @@ class ProtocoloPesquisaView(PermissionRequiredMixin, FilterView): context['page_range'] = make_pagination( page_obj.number, paginator.num_pages) - context['title'] = _('Pesquisa de Protocolos') + context['title'] = _('Protocolo') return context diff --git a/sapl/templates/navbar.yaml b/sapl/templates/navbar.yaml index 38ac52ea8..3d4cffa64 100644 --- a/sapl/templates/navbar.yaml +++ b/sapl/templates/navbar.yaml @@ -17,6 +17,10 @@ children: - title: {% trans 'Protocolo Geral' %} url: sapl.protocoloadm:protocolo + - title: {% trans 'Protocolo de Matéria' %} + url: sapl.protocoloadm:protocolar_mat + - title: {% trans 'Protocolo de Documento' %} + url: sapl.protocoloadm:protocolar_doc - title: {% trans 'Receber Proposições' %} url: sapl.materia:receber-proposicao From b857f726cce7bf652ad92a763f7298e130e8b1be Mon Sep 17 00:00:00 2001 From: Mariana Mendes Date: Thu, 24 Aug 2017 15:55:18 -0300 Subject: [PATCH 62/80] Adiciona teste ao TipoTextoArticuladoForm --- sapl/base/tests/teststub_urls.py | 6 ++-- .../tests/test_tipo_texto_articulado_form.py | 36 +++++++++++++++++++ sapl/parlamentares/forms.py | 2 +- sapl/test_urls.py | 36 +++++++++---------- 4 files changed, 58 insertions(+), 22 deletions(-) create mode 100644 sapl/compilacao/tests/test_tipo_texto_articulado_form.py diff --git a/sapl/base/tests/teststub_urls.py b/sapl/base/tests/teststub_urls.py index fbdcbb443..33bf55d85 100644 --- a/sapl/base/tests/teststub_urls.py +++ b/sapl/base/tests/teststub_urls.py @@ -4,6 +4,6 @@ from django.views.generic.base import TemplateView from sapl.urls import urlpatterns as original_patterns urlpatterns = original_patterns + patterns('', url(r'^zzzz$', - TemplateView.as_view( - template_name='index.html'), - name='zzzz')) + TemplateView.as_view( + template_name='index.html'), + name='zzzz')) diff --git a/sapl/compilacao/tests/test_tipo_texto_articulado_form.py b/sapl/compilacao/tests/test_tipo_texto_articulado_form.py new file mode 100644 index 000000000..eb7810cfd --- /dev/null +++ b/sapl/compilacao/tests/test_tipo_texto_articulado_form.py @@ -0,0 +1,36 @@ +import pytest +from model_mommy import mommy + +from sapl.compilacao import forms +from sapl.compilacao.models import PerfilEstruturalTextoArticulado + + +def test_valida_campos_obrigatorios_tipo_texto_articulado_form(): + form = forms.TipoTaForm(data={}) + + assert not form.is_valid() + + errors = form.errors + + assert errors['sigla'] == ['Este campo é obrigatório.'] + assert errors['descricao'] == ['Este campo é obrigatório.'] + assert errors['content_type'] == ['Este campo é obrigatório.'] + assert errors['participacao_social'] == ['Este campo é obrigatório.'] + assert errors['publicacao_func'] == ['Este campo é obrigatório.'] + + assert len(errors) == 5 + + +@pytest.mark.django_db(transaction=False) +def test_tipo_texto_articulado_form_valid(): + perfil = mommy.make(PerfilEstruturalTextoArticulado) + + form = forms.TipoTaForm(data={'sigla': 'si', + 'descricao': 'teste', + 'content_type': 'content', + 'participacao_social': 'social', + 'publicacao_func': 'func', + 'perfis': str(perfil.pk) + }) + + assert form.is_valid() diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 6f29e0bf8..e6f13fe42 100644 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -5,7 +5,7 @@ from crispy_forms.layout import Fieldset, Layout from django import forms from django.contrib.auth import get_user_model from django.contrib.auth.models import Group, User -from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.core.exceptions import ValidationError from django.db import transaction from django.db.models import Q from django.forms import ModelForm diff --git a/sapl/test_urls.py b/sapl/test_urls.py index 8b5207276..9daa58fab 100644 --- a/sapl/test_urls.py +++ b/sapl/test_urls.py @@ -174,24 +174,24 @@ apps_url_patterns_prefixs_and_users = { ]}, 'redireciona_urls': { 'prefixs': [ - '/default_index_html', - '/consultas/parlamentar/parlamentar_', - '/consultas/comissao/comissao_', - '/consultas/pauta_sessao/pauta_sessao_', - '/consultas/sessao_plenaria/', - '/relatorios_administrativos/relatorios_administrativos_index_html', - '/tramitacaoMaterias/tramitacaoMaterias', - '/tramitacaoMaterias/materia_mostrar_proc', - '/generico/materia_pesquisar_', - '/consultas/mesa_diretora/mesa_diretora_index_html', - '/consultas/mesa_diretora/parlamentar/parlamentar_', - '/generico/norma_juridica_pesquisar_', - '/consultas/norma_juridica/norma_juridica_mostrar_proc', - '/historicoTramitacoes/historicoTramitacoes', - '/atasSessao', - '/presencaSessao', - '/resumoPropositurasAutor', - '/propositurasAnoAutorTipo', + '/default_index_html', + '/consultas/parlamentar/parlamentar_', + '/consultas/comissao/comissao_', + '/consultas/pauta_sessao/pauta_sessao_', + '/consultas/sessao_plenaria/', + '/relatorios_administrativos/relatorios_administrativos_index_html', + '/tramitacaoMaterias/tramitacaoMaterias', + '/tramitacaoMaterias/materia_mostrar_proc', + '/generico/materia_pesquisar_', + '/consultas/mesa_diretora/mesa_diretora_index_html', + '/consultas/mesa_diretora/parlamentar/parlamentar_', + '/generico/norma_juridica_pesquisar_', + '/consultas/norma_juridica/norma_juridica_mostrar_proc', + '/historicoTramitacoes/historicoTramitacoes', + '/atasSessao', + '/presencaSessao', + '/resumoPropositurasAutor', + '/propositurasAnoAutorTipo', ]}, 'lexml': { 'prefixs': [ From 7c89004ec3e6b6849f749ecd96da44c6355fdc63 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 24 Aug 2017 17:03:55 -0300 Subject: [PATCH 63/80] =?UTF-8?q?Rft=20propaga=C3=A7=C3=A3o=20e=20regras?= =?UTF-8?q?=20de=20dat=20vig=C3=AAncias=20e=20efic=C3=A1cia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/forms.py | 56 ++- sapl/compilacao/views.py | 474 +++++++++--------- sapl/static/styles/compilacao.scss | 20 +- .../layout/dispositivo_checkbox.html | 21 +- sapl/templates/compilacao/text_edit.html | 2 +- .../compilacao/text_notificacoes.html | 11 +- .../compilacao/textoarticulado_detail.html | 6 +- 7 files changed, 326 insertions(+), 264 deletions(-) diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py index c728bf230..f51504f2c 100644 --- a/sapl/compilacao/forms.py +++ b/sapl/compilacao/forms.py @@ -860,6 +860,21 @@ class DispositivoEdicaoVigenciaForm(ModelForm): ('fim_vigencia', 3), ('inicio_eficacia', 3), ('fim_eficacia', 3), ]) + + inst = kwargs['instance'] + while inst.auto_inserido and inst.dispositivo_pai: + inst = inst.dispositivo_pai + + if (inst.dispositivos_vigencias_set.exists()): + row_datas.fields.append( + Alert( + css_class='alert-info col-md-12', + content='%s %s' % ( + _('Atenção!'), + _('O Dispositivo em edição define vigência de outros ' + 'dispositivos. Alterar as datas de vigência ' + 'alterará as datas de vigência dos dispositivos ' + 'vigêntes por este em edição.')))) layout.append( Fieldset(_('Datas de Controle de Vigência'), row_datas, @@ -910,17 +925,26 @@ class DispositivoEdicaoVigenciaForm(ModelForm): super(DispositivoEdicaoVigenciaForm, self).save() data = self.cleaned_data + instance = self.instance + inst = instance - extensao = 'extensao' in data and data['extensao'] == 'True' + while instance.auto_inserido and instance.dispositivo_pai: + dp = instance.dispositivo_pai + dp.inicio_vigencia = instance.inicio_vigencia + dp.inicio_eficacia = instance.inicio_eficacia + dp.fim_vigencia = instance.fim_vigencia + dp.fim_eficacia = instance.fim_vigencia + dp.save() - if extensao: - dv = data['dispositivo_vigencia'] + instance = dp - if dv and dv.auto_inserido: - dv = dv.dispositivo_pai + dv = data['dispositivo_vigencia'] + if dv and dv.auto_inserido: + dv = dv.dispositivo_pai + extensao = 'extensao' in data and data['extensao'] == 'True' + if extensao: dv_pk = dv.pk if dv else None - instance = self.instance def extenderPara(dpt_pk): @@ -937,6 +961,26 @@ class DispositivoEdicaoVigenciaForm(ModelForm): extenderPara(instance.pk) + inst = instance + while instance.auto_inserido and instance.dispositivo_pai: + instance = instance.dispositivo_pai + + inst.dispositivos_vigencias_set.filter( + ta_publicado__isnull=True).update( + inicio_vigencia=inst.inicio_vigencia, + inicio_eficacia=inst.inicio_eficacia, + fim_vigencia=inst.fim_vigencia, + fim_eficacia=inst.fim_eficacia) + + inst.dispositivos_vigencias_set.filter( + ta_publicado__isnull=False).update( + inicio_vigencia=inst.inicio_eficacia, + inicio_eficacia=inst.inicio_eficacia, + fim_vigencia=inst.fim_eficacia, + fim_eficacia=inst.fim_eficacia) + + return inst + class MultipleChoiceWithoutValidationField(forms.MultipleChoiceField): diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 61d720628..cc12354b9 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -286,6 +286,204 @@ class CompMixin(PermissionRequiredMixin): context['NO_ENTRIES_MSG'] = CrudListView.no_entries_msg return context + def get_notificacoes(self, object_list=None, type_notificacoes=None): + + p = [] + + def padd(r, type_notificacao, reverse_url=None, test=True, msg='', + kwargs=None, to_position=None): + + if not test: + return + + r.contextual_class = type_notificacao + if not kwargs: + kwargs = {'ta_id': r.ta_id, 'pk': r.pk} + if reverse_url: + p.append((type_notificacao, msg, + reverse_lazy(reverse_url, kwargs=kwargs), + to_position)) + else: + p.append((type_notificacao, msg, None, to_position)) + + def success(r): + type_notificacao = 'success' + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + r.inconstitucionalidade, + _('Declarado Inconstitucional.')) + + padd(r, type_notificacao, 'sapl.compilacao:ta_text_edit', + r.ta_publicado and r.dispositivo_atualizador, + _('Dispositivo alterado em %s' % r.ta_publicado), + {'ta_id': r.ta_publicado_id}, r.dispositivo_atualizador_id) + + def info(r): + type_notificacao = 'info' + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + r.publicacao and + r.dispositivo_vigencia and + r.publicacao.data != r.dispositivo_vigencia.inicio_vigencia, + _('Data da publicação associada ao Dispositivo difere da data' + ' de inicio de vigência do Dispositivo de vigência.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + r.publicacao and r.publicacao.data != r.inicio_vigencia, + _('Data da publicação associada ao Dispositivo difere ' + 'da data de inicio de vigência.')) + + padd(r, type_notificacao, 'sapl.compilacao:dispositivo_edit', + r.rotulo != r.rotulo_padrao(local_insert=1), + _('Rótulo Diferente do Padrão')) + + padd(r, type_notificacao, 'sapl.compilacao:dispositivo_edit', + r.texto_atualizador and r.texto_atualizador != r.texto, + _('Texto do Dispositivo para o Documento ' + 'está diferente do texto para o Documento Alterador.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_alteracao', + r.texto_atualizador and r.texto_atualizador == r.texto, + _('Texto do Dispositivo no Documento Alterador ' + 'está igual ao Texto no Documento Original. ' + 'Não é necessário manter armazenado o texto no Documento ' + 'Alterador.')) + + def warning(r): + type_notificacao = 'warning' + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + r.dispositivo_vigencia and r.inicio_vigencia != + r.dispositivo_vigencia.inicio_vigencia, + _('Data de início de Vigência difere da data início de ' + 'Vigência do Dispositivo de Vigência')) + + padd(r, type_notificacao, 'sapl.compilacao:ta_text', + r.inconstitucionalidade and not r.notas.exists(), + _('Dispositivo está definido como inconstitucional. É ' + 'aconcelhavel inserir uma Nota informando esta condição.'), + kwargs={'ta_id': r.ta_id}, + to_position=r.pk) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + r.inconstitucionalidade and not ( + r.inicio_vigencia == r.fim_vigencia and + r.fim_vigencia == r.inicio_eficacia and + r.inicio_eficacia == r.fim_eficacia), + _('Dispositivo está definido como inconstitucional porém ' + 'existe diferença entre as datas início e fim de ' + 'vigência e eficácia.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + r.publicacao and + r.ta_publicado and r.ta_publicado != r.publicacao.ta, + _('A Publicação associada a este Dispositivo não é ' + 'uma publicação do Texto Articulado Alterador.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + not r.publicacao, + _('Dispositivo sem registro de publicação.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + r.texto and r.tipo_dispositivo.dispositivo_de_articulacao, + _('Dispositivos de Articulação não ' + 'deveriam armazenar texto.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + not r.texto and + not r.tipo_dispositivo.dispositivo_de_articulacao, + _('Dispositivo está sem texto.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_alteracao', + r.texto_atualizador and not r.ta_publicado, + _('Existe Texto Atualizador, porém este Dispositivo não ' + 'está associado a nenhum Documento Atualizador.')) + + def danger(r): + type_notificacao = 'danger' + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + not r.dispositivo_vigencia, + _('Dispositivo sem definição de Dispositivo de Vigência.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_vigencia', + r.inconstitucionalidade and + r.inicio_vigencia != r.fim_vigencia, + _('Dispositivo está definido como inconstitucional porém ' + 'existe período de vigência.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_alteracao', + r.ta_publicado and not r.dispositivo_atualizador, + _('Dispositivo está associado a um Texto Articulado ' + 'Atualizador mas, a nenhum Dispositivo Atualizador.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_alteracao', + not r.dispositivo_atualizador and + r.dispositivo_substituido, + _('Dispositivo está substituindo outro mas não foi informado ' + 'o Dispositivo Atualizador.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_alteracao', + r.dispositivo_substituido and + r.dispositivo_substituido.tipo_dispositivo != + r.tipo_dispositivo, + _('Dispositivo está substituindo um Dispositivo ' + 'de outro tipo.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_alteracao', + r.dispositivo_substituido and + r.dispositivo_substituido.ta != r.ta, + _('Dispositivo está substituindo um Dispositivo de outro ' + 'Texto Articulado.')) + + padd(r, type_notificacao, + 'sapl.compilacao:dispositivo_edit_alteracao', + r.dispositivo_substituido and + r.dispositivo_substituido.dispositivo_subsequente != r, + _('Dispositivo está substituindo um Dispositivo que não ' + 'possui este como seu Dispositivo Subsequente.')) + + padd(r, + type_notificacao, + 'sapl.compilacao:dispositivo_edit_alteracao', + r.dispositivo_subsequente and + r.dispositivo_subsequente.dispositivo_substituido != r, + _('Dispositivo foi substituído por outro que não ' + 'possui este como seu Dispositivo Substituído.')) + + rr = [] + for r in object_list: + p = [] + r.contextual_class = "" + + for f in type_notificacoes: + if f != 'default': + locals()[f](r) + + r.notificacoes = p + + if p or 'default' in type_notificacoes: + rr.append(r) + + if r.dispositivos_alterados_set.exists(): + rr += self.get_notificacoes( + r.dispositivos_alterados_set.all(), type_notificacoes) + + return rr + class TipoTaListView(CompMixin, ListView): model = TipoTextoArticulado @@ -963,6 +1161,23 @@ class TextEditView(CompMixin, TemplateView): else: if 'lock' in request.GET: # TODO - implementar logging de ação de usuário + + notificacoes = self.get_notificacoes( + object_list=self.object.dispositivos_set.all(), + type_notificacoes=['danger', ]) + + if notificacoes: + messages.error( + request, + _('Existem erros a serem corrigidos que impedem a ' + 'publicação deste Texto Articulado. ' + 'Corrija os erros apontados nas notificações.')) + self.request.session[ + 'type_notificacoes'] = ['danger', ] + return redirect(to=reverse_lazy( + 'sapl.compilacao:ta_text_notificacoes', kwargs={ + 'ta_id': self.object.id})) + self.object.editing_locked = True self.object.privacidade = STATUS_TA_PUBLIC self.object.save() @@ -1563,9 +1778,7 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin): ordem__gt=base_ordem, nivel__lte=base.nivel).first() - if not pbi: - base.delete() - else: + if pbi: dcc_a_excluir = Dispositivo.objects.order_by( 'ordem').filter( ta_id=base.ta_id, @@ -1604,10 +1817,16 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin): dr.dispositivo0 - primeiro_a_religar + d.dispositivo0) dr.rotulo = dr.rotulo_padrao() - dr.save(clean=base != dr) - if base.pk: - base.delete() + + if base.tipo_dispositivo.dispositivo_de_alteracao: + dpts = base.dispositivos_alterados_set.all().order_by( + '-ordem_bloco_atualizador') + for dpt in dpts: + self.remover_dispositivo(dpt, False) + + if base.pk: + base.delete() return '' @@ -1951,19 +2170,6 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): else: raise Exception('Não existe perfil padrão!') - if not base.dispositivo_vigencia and tipo.dispositivo_de_alteracao: - data = {'pk': base.pk, - 'pai': [base.dispositivo_pai.pk, ]} - self.set_message( - data, 'danger', - _('Registros de Compilação só podem ser realizados ' - 'após a conclusão do lançamento deste ' - 'Texto Articulado.\nConclua o Lançamento, defina ' - 'o dispositivo de vigência e as datas de vigência e ' - 'eficácia. Só depois retorne ' - 'realizando Registros de Compilação.'), modal=True) - return data - dp_irmao = None dp_pai = None for dp in parents: @@ -2369,27 +2575,6 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, data.update({'pk': bloco_alteracao.pk, 'pai': [bloco_alteracao.pk, ]}) - if not bloco_alteracao.dispositivo_vigencia: - """ - Essa restrição não é necessária pois os lançamentos podem ser - aleatórios, desde que no fim do lançamento, datas de vigência - e eficácia, bem como o dispositivo de vigência da norma seja - configurado. Como nos primeiros testes com usuários ficou - demonstrado o esquecimento/desconhecimento dessa tarefa, - principalmente em documentos que possuem datas de vigência e/ou - eficácia diferentes da data de publicação, apesar de já aparecer - na rotina de notificações, achei por bem colocar essa restrição. - """ - self.set_message( - data, 'danger', - _('Registros de Compilação só podem ser realizados ' - 'após a conclusão do lançamento deste ' - 'Texto Articulado.\r\nConclua o Lançamento, defina ' - 'o dispositivo de vigência e as datas de vigência e ' - 'eficácia. Só depois retorne ' - 'realizando Registros de Compilação.'), modal=True) - return data - history = dispositivo_a_alterar.history() for d in history: @@ -2434,8 +2619,13 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, ndp.dispositivo_de_revogacao = True ndp.dispositivo_vigencia = bloco_alteracao.dispositivo_vigencia - ndp.inicio_eficacia = ndp.dispositivo_vigencia.inicio_eficacia - ndp.inicio_vigencia = ndp.dispositivo_vigencia.inicio_eficacia + + if ndp.dispositivo_vigencia: + ndp.inicio_eficacia = ndp.dispositivo_vigencia.inicio_eficacia + ndp.inicio_vigencia = ndp.dispositivo_vigencia.inicio_eficacia + else: + ndp.inicio_eficacia = bloco_alteracao.inicio_eficacia + ndp.inicio_vigencia = bloco_alteracao.inicio_eficacia try: ordem = dispositivo_a_alterar.criar_espaco( @@ -3117,199 +3307,11 @@ class TextNotificacoesView(CompMixin, ListView, FormView): ta_id=self.kwargs['ta_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) - p = [] - - def padd(r, type_notificacao, reverse_url=None, test=True, msg='', - kwargs=None, to_position=None): - - if not test: - return - - r.contextual_class = type_notificacao - if not kwargs: - kwargs = {'ta_id': r.ta_id, 'pk': r.pk} - if reverse_url: - p.append((type_notificacao, msg, - reverse_lazy(reverse_url, kwargs=kwargs), - to_position)) - else: - p.append((type_notificacao, msg, None, to_position)) - - def success(r): - type_notificacao = 'success' - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - r.inconstitucionalidade, - _('Declarado Inconstitucional.')) + type_notificacoes = [] + if 'type_notificacoes' in self.request.session: + type_notificacoes = self.request.session['type_notificacoes'] - padd(r, type_notificacao, 'sapl.compilacao:ta_text_edit', - r.ta_publicado and r.dispositivo_atualizador, - _('Dispositivo alterado em %s' % r.ta_publicado), - {'ta_id': r.ta_publicado_id}, r.dispositivo_atualizador_id) - - def info(r): - type_notificacao = 'info' - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - r.publicacao and - r.dispositivo_vigencia and - r.publicacao.data != r.dispositivo_vigencia.inicio_vigencia, - _('Data da publicação associada ao Dispositivo difere da data' - ' de inicio de vigência do Dispositivo de vigência.')) + if type_notificacoes and not isinstance(type_notificacoes, list): + type_notificacoes = [type_notificacoes, ] - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - r.publicacao and r.publicacao.data != r.inicio_vigencia, - _('Data da publicação associada ao Dispositivo difere ' - 'da data de inicio de vigência.')) - - padd(r, type_notificacao, 'sapl.compilacao:dispositivo_edit', - r.rotulo != r.rotulo_padrao(local_insert=1), - _('Rótulo Diferente do Padrão')) - - padd(r, type_notificacao, 'sapl.compilacao:dispositivo_edit', - r.texto_atualizador and r.texto_atualizador != r.texto, - _('Texto do Dispositivo para o Documento ' - 'está diferente do texto para o Documento Alterador.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_alteracao', - r.texto_atualizador and r.texto_atualizador == r.texto, - _('Texto do Dispositivo no Documento Alterador ' - 'está igual ao Texto no Documento Original. ' - 'Não é necessário manter armazenado o texto no Documento ' - 'Alterador.')) - - def warning(r): - type_notificacao = 'warning' - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - r.dispositivo_vigencia and r.inicio_vigencia != - r.dispositivo_vigencia.inicio_vigencia, - _('Data de início de Vigência difere da data início de ' - 'Vigência do Dispositivo de Vigência')) - - padd(r, type_notificacao, 'sapl.compilacao:ta_text', - r.inconstitucionalidade and not r.notas.exists(), - _('Dispositivo está definido como inconstitucional. É ' - 'aconcelhavel inserir uma Nota informando esta condição.'), - kwargs={'ta_id': r.ta_id}, - to_position=r.pk) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - r.inconstitucionalidade and not ( - r.inicio_vigencia == r.fim_vigencia and - r.fim_vigencia == r.inicio_eficacia and - r.inicio_eficacia == r.fim_eficacia), - _('Dispositivo está definido como inconstitucional porém ' - 'existe diferença entre as datas início e fim de ' - 'vigência e eficácia.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - r.publicacao and - r.ta_publicado and r.ta_publicado != r.publicacao.ta, - _('A Publicação associada a este Dispositivo não é ' - 'uma publicação do Texto Articulado Alterador.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - not r.publicacao, - _('Dispositivo sem registro de publicação.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - r.texto and r.tipo_dispositivo.dispositivo_de_articulacao, - _('Dispositivos de Articulação não ' - 'deveriam armazenar texto.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - not r.texto and - not r.tipo_dispositivo.dispositivo_de_articulacao, - _('Dispositivo está sem texto.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_alteracao', - r.texto_atualizador and not r.ta_publicado, - _('Existe Texto Atualizador, porém este Dispositivo não ' - 'está associado a nenhum Documento Atualizador.')) - - def danger(r): - type_notificacao = 'danger' - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - not r.dispositivo_vigencia, - _('Dispositivo sem definição de Dispositivo de Vigência.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_vigencia', - r.inconstitucionalidade and - r.inicio_vigencia != r.fim_vigencia, - _('Dispositivo está definido como inconstitucional porém ' - 'existe período de vigência.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_alteracao', - r.ta_publicado and not r.dispositivo_atualizador, - _('Dispositivo está associado a um Texto Articulado ' - 'Atualizador mas, a nenhum Dispositivo Atualizador.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_alteracao', - not r.dispositivo_atualizador and - r.dispositivo_substituido, - _('Dispositivo está substituindo outro mas não foi informado ' - 'o Dispositivo Atualizador.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_alteracao', - r.dispositivo_substituido and - r.dispositivo_substituido.tipo_dispositivo != - r.tipo_dispositivo, - _('Dispositivo está substituindo um Dispositivo ' - 'de outro tipo.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_alteracao', - r.dispositivo_substituido and - r.dispositivo_substituido.ta != r.ta, - _('Dispositivo está substituindo um Dispositivo de outro ' - 'Texto Articulado.')) - - padd(r, type_notificacao, - 'sapl.compilacao:dispositivo_edit_alteracao', - r.dispositivo_substituido and - r.dispositivo_substituido.dispositivo_subsequente != r, - _('Dispositivo está substituindo um Dispositivo que não ' - 'possui este como seu Dispositivo Subsequente.')) - - padd(r, - type_notificacao, - 'sapl.compilacao:dispositivo_edit_alteracao', - r.dispositivo_subsequente and - r.dispositivo_subsequente.dispositivo_substituido != r, - _('Dispositivo foi substituído por outro que não ' - 'possui este como seu Dispositivo Substituído.')) - - rr = [] - for r in result: - p = [] - r.contextual_class = "" - - type_notificacoes = [] - if 'type_notificacoes' in self.request.session: - type_notificacoes = self.request.session['type_notificacoes'] - - if isinstance(type_notificacoes, list): - for f in type_notificacoes: - if f != 'default': - locals()[f](r) - - r.notificacoes = p - - if p or 'default' in type_notificacoes: - rr.append(r) - - return rr + return self.get_notificacoes(result, type_notificacoes) diff --git a/sapl/static/styles/compilacao.scss b/sapl/static/styles/compilacao.scss index 647b72a43..651ec7869 100644 --- a/sapl/static/styles/compilacao.scss +++ b/sapl/static/styles/compilacao.scss @@ -165,7 +165,7 @@ a:link:after, a:visited:after { .cp { .desativado { - + .dtxt, .dtxt *, .dpt-link, .dpt-link * { text-decoration: line-through; color: #999 !important; @@ -1306,9 +1306,6 @@ a:link:after, a:visited:after { border-radius: 4px 4px 0 0; width: 100%; - span { - padding: 0.5em; - } } &:last-child .itemlabel { border-radius: 0 0 4px 0px; @@ -1338,16 +1335,11 @@ a:link:after, a:visited:after { padding: 0.5em; vertical-align: middle; width: 100%; - label { - line-height: 1; - font-family: "SourceSansPro", Helvetica, Arial, sans-serif; - display: block; - margin: 0px; - } .artigo { float: none; } } + } } .nomenclatura_heranca { @@ -1361,6 +1353,14 @@ a:link:after, a:visited:after { border: 0px; } } +.label_vigencia { + border-top: 1px solid white; + display: inline-block; + color: #555; + span { + color: gray; + } +} .cp-nav-parents { & > .dropdown-menu { left: 0; diff --git a/sapl/templates/compilacao/layout/dispositivo_checkbox.html b/sapl/templates/compilacao/layout/dispositivo_checkbox.html index e495e4b10..6f29a171a 100644 --- a/sapl/templates/compilacao/layout/dispositivo_checkbox.html +++ b/sapl/templates/compilacao/layout/dispositivo_checkbox.html @@ -3,18 +3,18 @@
{% include 'bootstrap/layout/field_errors_block.html' %} - {% for choice in field.field.choices %} - {% ifchanged choice.1.ta%} {% if not forloop.first %}{% endif %}
  • -
    - -
    -
    - +
    +
    + +
  • {% endifchanged %} @@ -40,8 +40,15 @@ {{ choice.1.tipo_dispositivo.nota_automatica_sufixo_html|safe }} {% endif %} +
+
+ {% if choice.1.inicio_vigencia %}{% trans "Início de Vigência:" %} {{choice.1.inicio_vigencia|default:''}}.{% endif %} + {% if choice.1.fim_vigencia %}{% trans "Fim de Vigência:" %} {{choice.1.fim_vigencia|default:''}}.{% endif %}
+ {% if choice.1.inicio_eficacia %}{% trans "Início de Eficácia:" %} {{choice.1.inicio_eficacia|default:''}}.{% endif %} + {% if choice.1.fim_eficacia %}{% trans "Fim de Eficácia:" %} {{choice.1.fim_eficacia|default:''}}.{% endif %} +
diff --git a/sapl/templates/compilacao/text_edit.html b/sapl/templates/compilacao/text_edit.html index e8aed58fc..953f00a84 100644 --- a/sapl/templates/compilacao/text_edit.html +++ b/sapl/templates/compilacao/text_edit.html @@ -20,7 +20,7 @@