From 285d32e29098aaaa392a61ca145b09e99549b1ba Mon Sep 17 00:00:00 2001 From: DTILegBG Date: Fri, 12 May 2017 14:53:25 -0300 Subject: [PATCH 001/193] separa por ano materias normas documentos_acessorios --- sapl/materia/models.py | 19 ++++++++++++------- sapl/norma/models.py | 5 ++++- sapl/utils.py | 6 +++--- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/sapl/materia/models.py b/sapl/materia/models.py index b5390f3b4..d5447095e 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -22,7 +22,6 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey, EM_TRAMITACAO = [(1, 'Sim'), (0, 'Não')] - def grupo_autor(): try: grupo = Group.objects.get(name='Autor') @@ -30,7 +29,6 @@ def grupo_autor(): return None return grupo.id - @reversion.register() class TipoProposicao(models.Model): descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) @@ -120,10 +118,15 @@ class Origem(models.Model): TIPO_APRESENTACAO_CHOICES = Choices(('O', 'oral', _('Oral')), ('E', 'escrita', _('Escrita'))) +def materia_upload_path(instance, filename): + return texto_upload_path(instance, filename, subpath=instance.ano) +def anexo_upload_path(instance, filename): + return texto_upload_path(instance, filename, subpath=instance.materia.ano) + @reversion.register() class MateriaLegislativa(models.Model): - + tipo = models.ForeignKey(TipoMateriaLegislativa, on_delete=models.PROTECT, verbose_name=_('Tipo')) @@ -194,7 +197,7 @@ class MateriaLegislativa(models.Model): texto_original = models.FileField( blank=True, null=True, - upload_to=texto_upload_path, + upload_to=materia_upload_path, verbose_name=_('Texto Original'), validators=[restringe_tipos_de_arquivo_txt]) @@ -215,6 +218,7 @@ class MateriaLegislativa(models.Model): def __str__(self): return _('%(tipo)s nº %(numero)s de %(ano)s') % { 'tipo': self.tipo, 'numero': self.numero, 'ano': self.ano} + def data_entrada_protocolo(self): ''' @@ -231,7 +235,7 @@ class MateriaLegislativa(models.Model): pass return '' - + def delete(self, using=None, keep_parents=False): if self.texto_original: self.texto_original.delete() @@ -255,6 +259,7 @@ class MateriaLegislativa(models.Model): force_update=force_update, using=using, update_fields=update_fields) + @reversion.register() @@ -392,7 +397,7 @@ class DocumentoAcessorio(models.Model): arquivo = models.FileField( blank=True, null=True, - upload_to=texto_upload_path, + upload_to=anexo_upload_path, verbose_name=_('Texto Integral'), validators=[restringe_tipos_de_arquivo_txt]) @@ -625,7 +630,7 @@ class Proposicao(models.Model): ('I', 'Incorporada')), verbose_name=_('Status Proposição')) texto_original = models.FileField( - upload_to=texto_upload_path, + upload_to=materia_upload_path, blank=True, null=True, verbose_name=_('Texto Original'), diff --git a/sapl/norma/models.py b/sapl/norma/models.py index 0d0b8ce6b..db552c9a9 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -59,6 +59,8 @@ 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) @reversion.register() class NormaJuridica(models.Model): @@ -67,10 +69,11 @@ class NormaJuridica(models.Model): ('F', 'federal', _('Federal')), ('M', 'municipal', _('Municipal')), ) + texto_integral = models.FileField( blank=True, null=True, - upload_to=texto_upload_path, + upload_to=norma_upload_path, verbose_name=_('Texto Integral'), validators=[restringe_tipos_de_arquivo_txt]) tipo = models.ForeignKey( diff --git a/sapl/utils.py b/sapl/utils.py index 81ebea6cc..7429a7e4c 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -605,8 +605,8 @@ def texto_upload_path(instance, filename, subpath=''): seguida para armazenar o arquivo. """ - if subpath and '/' not in subpath: - subpath = subpath + '/' +# if subpath and '/' not in subpath: +# subpath = subpath + '/' """ TODO: Verifique possibilidade de otimização do código de normalização do filename... @@ -624,7 +624,7 @@ def texto_upload_path(instance, filename, subpath=''): if isinstance(instance, (DocumentoAdministrativo, Proposicao)): prefix = 'private' - path = './sapl/%(prefix)s/%(model_name)s/%(pk)s/%(subpath)s%(filename)s' %\ + path = './sapl/%(prefix)s/%(model_name)s/%(subpath)s/%(pk)s/%(filename)s' %\ { 'prefix': prefix, 'model_name': instance._meta.model_name, From 189af3fa6604aded4b9a061ade5d70cf4780e954 Mon Sep 17 00:00:00 2001 From: Matheus Veleci Date: Mon, 15 May 2017 12:11:06 -0300 Subject: [PATCH 002/193] Separa os comandos bower install e compilescss do collectstatic no Dockerfile --- Dockerfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 838257c66..d35746703 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,9 +35,12 @@ COPY config/env_dockerfile /var/interlegis/sapl/sapl/.env # compilescss - Precompile all occurrences of your SASS/SCSS files for the whole project into css files RUN python3 manage.py bower_install -- --allow-root --no-input && \ - python3 manage.py compilescss && \ - python3 manage.py collectstatic --no-input && \ - rm -rf /var/interlegis/sapl/sapl/.env && \ + python3 manage.py compilescss + +RUN python3 manage.py collectstatic --noinput --clear + +# Remove .env(fake) e sapl.db da imagem +RUN rm -rf /var/interlegis/sapl/sapl/.env && \ rm -rf /var/interlegis/sapl/sapl.db RUN chmod +x /var/interlegis/sapl/start.sh && \ From 925f517d6fb7955338dbd3660cfc15443716aa15 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Mon, 15 May 2017 14:20:38 -0300 Subject: [PATCH 003/193] =?UTF-8?q?Adiciona=20novas=20extens=C3=B5es=20e?= =?UTF-8?q?=20arruma=20assert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luciano Almeida --- sapl/legacy/migracao_documentos.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index 21697dc4f..5320e6774 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -29,6 +29,17 @@ EXTENSOES = { 'text/html': '.html', 'text/rtf': '.rtf', 'text/x-python': '.py', + 'text/plain': '.ksh', + 'text/plain': '.c', + 'text/plain': '.h', + 'text/plain': '.txt', + 'text/plain': '.bat', + 'text/plain': '.pl', + 'text/plain': '.asc', + 'text/plain': '.text', + 'text/plain': '.pot', + 'text/plain': '.brf', + 'text/plain': '.srt', # sem extensao 'application/octet-stream': '', # binário @@ -105,9 +116,14 @@ def migrar_docs_logo(): print('#### Migrando logotipo da casa ####') [(_, origem, destino)] = DOCS[CasaLegislativa] props_sapl = os.path.dirname(origem) + # a pasta props_sapl deve conter apenas o origem e metadatas! + # Edit: Aparentemente há diretório que contém properties ao invés de + # metadata. O assert foi modificado para essa situação. assert set(os.listdir(em_media(props_sapl))) < { - 'logo_casa.gif', '.metadata', 'logo_casa.gif.metadata'} + 'logo_casa.gif', '.metadata', 'logo_casa.gif.metadata', + '.properties', 'logo_casa.gif.properties', '.objects'} + mover_documento(origem, destino) casa = get_casa_legislativa() casa.logotipo = destino From 0fb5b34b20f4432ac0ee444507f13a5ba4a35b84 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 15 May 2017 16:51:56 -0300 Subject: [PATCH 004/193] Bug fix --- sapl/materia/views.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index b93d81289..006e2cd88 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -7,7 +7,7 @@ from crispy_forms.layout import HTML from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin -from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.core.mail import send_mail from django.core.urlresolvers import reverse from django.http import HttpResponse, JsonResponse @@ -1355,6 +1355,11 @@ class AcompanhamentoMateriaView(CreateView): acompanhar.usuario = usuario.username acompanhar.confirmado = False acompanhar.save() + except MultipleObjectsReturned: + AcompanhamentoMateria.objects.filter( + email=email, + materia=materia, + hash=hash_txt).first() do_envia_email_confirmacao(request, materia, email) From ec4fb23a6657e190e52ca473568536bda963cfff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Tue, 16 May 2017 09:38:09 -0300 Subject: [PATCH 005/193] ajusta nome colunas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adiciona migração de DocumentosAcessoriosAdministrativos Ajusta nome das colunas da base --- sapl/legacy/migracao_documentos.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index 5320e6774..a8ffa52b5 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -11,6 +11,7 @@ from sapl.materia.models import (DocumentoAcessorio, MateriaLegislativa, from sapl.norma.models import NormaJuridica from sapl.parlamentares.models import Parlamentar from sapl.protocoloadm.models import DocumentoAdministrativo +from sapl.protocoloadm.models import DocumentoAcessorioAdministrativo from sapl.sessao.models import SessaoPlenaria from sapl.settings import MEDIA_ROOT from sapl.utils import delete_texto, save_texto @@ -64,7 +65,7 @@ DOCS = { 'materia/{}', 'documentoacessorio/{0}/{0}{1}')], NormaJuridica: [( - 'texto_original', + 'texto_integral', 'norma_juridica/{}_texto_integral', 'normajuridica/{0}/{0}_texto_integral{1}')], SessaoPlenaria: [ @@ -82,7 +83,13 @@ DOCS = { DocumentoAdministrativo: [( 'texto_integral', 'administrativo/{}_texto_integral', - 'documentoadministrativo/{0}/{0}_texto_integral{1}')], + 'documentoadministrativo/{0}/{0}_texto_integral{1}') + ], + DocumentoAcessorioAdministrativo: [( + 'arquivo', + 'administrativo/{}', + 'documentoadministrativo/{0}/{0}_acessorio_administrativo{1}') + ], } DOCS = {tipo: [(campo, @@ -215,6 +222,7 @@ def migrar_documentos(): SessaoPlenaria, Proposicao, DocumentoAdministrativo, + DocumentoAcessorioAdministrativo, ]: migrar_docs_por_ids(tipo) From 239b91d600333f3d19b4f6bdd6843145f053e719 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 16 May 2017 10:40:39 -0300 Subject: [PATCH 006/193] Coloca em ordem alfabetica os subitens da navbar --- sapl/templates/navbar.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sapl/templates/navbar.yaml b/sapl/templates/navbar.yaml index 80235ecb6..502fb09f1 100644 --- a/sapl/templates/navbar.yaml +++ b/sapl/templates/navbar.yaml @@ -5,10 +5,10 @@ - title: {% trans 'Institucional' %} children: - - title: {% trans 'Mesa Diretora' %} - url: sapl.parlamentares:mesa_diretora - title: {% trans 'Comissões' %} url: sapl.comissoes:comissao_list + - title: {% trans 'Mesa Diretora' %} + url: sapl.parlamentares:mesa_diretora - title: {% trans 'Parlamentares' %} url: sapl.parlamentares:parlamentar_list @@ -26,21 +26,21 @@ - title: {% trans 'Atividade Legislativa' %} children: + - title: {% trans 'Acessório em Lote' %} + url: sapl.materia:acessorio_em_lote + check_permission: materia.list_documentoacessorio {% comment %} FIXME transformar para checagens de menu_[funcionalidade]{% endcomment%} + - title: {% trans 'Matérias Legislativas' %} + url: sapl.materia:pesquisar_materia + - title: {% trans 'Pautas das Sessões' %} + url: sapl.sessao:pesquisar_pauta - title: {% trans 'Proposições' %} url: sapl.materia:proposicao_list check_permission: materia.add_proposicao - - title: {% trans 'Matérias Legislativas' %} - url: sapl.materia:pesquisar_materia - title: {% trans 'Sessões Plenárias' %} url: sapl.sessao:pesquisar_sessao - - title: {% trans 'Pautas das Sessões' %} - url: sapl.sessao:pesquisar_pauta - title: {% trans 'Tramitação em Lote' %} url: sapl.materia:primeira_tramitacao_em_lote check_permission: materia.list_tramitacao {% comment %} FIXME transformar para checagens de menu_[funcionalidade]{% endcomment%} - - title: {% trans 'Acessório em Lote' %} - url: sapl.materia:acessorio_em_lote - check_permission: materia.list_documentoacessorio {% comment %} FIXME transformar para checagens de menu_[funcionalidade]{% endcomment%} - title: {% trans 'Normas Jurídicas' %} children: From f66ff5965b3e472b9513e59bdf47f97ea02e1525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 17 May 2017 11:10:22 -0300 Subject: [PATCH 007/193] ajusta caminho DocumentoAcessorioAdministrativo --- sapl/legacy/migracao_documentos.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index a8ffa52b5..7e6182222 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -86,9 +86,9 @@ DOCS = { 'documentoadministrativo/{0}/{0}_texto_integral{1}') ], DocumentoAcessorioAdministrativo: [( - 'arquivo', + 'arquivo', 'administrativo/{}', - 'documentoadministrativo/{0}/{0}_acessorio_administrativo{1}') + 'documentoacessorioadministrativo/{0}/{0}_acessorio_administrativo{1}') ], } From dafc5132365a18408b81d6603533b1671fba8825 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Wed, 17 May 2017 11:44:46 -0300 Subject: [PATCH 008/193] =?UTF-8?q?Adiciona=20exception=20para=20extens?= =?UTF-8?q?=C3=A3o=20n=C3=A3o=20suportada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luciano Almeida --- sapl/base/search_indexes.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py index c85be523b..e41dac3bf 100644 --- a/sapl/base/search_indexes.py +++ b/sapl/base/search_indexes.py @@ -7,6 +7,8 @@ from haystack import indexes from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa from sapl.norma.models import NormaJuridica +from textract.exceptions import ExtensionNotSupported + class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) @@ -32,15 +34,19 @@ class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable): if arquivo: try: arquivo.open() + arquivo.close() except OSError: return self.prepared_data if not os.path.splitext(arquivo.path)[1][:1]: return self.prepared_data - extracted_data = textract.process( - arquivo.path).decode( - 'utf-8').replace('\n', ' ') + try: + extracted_data = textract.process( + arquivo.path).decode( + 'utf-8').replace('\n', ' ') + except ExtensionNotSupported: + return self.prepared_data extracted_data = extracted_data.replace('\t', ' ') From f331dedb1984282841b3030b826e3e701eebdd93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Wed, 17 May 2017 12:56:47 -0300 Subject: [PATCH 009/193] =?UTF-8?q?fix=20indenta=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_documentos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index 7e6182222..7bb3c0347 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -86,7 +86,7 @@ DOCS = { 'documentoadministrativo/{0}/{0}_texto_integral{1}') ], DocumentoAcessorioAdministrativo: [( - 'arquivo', + 'arquivo', 'administrativo/{}', 'documentoacessorioadministrativo/{0}/{0}_acessorio_administrativo{1}') ], From 30928396668b0ac1bf5492e5d1e0836a73311a6e Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Fri, 19 May 2017 11:06:03 -0300 Subject: [PATCH 010/193] Adicionando nome da comissao em autor Signed-off-by: Luciano Almeida --- sapl/legacy/migration.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index baf105e74..c8e736694 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -723,6 +723,7 @@ def adjust_autor(new, old): new.nome = new.autor_related.nome_parlamentar elif old.cod_comissao: new.autor_related = Comissao.objects.get(pk=old.cod_comissao) + new.nome = new.autor_related.nome if old.col_username: if not get_user_model().objects.filter( From c9c5122e6f621216ff871d481b386725303a651d Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Fri, 19 May 2017 11:08:33 -0300 Subject: [PATCH 011/193] Mudando tamanho do campo nome do autor Signed-off-by: Luciano Almeida --- .../migrations/0003_auto_20170519_1106.py | 20 +++++++++++++++++++ sapl/base/models.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 sapl/base/migrations/0003_auto_20170519_1106.py diff --git a/sapl/base/migrations/0003_auto_20170519_1106.py b/sapl/base/migrations/0003_auto_20170519_1106.py new file mode 100644 index 000000000..f16a20172 --- /dev/null +++ b/sapl/base/migrations/0003_auto_20170519_1106.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.12 on 2017-05-19 11:06 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0002_auto_20170331_1900'), + ] + + operations = [ + migrations.AlterField( + model_name='autor', + name='nome', + field=models.CharField(blank=True, max_length=60, verbose_name='Nome do Autor'), + ), + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index 9dd0f5ec3..3edef25e9 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -211,7 +211,7 @@ class Autor(models.Model): autor_related = GenericForeignKey('content_type', 'object_id') nome = models.CharField( - max_length=50, blank=True, verbose_name=_('Nome do Autor')) + max_length=60, blank=True, verbose_name=_('Nome do Autor')) cargo = models.CharField(max_length=50, blank=True) From 1dc343d246fab65236340f8591fbf78342596a35 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Mon, 22 May 2017 11:16:34 -0300 Subject: [PATCH 012/193] Muda timestamp de norma pra null Signed-off-by: Luciano Almeida --- .../migrations/0004_auto_20170522_1115.py | 27 +++++++++++++++++++ sapl/norma/models.py | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 sapl/norma/migrations/0004_auto_20170522_1115.py diff --git a/sapl/norma/migrations/0004_auto_20170522_1115.py b/sapl/norma/migrations/0004_auto_20170522_1115.py new file mode 100644 index 000000000..26e390bdb --- /dev/null +++ b/sapl/norma/migrations/0004_auto_20170522_1115.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.12 on 2017-05-22 11:15 +from __future__ import unicode_literals + +from django.db import migrations, models +import sapl.norma.models +import sapl.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0003_auto_20170510_1549'), + ] + + operations = [ + migrations.AlterField( + model_name='normajuridica', + name='texto_integral', + field=models.FileField(blank=True, null=True, upload_to=sapl.norma.models.norma_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Integral'), + ), + migrations.AlterField( + model_name='normajuridica', + name='timestamp', + field=models.DateTimeField(null=True), + ), + ] diff --git a/sapl/norma/models.py b/sapl/norma/models.py index db552c9a9..20166e7f5 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -116,7 +116,7 @@ class NormaJuridica(models.Model): AssuntoNorma, blank=True, verbose_name=_('Assuntos')) data_vigencia = models.DateField(blank=True, null=True) - timestamp = models.DateTimeField() + timestamp = models.DateTimeField(null=True) texto_articulado = GenericRelation( TextoArticulado, related_query_name='texto_articulado') From 0b0bd3a166cfee56392e7077fdd90ad54fcb0d62 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Mon, 22 May 2017 11:18:48 -0300 Subject: [PATCH 013/193] =?UTF-8?q?Adiciona=20n=C3=BAmero=20da=20ordem=20d?= =?UTF-8?q?o=20dia=20caso=20seja=20nulo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luciano Almeida --- sapl/legacy/migration.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index c8e736694..7efa97f73 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -580,11 +580,27 @@ def migrate(obj=appconfs, interativo=True): # MIGRATION_ADJUSTMENTS ##################################################### -def adjust_ordemdia(new, old): +def adjust_ordemdia_antes_salvar(new, old): # Prestar atenção if not old.tip_votacao: new.tipo_votacao = 1 + if old.num_ordem is None: + new.numero_ordem = 999999999 + + +def adjust_ordemdia_depois_salvar(new, old): + if old.num_ordem is None and new.numero_ordem == 999999999: + with reversion.create_revision(): + problema = 'OrdemDia de PK %s tinha seu valor de numero ordem'\ + ' nulo.' % old.pk + descricao = 'O valor %s foi colocado no lugar.' % new.numero_ordem + warn(problema + ' => ' + descricao) + save_relation(obj=new, problema=problema, + descricao=descricao, eh_stub=False) + reversion.set_comment('OrdemDia sem número da ordem.') + pass + def adjust_parlamentar(new, old): if old.ind_unid_deliberativa: @@ -754,7 +770,7 @@ AJUSTE_ANTES_SALVAR = { Comissao: adjust_comissao, NormaJuridica: adjust_normajuridica_antes_salvar, NormaRelacionada: adjust_normarelacionada, - OrdemDia: adjust_ordemdia, + OrdemDia: adjust_ordemdia_antes_salvar, Parlamentar: adjust_parlamentar, Participacao: adjust_participacao, Protocolo: adjust_protocolo, @@ -767,6 +783,7 @@ AJUSTE_ANTES_SALVAR = { AJUSTE_DEPOIS_SALVAR = { NormaJuridica: adjust_normajuridica_depois_salvar, + OrdemDia: adjust_ordemdia_depois_salvar, Protocolo: adjust_protocolo_depois_salvar, RegistroVotacao: adjust_registrovotacao_depois_salvar, } From b46c7cfb65c8ff29ee27d6f9e6055ffd3edbdc4e Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 22 May 2017 12:02:54 -0300 Subject: [PATCH 014/193] Fix #1089 --- sapl/crud/base.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sapl/crud/base.py b/sapl/crud/base.py index 1a1225cfc..a00336fc7 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -9,6 +9,7 @@ from django import forms from django.conf.urls import url from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin +from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.db import models from django.db.models.fields.related import ForeignKey @@ -1133,7 +1134,11 @@ class MasterDetailCrud(Crud): parent_field = obj.parent_field.split('__') if not obj.is_m2m or len(parent_field) > 1: field = self.model._meta.get_field(parent_field[0]) - parent = field.related_model.objects.get(pk=self.kwargs['pk']) + try: + parent = field.related_model.objects.get( + pk=self.kwargs['pk']) + except ObjectDoesNotExist: + raise Http404() setattr(form.instance, parent_field[0], parent) return form @@ -1155,7 +1160,7 @@ class MasterDetailCrud(Crud): try: parent_object = parent_model.objects.get(**params) - except: + except Exception: raise Http404() else: parent_model = self.model From b407641cbf26c2ad2491b37e85ac61d8a5090d79 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 22 May 2017 12:36:24 -0300 Subject: [PATCH 015/193] add arq sql no instalador de reutil. da app sapl --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 9a70ef5bd..3fe372d5d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,5 +2,6 @@ include README.rst LICENSE.txt recursive-include sapl *.html *.yaml recursive-include sapl/static * recursive-include sapl/relatorios/templates *.py +recursive-include sapl/compilacao *.sql global-exclude __pycache__ global-exclude *.py[co] From c0ab76b3e59353f15feb1a03bbbb75eaeb00f177 Mon Sep 17 00:00:00 2001 From: Luciano Henrique Nunes de Almeida Date: Mon, 22 May 2017 13:15:16 -0300 Subject: [PATCH 016/193] fix #1092 - Altera o destino dos documentos migrados (#1093) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Altera o destino dos documentos migrados Signed-off-by: Luciano Almeida * Usa a data de matéria em doc acessório Signed-off-by: Luciano Almeida * ajusta caminho public private --- sapl/legacy/migracao_documentos.py | 39 ++++++++++++++++++------------ 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index 7bb3c0347..8ac380b5f 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -55,40 +55,40 @@ DOCS = { Parlamentar: [( 'fotografia', 'parlamentar/fotos/{}_foto_parlamentar', - 'parlamentar/{0}/{0}_foto_parlamentar{1}')], + 'public/parlamentar/{0}/{0}_foto_parlamentar{1}')], MateriaLegislativa: [( 'texto_original', 'materia/{}_texto_integral', - 'materialegislativa/{0}/{0}_texto_integral{1}')], + 'public/materialegislativa/{2}/{0}/{0}_texto_integral{1}')], DocumentoAcessorio: [( 'arquivo', 'materia/{}', - 'documentoacessorio/{0}/{0}{1}')], + 'public/documentoacessorio/{2}/{0}/{0}{1}')], NormaJuridica: [( 'texto_integral', 'norma_juridica/{}_texto_integral', - 'normajuridica/{0}/{0}_texto_integral{1}')], + 'public/normajuridica/{2}/{0}/{0}_texto_integral{1}')], SessaoPlenaria: [ ('upload_ata', 'ata_sessao/{}_ata_sessao', - 'sessaoplenaria/{0}/ata/{0}_ata_sessao{1}'), + 'public/sessaoplenaria/{0}/ata/{0}_ata_sessao{1}'), ('upload_anexo', 'anexo_sessao/{}_texto_anexado', - 'sessaoplenaria/{0}/anexo/{0}_texto_anexado{1}') + 'public/sessaoplenaria/{0}/anexo/{0}_texto_anexado{1}') ], Proposicao: [( 'texto_original', 'proposicao/{}', - 'proposicao/{0}/{0}{1}')], + 'private/proposicao/{0}/{0}{1}')], DocumentoAdministrativo: [( 'texto_integral', 'administrativo/{}_texto_integral', - 'documentoadministrativo/{0}/{0}_texto_integral{1}') + 'private/documentoadministrativo/{0}/{0}_texto_integral{1}') ], DocumentoAcessorioAdministrativo: [( - 'arquivo', + 'arquivo', 'administrativo/{}', - 'documentoacessorioadministrativo/{0}/{0}_acessorio_administrativo{1}') + 'private/documentoacessorioadministrativo/{0}/{0}_acessorio_administrativo{1}') ], } @@ -169,15 +169,22 @@ def migrar_docs_por_ids(tipo): for arq in os.listdir(dir_origem): match = pat.match(arq) if match: - origem = os.path.join(dir_origem, match.group(0)) - id = match.group(1) - extensao = get_extensao(origem) - destino = base_destino.format(id, extensao) - mover_documento(origem, destino) - # associa documento ao objeto try: + origem = os.path.join(dir_origem, match.group(0)) + id = match.group(1) obj = tipo.objects.get(pk=id) + + extensao = get_extensao(origem) + if hasattr(obj, "ano"): + destino = base_destino.format(id, extensao, obj.ano) + elif isinstance(obj, DocumentoAcessorio): + destino = base_destino.format( + id, extensao, obj.materia.ano) + else: + destino = base_destino.format(id, extensao) + mover_documento(origem, destino) + setattr(obj, campo, destino) obj.save() except tipo.DoesNotExist: From 65b1148a57c18fbabfd19ce538e2eb5d46d9dc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 22 May 2017 13:18:34 -0300 Subject: [PATCH 017/193] fix #1098 (#1107) --- sapl/templates/parlamentares/parlamentar_perfil_publico.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/parlamentares/parlamentar_perfil_publico.html b/sapl/templates/parlamentares/parlamentar_perfil_publico.html index 1c5ead0fc..705eac9f5 100644 --- a/sapl/templates/parlamentares/parlamentar_perfil_publico.html +++ b/sapl/templates/parlamentares/parlamentar_perfil_publico.html @@ -61,7 +61,7 @@
-

Fax:   {{object.numero_gab_parlamentar|default_if_none:"Não informado"}}

+

Fax:   {{object.fax|default_if_none:"Não informado"}}

From a45b047c8ef110f53efac7ef99d5ac499e15de07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 22 May 2017 13:20:03 -0300 Subject: [PATCH 018/193] Padroniza tamanho foto para mesa (#1088) --- sapl/templates/parlamentares/public_composicaomesa_form.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/templates/parlamentares/public_composicaomesa_form.html b/sapl/templates/parlamentares/public_composicaomesa_form.html index 6eaa3f6e5..d9150da59 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 %} @@ -140,4 +140,4 @@ function altera_field(id_legislatura, id_sessao=null){ -{% endblock %} \ No newline at end of file +{% endblock %} From d8d3ef878122397dda5b2802a1185fb2507e5bdb Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 22 May 2017 13:54:30 -0300 Subject: [PATCH 019/193] Bug Fix --- sapl/materia/views.py | 18 +++++++++++++++--- sapl/protocoloadm/views.py | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 006e2cd88..4ff498cec 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -162,14 +162,26 @@ class CriarProtocoloMateriaView(CreateView): context = super( CriarProtocoloMateriaView, self).get_context_data(**kwargs) - protocolo = Protocolo.objects.get(pk=self.kwargs['pk']) + try: + protocolo = Protocolo.objects.get(pk=self.kwargs['pk']) + except ObjectDoesNotExist: + raise Http404() + + materias_ano = MateriaLegislativa.objects.filter( + ano=protocolo.ano, + tipo=protocolo.tipo_materia).order_by('-numero') + + if materias_ano: + numero = materias_ano.first().numero + 1 + else: + numero = 1 context['form'].fields['tipo'].initial = protocolo.tipo_materia - context['form'].fields['numero'].initial = protocolo.numero + context['form'].fields['numero'].initial = numero context['form'].fields['ano'].initial = protocolo.ano context['form'].fields['data_apresentacao'].initial = protocolo.data context['form'].fields['numero_protocolo'].initial = protocolo.numero - context['form'].fields['ementa'].initial = protocolo.observacao + context['form'].fields['ementa'].initial = protocolo.assunto_ementa return context diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 9505f3bd9..b50edaaf0 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -425,6 +425,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): id=self.request.POST['tipo_materia']) protocolo.numero_paginas = self.request.POST['numero_paginas'] protocolo.observacao = self.request.POST['observacao'] + protocolo.assunto_ementa = self.request.POST['assunto_ementa'] protocolo.save() return redirect(self.get_success_url(protocolo)) From 32ee9220c98ac88945f52d74b2b31c88aee6a9ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 22 May 2017 14:03:18 -0300 Subject: [PATCH 020/193] Fix 1104 (#1110) --- sapl/materia/forms.py | 12 ------------ sapl/materia/views.py | 4 ---- sapl/templates/materia/documentoacessorio_form.html | 2 +- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 7c0b6d8c8..978fce522 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -164,18 +164,6 @@ class DocumentoAcessorioForm(ModelForm): class Meta: model = DocumentoAcessorio fields = ['tipo', 'nome', 'data', 'autor', 'ementa', 'arquivo'] - widgets = {'autor': forms.HiddenInput()} - - def clean_autor(self): - autor_field = self.cleaned_data['autor'] - try: - int(autor_field) - except ValueError: - return autor_field - else: - if autor_field: - return str(Autor.objects.get(id=autor_field)) - class RelatoriaForm(ModelForm): diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 4ff498cec..c3ad9f9e4 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -963,25 +963,21 @@ class DocumentoAcessorioCrud(MasterDetailCrud): form_class = DocumentoAcessorioForm def __init__(self, **kwargs): - montar_helper_documento_acessorio(self) super(MasterDetailCrud.CreateView, self).__init__(**kwargs) def get_context_data(self, **kwargs): context = super( MasterDetailCrud.CreateView, self).get_context_data(**kwargs) - context['helper'] = self.helper return context class UpdateView(MasterDetailCrud.UpdateView): form_class = DocumentoAcessorioForm def __init__(self, **kwargs): - montar_helper_documento_acessorio(self) super(MasterDetailCrud.UpdateView, self).__init__(**kwargs) def get_context_data(self, **kwargs): context = super(UpdateView, self).get_context_data(**kwargs) - context['helper'] = self.helper return context diff --git a/sapl/templates/materia/documentoacessorio_form.html b/sapl/templates/materia/documentoacessorio_form.html index fb5810653..e25d5d3ab 100644 --- a/sapl/templates/materia/documentoacessorio_form.html +++ b/sapl/templates/materia/documentoacessorio_form.html @@ -2,5 +2,5 @@ {% load i18n crispy_forms_tags %} {% block base_content %} - {% crispy form helper %} + {% crispy form %} {% endblock %} From 0813a7061872db028f98b5067ca9599ff33258b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Mon, 22 May 2017 14:21:22 -0300 Subject: [PATCH 021/193] adiciona poppler-utils (#1113) --- docs/instacao31.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/instacao31.rst b/docs/instacao31.rst index 3d6a8b3eb..9a42573ac 100644 --- a/docs/instacao31.rst +++ b/docs/instacao31.rst @@ -28,7 +28,7 @@ Instalar as seguintes dependências do sistema:: pkg-config postgresql postgresql-contrib pgadmin3 python-psycopg2 \ software-properties-common build-essential libxml2-dev libjpeg-dev \ libmysqlclient-dev libssl-dev libffi-dev libxslt1-dev python3-setuptools \ - python3-pip curl + python3-pip curl poppler-utils sudo -i curl -sL https://deb.nodesource.com/setup_5.x | bash - From acb467bfa243ec05b039103da5765fb7b9635445 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 22 May 2017 14:26:41 -0300 Subject: [PATCH 022/193] =?UTF-8?q?Adiciona=20poppler-utils,=20onde=20est?= =?UTF-8?q?=C3=A1=20pdftotext=20que=20=C3=A9=20usado=20por=20indexador.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d35746703..85724ca11 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM alpine:3.5 ENV BUILD_PACKAGES postgresql-dev graphviz-dev graphviz build-base git pkgconfig \ python3-dev libxml2-dev jpeg-dev libressl-dev libffi-dev libxslt-dev nodejs py3-lxml \ -py3-magic postgresql-client vim +py3-magic postgresql-client poppler-utils vim RUN apk add --no-cache python3 nginx && \ python3 -m ensurepip && \ From 3746b59f0aac97c8c50db2c7671105c15c090f9d Mon Sep 17 00:00:00 2001 From: cristian-longhi Date: Mon, 22 May 2017 14:33:49 -0300 Subject: [PATCH 023/193] =?UTF-8?q?redesenha=20a=20exibi=C3=A7=C3=A3o=20do?= =?UTF-8?q?s=20votos=20na=20tela=20de=20vota=C3=A7=C3=A3o=20nominal=20#110?= =?UTF-8?q?0=20(#1101)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * resultado de votação nominal * Update nominal_detail.html * Update nominal_edit.html --- sapl/templates/sessao/votacao/nominal_detail.html | 9 +++++++-- sapl/templates/sessao/votacao/nominal_edit.html | 11 +++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/sapl/templates/sessao/votacao/nominal_detail.html b/sapl/templates/sessao/votacao/nominal_detail.html index e27fd3c53..53d41084b 100644 --- a/sapl/templates/sessao/votacao/nominal_detail.html +++ b/sapl/templates/sessao/votacao/nominal_detail.html @@ -18,8 +18,13 @@ Votos
{% for v in votos %} -
{{v.parlamentar}}
-
{{v.voto}}
+
{{v.parlamentar}} - + {% if v.voto == '-1'%} + Voto não Registrado + {% else %} + {{v.voto}} + {% endif %} +
{% endfor %}
diff --git a/sapl/templates/sessao/votacao/nominal_edit.html b/sapl/templates/sessao/votacao/nominal_edit.html index 83d584a33..35297e36c 100644 --- a/sapl/templates/sessao/votacao/nominal_edit.html +++ b/sapl/templates/sessao/votacao/nominal_edit.html @@ -18,8 +18,15 @@ Votos
{% for v in votos %} -
{{v.parlamentar}}
-
{{v.voto}}
+ +
{{v.parlamentar}} - + {% if v.voto == '-1'%} + Voto não Registrado + {% else %} + {{v.voto}} + {% endif %} +
+ {% endfor %}
From 0484f475e00a5a7ca04744545b5256ac7a815ef1 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 22 May 2017 14:54:52 -0300 Subject: [PATCH 024/193] =?UTF-8?q?Adiciona=20URL=20do=20Interlegis=20ao?= =?UTF-8?q?=20rodap=C3=A9=20da=20p=C3=A1gina.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/templates/base.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 51351e7a0..5348ee291 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -157,11 +157,13 @@
+ {% trans 'Logo do Interlegis' %} +

- Desenvolvido pelo Interlegis em software livre e aberto. + Desenvolvido pelo Interlegis em software livre e aberto.

From 10839b1d9de53f89ea02f87f0f3d1071f4a73991 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 22 May 2017 15:58:05 -0300 Subject: [PATCH 025/193] Somente mostra interessado se Doc Adm e mostra Autor em listagem de pesquisa --- sapl/templates/protocoloadm/protocolo_filter.html | 10 ++++++++-- sapl/templates/protocoloadm/protocolo_list.html | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index dc00317cd..afd9f61a3 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -44,9 +44,15 @@
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" }}
- Interessado: {{ p.interessado }}
+ Autor: {{protocolo.autor.nome}}
Natureza do Processo: - {% if p.tipo_processo == 0 %} Administrativo {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
+ {% if p.tipo_processo == 0 %} + Administrativo
+ Interessado: {{ p.interessado }} + {% elif p.tipo_processo == 1 %} + Matéria Legislativa + {% endif %} +
Classificação: {{ p.tipo_documento|default_if_none:p.tipo_materia }}
{% if p.anulado %} Anulado por: {{ p.user_anulacao }} - IP {{ p.ip_anulacao }}
diff --git a/sapl/templates/protocoloadm/protocolo_list.html b/sapl/templates/protocoloadm/protocolo_list.html index d5f3b9a8c..4ae55baf0 100644 --- a/sapl/templates/protocoloadm/protocolo_list.html +++ b/sapl/templates/protocoloadm/protocolo_list.html @@ -21,10 +21,10 @@
Assunto: {{ p.assunto_ementa }}
Data Protocolo: {{ p.data|date:"d/m/Y" }} - Horário: {{ p.timestamp|date:"H:m:s" }}
- Interessado: {{ p.interessado }}
Natureza do Processo: {% if p.tipo_processo == 0 %} - Administrativo + Administrativo
+ Interessado: {{ p.interessado }}
{% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
From d68f5256480c6842bcde40042269c21cda05fd05 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 22 May 2017 16:08:03 -0300 Subject: [PATCH 026/193] HOT-FIX: identificador de protocolo errado --- sapl/templates/protocoloadm/protocolo_filter.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index afd9f61a3..36fbf092a 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -44,7 +44,7 @@
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" }}
- Autor: {{protocolo.autor.nome}}
+ Autor: {{p.autor.nome}}
Natureza do Processo: {% if p.tipo_processo == 0 %} Administrativo
From 29e30da6202c25f1e280c5b562bf003caef2defb Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 22 May 2017 16:52:05 -0300 Subject: [PATCH 027/193] =?UTF-8?q?Atualiza=20c=C3=B3digo=20devido=20a=20d?= =?UTF-8?q?eprecated=20na=20drf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/api/serializers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py index 21a48a848..60ea6692a 100644 --- a/sapl/api/serializers.py +++ b/sapl/api/serializers.py @@ -46,6 +46,7 @@ class AutorSerializer(serializers.ModelSerializer): class Meta: model = Autor + fields = '__all__' class MateriaLegislativaSerializer(serializers.ModelSerializer): From fa724cffb70352cef5b6e15185042ed4254a12d6 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 22 May 2017 17:01:13 -0300 Subject: [PATCH 028/193] =?UTF-8?q?HOT-FIX:=20poss=C3=ADvel=20fix=20para?= =?UTF-8?q?=20erro=20de=20render=20no=20search=20index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/search_indexes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py index e41dac3bf..58e1688c4 100644 --- a/sapl/base/search_indexes.py +++ b/sapl/base/search_indexes.py @@ -54,8 +54,8 @@ class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable): # text field with *all* of our metadata visible for templating: t = loader.select_template(( 'search/indexes/' + self.template_name, )) - data['text'] = t.render(Context({'object': obj, - 'extracted': extracted_data})) + data['text'] = t.render({'object': obj, + 'extracted': extracted_data}) return data From fe5a28ccdc9eaec40202927186daa73bab52e2b5 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 22 May 2017 18:03:34 -0300 Subject: [PATCH 029/193] Add pesquisa em Autor pelo campo ativo de parlamentar --- sapl/api/forms.py | 11 ++++++----- sapl/parlamentares/models.py | 12 +++++++++++- sapl/utils.py | 24 +++++++++++++----------- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/sapl/api/forms.py b/sapl/api/forms.py index c220c01b2..4609273e4 100644 --- a/sapl/api/forms.py +++ b/sapl/api/forms.py @@ -35,10 +35,11 @@ class SaplGenericRelationSearchFilterSet(FilterSet): item.related_query_name(), field[0]) ) - q_fs = q_fs | Q(**{'%s__%s%s' % ( - item.related_query_name(), - field[0], - field[1]): qtext}) + if len(field) == 3 and field[2](qtext) is not None: + q_fs = q_fs | Q(**{'%s__%s%s' % ( + item.related_query_name(), + field[0], + field[1]): qtext if len(field) == 2 else field[2](qtext)}) q = q & q_fs @@ -60,4 +61,4 @@ class AutorChoiceFilterSet(SaplGenericRelationSearchFilterSet): def filter_q(self, queryset, value): return SaplGenericRelationSearchFilterSet.filter_q( - self, queryset, value).order_by('nome') + self, queryset, value).distinct('nome').order_by('nome') diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index 4d15ab6fd..2f1284fbf 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, @@ -206,6 +206,15 @@ def foto_upload_path(instance, filename): return texto_upload_path(instance, filename, subpath='') +def true_false_none(x): + if x == 'True': + return True + elif x == 'False': + return False + else: + return None + + @reversion.register() class Parlamentar(models.Model): FEMININO = 'F' @@ -303,6 +312,7 @@ class Parlamentar(models.Model): ('nome_completo', '__icontains'), ('nome_parlamentar', '__icontains'), ('filiacao__partido__sigla', '__icontains'), + ('ativo', '', true_false_none), )) class Meta: diff --git a/sapl/utils.py b/sapl/utils.py index 7429a7e4c..4873d3519 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1,15 +1,13 @@ -import hashlib -import logging -import os -import re from datetime import date from functools import wraps -from unicodedata import normalize as unicodedata_normalize from subprocess import PIPE, call from threading import Thread +from unicodedata import normalize as unicodedata_normalize +import hashlib +import logging +import os +import re -import django_filters -import magic from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button from django import forms @@ -22,10 +20,13 @@ from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from floppyforms import ClearableFileInput from reversion.admin import VersionAdmin +import django_filters +import magic 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) @@ -159,8 +160,8 @@ class SaplGenericRelation(GenericRelation): assert isinstance(field, (tuple, list)), _( 'fields_search deve ser um array de tuplas ou listas.') - assert len(field) == 2, _( - 'cada tupla de fields_search deve possuir duas strins') + assert len(field) <= 3, _( + 'cada tupla de fields_search deve possuir até 3 strings') # TODO implementar assert para validar campos do Model e lookups @@ -368,8 +369,8 @@ def fabrica_validador_de_tipos_de_arquivo(lista, nome): def restringe_tipos_de_arquivo(value): if not os.path.splitext(value.path)[1][:1]: - raise ValidationError(_( - 'Não é possível fazer upload de arquivos sem extensão.')) + raise ValidationError(_( + 'Não é possível fazer upload de arquivos sem extensão.')) mime = magic.from_buffer(value.read(), mime=True) if mime not in lista: @@ -637,6 +638,7 @@ def texto_upload_path(instance, filename, subpath=''): class UpdateIndexCommand(Thread): + def run(self): call([PROJECT_DIR.child('manage.py'), 'update_index'], stdout=PIPE) From d03946b1c0b3143b9f7a99704c4e9b349066e2bd Mon Sep 17 00:00:00 2001 From: Eliseu Egewarth Date: Mon, 22 May 2017 19:09:48 -0300 Subject: [PATCH 030/193] =?UTF-8?q?Gera=20migra=C3=A7=C3=A3o=20referente?= =?UTF-8?q?=20ao=20commit=20#285d32e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Eliseu Egewarth --- .../migrations/0005_auto_20170522_1904.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 sapl/materia/migrations/0005_auto_20170522_1904.py diff --git a/sapl/materia/migrations/0005_auto_20170522_1904.py b/sapl/materia/migrations/0005_auto_20170522_1904.py new file mode 100644 index 000000000..7789aec96 --- /dev/null +++ b/sapl/materia/migrations/0005_auto_20170522_1904.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.12 on 2017-05-22 19:04 +from __future__ import unicode_literals + +from django.db import migrations, models +import sapl.materia.models +import sapl.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0004_auto_20170504_1751'), + ] + + operations = [ + migrations.AlterField( + model_name='documentoacessorio', + name='arquivo', + field=models.FileField(blank=True, null=True, upload_to=sapl.materia.models.anexo_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Integral'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='texto_original', + field=models.FileField(blank=True, null=True, upload_to=sapl.materia.models.materia_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Original'), + ), + migrations.AlterField( + model_name='proposicao', + name='texto_original', + field=models.FileField(blank=True, null=True, upload_to=sapl.materia.models.materia_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Original'), + ), + ] From d0640b06c88bab30d326a4e84f37d0d7f022f1e3 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 23 May 2017 11:17:30 -0300 Subject: [PATCH 031/193] Add bsc param de Autor nos Models lig via GR a Autor --- sapl/api/forms.py | 53 +++++++++++++++++++++++++++++ sapl/api/views.py | 58 ++++++++++++++++++++++++++++++-- sapl/utils.py | 86 ----------------------------------------------- 3 files changed, 109 insertions(+), 88 deletions(-) diff --git a/sapl/api/forms.py b/sapl/api/forms.py index 4609273e4..afa9190f4 100644 --- a/sapl/api/forms.py +++ b/sapl/api/forms.py @@ -1,5 +1,8 @@ from django.db.models import Q +from django.forms.fields import MultiValueField, CharField +from django.forms.widgets import TextInput, MultiWidget from django_filters.filters import MethodFilter, ModelChoiceFilter +from rest_framework.compat import django_filters from rest_framework.filters import FilterSet from sapl.base.models import Autor, TipoAutor @@ -49,6 +52,37 @@ class SaplGenericRelationSearchFilterSet(FilterSet): return queryset +class SearchForFieldWidget(MultiWidget): + + def decompress(self, value): + if value is None: + return [None, None] + return value + + def __init__(self, attrs=None): + widgets = (TextInput, TextInput) + MultiWidget.__init__(self, widgets, attrs) + + +class SearchForFieldField(MultiValueField): + widget = SearchForFieldWidget + + def __init__(self, *args, **kwargs): + fields = ( + CharField(), + CharField()) + super(SearchForFieldField, self).__init__(fields, *args, **kwargs) + + def compress(self, parameters): + if parameters: + return parameters + return None + + +class SearchForFieldFilter(django_filters.filters.MethodFilter): + field_class = SearchForFieldField + + class AutorChoiceFilterSet(SaplGenericRelationSearchFilterSet): q = MethodFilter() tipo = ModelChoiceFilter(queryset=TipoAutor.objects.all()) @@ -62,3 +96,22 @@ class AutorChoiceFilterSet(SaplGenericRelationSearchFilterSet): def filter_q(self, queryset, value): return SaplGenericRelationSearchFilterSet.filter_q( self, queryset, value).distinct('nome').order_by('nome') + + +class AutorSearchForFieldFilterSet(AutorChoiceFilterSet): + q = SearchForFieldFilter() + + class Meta(AutorChoiceFilterSet.Meta): + pass + + def filter_q(self, queryset, value): + + value[0] = value[0].split(',') + value[1] = value[1].split(',') + + params = {} + for key, v in list(zip(value[0], value[1])): + if v in ['True', 'False']: + v = '1' if v == 'True' else '0' + params[key] = v + return queryset.filter(**params).distinct('nome').order_by('nome') diff --git a/sapl/api/views.py b/sapl/api/views.py index 4a8341c52..eb1364bf7 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -10,7 +10,7 @@ from rest_framework.permissions import (IsAuthenticated, AllowAny) from rest_framework.viewsets import GenericViewSet, ModelViewSet -from sapl.api.forms import AutorChoiceFilterSet +from sapl.api.forms import AutorChoiceFilterSet, AutorSearchForFieldFilterSet from sapl.api.serializers import (AutorChoiceSerializer, AutorSerializer, ChoiceSerializer, MateriaLegislativaSerializer, @@ -79,7 +79,57 @@ class AutorListView(ListAPIView): o django-filter é desativado e a busca é feita no model do ContentType associado ao tipo. - Outros campos + - q_0 / q_1 - q_0 faz o código ignorar "q"... + + q_0 -> campos lookup a serem filtrados em qualquer Model + que implemente SaplGenericRelation + q_1 -> o valor que será pesquisado no lookup de q_0 + + q_0 e q_1 podem ser separados por ","... isso dará a + possibilidade de filtrar mais de um campo. + + + http://localhost:8000 + /api/autor?tr=1&q_0=parlamentar_set__ativo&q_1=False + /api/autor?tr=1&q_0=parlamentar_set__ativo&q_1=True + /api/autor?tr=3&q_0=parlamentar_set__ativo&q_1=False + /api/autor?tr=3&q_0=parlamentar_set__ativo&q_1=True + + http://localhost:8000 + /api/autor?tr=1 + &q_0=parlamentar_set__nome_completo__icontains, + parlamentar_set__ativo + &q_1=Carvalho,False + /api/autor?tr=1 + &q_0=parlamentar_set__nome_completo__icontains, + parlamentar_set__ativo + &q_1=Carvalho,True + /api/autor?tr=3 + &q_0=parlamentar_set__nome_completo__icontains, + parlamentar_set__ativo + &q_1=Carvalho,False + /api/autor?tr=3 + &q_0=parlamentar_set__nome_completo__icontains, + parlamentar_set__ativo + &q_1=Carvalho,True + + + não importa o campo que vc passe de qualquer dos Models + ligados... é possível ver que models são esses, + na ocasião do commit deste texto, executando: + In [6]: from sapl.utils import models_with_gr_for_model + + In [7]: models_with_gr_for_model(Autor) + Out[7]: + [sapl.parlamentares.models.Parlamentar, + sapl.parlamentares.models.Frente, + sapl.comissoes.models.Comissao, + sapl.materia.models.Orgao, + sapl.sessao.models.Bancada, + sapl.sessao.models.Bloco] + + qualquer atributo destes models podem ser passados + para busca """ TR_AUTOR_CHOICE_SERIALIZER = 1 @@ -125,6 +175,9 @@ class AutorListView(ListAPIView): self.serializer_class = AutorSerializer self.permission_classes = (IsAuthenticated,) + if self.filter_class and 'q_0' in request.GET: + self.filter_class = AutorSearchForFieldFilterSet + return ListAPIView.get(self, request, *args, **kwargs) def get_queryset(self): @@ -207,6 +260,7 @@ class MateriaLegislativaViewSet(ListModelMixin, filter_backends = (DjangoFilterBackend,) filter_fields = ('numero', 'ano', 'tipo', ) + class SessaoPlenariaViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): diff --git a/sapl/utils.py b/sapl/utils.py index 4873d3519..618a3f4f8 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -392,92 +392,6 @@ def intervalos_tem_intersecao(a_inicio, a_fim, b_inicio, b_fim): return maior_inicio <= menor_fim -""" -def permissoes(nome_grupo, app_label): - lista_permissoes = [] - try: - perms = list(Permission.objects.filter( - group__name=nome_grupo)) - for p in perms: - lista_permissoes.append('%s.%s' % (app_label, p.codename)) - except: - pass - return set(lista_permissoes) - - -def permission_required_for_app(app_label, login_url=None, - raise_exception=False): - - Decorator for views that checks whether a user has a particular permission - enabled, redirecting to the log-in page if necessary. - If the raise_exception parameter is given the PermissionDenied exception - is raised. - - def check_perms(user): - if user.has_module_perms(app_label): - return True - # In case the 403 handler should be called raise the exception - if raise_exception: - raise PermissionDenied - # As the last resort, show the login form - return False - return user_passes_test(check_perms, login_url=login_url) - -def permissoes_materia(): - return permissoes('Operador de Matéria', 'materia') - - -def permissoes_comissoes(): - return permissoes('Operador de Comissões', 'comissoes') - - -def permissoes_norma(): - return permissoes('Operador de Norma Jurídica', 'norma') - - -def permissoes_protocoloadm(): - return permissoes('Operador de Protocolo Administrativo', 'protocoloadm') - - -def permissoes_adm(): - return permissoes('Operador Administrativo', 'protocoloadm') - - -def permissoes_sessao(): - return permissoes('Operador de Sessão Plenária', 'sessao') - - -def permissoes_painel(): - return permissoes('Operador de Painel Eletrônico', 'painel') - - -def permissoes_autor(): - return permissoes('Autor', 'materia') - - -def permissoes_parlamentares(): - lista_permissoes = [] - try: - cts = ContentType.objects.filter(app_label='parlamentares') - perms_parlamentares = list(Permission.objects.filter( - content_type__in=cts)) - for p in perms_parlamentares: - lista_permissoes.append('parlamentares.' + p.codename) - except: - pass - return set(lista_permissoes) - - -def permissao_tb_aux(self): - u = self.request.user - if u.groups.filter(name='Operador Geral').exists() or u.is_superuser: - return True - else: - return False - -""" - - class MateriaPesquisaOrderingFilter(django_filters.OrderingFilter): choices = ( From d40fc0e15e23e5319cb74ca42bc381fb0e869b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Tue, 23 May 2017 13:58:32 -0300 Subject: [PATCH 032/193] campo texto para autor documentos acessorios em lote (#1117) --- sapl/materia/views.py | 2 +- sapl/templates/materia/em_lote/acessorio.html | 17 ++--------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index c3ad9f9e4..381e8042c 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1619,7 +1619,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): arquivo=request.POST['arquivo'], nome=request.POST['nome'], data=datetime.strptime(request.POST['data'], "%d/%m/%Y"), - autor=Autor.objects.get(id=request.POST['autor']), + autor=request.POST['autor'], ementa=request.POST['ementa'] ) msg = _('Documento(s) criado(s).') diff --git a/sapl/templates/materia/em_lote/acessorio.html b/sapl/templates/materia/em_lote/acessorio.html index 5035d8956..1fe8086cc 100644 --- a/sapl/templates/materia/em_lote/acessorio.html +++ b/sapl/templates/materia/em_lote/acessorio.html @@ -40,22 +40,9 @@
- +
- - - -
-
-
-
-
-
- +
From b63d2e3b783f3178a7a8a1d5dc7a1ac0fd79e9b6 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 23 May 2017 14:25:53 -0300 Subject: [PATCH 033/193] Conserto paliativo para doc acessorio em lote --- sapl/materia/views.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 381e8042c..2af41db6d 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1613,15 +1613,15 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): tipo = TipoDocumento.objects.get(descricao=request.POST['tipo']) for materia_id in marcadas: - DocumentoAcessorio.objects.create( - materia_id=materia_id, - tipo=tipo, - arquivo=request.POST['arquivo'], - nome=request.POST['nome'], - data=datetime.strptime(request.POST['data'], "%d/%m/%Y"), - autor=request.POST['autor'], - ementa=request.POST['ementa'] - ) + doc = DocumentoAcessorio() + doc.materia_id = materia_id + doc.tipo = tipo + doc.arquivo = request.POST['arquivo'] + doc.nome = request.POST['nome'] + doc.data = datetime.strptime(request.POST['data'], "%d/%m/%Y") + doc.autor_id = request.POST['autor'] + doc.ementa = request.POST['ementa'] + doc.save() msg = _('Documento(s) criado(s).') messages.add_message(request, messages.SUCCESS, msg) return self.get(request, self.kwargs) From af9603972587a7c01ed182d422693d94f81d25f3 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 23 May 2017 15:50:47 -0300 Subject: [PATCH 034/193] Conserta DocumentoAcessorioEmLote --- sapl/materia/views.py | 2 +- sapl/templates/materia/em_lote/acessorio.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 2af41db6d..f0c95f330 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1616,7 +1616,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): doc = DocumentoAcessorio() doc.materia_id = materia_id doc.tipo = tipo - doc.arquivo = request.POST['arquivo'] + doc.arquivo = request.FILES['arquivo'] doc.nome = request.POST['nome'] doc.data = datetime.strptime(request.POST['data'], "%d/%m/%Y") doc.autor_id = request.POST['autor'] diff --git a/sapl/templates/materia/em_lote/acessorio.html b/sapl/templates/materia/em_lote/acessorio.html index 1fe8086cc..a4b09d796 100644 --- a/sapl/templates/materia/em_lote/acessorio.html +++ b/sapl/templates/materia/em_lote/acessorio.html @@ -14,7 +14,7 @@ {% else %}

{% blocktrans with object_list.count as total_materias %}Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

{% endif %} -
+ {% csrf_token %}
Documento Acessório @@ -42,7 +42,7 @@
- +
From bf7c477641ca6898fb797d62799bfda85aa33e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Tue, 23 May 2017 16:18:22 -0300 Subject: [PATCH 035/193] fix conserta acessorio em lote (#1119) --- sapl/materia/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index f0c95f330..180a69690 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1619,7 +1619,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): doc.arquivo = request.FILES['arquivo'] doc.nome = request.POST['nome'] doc.data = datetime.strptime(request.POST['data'], "%d/%m/%Y") - doc.autor_id = request.POST['autor'] + doc.autor = request.POST['autor'] doc.ementa = request.POST['ementa'] doc.save() msg = _('Documento(s) criado(s).') From a752943505cc86be69dbbd94c440a5faec663ada Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 23 May 2017 17:06:49 -0300 Subject: [PATCH 036/193] Melhorias no detail de protocolo --- sapl/templates/protocoloadm/protocolo_filter.html | 8 +++++++- sapl/templates/protocoloadm/protocolo_mostrar.html | 10 +++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index dc00317cd..f44587e67 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -44,7 +44,13 @@
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" }}
- Interessado: {{ p.interessado }}
+ + {% if p.tipo_processo == 0 %} + Interessado: {{ p.interessado|default_if_none:"Não informado" }}
+ {% elif p.tipo_processo == 1 %} + Autor: {{ p.autor.nome|default_if_none:"Não informado" }}
+ {% endif %} + Natureza do Processo: {% if p.tipo_processo == 0 %} Administrativo {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
Classificação: {{ p.tipo_documento|default_if_none:p.tipo_materia }}
diff --git a/sapl/templates/protocoloadm/protocolo_mostrar.html b/sapl/templates/protocoloadm/protocolo_mostrar.html index 49dba8a90..8b0f7857d 100644 --- a/sapl/templates/protocoloadm/protocolo_mostrar.html +++ b/sapl/templates/protocoloadm/protocolo_mostrar.html @@ -6,9 +6,13 @@ Protocolo: {{ protocolo.numero|stringformat:'06d' }}/{{ protocolo.ano }}
Assunto: {{ protocolo.assunto_ementa|default:" Não informado." }}
Data Protocolo: {{ protocolo.data|date:"d/m/Y" }} - Horário: {{ protocolo.hora|date:"H:i" }}
- Autor: {{protocolo.autor.nome}}
- Interessado: {{ protocolo.interessado|default:" Não informado." }}
- + + {% if protocolo.tipo_processo == 0 %} + Interessado: {{ protocolo.interessado|default_if_none:"Não informado" }}
+ {% elif protocolo.tipo_processo == 1 %} + Autor:{{ protocolo.autor.nome|default_if_none:"Não informado" }}
+ {% endif %} + Natureza do Processo: {% if protocolo.tipo_processo == 0 %} Administrativo {% elif protocolo.tipo_processo == 1 %} Legislativo {% endif %}
Número de Páginas: {{ protocolo.numero_paginas }}
Observação: {{ protocolo.observacao|default:" Não informado." }}
From c2fcc06d0ddb7fb7789d67d6bf02bca6436c9c9f Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 23 May 2017 18:08:05 -0300 Subject: [PATCH 037/193] =?UTF-8?q?Captura=20erro=20de=20indexa=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20arquivo.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/search_indexes.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py index 58e1688c4..61fe3438a 100644 --- a/sapl/base/search_indexes.py +++ b/sapl/base/search_indexes.py @@ -32,10 +32,7 @@ class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable): arquivo = getattr(obj, self.filename) if arquivo: - try: - arquivo.open() - arquivo.close() - except OSError: + if not os.path.exists(arquivo.path): return self.prepared_data if not os.path.splitext(arquivo.path)[1][:1]: @@ -43,10 +40,13 @@ class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable): try: extracted_data = textract.process( - arquivo.path).decode( - 'utf-8').replace('\n', ' ') + arquivo.path, + language='pt-br').decode('utf-8').replace('\n', ' ') except ExtensionNotSupported: return self.prepared_data + except Exception: + print('Erro inesperado processando arquivo: %s' % arquivo.path) + return self.prepared_data extracted_data = extracted_data.replace('\t', ' ') From ba127a5058dfb78ec067c64bdb84e0e618161139 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 23 May 2017 18:10:48 -0300 Subject: [PATCH 038/193] Fix #1111 --- sapl/materia/views.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 4ff498cec..f71bfc373 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1714,3 +1714,17 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): filterset_class = TramitacaoEmLoteFilterSet + + def get_context_data(self, **kwargs): + context = super(TramitacaoEmLoteView, + self).get_context_data(**kwargs) + + qr = self.request.GET.copy() + + lista = filtra_tramitacao_destino_and_status( + qr['tramitacao__status'], + qr['tramitacao__unidade_tramitacao_destino']) + context['object_list'] = context['object_list'].filter( + id__in=lista).distinct() + + return context From 8cff85963974d17217edfa32fe5de0b1f43f0e54 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 23 May 2017 18:18:52 -0300 Subject: [PATCH 039/193] Adiciona logging --- sapl/base/search_indexes.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py index 61fe3438a..394d92e41 100644 --- a/sapl/base/search_indexes.py +++ b/sapl/base/search_indexes.py @@ -1,3 +1,4 @@ +import logging import os.path import textract @@ -9,6 +10,8 @@ from sapl.norma.models import NormaJuridica from textract.exceptions import ExtensionNotSupported +from sapl.settings import BASE_DIR +logger = logging.getLogger(BASE_DIR.name) class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) @@ -45,7 +48,9 @@ class DocumentoAcessorioIndex(indexes.SearchIndex, indexes.Indexable): except ExtensionNotSupported: return self.prepared_data except Exception: - print('Erro inesperado processando arquivo: %s' % arquivo.path) + msg = 'Erro inesperado processando arquivo: %s' % arquivo.path + print(msg) + logger.error(msg) return self.prepared_data extracted_data = extracted_data.replace('\t', ' ') From 336f88bbb30f232c1a8d72881e9abee941446c44 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 23 May 2017 18:32:54 -0300 Subject: [PATCH 040/193] Bug fix --- sapl/materia/views.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 8690bb17a..2cb4d54f6 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1717,10 +1717,12 @@ class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): qr = self.request.GET.copy() - lista = filtra_tramitacao_destino_and_status( - qr['tramitacao__status'], - qr['tramitacao__unidade_tramitacao_destino']) - context['object_list'] = context['object_list'].filter( - id__in=lista).distinct() + if ('tramitacao__status' in qr and + 'tramitacao__unidade_tramitacao_destino' in qr): + lista = filtra_tramitacao_destino_and_status( + qr['tramitacao__status'], + qr['tramitacao__unidade_tramitacao_destino']) + context['object_list'] = context['object_list'].filter( + id__in=lista).distinct() return context From 2101ba26147965843ab4358f944b47589489bba1 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 23 May 2017 18:38:03 -0300 Subject: [PATCH 041/193] Fix #414 ordem resumo (#1109) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Divide o template de resumo em blocos * Cria a funcionalidade * Pequena correcao * add arq sql no instalador de reutil. da app sapl * Conserta erro teste * fix #1092 - Altera o destino dos documentos migrados (#1093) * Altera o destino dos documentos migrados Signed-off-by: Luciano Almeida * Usa a data de matéria em doc acessório Signed-off-by: Luciano Almeida * ajusta caminho public private * Faz a ordenação para o arquivo impresso * fix #1098 (#1107) * Padroniza tamanho foto para mesa (#1088) * Adiciona permissão a tela de ordenação * Bug Fix * Fix 1104 (#1110) * adiciona poppler-utils (#1113) * Adiciona poppler-utils, onde está pdftotext que é usado por indexador. * redesenha a exibição dos votos na tela de votação nominal #1100 (#1101) * resultado de votação nominal * Update nominal_detail.html * Update nominal_edit.html * Adiciona URL do Interlegis ao rodapé da página. * Somente mostra interessado se Doc Adm e mostra Autor em listagem de pesquisa * HOT-FIX: identificador de protocolo errado * Atualiza código devido a deprecated na drf * HOT-FIX: possível fix para erro de render no search index * Add pesquisa em Autor pelo campo ativo de parlamentar * Gera migração referente ao commit #285d32e Signed-off-by: Eliseu Egewarth * Add bsc param de Autor nos Models lig via GR a Autor * campo texto para autor documentos acessorios em lote (#1117) * Conserto paliativo para doc acessorio em lote * Conserta DocumentoAcessorioEmLote * fix conserta acessorio em lote (#1119) * Melhorias no detail de protocolo * Captura erro de indexação de arquivo. * Fix #1111 * Divide o template de resumo em blocos * Cria a funcionalidade * Pequena correcao * Conserta erro teste * Faz a ordenação para o arquivo impresso * Adiciona permissão a tela de ordenação * Faz o merge das migrations --- sapl/base/urls.py | 3 +- .../migrations/0005_auto_20170522_1051.py | 32 ++++ sapl/materia/migrations/0006_merge.py | 16 ++ .../migrations/0004_auto_20170522_1051.py | 22 +++ sapl/norma/migrations/0005_merge.py | 16 ++ .../templates/pdf_sessao_plenaria_gerar.py | 48 ++++- sapl/rules/map_rules.py | 1 + sapl/sessao/forms.py | 81 ++++++++- .../sessao/migrations/0003_resumoordenacao.py | 35 ++++ sapl/sessao/models.py | 25 +++ sapl/sessao/urls.py | 6 +- sapl/sessao/views.py | 99 ++++++++++- .../blocos_resumo/conteudo_multimidia.html | 8 + .../sessao/blocos_resumo/expedientes.html | 17 ++ .../blocos_resumo/identificacao_basica.html | 8 + .../sessao/blocos_resumo/lista_presenca.html | 8 + .../lista_presenca_ordem_dia.html | 8 + .../blocos_resumo/materias_expediente.html | 25 +++ .../blocos_resumo/materias_ordem_dia.html | 25 +++ .../sessao/blocos_resumo/mesa_diretora.html | 10 ++ .../blocos_resumo/oradores_expediente.html | 14 ++ .../blocos_resumo/oradores_explicacoes.html | 14 ++ sapl/templates/sessao/resumo.html | 165 +++--------------- sapl/templates/sessao/resumo_ordenacao.html | 13 ++ sapl/templates/sistema.html | 2 +- 25 files changed, 538 insertions(+), 163 deletions(-) create mode 100644 sapl/materia/migrations/0005_auto_20170522_1051.py create mode 100644 sapl/materia/migrations/0006_merge.py create mode 100644 sapl/norma/migrations/0004_auto_20170522_1051.py create mode 100644 sapl/norma/migrations/0005_merge.py create mode 100644 sapl/sessao/migrations/0003_resumoordenacao.py create mode 100644 sapl/templates/sessao/blocos_resumo/conteudo_multimidia.html create mode 100644 sapl/templates/sessao/blocos_resumo/expedientes.html create mode 100644 sapl/templates/sessao/blocos_resumo/identificacao_basica.html create mode 100644 sapl/templates/sessao/blocos_resumo/lista_presenca.html create mode 100644 sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html create mode 100644 sapl/templates/sessao/blocos_resumo/materias_expediente.html create mode 100644 sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html create mode 100644 sapl/templates/sessao/blocos_resumo/mesa_diretora.html create mode 100644 sapl/templates/sessao/blocos_resumo/oradores_expediente.html create mode 100644 sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html create mode 100644 sapl/templates/sessao/resumo_ordenacao.html diff --git a/sapl/base/urls.py b/sapl/base/urls.py index d5e4ae98a..ea7d54a04 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -92,7 +92,8 @@ urlpatterns = [ # todos os sublinks de sistema devem vir acima deste url(r'^sistema/$', permission_required('base.view_tabelas_auxiliares') - (TemplateView.as_view(template_name='sistema.html'))), + (TemplateView.as_view(template_name='sistema.html')), + name='sistema'), url(r'^login/$', views.login, { 'template_name': 'base/login.html', 'authentication_form': LoginForm}, diff --git a/sapl/materia/migrations/0005_auto_20170522_1051.py b/sapl/materia/migrations/0005_auto_20170522_1051.py new file mode 100644 index 000000000..5904fa7d1 --- /dev/null +++ b/sapl/materia/migrations/0005_auto_20170522_1051.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-05-22 10:51 +from __future__ import unicode_literals + +from django.db import migrations, models +import sapl.materia.models +import sapl.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0004_auto_20170504_1751'), + ] + + operations = [ + migrations.AlterField( + model_name='documentoacessorio', + name='arquivo', + field=models.FileField(blank=True, null=True, upload_to=sapl.materia.models.anexo_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Integral'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='texto_original', + field=models.FileField(blank=True, null=True, upload_to=sapl.materia.models.materia_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Original'), + ), + migrations.AlterField( + model_name='proposicao', + name='texto_original', + field=models.FileField(blank=True, null=True, upload_to=sapl.materia.models.materia_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Original'), + ), + ] diff --git a/sapl/materia/migrations/0006_merge.py b/sapl/materia/migrations/0006_merge.py new file mode 100644 index 000000000..c3ffdd30d --- /dev/null +++ b/sapl/materia/migrations/0006_merge.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-05-23 18:20 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0005_auto_20170522_1051'), + ('materia', '0005_auto_20170522_1904'), + ] + + operations = [ + ] diff --git a/sapl/norma/migrations/0004_auto_20170522_1051.py b/sapl/norma/migrations/0004_auto_20170522_1051.py new file mode 100644 index 000000000..d2a3b4a8c --- /dev/null +++ b/sapl/norma/migrations/0004_auto_20170522_1051.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-05-22 10:51 +from __future__ import unicode_literals + +from django.db import migrations, models +import sapl.norma.models +import sapl.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0003_auto_20170510_1549'), + ] + + operations = [ + migrations.AlterField( + model_name='normajuridica', + name='texto_integral', + field=models.FileField(blank=True, null=True, upload_to=sapl.norma.models.norma_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Integral'), + ), + ] diff --git a/sapl/norma/migrations/0005_merge.py b/sapl/norma/migrations/0005_merge.py new file mode 100644 index 000000000..0e3cc25d0 --- /dev/null +++ b/sapl/norma/migrations/0005_merge.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-05-23 18:20 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0004_auto_20170522_1115'), + ('norma', '0004_auto_20170522_1051'), + ] + + operations = [ + ] diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index 8890b9dcf..96fb7d581 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -6,6 +6,8 @@ """ import time +from sapl.sessao.models import ResumoOrdenacao + from trml2pdf import parseString @@ -287,15 +289,43 @@ def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_me tmp += '\t\n' tmp += paraStyle() tmp += '\t\n' - tmp += inf_basicas(inf_basicas_dic) - tmp += mesa(lst_mesa) - tmp += presenca(lst_presenca_sessao) - tmp += expedientes(lst_expedientes) - tmp += expediente_materia(lst_expediente_materia) - tmp += oradores_expediente(lst_oradores_expediente) - tmp += presenca_ordem_dia(lst_presenca_ordem_dia) - tmp += votacao(lst_votacao) - tmp += oradores(lst_oradores) + + ordenacao = ResumoOrdenacao.objects.first() + dict_ord_template = { + 'cont_mult': '', + 'exp': expedientes(lst_expedientes), + 'id_basica': inf_basicas(inf_basicas_dic), + 'lista_p': presenca(lst_presenca_sessao), + 'lista_p_o_d': presenca_ordem_dia(lst_presenca_ordem_dia), + 'mat_exp': expediente_materia(lst_expediente_materia), + 'mat_o_d': votacao(lst_votacao), + 'mesa_d': mesa(lst_mesa), + 'oradores_exped': oradores_expediente(lst_oradores_expediente), + 'oradores_expli': oradores(lst_oradores) + } + + if ordenacao: + tmp += dict_ord_template[ordenacao.primeiro] + tmp += dict_ord_template[ordenacao.segundo] + tmp += dict_ord_template[ordenacao.terceiro] + tmp += dict_ord_template[ordenacao.quarto] + tmp += dict_ord_template[ordenacao.quinto] + tmp += dict_ord_template[ordenacao.sexto] + tmp += dict_ord_template[ordenacao.setimo] + tmp += dict_ord_template[ordenacao.oitavo] + tmp += dict_ord_template[ordenacao.nono] + tmp += dict_ord_template[ordenacao.decimo] + else: + tmp += inf_basicas(inf_basicas_dic) + tmp += mesa(lst_mesa) + tmp += presenca(lst_presenca_sessao) + tmp += expedientes(lst_expedientes) + tmp += expediente_materia(lst_expediente_materia) + tmp += oradores_expediente(lst_oradores_expediente) + tmp += presenca_ordem_dia(lst_presenca_ordem_dia) + tmp += votacao(lst_votacao) + tmp += oradores(lst_oradores) + tmp += '\t\n' tmp += '\n' diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index 05d869fd8..01493818f 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -251,6 +251,7 @@ rules_group_geral = { (sessao.TipoResultadoVotacao, __base__), (sessao.TipoExpediente, __base__), (sessao.Bloco, __base__), + (sessao.ResumoOrdenacao, __base__), (lexml.LexmlProvedor, __base__), (lexml.LexmlPublicador, __base__), diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 4303dabcc..9c2f879bf 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -28,7 +28,7 @@ def recupera_anos(): # apos a adicao do .dates(), por isso o reversed() abaixo anos = [(k.year, k.year) for k in reversed(anos_list)] return anos - except: + except Exception: return [] @@ -39,6 +39,18 @@ MES_CHOICES = [('', '---------')] + RANGE_MESES DIA_CHOICES = [('', '---------')] + RANGE_DIAS_MES +ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'), + ('exp', 'Expedientes'), + ('id_basica', 'Identificação Básica'), + ('lista_p', 'Lista de Presença'), + ('lista_p_o_d', 'Lista de Presença Ordem do Dia'), + ('mat_exp', 'Matérias do Expediente'), + ('mat_o_d', 'Matérias da Ordem do Dia'), + ('mesa_d', 'Mesa Diretora'), + ('oradores_exped', 'Oradores do Expediente'), + ('oradores_expli', 'Oradores das Explicações Pessoais')] + + class BancadaForm(ModelForm): class Meta: @@ -359,3 +371,70 @@ class OradorExpedienteForm(ModelForm): class PautaSessaoFilterSet(SessaoPlenariaFilterSet): titulo = _('Pesquisa de Pauta de Sessão') + + +class ResumoOrdenacaoForm(forms.Form): + primeiro = forms.ChoiceField(label=_('1°'), + choices=ORDENACAO_RESUMO) + segundo = forms.ChoiceField(label=_('2°'), + choices=ORDENACAO_RESUMO) + terceiro = forms.ChoiceField(label=u'3°', + choices=ORDENACAO_RESUMO) + quarto = forms.ChoiceField(label=_('4°'), + choices=ORDENACAO_RESUMO) + quinto = forms.ChoiceField(label=_('5°'), + choices=ORDENACAO_RESUMO) + sexto = forms.ChoiceField(label=_('6°'), + choices=ORDENACAO_RESUMO) + setimo = forms.ChoiceField(label=_('7°'), + choices=ORDENACAO_RESUMO) + oitavo = forms.ChoiceField(label=_('8°'), + choices=ORDENACAO_RESUMO) + nono = forms.ChoiceField(label=_('9°'), + choices=ORDENACAO_RESUMO) + decimo = forms.ChoiceField(label=u'10°', + choices=ORDENACAO_RESUMO) + + def __init__(self, *args, **kwargs): + super(ResumoOrdenacaoForm, self).__init__(*args, **kwargs) + + row1 = to_row( + [('primeiro', 12)]) + row2 = to_row( + [('segundo', 12)]) + row3 = to_row( + [('terceiro', 12)]) + row4 = to_row( + [('quarto', 12)]) + row5 = to_row( + [('quinto', 12)]) + row6 = to_row( + [('sexto', 12)]) + row7 = to_row( + [('setimo', 12)]) + row8 = to_row( + [('oitavo', 12)]) + row9 = to_row( + [('nono', 12)]) + row10 = to_row( + [('decimo', 12)]) + + self.helper = FormHelper() + self.helper.layout = Layout( + Fieldset(_(''), + row1, row2, row3, row4, row5, + row6, row7, row8, row9, row10, + form_actions(save_label='Atualizar')) + ) + + def clean(self): + cleaned_data = self.cleaned_data + + for c1 in cleaned_data: + i = 0 + for c2 in cleaned_data: + if cleaned_data[str(c1)] == cleaned_data[str(c2)]: + i = i + 1 + if i > 1: + raise ValidationError(_( + 'Não é possível ter campos repetidos')) diff --git a/sapl/sessao/migrations/0003_resumoordenacao.py b/sapl/sessao/migrations/0003_resumoordenacao.py new file mode 100644 index 000000000..ef6e990c5 --- /dev/null +++ b/sapl/sessao/migrations/0003_resumoordenacao.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-05-22 10:51 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0002_sessaoplenaria_interativa'), + ] + + operations = [ + migrations.CreateModel( + name='ResumoOrdenacao', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('primeiro', models.CharField(max_length=30)), + ('segundo', models.CharField(max_length=30)), + ('terceiro', models.CharField(max_length=30)), + ('quarto', models.CharField(max_length=30)), + ('quinto', models.CharField(max_length=30)), + ('sexto', models.CharField(max_length=30)), + ('setimo', models.CharField(max_length=30)), + ('oitavo', models.CharField(max_length=30)), + ('nono', models.CharField(max_length=30)), + ('decimo', models.CharField(max_length=30)), + ], + options={ + 'verbose_name': 'Ordenação do Resumo de uma Sessão', + 'verbose_name_plural': 'Ordenação do Resumo de uma Sessão', + }, + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index b76fac9f3..4d7c22ca1 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -493,3 +493,28 @@ class Bloco(models.Model): def __str__(self): return self.nome + + +@reversion.register() +class ResumoOrdenacao(models.Model): + ''' + Tabela para registrar em qual ordem serão renderizados os componentes + da tela de resumo de uma sessão + ''' + primeiro = models.CharField(max_length=30) + segundo = models.CharField(max_length=30) + terceiro = models.CharField(max_length=30) + quarto = models.CharField(max_length=30) + quinto = models.CharField(max_length=30) + sexto = models.CharField(max_length=30) + setimo = models.CharField(max_length=30) + oitavo = models.CharField(max_length=30) + nono = models.CharField(max_length=30) + decimo = models.CharField(max_length=30) + + class Meta: + verbose_name = _('Ordenação do Resumo de uma Sessão') + verbose_name_plural = _('Ordenação do Resumo de uma Sessão') + + def __str__(self): + return 'Ordenação do Resumo de uma Sessão' diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index f237bf721..93fd953bb 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -10,7 +10,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, PautaSessaoDetailView, PautaSessaoListView, PesquisarPautaSessaoView, PesquisarSessaoPlenariaView, - PresencaOrdemDiaView, PresencaView, ResumoView, + PresencaOrdemDiaView, PresencaView, + ResumoOrdenacaoView, ResumoView, SessaoCrud, TipoExpedienteCrud, TipoResultadoVotacaoCrud, TipoSessaoCrud, VotacaoEditView, VotacaoExpedienteEditView, @@ -68,6 +69,9 @@ urlpatterns = [ include(BlocoCrud.get_urls())), url(r'^sistema/cargo-bancada/', include(CargoBancadaCrud.get_urls())), + url(r'^sistema/resumo-ordenacao/', + ResumoOrdenacaoView.as_view(), + name='resumo_ordenacao'), url(r'^sessao/(?P\d+)/adicionar-varias-materias-expediente/', AdicionarVariasMateriasExpediente.as_view(), name='adicionar_varias_materias_expediente'), diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 980594784..6130eb997 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -3,6 +3,7 @@ from re import sub from django.contrib import messages from django.contrib.auth.decorators import permission_required +from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.urlresolvers import reverse from django.forms.utils import ErrorList @@ -13,7 +14,7 @@ from django.utils.decorators import method_decorator from django.utils.html import strip_tags from django.utils.translation import ugettext_lazy as _ from django.views.decorators.csrf import csrf_exempt -from django.views.generic import ListView, TemplateView +from django.views.generic import FormView, ListView, TemplateView from django.views.generic.base import RedirectView from django.views.generic.detail import DetailView from django.views.generic.edit import FormMixin @@ -36,13 +37,14 @@ from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm from .forms import (AdicionarVariasMateriasFilterSet, ExpedienteForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, + ResumoOrdenacaoForm, SessaoPlenariaFilterSet, VotacaoEditForm, VotacaoForm, VotacaoNominalForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, - PresencaOrdemDia, RegistroVotacao, SessaoPlenaria, - SessaoPlenariaPresenca, TipoExpediente, + PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, + SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, VotoNominal, VotoParlamentar) @@ -930,6 +932,48 @@ class MesaView(FormMixin, DetailView): return reverse('sapl.sessao:mesa', kwargs={'pk': pk}) +class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): + template_name = 'sessao/resumo_ordenacao.html' + form_class = ResumoOrdenacaoForm + permission_required = 'sessao.change_resumoordenacao' + + def get_success_url(self): + return reverse('sapl.base:sistema') + + def get_initial(self): + ordenacao = ResumoOrdenacao.objects.first() + if ordenacao: + return {'primeiro': ordenacao.primeiro, + 'segundo': ordenacao.segundo, + 'terceiro': ordenacao.terceiro, + 'quarto': ordenacao.quarto, + 'quinto': ordenacao.quinto, + 'sexto': ordenacao.sexto, + 'setimo': ordenacao.setimo, + 'oitavo': ordenacao.oitavo, + 'nono': ordenacao.nono, + 'decimo': ordenacao.decimo} + return self.initial.copy() + + def form_valid(self, form): + ordenacao = ResumoOrdenacao.objects.get_or_create()[0] + + ordenacao.primeiro = form.cleaned_data['primeiro'] + ordenacao.segundo = form.cleaned_data['segundo'] + ordenacao.terceiro = form.cleaned_data['terceiro'] + ordenacao.quarto = form.cleaned_data['quarto'] + ordenacao.quinto = form.cleaned_data['quinto'] + ordenacao.sexto = form.cleaned_data['sexto'] + ordenacao.setimo = form.cleaned_data['setimo'] + ordenacao.oitavo = form.cleaned_data['oitavo'] + ordenacao.nono = form.cleaned_data['nono'] + ordenacao.decimo = form.cleaned_data['decimo'] + + ordenacao.save() + + return HttpResponseRedirect(self.get_success_url()) + + class ResumoView(DetailView): template_name = 'sessao/resumo.html' model = SessaoPlenaria @@ -1121,13 +1165,54 @@ class ResumoView(DetailView): if not partido_sigla: partido_sigla = '' oradores = { - 'numero_ordem': orador.numero_ordem, - 'parlamentar': parlamentar, - 'sgl_partido': partido_sigla - } + 'numero_ordem': orador.numero_ordem, + 'parlamentar': parlamentar, + 'sgl_partido': partido_sigla + } oradores_explicacoes.append(oradores) context.update({'oradores_explicacoes': oradores_explicacoes}) + # ===================================================================== + # Indica a ordem com a qual o template será renderizado + ordenacao = ResumoOrdenacao.objects.first() + dict_ord_template = { + 'cont_mult': 'conteudo_multimidia.html', + 'exp': 'expedientes.html', + 'id_basica': 'identificacao_basica.html', + 'lista_p': 'lista_presenca.html', + 'lista_p_o_d': 'lista_presenca_ordem_dia.html', + 'mat_exp': 'materias_expediente.html', + 'mat_o_d': 'materias_ordem_dia.html', + 'mesa_d': 'mesa_diretora.html', + 'oradores_exped': 'oradores_expediente.html', + 'oradores_expli': 'oradores_explicacoes.html' + } + + if ordenacao: + context.update( + {'primeiro_ordenacao': dict_ord_template[ordenacao.primeiro], + 'segundo_ordenacao': dict_ord_template[ordenacao.segundo], + 'terceiro_ordenacao': dict_ord_template[ordenacao.terceiro], + 'quarto_ordenacao': dict_ord_template[ordenacao.quarto], + 'quinto_ordenacao': dict_ord_template[ordenacao.quinto], + 'sexto_ordenacao': dict_ord_template[ordenacao.sexto], + 'setimo_ordenacao': dict_ord_template[ordenacao.setimo], + 'oitavo_ordenacao': dict_ord_template[ordenacao.oitavo], + 'nono_ordenacao': dict_ord_template[ordenacao.nono], + 'decimo_ordenacao': dict_ord_template[ordenacao.decimo]}) + else: + context.update( + {'primeiro_ordenacao': dict_ord_template['id_basica'], + 'segundo_ordenacao': dict_ord_template['cont_mult'], + 'terceiro_ordenacao': dict_ord_template['mesa_d'], + 'quarto_ordenacao': dict_ord_template['lista_p'], + 'quinto_ordenacao': dict_ord_template['exp'], + 'sexto_ordenacao': dict_ord_template['mat_exp'], + 'setimo_ordenacao': dict_ord_template['oradores_exped'], + 'oitavo_ordenacao': dict_ord_template['lista_p_o_d'], + 'nono_ordenacao': dict_ord_template['mat_o_d'], + 'decimo_ordenacao': dict_ord_template['oradores_expli']}) + return self.render_to_response(context) diff --git a/sapl/templates/sessao/blocos_resumo/conteudo_multimidia.html b/sapl/templates/sessao/blocos_resumo/conteudo_multimidia.html new file mode 100644 index 000000000..4749f5ad2 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/conteudo_multimidia.html @@ -0,0 +1,8 @@ +
+ Conteúdo Multimídia +
+
{{multimidia_audio}}
+
{{multimidia_video}}
+
+
+


\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/expedientes.html b/sapl/templates/sessao/blocos_resumo/expedientes.html new file mode 100644 index 000000000..e233fcb58 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/expedientes.html @@ -0,0 +1,17 @@ +
+ Expedientes + + + {% for e in expedientes %} + + + + {% endfor %} + +
+ {{e.tipo}}:

+
+

{{e.conteudo|safe}}

+
+
+
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/identificacao_basica.html b/sapl/templates/sessao/blocos_resumo/identificacao_basica.html new file mode 100644 index 000000000..aa0ad9e46 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/identificacao_basica.html @@ -0,0 +1,8 @@ +
+ Identificação Básica +
+ {% for b in basica %} +
{{b}}
+ {% endfor %} +
+
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca.html b/sapl/templates/sessao/blocos_resumo/lista_presenca.html new file mode 100644 index 000000000..c89f23588 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca.html @@ -0,0 +1,8 @@ +
+ Lista de Presença na Sessão +
+ {% for p in presenca_sessao %} +
{{p.nome_parlamentar}} / {{ p.filiacao_atual }}
+ {% 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 new file mode 100644 index 000000000..910e6a3d2 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html @@ -0,0 +1,8 @@ +
+ Lista de Presença na Ordem do Dia +
+ {% for p in presenca_ordem %} +
{{p.nome_parlamentar}} / {{ p.filiacao_atual }}
+ {% endfor %} +
+
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/materias_expediente.html b/sapl/templates/sessao/blocos_resumo/materias_expediente.html new file mode 100644 index 000000000..00f385bdd --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/materias_expediente.html @@ -0,0 +1,25 @@ +
+ Matérias do Expediente + + + + + + + + + + {% for m in materia_expediente %} + + + + + + {% endfor %} + +
MatériaEmentaResultado da Votação
+ {{m.numero}} - {{m.titulo}} +
+ Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }} +
{{m.ementa|safe}}{{m.resultado}}
{{m.resultado_observacao}}
+
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html b/sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html new file mode 100644 index 000000000..7e3fd4af9 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html @@ -0,0 +1,25 @@ +
+ Matérias da Ordem do Dia + + + + + + + + + + {% for m in materias_ordem %} + + + + + + {% endfor %} + +
MatériaEmentaResultado da Votação
+ {{m.numero}} - {{m.titulo}} +
+ Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }} +
{{m.ementa|safe}}{{m.resultado}}
{{m.resultado_observacao}}
+
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/mesa_diretora.html b/sapl/templates/sessao/blocos_resumo/mesa_diretora.html new file mode 100644 index 000000000..7baf0cb67 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/mesa_diretora.html @@ -0,0 +1,10 @@ +
+ Mesa Diretora +
+ {% for m in mesa %} +
{{m.cargo}}: + {{m.parlamentar.nome_parlamentar}} / {{ m.parlamentar.filiacao_atual }} +
+ {% endfor %} +
+
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/oradores_expediente.html b/sapl/templates/sessao/blocos_resumo/oradores_expediente.html new file mode 100644 index 000000000..064b7d033 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/oradores_expediente.html @@ -0,0 +1,14 @@ +
+ Oradores do Expediente +
+
Parlamentar
+
Discurso
+
+
+ {% for o in oradores %} +
{{o.numero_ordem}} - {{o.parlamentar}}
+
{{o.url_discurso}}
+
+ {% endfor %} +
+
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html b/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html new file mode 100644 index 000000000..e97ac5aea --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html @@ -0,0 +1,14 @@ +
+ Oradores das Explicações Pessoais +
+
Parlamentar
+
Discurso
+
+
+ {% for o in oradores_explicacoes %} +
{{o.numero_ordem}} - {{o.parlamentar.nome_parlamentar}} / {{ o.parlamentar.filiacao_atual }}
+
{{o.url_discurso}}
+
+ {% endfor %} +
+
\ No newline at end of file diff --git a/sapl/templates/sessao/resumo.html b/sapl/templates/sessao/resumo.html index d4fb23d75..b5831bdca 100644 --- a/sapl/templates/sessao/resumo.html +++ b/sapl/templates/sessao/resumo.html @@ -19,157 +19,36 @@

-
- Identificação Básica -
- {% for b in basica %} -
{{b}}
- {% endfor %} -
-
-


-
- Conteúdo Multimídia -
-
{{multimidia_audio}}
-
{{multimidia_video}}
-
-
-


+ {% include 'sessao/blocos_resumo/'|add:primeiro_ordenacao %} +


-
- Mesa Diretora -
- {% for m in mesa %} -
{{m.cargo}}: - {{m.parlamentar.nome_parlamentar}} / {{ m.parlamentar.filiacao_atual }}
- {% endfor %} -
-
-


+ {% include 'sessao/blocos_resumo/'|add:segundo_ordenacao %} +


-
- Lista de Presença na Sessão -
- {% for p in presenca_sessao %} -
{{p.nome_parlamentar}} / {{ p.filiacao_atual }}
- {% endfor %} -
-
-


+ {% include 'sessao/blocos_resumo/'|add:terceiro_ordenacao %} +


-
- Expedientes - - - {% for e in expedientes %} - - - - {% endfor %} - -
- {{e.tipo}}:

-
-

{{e.conteudo|safe}}

-
-
-
-


+ {% include 'sessao/blocos_resumo/'|add:quarto_ordenacao %} +


-
- Matérias do Expediente - - - - - - - - - - {% for m in materia_expediente %} - - - - - - {% endfor %} - -
MatériaEmentaResultado da Votação
- {{m.numero}} - {{m.titulo}} -
- Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }} -
{{m.ementa|safe}}{{m.resultado}}
{{m.resultado_observacao}}
-
-


+ {% include 'sessao/blocos_resumo/'|add:quinto_ordenacao %} +


-
- Oradores do Expediente -
-
Parlamentar
-
Discurso
-
-
- {% for o in oradores %} -
{{o.numero_ordem}} - {{o.parlamentar}}
-
{{o.url_discurso}}
-
- {% endfor %} -
-
-


+ {% include 'sessao/blocos_resumo/'|add:sexto_ordenacao %} +


-
- Lista de Presença na Ordem do Dia -
- {% for p in presenca_ordem %} -
{{p.nome_parlamentar}} / {{ p.filiacao_atual }}
- {% endfor %} -
-
-


+ {% include 'sessao/blocos_resumo/'|add:setimo_ordenacao %} +


-
- Matérias da Ordem do Dia - - - - - - - - - - {% for m in materias_ordem %} - - - - - - {% endfor %} - -
MatériaEmentaResultado da Votação
- {{m.numero}} - {{m.titulo}} -
- Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }} -
{{m.ementa|safe}}{{m.resultado}}
{{m.resultado_observacao}}
-
+ {% include 'sessao/blocos_resumo/'|add:oitavo_ordenacao %} +


+ + {% include 'sessao/blocos_resumo/'|add:nono_ordenacao %} +


+ + {% include 'sessao/blocos_resumo/'|add:decimo_ordenacao %} +


-
- Oradores das Explicações Pessoais -
-
Parlamentar
-
Discurso
-
-
- {% for o in oradores_explicacoes %} -
{{o.numero_ordem}} - {{o.parlamentar.nome_parlamentar}} / {{ o.parlamentar.filiacao_atual }}
-
{{o.url_discurso}}
-
- {% endfor %} -
-
{% endblock detail_content %} diff --git a/sapl/templates/sessao/resumo_ordenacao.html b/sapl/templates/sessao/resumo_ordenacao.html new file mode 100644 index 000000000..5d9fe816f --- /dev/null +++ b/sapl/templates/sessao/resumo_ordenacao.html @@ -0,0 +1,13 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block title %} +

Ordenação do Resumo

+{% endblock %} + +{% block base_content %} + +{% crispy form %} + +{% endblock %} \ No newline at end of file diff --git a/sapl/templates/sistema.html b/sapl/templates/sistema.html index 99b9c7062..72ddb240a 100644 --- a/sapl/templates/sistema.html +++ b/sapl/templates/sistema.html @@ -82,7 +82,7 @@ - +

From 33a65dc11614cc825b24f9b5fc6c5961e98680ba Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 23 May 2017 19:01:55 -0300 Subject: [PATCH 042/193] Fix #1095 --- sapl/materia/models.py | 1 - sapl/materia/views.py | 12 ++++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/sapl/materia/models.py b/sapl/materia/models.py index d5447095e..2db7c38d8 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -259,7 +259,6 @@ class MateriaLegislativa(models.Model): force_update=force_update, using=using, update_fields=update_fields) - @reversion.register() diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 2cb4d54f6..fa3e66970 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -187,6 +187,18 @@ class CriarProtocoloMateriaView(CreateView): def form_valid(self, form): materia = form.save() + + try: + protocolo = Protocolo.objects.get(pk=self.kwargs['pk']) + except ObjectDoesNotExist: + raise Http404() + + if protocolo.autor: + Autoria.objects.create( + materia=materia, + autor=protocolo.autor, + primeiro_autor=True) + return redirect(self.get_success_url(materia)) From 4b94eb80f410cd9992e14e946dfb5534808c792c Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 23 May 2017 19:14:22 -0300 Subject: [PATCH 043/193] Fix #1118 --- sapl/templates/materia/materialegislativa_filter.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index a36f6cceb..ec65ebd19 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -58,10 +58,11 @@ {% if m.autoria_set.all %} Autores: {% for a in m.autoria_set.all %} - {% if not forloop.first %} - ,    {{a.autor}} - {% else %} -  {{a.autor}} + {% if a.primeiro_autor %} + {% if not forloop.first %} + ,    + {% endif %} +  {{a.autor.nome}} {% endif %} {% endfor %}
From b59c7fe2e1fdefb24624e05386a61abd8cd3c7e7 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 23 May 2017 20:09:07 -0300 Subject: [PATCH 044/193] Coloca o form correto no Create e Update de tramitacao --- sapl/materia/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index fa3e66970..2206923cc 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -34,7 +34,8 @@ from sapl.crud.base import (ACTION_CREATE, ACTION_DELETE, ACTION_DETAIL, PermissionRequiredForAppCrudMixin, make_pagination) from sapl.materia.forms import (AnexadaForm, ConfirmarProposicaoForm, LegislacaoCitadaForm, ProposicaoForm, - TipoProposicaoForm) + 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, @@ -892,6 +893,7 @@ class TramitacaoCrud(MasterDetailCrud): ordering = '-data_tramitacao', class CreateView(MasterDetailCrud.CreateView): + form_class = TramitacaoForm def get_initial(self): local = MateriaLegislativa.objects.get( @@ -908,6 +910,7 @@ class TramitacaoCrud(MasterDetailCrud): return super(CreateView, self).post(request, *args, **kwargs) class UpdateView(MasterDetailCrud.UpdateView): + form_class = TramitacaoUpdateForm def post(self, request, *args, **kwargs): materia = MateriaLegislativa.objects.get( From 92f91c75b0b52115bc080d7bc2d7c1a4e95233ef Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Wed, 24 May 2017 09:49:13 -0300 Subject: [PATCH 045/193] Conserta permission_required de ResumoOrdenacao --- 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 6130eb997..9a9cfd9db 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -935,7 +935,7 @@ class MesaView(FormMixin, DetailView): class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): template_name = 'sessao/resumo_ordenacao.html' form_class = ResumoOrdenacaoForm - permission_required = 'sessao.change_resumoordenacao' + permission_required = {'sessao.change_resumoordenacao'} def get_success_url(self): return reverse('sapl.base:sistema') From 22c342f9620b8edcd91b8d49910674d29c4f2514 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Wed, 24 May 2017 12:33:46 -0300 Subject: [PATCH 046/193] Fix #1105 --- sapl/materia/forms.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 978fce522..c0a4fe910 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -486,12 +486,17 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): queryset=AssuntoMateria.objects.all(), label=_('Assunto da Matéria')) + numeracao__numero_materia = django_filters.NumberFilter( + required=False, + label=_('Número do Processo')) + o = MateriaPesquisaOrderingFilter() class Meta: model = MateriaLegislativa fields = ['numero', 'numero_protocolo', + 'numeracao__numero_materia', 'ano', 'tipo', 'data_apresentacao', @@ -517,9 +522,10 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): row1 = to_row( [('tipo', 12)]) row2 = to_row( - [('numero', 4), - ('ano', 4), - ('numero_protocolo', 4)]) + [('numero', 3), + ('numeracao__numero_materia', 3), + ('numero_protocolo', 3), + ('ano', 3)]) row3 = to_row( [('data_apresentacao', 6), ('data_publicacao', 6)]) From 4b200be03664e643ceb294dc540d6713de7acb86 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 24 May 2017 14:27:43 -0300 Subject: [PATCH 047/193] =?UTF-8?q?Desabilita=20signals=20para=20atualiza?= =?UTF-8?q?=C3=A7=C3=A3o=20interativa=20da=20indexa=C3=A7=C3=A3o=20de=20PD?= =?UTF-8?q?F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/apps.py | 4 ++-- sapl/norma/apps.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sapl/materia/apps.py b/sapl/materia/apps.py index ecc8d09de..d8eda8c44 100644 --- a/sapl/materia/apps.py +++ b/sapl/materia/apps.py @@ -7,5 +7,5 @@ class AppConfig(apps.AppConfig): label = 'materia' verbose_name = _('Matéria') - def ready(self): - from . import signals +# def ready(self): +# from . import signals diff --git a/sapl/norma/apps.py b/sapl/norma/apps.py index c4d55ade0..f1b12064b 100644 --- a/sapl/norma/apps.py +++ b/sapl/norma/apps.py @@ -7,5 +7,5 @@ class AppConfig(apps.AppConfig): label = 'norma' verbose_name = _('Norma Jurídica') - def ready(self): - from . import signals +# def ready(self): +# from . import signals From b8e147fbcc13a72224ca6431a1d017051d93997b Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 24 May 2017 15:54:28 -0300 Subject: [PATCH 048/193] Fixes #1123 --- sapl/materia/views.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 2206923cc..66770718d 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1702,8 +1702,12 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): else: data_fim_prazo = None + # issue https://github.com/interlegis/sapl/issues/1123 + # TODO: usar Form + urgente = request.POST['urgente'] == 'True' + for materia_id in marcadas: - Tramitacao.objects.create( + t = Tramitacao( materia_id=materia_id, data_tramitacao=datetime.strptime( request.POST['data_tramitacao'], "%d/%m/%Y"), @@ -1713,11 +1717,12 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): 'unidade_tramitacao_local'], unidade_tramitacao_destino_id=request.POST[ 'unidade_tramitacao_destino'], - urgente=request.POST['urgente'], + urgente=urgente, status_id=request.POST['status'], turno=request.POST['turno'], texto=request.POST['texto'] ) + t.save() msg = _('Tramitação completa.') messages.add_message(request, messages.SUCCESS, msg) return self.get(request, self.kwargs) From 4bf02e46644f1bade023b76da1f02f1a4fb10fc9 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 24 May 2017 17:04:18 -0300 Subject: [PATCH 049/193] Fixes #1122 --- sapl/protocoloadm/forms.py | 4 ++-- sapl/protocoloadm/views.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index d8f996fe3..c22eb762f 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -20,8 +20,8 @@ from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo, Protocolo, TipoDocumentoAdministrativo, TramitacaoAdministrativo) -TIPOS_PROTOCOLO = [('0', 'Enviado'), ('1', 'Recebido'), ('', 'Ambos')] -TIPOS_PROTOCOLO_CREATE = [('0', 'Enviado'), ('1', 'Recebido')] +TIPOS_PROTOCOLO = [('0', 'Recebido'), ('1', 'Enviado'), ('', 'Ambos')] +TIPOS_PROTOCOLO_CREATE = [('0', 'Recebido'), ('1', 'Enviado')] NATUREZA_PROCESSO = [('', 'Ambos'), ('0', 'Administrativo'), diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index b50edaaf0..234f5c13c 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -416,6 +416,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): '%H:%M') protocolo.timestamp = datetime.strptime( datetime.now().strftime("%Y-%m-%d %H:%M"), "%Y-%m-%d %H:%M") + protocolo.tipo_protocolo = 0 protocolo.tipo_processo = '1' # TODO validar o significado protocolo.anulado = False From 9fa823374a2d0d8cadb9b2df9fb185a20f94243f Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 25 May 2017 07:50:44 -0300 Subject: [PATCH 050/193] Fixes #1125 --- sapl/sessao/models.py | 6 +++--- sapl/utils.py | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 4d7c22ca1..f79eee6b1 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -86,17 +86,17 @@ def get_sessao_media_path(instance, subpath, filename): def pauta_upload_path(instance, filename): - return texto_upload_path(instance, filename, subpath='pauta') + return texto_upload_path(instance, filename, subpath='pauta', pk_first=True) # return get_sessao_media_path(instance, 'pauta', filename) def ata_upload_path(instance, filename): - return texto_upload_path(instance, filename, subpath='ata') + return texto_upload_path(instance, filename, subpath='ata', pk_first=True) # return get_sessao_media_path(instance, 'ata', filename) def anexo_upload_path(instance, filename): - return texto_upload_path(instance, filename, subpath='anexo') + return texto_upload_path(instance, filename, subpath='anexo', pk_first=True) # return get_sessao_media_path(instance, 'anexo', filename) diff --git a/sapl/utils.py b/sapl/utils.py index 618a3f4f8..50b7faffc 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -498,7 +498,7 @@ def generic_relations_for_model(model): )) -def texto_upload_path(instance, filename, subpath=''): +def texto_upload_path(instance, filename, subpath='', pk_first=False): """ O path gerado por essa função leva em conta a pk de instance. isso não é possível naturalmente em uma inclusão pois a implementação @@ -539,7 +539,12 @@ def texto_upload_path(instance, filename, subpath=''): if isinstance(instance, (DocumentoAdministrativo, Proposicao)): prefix = 'private' - 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' + + path = str_path %\ { 'prefix': prefix, 'model_name': instance._meta.model_name, From 05559bfdfe39dd99b4e714c7431c0410b46e01c1 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 25 May 2017 10:55:54 -0300 Subject: [PATCH 051/193] Adiciona link de CC --- 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 5348ee291..27c54cc38 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -173,7 +173,7 @@

- Conteúdo e dados sob licença Creative Commons 4.0 Atribuir Fonte - Compartilhar Igual + Conteúdo e dados sob licença Creative Commons 4.0 Atribuir Fonte - Compartilhar Igual

From fb842825abe2b54ec2bfae181152b76e0ebe2c73 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Thu, 25 May 2017 11:55:29 -0300 Subject: [PATCH 052/193] =?UTF-8?q?Ajusta=20url=20de=20tramita=C3=A7=C3=A3?= =?UTF-8?q?o=20de=20DocAdm=20para=20o=20padr=C3=A3o=20MasterDetail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/protocoloadm/urls.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sapl/protocoloadm/urls.py b/sapl/protocoloadm/urls.py index 0c22d74d1..1097149ea 100644 --- a/sapl/protocoloadm/urls.py +++ b/sapl/protocoloadm/urls.py @@ -26,11 +26,10 @@ app_name = AppConfig.name urlpatterns_documento_administrativo = [ url(r'^docadm/', - include(DocumentoAdministrativoCrud.get_urls())), + include(DocumentoAdministrativoCrud.get_urls() + + TramitacaoAdmCrud.get_urls())), url(r'^docadm/doc-acessorio/', include(DocumentoAcessorioAdministrativoCrud.get_urls())), - url(r'^docadm/tramitacao-doc-adm/', - include(TramitacaoAdmCrud.get_urls())), url(r'^docadm/pesq-doc-adm', PesquisarDocumentoAdministrativoView.as_view(), name='pesq_doc_adm'), url(r'^docadm/doc-adm/(?P\d+)$', From 750ae545e14366df954ce38776fe88857ee340ca Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Thu, 25 May 2017 12:39:44 -0300 Subject: [PATCH 053/193] =?UTF-8?q?Coloca=20o=20subnav=20de=20Documento=20?= =?UTF-8?q?Administrativo=20de=20acordo=20com=20o=20padr=C3=A3o=20do=20sis?= =?UTF-8?q?tema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/protocoloadm/views.py | 11 ++++++++++- .../documentoadministrativo_detail.html | 15 --------------- sapl/templates/protocoloadm/subnav.yaml | 5 +++++ 3 files changed, 15 insertions(+), 16 deletions(-) delete mode 100644 sapl/templates/protocoloadm/documentoadministrativo_detail.html create mode 100644 sapl/templates/protocoloadm/subnav.yaml diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 234f5c13c..03d1d3d6d 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -87,9 +87,18 @@ class DocumentoAdministrativoCrud(Crud): class BaseMixin(Crud.BaseMixin): list_field_names = ['tipo', 'numero', 'ano', 'data', - 'numero_protocolo', 'ano_protocolo', 'assunto', + 'numero_protocolo', 'assunto', 'interessado', 'tramitacao', 'texto_integral'] + @property + def search_url(self): + namespace = self.model._meta.app_config.name + return reverse('%s:%s' % (namespace, 'pesq_doc_adm')) + + @property + def list_url(self): + return '' + class ListView(DocumentoAdministrativoMixin, Crud.ListView): pass diff --git a/sapl/templates/protocoloadm/documentoadministrativo_detail.html b/sapl/templates/protocoloadm/documentoadministrativo_detail.html deleted file mode 100644 index 4e38ce963..000000000 --- a/sapl/templates/protocoloadm/documentoadministrativo_detail.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "crud/detail.html" %} -{% load i18n %} -{% block actions %} -{% load common_tags %} - -
- {% trans 'Tramitações' %} - {% if perms|get_change_perm:view %} - {% trans 'Editar' %} - {% endif %} - {% if perms|get_delete_perm:view %} - {% trans 'Excluir' %} - {% endif %} -
-{% endblock actions %} diff --git a/sapl/templates/protocoloadm/subnav.yaml b/sapl/templates/protocoloadm/subnav.yaml new file mode 100644 index 000000000..22857647b --- /dev/null +++ b/sapl/templates/protocoloadm/subnav.yaml @@ -0,0 +1,5 @@ +{% load i18n common_tags %} +- title: {% trans 'Início' %} + url: documentoadministrativo_detail +- title: {% trans 'Tramitação' %} + url: tramitacaoadministrativo_list From a0e1b8344337c01cf30fd9d99049de6053d75bc5 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Thu, 25 May 2017 14:12:48 -0300 Subject: [PATCH 054/193] Fix #1087 --- sapl/protocoloadm/forms.py | 28 ---- sapl/protocoloadm/urls.py | 16 +-- sapl/protocoloadm/views.py | 162 ++++------------------- sapl/templates/protocoloadm/layouts.yaml | 3 +- sapl/templates/protocoloadm/subnav.yaml | 2 + 5 files changed, 33 insertions(+), 178 deletions(-) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index c22eb762f..fdacb19af 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -409,34 +409,6 @@ class DocumentoAcessorioAdministrativoForm(ModelForm): 'data': forms.DateInput(format='%d/%m/%Y') } - def __init__(self, excluir=False, *args, **kwargs): - - row1 = to_row( - [('tipo', 4), - ('nome', 4), - ('data', 4)]) - row2 = to_row( - [('autor', 12)]) - row3 = to_row( - [('arquivo', 12)]) - row4 = to_row( - [('assunto', 12)]) - - more = [] - if excluir: - more = [Submit('Excluir', 'Excluir')] - - self.helper = FormHelper() - self.helper.layout = Layout( - Fieldset( - _('Incluir Documento Acessório'), - row1, row2, row3, row4, - form_actions(more=more) - ) - ) - super(DocumentoAcessorioAdministrativoForm, self).__init__( - *args, **kwargs) - class TramitacaoAdmForm(ModelForm): diff --git a/sapl/protocoloadm/urls.py b/sapl/protocoloadm/urls.py index 1097149ea..46fec9980 100644 --- a/sapl/protocoloadm/urls.py +++ b/sapl/protocoloadm/urls.py @@ -3,10 +3,7 @@ from django.conf.urls import include, url from sapl.protocoloadm.views import (AnularProtocoloAdmView, ComprovanteProtocoloView, CriarDocumentoProtocolo, - DetailDocumentoAdministrativo, DocumentoAcessorioAdministrativoCrud, - DocumentoAcessorioAdministrativoEditView, - DocumentoAcessorioAdministrativoView, DocumentoAdministrativoCrud, PesquisarDocumentoAdministrativoView, ProtocoloDocumentoView, @@ -27,18 +24,11 @@ app_name = AppConfig.name urlpatterns_documento_administrativo = [ url(r'^docadm/', include(DocumentoAdministrativoCrud.get_urls() + - TramitacaoAdmCrud.get_urls())), - url(r'^docadm/doc-acessorio/', - include(DocumentoAcessorioAdministrativoCrud.get_urls())), + TramitacaoAdmCrud.get_urls() + + DocumentoAcessorioAdministrativoCrud.get_urls())), + url(r'^docadm/pesq-doc-adm', PesquisarDocumentoAdministrativoView.as_view(), name='pesq_doc_adm'), - url(r'^docadm/doc-adm/(?P\d+)$', - DetailDocumentoAdministrativo.as_view(), name='detail_doc_adm'), - url(r'^docadm/doc-ace-adm/(?P\d+)', - DocumentoAcessorioAdministrativoView.as_view(), name='doc_ace_adm'), - url(r'^docadm/doc-ace-adm/edit/(?P\d+)/(?P\d+)', - DocumentoAcessorioAdministrativoEditView.as_view(), - name='doc_ace_adm_edit'), url(r'^docadm/texto_integral/(?P\d+)$', doc_texto_integral, name='doc_texto_integral'), diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 03d1d3d6d..a43d70da6 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -37,10 +37,6 @@ TipoDocumentoAdministrativoCrud = CrudAux.build( # ProtocoloMateriaCrud = Crud.build(Protocolo, '') -DocumentoAcessorioAdministrativoCrud = Crud.build( - DocumentoAcessorioAdministrativo, '') - - def doc_texto_integral(request, pk): can_see = True @@ -519,159 +515,55 @@ class PesquisarDocumentoAdministrativoView(DocumentoAdministrativoMixin, return self.render_to_response(context) -class DetailDocumentoAdministrativo(PermissionRequiredMixin, DetailView): - template_name = "protocoloadm/detail_doc_adm.html" - permission_required = ('protocoloadm.detail_documentoadministrativo', ) - - def get(self, request, *args, **kwargs): - documento = DocumentoAdministrativo.objects.get( - id=self.kwargs['pk']) - - form = DocumentoAdministrativoForm( - instance=documento) - return self.render_to_response({ - 'form': form, - 'pk': kwargs['pk']}) - - def post(self, request, *args, **kwargs): - if 'Salvar' in request.POST: - form = DocumentoAdministrativoForm(request.POST) - - if form.is_valid(): - doc = form.save(commit=False) - if 'texto_integral' in request.FILES: - doc.texto_integral = request.FILES['texto_integral'] - doc.save() - return self.form_valid(form) - else: - return self.render_to_response({'form': form}) - elif 'Excluir' in request.POST: - DocumentoAdministrativo.objects.get( - id=kwargs['pk']).delete() - return HttpResponseRedirect(self.get_success_delete()) - - return HttpResponseRedirect(self.get_success_url()) - - def get_success_delete(self): - return reverse('sapl.protocoloadm:pesq_doc_adm') - - def get_success_url(self): - return reverse('sapl.protocoloadm:detail_doc_adm', kwargs={ - 'pk': self.kwargs['pk']}) - - -class DocumentoAcessorioAdministrativoEditView(PermissionRequiredMixin, - FormView): - template_name = "protocoloadm/documento_acessorio_administrativo_edit.html" - permission_required = ( - 'protocoloadm.change_documentoacessorioadministrativo', ) +class TramitacaoAdmCrud(MasterDetailCrud): + model = TramitacaoAdministrativo + parent_field = 'documento' + help_path = '' - def get(self, request, *args, **kwargs): - doc = DocumentoAdministrativo.objects.get( - id=kwargs['pk']) - doc_ace = DocumentoAcessorioAdministrativo.objects.get( - id=kwargs['ano']) - form = DocumentoAcessorioAdministrativoForm(instance=doc_ace, - excluir=True) - - return self.render_to_response({'pk': self.kwargs['pk'], - 'doc': doc, - 'doc_ace': doc_ace, - 'form': form}) - - def post(self, request, *args, **kwargs): - form = DocumentoAcessorioAdministrativoForm(request.POST, excluir=True) - doc_ace = DocumentoAcessorioAdministrativo.objects.get( - id=kwargs['ano']) - - if form.is_valid(): - if 'Salvar' in request.POST: - if 'arquivo' in request.FILES: - doc_ace.arquivo = request.FILES['arquivo'] - doc_ace.documento = DocumentoAdministrativo.objects.get( - id=kwargs['pk']) - doc_ace.tipo = TipoDocumentoAdministrativo.objects.get( - id=form.data['tipo']) - doc_ace.nome = form.data['nome'] - doc_ace.autor = form.data['autor'] - doc_ace.data = datetime.strptime( - form.data['data'], '%d/%m/%Y') - doc_ace.assunto = form.data['assunto'] - - doc_ace.save() - elif 'Excluir' in request.POST: - doc_ace.delete() - return self.form_valid(form) - else: - return self.form_invalid(form) + class BaseMixin(MasterDetailCrud.BaseMixin): + list_field_names = ['data_tramitacao', 'unidade_tramitacao_local', + 'unidade_tramitacao_destino', 'status'] - def get_success_url(self): - pk = self.kwargs['pk'] - return reverse('sapl.protocoloadm:doc_ace_adm', kwargs={'pk': pk}) + class CreateView(MasterDetailCrud.CreateView): + form_class = TramitacaoAdmForm + class UpdateView(MasterDetailCrud.UpdateView): + form_class = TramitacaoAdmEditForm -class DocumentoAcessorioAdministrativoView(PermissionRequiredMixin, FormView): - template_name = "protocoloadm/documento_acessorio_administrativo.html" - permission_required = ( - 'protocoloadm.add_documentoacessorioadministrativo', ) + class ListView(DocumentoAdministrativoMixin, MasterDetailCrud.ListView): - def get(self, request, *args, **kwargs): - form = DocumentoAcessorioAdministrativoForm() - doc = DocumentoAdministrativo.objects.get( - id=kwargs['pk']) - doc_ace_null = '' - doc_acessorio = DocumentoAcessorioAdministrativo.objects.filter( - documento_id=kwargs['pk']) - if not doc_acessorio: - doc_ace_null = _('Nenhum documento acessório' + - 'cadastrado para este processo.') - - return self.render_to_response({'pk': kwargs['pk'], - 'doc': doc, - 'doc_ace': doc_acessorio, - 'doc_ace_null': doc_ace_null, - 'form': form}) - - def post(self, request, *args, **kwargs): - form = DocumentoAcessorioAdministrativoForm(request.POST) - if form.is_valid(): - doc_ace = form.save(commit=False) - if 'arquivo' in request.FILES: - doc_ace.arquivo = request.FILES['arquivo'] - doc = DocumentoAdministrativo.objects.get( - id=kwargs['pk']) - doc_ace.documento = doc - doc_ace.save() - return self.form_valid(form) - else: - return self.form_invalid(form) + def get_queryset(self): + qs = super(MasterDetailCrud.ListView, self).get_queryset() + kwargs = {self.crud.parent_field: self.kwargs['pk']} + return qs.filter(**kwargs).order_by('-data_tramitacao', '-id') - def get_success_url(self): - pk = self.kwargs['pk'] - return reverse('sapl.protocoloadm:doc_ace_adm', kwargs={'pk': pk}) + class DetailView(DocumentoAdministrativoMixin, + MasterDetailCrud.DetailView): + pass -class TramitacaoAdmCrud(MasterDetailCrud): - model = TramitacaoAdministrativo +class DocumentoAcessorioAdministrativoCrud(MasterDetailCrud): + model = DocumentoAcessorioAdministrativo parent_field = 'documento' help_path = '' class BaseMixin(MasterDetailCrud.BaseMixin): - list_field_names = ['data_tramitacao', 'unidade_tramitacao_local', - 'unidade_tramitacao_destino', 'status'] + list_field_names = ['nome', 'tipo', + 'data', 'autor', + 'assunto'] class CreateView(MasterDetailCrud.CreateView): - form_class = TramitacaoAdmForm + form_class = DocumentoAcessorioAdministrativoForm class UpdateView(MasterDetailCrud.UpdateView): - form_class = TramitacaoAdmEditForm + form_class = DocumentoAcessorioAdministrativoForm class ListView(DocumentoAdministrativoMixin, MasterDetailCrud.ListView): def get_queryset(self): qs = super(MasterDetailCrud.ListView, self).get_queryset() kwargs = {self.crud.parent_field: self.kwargs['pk']} - return qs.filter(**kwargs).order_by('-data_tramitacao', '-id') + return qs.filter(**kwargs).order_by('-data', '-id') class DetailView(DocumentoAdministrativoMixin, MasterDetailCrud.DetailView): diff --git a/sapl/templates/protocoloadm/layouts.yaml b/sapl/templates/protocoloadm/layouts.yaml index 8b6c935d0..fad574562 100644 --- a/sapl/templates/protocoloadm/layouts.yaml +++ b/sapl/templates/protocoloadm/layouts.yaml @@ -16,9 +16,8 @@ DocumentoAdministrativo: DocumentoAcessorioAdministrativo: {% trans 'Documento Acessório' %}: - - documento tipo + - tipo autor - nome data - - autor - arquivo - assunto diff --git a/sapl/templates/protocoloadm/subnav.yaml b/sapl/templates/protocoloadm/subnav.yaml index 22857647b..ff4feb42e 100644 --- a/sapl/templates/protocoloadm/subnav.yaml +++ b/sapl/templates/protocoloadm/subnav.yaml @@ -3,3 +3,5 @@ url: documentoadministrativo_detail - title: {% trans 'Tramitação' %} url: tramitacaoadministrativo_list +- title: {% trans 'Documento Acessório' %} + url: documentoacessorioadministrativo_list From f39066681f807aab56f7a3d27fb38c34b62d67c4 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Fri, 26 May 2017 15:07:18 -0300 Subject: [PATCH 055/193] Ajusta indicador do tipo de afastamento Signed-off-by: Luciano Almeida --- sapl/legacy/migration.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 7efa97f73..8cb9bb37d 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -26,7 +26,7 @@ from sapl.materia.models import (DocumentoAcessorio, MateriaLegislativa, Tramitacao) from sapl.norma.models import (AssuntoNorma, NormaJuridica, TipoVinculoNormaJuridica, NormaRelacionada) -from sapl.parlamentares.models import Parlamentar +from sapl.parlamentares.models import Parlamentar, TipoAfastamento from sapl.protocoloadm.models import Protocolo, StatusTramitacaoAdministrativo from sapl.sessao.models import ExpedienteMateria, OrdemDia, RegistroVotacao from sapl.settings import PROJECT_DIR @@ -676,6 +676,12 @@ def adjust_registrovotacao_depois_salvar(new, old): reversion.set_comment('RegistroVotacao sem ordem ou expediente') +def adjust_tipoafastamento(new, old): + if old.ind_afastamento == 1: + new.indicador = 'A' + + + def adjust_tipoproposicao(new, old): if old.ind_mat_ou_doc == 'M': new.tipo_conteudo_related = TipoMateriaLegislativa.objects.get( @@ -775,6 +781,7 @@ AJUSTE_ANTES_SALVAR = { Participacao: adjust_participacao, Protocolo: adjust_protocolo, RegistroVotacao: adjust_registrovotacao_antes_salvar, + TipoAfastamento: adjust_tipoafastamento, TipoProposicao: adjust_tipoproposicao, StatusTramitacao: adjust_statustramitacao, StatusTramitacaoAdministrativo: adjust_statustramitacaoadm, From 1cf09172fdeb4b66e815502594aac497e4e23e33 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Fri, 26 May 2017 15:27:51 -0300 Subject: [PATCH 056/193] Trata parlamentar sem filiacao --- sapl/sessao/views.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 9a9cfd9db..614875525 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1161,13 +1161,15 @@ class ResumoView(DetailView): for parlamentar in Parlamentar.objects.filter( id=orador.parlamentar.id): partido_sigla = Filiacao.objects.filter( - parlamentar=parlamentar).last().partido.sigla + parlamentar=parlamentar).last() if not partido_sigla: - partido_sigla = '' + sigla = '' + else: + sigla = partido_sigla.partido.sigla oradores = { 'numero_ordem': orador.numero_ordem, 'parlamentar': parlamentar, - 'sgl_partido': partido_sigla + 'sgl_partido': sigla } oradores_explicacoes.append(oradores) context.update({'oradores_explicacoes': oradores_explicacoes}) From 23045c877e1bb8cc28045a1d9ead2b1dbe2d69be Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Fri, 26 May 2017 15:56:48 -0300 Subject: [PATCH 057/193] Mais casos de parlamentar sem partido --- sapl/relatorios/views.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 4b5416c2c..0960dbfa0 100644 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -494,10 +494,12 @@ def get_sessao_plenaria(sessao, casa): dic_mesa = {} dic_mesa['nom_parlamentar'] = parlamentar.nome_parlamentar partido_sigla = Filiacao.objects.filter( - parlamentar=parlamentar).first().partido.sigla + parlamentar=parlamentar).first() if not partido_sigla: - partido_sigla = '' - dic_mesa['sgl_partido'] = partido_sigla + sigla = '' + else: + sigla = partido_sigla.partido.sigla + dic_mesa['sgl_partido'] = sigla dic_mesa['des_cargo'] = cargo.descricao lst_mesa.append(dic_mesa) @@ -635,10 +637,12 @@ def get_sessao_plenaria(sessao, casa): dic_oradores_expediente["nom_parlamentar"] = ( parlamentar.nome_parlamentar) partido_sigla = Filiacao.objects.filter( - parlamentar=parlamentar).first().partido.sigla + parlamentar=parlamentar).first() if not partido_sigla: - partido_sigla = '' - dic_oradores_expediente['sgl_partido'] = partido_sigla + sigla = '' + else: + sigla = partido_sigla.partido.sigla + dic_oradores_expediente['sgl_partido'] = sigla lst_oradores_expediente.append(dic_oradores_expediente) # Lista presença na ordem do dia @@ -651,10 +655,12 @@ def get_sessao_plenaria(sessao, casa): dic_presenca_ordem_dia['nom_parlamentar'] = ( parlamentar.nome_parlamentar) partido_sigla = Filiacao.objects.filter( - parlamentar=parlamentar).first().partido.sigla + parlamentar=parlamentar).first() if not partido_sigla: - partido_sigla = '' - dic_presenca_ordem_dia['sgl_partido'] = partido_sigla + sigla = '' + else: + sigla = partido_sigla.partido.sigla + 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 @@ -746,10 +752,12 @@ def get_sessao_plenaria(sessao, casa): dic_oradores["num_ordem"] = orador.numero_ordem dic_oradores["nom_parlamentar"] = parlamentar.nome_parlamentar partido_sigla = Filiacao.objects.filter( - parlamentar=parlamentar).first().partido.sigla + parlamentar=parlamentar).first() if not partido_sigla: - partido_sigla = '' - dic_oradores['sgl_partido'] = partido_sigla + sigla = '' + else: + sigla = partido_sigla.partido.sigla + dic_oradores['sgl_partido'] = sigla lst_oradores.append(dic_oradores) return (inf_basicas_dic, From 8d032196a53f50d7ed8a80e0a787ddf908fa58ca Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 29 May 2017 13:48:50 -0300 Subject: [PATCH 058/193] Fix #1124 --- sapl/materia/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 66770718d..58ffe509f 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1614,6 +1614,8 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): qr = self.request.GET.copy() context['tipos_docs'] = TipoDocumento.objects.all() + context['object_list'] = context['object_list'].order_by( + 'ano', 'numero') context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' return context From 84af4d2949f8f8cf417dfda6306f2a0fde53145f Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 29 May 2017 15:21:20 -0300 Subject: [PATCH 059/193] =?UTF-8?q?Refatora=20a=20Mesa=20de=20Sess=C3=A3o?= =?UTF-8?q?=20Plen=C3=A1ria=20(#1138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/sessao/urls.py | 19 +- sapl/sessao/views.py | 205 ++++++++++++++-------- sapl/templates/sessao/mesa.html | 299 ++++++++++++++++++++++++++------ 3 files changed, 395 insertions(+), 128 deletions(-) diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 93fd953bb..4f6e5c887 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -1,8 +1,8 @@ from django.conf.urls import include, url from sapl.sessao.views import (AdicionarVariasMateriasExpediente, - AdicionarVariasMateriasOrdemDia, BancadaCrud, - BlocoCrud, CargoBancadaCrud, + AdicionarVariasMateriasOrdemDia, + BancadaCrud, BlocoCrud, CargoBancadaCrud, ExpedienteMateriaCrud, ExpedienteView, MateriaOrdemDiaCrud, MesaView, OradorCrud, OradorExpedienteCrud, PainelView, @@ -22,8 +22,11 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, VotacaoNominalView, VotacaoView, abrir_votacao_expediente_view, abrir_votacao_ordem_view, + atualizar_mesa, + insere_parlamentar_composicao, mudar_ordem_materia_sessao, recuperar_materia, recuperar_numero_sessao, + remove_parlamentar_composicao, reordernar_materias_expediente, reordernar_materias_ordem, sessao_legislativa_legislatura_ajax) @@ -41,6 +44,18 @@ urlpatterns = [ url(r'^sessao/(?P\d+)/mesa$', MesaView.as_view(), name='mesa'), + url(r'^sessao/mesa/atualizar-mesa/$', + atualizar_mesa, + name='atualizar_mesa'), + + url(r'^sessao/mesa/insere-parlamentar/composicao/$', + insere_parlamentar_composicao, + name='insere_parlamentar_composicao'), + + url(r'^sessao/mesa/remove-parlamentar-composicao/$', + remove_parlamentar_composicao, + name='remove_parlamentar_composicao'), + url(r'^sessao/recuperar-materia/', recuperar_materia), url(r'^sessao/recuperar-numero-sessao/', recuperar_numero_sessao), url(r'^sessao/sessao-legislativa-legislatura-ajax/', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 614875525..9fd048c43 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -836,24 +836,40 @@ class MesaView(FormMixin, DetailView): model = SessaoPlenaria def get(self, request, *args, **kwargs): - self.object = self.get_object() context = self.get_context_data(object=self.object) - mesa = IntegranteMesa.objects.filter( - sessao_plenaria=self.object) + try: + sessao = SessaoPlenaria.objects.get( + id=kwargs['pk']) + except ObjectDoesNotExist: + mensagem = _('Esta Sessão Plenária não existe!') + messages.add_message(request, messages.INFO, mensagem) - integrantes = [] - for m in mesa: - parlamentar = Parlamentar.objects.get( - id=m.parlamentar_id) - cargo = CargoMesa.objects.get( - id=m.cargo_id) - integrante = {'parlamentar': parlamentar, 'cargo': cargo} - integrantes.append(integrante) + return self.render_to_response(context) + + mesa = sessao.integrantemesa_set.all() if sessao else [] + + cargos_ocupados = [m.cargo for m in mesa] + cargos = CargoMesa.objects.all() + cargos_vagos = list(set(cargos) - set(cargos_ocupados)) + + parlamentares = Legislatura.objects.first().mandato_set.all() + parlamentares_ocupados = [m.parlamentar for m in mesa] + parlamentares_vagos = list( + set( + [p.parlamentar for p in parlamentares]) - set( + parlamentares_ocupados)) + + # Se todos os cargos estiverem ocupados, a listagem de parlamentares + # deve ser renderizada vazia + if not cargos_vagos: + parlamentares_vagos = [] context.update( - {'integrantes': ordenar_integrantes_por_cargo(integrantes)}) + {'composicao_mesa': mesa, + 'parlamentares': parlamentares_vagos, + 'cargos_vagos': cargos_vagos}) return self.render_to_response(context) @@ -863,73 +879,124 @@ class MesaView(FormMixin, DetailView): _('Mesa Diretora'), self.object) return context - @method_decorator(permission_required('sessao.change_integrantemesa')) - def post(self, request, *args, **kwargs): - self.object = self.get_object() - form = MesaForm(request.POST) - - if 'Incluir' in request.POST: - if form.is_valid(): - integrante = IntegranteMesa() - integrante.sessao_plenaria_id = self.object.id - integrante.parlamentar_id = request.POST['parlamentar'] - integrante.cargo_id = request.POST['cargo'] - integrante.save() - return self.form_valid(form) + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('sapl.sessao:mesa', kwargs={'pk': pk}) - else: - form.clean() - return self.form_valid(form) - elif 'Excluir' in request.POST: - if 'composicao_mesa' in request.POST: - ids = request.POST['composicao_mesa'].split(':') - IntegranteMesa.objects.get( - sessao_plenaria_id=self.object.id, - parlamentar_id=ids[0], - cargo_id=ids[1] - ).delete() - else: - pass - # TODO display message asking to select a member of list - return self.form_valid(form) +def atualizar_mesa(request): + """ + Esta função lida com qualquer alteração nos campos + da Mesa Diretora, atualizando os campos após cada alteração + """ + try: + sessao = SessaoPlenaria.objects.get( + id=int(request.GET['sessao'])) + except ObjectDoesNotExist: + return JsonResponse({'msg': ('Sessão Inexistente!', 0)}) + + # Atualiza os componentes da view após a mudança + composicao_mesa = IntegranteMesa.objects.filter( + sessao_plenaria=sessao.id) + + cargos_ocupados = [m.cargo for m in composicao_mesa] + cargos = CargoMesa.objects.all() + cargos_vagos = list(set(cargos) - set(cargos_ocupados)) + + parlamentares = Legislatura.objects.get( + id=sessao.legislatura.id).mandato_set.all() + parlamentares_ocupados = [m.parlamentar for m in composicao_mesa] + parlamentares_vagos = list( + set( + [p.parlamentar for p in parlamentares]) - set( + parlamentares_ocupados)) + + lista_composicao = [(c.id, c.parlamentar.__str__(), + c.cargo.__str__()) for c in composicao_mesa] + lista_parlamentares = [( + p.id, p.__str__()) for p in parlamentares_vagos] + lista_cargos = [(c.id, c.__str__()) for c in cargos_vagos] + + return JsonResponse( + {'lista_composicao': lista_composicao, + 'lista_parlamentares': lista_parlamentares, + 'lista_cargos': lista_cargos, + 'msg': ('', 1)}) + + +def insere_parlamentar_composicao(request): + """ + Esta função lida com qualquer operação de inserção + na composição da Mesa Diretora + """ + if request.user.has_perm( + '%s.add_%s' % ( + AppConfig.label, IntegranteMesa._meta.model_name)): + + composicao = IntegranteMesa() - def get_candidatos_mesa(self): - self.object = self.get_object() - lista_parlamentares = [] - lista_integrantes = [] + try: + composicao.sessao_plenaria = SessaoPlenaria.objects.get( + id=int(request.POST['sessao'])) + except MultiValueDictKeyError: + return JsonResponse({'msg': ('A Sessão informada não existe!', 0)}) - for parlamentar in Parlamentar.objects.all(): - if parlamentar.ativo: - lista_parlamentares.append(parlamentar) + try: + composicao.parlamentar = Parlamentar.objects.get( + id=int(request.POST['parlamentar'])) + except MultiValueDictKeyError: + return JsonResponse({ + 'msg': ('Nenhum parlamentar foi inserido!', 0)}) - for integrante in IntegranteMesa.objects.filter( - sessao_plenaria=self.object): - parlamentar = Parlamentar.objects.get( - id=integrante.parlamentar_id) - lista_integrantes.append(parlamentar) + try: + composicao.cargo = CargoMesa.objects.get( + id=int(request.POST['cargo'])) + parlamentar_ja_inserido = IntegranteMesa.objects.filter( + sessao_plenaria_id=composicao.sessao_plenaria.id, + cargo_id=composicao.cargo.id).exists() - lista = list(set(lista_parlamentares) - set(lista_integrantes)) - lista.sort(key=lambda x: x.nome_parlamentar) - return lista + if parlamentar_ja_inserido: + return JsonResponse({'msg': ('Parlamentar já inserido!', 0)}) - def get_cargos_mesa(self): - self.object = self.get_object() - lista_cargos = CargoMesa.objects.all() - lista_cargos_ocupados = [] + composicao.save() - for integrante in IntegranteMesa.objects.filter( - sessao_plenaria=self.object): - cargo = CargoMesa.objects.get( - id=integrante.cargo_id) - lista_cargos_ocupados.append(cargo) + except MultiValueDictKeyError: + return JsonResponse({'msg': ('Nenhum cargo foi inserido!', 0)}) - lista = list(set(lista_cargos) - set(lista_cargos_ocupados)) - return lista + return JsonResponse({'msg': ('Parlamentar inserido com sucesso!', 1)}) - def get_success_url(self): - pk = self.kwargs['pk'] - return reverse('sapl.sessao:mesa', kwargs={'pk': pk}) + else: + return JsonResponse( + {'msg': ('Você não tem permissão para esta operação!', 0)}) + + +def remove_parlamentar_composicao(request): + """ + Essa função lida com qualquer operação de remoção + na composição da Mesa Diretora + """ + if request.POST and request.user.has_perm( + '%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: + return JsonResponse( + {'msg': ( + 'Selecione algum parlamentar para ser excluido!', 0)}) class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): diff --git a/sapl/templates/sessao/mesa.html b/sapl/templates/sessao/mesa.html index 913135561..311a76b87 100644 --- a/sapl/templates/sessao/mesa.html +++ b/sapl/templates/sessao/mesa.html @@ -2,63 +2,248 @@ {% load i18n %} {% block detail_content %} -
- Mesa Diretora da Sessão - - {% csrf_token %} -
-
-
- - -
- -
- {% if perms.sessao %} -

- {% if view.get_cargos_mesa %}{% endif %} -

- - {% endif %} -
- {% if view.get_cargos_mesa %} -
- - -
- -
- {% endif %} -
- -
+ + + + + + + +
+ Escolha da Composição da Mesa Diretora da Sessão Plenária +
+
+ + +
+ +
+

+ {% if perms.parlamentares.add_cargomesa %} + + {% endif %} +
+
+ {% if perms.parlamentares.add_composicaomesa %} + + {% endif %} +
+ +
+ + +
+ +
+ +
+
{% endblock detail_content %} + {% block extra_js %} - -{% endblock extra_js %} + + + +{% endblock %} From 290c337fcf84b26c0c3b10407de98159af3634f3 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 29 May 2017 15:52:29 -0300 Subject: [PATCH 060/193] Fix #1130 --- sapl/templates/crud/detail.html | 4 ++-- sapl/templates/crud/list.html | 6 +++--- sapl/templates/norma/normajuridica_detail.html | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/sapl/templates/crud/detail.html b/sapl/templates/crud/detail.html index 89d8862aa..ef07edcdf 100644 --- a/sapl/templates/crud/detail.html +++ b/sapl/templates/crud/detail.html @@ -66,9 +66,9 @@
{% comment %}TODO Transformar os links em URLs diretamente no CRUD{% endcomment %} {% if column.text|url %} - + {% else %} -
{{ column.text|safe }}
+
{{ column.text|safe|default:"Não informado" }}
{% endif %}
diff --git a/sapl/templates/crud/list.html b/sapl/templates/crud/list.html index 0d71b7760..035e92cad 100644 --- a/sapl/templates/crud/list.html +++ b/sapl/templates/crud/list.html @@ -58,12 +58,12 @@ {% for value, href in value_list %} {% if href %} - {{ value|safe }} + {{ value|safe|default:"Não informado" }} {% elif valu != 'core.Cep.None' %} {% if value|url %} - {{ value|safe }} + {{ value|safe|default:"Não informado" }} {% else %} - {{ value|safe }} + {{ value|safe|default:"Não informado" }} {% endif %} {% endif %} diff --git a/sapl/templates/norma/normajuridica_detail.html b/sapl/templates/norma/normajuridica_detail.html index ab1df921e..e9d5b6c73 100644 --- a/sapl/templates/norma/normajuridica_detail.html +++ b/sapl/templates/norma/normajuridica_detail.html @@ -14,15 +14,15 @@ {% comment %}TODO Transformar os links em URLs diretamente no CRUD{% endcomment %} {% if column.text|url %} - + {% elif column.verbose_name == 'Matéria' %} {% if object.materia.id %} - + {% else %} -
{{ column.text|safe }}
+
{{ column.text|safe|default:"Não informado" }}
{% endif %} {% else %} -
{{ column.text|safe }}
+
{{ column.text|safe|default:"Não informado" }}
{% endif %} From 253e5e52e91321209623c40fa6be88e67d76c159 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 29 May 2017 18:56:48 -0300 Subject: [PATCH 061/193] #1141 --- sapl/templates/materia/materialegislativa_filter.html | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index ec65ebd19..e0cacca9c 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -58,12 +58,10 @@ {% if m.autoria_set.all %} Autores: {% for a in m.autoria_set.all %} - {% if a.primeiro_autor %} - {% if not forloop.first %} - ,    - {% endif %} -  {{a.autor.nome}} + {% if not forloop.first %} + ,    {% endif %} +  {{a.autor.nome}} {% endfor %}
{% endif %} From 3a07aaaa0e8687039693594692003bc68062ea08 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 30 May 2017 10:36:11 -0300 Subject: [PATCH 062/193] Fix #1145 --- sapl/templates/materia/materialegislativa_filter.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index e0cacca9c..2135bd23c 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -47,6 +47,10 @@ Apresentação: {{ m.data_apresentacao }}
{% endif %} + {% if m.data_fim_prazo %} + Data Fim Prazo: {{ m.data_fim_prazo }} +
+ {% endif %} {% if m.numeracao_set.first %} Processo: {{ m.numeracao_set.first.numero_materia }} / {{ m.numeracao_set.first.ano_materia }}
From a221b6f79ab4de6377c525b04cb1f819418fb1ee Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 30 May 2017 13:48:43 -0300 Subject: [PATCH 063/193] =?UTF-8?q?Resolve=20problemas=20com=20e-mail=20de?= =?UTF-8?q?=20acompanhamento=20de=20mat=C3=A9ria?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/views.py | 89 ++++++++++++++++++---------- sapl/templates/email/acompanhar.html | 14 ++--- sapl/templates/email/tramitacao.html | 48 +++++++-------- sapl/templates/email/tramitacao.txt | 2 +- 4 files changed, 88 insertions(+), 65 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 58ffe509f..35f60d255 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -906,7 +906,12 @@ class TramitacaoCrud(MasterDetailCrud): def post(self, request, *args, **kwargs): materia = MateriaLegislativa.objects.get(id=kwargs['pk']) - do_envia_email_tramitacao(request, materia) + + if 'status' in request.POST and request.POST['status']: + status = StatusTramitacao.objects.filter( + id=request.POST['status']).first() + do_envia_email_tramitacao( + request, materia, status) return super(CreateView, self).post(request, *args, **kwargs) class UpdateView(MasterDetailCrud.UpdateView): @@ -915,7 +920,13 @@ class TramitacaoCrud(MasterDetailCrud): def post(self, request, *args, **kwargs): materia = MateriaLegislativa.objects.get( tramitacao__id=kwargs['pk']) - do_envia_email_tramitacao(request, materia) + + if 'status' in request.POST and request.POST['status']: + status = StatusTramitacao.objects.filter( + id=request.POST['status']).first() + do_envia_email_tramitacao( + request, materia, status) + return super(UpdateView, self).post(request, *args, **kwargs) @property @@ -1245,19 +1256,32 @@ class DocumentoAcessorioView(PermissionRequiredMixin, CreateView): class AcompanhamentoConfirmarView(TemplateView): - def get_redirect_url(self): - return reverse('sapl.sessao:list_pauta_sessao') + def get_redirect_url(self, email): + msg = _('Esta matéria está sendo acompanhada pelo e-mail: %s') % ( + email) + messages.add_message(self.request, messages.SUCCESS, msg) + return reverse('sapl.materia:materialegislativa_detail', + kwargs={'pk': self.kwargs['pk']}) def get(self, request, *args, **kwargs): materia_id = kwargs['pk'] hash_txt = request.GET.get('hash_txt', '') - acompanhar = AcompanhamentoMateria.objects.get(materia_id=materia_id, - hash=hash_txt) + try: + acompanhar = AcompanhamentoMateria.objects.get( + materia_id=materia_id, + hash=hash_txt) + except ObjectDoesNotExist: + raise Http404() + # except MultipleObjectsReturned: + # A melhor solução deve ser permitir que a exceção + # (MultipleObjectsReturned) seja lançada e vá para o log, + # pois só poderá ser causada por um erro de desenvolvimente + acompanhar.confirmado = True acompanhar.save() - return HttpResponseRedirect(self.get_redirect_url()) + return HttpResponseRedirect(self.get_redirect_url(acompanhar.email)) class AcompanhamentoExcluirView(TemplateView): @@ -1366,40 +1390,44 @@ class AcompanhamentoMateriaView(CreateView): hash_txt = self.get_random_chars() - try: - AcompanhamentoMateria.objects.get( - email=email, - materia=materia, - hash=hash_txt) - except ObjectDoesNotExist: - acompanhar = form.save(commit=False) + acompanhar = AcompanhamentoMateria.objects.get_or_create( + materia=materia, + email=form.data['email']) + + # Se o segundo elemento do retorno do get_or_create for True + # quer dizer que o elemento não existia + if acompanhar[1]: + acompanhar = acompanhar[0] acompanhar.hash = hash_txt - acompanhar.materia = materia acompanhar.usuario = usuario.username acompanhar.confirmado = False acompanhar.save() - except MultipleObjectsReturned: - AcompanhamentoMateria.objects.filter( - email=email, - materia=materia, - hash=hash_txt).first() - do_envia_email_confirmacao(request, materia, email) + msg = _('Foi enviado um e-mail de confirmação. Confira sua caixa \ + de mensagens e clique no link que nós enviamos para \ + confirmar o acompanhamento desta matéria.') + messages.add_message(request, messages.SUCCESS, msg) + # Caso esse Acompanhamento já exista + # avisa ao usuário que essa matéria já está sendo acompanhada else: + msg = _('Este e-mail já está acompanhando essa matéria.') + messages.add_message(request, messages.INFO, msg) + return self.render_to_response( {'form': form, 'materia': materia, 'error': _('Essa matéria já está\ sendo acompanhada por este e-mail.')}) - return self.form_valid(form) + return HttpResponseRedirect(self.get_success_url()) else: return self.render_to_response( {'form': form, 'materia': materia}) def get_success_url(self): - return reverse('sapl.sessao:list_pauta_sessao') + return reverse('sapl.materia:materialegislativa_detail', + kwargs={'pk': self.kwargs['pk']}) def load_email_templates(templates, context={}): @@ -1428,7 +1456,7 @@ def criar_email_confirmacao(request, casa_legislativa, materia, hash_txt=''): casa_legislativa.uf) base_url = get_base_url(request) - materia_url = reverse('sapl.materia:acompanhar_materia', + materia_url = reverse('sapl.materia:materialegislativa_detail', kwargs={'pk': materia.id}) confirmacao_url = reverse('sapl.materia:acompanhar_confirmar', kwargs={'pk': materia.id}) @@ -1451,7 +1479,8 @@ def criar_email_confirmacao(request, casa_legislativa, materia, hash_txt=''): return templates -def criar_email_tramitacao(request, casa_legislativa, materia, hash_txt=''): +def criar_email_tramitacao(request, casa_legislativa, materia, status, + hash_txt=''): if not casa_legislativa: raise ValueError("Casa Legislativa é obrigatória") @@ -1465,7 +1494,7 @@ def criar_email_tramitacao(request, casa_legislativa, materia, hash_txt=''): casa_legislativa.uf) base_url = get_base_url(request) - url_materia = reverse('sapl.materia:acompanhar_materia', + url_materia = reverse('sapl.materia:tramitacao_list', kwargs={'pk': materia.id}) url_excluir = reverse('sapl.materia:acompanhar_excluir', kwargs={'pk': materia.id}) @@ -1485,8 +1514,7 @@ def criar_email_tramitacao(request, casa_legislativa, materia, hash_txt=''): "autoria": autores, "data": materia.tramitacao_set.last( ).data_tramitacao, - "status": materia.tramitacao_set.last( - ).status, + "status": status, "texto_acao": materia.tramitacao_set.last().texto, "hash_txt": hash_txt, @@ -1567,7 +1595,7 @@ def do_envia_email_confirmacao(request, materia, email): return None -def do_envia_email_tramitacao(request, materia): +def do_envia_email_tramitacao(request, materia, status): # # Envia email de tramitacao para usuarios cadastrados # @@ -1585,13 +1613,14 @@ def do_envia_email_tramitacao(request, materia): email_texts = criar_email_tramitacao(request, casa, materia, + status, destinatario.hash,) recipients.append(destinatario.email) messages.append({ 'recipient': destinatario.email, 'subject': subject, 'txt_message': email_texts[0], - 'html_message': email_texts[1] + 'html_message': email_texts[1], }) enviar_emails(sender, recipients, messages) diff --git a/sapl/templates/email/acompanhar.html b/sapl/templates/email/acompanhar.html index c95092bf2..bd1a20263 100644 --- a/sapl/templates/email/acompanhar.html +++ b/sapl/templates/email/acompanhar.html @@ -1,14 +1,12 @@ {% load i18n %} {% load static %} -

- Logo -

-

{{casa_legislativa}} -
- Sistema de Apoio ao Processo Legislativo -

+ +

{{casa_legislativa}} +
+ Sistema de Apoio ao Processo Legislativo +

+

Registramos seu pedido para acompanhamento por e-mail da matéria legislativa identificada a seguir:

{{materia}} - {{descricao_materia}}
{{ementa}}
diff --git a/sapl/templates/email/tramitacao.html b/sapl/templates/email/tramitacao.html index 6ca454903..03fbea0cf 100644 --- a/sapl/templates/email/tramitacao.html +++ b/sapl/templates/email/tramitacao.html @@ -1,38 +1,34 @@ {% load i18n %} {% load static %} - - -

- Logo -

-

{{casa_legislativa}} -
- Sistema de Apoio ao Processo Legislativo -

-

A seguinte matéria de seu interesse sofreu - tramitação registrada em {{data_registro}} -

+ + +

{{casa_legislativa}} +
+ Sistema de Apoio ao Processo Legislativo +

+

A seguinte matéria, de seu interesse, sofreu + Tramitação registrada em {{data_registro}}. +

- {{materia}} - {{descricao_materia}} -

+ {{materia}} - {{descricao_materia}} +

Autoria:
{% for autor in autoria %} - {{ autor }}
+ {{ autor }}
{% endfor %}

- Data da ação: {{data}}
- Status: {{status}}
- Texto da ação: {{texto_acao}}

-
-

- - Clique aqui para excluir seu e-mail da lista de envio -

-

Esta é uma mensagem automática. - Por favor, não a responda.

+ Data da ação: {{data}}
+ Status: {{status}}
+ Texto da ação: {{texto_acao}}

+
+

+ + Clique aqui para excluir seu e-mail da lista de envio +

+

Esta é uma mensagem automática. + Por favor, não a responda.

diff --git a/sapl/templates/email/tramitacao.txt b/sapl/templates/email/tramitacao.txt index 0e84653e8..b2465a18d 100644 --- a/sapl/templates/email/tramitacao.txt +++ b/sapl/templates/email/tramitacao.txt @@ -3,7 +3,7 @@ Sistema de Apoio ao Processo Legislativo ----------------------------------------- -A seguinte matéria de seu interesse sofreu tramitação registrada em {{data_registro}} +A seguinte matéria, de seu interesse, sofreu Tramitação registrada em {{data_registro}} Matéria: {{materia}} - {{descricao_materia}} From f65014fd415ae768bc99c9a2c6884b982873a243 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 30 May 2017 13:50:49 -0300 Subject: [PATCH 064/193] Resolve detalhe na listagem de materias --- sapl/materia/views.py | 1 - sapl/templates/materia/materialegislativa_filter.html | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 35f60d255..1f73e3739 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1384,7 +1384,6 @@ class AcompanhamentoMateriaView(CreateView): materia = MateriaLegislativa.objects.get(id=pk) if form.is_valid(): - email = form.cleaned_data['email'] usuario = request.user diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index 2135bd23c..0e3de48fc 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -128,9 +128,9 @@ {% endfor %} {% endif %}

- {% if m.tramitacao_set.all.exists %} - Acompanhar Matéria - {% endif %} + + Acompanhar Matéria + {% endfor %} {% else %} From 2281589e94bfb94f59bc967d0495c9f11ea73921 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 30 May 2017 14:09:24 -0300 Subject: [PATCH 065/193] Trata listagem de composicao inexistente --- sapl/comissoes/views.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index c7c7bd117..0b80245c5 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -54,9 +54,21 @@ class ComposicaoCrud(MasterDetailCrud): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['composicao_pk'] = context['composicao_list'].last( - ).pk if self.take_composicao_pk( - ) == 0 else self.take_composicao_pk() +# context['composicao_pk'] = context['composicao_list'].last( +# ).pk if self.take_composicao_pk( +# ) == 0 else self.take_composicao_pk() + + composicao_pk = self.take_composicao_pk() + + if composicao_pk == 0: + ultima_composicao = context['composicao_list'].last() + if ultima_composicao: + context['composicao_pk'] = ultima_composicao.pk + else: + context['composicao_pk'] = 0 + else: + context['composicao_pk'] = composicao_pk + context['participacao_set'] = Participacao.objects.filter( composicao__pk=context['composicao_pk'] ).order_by('parlamentar') From 195d24fc61e3334e15f40306b8f345fa71c25375 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 30 May 2017 14:33:24 -0300 Subject: [PATCH 066/193] Fixes #1145 --- sapl/templates/materia/materialegislativa_filter.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index 0e3de48fc..cacc0ad9f 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -48,7 +48,7 @@
{% endif %} {% if m.data_fim_prazo %} - Data Fim Prazo: {{ m.data_fim_prazo }} + Data Fim Prazo (Matéria): {{ m.data_fim_prazo|default_if_none:"" }}
{% endif %} {% if m.numeracao_set.first %} @@ -73,7 +73,8 @@ Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino}}
{% endif %} {% if m.tramitacao_set.last.status %} - Status:  {{m.tramitacao_set.last.status}}
+ Status:  {{m.tramitacao_set.last.status}}
+ Data Fim Prazo (Tramitação): {{m.tramitacao_set.last.data_fim_prazo|default_if_none:""}}
{% endif %} {% if m.registrovotacao_set.exists %} Data da última Votação: @@ -128,7 +129,7 @@ {% endfor %} {% endif %}

- + Acompanhar Matéria From 573bc3116d9b149dd9f6b784f46bac81fc0f7473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?= Date: Tue, 30 May 2017 14:38:20 -0300 Subject: [PATCH 067/193] Fix #1141 (#1146) --- sapl/templates/materia/materialegislativa_filter.html | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index cacc0ad9f..d7b0bb3ec 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -60,12 +60,11 @@ {% endif %} {% if m.autoria_set.all %} - Autores: + Autor: {% for a in m.autoria_set.all %} - {% if not forloop.first %} - ,    - {% endif %} -  {{a.autor.nome}} + {% if a.primeiro_autor %} +  {{a.autor.nome}} + {% endif %} {% endfor %}
{% endif %} From 4c03eebf2f9dca3bef4bd2dacf1dc82b41834622 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 30 May 2017 14:47:35 -0300 Subject: [PATCH 068/193] Fixes #1149 --- sapl/materia/views.py | 10 ++++++---- sapl/templates/email/tramitacao.html | 1 + sapl/templates/email/tramitacao.txt | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 1f73e3739..beb923162 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1502,6 +1502,8 @@ def criar_email_tramitacao(request, casa_legislativa, materia, status, for autoria in materia.autoria_set.all(): autores.append(autoria.autor.nome) + tramitacao = materia.tramitacao_set.last() + templates = load_email_templates(['email/tramitacao.txt', 'email/tramitacao.html'], {"casa_legislativa": casa_nome, @@ -1511,11 +1513,11 @@ def criar_email_tramitacao(request, casa_legislativa, materia, status, "logotipo": casa_legislativa.logotipo, "descricao_materia": materia.ementa, "autoria": autores, - "data": materia.tramitacao_set.last( - ).data_tramitacao, + "data": tramitacao.data_tramitacao, "status": status, - "texto_acao": - materia.tramitacao_set.last().texto, + "localizacao": tramitacao\ + .unidade_tramitacao_destino, + "texto_acao": tramitacao.texto, "hash_txt": hash_txt, "materia": str(materia), "base_url": base_url, diff --git a/sapl/templates/email/tramitacao.html b/sapl/templates/email/tramitacao.html index 03fbea0cf..4b30a1dc5 100644 --- a/sapl/templates/email/tramitacao.html +++ b/sapl/templates/email/tramitacao.html @@ -22,6 +22,7 @@

Data da ação: {{data}}
Status: {{status}}
+ Localização Atual: {{localizacao}}
Texto da ação: {{texto_acao}}


diff --git a/sapl/templates/email/tramitacao.txt b/sapl/templates/email/tramitacao.txt index b2465a18d..f0a06687a 100644 --- a/sapl/templates/email/tramitacao.txt +++ b/sapl/templates/email/tramitacao.txt @@ -18,6 +18,8 @@ Data da ação: {{data}} Status: {{status}} +Localização Atual: {{localizacao}} + Texto da ação: {{texto_acao}} Acesse o link abaixo para excluir seu e-mail da lista de envio From 2f6ea044ce2ffd9e17690de4ba016e1f075bb8ae Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 30 May 2017 15:05:39 -0300 Subject: [PATCH 069/193] Fixes #1147 --- sapl/materia/models.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 2db7c38d8..032ce3253 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -119,14 +119,14 @@ TIPO_APRESENTACAO_CHOICES = Choices(('O', 'oral', _('Oral')), ('E', 'escrita', _('Escrita'))) def materia_upload_path(instance, filename): - return texto_upload_path(instance, filename, subpath=instance.ano) + return texto_upload_path(instance, filename, subpath=instance.ano) def anexo_upload_path(instance, filename): return texto_upload_path(instance, filename, subpath=instance.materia.ano) - + @reversion.register() class MateriaLegislativa(models.Model): - + tipo = models.ForeignKey(TipoMateriaLegislativa, on_delete=models.PROTECT, verbose_name=_('Tipo')) @@ -218,7 +218,7 @@ class MateriaLegislativa(models.Model): def __str__(self): return _('%(tipo)s nº %(numero)s de %(ano)s') % { 'tipo': self.tipo, 'numero': self.numero, 'ano': self.ano} - + def data_entrada_protocolo(self): ''' @@ -235,7 +235,7 @@ class MateriaLegislativa(models.Model): pass return '' - + def delete(self, using=None, keep_parents=False): if self.texto_original: self.texto_original.delete() @@ -838,4 +838,4 @@ class Tramitacao(models.Model): return _('%(materia)s | %(status)s | %(data)s') % { 'materia': self.materia, 'status': self.status, - 'data': self.data_tramitacao} + 'data': self.data_tramitacao.strftime("%d/%m/%Y")} From 76933dd05c7d6d12b0c8afb72d0c54d197494032 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 30 May 2017 15:55:04 -0300 Subject: [PATCH 070/193] Adiciona unidade de destino antes de salvar --- sapl/materia/views.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index beb923162..37e65161a 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -910,8 +910,11 @@ class TramitacaoCrud(MasterDetailCrud): if 'status' in request.POST and request.POST['status']: status = StatusTramitacao.objects.filter( id=request.POST['status']).first() + unidade_destino = UnidadeTramitacao.objects.get( + id=request.POST['unidade_tramitacao_destino'] + ) do_envia_email_tramitacao( - request, materia, status) + request, materia, status, unidade_destino) return super(CreateView, self).post(request, *args, **kwargs) class UpdateView(MasterDetailCrud.UpdateView): @@ -924,8 +927,11 @@ class TramitacaoCrud(MasterDetailCrud): if 'status' in request.POST and request.POST['status']: status = StatusTramitacao.objects.filter( id=request.POST['status']).first() + unidade_destino = UnidadeTramitacao.objects.get( + id=request.POST['unidade_tramitacao_destino'] + ) do_envia_email_tramitacao( - request, materia, status) + request, materia, status, unidade_destino) return super(UpdateView, self).post(request, *args, **kwargs) @@ -1479,7 +1485,7 @@ def criar_email_confirmacao(request, casa_legislativa, materia, hash_txt=''): def criar_email_tramitacao(request, casa_legislativa, materia, status, - hash_txt=''): + unidade_destino, hash_txt=''): if not casa_legislativa: raise ValueError("Casa Legislativa é obrigatória") @@ -1515,8 +1521,7 @@ def criar_email_tramitacao(request, casa_legislativa, materia, status, "autoria": autores, "data": tramitacao.data_tramitacao, "status": status, - "localizacao": tramitacao\ - .unidade_tramitacao_destino, + "localizacao": unidade_destino, "texto_acao": tramitacao.texto, "hash_txt": hash_txt, "materia": str(materia), @@ -1596,7 +1601,7 @@ def do_envia_email_confirmacao(request, materia, email): return None -def do_envia_email_tramitacao(request, materia, status): +def do_envia_email_tramitacao(request, materia, status, unidade_destino): # # Envia email de tramitacao para usuarios cadastrados # @@ -1615,6 +1620,7 @@ def do_envia_email_tramitacao(request, materia, status): casa, materia, status, + unidade_destino, destinatario.hash,) recipients.append(destinatario.email) messages.append({ @@ -1623,9 +1629,7 @@ def do_envia_email_tramitacao(request, materia, status): 'txt_message': email_texts[0], 'html_message': email_texts[1], }) - enviar_emails(sender, recipients, messages) - return None class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): From 50b95c0d8cc9650672a171ec8ac4507c769f0d5b Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Wed, 31 May 2017 12:24:29 -0300 Subject: [PATCH 071/193] Fix #1099 --- sapl/sessao/views.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 9fd048c43..19923caca 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -164,6 +164,16 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): class ListView(MasterDetailCrud.ListView): ordering = ['numero_ordem', 'materia', 'resultado'] + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + for i in range(len(context['rows'])): + materia = context['object_list'][i].materia + url_materia = reverse('sapl.materia:materialegislativa_detail', + kwargs={'pk': materia.id}) + + context['rows'][i][1] = (context['rows'][i][1][0], url_materia) + return context + def get_rows(self, object_list): for obj in object_list: exist_resultado = obj.registrovotacao_set.filter( @@ -280,11 +290,20 @@ class ExpedienteMateriaCrud(MasterDetailCrud): class ListView(MasterDetailCrud.ListView): ordering = ['numero_ordem', 'materia', 'resultado'] + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + for i in range(len(context['rows'])): + materia = context['object_list'][i].materia + url_materia = reverse('sapl.materia:materialegislativa_detail', + kwargs={'pk': materia.id}) + + context['rows'][i][1] = (context['rows'][i][1][0], url_materia) + return context + def get_rows(self, object_list): for obj in object_list: exist_resultado = obj.registrovotacao_set.filter( - materia=obj.materia - ).exists() + materia=obj.materia).exists() if not exist_resultado: if obj.votacao_aberta: url = '' From 8107a6947f825dc8106cb7535ad555c3a2f1c4d9 Mon Sep 17 00:00:00 2001 From: Eliseu Egewarth Date: Wed, 31 May 2017 13:28:43 -0300 Subject: [PATCH 072/193] Refatora SessaoPlenariaSerializer (#1144) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refatora SessaoPlenariaSerializer Mapeia informações do JSON para padrão E-Cidadania Signed-off-by: Eliseu Egewarth * Corrige erro de migração A migração do app 'base' só é executada após o job de migração passar pelo app 'api'. Dessa maneira, o atributo 'SessaoPlenariaSerializer.casa' gerava um erro na base de dados. Signed-off-by: Eliseu Egewarth --- sapl/api/serializers.py | 126 ++++++++++++++++++++++++++++++++++------ 1 file changed, 109 insertions(+), 17 deletions(-) diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py index 60ea6692a..e6adaf21a 100644 --- a/sapl/api/serializers.py +++ b/sapl/api/serializers.py @@ -1,8 +1,8 @@ from rest_framework import serializers -from sapl.base.models import Autor +from sapl.base.models import Autor, CasaLegislativa from sapl.materia.models import MateriaLegislativa -from sapl.sessao.models import SessaoPlenaria +from sapl.sessao.models import SessaoPlenaria, OrdemDia class ChoiceSerializer(serializers.Serializer): @@ -58,21 +58,113 @@ class MateriaLegislativaSerializer(serializers.ModelSerializer): class SessaoPlenariaSerializer(serializers.ModelSerializer): - tipo = serializers.StringRelatedField(many=False) - sessao_legislativa = serializers.StringRelatedField(many=False) - legislatura = serializers.StringRelatedField(many=False) + codReuniao = serializers.SerializerMethodField('get_pk_sessao') + codReuniaoPrincipal = serializers.SerializerMethodField('get_pk_sessao') + txtTituloReuniao = serializers.SerializerMethodField('get_name') + txtSiglaOrgao = serializers.SerializerMethodField('get_sigla_orgao') + txtApelido = serializers.SerializerMethodField('get_name') + txtNomeOrgao = serializers.SerializerMethodField('get_nome_orgao') + 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') + idYoutube = serializers.SerializerMethodField('get_url') + codEstadoTransmissaoYoutube = serializers.SerializerMethodField('get_estadoTransmissaoYoutube') + datReuniaoString = serializers.SerializerMethodField('get_date') + + # Constantes SessaoPlenaria (de 1-9) (apenas 3 serão usados) + SESSAO_FINALIZADA = 4 + SESSAO_EM_ANDAMENTO = 3 + SESSAO_CONVOCADA = 2 + + # Constantes EstadoTranmissaoYoutube (de 0 a 2) + TRANSMISSAO_ENCERRADA = 2 + TRANSMISSAO_EM_ANDAMENTO = 1 + SEM_TRANSMISSAO = 0 class Meta: model = SessaoPlenaria - fields = ('pk', - 'tipo', - 'sessao_legislativa', - 'legislatura', - 'data_inicio', - 'hora_inicio', - 'hora_fim', - 'url_video', - 'iniciada', - 'finalizada', - 'interativa' - ) + fields = ( + 'codReuniao', + 'codReuniaoPrincipal', + 'txtTituloReuniao', + 'txtSiglaOrgao', + 'txtApelido', + 'txtNomeOrgao', + 'codEstadoReuniao', + 'txtTipoReuniao', + 'txtObjeto', + 'txtLocal', + 'bolReuniaoConjunta', + 'bolHabilitarEventoInterativo', + 'idYoutube', + 'codEstadoTransmissaoYoutube', + 'datReuniaoString' + ) + + def __init__(self, *args, **kwargs): + super(SessaoPlenariaSerializer, self).__init__(args, kwargs) + casa = CasaLegislativa.objects.first() + + def get_pk_sessao(self, obj): + return obj.pk + + def get_name(self, obj): + return obj.__str__() + + def get_estadoSessaoPlenaria(self, obj): + if obj.finalizada: + return self.SESSAO_FINALIZADA + elif obj.iniciada: + return self.SESSAO_EM_ANDAMENTO + else: + return self.SESSAO_CONVOCADA + + def get_tipo_sessao(self, obj): + return obj.tipo.__str__() + + def get_url(self, obj): + return obj.url_video if obj.url_video else None + + def get_iterativo(self, obj): + return obj.interativa if obj.interativa else False + + def get_date(self, obj): + return "{} {}{}".format( + obj.data_inicio.strftime("%d/%m/%Y"), + obj.hora_inicio, + ":00" + ) + + def get_estadoTransmissaoYoutube(self, obj): + if obj.url_video: + if obj.finalizada: + return self.TRANSMISSAO_ENCERRADA + else: + 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) + pauta_sessao = ', '.join([i.materia.__str__() for i in ordem_dia]) + + return str(pauta_sessao) + + def get_endereco_orgao(self, obj): + return self.casa().endereco + + def get_reuniao_conjunta(self, obj): + return False + + def get_sigla_orgao(self, obj): + return self.casa().sigla + + def get_nome_orgao(self, obj): + return self.casa().nome + + def casa(self): + casa = CasaLegislativa.objects.first() + return casa From ff97492e63b7ef98b77e62d6d8aded20665a7132 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Wed, 31 May 2017 13:28:44 -0300 Subject: [PATCH 073/193] =?UTF-8?q?Otimiza=C3=A7=C3=A3o=20no=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/sessao/views.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 19923caca..1672d9ea5 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -124,6 +124,16 @@ def abrir_votacao_ordem_view(request, pk, spk): reverse('sapl.sessao:ordemdia_list', kwargs={'pk': spk})) +def put_link_materia(context): + for i, row in enumerate(context['rows']): + materia = context['object_list'][i].materia + url_materia = reverse('sapl.materia:materialegislativa_detail', + kwargs={'pk': materia.id}) + + context['rows'][i][1] = (row[1][0], url_materia) + return context + + class MateriaOrdemDiaCrud(MasterDetailCrud): model = OrdemDia parent_field = 'sessao_plenaria' @@ -166,19 +176,13 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - for i in range(len(context['rows'])): - materia = context['object_list'][i].materia - url_materia = reverse('sapl.materia:materialegislativa_detail', - kwargs={'pk': materia.id}) - context['rows'][i][1] = (context['rows'][i][1][0], url_materia) - return context + return put_link_materia(context) def get_rows(self, object_list): for obj in object_list: exist_resultado = obj.registrovotacao_set.filter( - materia=obj.materia - ).exists() + materia=obj.materia).exists() if not exist_resultado: if obj.votacao_aberta: url = '' @@ -292,13 +296,8 @@ class ExpedienteMateriaCrud(MasterDetailCrud): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - for i in range(len(context['rows'])): - materia = context['object_list'][i].materia - url_materia = reverse('sapl.materia:materialegislativa_detail', - kwargs={'pk': materia.id}) - context['rows'][i][1] = (context['rows'][i][1][0], url_materia) - return context + return put_link_materia(context) def get_rows(self, object_list): for obj in object_list: From 075bcf9a5453b4d8ad38cbf903133e6ad8e0dea3 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 31 May 2017 14:38:47 -0300 Subject: [PATCH 074/193] Adiciona banner de 'Beta' --- sapl/static/img/beta.png | Bin 0 -> 6797 bytes sapl/templates/base.html | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 sapl/static/img/beta.png diff --git a/sapl/static/img/beta.png b/sapl/static/img/beta.png new file mode 100644 index 0000000000000000000000000000000000000000..fe23d0e6dab33416c2121e69520bd58d89030bb0 GIT binary patch literal 6797 zcmaJ`2{@GN+n>SMjU`KI4nu^jV;%e0w`NH886+kq%e=nT z9r~=AE74oV<%mZn&>NsigFqVEfq;vvC!P$yh<7LWXbNvMJr{-(+%$!4mC$l%Ko9Rh zFb*c+&j(|yT!TGbRo#TOwcr|oYE%W@c(MyT(A&$$Pc2YW__tm)>iFoktT6mH3)xds z_)k!FXbZR=k%WgU$tX#?%E=?(DylLFB}G*PLJBS~hft73$jQp9N+S?ziYjUdW%yqo zVX8Hf+a)zieZ#+OQD>UM9%M40CMz2d5FitvAVVa%%OX@&Rb}PmW##3isT|UNK|W-c zKxrSpQ-5pF$NRaG2mqNt^no8~bh$|MCu<5*k^bp|H}D^|K7N0Ni5f83Ko>w3AtQI> z(%+0|^#9N5?foBaKe8qMfARjKVn3@O055Ba_apj~T&an>bn3_ypr%K{yO4<_DK|l}YQYGxV z|Gq^npQGV_>XthBPvzr%sO3(g)-@&hWCaMs2Qtyuu?l><`hW@G9?$50eq!*pk5J-M z)YP07>q3jyu~jtk_Km7}v{w)RyPEeUjxXlXSysySRqsu+N;~N{PM39xB`P7IpWpC5 z_4TTn0i`C&!Rcs3Zqw0#b&VPG_KvUZWxvVKKCdt$O}MmsSbjM^du+gCVSiWs{Z5O! z>4$xOotv-x<|f3U3R=twZzbayy3Unr#j^Jw-_1rkwePH1M|V}cTB`JOKj1`rtb6sE~22%nJ?hS?vqf>9ub84x^- zmKh4=9d5o$+s*5nzIkqmfkDdH%^upCrvQ5j2Pn5e4DOUCk=JOhJ`FoHENxViD%KXw zf}F7dC&mothvgHgI%Wx~wKE}KpTIO{K~xc8w)nG0qp(v+Q)i}+2DFGH^I^1MAn0$q zZ_U?E6dI%vIJjA}a*6m8w`l&XSi(m%8r*}~llu44`Z z#miY?LOZC~jUIQytoQc~Hz8oC9TY@^yr4?;6@`NS?G^yyXaz?p!$5QZ=x7~ew5eMm zJhQ}(+%4SX;H3j@#LYj3rm5VPt3K%$FaGwV!RgSvxjJ z!|NyaRAurV^*saYGO%C5O`|Js6~*!%#^);4xh&g6Ny7&(qV_w|PgINh+dY4tmXoda zw5+x!sA?3(!wtJL7hqD;HC+3XB7RCML#rOAzmdXYd415IaPFcsFO%@p84%a2*2^3+ zHle0S{q5DQXP;|v$OhF({y&nPJ5vGUvl`FT19%2aG4~d;xo5PMcQL!a93=K<=OomC zk6fd*wH8^Ru8Yj-JCf>LGmPq}UF;QK&roIOlQ5|(L+c!6qb1=4%;IF1gDSa1BYxEC zRc%~U^oucRXN z5u0%#Q*5M$lY-*u@Km-FdZFr9X$qOs%M{06TZ2tA0|j~gdeodbAqFRT=(fY~`Xh2T7eM zceLr*JoB;?%NEAr9h|zkptJPdd-?egaVFl(k)a~P?qL=Bgo2Iubg8@s8Mp*r1v+k8 zCg60{yciJ?`H?oeZi~m_tJhU)vr}xmwAaq{$wfd7hf_8wEuP4K8==IxAAQ=1JW_eVuYJIq{=++4_- z->&M7>*3`w*eiG5=0EvVl3ZAv{Ya#c@pIytp$bWV`%a!onwaBTxVpCvB3|me8sdxQ z+`d!3xcZB$P7SxjgwqP|wXX_ z3Mqqks!s>-J;NoNO$z6_+xn2RLQpv(Qa$a-EiO&4%`{8BFIl{tQel&hG=(1 z`cKn9N%FC)m$$N_%J-DJIaamitsH$jg<&NM$J0&{o7&oZd+#?pCfi=KcF5FIkr@f^ z>sOQ@aA-==Txp4AjYE@hhhG&Yw+riUPOIJl-1wQGc8M~`F~LKeAabFxV~ZFSy;SEc zn1YB^>FslxJpcyoW@x?i&0f?zxc){_tZwBdKoRJjMn^*|Xd5dXY_{J1+V!&jZiCC! zPRlu_6I@!t&C7fDx^xL^N1hPaOZ+G;)1|}Rq=JTyisB!Pq7J2+TIOEKDF>udt41B% z^gDtDUovE{Di;lx~&H3SWeVb}TAMf;lcbfQE@U3MYHH=dYZwhKUph%E$d6P9R|m*-WEZa)amY!B9hwP`m|qBUKJ~)u?!C~^(&kUdZi#mcBi-lqLQYbD@}7Z=qDSQI zy@5c0Qjalp>}&hVPaJfTfu9hR6Zy69qXDT&8EbqUaO+3M865@~NZ%Rx<(t`jqeDDf z6vOfcNvmLy<-01|G{)G54#E_mIvKDp{Ge=2fP%Y8I{YKQIIpy{Zl;G0Mo;_O{a3)| zw8m@xHGi(nQ9tM2brE7pR<2<7CfFqNFcJ73>zaPpveZ1c>FZ*E{9`Il8^-CJ!h&k< zgkcq}<|_klQg<4&*<#?KKkgE21zzF4cHZ;T-o9Ysb~Z`C?ri(?*$MxTKiLha?|=eT z+UTAgy1FMs?z@GjHBe2i@iQ|siymIYlw;mF_7s6kxS6&HtcVBMc)sD6Sb#up%Q>0x zz^i6Q5}Hn1;aEY=S8jS!CeWu(_CY!JUg?A2QW+=?7G> z_m`?}S*lrHL)UBDlt+a^%`B~DC_baUan&Mv`*k8Xc~V0KMmg={cN8wAe}2vPoQ<@? zr>E2kD#)kQUZy|+uk_0F>>Q+d_QzWjUBdJ~M+y}xV`-X{HQ6w>##vL+_vU=8_aIE= zlG;HOOD(`H-(s>`6DZSHPwtc zT`0&CGxSyDmx5Q#T;z>>O61k=ot--NG~BH&BB*L!f$ww-wqsiUs|w34kdw#vBJ}&+ z9zF*;jqI!HUS5NHI`zGJ^5VU$H5e{LYZM(^asKvcq*MB88;KE_t#y#m9EDZ7V!PpK z3^`qdd!TN-*vFOY1h8g{`xNz2FabCZB9Fx5R^l zeD9cW8zX-NIn|At^7(gP? zcAWhDK*HY{!YOkxc3 z*7un4PY*lk*otv4ZT#E7b$wyH`gPZO8qR+7_g%ccwJlWibt>d?e-?ws=qq2JNs%tn zulJDntS6+&n?)@Y6SCaXO3xQvcOImk0($t>XM4b~7Z80FWU@{dOOi70VuMb5xV-GG zxo0Ze#@t9JKEUq5Oueq>SFMNlQ%?_uF!Yr&M^wX@xZ=Y;(?3(Bl-f@D9a^uFgx#Xq?@Y#LP zBD-l((TkVl@O)hBYl7<4wzkEf9QI5vmdj&o!lNP=UMd%m*gSQ};gO5#^>KLZ&J_+1=+~uiTFwcQ7F$aLuRcA5Tq^*Ib zuQp7^NuQ?T1b|Kk34ize$CC1tNhu`}CYwwn;|ZP+{EKU( zq34cHW5mD+y>ljxY&FXu20np@wSDO_yd4#y6FVIU`X*~xbdznPQW@~L%TecjW{zk; zjJI#beky`VZ%zm@aLxBacGZ*wWOc#rH6S>208|O(8==+(- zyYbGD0=^uNtPk17>g^^3rL2 zZ66rpm2y`)Mg|~Xu^$40Z^s>E_kS>3TzOL5kpJN2_;`;$ui3_N0|H{}3;)67ehU5z zzxim@aFTw;Gdr%Try{P)XT5neH7+vmUuegb19p)S`Bj@hQ+!nPQ}`@T!DrfT+>YV! z5Z`Li_>f?l!aP&z%eD*04qM*8K^AIse`I;zT6U1|uuLi3jO8nOzowWAW&kmr=x?J)5~hunGimb70k^eC${IjXCv_F2B1@4dUK zWtT9KtwH(s6L_`tcW$NUV``o^l+zfAAAG5$taQXBse6oSCL>m-ODmPmSd|p zI&xA}Y^kO^!4mV0ho46Ug%LP2XPLak6uA^C!xx)=!^&|AEw7M*^^ejj6;Bx~RJAT? zE48e&e#T7Qq~lcu^O2alqtGBGoi^-7 zcHF4sXH{fXCtmQU()jXhN7K|)X}96D$;qM*V&k!gfpb??kk>;Gkeb)s5~|_7)PqHu z#3a9-lJwwqGLTXaKUXRmX%v`ocJ+qRtKBCD)Ef?~*!!dg^uS zZE!dYT9@4I?Ui-AKk*IICu42zT1w7%!_S#n(0v{D(kBH{V{J&Ue}2{lZc0K`j<6+7 z(ncfq51-S)n!WkmpER=tzJEWH6bG4wJ0?89KX@B{Q8d>Dd~QbWTUX{r@3iH%sjtBP z>Km}?-dext3Wv@}zoJFSlO*oO7g8?-yPfU#H@SIt1O9G7i1zKSN&GN1inur%cqH`?N9r-h} zD9pV?o!0R74#q^$q?t`GlPjvJ3?|8@tt+##w5s{kR6a(D*w`qVeKiDsdqUiBM zt9oy|es87|Y}YZ{n^ZFRPWpV42ImiXY`i$u0@w_`xAge&YFd%(;Qjl_4*vNK6`xad z&F`#*Z$vje3>&<(;>B)nS;M=&g`hMQ@i+LE>S3bEkQlX}DsR z+;xPZ(5@so?kkfxA=Cb_US91?QC!IrPxLpT!w^4+f>g})Fntl&%eJ&fZAsGcQodFa z`_=G|Ag(RIgS+Fd1oVx~3Dl)l&g6LzjGm4T__1s=n=dB-_XJ0q&r?H2^Cb&eO9RaT z+-RU5>6gprT*I)CpL_*+00j=3OPi<8z#R3~9MpE%%h>24cJjWu$f*|1XKt;A7?fRPuipw`pN^t8`!v zK>(h@0;cv2|A};jSQux*bahiXqG%O9aY#`oAmf>TwYU;W?L^Z37rEi=cNw9{2`Fk? zlj^|{HFo`WhOtNJFK1Mb?zYg9ju8A6g#xDk!lTo8#HiOxJxo6?jkusgweXYu2ndyO zTYm>_3(PR)hXQpnz>Md0sm)JRV(3vYzR>izw1RcA!9T5F6fgr_L!22Jney&d0!@Sl tmTE!gI^8k{H3W<_aE^kw1LrU>=pp0anavM7(?@?0nHXU7%XBY9{0~Bf#y

{% block navigation %} -