From 9600e64a541f025e47fce73a7a4faef9480c5e9f Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 26 Mar 2018 14:29:19 -0300 Subject: [PATCH 01/36] HOT-FIX: adiciona fechamento de tag --- sapl/templates/materia/materialegislativa_filter.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index 96a7eb55a..2d54016ba 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -137,7 +137,7 @@

Acompanhar Matéria - + {% endfor %} {% else %} From 2a58973c425cd23cc9597bd3ebf79b305425d0dd Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 26 Mar 2018 14:43:45 -0300 Subject: [PATCH 02/36] =?UTF-8?q?corrige=20atribui=C3=A7=C3=A3o=20de=20n?= =?UTF-8?q?=C3=B3=20raiz=20de=20dispositivos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/compilacao/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index ac1939f80..f677cf97a 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -1086,6 +1086,9 @@ class Dispositivo(BaseModel, TimestampedMixin): update_fields=None, clean=True): self.dispositivo_raiz = self.get_raiz() + if self.dispositivo_raiz == self: + self.dispositivo_raiz = None + self.contagem_continua = self.tipo_dispositivo.contagem_continua return super().save( From ed0180f8473d6b8c6fe1feec3b524d78bef65655 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 26 Mar 2018 15:31:35 -0300 Subject: [PATCH 03/36] =?UTF-8?q?HOT-FIX:=20melhora=20desempenho=20de=20bu?= =?UTF-8?q?sca=20de=20mat=C3=A9ria=20legislatura?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/views.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 35c46ecca..99d34e6b3 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1529,6 +1529,20 @@ class MateriaLegislativaPesquisaView(FilterView): if 'o' in self.request.GET and not self.request.GET['o']: qs = qs.order_by('-ano', 'tipo__sigla', '-numero') + qs = qs.prefetch_related("autoria_set", + "autoria_set__autor", + "numeracao_set", + "anexadas", + "tipo", + "texto_articulado", + "tramitacao_set", + "tramitacao_set__status", + "tramitacao_set__unidade_tramitacao_local", + "tramitacao_set__unidade_tramitacao_destino", + "normajuridica_set", + "registrovotacao_set", + "documentoacessorio_set") + kwargs.update({ 'queryset': qs, }) From a1c9a1acdc0bbe54c312ba91711bfeb59ff2a523 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 26 Mar 2018 13:46:43 -0300 Subject: [PATCH 04/36] =?UTF-8?q?Retira=20c=C3=B3digo=20desnecess=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Este código foi usado para gerar uma versão inicial dos forms com diagramanção semelhante à do sapl 2.5 --- .../legacy/scripts/old_names_adjustments.yaml | 8 - .../scripts/original_forms/Afastamento.html | 219 ---- .../scripts/original_forms/Anexada.html | 289 ------ .../scripts/original_forms/AssuntoNorma.html | 383 ------- sapl/legacy/scripts/original_forms/Autor.html | 491 --------- .../scripts/original_forms/Autoria.html | 487 --------- .../scripts/original_forms/Bancada.html | 645 ------------ .../original_forms/CasaLegislativa.html | 544 ---------- .../scripts/original_forms/Coligacao.html | 486 --------- .../scripts/original_forms/Comissao.html | 604 ----------- .../original_forms/ComposicaoComissao.html | 508 ---------- .../scripts/original_forms/Dependente.html | 485 --------- .../original_forms/DocumentoAcessorio.html | 684 ------------- .../DocumentoAcessorioAdministrativo.html | 333 ------ .../DocumentoAdministrativo.html | 429 -------- .../original_forms/ExpedienteMateria.html | 250 ----- .../scripts/original_forms/Filiacao.html | 656 ------------ .../original_forms/LegislacaoCitada.html | 529 ---------- .../scripts/original_forms/Legislatura.html | 437 -------- .../original_forms/LexmlRegistroProvedor.html | 376 ------- .../LexmlRegistroPublicador.html | 360 ------- .../scripts/original_forms/Mandato.html | 611 ----------- .../original_forms/MateriaLegislativa.html | 952 ------------------ .../scripts/original_forms/NormaJuridica.html | 788 --------------- .../scripts/original_forms/Numeracao.html | 542 ---------- .../scripts/original_forms/Oradores.html | 572 ----------- .../original_forms/OradoresExpediente.html | 572 ----------- .../scripts/original_forms/OrdemDia.html | 249 ----- sapl/legacy/scripts/original_forms/Orgao.html | 406 -------- .../legacy/scripts/original_forms/Origem.html | 386 ------- .../original_forms/PainelEletronico.html | 646 ------------ .../scripts/original_forms/Parlamentar.html | 763 -------------- .../scripts/original_forms/Partido.html | 436 -------- .../original_forms/PeriodoCompComissao.html | 412 -------- .../original_forms/PeriodoCompMesa.html | 411 -------- .../scripts/original_forms/Proposicao.html | 646 ------------ .../scripts/original_forms/Protocolo.html | 429 -------- .../original_forms/RegistroVotacao.html | 280 ------ .../scripts/original_forms/Relatoria.html | 515 ---------- .../original_forms/SessaoLegislativa.html | 468 --------- .../original_forms/SessaoPlenaria.html | 734 -------------- .../original_forms/StatusTramitacao.html | 398 -------- .../StatusTramitacaoAdministrativo.html | 226 ----- .../scripts/original_forms/TipoAutor.html | 412 -------- .../scripts/original_forms/TipoComissao.html | 404 -------- .../TipoDocumentoAdministrativo.html | 388 ------- .../original_forms/TipoExpediente.html | 368 ------- .../original_forms/TipoNormaJuridica.html | 432 -------- .../original_forms/TipoProposicao.html | 460 --------- .../original_forms/TipoResultadoVotacao.html | 368 ------- .../original_forms/TipoSessaoPlenaria.html | 378 ------- .../original_forms/TipoSituacaoNorma.html | 357 ------- .../scripts/original_forms/Tramitacao.html | 842 ---------------- .../TramitacaoAdministrativo.html | 410 -------- .../original_forms/UnidadeTramitacao.html | 854 ---------------- .../scripts/original_forms/_auxiliares.txt | 24 - .../_not_found_among_sapl25_models.txt | 6 - .../scripts/original_forms/_principais.txt | 7 - sapl/legacy/scripts/scrap_original_forms.py | 283 ------ sapl/legacy/scripts/study.py | 12 - sapl/legacy/scripts/utils.py | 9 +- 61 files changed, 2 insertions(+), 26657 deletions(-) delete mode 100644 sapl/legacy/scripts/old_names_adjustments.yaml delete mode 100644 sapl/legacy/scripts/original_forms/Afastamento.html delete mode 100644 sapl/legacy/scripts/original_forms/Anexada.html delete mode 100644 sapl/legacy/scripts/original_forms/AssuntoNorma.html delete mode 100644 sapl/legacy/scripts/original_forms/Autor.html delete mode 100644 sapl/legacy/scripts/original_forms/Autoria.html delete mode 100644 sapl/legacy/scripts/original_forms/Bancada.html delete mode 100644 sapl/legacy/scripts/original_forms/CasaLegislativa.html delete mode 100644 sapl/legacy/scripts/original_forms/Coligacao.html delete mode 100644 sapl/legacy/scripts/original_forms/Comissao.html delete mode 100644 sapl/legacy/scripts/original_forms/ComposicaoComissao.html delete mode 100644 sapl/legacy/scripts/original_forms/Dependente.html delete mode 100644 sapl/legacy/scripts/original_forms/DocumentoAcessorio.html delete mode 100644 sapl/legacy/scripts/original_forms/DocumentoAcessorioAdministrativo.html delete mode 100644 sapl/legacy/scripts/original_forms/DocumentoAdministrativo.html delete mode 100644 sapl/legacy/scripts/original_forms/ExpedienteMateria.html delete mode 100644 sapl/legacy/scripts/original_forms/Filiacao.html delete mode 100644 sapl/legacy/scripts/original_forms/LegislacaoCitada.html delete mode 100644 sapl/legacy/scripts/original_forms/Legislatura.html delete mode 100644 sapl/legacy/scripts/original_forms/LexmlRegistroProvedor.html delete mode 100644 sapl/legacy/scripts/original_forms/LexmlRegistroPublicador.html delete mode 100644 sapl/legacy/scripts/original_forms/Mandato.html delete mode 100644 sapl/legacy/scripts/original_forms/MateriaLegislativa.html delete mode 100644 sapl/legacy/scripts/original_forms/NormaJuridica.html delete mode 100644 sapl/legacy/scripts/original_forms/Numeracao.html delete mode 100644 sapl/legacy/scripts/original_forms/Oradores.html delete mode 100644 sapl/legacy/scripts/original_forms/OradoresExpediente.html delete mode 100644 sapl/legacy/scripts/original_forms/OrdemDia.html delete mode 100644 sapl/legacy/scripts/original_forms/Orgao.html delete mode 100644 sapl/legacy/scripts/original_forms/Origem.html delete mode 100644 sapl/legacy/scripts/original_forms/PainelEletronico.html delete mode 100644 sapl/legacy/scripts/original_forms/Parlamentar.html delete mode 100644 sapl/legacy/scripts/original_forms/Partido.html delete mode 100644 sapl/legacy/scripts/original_forms/PeriodoCompComissao.html delete mode 100644 sapl/legacy/scripts/original_forms/PeriodoCompMesa.html delete mode 100644 sapl/legacy/scripts/original_forms/Proposicao.html delete mode 100644 sapl/legacy/scripts/original_forms/Protocolo.html delete mode 100644 sapl/legacy/scripts/original_forms/RegistroVotacao.html delete mode 100644 sapl/legacy/scripts/original_forms/Relatoria.html delete mode 100644 sapl/legacy/scripts/original_forms/SessaoLegislativa.html delete mode 100644 sapl/legacy/scripts/original_forms/SessaoPlenaria.html delete mode 100644 sapl/legacy/scripts/original_forms/StatusTramitacao.html delete mode 100644 sapl/legacy/scripts/original_forms/StatusTramitacaoAdministrativo.html delete mode 100644 sapl/legacy/scripts/original_forms/TipoAutor.html delete mode 100644 sapl/legacy/scripts/original_forms/TipoComissao.html delete mode 100644 sapl/legacy/scripts/original_forms/TipoDocumentoAdministrativo.html delete mode 100644 sapl/legacy/scripts/original_forms/TipoExpediente.html delete mode 100644 sapl/legacy/scripts/original_forms/TipoNormaJuridica.html delete mode 100644 sapl/legacy/scripts/original_forms/TipoProposicao.html delete mode 100644 sapl/legacy/scripts/original_forms/TipoResultadoVotacao.html delete mode 100644 sapl/legacy/scripts/original_forms/TipoSessaoPlenaria.html delete mode 100644 sapl/legacy/scripts/original_forms/TipoSituacaoNorma.html delete mode 100644 sapl/legacy/scripts/original_forms/Tramitacao.html delete mode 100644 sapl/legacy/scripts/original_forms/TramitacaoAdministrativo.html delete mode 100644 sapl/legacy/scripts/original_forms/UnidadeTramitacao.html delete mode 100644 sapl/legacy/scripts/original_forms/_auxiliares.txt delete mode 100644 sapl/legacy/scripts/original_forms/_not_found_among_sapl25_models.txt delete mode 100644 sapl/legacy/scripts/original_forms/_principais.txt delete mode 100644 sapl/legacy/scripts/scrap_original_forms.py delete mode 100644 sapl/legacy/scripts/study.py diff --git a/sapl/legacy/scripts/old_names_adjustments.yaml b/sapl/legacy/scripts/old_names_adjustments.yaml deleted file mode 100644 index 75c6b8a68..000000000 --- a/sapl/legacy/scripts/old_names_adjustments.yaml +++ /dev/null @@ -1,8 +0,0 @@ -Comissao: - ind_unidade_deliberativa: unidade_deliberativa - -Legislatura: - num_legislatura: id - -Parlamentar: - municipio: municipio_residencia diff --git a/sapl/legacy/scripts/original_forms/Afastamento.html b/sapl/legacy/scripts/original_forms/Afastamento.html deleted file mode 100644 index 12512ca9a..000000000 --- a/sapl/legacy/scripts/original_forms/Afastamento.html +++ /dev/null @@ -1,219 +0,0 @@ - - - Formulário de Afastamento - - - - - - - - - - - - - - - - - - - - - -

Afastamento / Licença

- - - -

Alexandre Neu

- -
-
- - - - -
- - -
-
- - -
-
- -
- - -
-
-
- - -
-
- - -
- -
- - -
- - - -
diff --git a/sapl/legacy/scripts/original_forms/Anexada.html b/sapl/legacy/scripts/original_forms/Anexada.html deleted file mode 100644 index 1630de4e2..000000000 --- a/sapl/legacy/scripts/original_forms/Anexada.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - -
-
- - -

- Logotipo da Casa Legislativa -

-
-

Camara Municipal de Demonstracao

-

Sistema de Apoio ao Processo Legislativo

-
-
-
-
- Busca por palavra-chave - - -
-
-
-
-
- -
- usuário: saploper - -
-
- -
- - -
- - - - - - - - -

Matéria Legislativa

- -
- - - -
Matéria Legislativa - - - - - - - - - - - - -
- Tipo: IND - - Número: 1 - - Ano: 2015 -
- Ementa: TESTE -
- -
Matéria Anexada - - - - - - - - - - -
-  
- -
-  
- -
-  
- -
-  
- - -
-
- - -
-
-

-    -

- - -

 

-
- -
- -
-
-
-
-
- Av. George Washington, 3580 - - São José da Lagoa Tapada - PB - - CEP: 12345-678 - - Telefone: (12)3456-7890 - - Fax: (09)8765-4321 -
- - Portal: http://www.camaramunicipal.gov.br - - E-mail: faleconosco@camaramunicipal.gov.br -
-
- Desenvolvido pelo Interlegis - Desenvolvido em Zope -
-
-
- - - - diff --git a/sapl/legacy/scripts/original_forms/AssuntoNorma.html b/sapl/legacy/scripts/original_forms/AssuntoNorma.html deleted file mode 100644 index 99756a7ad..000000000 --- a/sapl/legacy/scripts/original_forms/AssuntoNorma.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- - -
Assunto Norma Jurídica - - - - -
- - - - - - - -
Assunto (*)
-
Descrição
- -
-

- -    -

-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Autor.html b/sapl/legacy/scripts/original_forms/Autor.html deleted file mode 100644 index 417105dbe..000000000 --- a/sapl/legacy/scripts/original_forms/Autor.html +++ /dev/null @@ -1,491 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início
- - - - - - - -
Autor - - - - - - - -
Tipo (*)
- -
Autor (*)
- -
- - -
- Acesso ao SAPL - - - - - - - -
- Conceder ao Autor acesso especial ao SAPL como usuário do perfil "Autor"?
- Sim - Não -
-  Login:   -
-
-
-
- -    -
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Autoria.html b/sapl/legacy/scripts/original_forms/Autoria.html deleted file mode 100644 index abf614573..000000000 --- a/sapl/legacy/scripts/original_forms/Autoria.html +++ /dev/null @@ -1,487 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -Ajuda - -

Matéria Legislativa

- - - -
- - - - - - -
- -
- - - - - - - - - - -
- Tipo: Emenda - - Número: 6 - - Ano: 2014 -
- Ementa: DEPOIS DA PARALISAÇÃO DA REFORMA DO AUTÓDROMO INTERNACIONAL NELSON PIQUET E O CONSEQUENTE CANCELAMENTO DA ETAPA DE ABERTURA DA FÓRMULA INDY EM BRASÍLIA, O GOVERNADOR DO DISTRITO FEDERAL, RODRIGO ROLLEMBERG, E O PRESIDENTE DO TRIBUNAL DE CONTAS DO DF, RENATO RAINHA, FIZERAM UMA VISITA TÉCNICA AO LOCAL NA MANHÃ DESTA QUINTA-FEIRA (12/2). APESAR DA EXPECTATIVA, NÃO HOUVE O ANÚNCIO DE UMA DATA PARA A RETOMADA DAS OBRAS. EM CONVERSA COM OS REPÓRTERES PRESENTES, ROLLEMBERG EVITOU FALAR SOBRE DATAS. “O PRAZO É O DA SEGURANÇA JURÍDICA. NÓS TEMOS A DETERMINAÇÃO DE RECUPERAR O AUTÓDROMO COMO UM EQUIPAMENTO PÚBLICO IMPORTANTE PARA A CIDADE, MAS QUEREMOS FAZER ISSO COM TODA SEGURANÇA. -
- - -
Autoria - - - - - - -
 
- -
 
- -
-  
- - Sim - - Não -
-
-

- -

-
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Bancada.html b/sapl/legacy/scripts/original_forms/Bancada.html deleted file mode 100644 index 41042f9a9..000000000 --- a/sapl/legacy/scripts/original_forms/Bancada.html +++ /dev/null @@ -1,645 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - - Ajuda - -

Tabelas Auxiliares

- - - - - -
| Voltar |
- -
- - - -
- Cadastro de Bancada, Bloco, Frente ou Grupo - - - - - - - - - - - - - - - -

- -

- -

- -

- -

- -

- -
- -

- -

- -
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/CasaLegislativa.html b/sapl/legacy/scripts/original_forms/CasaLegislativa.html deleted file mode 100644 index 17f94aba0..000000000 --- a/sapl/legacy/scripts/original_forms/CasaLegislativa.html +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - -
- - - - - - -

Tabelas Auxiliares

- -
Casa Legislativa - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-

-

-

-

-

- - -

- -

-

-

-

- cor

- cor

- cor

- - -

-

-

-
-

- -   

-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Coligacao.html b/sapl/legacy/scripts/original_forms/Coligacao.html deleted file mode 100644 index 1b0baef09..000000000 --- a/sapl/legacy/scripts/original_forms/Coligacao.html +++ /dev/null @@ -1,486 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - - -
- | Composição || Início |
-
Coligação - - - - - - - - -
- - - - - - -
Nome (*)
-
Nº Legislatura (*)
- -
Nº Votos Recebidos
-

-

- -    -

-
-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Comissao.html b/sapl/legacy/scripts/original_forms/Comissao.html deleted file mode 100644 index 1d5d419ba..000000000 --- a/sapl/legacy/scripts/original_forms/Comissao.html +++ /dev/null @@ -1,604 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - -Ajuda -

Comissões

- - -
- - - - - - -
- Dados Básicos - - - - - - - - - - - -
Nome da Comissâo  
- -
Sigla  
- -
Tipo  
- -
Data Criação  
- -
Unidade Deliberativa 
- - Não - - Sim -
Data Extinção
- -
-
- -
- Dados Complementares - - - - - - - - - - - - - - - - - - - -
Local Reunião
- -
Data/Hora Reunião
- -
Tel. Sala Reunião
- -
Endereço Secretaria
- -
Tel. Secretaria
- -
Fax Secretaria
- -
Secretário
- -
E-mail
- -
Finalidade - -
-
- -
- Temporária - - - - - - - - - - -
Apelido
- -
Data Instalação
- -
Data Prevista Término
- -
Novo Prazo
- -
Data Término
- -
-
-

- -

-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/ComposicaoComissao.html b/sapl/legacy/scripts/original_forms/ComposicaoComissao.html deleted file mode 100644 index 460443369..000000000 --- a/sapl/legacy/scripts/original_forms/ComposicaoComissao.html +++ /dev/null @@ -1,508 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - -

Comissão de Constituição e Justiça

-
- - - - - - - -
- Composição - - - - - - - - - - - - - - - - -
Parlamentar  
- -
Titular  
- - Não - - Sim -
Cargo  
- -
Data Designação  
- -
Data Desligamento
- -
Motivo Desligamento
- -
Observação
- -
-
- -

- -    -

-
-
-
- -
-
- - -
-
-
- - - \ No newline at end of file diff --git a/sapl/legacy/scripts/original_forms/Dependente.html b/sapl/legacy/scripts/original_forms/Dependente.html deleted file mode 100644 index 81b14d925..000000000 --- a/sapl/legacy/scripts/original_forms/Dependente.html +++ /dev/null @@ -1,485 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - -Ajuda - - - - -

Dependente

- -
- - - - - - - -
Dependentes - - - - - - - - - - - - - - - -
Nome  
- -
Tipo  
- -
Sexo  
- - Masculino - - Feminino -
Data Nascimento
- -
CPF
- -
RG
- -
Nº Título Eleitor
- -
-
-

- -    -


-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/DocumentoAcessorio.html b/sapl/legacy/scripts/original_forms/DocumentoAcessorio.html deleted file mode 100644 index 13eae1195..000000000 --- a/sapl/legacy/scripts/original_forms/DocumentoAcessorio.html +++ /dev/null @@ -1,684 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - - - - - -Ajuda - -

Matéria Legislativa

- - - -
- -
- - - - - - - - - - -
- Tipo: Emenda - - Número: 6 - - Ano: 2014 -
- Ementa: DEPOIS DA PARALISAÇÃO DA REFORMA DO AUTÓDROMO INTERNACIONAL NELSON PIQUET E O CONSEQUENTE CANCELAMENTO DA ETAPA DE ABERTURA DA FÓRMULA INDY EM BRASÍLIA, O GOVERNADOR DO DISTRITO FEDERAL, RODRIGO ROLLEMBERG, E O PRESIDENTE DO TRIBUNAL DE CONTAS DO DF, RENATO RAINHA, FIZERAM UMA VISITA TÉCNICA AO LOCAL NA MANHÃ DESTA QUINTA-FEIRA (12/2). APESAR DA EXPECTATIVA, NÃO HOUVE O ANÚNCIO DE UMA DATA PARA A RETOMADA DAS OBRAS. EM CONVERSA COM OS REPÓRTERES PRESENTES, ROLLEMBERG EVITOU FALAR SOBRE DATAS. “O PRAZO É O DA SEGURANÇA JURÍDICA. NÓS TEMOS A DETERMINAÇÃO DE RECUPERAR O AUTÓDROMO COMO UM EQUIPAMENTO PÚBLICO IMPORTANTE PARA A CIDADE, MAS QUEREMOS FAZER ISSO COM TODA SEGURANÇA. -
- - -
-
- Documento Acessório - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   -
- -
-  
-
-  
- -
-  
- - Pesquisar -
-
- -
-
-
-
- -
-
- -
- - -
- -

- -    - -

-
- - -
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/DocumentoAcessorioAdministrativo.html b/sapl/legacy/scripts/original_forms/DocumentoAcessorioAdministrativo.html deleted file mode 100644 index e6c0b0a3a..000000000 --- a/sapl/legacy/scripts/original_forms/DocumentoAcessorioAdministrativo.html +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - -
-
- - -

- Logotipo da Casa Legislativa -

-
-

Câmara Municipal de Demonstração

-

Sistema de Apoio ao Processo Legislativo

-
-
-
-
- Busca por palavra-chave - - -
-
-
-
-
- -
- usuário: saploper - -
-
- -
- - -
- - - - - - - - - -

Documento Administrativo

- -
- -
Documento Administrativo - - - - - - - - - - - -
- Tipo: CNV - - Número: 1 - - Ano: 2015 -
- Assunto: AAAAA -
- - -
Documento Acessório - - - - - - - - - - - - - - - - - - -

- -

- -

- - -

- -

- -
-

- -
- - -
- -

- -    -

- - - -
-
-
-
-
-
- Av. George Washington, 3580 - - São José da Lagoa Tapada - PB - - CEP: 12345-678 - - Telefone: (12)3456-7890 - - Fax: (09)8765-4321 -
- - Portal: http://www.camaramunicipal.gov.br - - E-mail: faleconosco@camaramunicipal.gov.br -
-
- Desenvolvido pelo Interlegis - Desenvolvido em Zope -
-
-
- - - - diff --git a/sapl/legacy/scripts/original_forms/DocumentoAdministrativo.html b/sapl/legacy/scripts/original_forms/DocumentoAdministrativo.html deleted file mode 100644 index 319ce746a..000000000 --- a/sapl/legacy/scripts/original_forms/DocumentoAdministrativo.html +++ /dev/null @@ -1,429 +0,0 @@ - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - -
-
- - -

- Logotipo da Casa Legislativa -

-
-

Câmara Municipal de Demonstração

-

Sistema de Apoio ao Processo Legislativo

-
-
-
-
- Busca por palavra-chave - - -
-
-
-
-
- -
- usuário: saploper - -
-
- -
- - -
- - - - - - - - -Ajuda -

Documentos Administrativos

- -
- -
- Formulário de Cadastro - - - - - -
- Indentificação Básica - - - - - - - - - - - - - - - - - - - - - -

- -

- - -

- - -

- - - -

- -
  - -

- -
 
- - Sim - - Não -

- - -
-
- -
- Outras Informações - - - - - - - -

- -

- - -
- -
-
-

- -    -

-
-
- -
-
-
-
-
- Av. George Washington, 3580 - - São José da Lagoa Tapada - PB - - CEP: 12345-678 - - Telefone: (12)3456-7890 - - Fax: (09)8765-4321 -
- - Portal: http://www.camaramunicipal.gov.br - - E-mail: faleconosco@camaramunicipal.gov.br -
-
- Desenvolvido pelo Interlegis - Desenvolvido em Zope -
-
-
- - - - diff --git a/sapl/legacy/scripts/original_forms/ExpedienteMateria.html b/sapl/legacy/scripts/original_forms/ExpedienteMateria.html deleted file mode 100644 index 18688b1b4..000000000 --- a/sapl/legacy/scripts/original_forms/ExpedienteMateria.html +++ /dev/null @@ -1,250 +0,0 @@ - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - -
-Ajuda -

Matérias do Expediente

- -

2ª Reunião Ordinária da 3ª Sessão Legislativa da 14ª Legislatura
14 de Abril de 2015 (Terça-feira) - -

- -
-
- Cadastro de Matérias do Expediente - - - - - - - - - - - - - - - - - - -
-
- -
-
- -
-
- - -
-
- -
-
- -
- -
- -
-
- - - Simbólica - - Nominal - - Secreta -
-
-
- -
-
-

- -   -   - -

- - - -
-
- diff --git a/sapl/legacy/scripts/original_forms/Filiacao.html b/sapl/legacy/scripts/original_forms/Filiacao.html deleted file mode 100644 index 94988e2d4..000000000 --- a/sapl/legacy/scripts/original_forms/Filiacao.html +++ /dev/null @@ -1,656 +0,0 @@ - - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - -Ajuda - - - - -

Filiação

- -
- - - - - - -
- Filiações Partidárias - - - - - - -
Partido  
-
Data Filiação  
- -
Data Desfiliação
- - -
- -

- -    - -

- - - - - - - - - - -
-
- -
-
- -
-
- - -
-
-
- - - - - diff --git a/sapl/legacy/scripts/original_forms/LegislacaoCitada.html b/sapl/legacy/scripts/original_forms/LegislacaoCitada.html deleted file mode 100644 index 5fec95b9e..000000000 --- a/sapl/legacy/scripts/original_forms/LegislacaoCitada.html +++ /dev/null @@ -1,529 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - -

Matéria Legislativa

- -
- - - -
Legislação Citada - - - - - - - - - - - - - - - - - - - - - - - -
-  
-
-  
-
-  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - - - - - - - - -
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Legislatura.html b/sapl/legacy/scripts/original_forms/Legislatura.html deleted file mode 100644 index 66d1588cc..000000000 --- a/sapl/legacy/scripts/original_forms/Legislatura.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- -
Legislatura - - - - -
- - - - - - - - - - -
Nº Legislatura (*)
-
Data Início (*)
- -
(dd/mm/aaaa)
Data Fim (*)
- -
(dd/mm/aaaa)
Data Eleição (*)
- -
(dd/mm/aaaa)
- -

- -    -

-
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/LexmlRegistroProvedor.html b/sapl/legacy/scripts/original_forms/LexmlRegistroProvedor.html deleted file mode 100644 index bff82389c..000000000 --- a/sapl/legacy/scripts/original_forms/LexmlRegistroProvedor.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - -
- Provedor LexML - - - - - - - - - - - - - - - - - - - - - - - - -
Id do provedor (*)
- -
Nome do provedor
- -
Id do responsável
- -
Nome do responsável
- -
E-mail do responsável
- -
- Endereço do provedor OAI - - http://sapl3.interlegis.leg.br/oai -
XML fornecido pela equipe do LexML:
- -
- -
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/LexmlRegistroPublicador.html b/sapl/legacy/scripts/original_forms/LexmlRegistroPublicador.html deleted file mode 100644 index 6336408b8..000000000 --- a/sapl/legacy/scripts/original_forms/LexmlRegistroPublicador.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

-
- Publicador LexML - - - - - - - - - - - - - - -
Id do publicador (*)
- -
Nome do publicador
- -
Sigla do publicador
- -
Id do responsável
- -
Nome do responsável
- -
E-mail do responsável
- -
- -
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Mandato.html b/sapl/legacy/scripts/original_forms/Mandato.html deleted file mode 100644 index fe966bee9..000000000 --- a/sapl/legacy/scripts/original_forms/Mandato.html +++ /dev/null @@ -1,611 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - - - - - - - - - - - - -

Mandato

- - - - -
- - - - -
Mandato - - - - - - - - - - - - - - - -
Legislatura  
- -
Coligação
- -
Votos Recebidos
-
- Natureza do Mandato 
- - Titular - - Suplente -
Início do Mandato  
- -
Fim do Mandato  
- -
Expedição do Diploma
- -
Observação
-
-
-

- -

- - - - - - -

- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/MateriaLegislativa.html b/sapl/legacy/scripts/original_forms/MateriaLegislativa.html deleted file mode 100644 index 07c174401..000000000 --- a/sapl/legacy/scripts/original_forms/MateriaLegislativa.html +++ /dev/null @@ -1,952 +0,0 @@ - - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Demonstração - - - DF -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - - - -Ajuda -

Matéria Legislativa

- - - -
- - - - - - -
- Identificação Básica - - - - - - - - - - - - - - - - - - - -

- - - -

- - -

- -

- -

- - -

- - Oral - - Escrita -

- - -
-
- - Gerar ODT -
-
-
- Proposição Eletrônica - - - - -
- Esta matéria não foi gerada a partir de uma proposição eletrônica. -
-
- - -
- Outras Informações - - - - - - - - - - - - - - - - - -

- -

- -

- - Sim - - Não -

- -

-

- - Sim - - Não -

- -

- -

- - Sim - - Não -

- -
-
-
- Origem Externa - - - - - - - - - - -

- -

- -

-
-

- -

- -
-
-
- Dados Textuais - - - - - - - - - - -
  - -
- -
- -
-
- -

- - -

-
- -
-
- -
-
- - -
-
-
- - - - - diff --git a/sapl/legacy/scripts/original_forms/NormaJuridica.html b/sapl/legacy/scripts/original_forms/NormaJuridica.html deleted file mode 100644 index 4c1a1f4ab..000000000 --- a/sapl/legacy/scripts/original_forms/NormaJuridica.html +++ /dev/null @@ -1,788 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - - - - - -Ajuda - -

Norma Jurídica

- - - - -
- -
- Identificação Básica - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
- -
 
- -
 
- - -
 
- -
 
- -

- - Sim - - Não -

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -

- - - -
-
- -
 
- -

- -

- -
-
- -
-
- Assuntos (Classificação) [+] -
- - - - - - - - - - -
- -
- -
- -
-
-
-
- - -

- - -

- - - - - - -
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Numeracao.html b/sapl/legacy/scripts/original_forms/Numeracao.html deleted file mode 100644 index 494a31e33..000000000 --- a/sapl/legacy/scripts/original_forms/Numeracao.html +++ /dev/null @@ -1,542 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - -Ajuda - -

Matéria Legislativa

- -
- - - - - -
- -
- - - - - - - - - - -
- Tipo: Emenda - - Número: 6 - - Ano: 2014 -
- Ementa: DEPOIS DA PARALISAÇÃO DA REFORMA DO AUTÓDROMO INTERNACIONAL NELSON PIQUET E O CONSEQUENTE CANCELAMENTO DA ETAPA DE ABERTURA DA FÓRMULA INDY EM BRASÍLIA, O GOVERNADOR DO DISTRITO FEDERAL, RODRIGO ROLLEMBERG, E O PRESIDENTE DO TRIBUNAL DE CONTAS DO DF, RENATO RAINHA, FIZERAM UMA VISITA TÉCNICA AO LOCAL NA MANHÃ DESTA QUINTA-FEIRA (12/2). APESAR DA EXPECTATIVA, NÃO HOUVE O ANÚNCIO DE UMA DATA PARA A RETOMADA DAS OBRAS. EM CONVERSA COM OS REPÓRTERES PRESENTES, ROLLEMBERG EVITOU FALAR SOBRE DATAS. “O PRAZO É O DA SEGURANÇA JURÍDICA. NÓS TEMOS A DETERMINAÇÃO DE RECUPERAR O AUTÓDROMO COMO UM EQUIPAMENTO PÚBLICO IMPORTANTE PARA A CIDADE, MAS QUEREMOS FAZER ISSO COM TODA SEGURANÇA. -
- - -
Numeração - - - - - - - - - -
-  
- -
-  
-
-  
-
-
- -
-
- -

- -

- -
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Oradores.html b/sapl/legacy/scripts/original_forms/Oradores.html deleted file mode 100644 index c050e8dd2..000000000 --- a/sapl/legacy/scripts/original_forms/Oradores.html +++ /dev/null @@ -1,572 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - -Ajuda -

Oradores das Explicações Pessoais

-

2ª Reunião Ordinária da 3ª Sessão Legislativa da 14ª Legislatura
14 de Abril de 2015 (Terça-feira) - -

- -
- - - - - - - - - - - - - - - - -
Nenhum orador cadastrado.
-
-
-
-Cadastro de Oradores do Expediente - - - - - - - - - - - - - - -
- - - - - - - - -
- -
-
-
-Cadastro de Discurso - - - - - - - - -
- - - - - -
- - - - - - - -
-
- -
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/OradoresExpediente.html b/sapl/legacy/scripts/original_forms/OradoresExpediente.html deleted file mode 100644 index c81fba1a4..000000000 --- a/sapl/legacy/scripts/original_forms/OradoresExpediente.html +++ /dev/null @@ -1,572 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - -Ajuda -

Oradores do Expediente

-

2ª Reunião Ordinária da 3ª Sessão Legislativa da 14ª Legislatura
14 de Abril de 2015 (Terça-feira) - -

- -
- - - - - - - - - - - - - - - - -
Nenhum orador cadastrado.
-
-
-
-Cadastro de Oradores do Expediente - - - - - - - - - - - - - - -
- - - - - - - - -
- -
-
-
-Cadastro de Discurso - - - - - - - - -
- - - - - -
- - - - - - - -
-
- -
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/OrdemDia.html b/sapl/legacy/scripts/original_forms/OrdemDia.html deleted file mode 100644 index 6d86301e0..000000000 --- a/sapl/legacy/scripts/original_forms/OrdemDia.html +++ /dev/null @@ -1,249 +0,0 @@ - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - -
- Ajuda -

Matérias da Ordem do Dia

- -

2ª Reunião Ordinária da 3ª Sessão Legislativa da 14ª Legislatura
14 de Abril de 2015 (Terça-feira) - -

- -
-
- Cadastro de Matérias da Ordem do Dia - - - - - - - - - - - - - - - - - - -
-
- -
-
- -
-
- - -
-
- -
-
- -
- -
- -
-
- - Simbólica - - Nominal - - Secreta -
-
-
- -
-
-

- -   -   - -

- - - -
-
- diff --git a/sapl/legacy/scripts/original_forms/Orgao.html b/sapl/legacy/scripts/original_forms/Orgao.html deleted file mode 100644 index 5711e7965..000000000 --- a/sapl/legacy/scripts/original_forms/Orgao.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
-
Órgão - - - - - -
- - - - - - - - - - -
Nome (*)
-
Sigla (*) - Unidade Deliberativa (*)
- - Não - - Sim -
Endereço
-
Telefone
-
-

- -    -

-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Origem.html b/sapl/legacy/scripts/original_forms/Origem.html deleted file mode 100644 index 2efaf6c19..000000000 --- a/sapl/legacy/scripts/original_forms/Origem.html +++ /dev/null @@ -1,386 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- -
Origem - - - - -
- - - - - -
Nome (*)
-
Sigla (*)
-
-

- -    -

-
-
-
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/PainelEletronico.html b/sapl/legacy/scripts/original_forms/PainelEletronico.html deleted file mode 100644 index 6976877ed..000000000 --- a/sapl/legacy/scripts/original_forms/PainelEletronico.html +++ /dev/null @@ -1,646 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - -
- - - - -

Tabelas Auxiliares

- -
- Propriedades do Painel Eletrônico - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
-
- - cor da fonte do painel -
-
- - cor da fonte do painel -
-
- - cor da fonte do painel -
-
- -
-
- -
-
- - cor da Fonte do painel -
-
- -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- - cor da fonte do painel -
-
- -
-
- -
-
- - Texto IntegralAbrir arquivo de som - -
-
-
- -
-
- -
-
- -
-

- -   

-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Parlamentar.html b/sapl/legacy/scripts/original_forms/Parlamentar.html deleted file mode 100644 index 2c634f4cd..000000000 --- a/sapl/legacy/scripts/original_forms/Parlamentar.html +++ /dev/null @@ -1,763 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - - - - -Ajuda - -

Parlamentares

- -
- - - - - - - -
- Cadastro do Parlamentar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Nome Parlamentar  
- -
- Login  
- -
- Ativo na Casa? 
- - Sim - - Não -
Nome Completo 
- -
Nível Instrução
- -
Sexo 
- - Masculino - - Feminino -
Data Nascimento
- - (dd/mm/aaaa) -
C.P.F
- -
R.G.
- -
Título de Eleitor
-
Situação Militar
-
Profissão
-
HomePage
-
Correio Eletrônico
-
Nº Gabinete
-
Telefone
-
Fax
-
Endereço Residencial
-
CEP
-
Município
- -
UF
-
Telefone Residencial
-
Fax Residencial
-
Locais de Atuação
-
Fotografia:
- - -
Biografia
- -
Observação
- -
- - -
- -
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Partido.html b/sapl/legacy/scripts/original_forms/Partido.html deleted file mode 100644 index a91710511..000000000 --- a/sapl/legacy/scripts/original_forms/Partido.html +++ /dev/null @@ -1,436 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- -
- -
Partido Político - - - - -
- - - - - - - - - -
Nome (*)
-
Sigla (*)
-
Data Criação
- - (dd/mm/aaaa)
Data Extinção
- - (dd/mm/aaaa)
-
-

- -    -

-
-
-
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/PeriodoCompComissao.html b/sapl/legacy/scripts/original_forms/PeriodoCompComissao.html deleted file mode 100644 index 0c0d5b859..000000000 --- a/sapl/legacy/scripts/original_forms/PeriodoCompComissao.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- - -
Período Composição de Comissão - - - - -
- - - - - -
Data Início (*)
- - (dd/mm/aaaa)
Data Fim (*)
- - (dd/mm/aaaa)
-

- -    -

-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/PeriodoCompMesa.html b/sapl/legacy/scripts/original_forms/PeriodoCompMesa.html deleted file mode 100644 index a88375b01..000000000 --- a/sapl/legacy/scripts/original_forms/PeriodoCompMesa.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - -

Tabelas Auxiliares

- - - - - -
| Iní­cio |
- -
- - - - - -
Perí­odo Composição da Mesa Diretora - - - - - -
Data Iní­cio  
-
Data Fim  
-
-

- -

-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Proposicao.html b/sapl/legacy/scripts/original_forms/Proposicao.html deleted file mode 100644 index f3570355e..000000000 --- a/sapl/legacy/scripts/original_forms/Proposicao.html +++ /dev/null @@ -1,646 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - - -Ajuda - -

Proposição

- - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- Tipo  
- -
- - - -
Descrição  
- -
Matéria Vinculada
- -
Número
- -
Ano
- -
- Texto original (PDF)
- -
- Modelo ODT
- -
- -

- - -

- -
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Protocolo.html b/sapl/legacy/scripts/original_forms/Protocolo.html deleted file mode 100644 index c1f97eb70..000000000 --- a/sapl/legacy/scripts/original_forms/Protocolo.html +++ /dev/null @@ -1,429 +0,0 @@ - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - -
-
- - -

- Logotipo da Casa Legislativa -

-
-

Câmara Municipal de Demonstração

-

Sistema de Apoio ao Processo Legislativo

-
-
-
-
- Busca por palavra-chave - - -
-
-
-
-
- -
- usuário: saploper - -
-
- -
- - -
- - - - - - - - -Ajuda -

Documentos Administrativos

- -
- -
- Formulário de Cadastro - - - - - -
- Indentificação Básica - - - - - - - - - - - - - - - - - - - - - -

- -

- - -

- - -

- - - -

- -
  - -

- -
 
- - Sim - - Não -

- - -
-
- -
- Outras Informações - - - - - - - -

- -

- - -
- -
-
-

- -    -

-
-
- -
-
-
-
-
- Av. George Washington, 3580 - - São José da Lagoa Tapada - PB - - CEP: 12345-678 - - Telefone: (12)3456-7890 - - Fax: (09)8765-4321 -
- - Portal: http://www.camaramunicipal.gov.br - - E-mail: faleconosco@camaramunicipal.gov.br -
-
- Desenvolvido pelo Interlegis - Desenvolvido em Zope -
-
-
- - - - diff --git a/sapl/legacy/scripts/original_forms/RegistroVotacao.html b/sapl/legacy/scripts/original_forms/RegistroVotacao.html deleted file mode 100644 index 56814e2e2..000000000 --- a/sapl/legacy/scripts/original_forms/RegistroVotacao.html +++ /dev/null @@ -1,280 +0,0 @@ - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - -
-Ajuda -

Votação

-

1ª Reunião Ordinária da 3ª Sessão Legislativa da 14ª Legislatura
12 de Fevereiro de 2015 (Quinta-feira) - -

- -
- - - - - - - - - - - - -
- Votação Simbólica - - - - - - - - - - - - - - - - - - - - - -
- Matéria: IND 90 2009 - Indicação
- Ementa: INDICAÇÃO -
-   - - -   - - -   - - -   - -
- - -   - - Não - - Sim -
-   - -
- - -
-
- -     -
-
-
-
- - diff --git a/sapl/legacy/scripts/original_forms/Relatoria.html b/sapl/legacy/scripts/original_forms/Relatoria.html deleted file mode 100644 index c80c41e2e..000000000 --- a/sapl/legacy/scripts/original_forms/Relatoria.html +++ /dev/null @@ -1,515 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - -

Matéria Legislativa

- -
- - - - - - -
- -
- - - - - - - - - - -
- Tipo: Emenda - - Número: 6 - - Ano: 2014 -
- Ementa: DEPOIS DA PARALISAÇÃO DA REFORMA DO AUTÓDROMO INTERNACIONAL NELSON PIQUET E O CONSEQUENTE CANCELAMENTO DA ETAPA DE ABERTURA DA FÓRMULA INDY EM BRASÍLIA, O GOVERNADOR DO DISTRITO FEDERAL, RODRIGO ROLLEMBERG, E O PRESIDENTE DO TRIBUNAL DE CONTAS DO DF, RENATO RAINHA, FIZERAM UMA VISITA TÉCNICA AO LOCAL NA MANHÃ DESTA QUINTA-FEIRA (12/2). APESAR DA EXPECTATIVA, NÃO HOUVE O ANÚNCIO DE UMA DATA PARA A RETOMADA DAS OBRAS. EM CONVERSA COM OS REPÓRTERES PRESENTES, ROLLEMBERG EVITOU FALAR SOBRE DATAS. “O PRAZO É O DA SEGURANÇA JURÍDICA. NÓS TEMOS A DETERMINAÇÃO DE RECUPERAR O AUTÓDROMO COMO UM EQUIPAMENTO PÚBLICO IMPORTANTE PARA A CIDADE, MAS QUEREMOS FAZER ISSO COM TODA SEGURANÇA. -
- - -
Relatoria - - - - - - - - - - - - - - - -
-  
- -
-
- -
-  
- -
-
- -
-
- -
-
-

Não é possível incluir relatoria, a matéria deve estar em uma Comissão!
- -

- -
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/SessaoLegislativa.html b/sapl/legacy/scripts/original_forms/SessaoLegislativa.html deleted file mode 100644 index 6940da731..000000000 --- a/sapl/legacy/scripts/original_forms/SessaoLegislativa.html +++ /dev/null @@ -1,468 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- -
-
Sessão Legislativa - - - - - - - -
- - - - - - - - - - - -
Número (*)
-
Tipo
-
Data Início (*)
- - (dd/mm/aaaa)
Data Fim (*)
- - (dd/mm/aaaa)
Início Intervalo
- - (dd/mm/aaaa)
Fim Intervalo
- - (dd/mm/aaaa)

-

- -    -

-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/SessaoPlenaria.html b/sapl/legacy/scripts/original_forms/SessaoPlenaria.html deleted file mode 100644 index 9890277bd..000000000 --- a/sapl/legacy/scripts/original_forms/SessaoPlenaria.html +++ /dev/null @@ -1,734 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - - - - - - - -Ajuda - -

Sessão Plenária

- -

3ª Reunião Ordinária da 3ª Sessão Legislativa da 14ª Legislatura
08 de Maio de 2015 (Sexta-feira) - -

- - - - - - - - - - - - - -
- - - - - - - -
-Dados Básicos - - - - - - - - - - - - - - - - - - - - - - - - - -
-  
- - -      -
-  
- -
-
- -
-  
- -
-  
- Data: - -  Horário: (hh:mm) - -  Sessão iniciada? -
 
-
- Data: - - -  Horário: (hh:mm) - -  Sessão finalizada? -
 

- - - - -

- - - - -
-
-
-
-
-
-
-

- - - -

-
-
-
-
- -
-
- - -
-
-
- - - - - diff --git a/sapl/legacy/scripts/original_forms/StatusTramitacao.html b/sapl/legacy/scripts/original_forms/StatusTramitacao.html deleted file mode 100644 index f468514d2..000000000 --- a/sapl/legacy/scripts/original_forms/StatusTramitacao.html +++ /dev/null @@ -1,398 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
-
Status Tramitação - - - - - -
- - - - - - - - -
Sigla (*)
-
Indicador da Tramitação
-
Descrição (*)
-
-
-
- -    -

-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/StatusTramitacaoAdministrativo.html b/sapl/legacy/scripts/original_forms/StatusTramitacaoAdministrativo.html deleted file mode 100644 index ab83b12e2..000000000 --- a/sapl/legacy/scripts/original_forms/StatusTramitacaoAdministrativo.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - -
-
- - -

- Logotipo da Casa Legislativa -

-
-

Câmara Municipal de Demonstração

-

Sistema de Apoio ao Processo Legislativo

-
-
-
-
- Busca por palavra-chave - - -
-
-
-
-
- -
- usuário: saploper - -
-
- -
- - -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
-
Status Tramitação Administrativo - - - - - -
- - - - - - - - -
Sigla (*)
-
Indicador da Tramitação
-
Descrição (*)
-
-
-
- -    -

-
-
-
-
-
-
-
-
- Av. George Washington, 3580 - - São José da Lagoa Tapada - PB - - CEP: 12345-678 - - Telefone: (12)3456-7890 - - Fax: (09)8765-4321 -
- - Portal: http://www.camaramunicipal.gov.br - - E-mail: faleconosco@camaramunicipal.gov.br -
-
- Desenvolvido pelo Interlegis - Desenvolvido em Zope -
-
-
- - - - diff --git a/sapl/legacy/scripts/original_forms/TipoAutor.html b/sapl/legacy/scripts/original_forms/TipoAutor.html deleted file mode 100644 index 959bcb866..000000000 --- a/sapl/legacy/scripts/original_forms/TipoAutor.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
-
Tipo Autor - - - - -
- - - - - -
Tipo (*) -
- - Parlamentar -
- - Comissão -
- - Outros -
Descrição (*)
- - -
-

- -    - -

- -
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/TipoComissao.html b/sapl/legacy/scripts/original_forms/TipoComissao.html deleted file mode 100644 index 7ad6c2d91..000000000 --- a/sapl/legacy/scripts/original_forms/TipoComissao.html +++ /dev/null @@ -1,404 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- - -
Tipo Comissão - - - - -
- - - - - - - - - -
Nome (*)
-
Sigla (*)
-
Dispositivo Regimental
- -
Natureza (*)
-
-

- -    -

-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/TipoDocumentoAdministrativo.html b/sapl/legacy/scripts/original_forms/TipoDocumentoAdministrativo.html deleted file mode 100644 index d0615cd13..000000000 --- a/sapl/legacy/scripts/original_forms/TipoDocumentoAdministrativo.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- - - -
Tipo Documento Administrativo - - - - -
- - - - - -
Sigla (*)
-
Descrição (*)
-
-

- -    -

-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/TipoExpediente.html b/sapl/legacy/scripts/original_forms/TipoExpediente.html deleted file mode 100644 index 4bba50675..000000000 --- a/sapl/legacy/scripts/original_forms/TipoExpediente.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -Ajuda -

Tabelas Auxiliares

- - - - - - - -
- | Início | -
- -
-
- Tipo de Expediente - - - - - - - - - -
- - -
- -    -
-
-
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/TipoNormaJuridica.html b/sapl/legacy/scripts/original_forms/TipoNormaJuridica.html deleted file mode 100644 index 26b69ca2e..000000000 --- a/sapl/legacy/scripts/original_forms/TipoNormaJuridica.html +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- - -
Tipo Norma Jurídica - - - - -
- - - - - - -
Descrição (*)
-
Sigla (*)
-
Equivalente LexML (*)
- -
-

- -    -

-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/TipoProposicao.html b/sapl/legacy/scripts/original_forms/TipoProposicao.html deleted file mode 100644 index e12faf6db..000000000 --- a/sapl/legacy/scripts/original_forms/TipoProposicao.html +++ /dev/null @@ -1,460 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
- -
Tipo Proposição - - - - -
- - - - - - - - - - - - - - - - - -
Descrição
-
Gera
- Matéria
- Documento
-
Tipo Matéria
-
Modelo XML
-
-

- -    -

-
-
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/TipoResultadoVotacao.html b/sapl/legacy/scripts/original_forms/TipoResultadoVotacao.html deleted file mode 100644 index 5d40db62b..000000000 --- a/sapl/legacy/scripts/original_forms/TipoResultadoVotacao.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -Ajuda -

Tabelas Auxiliares

- - - - - - - -
- | Início | -
- -
-
- Tipo de Resultado da Votação - - - - - - - - - -
- - -
- -    -
-
-
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/TipoSessaoPlenaria.html b/sapl/legacy/scripts/original_forms/TipoSessaoPlenaria.html deleted file mode 100644 index 0defb9d54..000000000 --- a/sapl/legacy/scripts/original_forms/TipoSessaoPlenaria.html +++ /dev/null @@ -1,378 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -Ajuda -

Tabelas Auxiliares

- - - - - - - -
- | Início | -
- -
-
- Tipo de Sessão Plenária - - - - - - - - - - -
- - - - - -
- -    -
-
-
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/TipoSituacaoNorma.html b/sapl/legacy/scripts/original_forms/TipoSituacaoNorma.html deleted file mode 100644 index b0e1bd8a9..000000000 --- a/sapl/legacy/scripts/original_forms/TipoSituacaoNorma.html +++ /dev/null @@ -1,357 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -Ajuda - -

Tabelas Auxiliares

- - - - - -
| Início |
- -
- -
Situação de Norma Jurídica - - - - -
Situação  
-
-
-

- -

-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/Tramitacao.html b/sapl/legacy/scripts/original_forms/Tramitacao.html deleted file mode 100644 index 80529566f..000000000 --- a/sapl/legacy/scripts/original_forms/Tramitacao.html +++ /dev/null @@ -1,842 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - -Ajuda -

Matéria Legislativa

- - - - - - - - - -
- - - - - - -
- -
- - - - - - - - - - -
- Tipo: Emenda - - Número: 6 - - Ano: 2014 -
- Ementa: DEPOIS DA PARALISAÇÃO DA REFORMA DO AUTÓDROMO INTERNACIONAL NELSON PIQUET E O CONSEQUENTE CANCELAMENTO DA ETAPA DE ABERTURA DA FÓRMULA INDY EM BRASÍLIA, O GOVERNADOR DO DISTRITO FEDERAL, RODRIGO ROLLEMBERG, E O PRESIDENTE DO TRIBUNAL DE CONTAS DO DF, RENATO RAINHA, FIZERAM UMA VISITA TÉCNICA AO LOCAL NA MANHÃ DESTA QUINTA-FEIRA (12/2). APESAR DA EXPECTATIVA, NÃO HOUVE O ANÚNCIO DE UMA DATA PARA A RETOMADA DAS OBRAS. EM CONVERSA COM OS REPÓRTERES PRESENTES, ROLLEMBERG EVITOU FALAR SOBRE DATAS. “O PRAZO É O DA SEGURANÇA JURÍDICA. NÓS TEMOS A DETERMINAÇÃO DE RECUPERAR O AUTÓDROMO COMO UM EQUIPAMENTO PÚBLICO IMPORTANTE PARA A CIDADE, MAS QUEREMOS FAZER ISSO COM TODA SEGURANÇA. -
- - -
Tramitação - - - - - - - - - - - - - - - - - - - -
-  
- - - -
-  
- -
-  
- -
-
- -
-  
- - Sim - - Não -
-
- -
-
- -
-
- -
-
- -
-
- -

- -

- -
- -
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/TramitacaoAdministrativo.html b/sapl/legacy/scripts/original_forms/TramitacaoAdministrativo.html deleted file mode 100644 index 3541373cd..000000000 --- a/sapl/legacy/scripts/original_forms/TramitacaoAdministrativo.html +++ /dev/null @@ -1,410 +0,0 @@ - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - -
-
- - -

- Logotipo da Casa Legislativa -

-
-

Câmara Municipal de Demonstração

-

Sistema de Apoio ao Processo Legislativo

-
-
-
-
- Busca por palavra-chave - - -
-
-
-
-
- -
- usuário: saploper - -
-
- -
- - -
- - - - -

Documento Administrativo

- - - - - - - - -
- - - - - - - -
Documento Administrativo - - - - - - - - - - - -
- Tipo: CNV - - Número: 1 - - Ano: 2015 -
- Assunto: AAAAA -
- - -
Tramitação - - - - - - - - - - - - - - - - - - - - -

- - - -

- -

-

-

- -

- - -

- -
-
-

-    -

-
-
-
-
-
-
-
- Av. George Washington, 3580 - - São José da Lagoa Tapada - PB - - CEP: 12345-678 - - Telefone: (12)3456-7890 - - Fax: (09)8765-4321 -
- - Portal: http://www.camaramunicipal.gov.br - - E-mail: faleconosco@camaramunicipal.gov.br -
-
- Desenvolvido pelo Interlegis - Desenvolvido em Zope -
-
-
- - - - diff --git a/sapl/legacy/scripts/original_forms/UnidadeTramitacao.html b/sapl/legacy/scripts/original_forms/UnidadeTramitacao.html deleted file mode 100644 index ed2fea4ae..000000000 --- a/sapl/legacy/scripts/original_forms/UnidadeTramitacao.html +++ /dev/null @@ -1,854 +0,0 @@ - - - - - - - - - - - - - Sistema de Apoio ao Processo Legislativo - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-

- Câmara Municipal de Piraí - - - RJ -

-

Sistema de Apoio ao Processo Legislativo

-
-
-
- -
- - - - - -
- - -

Tabelas Auxiliares

- - - - - -
| Início |
-
- Unidade Tramitação - - - - - - - - - - - -
Órgão
-
Correspondente SPDO
- -
Comissão
- -
Parlamentar
- -
-
-

- -    -

- -
-
-
-
- -
-
- - -
-
-
- - - diff --git a/sapl/legacy/scripts/original_forms/_auxiliares.txt b/sapl/legacy/scripts/original_forms/_auxiliares.txt deleted file mode 100644 index 992ec93ce..000000000 --- a/sapl/legacy/scripts/original_forms/_auxiliares.txt +++ /dev/null @@ -1,24 +0,0 @@ -AssuntoNormaJuridica -Autor -Bancada -CasaLegislativa -Coligacao -LexmlProvedor -LexmlPublicador -Orgao -Origem -PainelEletronico -Partido -PeriodoCompComissao -PeriodoCompMesa -SessaoLegislativa -StatusTramitacao -TipoAutor -TipoComissao -TipoExpediente -TipoNormaJuridica -TipoProposicao -TipoResultadoVotacao -TipoSessaoPlenaria -TipoSituacaoNorma -UnidadeTramitacao diff --git a/sapl/legacy/scripts/original_forms/_not_found_among_sapl25_models.txt b/sapl/legacy/scripts/original_forms/_not_found_among_sapl25_models.txt deleted file mode 100644 index 0f2f2e62c..000000000 --- a/sapl/legacy/scripts/original_forms/_not_found_among_sapl25_models.txt +++ /dev/null @@ -1,6 +0,0 @@ -CasaLegislativa -Bancada -PainelEletronico - -TipoSituacaoNorma -PeriodoCompMesa diff --git a/sapl/legacy/scripts/original_forms/_principais.txt b/sapl/legacy/scripts/original_forms/_principais.txt deleted file mode 100644 index ad6343feb..000000000 --- a/sapl/legacy/scripts/original_forms/_principais.txt +++ /dev/null @@ -1,7 +0,0 @@ -Comissao -MateriaLegislativa -NormaJuridica -Parlamentar -Proposicao -Protocolo -SessaoPlenaria diff --git a/sapl/legacy/scripts/scrap_original_forms.py b/sapl/legacy/scripts/scrap_original_forms.py deleted file mode 100644 index e7a7f3162..000000000 --- a/sapl/legacy/scripts/scrap_original_forms.py +++ /dev/null @@ -1,283 +0,0 @@ -import os -import pprint -import re -import string - -import pkg_resources -import yaml -from bs4 import BeautifulSoup -from bs4.element import NavigableString, Tag -from django.apps.config import AppConfig - -from sapl.crispy_layout_mixin import heads_and_tails -from sapl.legacy.migracao_dados import appconfs, get_renames -from sapl.legacy.scripts.utils import getsourcelines -from sapl.utils import listify - -# to prevent removal by automatic organize imports on this file -assert appconfs - -field_renames, model_renames = get_renames() - - -def _read_line(tr): - for td in tr.find_all('td'): - label = td.text.strip().split('\n')[0].strip( - '\xa0' + string.whitespace) - if label.endswith('(*)'): - label = label[:-3].strip() - names = [c.attrs['name'] - for c in td.findAll() - if isinstance(c, Tag) and 'name' in c.attrs] - if names: - name = names[0].split('_', 1)[-1] - yield name, label - - -def extract_title_and_fieldsets(model): - filename = os.path.join(os.path.dirname(__file__), - 'original_forms/%s.html' % model.__name__) - try: - with open(filename, 'r') as file: - html_doc = file.read() - except IOError: - return None, [] - - soup = BeautifulSoup(html_doc, 'html.parser') - forms = soup.find_all('form') - [form] = [f for f in forms if ('method', 'post') in f.attrs.items()] - # children are either tags or strings... - assert set(type(c) for c in form.children) == {Tag, NavigableString} - # ... and all strings are empty - assert all(not c.strip() - for c in form.children if isinstance(c, NavigableString)) - - title = soup.find('h1', {'class': 'firstHeading'}) - title = title.text.strip() if title else None - fieldsets = [dict( - legend=fieldset.find('legend').text if fieldset.find('legend') else '', - lines=[list(_read_line(tr)) for tr in fieldset.find_all('tr')]) - for fieldset in form.find_all('fieldset')] - - return title, fieldsets - - -def get_names_labels(fieldsets): - for fieldset in fieldsets: - for line in fieldset['lines']: - for name, label in line: - yield name, label - - -def print_title_and_fieldsets(model): - title, fieldsets = extract_title_and_fieldsets(model) - print('#### %s ####\n' % title) - for fieldset in fieldsets: - print(fieldset['legend']) - for line in fieldset['lines']: - print(' ' + ' | '.join('%s : %s' % (id, label) - for id, label in line)) - - -def extract_verbose_names(model): - title, fieldsets = extract_title_and_fieldsets(model) - names_to_labels = dict(get_names_labels(fieldsets)) - - field_names = [f.name for f in model._meta.fields if f.name != 'id'] - - labels = {} - field_names_to_old = field_renames[model] - for name in field_names: - old_name = field_names_to_old[name] - label = names_to_labels.get(old_name, None) - if label: - labels[name] = label - del names_to_labels[old_name] - for name, label in labels.items(): - field_names.remove(name) - non_matched = field_names, names_to_labels - return title, labels, non_matched - - -@listify -def source_with_verbose_names(model): - source = getsourcelines(model) - title, labels, non_matched = extract_verbose_names(model) - - field_regex = ' *(.+) = (models\.[^\(]*)\((.*verbose_name=_\(.*\)|.*)\)' - new_lines = [] - class_meta_already_exists = False - for line in source[1:]: - for regex, split in [ - (field_regex + ' *# (.+)', lambda groups: groups), - (field_regex, lambda groups: groups + ('',))]: - match = re.match(regex, line) - if match: - name, path, args, legacy_name = split(match.groups()) - if name in labels and 'verbose_name' not in args: - args = [args] if args.strip() else [] - args.append("verbose_name=_('%s')" % labels[name]) - args = ', '.join(args) - new_lines.append( - (' %s = %s(%s)' % (name, path, args), legacy_name)) - break - else: - if 'class Meta:' in line: - class_meta_already_exists = True - new_lines.append((line, '')) - yield source[0].rstrip() - cols = max(map(len, [line for line, _ in new_lines])) - for line, legacy_name in new_lines: - line = line.rstrip().ljust(cols) - if legacy_name: - yield line + ' # ' + legacy_name - else: - yield line - - # class Meta - if class_meta_already_exists: - return - - if title == 'Tabelas Auxiliares': - title = '' - title = title if title else '' - - def add_s(name): - return ' '.join( - p if p.endswith('s') else p + 's' for p in name.split()) - - def remove_s(name): - return ' '.join(p[:-1] if p.endswith('s') else p for p in name.split()) - - if not title: - # default title from model name - title_singular = ' '.join(re.findall('[A-Z][^A-Z]*', model.__name__)) - title_singular = re.sub('cao\\b', 'ção', title_singular) - title_singular = re.sub('ao\\b', 'ão', title_singular) - title_plural = add_s( - title_singular.replace('ção', 'ções').replace('ão', 'ões')) - - elif title.endswith('s'): - title_singular = remove_s( - title.replace('ções', 'ção').replace('ões', 'ão')) - title_plural = title - else: - title_singular = title - title_plural = add_s(title.replace('ção', 'ções').replace('ão', 'ões')) - - yield """ - class Meta: - verbose_name = _('%s') - verbose_name_plural = _('%s')""" % (title_singular, title_plural) - - -def print_app_with_verbose_names(app): - print('##################################################################') - header = '# -*- coding: utf-8 -*-\n' - for line in getsourcelines(app.models_module): - if line in ['# -*- coding: utf-8 -*-', - 'from django.utils.translation import ugettext as _', ]: - continue - elif line == 'from django.db import models': - header += '''from django.db import models -from django.utils.translation import ugettext_lazy as _ -''' - elif 'class' in line: - break - else: - header += line + '\n' - print(header.strip()) - for model in app.models.values(): - print('\n') - for p in source_with_verbose_names(model): - print(p) - - -def list_models_with_no_scrapped_data(app): - for model in app.models.values(): - if not any(extract_verbose_names(model)[:2]): - print(model.__name__) - - -@listify -def colsplit(names): - n = len(names) - d, r = 12 // n, 12 % n - spans = [d + 1] * r + [d] * (n - r) - return zip(names, spans) - - -def model_name_as_snake(model): - return re.sub('([A-Z]+)', r'_\1', model.__name__).lower().strip('_') - - -old_names_adjustments = yaml.load(pkg_resources.resource_string( - __name__, 'old_names_adjustments.yaml')) - - -@listify -def extract_fieldsets_for_current(model): - __, fieldsets = extract_title_and_fieldsets(model) - if not fieldsets: - return - - try: - reverse_field_renames = {v: k for k, v in field_renames[model].items()} - adjustments = old_names_adjustments.get(model.__name__) - if adjustments: - reverse_field_renames.update(adjustments) - - for fieldset in fieldsets: - rows = [ - colsplit( - [reverse_field_renames.get(name, '%s_FIXME' % name) - for name, ___ in line]) - for line in fieldset['lines'] if line - ] - yield [fieldset['legend']] + rows - except Exception as e: - print_title_and_fieldsets(model) - raise Exception(e, model) - - -class Under: - - def __init__(self, arg): - self.arg = arg - - def __repr__(self): - return "_('%s')" % self.arg - - -GAP = 12 -pretty_printer = pprint.PrettyPrinter(width=80 - GAP) - - -def print_crispy_form(model_or_app): - if isinstance(model_or_app, AppConfig): - for model in model_or_app.models.values(): - print_crispy_form(model) - else: - model = model_or_app - - fieldsets = extract_fieldsets_for_current(model) - if fieldsets: - print(""" -class %(name)sForm(forms.ModelForm): - - class Meta: - model = %(name)s - exclude = [] - - def __init__(self, *args, **kwargs): - super(%(name)sForm, self).__init__(*args, **kwargs) - self.helper = FormHelper() - self.helper.layout = SaplFormLayout( -""" % {'name': model.__name__}) - - for legend, rows in heads_and_tails(fieldsets): - lines = pretty_printer.pformat([Under(legend)] + rows) + ',\n\n' - for line in lines.splitlines(): - print(' ' * GAP + line if line.strip() else '') - - print(" )") diff --git a/sapl/legacy/scripts/study.py b/sapl/legacy/scripts/study.py deleted file mode 100644 index 88838d36c..000000000 --- a/sapl/legacy/scripts/study.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.apps import apps - -from sapl.legacy.migracao_dados import legacy_app - -for model in apps.get_app_config('legacy').get_models(): - if 'ind_excluido' in [f.name for f in model._meta.fields]: - print(model, model.objects.values_list( - 'ind_excluido', flat=True).distinct()) - -legacy_models_without_ind_excluido = [ - m for m in legacy_app.models.values() - if not any(f.name == 'ind_excluido' for f in m._meta.fields)] diff --git a/sapl/legacy/scripts/utils.py b/sapl/legacy/scripts/utils.py index 40f1abb3c..0cf623be5 100644 --- a/sapl/legacy/scripts/utils.py +++ b/sapl/legacy/scripts/utils.py @@ -4,16 +4,11 @@ from sapl.base.models import Autor from sapl.legacy.migracao_dados import appconfs -def getsourcelines(model): - return [line.rstrip('\n').decode('utf-8') - for line in inspect.getsourcelines(model)[0]] - - def get_models_com_referencia_a(apontado): - def tem_referencia_a_autor(model): + def tem_referencia_a_apontado(model): return any(getattr(field, 'related_model', None) == apontado for field in model._meta.get_fields()) return [model for app in appconfs for model in app.models.values() - if tem_referencia_a_autor(model)] + if tem_referencia_a_apontado(model)] From fb894ee2995ddc1e4b5116290421bca8704c4a17 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 26 Mar 2018 16:25:48 -0300 Subject: [PATCH 05/36] =?UTF-8?q?Retira=20c=C3=B3digo=20desnecess=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/views.py | 22 ++++++++++------------ sapl/parlamentares/models.py | 7 ++++--- sapl/utils.py | 16 ---------------- 3 files changed, 14 insertions(+), 31 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 99d34e6b3..08a6a50ef 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -11,8 +11,6 @@ from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.db.models import Max -from django.forms.forms import Form -from django.forms.utils import ErrorDict from django.http import HttpResponse, JsonResponse from django.http.response import Http404, HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect @@ -31,9 +29,8 @@ from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT, STATUS_TA_PRIVATE) from sapl.compilacao.views import IntegracaoTaView from sapl.crispy_layout_mixin import SaplFormLayout, form_actions -from sapl.crud.base import (ACTION_CREATE, ACTION_DELETE, ACTION_DETAIL, - ACTION_LIST, ACTION_UPDATE, RP_DETAIL, RP_LIST, - Crud, CrudAux, MasterDetailCrud, +from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, + MasterDetailCrud, PermissionRequiredForAppCrudMixin, make_pagination) from sapl.materia.forms import (AnexadaForm, AutoriaForm, AutoriaMultiCreateForm, @@ -44,8 +41,8 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm, from sapl.norma.models import LegislacaoCitada from sapl.parlamentares.models import Legislatura from sapl.protocoloadm.models import Protocolo -from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, - autor_modal, gerar_hash_arquivo, get_base_url, +from sapl.utils import (YES_NO_CHOICES, autor_label, autor_modal, + gerar_hash_arquivo, get_base_url, get_mime_type_from_file_extension, montar_row_autor, show_results_filter_set) @@ -57,9 +54,10 @@ from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, MateriaLegislativaFilterSet, MateriaLegislativaForm, MateriaSimplificadaForm, PrimeiraTramitacaoEmLoteFilterSet, ReceberProposicaoForm, RelatoriaForm, - TramitacaoEmLoteFilterSet, filtra_tramitacao_destino, + TramitacaoEmLoteFilterSet, UnidadeTramitacaoForm, + filtra_tramitacao_destino, filtra_tramitacao_destino_and_status, - filtra_tramitacao_status, UnidadeTramitacaoForm) + filtra_tramitacao_status) from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria, DespachoInicial, DocumentoAcessorio, MateriaAssunto, MateriaLegislativa, Numeracao, Orgao, Origem, Proposicao, @@ -700,11 +698,11 @@ class ProposicaoCrud(Crud): messages.success(request, _( 'Proposição enviada com sucesso.')) Numero = MateriaLegislativa.objects.filter(tipo=p.tipo.tipo_conteudo_related, - ano = p.ano).last().numero + 1 + ano=p.ano).last().numero + 1 messages.success(request, _( '%s : nº %s de %s
Atenção! Este número é apenas um provável ' 'número que pode não corresponder com a realidade' - %(p.tipo, Numero, p.ano))) + % (p.tipo, Numero, p.ano))) elif action == 'return': if not p.data_envio: @@ -1726,7 +1724,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): qr = self.request.GET.copy() context['unidade_destino'] = UnidadeTramitacao.objects.all() context['status_tramitacao'] = StatusTramitacao.objects.all() - context['turnos_tramitacao'] = TURNO_TRAMITACAO_CHOICES + context['turnos_tramitacao'] = Tramitacao.TURNO_CHOICES context['urgente_tramitacao'] = YES_NO_CHOICES context['unidade_local'] = UnidadeTramitacao.objects.all() diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index 574c6735f..769093046 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -8,8 +8,8 @@ from model_utils import Choices from sapl.base.models import Autor from sapl.decorators import vigencia_atual -from sapl.utils import (INDICADOR_AFASTAMENTO, LISTA_DE_UFS, YES_NO_CHOICES, - SaplGenericRelation, get_settings_auth_user_model, +from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES, SaplGenericRelation, + get_settings_auth_user_model, intervalos_tem_intersecao, restringe_tipos_de_arquivo_img, texto_upload_path) @@ -400,7 +400,8 @@ class TipoAfastamento(models.Model): descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) indicador = models.CharField( max_length=1, verbose_name=_('Indicador'), default='F', - choices=INDICADOR_AFASTAMENTO) + choices=[('A', _('Afastamento')), + ('F', _('Fim de Mandato')), ]) dispositivo = models.CharField( max_length=50, blank=True, verbose_name=_('Dispositivo')) diff --git a/sapl/utils.py b/sapl/utils.py index a62625452..9d576bcea 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -276,22 +276,6 @@ def create_barcode(value, width=170, height=50): YES_NO_CHOICES = [(True, _('Sim')), (False, _('Não'))] -TURNO_TRAMITACAO_CHOICES = [ - ('P', _('Primeiro')), - ('S', _('Segundo')), - ('U', _('Único')), - ('L', _('Suplementar')), - ('F', _('Final')), - ('A', _('Votação única em Regime de Urgência')), - ('B', _('1ª Votação')), - ('C', _('2ª e 3ª Votação')), -] - -INDICADOR_AFASTAMENTO = [ - ('A', _('Afastamento')), - ('F', _('Fim de Mandato')), -] - def listify(function): @wraps(function) From 778f07c40c88d75459c13b568799b06d455ccb5a Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 26 Mar 2018 18:43:16 -0300 Subject: [PATCH 06/36] =?UTF-8?q?Remove=20c=C3=B3digo=20desnecess=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/admin.py | 21 -------- .../migrations/0016_auto_20180326_1840.py | 32 +++++++++++++ sapl/base/models.py | 48 ------------------- .../management/commands/recria_constraints.py | 10 ---- sapl/legacy/migracao_dados.py | 11 +---- sapl/rules/map_rules.py | 3 -- sapl/rules/tests/test_rules.py | 24 ++-------- 7 files changed, 37 insertions(+), 112 deletions(-) create mode 100644 sapl/base/migrations/0016_auto_20180326_1840.py delete mode 100644 sapl/legacy/management/commands/recria_constraints.py diff --git a/sapl/base/admin.py b/sapl/base/admin.py index 2f7cd0ed4..88633b0fb 100644 --- a/sapl/base/admin.py +++ b/sapl/base/admin.py @@ -3,35 +3,14 @@ from django.core.urlresolvers import reverse from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _ from reversion.models import Revision - -from sapl.base.models import ProblemaMigracao from sapl.utils import register_all_models_in_admin register_all_models_in_admin(__name__) -admin.site.unregister(ProblemaMigracao) - admin.site.site_title = 'Administração - SAPL' admin.site.site_header = 'Administração - SAPL' -@admin.register(ProblemaMigracao) -class ProblemaMigracaoAdmin(admin.ModelAdmin): - list_display = ["content_type", "object_id", "nome_campo", "problema", - "descricao", "get_url"] - - def get_url(self, obj): - - info = (obj.content_object._meta.app_label, - obj.content_object._meta.model_name) - endereco = reverse('admin:%s_%s_change' % info, - args=(obj.content_object.pk,)) - return "%s" % (endereco, endereco) - - get_url.short_description = "Endereço" - get_url.allow_tags = True - - class RevisionAdmin(admin.ModelAdmin): list_display = ('user', 'comment', 'date_created') search_fields = ('=user__username', '=user__email') diff --git a/sapl/base/migrations/0016_auto_20180326_1840.py b/sapl/base/migrations/0016_auto_20180326_1840.py new file mode 100644 index 000000000..870b58dc8 --- /dev/null +++ b/sapl/base/migrations/0016_auto_20180326_1840.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-03-26 21:40 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0015_appconfig_receber_recibo_proposicao'), + ] + + operations = [ + migrations.RemoveField( + model_name='argumento', + name='constraint', + ), + migrations.RemoveField( + model_name='problemamigracao', + name='content_type', + ), + migrations.DeleteModel( + name='Argumento', + ), + migrations.DeleteModel( + name='Constraint', + ), + migrations.DeleteModel( + name='ProblemaMigracao', + ), + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index 3a80e4d7b..d2a6035a8 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -5,7 +5,6 @@ from django.db import models from django.db.models.signals import post_migrate from django.db.utils import DEFAULT_DB_ALIAS from django.utils.translation import ugettext_lazy as _ - from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES, get_settings_auth_user_model, models_with_gr_for_model) @@ -59,53 +58,6 @@ class CasaLegislativa(models.Model): 'municipio': self.municipio} -@reversion.register() -class ProblemaMigracao(models.Model): - content_type = models.ForeignKey(ContentType, - verbose_name=_('Tipo de Content')) - object_id = models.PositiveIntegerField(verbose_name=_('ID do Objeto')) - content_object = GenericForeignKey('content_type', 'object_id') - nome_campo = models.CharField(max_length=100, - blank=True, - verbose_name=_('Nome do(s) Campo(s)')) - problema = models.CharField(max_length=300, verbose_name=_('Problema')) - descricao = models.CharField(max_length=300, verbose_name=_('Descrição')) - eh_stub = models.BooleanField(verbose_name=_('É stub?')) - critico = models.BooleanField( - default=False, verbose_name=_('Crítico')) - - class Meta: - verbose_name = _('Problema na Migração') - verbose_name_plural = _('Problemas na Migração') - - -@reversion.register() -class Constraint(models.Model): - nome_tabela = models.CharField( - max_length=50, verbose_name=_('Nome da tabela')) - nome_constraint = models.CharField( - max_length=100, verbose_name=_('Nome da constraint')) - nome_model = models.CharField( - max_length=50, verbose_name=_('Nome da model')) - tipo_constraint = models.CharField( - max_length=50, verbose_name=_('Tipo da constraint')) - - class Meta: - verbose_name = _('Constraint removida') - verbose_name_plural = _('Constraints removidas') - - -@reversion.register() -class Argumento(models.Model): - constraint = models.ForeignKey(Constraint) - argumento = models.CharField( - max_length=50, verbose_name=_('Argumento')) - - class Meta: - verbose_name = _('Argumento da constraint') - verbose_name_plural = _('Argumentos da constraint') - - @reversion.register() class AppConfig(models.Model): diff --git a/sapl/legacy/management/commands/recria_constraints.py b/sapl/legacy/management/commands/recria_constraints.py deleted file mode 100644 index d1d8d606d..000000000 --- a/sapl/legacy/management/commands/recria_constraints.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.core.management.base import BaseCommand - - -class Command(BaseCommand): - - help = (u'Recria constraints do PostgreSQL excluidas durante ' - 'migração de dados') - - def handle(self, *args, **options): - pass diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 2ac75c4ef..6aa051e62 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -21,8 +21,7 @@ from pytz import timezone from unipath import Path from sapl.base.models import AppConfig as AppConf -from sapl.base.models import (Autor, ProblemaMigracao, TipoAutor, - cria_models_tipo_autor) +from sapl.base.models import Autor, TipoAutor, cria_models_tipo_autor from sapl.comissoes.models import Comissao, Composicao, Participacao from sapl.legacy.models import TipoNumeracaoProtocolo from sapl.materia.models import (AcompanhamentoMateria, Proposicao, @@ -564,14 +563,6 @@ def iter_sql_records(sql): yield record -def save_relation(obj, nome_campo='', problema='', descricao='', - eh_stub=False, critico=False): - link = ProblemaMigracao( - content_object=obj, nome_campo=nome_campo, problema=problema, - descricao=descricao, eh_stub=eh_stub, critico=critico) - link.save() - - def fill_vinculo_norma_juridica(): lista = [('A', 'Altera o(a)', 'Alterado(a) pelo(a)'), diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index d9d199276..c7589eecf 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -198,9 +198,6 @@ rules_group_geral = { ]), (base.CasaLegislativa, __listdetailchange__ + [RP_ADD]), - (base.ProblemaMigracao, []), - (base.Argumento, []), - (base.Constraint, []), (base.TipoAutor, __base__), (base.Autor, __base__), diff --git a/sapl/rules/tests/test_rules.py b/sapl/rules/tests/test_rules.py index aa97cb5e5..07302bae5 100644 --- a/sapl/rules/tests/test_rules.py +++ b/sapl/rules/tests/test_rules.py @@ -6,8 +6,7 @@ from django.contrib.contenttypes.models import ContentType from django.utils import six from django.utils.translation import ugettext_lazy as _ -from sapl.base.models import (Argumento, CasaLegislativa, Constraint, - ProblemaMigracao) +from sapl.base.models import CasaLegislativa from sapl.compilacao.models import (PerfilEstruturalTextoArticulado, TipoDispositivo, TipoDispositivoRelationship) @@ -57,41 +56,26 @@ def test_models_in_rules_patterns(model_item): # __falsos_positivos__ __fp__in__test_permission_of_models_in_rules_patterns = { map_rules.RP_ADD: [CasaLegislativa, - ProblemaMigracao, - Argumento, - Constraint, TipoDispositivo, TipoDispositivoRelationship, PerfilEstruturalTextoArticulado], - map_rules.RP_CHANGE: [ProblemaMigracao, - Argumento, - Constraint, - AcompanhamentoMateria, + map_rules.RP_CHANGE: [AcompanhamentoMateria, TipoDispositivo, TipoDispositivoRelationship, PerfilEstruturalTextoArticulado], map_rules.RP_DELETE: [CasaLegislativa, - ProblemaMigracao, - Argumento, - Constraint, TipoDispositivo, TipoDispositivoRelationship, PerfilEstruturalTextoArticulado], - map_rules.RP_LIST: [ProblemaMigracao, - Argumento, - Constraint, - AcompanhamentoMateria, + map_rules.RP_LIST: [AcompanhamentoMateria, TipoDispositivo, TipoDispositivoRelationship, PerfilEstruturalTextoArticulado], - map_rules.RP_DETAIL: [ProblemaMigracao, - Argumento, - Constraint, - AcompanhamentoMateria, + map_rules.RP_DETAIL: [AcompanhamentoMateria, TipoDispositivo, TipoDispositivoRelationship, PerfilEstruturalTextoArticulado] From 1b89d43829023dd994ec35bf4925d87d71d44289 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 27 Mar 2018 14:35:07 -0300 Subject: [PATCH 07/36] Fix #1800 --- .../migrations/0018_auto_20180327_1433.py | 23 +++++++++++++++++++ sapl/sessao/models.py | 10 -------- 2 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 sapl/sessao/migrations/0018_auto_20180327_1433.py diff --git a/sapl/sessao/migrations/0018_auto_20180327_1433.py b/sapl/sessao/migrations/0018_auto_20180327_1433.py new file mode 100644 index 000000000..692debf28 --- /dev/null +++ b/sapl/sessao/migrations/0018_auto_20180327_1433.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11 on 2018-03-27 17:33 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0017_auto_20180316_0731'), + ] + + operations = [ + migrations.RemoveField( + model_name='registrovotacao', + name='data_hora_atualizacao', + ), + migrations.RemoveField( + model_name='registrovotacao', + name='data_hora_criacao', + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 49448eecc..90736d6e0 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -417,16 +417,6 @@ class RegistroVotacao(models.Model): observacao = models.TextField( blank=True, verbose_name=_('Observações')) - data_hora_criacao = models.DateTimeField( - blank=True, null=True, - auto_now_add=True, - verbose_name=_('Data Criação')) - - data_hora_atualizacao = models.DateTimeField( - blank=True, null=True, - auto_now=True, - verbose_name=_('Data')) - class Meta: verbose_name = _('Votação') verbose_name_plural = _('Votações') From 31eb663c851b92683df768a9057b2d6984984ea2 Mon Sep 17 00:00:00 2001 From: Edward Date: Tue, 27 Mar 2018 14:56:13 -0300 Subject: [PATCH 08/36] Atualiza docs SAPL (#1795) --- docs/instalacao31.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/instalacao31.rst b/docs/instalacao31.rst index e53bd6545..0b159b91d 100644 --- a/docs/instalacao31.rst +++ b/docs/instalacao31.rst @@ -74,6 +74,12 @@ Clonar o projeto do github, ou fazer um fork e depois clonar * Para apenas clonar do repositório do Interlegis:: cd /var/interlegis + + git clone -b 3.1.x --single-branch git://github.com/interlegis/sapl + + O comando acima irá clonar a última versão estável do SAPL (3.1.x) + Para clonar todo o repositório utilize o comando abaixo: + git clone git://github.com/interlegis/sapl * Para fazer um fork e depois clonar, siga as instruções em https://help.github.com/articles/fork-a-repo que basicamente são: From e26e205f9341cf2904bfd12ca210f1b12f8649ae Mon Sep 17 00:00:00 2001 From: Talitha Pumar Date: Tue, 27 Mar 2018 16:51:46 -0300 Subject: [PATCH 09/36] Fix #1793 (#1807) --- sapl/comissoes/forms.py | 28 +++++++++++++++++++++++++++- sapl/comissoes/views.py | 12 ++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py index abcce24f7..4ccc52c27 100644 --- a/sapl/comissoes/forms.py +++ b/sapl/comissoes/forms.py @@ -11,6 +11,33 @@ from sapl.comissoes.models import (Comissao, Composicao, DocumentoAcessorio, Participacao, Reuniao) from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar +class ComposicaoForm(forms.ModelForm): + + class Meta: + model = Composicao + exclude = [] + + def clean(self): + cleaned_data = super(ComposicaoForm, self).clean() + + if not self.is_valid(): + return cleaned_data + + periodo = cleaned_data['periodo'] + comissao_pk = cleaned_data['comissao'].id + intersecao_periodo = Composicao.objects.filter( + Q(periodo__data_inicio__lte=periodo.data_fim, + periodo__data_fim__gte=periodo.data_fim) | + Q(periodo__data_inicio__gte=periodo.data_inicio, + periodo__data_fim__lte=periodo.data_inicio), + comissao_id=comissao_pk) + + if intersecao_periodo: + raise ValidationError('O período informado ' + 'choca com períodos já ' + 'cadastrados para esta comissão') + + return cleaned_data class ParticipacaoCreateForm(forms.ModelForm): @@ -219,4 +246,3 @@ class DocumentoAcessorioEditForm(forms.ModelForm): def __init__(self, user=None, **kwargs): super(DocumentoAcessorioEditForm, self).__init__(**kwargs) - diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index b085eb83d..2f1d2dad7 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -13,8 +13,8 @@ from sapl.base.models import AppConfig as AppsAppConfig from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, PermissionRequiredForAppCrudMixin) -from sapl.comissoes.forms import (ComissaoForm, DocumentoAcessorioCreateForm, - DocumentoAcessorioEditForm, ParticipacaoCreateForm, +from sapl.comissoes.forms import (ComissaoForm,ComposicaoForm, DocumentoAcessorioCreateForm, + DocumentoAcessorioEditForm, ParticipacaoCreateForm, ParticipacaoEditForm, ReuniaoForm) from sapl.materia.models import MateriaLegislativa, Tramitacao @@ -81,6 +81,10 @@ class ComposicaoCrud(MasterDetailCrud): model_set = 'participacao_set' public = [RP_LIST, RP_DETAIL, ] + class CreateView(MasterDetailCrud.CreateView): + form_class = ComposicaoForm + + class ListView(MasterDetailCrud.ListView): template_name = "comissoes/composicao_list.html" paginate_by = None @@ -176,7 +180,7 @@ class ReuniaoCrud(MasterDetailCrud): context = super().get_context_data(**kwargs) reuniao_pk = self.take_reuniao_pk() - + if reuniao_pk == 0: ultima_reuniao = list(context['reuniao_list']) if len(ultima_reuniao) > 0: @@ -235,4 +239,4 @@ class DocumentoAcessorioCrud(MasterDetailCrud): obj.delete() return HttpResponseRedirect( reverse('sapl.comissoes:reuniao_detail', - kwargs={'pk': obj.reuniao.pk})) \ No newline at end of file + kwargs={'pk': obj.reuniao.pk})) From 55d2cffabd30b5a1e59cff21cc14c364cd314416 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 27 Mar 2018 18:46:24 -0300 Subject: [PATCH 10/36] Release: 3.1.67 --- docker-compose.yml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 97c5cb011..f04f94361 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.66 + image: interlegis/sapl:3.1.67 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/setup.py b/setup.py index c2c62e140..4be597fc7 100644 --- a/setup.py +++ b/setup.py @@ -49,7 +49,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.66', + version='3.1.67', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From ffef24f5c4b3a7760eb5991c75465f5721b1321a Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Wed, 28 Mar 2018 10:54:52 -0300 Subject: [PATCH 11/36] Fix #1791 (#1805) --- sapl/comissoes/forms.py | 42 +++++++++++++++++++++++++++++------------ sapl/comissoes/views.py | 6 ++++++ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py index 4ccc52c27..c642d978c 100644 --- a/sapl/comissoes/forms.py +++ b/sapl/comissoes/forms.py @@ -161,6 +161,19 @@ class ComissaoForm(forms.ModelForm): model = Comissao fields = '__all__' + def __init__(self, user=None, **kwargs): + super(ComissaoForm, self).__init__(**kwargs) + inst = self.instance + if inst.pk: + if inst.tipo.natureza == 'P': + self.fields['apelido_temp'].widget.attrs['disabled'] = 'disabled' + self.fields['data_instalacao_temp'].widget.attrs['disabled'] = 'disabled' + self.fields['data_final_prevista_temp'].widget.attrs['disabled'] = 'disabled' + self.fields['data_prorrogada_temp'].widget.attrs['disabled'] = 'disabled' + self.fields['data_fim_comissao'].widget.attrs['disabled'] = 'disabled' + + + def clean(self): super(ComissaoForm, self).clean() @@ -176,18 +189,23 @@ class ComissaoForm(forms.ModelForm): @transaction.atomic def save(self, commit=True): - comissao = super(ComissaoForm, self).save(commit) - content_type = ContentType.objects.get_for_model(Comissao) - object_id = comissao.pk - tipo = TipoAutor.objects.get(descricao__icontains='Comiss') - nome = comissao.sigla + ' - ' + comissao.nome - Autor.objects.create( - content_type=content_type, - object_id=object_id, - tipo=tipo, - nome=nome - ) - return comissao + inst = self.instance + if not inst.pk: + comissao = super(ComissaoForm, self).save(commit) + content_type = ContentType.objects.get_for_model(Comissao) + object_id = comissao.pk + tipo = TipoAutor.objects.get(descricao__icontains='Comiss') + nome = comissao.sigla + ' - ' + comissao.nome + Autor.objects.create( + content_type=content_type, + object_id=object_id, + tipo=tipo, + nome=nome + ) + return comissao + else: + comissao = super(ComissaoForm, self).save(commit) + return comissao class ReuniaoForm(ModelForm): diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index 2f1d2dad7..8ae56ffd6 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -131,6 +131,12 @@ class ComissaoCrud(Crud): def form_valid(self, form): return super(Crud.CreateView, self).form_valid(form) + class UpdateView(Crud.UpdateView): + form_class = ComissaoForm + + def form_valid(self, form): + return super(Crud.UpdateView, self).form_valid(form) + class MateriasTramitacaoListView(ListView): template_name = "comissoes/materias_em_tramitacao.html" From 55ce5890fe21240dd30b2a0c073acdac5b50874a Mon Sep 17 00:00:00 2001 From: Edward Date: Wed, 28 Mar 2018 11:11:58 -0300 Subject: [PATCH 12/36] Fix #1809 (#1811) --- sapl/sessao/views.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index c8070ee94..99ca51758 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1444,22 +1444,24 @@ class ExpedienteView(FormMixin, DetailView): list_conteudo = request.POST.getlist('conteudo') for tipo, conteudo in zip(list_tipo, list_conteudo): - try: - ExpedienteSessao.objects.get( - sessao_plenaria_id=self.object.id, - tipo_id=tipo - ).delete() - except: - pass + + ExpedienteSessao.objects.filter( + sessao_plenaria_id=self.object.id, + tipo_id=tipo).delete() expediente = ExpedienteSessao() expediente.sessao_plenaria_id = self.object.id expediente.tipo_id = tipo expediente.conteudo = conteudo expediente.save() + + msg = _('Registro salvo com sucesso') + messages.add_message(self.request, messages.SUCCESS, msg) return self.form_valid(form) else: - return self.form_valid(form) + msg = _('Erro ao salvar registro') + messages.add_message(self.request, messages.SUCCESS, msg) + return self.form_invalid(form) def get(self, request, *args, **kwargs): self.object = self.get_object() From 24ef0f67f37fd1c07631ad0a7a6fee3e5d923684 Mon Sep 17 00:00:00 2001 From: Talitha Pumar Date: Tue, 3 Apr 2018 12:24:56 -0300 Subject: [PATCH 13/36] 1808 protocolo duplicidade (#1815) * Fix 1808 * Fix 1808 --- sapl/protocoloadm/forms.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 37d888ec2..fb1ec1c4f 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -638,6 +638,14 @@ class DocumentoAdministrativoForm(ModelForm): numero_protocolo = self.data['numero_protocolo'] ano_protocolo = self.data['ano_protocolo'] + numero_documento = self.cleaned_data['numero'] + tipo_documento = self.data['tipo'] + + documento = DocumentoAdministrativo.objects.filter(numero=numero_documento, + tipo=tipo_documento) + + if documento: + raise ValidationError('Documento já existente') # campos opcionais, mas que se informados devem ser válidos if numero_protocolo and ano_protocolo: From c02abb902fdaa978a96f4d890db7becb85eed0ce Mon Sep 17 00:00:00 2001 From: Edward Date: Tue, 3 Apr 2018 16:23:08 -0300 Subject: [PATCH 14/36] =?UTF-8?q?Fixes=20#1819=20-=20Verifica=20se=20data?= =?UTF-8?q?=20de=20designa=C3=A7=C3=A3o=20superior=20a=20data=20de=20desli?= =?UTF-8?q?gamento=20(#1821)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/comissoes/forms.py | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py index c642d978c..66e8280cf 100644 --- a/sapl/comissoes/forms.py +++ b/sapl/comissoes/forms.py @@ -65,8 +65,9 @@ class ParticipacaoCreateForm(forms.ModelForm): parlamentares = Mandato.objects.filter(qs, parlamentar__ativo=True ).prefetch_related('parlamentar').\ - values_list('parlamentar', - flat=True).distinct() + values_list('parlamentar', + flat=True + ).distinct() qs = Parlamentar.objects.filter(id__in=parlamentares).distinct().\ exclude(id__in=id_part) @@ -86,12 +87,21 @@ class ParticipacaoCreateForm(forms.ModelForm): if not self.is_valid(): return cleaned_data + data_designacao = cleaned_data['data_designacao'] + data_desligamento = cleaned_data['data_desligamento'] + + if data_desligamento and \ + data_designacao > data_desligamento: + raise ValidationError(_('Data de designação não pode ser superior ' + 'à data de desligamento')) + composicao = Composicao.objects.get(id=self.initial['parent_pk']) cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)] if cleaned_data['cargo'].nome in cargos_unicos: msg = _('Este cargo é único para esta Comissão.') raise ValidationError(msg) + return cleaned_data def create_participacao(self): @@ -154,6 +164,31 @@ class ParticipacaoEditForm(forms.ModelForm): id=self.initial['parlamentar']).nome_parlamentar self.fields['nome_parlamentar'].widget.attrs['disabled'] = 'disabled' + def clean(self): + cleaned_data = super(ParticipacaoEditForm, self).clean() + + if not self.is_valid(): + return cleaned_data + + data_designacao = cleaned_data['data_designacao'] + data_desligamento = cleaned_data['data_desligamento'] + + if data_desligamento and \ + data_designacao > data_desligamento: + raise ValidationError(_('Data de designação não pode ser superior ' + 'à data de desligamento')) + + composicao_id = self.instance.composicao_id + + composicao = Composicao.objects.get(id=composicao_id) + cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)] + + if cleaned_data['cargo'].nome in cargos_unicos: + msg = _('Este cargo é único para esta Comissão.') + raise ValidationError(msg) + + return cleaned_data + class ComissaoForm(forms.ModelForm): From aa0633651577458f93f403c1f8d8eb54511dd526 Mon Sep 17 00:00:00 2001 From: Edward Date: Tue, 3 Apr 2018 16:37:52 -0300 Subject: [PATCH 15/36] Fix #1820 - checa se data inicio > data_fim para periodo de comissao (#1822) --- sapl/comissoes/forms.py | 18 +++++++++++++++++- sapl/comissoes/views.py | 13 ++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py index 66e8280cf..125b2599c 100644 --- a/sapl/comissoes/forms.py +++ b/sapl/comissoes/forms.py @@ -8,7 +8,7 @@ from django.utils.translation import ugettext_lazy as _ from sapl.base.models import Autor, TipoAutor from sapl.comissoes.models import (Comissao, Composicao, DocumentoAcessorio, - Participacao, Reuniao) + Participacao, Reuniao, Periodo) from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar class ComposicaoForm(forms.ModelForm): @@ -39,6 +39,22 @@ class ComposicaoForm(forms.ModelForm): return cleaned_data +class PeriodoForm(forms.ModelForm): + + class Meta: + model = Periodo + exclude = [] + + def clean(self): + cleaned_data = super(PeriodoForm, self).clean() + data_inicio = cleaned_data['data_inicio'] + data_fim = cleaned_data['data_fim'] + + if data_fim and data_fim < data_inicio: + raise ValidationError('Data início não pode ser superior a data de fim') + return cleaned_data + + class ParticipacaoCreateForm(forms.ModelForm): parent_pk = forms.CharField(required=False) # widget=forms.HiddenInput()) diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index 8ae56ffd6..6c47ac6e1 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -13,9 +13,9 @@ from sapl.base.models import AppConfig as AppsAppConfig from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, PermissionRequiredForAppCrudMixin) -from sapl.comissoes.forms import (ComissaoForm,ComposicaoForm, DocumentoAcessorioCreateForm, +from sapl.comissoes.forms import (ComissaoForm, ComposicaoForm, DocumentoAcessorioCreateForm, DocumentoAcessorioEditForm, ParticipacaoCreateForm, - ParticipacaoEditForm, ReuniaoForm) + ParticipacaoEditForm, ReuniaoForm, PeriodoForm) from sapl.materia.models import MateriaLegislativa, Tramitacao @@ -37,12 +37,19 @@ def pegar_url_reuniao(pk): return url CargoCrud = CrudAux.build(CargoComissao, 'cargo_comissao') -PeriodoComposicaoCrud = CrudAux.build(Periodo, 'periodo_composicao_comissao') TipoComissaoCrud = CrudAux.build( TipoComissao, 'tipo_comissao', list_field_names=[ 'sigla', 'nome', 'natureza', 'dispositivo_regimental']) +class PeriodoComposicaoCrud(CrudAux): + model = Periodo + + class CreateView(CrudAux.CreateView): + form_class = PeriodoForm + + class UpdateView(CrudAux.UpdateView): + form_class = PeriodoForm class ParticipacaoCrud(MasterDetailCrud): model = Participacao From 5a3d3156c71db4f69bc78dc48739a3972cdad946 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 3 Apr 2018 16:43:56 -0300 Subject: [PATCH 16/36] Release: 3.1.68 --- docker-compose.yml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index f04f94361..2b21db31d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.67 + image: interlegis/sapl:3.1.68 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/setup.py b/setup.py index 4be597fc7..10169b637 100644 --- a/setup.py +++ b/setup.py @@ -49,7 +49,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.67', + version='3.1.68', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 80d4a154c735d4c61d5d83a25c708b796d4cd544 Mon Sep 17 00:00:00 2001 From: Edward Date: Tue, 3 Apr 2018 18:34:37 -0300 Subject: [PATCH 17/36] =?UTF-8?q?Fix=20#1823=20-=20checa=20data=20inicio?= =?UTF-8?q?=20e=20data=20fim=20de=20sess=C3=A3o=20plen=C3=A1ria=20(#1824)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/forms.py | 30 ++++++++++++++++++++++++++++++ sapl/comissoes/forms.py | 4 ++++ sapl/parlamentares/views.py | 10 +++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 03d158075..023479bb7 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -18,6 +18,7 @@ from sapl.base.models import Autor, TipoAutor from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, to_row) from sapl.materia.models import MateriaLegislativa +from sapl.parlamentares.models import SessaoLegislativa from sapl.sessao.models import SessaoPlenaria from sapl.settings import MAX_IMAGE_UPLOAD_SIZE from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, @@ -148,6 +149,35 @@ class UsuarioEditForm(ModelForm): if data['password1'] and data['password1'] != data['password2']: raise ValidationError('Senhas informadas são diferentes') +class SessaoLegislativaForm(ModelForm): + + class Meta: + model = SessaoLegislativa + exclude = [] + + def clean(self): + cleaned_data = super(SessaoLegislativaForm, self).clean() + + if not self.is_valid(): + return cleaned_data + + data_inicio = cleaned_data['data_inicio'] + data_fim = cleaned_data['data_fim'] + + if data_inicio > data_fim: + raise ValidationError('Data início não pode ser superior à data fim') + + data_inicio_intervalo = cleaned_data['data_inicio_intervalo'] + data_fim_intervalo = cleaned_data['data_fim_intervalo'] + + if data_inicio_intervalo and data_fim_intervalo and \ + data_inicio_intervalo > data_fim_intervalo: + raise ValidationError('Data início de intervalo não pode ser ' + 'superior à data fim de intervalo') + + + return cleaned_data + class TipoAutorForm(ModelForm): diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py index 125b2599c..0a3718b1d 100644 --- a/sapl/comissoes/forms.py +++ b/sapl/comissoes/forms.py @@ -47,6 +47,10 @@ class PeriodoForm(forms.ModelForm): def clean(self): cleaned_data = super(PeriodoForm, self).clean() + + if not self.is_valid(): + return cleaned_data + data_inicio = cleaned_data['data_inicio'] data_fim = cleaned_data['data_fim'] diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 078483f35..b56215648 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -17,6 +17,7 @@ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import FormView from django.views.generic.edit import UpdateView +from sapl.base.forms import SessaoLegislativaForm from sapl.base.models import Autor from sapl.comissoes.models import Participacao from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux, @@ -35,7 +36,6 @@ from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa') PartidoCrud = CrudAux.build(Partido, 'partidos') -SessaoLegislativaCrud = CrudAux.build(SessaoLegislativa, 'sessao_legislativa') TipoDependenteCrud = CrudAux.build(TipoDependente, 'tipo_dependente') NivelInstrucaoCrud = CrudAux.build(NivelInstrucao, 'nivel_instrucao') TipoAfastamentoCrud = CrudAux.build(TipoAfastamento, 'tipo_afastamento') @@ -44,6 +44,14 @@ TipoMilitarCrud = CrudAux.build(SituacaoMilitar, 'tipo_situa_militar') DependenteCrud = MasterDetailCrud.build( Dependente, 'parlamentar', 'dependente') +class SessaoLegislativaCrud(CrudAux): + model = SessaoLegislativa + + class CreateView(CrudAux.CreateView): + form_class = SessaoLegislativaForm + + class UpdateView(CrudAux.UpdateView): + form_class = SessaoLegislativaForm class VotanteView(MasterDetailCrud): model = Votante From da4f3de0683d9b2d35e2c642c984ec725101d032 Mon Sep 17 00:00:00 2001 From: Talitha Pumar Date: Wed, 4 Apr 2018 12:18:18 -0300 Subject: [PATCH 18/36] Fix #1816 (#1825) --- sapl/materia/forms.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 7f9e8d114..42a0abcc0 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1177,13 +1177,7 @@ class ProposicaoForm(forms.ModelForm): fields = [ to_column((Fieldset( - TipoProposicao._meta.verbose_name, Field('tipo')), 3)), - Fieldset(_('Vincular a Matéria Legislativa Existente'), - to_column(('tipo_materia', 4)), - to_column(('numero_materia', 4)), - to_column(('ano_materia', 4)) - ), - + TipoProposicao._meta.verbose_name, Field('tipo')), 12)), to_column( (Alert('teste', css_class="ementa_materia hidden alert-info", @@ -1199,6 +1193,12 @@ class ProposicaoForm(forms.ModelForm): fields.append(to_column(( 'texto_original', 7 if self.texto_articulado_proposicao else 12))) + fields.append(to_column((Fieldset(_('Outras informações - Vincular a Matéria Legislativa Existente'), + to_column(('tipo_materia', 12)), + to_column(('numero_materia', 6)), + to_column(('ano_materia', 6)) + ), 12)), + ) self.helper = FormHelper() self.helper.layout = SaplFormLayout(*fields) From 4cd57e84fe9098741ad599901ae3887ee995584e Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 4 Apr 2018 12:26:01 -0300 Subject: [PATCH 19/36] HOT-FIX: conserta retorno de form.clean() --- sapl/base/forms.py | 5 ++++- sapl/compilacao/forms.py | 1 + sapl/materia/forms.py | 4 ++-- sapl/protocoloadm/forms.py | 4 +++- sapl/sessao/forms.py | 1 + 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 023479bb7..1a0637a22 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -77,6 +77,8 @@ class UsuarioCreateForm(ModelForm): if data['password1'] != data['password2']: raise ValidationError('Senhas informadas são diferentes') + return data + def __init__(self, *args, **kwargs): super(UsuarioCreateForm, self).__init__(*args, **kwargs) @@ -149,6 +151,8 @@ class UsuarioEditForm(ModelForm): if data['password1'] and data['password1'] != data['password2']: raise ValidationError('Senhas informadas são diferentes') + return data + class SessaoLegislativaForm(ModelForm): class Meta: @@ -175,7 +179,6 @@ class SessaoLegislativaForm(ModelForm): raise ValidationError('Data início de intervalo não pode ser ' 'superior à data fim de intervalo') - return cleaned_data diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py index dadf617b2..6407f8925 100644 --- a/sapl/compilacao/forms.py +++ b/sapl/compilacao/forms.py @@ -1232,6 +1232,7 @@ class DispositivoEdicaoAlteracaoForm(ModelForm): 'de vigência seja inferior a data de fim ' 'de vigência do dispositivo em edição.')) """ + return data def save(self): data = self.cleaned_data diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 42a0abcc0..d582bb8eb 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -406,7 +406,7 @@ class TramitacaoUpdateForm(TramitacaoForm): self.cleaned_data['unidade_tramitacao_local'] = \ self.instance.unidade_tramitacao_local - return super(TramitacaoUpdateForm, self).clean() + return self.cleaned_data class LegislacaoCitadaForm(ModelForm): @@ -1052,7 +1052,7 @@ class TipoProposicaoForm(ModelForm): content_type, unique_value.tipo_conteudo_related))""" - return super().clean() + return self.cleaned_data @transaction.atomic def save(self, commit=False): diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index fb1ec1c4f..9c9485ae4 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -248,6 +248,8 @@ class AnularProcoloAdmForm(ModelForm): _("Protocolo %s/%s não pode ser removido pois existem " "documentos vinculados a ele." % (numero, ano))) + return cleaned_data + class Meta: model = Protocolo fields = ['numero', @@ -587,7 +589,7 @@ class TramitacaoAdmEditForm(TramitacaoAdmForm): self.cleaned_data['unidade_tramitacao_local'] = \ self.instance.unidade_tramitacao_local - return super(TramitacaoAdmEditForm, self).clean() + return self.cleaned_data class DocumentoAdministrativoForm(ModelForm): diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 470d27573..c14838cf0 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -542,3 +542,4 @@ class ResumoOrdenacaoForm(forms.Form): if i > 1: raise ValidationError(_( 'Não é possível ter campos repetidos')) + return self.cleaned_data From 018bf5ac41270f4451ce9bc66038cb36f1ff69b2 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 20 Mar 2018 15:10:17 -0300 Subject: [PATCH 20/36] =?UTF-8?q?Adiciona=20meta=5Ftype=20a=20exporta?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20docs=20do=20SDE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/exporta_zope/exporta_zope.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sapl/legacy/scripts/exporta_zope/exporta_zope.py b/sapl/legacy/scripts/exporta_zope/exporta_zope.py index 31c4c3188..11ff1ecbb 100755 --- a/sapl/legacy/scripts/exporta_zope/exporta_zope.py +++ b/sapl/legacy/scripts/exporta_zope/exporta_zope.py @@ -14,7 +14,6 @@ from functools import partial import magic import yaml - import ZODB.DB import ZODB.FileStorage from ZODB.broken import Broken @@ -191,7 +190,9 @@ def read_sde(element): ] if meta_type != 'Script (Python)': # ignoramos os scrips python de eventos dos templates - yield id, read_sde(obj) + yield {'id': id, + 'meta_type': meta_type, + 'dados': read_sde(obj)} data = dict(read_properties()) children = list(read_children()) From f407a2570ff4376d136a00f3fab67e166aece815 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 20 Mar 2018 18:24:21 -0300 Subject: [PATCH 21/36] Corrige msg de erro --- sapl/sessao/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 90736d6e0..23155b51a 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -436,7 +436,8 @@ class RegistroVotacao(models.Model): if not xor(bool(self.ordem), bool(self.expediente)): raise ValidationError( 'RegistroVotacao deve ter exatamente um dos campos ' - 'ordem ou expediente deve estar preenchido') + 'ordem ou expediente preenchido. Ambos estão preenchidos: ' + '{}, {}'. format(self.ordem, self.expediente)) @reversion.register() From 6e0fecc85e357458084514e9f9fa8e5f45e22f67 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 21 Mar 2018 18:19:49 -0300 Subject: [PATCH 22/36] =?UTF-8?q?Usa=20bulk=5Fcreate=20para=20a=20migra?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20dados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 43 ++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 6aa051e62..db288561f 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -796,6 +796,7 @@ class DataMigrator: # convert old records to new ones with transaction.atomic(): + novos = [] sql_delete_legado = '' for old in old_records: new = model() @@ -812,12 +813,9 @@ class DataMigrator: else: if get_id_do_legado: new.id = get_id_do_legado(old) - # validação do model - new.clean() - # salva novo registro - with reversion.create_revision(): - new.save() - reversion.set_comment('Objeto criado pela migração') + + new.clean() # valida model + novos.append(new) # guarda para salvar # acumula deleção do registro no legado sql_delete_legado += 'delete from {} where {};\n'.format( @@ -827,8 +825,11 @@ class DataMigrator: getattr(old, campo)) for campo in campos_pk)) - if ajuste_depois_salvar: - ajuste_depois_salvar(new, old) + # salva novos registros + model.objects.bulk_create(novos) + + if ajuste_depois_salvar: + ajuste_depois_salvar() # se configuramos ids explicitamente devemos reiniciar a sequence if get_id_do_legado: @@ -1067,20 +1068,26 @@ def adjust_normajuridica_antes_salvar(new, old): new.esfera_federacao = '' -def adjust_normajuridica_depois_salvar(new, old): +def adjust_normajuridica_depois_salvar(): # Ajusta relação M2M + ligacao = NormaJuridica.assuntos.through - if not old.cod_assunto: # it can be null or empty - return + def gen_ligacoes(): + from sapl.legacy.models import NormaJuridica as OldNormaJuridica - # lista de pks separadas por vírgulas (ignorando strings vazias) - lista_pks_assunto = [int(pk) for pk in old.cod_assunto.split(',') if pk] + assuntos_migrados, normas_migradas = [ + set(model.objects.values_list('id', flat=True)) + for model in [AssuntoNorma, NormaJuridica]] - for pk_assunto in lista_pks_assunto: - try: - new.assuntos.add(AssuntoNorma.objects.get(pk=pk_assunto)) - except ObjectDoesNotExist: - pass # ignora assuntos inexistentes + for norma, cod_assunto in OldNormaJuridica.objects.filter( + pk__in=normas_migradas).values_list('pk', 'cod_assunto'): + + assuntos = [a for a in map(int, cod_assunto.split(',')) + if a in assuntos_migrados] + for assunto in assuntos: + yield ligacao(normajuridica_id=norma, assuntonorma_id=assunto) + + ligacao.objects.bulk_create(gen_ligacoes()) def vincula_autor(new, old, model_relacionado, campo_relacionado, campo_nome): From 3893564c71e21c30a742a5fa56c60483d87cc536 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 22 Mar 2018 10:38:13 -0300 Subject: [PATCH 23/36] Refatora adjuste de norma --- sapl/legacy/migracao_dados.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index db288561f..9b7aecf86 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -23,6 +23,7 @@ from unipath import Path from sapl.base.models import AppConfig as AppConf from sapl.base.models import Autor, TipoAutor, cria_models_tipo_autor from sapl.comissoes.models import Comissao, Composicao, Participacao +from sapl.legacy.models import NormaJuridica as OldNormaJuridica from sapl.legacy.models import TipoNumeracaoProtocolo from sapl.materia.models import (AcompanhamentoMateria, Proposicao, StatusTramitacao, TipoDocumento, @@ -1072,22 +1073,23 @@ def adjust_normajuridica_depois_salvar(): # Ajusta relação M2M ligacao = NormaJuridica.assuntos.through - def gen_ligacoes(): - from sapl.legacy.models import NormaJuridica as OldNormaJuridica + assuntos_migrados, normas_migradas = [ + set(model.objects.values_list('id', flat=True)) + for model in [AssuntoNorma, NormaJuridica]] - assuntos_migrados, normas_migradas = [ - set(model.objects.values_list('id', flat=True)) - for model in [AssuntoNorma, NormaJuridica]] + def filtra_assuntos_migrados(cod_assunto): + return [a for a in map(int, cod_assunto.split(',')) + if a in assuntos_migrados] + norma_para_assuntos = [ + (norma, filtra_assuntos_migrados(cod_assunto)) for norma, cod_assunto in OldNormaJuridica.objects.filter( - pk__in=normas_migradas).values_list('pk', 'cod_assunto'): + pk__in=normas_migradas).values_list('pk', 'cod_assunto')] - assuntos = [a for a in map(int, cod_assunto.split(',')) - if a in assuntos_migrados] - for assunto in assuntos: - yield ligacao(normajuridica_id=norma, assuntonorma_id=assunto) - - ligacao.objects.bulk_create(gen_ligacoes()) + ligacao.objects.bulk_create( + ligacao(normajuridica_id=norma, assuntonorma_id=assunto) + for norma, assuntos in norma_para_assuntos + for assunto in assuntos) def vincula_autor(new, old, model_relacionado, campo_relacionado, campo_nome): From e7e30d3cde0ae1b07f592acb94ef8d54ccbcdef4 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 22 Mar 2018 15:14:07 -0300 Subject: [PATCH 24/36] =?UTF-8?q?Registra=20traceback=20no=20log=20de=20mi?= =?UTF-8?q?gra=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 3 +++ sapl/legacy/scripts/migra_um_db.sh | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 9b7aecf86..ef96cb20a 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -1,4 +1,5 @@ import re +import traceback from collections import defaultdict from datetime import date from functools import lru_cache, partial @@ -724,6 +725,8 @@ class DataMigrator: dir_ocorrencias = DIR_RESULTADOS.child(date.today().isoformat()) dir_ocorrencias.mkdir(parents=True) self._do_migrate(obj) + except Exception as e: + ocorrencias['traceback'] = str(traceback.format_exc()) finally: # grava ocorrências arq_ocorrencias = dir_ocorrencias.child( diff --git a/sapl/legacy/scripts/migra_um_db.sh b/sapl/legacy/scripts/migra_um_db.sh index 577a2c000..ed4db9662 100755 --- a/sapl/legacy/scripts/migra_um_db.sh +++ b/sapl/legacy/scripts/migra_um_db.sh @@ -39,7 +39,7 @@ if [ $# -ge 2 ]; then echo "--- MIGRACAO ---" | tee -a $LOG echo >> $LOG - DATABASE_NAME=$1 ./manage.py migracao_25_31 --force --settings sapl.legacy_migration_settings 2>&1 | tee -a $LOG + DATABASE_NAME=$1 ./manage.py migracao_25_31 --force --dados --settings sapl.legacy_migration_settings 2>&1 | tee -a $LOG echo >> $LOG else echo "USO:" From 356e219dc79bf00d82ea6f88ecaddf6ddbbd4a3e Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 23 Mar 2018 10:46:41 -0300 Subject: [PATCH 25/36] =?UTF-8?q?Melhora=20estrutura=20do=20log=20de=20mig?= =?UTF-8?q?ra=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 66 +++++++++++++++++------------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index ef96cb20a..5b175aca4 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -1,6 +1,6 @@ import re import traceback -from collections import defaultdict +from collections import OrderedDict, defaultdict from datetime import date from functools import lru_cache, partial from itertools import groupby @@ -136,10 +136,10 @@ class ForeignKeyFaltando(ObjectDoesNotExist): @property def dados(self): - return {'field': self.field.name, - 'value': self.value, - 'model': self.field.model.__name__, - 'label': self.label} + return OrderedDict((('field', self.field.name), + ('value', self.value), + ('model', self.field.model.__name__), + ('label', self.label))) @lru_cache() @@ -148,7 +148,7 @@ def _get_all_ids_from_model(model): return set(model.objects.values_list('id', flat=True)) -def get_fk_related(field, value, label='---'): +def get_fk_related(field, value, label={}): if value is None and field.null: return None @@ -554,9 +554,14 @@ relatoria | tip_fim_relatoria = NULL | tip_fim_relatoria = 0 anula_tipos_origem_externa_invalidos() -def iter_sql_records(sql): - class Record: - pass +class Record: + pass + + +def iter_sql_records(tabela): + sql = 'select * from ' + tabela + if existe_coluna_no_legado(tabela, 'ind_excluido'): + sql += ' where ind_excluido != 1' cursor = exec_legado(sql) fieldnames = [name[0] for name in cursor.description] for row in cursor.fetchall(): @@ -637,6 +642,11 @@ PATH_TABELA_TIMEZONES = DIR_DADOS_MIGRACAO.child('tabela_timezones.yaml') DIR_RESULTADOS = DIR_DADOS_MIGRACAO.child('resultados') +def dict_representer(dumper, data): + return dumper.represent_dict(data.items()) +yaml.add_representer(OrderedDict, dict_representer) + + class DataMigrator: def __init__(self): @@ -655,7 +665,7 @@ class DataMigrator: else: self.timezone = get_timezone(municipio, uf) - def populate_renamed_fields(self, new, old): + def populate_renamed_fields(self, new, old, campos_pk_legado): renames = self.field_renames[type(new)] for field in new._meta.fields: @@ -665,16 +675,12 @@ class DataMigrator: old_value = getattr(old, old_field_name) if field_type == 'ForeignKey': - # not necessarily a model - if hasattr(old, '_meta') and old._meta.pk.name != 'id': - label = 'pk = {}'.format(old.pk) - else: - label = '-- SEM PK --' + label = {c: getattr(old, c) for c in campos_pk_legado} fk_field_name = '{}_id'.format(field.name) value = get_fk_related(field, old_value, label) setattr(new, fk_field_name, value) else: - value = getattr(old, old_field_name) + value = old_value if (field_type in ['CharField', 'TextField'] and value in [None, 'None']): @@ -732,7 +738,8 @@ class DataMigrator: arq_ocorrencias = dir_ocorrencias.child( self.nome_banco_legado + '.yaml') with open(arq_ocorrencias, 'w') as arq: - yaml.safe_dump(dict(ocorrencias), arq, allow_unicode=True) + dump = yaml.dump(dict(ocorrencias), allow_unicode=True) + arq.write(dump.replace('\n- ', '\n\n- ')) info('Ocorrências salvas em\n {}'.format(arq_ocorrencias)) # recria tipos de autor padrão que não foram criados pela migração @@ -771,9 +778,9 @@ class DataMigrator: nome_model = self.model_renames.get(model, model.__name__) model_legado = legacy_app.get_model(nome_model) tabela_legado = model_legado._meta.db_table - campos_pk = get_pk_legado(tabela_legado) + campos_pk_legado = get_pk_legado(tabela_legado) - if len(campos_pk) == 1: + if len(campos_pk_legado) == 1: # a pk no legado tem um único campo nome_pk = model_legado._meta.pk.name if 'ind_excluido' in {f.name for f in model_legado._meta.fields}: @@ -788,11 +795,7 @@ class DataMigrator: return getattr(old, nome_pk) else: # a pk no legado tem mais de um campo - sql = 'select * from ' + tabela_legado - if existe_coluna_no_legado(tabela_legado, 'ind_excluido'): - sql += ' where ind_excluido != 1' - old_records = iter_sql_records(sql) - + old_records = iter_sql_records(tabela_legado) get_id_do_legado = None ajuste_antes_salvar = AJUSTE_ANTES_SALVAR.get(model) @@ -805,7 +808,7 @@ class DataMigrator: for old in old_records: new = model() try: - self.populate_renamed_fields(new, old) + self.populate_renamed_fields(new, old, campos_pk_legado) if ajuste_antes_salvar: ajuste_antes_salvar(new, old) except ForeignKeyFaltando as e: @@ -827,7 +830,7 @@ class DataMigrator: ' and '.join( '{} = "{}"'.format(campo, getattr(old, campo)) - for campo in campos_pk)) + for campo in campos_pk_legado)) # salva novos registros model.objects.bulk_create(novos) @@ -963,9 +966,7 @@ def adjust_participacao(new, old): composicao.comissao_id, composicao.periodo_id = [ get_fk_related(Composicao._meta.get_field(name), value, - 'composicao_comissao.cod_comp_comissao = {}'.format( - old.pk - )) + {'composicao_comissao.cod_comp_comissao': old.pk}) for name, value in (('comissao', old.cod_comissao), ('periodo', old.cod_periodo_comp))] # check if there is already an "equal" one in the db @@ -1033,7 +1034,7 @@ def adjust_tipoproposicao(new, old): raise ForeignKeyFaltando( field=TipoProposicao.tipo_conteudo_related, value=(model_tipo.__name__, value), - label='ind_mat_ou_doc = {}'.format(old.ind_mat_ou_doc)) + label={'ind_mat_ou_doc': old.ind_mat_ou_doc}) def adjust_statustramitacao(new, old): @@ -1105,9 +1106,8 @@ def vincula_autor(new, old, model_relacionado, campo_relacionado, campo_nome): nome_model_relacionado = model_relacionado._meta.model.__name__ raise ForeignKeyFaltando( field=Autor.autor_related, - value=(nome_model_relacionado, pk_rel), - label='{} [pk={}] inexistente para autor'.format( - nome_model_relacionado, pk_rel)) + value=[nome_model_relacionado, pk_rel], + label={'cod_autor': old.pk}) else: new.nome = getattr(new.autor_related, campo_nome) return True From 8529390be413641163ac78b69945d0a1b73ac74c Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 29 Mar 2018 14:00:32 -0300 Subject: [PATCH 26/36] =?UTF-8?q?Revisa=20e=20adiciona=20campos=20faltante?= =?UTF-8?q?s=20=C3=A0=20migra=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/legacy.yaml | 1 - sapl/comissoes/legacy.yaml | 1 - sapl/legacy/migracao_dados.py | 149 +++++++++++++++++++-------------- sapl/legacy/test_renames.py | 98 ++++++++++++++++------ sapl/materia/legacy.yaml | 9 +- sapl/materia/models.py | 6 -- sapl/norma/legacy.yaml | 1 - sapl/parlamentares/legacy.yaml | 4 - sapl/protocoloadm/legacy.yaml | 1 - sapl/sessao/legacy.yaml | 1 - 10 files changed, 162 insertions(+), 109 deletions(-) diff --git a/sapl/base/legacy.yaml b/sapl/base/legacy.yaml index a54c4ae06..2d866226e 100644 --- a/sapl/base/legacy.yaml +++ b/sapl/base/legacy.yaml @@ -5,4 +5,3 @@ Autor: nome: nom_autor cargo: des_cargo tipo: tip_autor - username: col_username diff --git a/sapl/comissoes/legacy.yaml b/sapl/comissoes/legacy.yaml index a1093c4d2..66ed8b060 100644 --- a/sapl/comissoes/legacy.yaml +++ b/sapl/comissoes/legacy.yaml @@ -25,7 +25,6 @@ Comissao: telefone_secretaria: num_tel_secretaria tipo: tip_comissao unidade_deliberativa: ind_unid_deliberativa - ativa: Periodo (PeriodoCompComissao): data_fim: dat_fim_periodo diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 5b175aca4..6f740555b 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -4,6 +4,7 @@ from collections import OrderedDict, defaultdict from datetime import date from functools import lru_cache, partial from itertools import groupby +from operator import xor from subprocess import PIPE, call import pkg_resources @@ -70,8 +71,6 @@ for a1, s1 in name_sets: else: assert not s1.intersection(s2) -legacy_app = apps.get_app_config('legacy') - # RENAMES ################################################################### @@ -110,6 +109,21 @@ def get_renames(): return field_renames, model_renames + +field_renames, model_renames = get_renames() +legacy_app = apps.get_app_config('legacy') +models_novos_para_antigos = { + model: legacy_app.get_model(model_renames.get(model, model.__name__)) + for model in field_renames} +models_novos_para_antigos[Composicao] = models_novos_para_antigos[Participacao] + + +campos_novos_para_antigos = { + model._meta.get_field(nome_novo): nome_antigo + for model, renames in field_renames.items() + for nome_novo, nome_antigo in renames.items()} + + # MIGRATION ################################################################# @@ -124,22 +138,40 @@ def warn(tipo, msg, dados): print('CUIDADO! ' + msg.format(**dados)) +@lru_cache() +def get_pk_legado(tabela): + res = exec_legado( + 'show index from {} WHERE Key_name = "PRIMARY"'.format(tabela)) + return [r[4] for r in res] + + +@lru_cache() +def get_estrutura_legado(model): + model_legado = models_novos_para_antigos[model] + tabela_legado = model_legado._meta.db_table + campos_pk_legado = get_pk_legado(tabela_legado) + return model_legado, tabela_legado, campos_pk_legado + + class ForeignKeyFaltando(ObjectDoesNotExist): 'Uma FK aponta para um registro inexistente' - def __init__(self, field, value, label): + def __init__(self, field, valor, old): self.field = field - self.value = value - self.label = label + self.valor = valor + self.old = old - msg = 'FK [{field}] não encontrada para o valor {value} (em {model} / {label})' # noqa + msg = 'FK não encontrada para [{campo} = {valor}] (em {tabela} / pk = {pk})' # noqa @property def dados(self): - return OrderedDict((('field', self.field.name), - ('value', self.value), - ('model', self.field.model.__name__), - ('label', self.label))) + campo = campos_novos_para_antigos[self.field] + _, tabela, campos_pk = get_estrutura_legado(self.field.model) + pk = {c: getattr(self.old, c) for c in campos_pk} + return OrderedDict((('campo', campo), + ('valor', self.valor), + ('tabela', tabela), + ('pk', pk))) @lru_cache() @@ -148,18 +180,17 @@ def _get_all_ids_from_model(model): return set(model.objects.values_list('id', flat=True)) -def get_fk_related(field, value, label={}): - if value is None and field.null: +def get_fk_related(field, old, old_field_name): + valor = getattr(old, old_field_name) + if valor is None and field.null: return None - - # if field.related_model.objects.filter(id=value).exists(): - if value in _get_all_ids_from_model(field.related_model): - return value - elif value == 0 and field.null: + if valor in _get_all_ids_from_model(field.related_model): + return valor + elif valor == 0 and field.null: # consideramos zeros como nulos, se não está entre os ids anteriores return None else: - raise ForeignKeyFaltando(field=field, value=value, label=label) + raise ForeignKeyFaltando(field=field, valor=valor, old=old) def exec_sql(sql, db='default'): @@ -559,9 +590,16 @@ class Record: def iter_sql_records(tabela): - sql = 'select * from ' + tabela - if existe_coluna_no_legado(tabela, 'ind_excluido'): - sql += ' where ind_excluido != 1' + if tabela == 'despacho_inicial': + sql = ''' select cod_materia, cod_comissao from despacho_inicial + where ind_excluido <> 1 + group by cod_materia, cod_comissao + order by cod_materia, min(num_ordem) + ''' + else: + sql = 'select * from ' + tabela + if existe_coluna_no_legado(tabela, 'ind_excluido'): + sql += ' where ind_excluido <> 1' cursor = exec_legado(sql) fieldnames = [name[0] for name in cursor.description] for row in cursor.fetchall(): @@ -631,12 +669,6 @@ def reinicia_sequence(model, id): sequence_name, id)) -def get_pk_legado(tabela): - res = exec_legado( - 'show index from {} WHERE Key_name = "PRIMARY"'.format(tabela)) - return [r[4] for r in res] - - DIR_DADOS_MIGRACAO = Path('~/migracao_sapl/').expand() PATH_TABELA_TIMEZONES = DIR_DADOS_MIGRACAO.child('tabela_timezones.yaml') DIR_RESULTADOS = DIR_DADOS_MIGRACAO.child('resultados') @@ -650,7 +682,6 @@ yaml.add_representer(OrderedDict, dict_representer) class DataMigrator: def __init__(self): - self.field_renames, self.model_renames = get_renames() self.choice_valida = {} # configura timezone de migração @@ -665,22 +696,20 @@ class DataMigrator: else: self.timezone = get_timezone(municipio, uf) - def populate_renamed_fields(self, new, old, campos_pk_legado): - renames = self.field_renames[type(new)] + def populate_renamed_fields(self, new, old): + renames = field_renames[type(new)] for field in new._meta.fields: old_field_name = renames.get(field.name) - field_type = field.get_internal_type() if old_field_name: - old_value = getattr(old, old_field_name) + field_type = field.get_internal_type() if field_type == 'ForeignKey': - label = {c: getattr(old, c) for c in campos_pk_legado} fk_field_name = '{}_id'.format(field.name) - value = get_fk_related(field, old_value, label) + value = get_fk_related(field, old, old_field_name) setattr(new, fk_field_name, value) else: - value = old_value + value = getattr(old, old_field_name) if (field_type in ['CharField', 'TextField'] and value in [None, 'None']): @@ -733,6 +762,7 @@ class DataMigrator: self._do_migrate(obj) except Exception as e: ocorrencias['traceback'] = str(traceback.format_exc()) + raise e finally: # grava ocorrências arq_ocorrencias = dir_ocorrencias.child( @@ -748,7 +778,7 @@ class DataMigrator: def _do_migrate(self, obj): if isinstance(obj, AppConfig): models = [model for model in obj.models.values() - if model in self.field_renames] + if model in field_renames] if obj.label == 'materia': # Devido à referência TipoProposicao.tipo_conteudo_related @@ -775,10 +805,8 @@ class DataMigrator: def migrate_model(self, model): print('Migrando %s...' % model.__name__) - nome_model = self.model_renames.get(model, model.__name__) - model_legado = legacy_app.get_model(nome_model) - tabela_legado = model_legado._meta.db_table - campos_pk_legado = get_pk_legado(tabela_legado) + model_legado, tabela_legado, campos_pk_legado = \ + get_estrutura_legado(model) if len(campos_pk_legado) == 1: # a pk no legado tem um único campo @@ -808,7 +836,7 @@ class DataMigrator: for old in old_records: new = model() try: - self.populate_renamed_fields(new, old, campos_pk_legado) + self.populate_renamed_fields(new, old) if ajuste_antes_salvar: ajuste_antes_salvar(new, old) except ForeignKeyFaltando as e: @@ -833,7 +861,9 @@ class DataMigrator: for campo in campos_pk_legado)) # salva novos registros - model.objects.bulk_create(novos) + with reversion.create_revision(): + model.objects.bulk_create(novos) + reversion.set_comment('Objetos criados pela migração') if ajuste_depois_salvar: ajuste_depois_salvar() @@ -962,23 +992,14 @@ def adjust_parlamentar(new, old): def adjust_participacao(new, old): - composicao = Composicao() - composicao.comissao_id, composicao.periodo_id = [ - get_fk_related(Composicao._meta.get_field(name), - value, - {'composicao_comissao.cod_comp_comissao': old.pk}) - for name, value in (('comissao', old.cod_comissao), - ('periodo', old.cod_periodo_comp))] - # check if there is already an "equal" one in the db - already_created = Composicao.objects.filter( - comissao=composicao.comissao, periodo=composicao.periodo) - if already_created: - assert len(already_created) == 1 # we must never have made 2 copies - [composicao] = already_created - else: - with reversion.create_revision(): - composicao.save() - reversion.set_comment('Objeto criado pela migração') + comissao_id, periodo_id = [ + get_fk_related(Composicao._meta.get_field(name), old, old_field_name) + for name, old_field_name in (('comissao', 'cod_comissao'), + ('periodo', 'cod_periodo_comp'))] + with reversion.create_revision(): + composicao, _ = Composicao.objects.get_or_create( + comissao_id=comissao_id, periodo_id=periodo_id) + reversion.set_comment('Objeto criado pela migração') new.composicao = composicao @@ -988,9 +1009,8 @@ def adjust_proposicao_antes_salvar(new, old): def adjust_normarelacionada(new, old): - tipo = TipoVinculoNormaJuridica.objects.filter(sigla=old.tip_vinculo) - assert len(tipo) == 1 - new.tipo_vinculo = tipo[0] + new.tipo_vinculo = TipoVinculoNormaJuridica.objects.get( + sigla=old.tip_vinculo) def adjust_protocolo_antes_salvar(new, old): @@ -1015,8 +1035,11 @@ def adjust_registrovotacao_antes_salvar(new, old): def adjust_tipoafastamento(new, old): - if old.ind_afastamento == 1: + assert xor(old.ind_afastamento, old.ind_fim_mandato) + if old.ind_afastamento: new.indicador = 'A' + elif old.ind_fim_mandato: + new.indicador = 'F' MODEL_TIPO_MATERIA_OU_DOCUMENTO = {'M': TipoMateriaLegislativa, diff --git a/sapl/legacy/test_renames.py b/sapl/legacy/test_renames.py index 7a8766da0..573129725 100644 --- a/sapl/legacy/test_renames.py +++ b/sapl/legacy/test_renames.py @@ -1,29 +1,76 @@ -import sapl.comissoes -import sapl.materia -import sapl.norma -import sapl.sessao + +from django.contrib.contenttypes.fields import GenericForeignKey + +from sapl.base.models import AppConfig, Autor, CasaLegislativa, TipoAutor +from sapl.comissoes.models import \ + DocumentoAcessorio as DocumentoAcessorioComissoes +from sapl.comissoes.models import Comissao, Composicao, Participacao, Reuniao +from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, + MateriaLegislativa, Proposicao, + TipoMateriaLegislativa, TipoProposicao, + Tramitacao) +from sapl.norma.models import (NormaJuridica, NormaRelacionada, + TipoVinculoNormaJuridica) +from sapl.parlamentares.models import (Frente, Mandato, Parlamentar, Partido, + TipoAfastamento, Votante) +from sapl.protocoloadm.models import DocumentoAdministrativo +from sapl.sessao.models import (Bancada, Bloco, CargoBancada, + ExpedienteMateria, Orador, OradorExpediente, + OrdemDia, RegistroVotacao, ResumoOrdenacao, + SessaoPlenaria, TipoResultadoVotacao, + VotoParlamentar) from .migracao_dados import appconfs, get_renames, legacy_app RENAMING_IGNORED_MODELS = [ - sapl.comissoes.models.Composicao, - sapl.norma.models.AssuntoNormaRelationship, + Votante, Frente, Bancada, CargoBancada, Bloco, # parlamentares + Composicao, Reuniao, DocumentoAcessorioComissoes, # commissoes + AppConfig, CasaLegislativa, # base + ResumoOrdenacao, # sessao + TipoVinculoNormaJuridica, # norma - # FIXME retirar daqui depois que a issue #218 for resolvida!!!!!!! - sapl.sessao.models.AcompanharMateria, ] RENAMING_IGNORED_FIELDS = [ - (sapl.comissoes.models.Participacao, {'composicao'}), - (sapl.materia.models.Proposicao, {'documento'}), - (sapl.materia.models.TipoProposicao, {'tipo_documento'}), - (sapl.materia.models.Tramitacao, {'ultima'}), - (sapl.sessao.models.SessaoPlenaria, {'finalizada', - 'upload_pauta', - 'upload_ata', - 'iniciada'}), - (sapl.sessao.models.ExpedienteMateria, {'votacao_aberta'}), - (sapl.sessao.models.OrdemDia, {'votacao_aberta'}), + (TipoAfastamento, {'indicador'}), + (Participacao, {'composicao'}), + (Proposicao, { + 'ano', 'content_type', 'object_id', 'conteudo_gerado_related', + 'status', 'hash_code', 'texto_original'}), + (TipoProposicao, { + 'object_id', 'content_type', 'tipo_conteudo_related', 'perfis', + # não estou entendendo como esses campos são enumerados, + # mas eles não fazem parte da migração + # 'tipomaterialegislativa_set', 'tipodocumento_set', + }), + + (Tramitacao, {'ultima'}), + (SessaoPlenaria, {'finalizada', 'iniciada', 'painel_aberto', 'interativa', + 'upload_ata', + 'upload_anexo', + 'upload_pauta'}), + (ExpedienteMateria, {'votacao_aberta'}), + (OrdemDia, {'votacao_aberta'}), + (NormaJuridica, {'texto_integral', 'data_ultima_atualizacao', 'assuntos'}), + (Parlamentar, { + 'uf_residencia', 'municipio_residencia', 'cropping', 'fotografia'}), + (Partido, {'logo_partido'}), + (MateriaLegislativa, { + 'autores', 'anexadas', 'data_ultima_atualizacao', 'texto_original'}), + (DocumentoAdministrativo, {'protocolo', 'texto_integral'}), + (Mandato, {'titular', 'data_fim_mandato', 'data_inicio_mandato'}), + (TipoMateriaLegislativa, {'sequencia_numeracao'}), + (TipoAutor, {'content_type'}), + (TipoResultadoVotacao, {'natureza'}), + (RegistroVotacao, {'ordem', 'expediente'}), + (DocumentoAcessorio, {'arquivo', 'data_ultima_atualizacao'}), + (OradorExpediente, {'upload_anexo', 'observacao'}), + (Orador, {'upload_anexo', 'observacao'}), + (VotoParlamentar, {'user', 'ip', 'expediente', 'data_hora', 'ordem'}), + (NormaRelacionada, {'tipo_vinculo'}), + (AcompanhamentoMateria, {'confirmado', 'data_cadastro', 'usuario'}), + (Autor, {'user', 'content_type', 'object_id', 'autor_related'}), + (Comissao, {'ativa'}), ] @@ -31,7 +78,9 @@ def test_get_renames(): field_renames, model_renames = get_renames() all_models = {m for ac in appconfs for m in ac.get_models()} for model in all_models: - field_names = {f.name for f in model._meta.fields if f.name != 'id'} + field_names = {f.name for f in model._meta.get_fields() + if f.name != 'id' + and (f.concrete or isinstance(f, GenericForeignKey))} if model not in field_renames: # check ignored models in renaming assert model in RENAMING_IGNORED_MODELS @@ -46,11 +95,12 @@ def test_get_renames(): match_msg_template % ('new', 'current') # ignored fields are explicitly listed - missing_in_renames = field_names - renamed - if missing_in_renames: - assert (model, missing_in_renames) in \ - RENAMING_IGNORED_FIELDS, \ - 'Field(s) missing in renames but not explicitly listed' + missing = field_names - renamed + if missing: + assert (model, missing) in RENAMING_IGNORED_FIELDS, \ + 'Campos faltando na renomeação,' \ + 'mas não listados explicitamente: ({}, {})'.format( + model.__name__, missing) # all old names correspond to a legacy field legacy_model = legacy_app.get_model( diff --git a/sapl/materia/legacy.yaml b/sapl/materia/legacy.yaml index db2c8490f..9ff81287f 100644 --- a/sapl/materia/legacy.yaml +++ b/sapl/materia/legacy.yaml @@ -58,9 +58,8 @@ AssuntoMateria: dispositivo: des_dispositivo DespachoInicial: - comissao: cod_comissao materia: cod_materia - numero_ordem: num_ordem + comissao: cod_comissao TipoDocumento: descricao: des_tipo_documento @@ -112,10 +111,6 @@ Parecer: TipoProposicao: descricao: des_tipo_proposicao - materia_ou_documento: ind_mat_ou_doc - modelo: nom_modelo - tipo_documento: - tipo_materia: Proposicao: autor: cod_autor @@ -124,7 +119,7 @@ Proposicao: data_recebimento: dat_recebimento descricao: txt_descricao justificativa_devolucao: txt_justif_devolucao - materia: cod_mat_ou_doc + materia_de_vinculo: cod_materia numero_proposicao: num_proposicao tipo: tip_proposicao diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 34fd44d55..23e4a6e3d 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -40,9 +40,6 @@ class TipoProposicao(models.Model): error_messages={ 'unique': _('Já existe um Tipo de Proposição com esta descrição.') }) - - # FIXME - para a rotina de migração - estes campos mudaram - # retire o comentário quando resolver content_type = models.ForeignKey(ContentType, default=None, on_delete=models.PROTECT, verbose_name=_('Definição de Tipo')) @@ -378,9 +375,6 @@ class AssuntoMateria(models.Model): @reversion.register() class DespachoInicial(models.Model): - # TODO M2M? - # TODO Despachos não são necessáriamente comissoes, podem ser outros - # órgãos, ex: procuradorias materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) comissao = models.ForeignKey(Comissao, on_delete=models.CASCADE) diff --git a/sapl/norma/legacy.yaml b/sapl/norma/legacy.yaml index 3294561b8..23bf5bb80 100644 --- a/sapl/norma/legacy.yaml +++ b/sapl/norma/legacy.yaml @@ -9,7 +9,6 @@ TipoNormaJuridica: NormaJuridica: ano: ano_norma - assunto: cod_assunto complemento: ind_complemento data: dat_norma data_publicacao: dat_publicacao diff --git a/sapl/parlamentares/legacy.yaml b/sapl/parlamentares/legacy.yaml index acaca47de..fc72431f5 100644 --- a/sapl/parlamentares/legacy.yaml +++ b/sapl/parlamentares/legacy.yaml @@ -38,7 +38,6 @@ Parlamentar: ativo: ind_ativo biografia: txt_biografia cep_residencia: num_cep_resid - cod_casa: cod_casa cpf: num_cpf data_nascimento: dat_nascimento email: end_email @@ -58,7 +57,6 @@ Parlamentar: telefone: num_tel_parlamentar telefone_residencia: num_tel_resid titulo_eleitor: num_tit_eleitor - unidade_deliberativa: ind_unid_deliberativa TipoDependente: descricao: des_tipo_dependente @@ -80,10 +78,8 @@ Filiacao: partido: cod_partido TipoAfastamento: - afastamento: ind_afastamento descricao: des_afastamento dispositivo: des_dispositivo - fim_mandato: ind_fim_mandato Mandato: coligacao: cod_coligacao diff --git a/sapl/protocoloadm/legacy.yaml b/sapl/protocoloadm/legacy.yaml index 3772d2f6d..7dae79f73 100644 --- a/sapl/protocoloadm/legacy.yaml +++ b/sapl/protocoloadm/legacy.yaml @@ -11,7 +11,6 @@ DocumentoAdministrativo: dias_prazo: num_dias_prazo interessado: txt_interessado numero: num_documento - numero_protocolo: num_protocolo observacao: txt_observacao tipo: tip_documento tramitacao: ind_tramitacao diff --git a/sapl/sessao/legacy.yaml b/sapl/sessao/legacy.yaml index 90188a76c..e7b55095a 100644 --- a/sapl/sessao/legacy.yaml +++ b/sapl/sessao/legacy.yaml @@ -52,7 +52,6 @@ OradorExpediente (OradoresExpediente): {} OrdemDia: {} PresencaOrdemDia (OrdemDiaPresenca): - data_ordem: dat_ordem parlamentar: cod_parlamentar sessao_plenaria: cod_sessao_plen From c5b97c8f4f11d35fa2ed8ef1bf936efad6f4daac Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 29 Mar 2018 20:23:02 -0300 Subject: [PATCH 27/36] Migra conteudo_gerado_related de Proposicao --- sapl/legacy/migracao_dados.py | 436 ++++++++++++++++++---------------- sapl/materia/models.py | 4 - 2 files changed, 225 insertions(+), 215 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 6f740555b..14663f8ed 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -1,6 +1,6 @@ import re import traceback -from collections import OrderedDict, defaultdict +from collections import OrderedDict, defaultdict, namedtuple from datetime import date from functools import lru_cache, partial from itertools import groupby @@ -8,18 +8,16 @@ from operator import xor from subprocess import PIPE, call import pkg_resources +import pytz import reversion import yaml from django.apps import apps -from django.apps.config import AppConfig from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.db import connections, transaction from django.db.models import Max, Q -from django.db.models.base import ModelBase -from pytz import timezone from unipath import Path from sapl.base.models import AppConfig as AppConf @@ -27,8 +25,8 @@ from sapl.base.models import Autor, TipoAutor, cria_models_tipo_autor from sapl.comissoes.models import Comissao, Composicao, Participacao from sapl.legacy.models import NormaJuridica as OldNormaJuridica from sapl.legacy.models import TipoNumeracaoProtocolo -from sapl.materia.models import (AcompanhamentoMateria, Proposicao, - StatusTramitacao, TipoDocumento, +from sapl.materia.models import (AcompanhamentoMateria, MateriaLegislativa, + Proposicao, StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, TipoProposicao, Tramitacao) from sapl.norma.models import (AssuntoNorma, NormaJuridica, NormaRelacionada, @@ -117,12 +115,31 @@ models_novos_para_antigos = { for model in field_renames} models_novos_para_antigos[Composicao] = models_novos_para_antigos[Participacao] +content_types = {model: ContentType.objects.get( + app_label=model._meta.app_label, model=model._meta.model_name) + for model in field_renames} campos_novos_para_antigos = { model._meta.get_field(nome_novo): nome_antigo for model, renames in field_renames.items() for nome_novo, nome_antigo in renames.items()} +# campos de Composicao (de Comissao) +for nome_novo, nome_antigo in (('comissao', 'cod_comissao'), + ('periodo', 'cod_periodo_comp')): + campos_novos_para_antigos[ + Composicao._meta.get_field(nome_novo)] = nome_antigo + + +# campos virtuais de Proposicao para funcionarem com get_fk_related +CampoFalso = namedtuple('CampoFalso', ['model', 'related_model']) +CAMPOS_FALSOS_PROPOSICAO = { + TipoMateriaLegislativa: CampoFalso(Proposicao, MateriaLegislativa), + TipoDocumento: CampoFalso(Proposicao, DocumentoAdministrativo) +} +for campo_falso in CAMPOS_FALSOS_PROPOSICAO.values(): + campos_novos_para_antigos[campo_falso] = 'cod_mat_ou_doc' + # MIGRATION ################################################################# @@ -168,10 +185,14 @@ class ForeignKeyFaltando(ObjectDoesNotExist): campo = campos_novos_para_antigos[self.field] _, tabela, campos_pk = get_estrutura_legado(self.field.model) pk = {c: getattr(self.old, c) for c in campos_pk} + sql = 'select * from {} where {}'.format( + tabela, + ' and '.join(['{} = {}'.format(k, v) for k, v in pk.items()])) return OrderedDict((('campo', campo), ('valor', self.valor), ('tabela', tabela), - ('pk', pk))) + ('pk', pk), + ('sql', sql))) @lru_cache() @@ -180,8 +201,8 @@ def _get_all_ids_from_model(model): return set(model.objects.values_list('id', flat=True)) -def get_fk_related(field, old, old_field_name): - valor = getattr(old, old_field_name) +def get_fk_related(field, old): + valor = getattr(old, campos_novos_para_antigos[field]) if valor is None and field.null: return None if valor in _get_all_ids_from_model(field.related_model): @@ -679,208 +700,197 @@ def dict_representer(dumper, data): yaml.add_representer(OrderedDict, dict_representer) -class DataMigrator: +# configura timezone de migração +nome_banco_legado = DATABASES['legacy']['NAME'] +match = re.match('sapl_cm_(.*)', nome_banco_legado) +sigla_casa = match.group(1) +with open(PATH_TABELA_TIMEZONES, 'r') as arq: + tabela_timezones = yaml.load(arq) +municipio, uf, nome_timezone = tabela_timezones[sigla_casa] +if nome_timezone: + timezone = pytz.timezone(nome_timezone) +else: + timezone = get_timezone(municipio, uf) - def __init__(self): - self.choice_valida = {} - # configura timezone de migração - self.nome_banco_legado = DATABASES['legacy']['NAME'] - match = re.match('sapl_cm_(.*)', self.nome_banco_legado) - sigla_casa = match.group(1) - with open(PATH_TABELA_TIMEZONES, 'r') as arq: - tabela_timezones = yaml.load(arq) - municipio, uf, nome_timezone = tabela_timezones[sigla_casa] - if nome_timezone: - self.timezone = timezone(nome_timezone) - else: - self.timezone = get_timezone(municipio, uf) - - def populate_renamed_fields(self, new, old): - renames = field_renames[type(new)] - - for field in new._meta.fields: - old_field_name = renames.get(field.name) - if old_field_name: - field_type = field.get_internal_type() - - if field_type == 'ForeignKey': - fk_field_name = '{}_id'.format(field.name) - value = get_fk_related(field, old, old_field_name) - setattr(new, fk_field_name, value) - else: - value = getattr(old, old_field_name) - - if (field_type in ['CharField', 'TextField'] - and value in [None, 'None']): - value = '' - - # adiciona timezone faltante aos campos com tempo - # os campos TIMESTAMP do mysql são gravados em UTC - # os DATETIME e TIME não têm timezone - def campo_tempo_sem_timezone(tipo): - return (field_type == tipo - and value and not value.tzinfo) - if campo_tempo_sem_timezone('DateTimeField'): - value = self.timezone.localize(value) - if campo_tempo_sem_timezone('TimeField'): - value = value.replace(tzinfo=self.timezone) - - setattr(new, field.name, value) - - def migrar(self, obj=appconfs, interativo=True): - # warning: model/app migration order is of utmost importance - - uniformiza_banco() - - # excluindo database antigo. - if interativo: - info('Todos os dados do banco serão excluidos. ' - 'Recomendamos que faça backup do banco sapl ' - 'antes de continuar.') - info('Deseja continuar? [s/n]') - resposta = input() - if resposta.lower() in ['s', 'sim', 'y', 'yes']: - pass +def populate_renamed_fields(new, old): + renames = field_renames[type(new)] + + for field in new._meta.fields: + old_field_name = renames.get(field.name) + if old_field_name: + field_type = field.get_internal_type() + + if field_type == 'ForeignKey': + fk_field_name = '{}_id'.format(field.name) + value = get_fk_related(field, old) + setattr(new, fk_field_name, value) else: - info('Migração cancelada.') - return 0 - info('Excluindo entradas antigas do banco destino.') - call([PROJECT_DIR.child('manage.py'), 'flush', - '--database=default', '--no-input'], stdout=PIPE) - - # apaga tipos de autor padrão (criados no flush acima) - TipoAutor.objects.all().delete() - - fill_vinculo_norma_juridica() - fill_dados_basicos() - info('Começando migração: %s...' % obj) - try: - ocorrencias.clear() - dir_ocorrencias = DIR_RESULTADOS.child(date.today().isoformat()) - dir_ocorrencias.mkdir(parents=True) - self._do_migrate(obj) - except Exception as e: - ocorrencias['traceback'] = str(traceback.format_exc()) - raise e - finally: - # grava ocorrências - arq_ocorrencias = dir_ocorrencias.child( - self.nome_banco_legado + '.yaml') - with open(arq_ocorrencias, 'w') as arq: - dump = yaml.dump(dict(ocorrencias), allow_unicode=True) - arq.write(dump.replace('\n- ', '\n\n- ')) - info('Ocorrências salvas em\n {}'.format(arq_ocorrencias)) - - # recria tipos de autor padrão que não foram criados pela migração - cria_models_tipo_autor() - - def _do_migrate(self, obj): - if isinstance(obj, AppConfig): - models = [model for model in obj.models.values() - if model in field_renames] - - if obj.label == 'materia': - # Devido à referência TipoProposicao.tipo_conteudo_related - # a migração de TipoProposicao precisa ser feita - # após TipoMateriaLegislativa e TipoDocumento - # (porém antes de Proposicao) - models.remove(TipoProposicao) - pos_tipo_proposicao = max( - models.index(TipoMateriaLegislativa), - models.index(TipoDocumento)) + 1 - models.insert(pos_tipo_proposicao, TipoProposicao) - assert models.index(TipoProposicao) < models.index(Proposicao) - - self._do_migrate(models) - elif isinstance(obj, ModelBase): - self.migrate_model(obj) - elif hasattr(obj, '__iter__'): - for item in obj: - self._do_migrate(item) + value = getattr(old, old_field_name) + + if (field_type in ['CharField', 'TextField'] + and value in [None, 'None']): + value = '' + + # adiciona timezone faltante aos campos com tempo + # os campos TIMESTAMP do mysql são gravados em UTC + # os DATETIME e TIME não têm timezone + def campo_tempo_sem_timezone(tipo): + return (field_type == tipo + and value and not value.tzinfo) + if campo_tempo_sem_timezone('DateTimeField'): + value = timezone.localize(value) + if campo_tempo_sem_timezone('TimeField'): + value = value.replace(tzinfo=timezone) + + setattr(new, field.name, value) + + +def migrar_dados(interativo=True): + uniformiza_banco() + + # excluindo database antigo. + if interativo: + info('Todos os dados do banco serão excluidos. ' + 'Recomendamos que faça backup do banco sapl ' + 'antes de continuar.') + info('Deseja continuar? [s/n]') + resposta = input() + if resposta.lower() in ['s', 'sim', 'y', 'yes']: + pass + else: + info('Migração cancelada.') + return 0 + info('Excluindo entradas antigas do banco destino.') + call([PROJECT_DIR.child('manage.py'), 'flush', + '--database=default', '--no-input'], stdout=PIPE) + + # apaga tipos de autor padrão (criados no flush acima) + TipoAutor.objects.all().delete() + + fill_vinculo_norma_juridica() + fill_dados_basicos() + info('Começando migração: ...') + try: + ocorrencias.clear() + dir_ocorrencias = DIR_RESULTADOS.child(date.today().isoformat()) + dir_ocorrencias.mkdir(parents=True) + migrar_todos_os_models() + except Exception as e: + ocorrencias['traceback'] = str(traceback.format_exc()) + raise e + finally: + # grava ocorrências + arq_ocorrencias = dir_ocorrencias.child( + nome_banco_legado + '.yaml') + with open(arq_ocorrencias, 'w') as arq: + dump = yaml.dump(dict(ocorrencias), allow_unicode=True) + arq.write(dump.replace('\n- ', '\n\n- ')) + info('Ocorrências salvas em\n {}'.format(arq_ocorrencias)) + + # recria tipos de autor padrão que não foram criados pela migração + cria_models_tipo_autor() + + +def move_para_depois_de(lista, movido, referencias): + indice_inicial = lista.index(movido) + lista.remove(movido) + indice_apos_refs = max(lista.index(r) for r in referencias) + 1 + lista.insert(max(indice_inicial, indice_apos_refs), movido) + return lista + + +def migrar_todos_os_models(): + models = [model for app in appconfs for model in app.models.values() + if model in field_renames] + # Devido à referência TipoProposicao.tipo_conteudo_related + # a migração de TipoProposicao precisa ser feita + # após TipoMateriaLegislativa e TipoDocumento + # (porém antes de Proposicao) + move_para_depois_de(models, TipoProposicao, + [TipoMateriaLegislativa, TipoDocumento]) + assert models.index(TipoProposicao) < models.index(Proposicao) + move_para_depois_de(models, Proposicao, + [MateriaLegislativa, DocumentoAdministrativo]) + + for model in models: + migrar_model(model) + + +def migrar_model(model): + print('Migrando %s...' % model.__name__) + + model_legado, tabela_legado, campos_pk_legado = \ + get_estrutura_legado(model) + + if len(campos_pk_legado) == 1: + # a pk no legado tem um único campo + nome_pk = model_legado._meta.pk.name + if 'ind_excluido' in {f.name for f in model_legado._meta.fields}: + # se o model legado tem o campo ind_excluido + # enumera apenas os não excluídos + old_records = model_legado.objects.filter(~Q(ind_excluido=1)) else: - raise TypeError( - 'Parameter must be a Model, AppConfig or a sequence of them') - - def migrate_model(self, model): - print('Migrando %s...' % model.__name__) - - model_legado, tabela_legado, campos_pk_legado = \ - get_estrutura_legado(model) - - if len(campos_pk_legado) == 1: - # a pk no legado tem um único campo - nome_pk = model_legado._meta.pk.name - if 'ind_excluido' in {f.name for f in model_legado._meta.fields}: - # se o model legado tem o campo ind_excluido - # enumera apenas os não excluídos - old_records = model_legado.objects.filter(~Q(ind_excluido=1)) + old_records = model_legado.objects.all() + old_records = old_records.order_by(nome_pk) + + def get_id_do_legado(old): + return getattr(old, nome_pk) + else: + # a pk no legado tem mais de um campo + old_records = iter_sql_records(tabela_legado) + get_id_do_legado = None + + ajuste_antes_salvar = AJUSTE_ANTES_SALVAR.get(model) + ajuste_depois_salvar = AJUSTE_DEPOIS_SALVAR.get(model) + + # convert old records to new ones + with transaction.atomic(): + novos = [] + sql_delete_legado = '' + for old in old_records: + new = model() + try: + populate_renamed_fields(new, old) + if ajuste_antes_salvar: + ajuste_antes_salvar(new, old) + except ForeignKeyFaltando as e: + # tentamos preencher uma FK e o ojeto relacionado + # não existe + # então este é um objeo órfão: simplesmente ignoramos + warn('fk', e.msg, e.dados) + continue else: - old_records = model_legado.objects.all() - old_records = old_records.order_by(nome_pk) + if get_id_do_legado: + new.id = get_id_do_legado(old) - def get_id_do_legado(old): - return getattr(old, nome_pk) - else: - # a pk no legado tem mais de um campo - old_records = iter_sql_records(tabela_legado) - get_id_do_legado = None - - ajuste_antes_salvar = AJUSTE_ANTES_SALVAR.get(model) - ajuste_depois_salvar = AJUSTE_DEPOIS_SALVAR.get(model) - - # convert old records to new ones - with transaction.atomic(): - novos = [] - sql_delete_legado = '' - for old in old_records: - new = model() - try: - self.populate_renamed_fields(new, old) - if ajuste_antes_salvar: - ajuste_antes_salvar(new, old) - except ForeignKeyFaltando as e: - # tentamos preencher uma FK e o ojeto relacionado - # não existe - # então este é um objeo órfão: simplesmente ignoramos - warn('fk', e.msg, e.dados) - continue - else: - if get_id_do_legado: - new.id = get_id_do_legado(old) - - new.clean() # valida model - novos.append(new) # guarda para salvar - - # acumula deleção do registro no legado - sql_delete_legado += 'delete from {} where {};\n'.format( - tabela_legado, - ' and '.join( - '{} = "{}"'.format(campo, - getattr(old, campo)) - for campo in campos_pk_legado)) - - # salva novos registros - with reversion.create_revision(): - model.objects.bulk_create(novos) - reversion.set_comment('Objetos criados pela migração') + new.clean() # valida model + novos.append(new) # guarda para salvar - if ajuste_depois_salvar: - ajuste_depois_salvar() + # acumula deleção do registro no legado + sql_delete_legado += 'delete from {} where {};\n'.format( + tabela_legado, + ' and '.join( + '{} = "{}"'.format(campo, + getattr(old, campo)) + for campo in campos_pk_legado)) - # se configuramos ids explicitamente devemos reiniciar a sequence - if get_id_do_legado: - last_pk = get_last_pk(model) - reinicia_sequence(model, last_pk + 1) + # salva novos registros + with reversion.create_revision(): + model.objects.bulk_create(novos) + reversion.set_comment('Objetos criados pela migração') - # apaga registros migrados do legado - if sql_delete_legado: - exec_legado(sql_delete_legado) + if ajuste_depois_salvar: + ajuste_depois_salvar() + # se configuramos ids explicitamente devemos reiniciar a sequence + if get_id_do_legado: + last_pk = get_last_pk(model) + reinicia_sequence(model, last_pk + 1) -def migrar_dados(obj=appconfs, interativo=True): - dm = DataMigrator() - dm.migrar(obj, interativo) + # apaga registros migrados do legado + if sql_delete_legado: + exec_legado(sql_delete_legado) # MIGRATION_ADJUSTMENTS ##################################################### @@ -993,9 +1003,8 @@ def adjust_parlamentar(new, old): def adjust_participacao(new, old): comissao_id, periodo_id = [ - get_fk_related(Composicao._meta.get_field(name), old, old_field_name) - for name, old_field_name in (('comissao', 'cod_comissao'), - ('periodo', 'cod_periodo_comp'))] + get_fk_related(Composicao._meta.get_field(name), old) + for name in ('comissao', 'periodo')] with reversion.create_revision(): composicao, _ = Composicao.objects.get_or_create( comissao_id=comissao_id, periodo_id=periodo_id) @@ -1003,11 +1012,6 @@ def adjust_participacao(new, old): new.composicao = composicao -def adjust_proposicao_antes_salvar(new, old): - if new.data_envio: - new.ano = new.data_envio.year - - def adjust_normarelacionada(new, old): new.tipo_vinculo = TipoVinculoNormaJuridica.objects.get( sigla=old.tip_vinculo) @@ -1042,14 +1046,14 @@ def adjust_tipoafastamento(new, old): new.indicador = 'F' -MODEL_TIPO_MATERIA_OU_DOCUMENTO = {'M': TipoMateriaLegislativa, - 'D': TipoDocumento} +TIPO_MATERIA_OU_TIPO_DOCUMENTO = {'M': TipoMateriaLegislativa, + 'D': TipoDocumento} def adjust_tipoproposicao(new, old): "Aponta para o tipo relacionado de matéria ou documento" value = old.tip_mat_ou_doc - model_tipo = MODEL_TIPO_MATERIA_OU_DOCUMENTO[old.ind_mat_ou_doc] + model_tipo = TIPO_MATERIA_OU_TIPO_DOCUMENTO[old.ind_mat_ou_doc] tipo = model_tipo.objects.filter(pk=value) if tipo: new.tipo_conteudo_related = tipo[0] @@ -1060,6 +1064,16 @@ def adjust_tipoproposicao(new, old): label={'ind_mat_ou_doc': old.ind_mat_ou_doc}) +def adjust_proposicao_antes_salvar(new, old): + if new.data_envio: + new.ano = new.data_envio.year + if old.cod_mat_ou_doc: + tipo_mat_ou_doc = type(new.tipo.tipo_conteudo_related) + campo_falso = CAMPOS_FALSOS_PROPOSICAO[tipo_mat_ou_doc] + new.content_type = content_types[campo_falso.related_model] + new.object_id = get_fk_related(campo_falso, old) + + def adjust_statustramitacao(new, old): if old.ind_fim_tramitacao: new.indicador = 'F' diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 23e4a6e3d..e9b366fa9 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -686,16 +686,12 @@ class Proposicao(models.Model): texto_articulado = GenericRelation( TextoArticulado, related_query_name='texto_articulado') - # FIXME - para a rotina de migração - este campo mudou - # retire o comentário quando resolver materia_de_vinculo = models.ForeignKey( MateriaLegislativa, blank=True, null=True, on_delete=models.CASCADE, verbose_name=_('Matéria anexadora'), related_name=_('proposicao_set')) - # FIXME - para a rotina de migração - estes campos mudaram - # retire o comentário quando resolver content_type = models.ForeignKey( ContentType, default=None, blank=True, null=True, verbose_name=_('Tipo de Material Gerado')) From f7feb405cddad0ed32d9eaf43c3ec3b91935d362 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 3 Apr 2018 17:55:03 -0300 Subject: [PATCH 28/36] =?UTF-8?q?Corrige=20vincula=C3=A7=C3=A3o=20de=20aut?= =?UTF-8?q?or=20p=20nova=20busca=20de=20fk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 64 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 14663f8ed..42114dbfa 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -131,14 +131,25 @@ for nome_novo, nome_antigo in (('comissao', 'cod_comissao'), Composicao._meta.get_field(nome_novo)] = nome_antigo -# campos virtuais de Proposicao para funcionarem com get_fk_related -CampoFalso = namedtuple('CampoFalso', ['model', 'related_model']) -CAMPOS_FALSOS_PROPOSICAO = { - TipoMateriaLegislativa: CampoFalso(Proposicao, MateriaLegislativa), - TipoDocumento: CampoFalso(Proposicao, DocumentoAdministrativo) +# campos virtuais de Proposicao para funcionar com get_fk_related +class CampoVirtual(namedtuple('CampoVirtual', 'model related_model')): + null = True + +CAMPOS_VIRTUAIS_PROPOSICAO = { + TipoMateriaLegislativa: CampoVirtual(Proposicao, MateriaLegislativa), + TipoDocumento: CampoVirtual(Proposicao, DocumentoAdministrativo) } -for campo_falso in CAMPOS_FALSOS_PROPOSICAO.values(): - campos_novos_para_antigos[campo_falso] = 'cod_mat_ou_doc' +for campo_virtual in CAMPOS_VIRTUAIS_PROPOSICAO.values(): + campos_novos_para_antigos[campo_virtual] = 'cod_mat_ou_doc' + +# campos virtuais de Autor para funcionar com get_fk_related +CAMPOS_VIRTUAIS_AUTOR = {related: CampoVirtual(Autor, related) + for related in (Parlamentar, Comissao, Partido)} +for related, campo_antigo in [(Parlamentar, 'cod_parlamentar'), + (Comissao, 'cod_comissao'), + (Partido, 'cod_partido')]: + campo_virtual = CAMPOS_VIRTUAIS_AUTOR[related] + campos_novos_para_antigos[campo_virtual] = campo_antigo # MIGRATION ################################################################# @@ -1069,9 +1080,9 @@ def adjust_proposicao_antes_salvar(new, old): new.ano = new.data_envio.year if old.cod_mat_ou_doc: tipo_mat_ou_doc = type(new.tipo.tipo_conteudo_related) - campo_falso = CAMPOS_FALSOS_PROPOSICAO[tipo_mat_ou_doc] - new.content_type = content_types[campo_falso.related_model] - new.object_id = get_fk_related(campo_falso, old) + campo_virtual = CAMPOS_VIRTUAIS_PROPOSICAO[tipo_mat_ou_doc] + new.content_type = content_types[campo_virtual.related_model] + new.object_id = get_fk_related(campo_virtual, old) def adjust_statustramitacao(new, old): @@ -1133,30 +1144,17 @@ def adjust_normajuridica_depois_salvar(): for assunto in assuntos) -def vincula_autor(new, old, model_relacionado, campo_relacionado, campo_nome): - pk_rel = getattr(old, campo_relacionado) - if pk_rel: - try: - new.autor_related = model_relacionado.objects.get(pk=pk_rel) - except ObjectDoesNotExist: - # ignoramos o autor órfão - nome_model_relacionado = model_relacionado._meta.model.__name__ - raise ForeignKeyFaltando( - field=Autor.autor_related, - value=[nome_model_relacionado, pk_rel], - label={'cod_autor': old.pk}) - else: - new.nome = getattr(new.autor_related, campo_nome) - return True - - def adjust_autor(new, old): - for args in [ - # essa ordem é importante - (Parlamentar, 'cod_parlamentar', 'nome_parlamentar'), - (Comissao, 'cod_comissao', 'nome'), - (Partido, 'cod_partido', 'nome')]: - if vincula_autor(new, old, *args): + # vincula autor com o objeto relacionado, tentando os três campos antigos + # o primeiro campo preenchido será usado, podendo lançar ForeignKeyFaltando + for model_relacionado, campo_nome in [(Parlamentar, 'nome_parlamentar'), + (Comissao, 'nome'), + (Partido, 'nome')]: + field = CAMPOS_VIRTUAIS_AUTOR[model_relacionado] + fk_encontrada = get_fk_related(field, old) + if fk_encontrada: + new.autor_related = model_relacionado.objects.get(id=fk_encontrada) + new.nome = getattr(new.autor_related, campo_nome) break if old.col_username: From 7a36a7fae006b045d73a2b34017ffd7f5a3ed7da Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 3 Apr 2018 18:19:08 -0300 Subject: [PATCH 29/36] Ajusta pk virtual p despacho_inicial acompanhando o agrupamento de despacho_inicial feito em iter_sql_records --- sapl/legacy/migracao_dados.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 42114dbfa..22abf6dd1 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -168,6 +168,10 @@ def warn(tipo, msg, dados): @lru_cache() def get_pk_legado(tabela): + if tabela == 'despacho_inicial': + # adaptação para deleção correta no mysql ao final de migrar_model + # acompanha o agrupamento de despacho_inicial feito em iter_sql_records + return 'cod_materia', 'cod_comissao' res = exec_legado( 'show index from {} WHERE Key_name = "PRIMARY"'.format(tabela)) return [r[4] for r in res] From 1fae43f7c0df4a8415ab2a8727b3cb4551cff909 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 4 Apr 2018 14:41:52 -0300 Subject: [PATCH 30/36] Ajusta campo natureza em TipoResultadoVotacao --- .../migrations/0019_auto_20180404_1437.py | 20 +++++++++++++++++++ sapl/sessao/models.py | 14 +++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 sapl/sessao/migrations/0019_auto_20180404_1437.py diff --git a/sapl/sessao/migrations/0019_auto_20180404_1437.py b/sapl/sessao/migrations/0019_auto_20180404_1437.py new file mode 100644 index 000000000..ed81011f1 --- /dev/null +++ b/sapl/sessao/migrations/0019_auto_20180404_1437.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-04-04 17:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0018_auto_20180327_1433'), + ] + + operations = [ + migrations.AlterField( + model_name='tiporesultadovotacao', + name='natureza', + field=models.CharField(blank=True, choices=[('A', 'Aprovado'), ('R', 'Rejeitado')], max_length=1, verbose_name='Natureza do Tipo'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 23155b51a..23f555cb6 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -225,9 +225,9 @@ class SessaoPlenaria(models.Model): @reversion.register() class AbstractOrdemDia(models.Model): TIPO_VOTACAO_CHOICES = Choices( - (1, 'simbolica', (('Simbólica'))), - (2, 'nominal', (('Nominal'))), - (3, 'secreta', (('Secreta'))), + (1, 'simbolica', 'Simbólica'), + (2, 'nominal', 'Nominal'), + (3, 'secreta', 'Secreta'), ) sessao_plenaria = models.ForeignKey(SessaoPlenaria, @@ -380,11 +380,13 @@ class PresencaOrdemDia(models.Model): # OrdemDiaPresenca @reversion.register() class TipoResultadoVotacao(models.Model): + NATUREZA_CHOICES = Choices( + ('A', 'aprovado', 'Aprovado'), + ('R', 'rejeitado', 'Rejeitado')) nome = models.CharField(max_length=100, verbose_name=_('Nome do Tipo')) - natureza = models.CharField(max_length=100, + natureza = models.CharField(max_length=1, blank=True, - choices=(('A', 'Aprovado'), - ('R', 'Rejeitado')), + choices=NATUREZA_CHOICES, verbose_name=_('Natureza do Tipo')) class Meta: From e06adf8bb79d5d134141d0984ddc679f9d780364 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 4 Apr 2018 14:48:47 -0300 Subject: [PATCH 31/36] =?UTF-8?q?Infere=20natureza=20do=20tipo=20de=20resu?= =?UTF-8?q?ltado=20de=20vota=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #1797 --- sapl/legacy/migracao_dados.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 22abf6dd1..9b2846fa7 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -35,7 +35,8 @@ from sapl.parlamentares.models import (Legislatura, Mandato, Parlamentar, Partido, TipoAfastamento) from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, StatusTramitacaoAdministrativo) -from sapl.sessao.models import ExpedienteMateria, OrdemDia, RegistroVotacao +from sapl.sessao.models import (ExpedienteMateria, OrdemDia, RegistroVotacao, + TipoResultadoVotacao) from sapl.settings import DATABASES, PROJECT_DIR from sapl.utils import normalize @@ -865,6 +866,8 @@ def migrar_model(model): sql_delete_legado = '' for old in old_records: new = model() + if get_id_do_legado: + new.id = get_id_do_legado(old) try: populate_renamed_fields(new, old) if ajuste_antes_salvar: @@ -876,9 +879,6 @@ def migrar_model(model): warn('fk', e.msg, e.dados) continue else: - if get_id_do_legado: - new.id = get_id_do_legado(old) - new.clean() # valida model novos.append(new) # guarda para salvar @@ -1187,6 +1187,18 @@ def adjust_comissao(new, old): new.ativa = False +def adjust_tiporesultadovotacao(new, old): + if 'aprova' in new.nome.lower(): + new.natureza = TipoResultadoVotacao.NATUREZA_CHOICES.aprovado + elif 'rejeita' in new.nome.lower(): + new.natureza = TipoResultadoVotacao.NATUREZA_CHOICES.rejeitado + else: + warn('natureza_desconhecida_tipo_resultadovotacao', + 'Não foi possível identificar a natureza do ' + 'tipo de resultado de votação [{pk}: "{nome}"]', + {'pk': new.pk, 'nome': new.nome}) + + AJUSTE_ANTES_SALVAR = { Autor: adjust_autor, TipoAutor: adjust_tipo_autor, @@ -1207,6 +1219,7 @@ AJUSTE_ANTES_SALVAR = { StatusTramitacao: adjust_statustramitacao, StatusTramitacaoAdministrativo: adjust_statustramitacaoadm, Tramitacao: adjust_tramitacao, + TipoResultadoVotacao: adjust_tiporesultadovotacao, } AJUSTE_DEPOIS_SALVAR = { From 2ce4245d43b015a01fdd91e1d354f4b311ddece3 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 4 Apr 2018 16:24:39 -0300 Subject: [PATCH 32/36] Release: 3.1.69 --- docker-compose.yml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2b21db31d..0baa9ffc3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.68 + image: interlegis/sapl:3.1.69 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/setup.py b/setup.py index 10169b637..46b3a1dd6 100644 --- a/setup.py +++ b/setup.py @@ -49,7 +49,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.68', + version='3.1.69', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 53f77a18c42263492e976ddd43d4d66edc25c816 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 5 Apr 2018 14:37:18 -0300 Subject: [PATCH 33/36] Adiciona script para normalizar dumps do legado --- sapl/legacy/scripts/normaliza_dump_mysql.sh | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100755 sapl/legacy/scripts/normaliza_dump_mysql.sh diff --git a/sapl/legacy/scripts/normaliza_dump_mysql.sh b/sapl/legacy/scripts/normaliza_dump_mysql.sh new file mode 100755 index 000000000..79315252d --- /dev/null +++ b/sapl/legacy/scripts/normaliza_dump_mysql.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +ARQUIVO=$1 +BANCO=`echo $1 | cut -f1 -d.` +TMP=__tmp.sql + +cat << EOF > $TMP + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +EOF + +echo "CREATE DATABASE /*!32312 IF NOT EXISTS*/ \`$BANCO\` /*!40100 DEFAULT CHARACTER SET latin1 */;" >> $TMP +echo >> $TMP +echo "USE \`$BANCO\`;" >> $TMP +sed 1,`grep -n '^USE ' $ARQUIVO |cut -f1 -d:`d $ARQUIVO >> $TMP +mv $TMP $ARQUIVO From 4b85f0e77ee49d156385ad15e0bb52228044ce81 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 5 Apr 2018 15:11:37 -0300 Subject: [PATCH 34/36] Corrige script para normalizar dumps do legado --- sapl/legacy/scripts/normaliza_dump_mysql.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sapl/legacy/scripts/normaliza_dump_mysql.sh b/sapl/legacy/scripts/normaliza_dump_mysql.sh index 79315252d..75bd5435f 100755 --- a/sapl/legacy/scripts/normaliza_dump_mysql.sh +++ b/sapl/legacy/scripts/normaliza_dump_mysql.sh @@ -1,7 +1,7 @@ #!/bin/bash ARQUIVO=$1 -BANCO=`echo $1 | cut -f1 -d.` +BANCO=`basename $1 | cut -f1 -d.` TMP=__tmp.sql cat << EOF > $TMP @@ -17,10 +17,12 @@ cat << EOF > $TMP /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*!40000 DROP DATABASE IF EXISTS \`$BANCO\`*/; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ \`$BANCO\` /*!40100 DEFAULT CHARACTER SET latin1 */; + +USE \`$BANCO\`; EOF -echo "CREATE DATABASE /*!32312 IF NOT EXISTS*/ \`$BANCO\` /*!40100 DEFAULT CHARACTER SET latin1 */;" >> $TMP -echo >> $TMP -echo "USE \`$BANCO\`;" >> $TMP sed 1,`grep -n '^USE ' $ARQUIVO |cut -f1 -d:`d $ARQUIVO >> $TMP mv $TMP $ARQUIVO From bccd6349703ccf77b3d0d8e2ec613cb6a6942e27 Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Thu, 5 Apr 2018 18:27:59 -0300 Subject: [PATCH 35/36] Fix #1830 (#1831) --- sapl/sessao/views.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 99ca51758..4acd862b1 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1737,6 +1737,12 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): materia_votacao = ordem + if not ordem.votacao_aberta: + msg = _('A votação para esta matéria encontra-se fechada!') + messages.add_message(request, messages.ERROR, msg) + return HttpResponseRedirect(reverse( + 'sapl.sessao:ordemdia_list', kwargs={'pk': kwargs['pk']})) + elif self.expediente: expediente_id = kwargs['oid'] if (RegistroVotacao.objects.filter( @@ -1758,6 +1764,13 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): materia_votacao = expediente + if not expediente.votacao_aberta: + msg = _('A votação para esta matéria encontra-se fechada!') + messages.add_message(request, messages.ERROR, msg) + return HttpResponseRedirect(reverse( + 'sapl.sessao:expedientemateria_list', + kwargs={'pk': kwargs['pk']})) + materia = {'materia': materia_votacao.materia, 'ementa': sub( ' ', ' ', strip_tags( From 1cbd3f7f023f75228c4262e1850d5000788be07f Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Fri, 6 Apr 2018 14:17:20 -0300 Subject: [PATCH 36/36] =?UTF-8?q?HOT-FIX:=20permite=20aplicar=20migra?= =?UTF-8?q?=C3=A7=C3=B5es=20que=20removem=20colunas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- start.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/start.sh b/start.sh index d98481b30..4790d2df4 100755 --- a/start.sh +++ b/start.sh @@ -46,7 +46,8 @@ create_env /bin/sh busy-wait.sh $DATABASE_URL -python3 manage.py migrate --noinput +# manage.py migrate --noinput nao funcionava +yes yes | python3 manage.py migrate #python3 manage.py collectstatic --no-input python3 manage.py rebuild_index --noinput &