Browse Source

Merge pull request #9 from interlegis/master

05/09/2017
pull/1635/head
Rogério Frá 8 years ago
committed by GitHub
parent
commit
3c7abd3b73
  1. 2
      docker-compose.yml
  2. 20
      sapl/base/tests/test_form.py
  3. 16
      sapl/compilacao/compilacao_data_tables.sql
  4. 2
      sapl/compilacao/models.py
  5. 42
      sapl/compilacao/tests/test_tipo_texto_articulado_form.py
  6. 7
      sapl/compilacao/views.py
  7. 361
      sapl/materia/fixtures/pre_popula_status_tramitacao.json
  8. 44
      sapl/materia/migrations/0013_adiciona_status_tramitacao.py
  9. 24
      sapl/norma/migrations/0007_auto_20170904_1708.py
  10. 3
      sapl/norma/models.py
  11. 23
      sapl/norma/tests/test_norma.py
  12. 5
      sapl/norma/urls.py
  13. 21
      sapl/norma/views.py
  14. 37
      sapl/parlamentares/fixtures/pre_popula_cargosmesa.json
  15. 282
      sapl/parlamentares/fixtures/pre_popula_partidos.json
  16. 8
      sapl/parlamentares/forms.py
  17. 19
      sapl/parlamentares/migrations/0006_auto_20170831_1400.py
  18. 40
      sapl/parlamentares/migrations/0007_adiciona_partidos.py
  19. 41
      sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py
  20. 4
      sapl/parlamentares/models.py
  21. 35
      sapl/parlamentares/tests/test_parlamentares.py
  22. 9
      sapl/protocoloadm/tests/test_protocoloadm.py
  23. 5
      sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
  24. 5
      sapl/relatorios/views.py
  25. 61
      sapl/sessao/tests/test_sessao.py
  26. 4
      sapl/sessao/views.py
  27. 24
      sapl/static/styles/compilacao.scss
  28. 17
      sapl/templates/norma/normajuridica_form.html

2
docker-compose.yml

@ -10,7 +10,7 @@ sapldb:
ports:
- "5532:5432"
sapl:
image: interlegis/sapl:3.1.19-BETA
image: interlegis/sapl:3.1.20-BETA
volumes:
- sapl_data:/var/interlegis/sapl/data
- sapl_media:/var/interlegis/sapl/media

20
sapl/base/tests/test_form.py

@ -0,0 +1,20 @@
from django.utils.translation import ugettext_lazy as _
from sapl.base.forms import CasaLegislativaForm
def test_valida_campos_obrigatorios_casa_legislativa_form():
form = CasaLegislativaForm(data={})
assert not form.is_valid()
errors = form.errors
assert errors['nome'] == [_('Este campo é obrigatório.')]
assert errors['sigla'] == [_('Este campo é obrigatório.')]
assert errors['endereco'] == [_('Este campo é obrigatório.')]
assert errors['cep'] == [_('Este campo é obrigatório.')]
assert errors['municipio'] == [_('Este campo é obrigatório.')]
assert errors['uf'] == [_('Este campo é obrigatório.')]
assert len(errors) == 6

16
sapl/compilacao/compilacao_data_tables.sql

@ -16,17 +16,17 @@ INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (104, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '', '<br>', '', '<br>', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (111, 'Anexo', 'anexo', '', 'Anexo ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (112, 'Parte', 'parte', '', 'Parte ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (113, 'Livro', 'livro', '', 'Livro ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (114, 'Título', 'titulo', '', 'Título ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (115, 'Capítulo', 'capitulo', '', 'Capítulo ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (113, 'Livro', 'livro', '', 'LIVRO ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (114, 'Título', 'titulo', '', 'TÍTULO ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (115, 'Capítulo', 'capitulo', '', 'CAPÍTULO ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (116, 'Seção', 'secao', '', 'Seção ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (117, 'SubSeção', 'subsecao', '', 'SubSeção ', 0, '', '<br>', '', '<br>', '<br>', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (119, 'Artigo', 'artigo', '', 'Art. ', 9, '.', '&nbsp;&ndash;&nbsp;', '', '', '', '', true, '1', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', true, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (117, 'Subseção', 'subsecao', '', 'Subseção ', 0, '', '<br>', '', '<br>', '<br>', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (119, 'Artigo', 'artigo', '', 'Art. ', 9, '.', '&nbsp;', '', '', '', '', true, '1', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', true, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (120, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (121, 'Parágrafo', 'paragrafo indent', '', '§ ;Parágrafo Único ', 9, '', '&nbsp;&ndash;&nbsp;', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (121, 'Parágrafo', 'paragrafo indent', '', '§ ;Parágrafo único ', 9, '', '&nbsp;', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (122, 'Inciso', 'inciso indent', '', '', 0, '', '&nbsp;&ndash;&nbsp;', '', '', '', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (123, 'Alinea', 'alinea indent', '', '', 0, ')', '&nbsp;&ndash;&nbsp;', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (124, 'Item', 'item indent', '', '', 0, '', '&nbsp;&ndash;&nbsp;', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (123, 'Alinea', 'alinea indent', '', '', 0, ')', '&nbsp;', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (124, 'Item', 'item indent', '', '', 0, '', '&nbsp;', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (125, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false);
INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (126, 'Justificativa', 'justificativa', '', '', 0, '', '', '', '<div class="titulo">Justificativa</div>', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false);

2
sapl/compilacao/models.py

@ -1,5 +1,6 @@
from datetime import datetime
import reversion
from django.contrib import messages
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
@ -12,7 +13,6 @@ from django.template import defaultfilters
from django.utils.decorators import classonlymethod
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
import reversion
from sapl.compilacao.utils import (get_integrations_view_names, int_to_letter,
int_to_roman)

42
sapl/compilacao/tests/test_tipo_texto_articulado_form.py

@ -1,9 +1,10 @@
from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy
import pytest
from django.utils.translation import ugettext as _
from model_mommy import mommy
from sapl.compilacao import forms
from sapl.compilacao.models import PerfilEstruturalTextoArticulado
from sapl.compilacao.models import (PerfilEstruturalTextoArticulado,
TipoNota)
from sapl.compilacao.views import choice_models_in_extenal_views
@ -39,3 +40,38 @@ def test_tipo_texto_articulado_form_valid(content_type):
})
assert form.is_valid(), form.errors
def test_valida_campos_obrigatorios_nota_form():
form = forms.NotaForm(data={})
assert not form.is_valid()
errors = form.errors
assert errors['texto'] == [_('Este campo é obrigatório')]
assert errors['publicidade'] == [_('Este campo é obrigatório.')]
assert errors['tipo'] == [_('Este campo é obrigatório.')]
assert errors['publicacao'] == [_('Este campo é obrigatório')]
assert errors['efetividade'] == [_('Este campo é obrigatório')]
assert errors['dispositivo'] == [_('Este campo é obrigatório.')]
assert len(errors) == 6
@pytest.mark.django_db(transaction=False)
def test_nota_form_invalido():
tipo = mommy.make(TipoNota)
form = forms.NotaForm(data={'titulo': 'titulo',
'texto': 'teste',
'url_externa': 'www.test.com',
'publicidade': 'publicidade',
'tipo': str(tipo.pk),
'publicacao': '10/05/2017',
'efetividade': '10/05/2017',
'dispositivo': 'dispositivo',
'pk': 'pk'
})
assert not form.is_valid()

7
sapl/compilacao/views.py

@ -1,7 +1,7 @@
from collections import OrderedDict
from datetime import timedelta
import logging
import sys
from collections import OrderedDict
from datetime import timedelta
from braces.views import FormMessagesMixin
from django import forms
@ -19,8 +19,8 @@ from django.http.response import (HttpResponse, HttpResponseRedirect,
from django.shortcuts import get_object_or_404, redirect
from django.utils.dateparse import parse_date
from django.utils.encoding import force_text
from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import string_concat
from django.views.generic.base import TemplateView
from django.views.generic.detail import DetailView
from django.views.generic.edit import (CreateView, DeleteView, FormView,
@ -50,7 +50,6 @@ from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED,
from sapl.crud.base import Crud, CrudListView, make_pagination
from sapl.settings import BASE_DIR
TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota')
TipoVideCrud = Crud.build(TipoVide, 'tipo_vide')
TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao')

361
sapl/materia/fixtures/pre_popula_status_tramitacao.json

@ -0,0 +1,361 @@
[{
"model": "materia.StatusTramitacao",
"pk": 1,
"fields": {
"sigla": "ADIAVOTAC",
"indicador": "R",
"descricao": "Adiada discussão e votação."
}
},
{
"model": "materia.StatusTramitacao",
"pk": 2,
"fields": {
"sigla": "AGAUTOGR",
"indicador": "R",
"descricao": "Aguardando assinatura do autógrafo"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 3,
"fields": {
"sigla": "AGMENSVET",
"indicador": "R",
"descricao": "Aguardando assinatura da mensagem sobre o veto"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 4,
"fields": {
"sigla": "AGORDIA",
"indicador": "R",
"descricao": "Aguardando a inclusão na ordem do dia"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 5,
"fields": {
"sigla": "AGPARECER",
"indicador": "R",
"descricao": "Aguardando emissão de parecer da comissão"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 6,
"fields": {
"sigla": "AGPROMLEI",
"indicador": "F",
"descricao": "Aguardando promulgação da lei"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 7,
"fields": {
"sigla": "AGPROMNOR",
"indicador": "F",
"descricao": "Aguardando promulgação da norma jurídica"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 8,
"fields": {
"sigla": "AGPROMVET",
"indicador": "R",
"descricao": "Aguardando promulgação de lei com veto rejeitado"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 9,
"fields": {
"sigla": "AGSANCAO",
"indicador": "F",
"descricao": "Aguardando sanção governamental"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 10,
"fields": {
"sigla": "ANEXADA",
"indicador": "R",
"descricao": "Proposição anexada à outra análoga ou conexa mais antiga"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 11,
"fields": {
"sigla": "APRESENT",
"indicador": "R",
"descricao": "Proposição apresentada em Plenário"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 12,
"fields": {
"sigla": "APROV1TUR",
"indicador": "R",
"descricao": "Proposição aprovada em 1º turno"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 13,
"fields": {
"sigla": "APROVADA",
"indicador": "F",
"descricao": "Proposição aprovada"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 14,
"fields": {
"sigla": "ARQUIVADA",
"indicador": "F",
"descricao": "Proposição arquivada"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 15,
"fields": {
"sigla": "AUTUAPAUTA",
"indicador": "R",
"descricao": "Proposição autuada e cumprindo prazo de pauta"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 16,
"fields": {
"sigla": "DESARQUIV",
"indicador": "R",
"descricao": "Proposição desarquivada pelo Autor"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 17,
"fields": {
"sigla": "DISTRCOMIS",
"indicador": "R",
"descricao": "Proposição distribuída às comissões"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 18,
"fields": {
"sigla": "INCLORDIA",
"indicador": "R",
"descricao": "Proposição inclusa na Ordem do Dia"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 19,
"fields": {
"sigla": "LEIPROMUL",
"indicador": "F",
"descricao": "Proposição transformada em lei por promulgação"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 20,
"fields": {
"sigla": "LEIVETPAR",
"indicador": "R",
"descricao": "Transformada em lei com veto parcial"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 21,
"fields": {
"sigla": "MANUTVETO",
"indicador": "R",
"descricao": "Parecer pela manutenção do veto"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 22,
"fields": {
"sigla": "NORMPROMUL",
"indicador": "F",
"descricao": "Norma promulgada"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 23,
"fields": {
"sigla": "PARECCONTR",
"indicador": "R",
"descricao": "Parecer contrário da comissão de mérito"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 24,
"fields": {
"sigla": "PARECERFAV",
"indicador": "R",
"descricao": "Parecer favorável da comissão"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 25,
"fields": {
"sigla": "PARECPLEN",
"indicador": "F",
"descricao": "Parecer em Plenário pelas comissões pertinentes"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 26,
"fields": {
"sigla": "PAREUCONJ",
"indicador": "R",
"descricao": "Parecer em reunião conjunta das Comissões pertinentes"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 27,
"fields": {
"sigla": "PREJUD",
"indicador": "F",
"descricao": "Proposição prejudicada"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 28,
"fields": {
"sigla": "PROMULVETO",
"indicador": "F",
"descricao": "Veto total ou parcial promulgado"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 29,
"fields": {
"sigla": "REJEITADA",
"indicador": "F",
"descricao": "Proposição rejeitada pelo Plenário"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 30,
"fields": {
"sigla": "REJEIVETO",
"indicador": "R",
"descricao": "Parecer pela rejeição do veto"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 31,
"fields": {
"sigla": "RETAUTOR",
"indicador": "F",
"descricao": "Proposição retirada pelo autor"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 32,
"fields": {
"sigla": "RETORDIA",
"indicador": "R",
"descricao": "Proposição retirada da Ordem do Dia"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 33,
"fields": {
"sigla": "TRANSFLEI",
"indicador": "F",
"descricao": "Proposição transformada em lei"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 34,
"fields": {
"sigla": "VETODISTR",
"indicador": "R",
"descricao": "Veto distribuído para emissão de parecer"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 35,
"fields": {
"sigla": "VETOLIDO",
"indicador": "R",
"descricao": "Veto sobre a proposição lido em sessão plenária"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 36,
"fields": {
"sigla": "VETOMANT",
"indicador": "F",
"descricao": "Veto sobre a proposição mantido"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 37,
"fields": {
"sigla": "VETOORDIA",
"indicador": "F",
"descricao": "Veto incluso na ordem do dia"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 38,
"fields": {
"sigla": "VETOPAUTA",
"indicador": "F",
"descricao": "Veto autuado e incluso em pauta"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 39,
"fields": {
"sigla": "VETOREJEI",
"indicador": "F",
"descricao": "Veto sobre a proposição rejeitado"
}
},
{
"model": "materia.StatusTramitacao",
"pk": 40,
"fields": {
"sigla": "VETOTOTAL",
"indicador": "R",
"descricao": "Proposição com veto tota"
}
}
]

44
sapl/materia/migrations/0013_adiciona_status_tramitacao.py

@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
import json
import os
from django.core.management import call_command
def gera_status_tramitacao(apps, schema_editor):
StatusTramitacao = apps.get_model("materia", "StatusTramitacao")
db_alias = schema_editor.connection.alias
status_tramitacoes = StatusTramitacao.objects.all().exists()
if status_tramitacoes:
# Caso haja algum StatusTramitacao cadastrado na base de dados,
# a migração não deve ser carregada para evitar duplicações de dados.
print("Carga de {} não efetuada. Já Existem {} cadastrados...".format(
StatusTramitacao._meta.verbose_name,
StatusTramitacao._meta.verbose_name_plural
)
)
else:
fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures'))
# pega status_tramitacoes listados em fixtures/pre_popula_status_tramitacao.json
fixture_filename = 'pre_popula_status_tramitacao.json'
fixture_file = os.path.join(fixture_dir, fixture_filename)
call_command('loaddata', fixture_file)
class Migration(migrations.Migration):
dependencies = [
# A dependencia real desse script é o arquivo 0001_initial.py, mas
# isso gera um erro (Conflicting migrations detected; multiple leaf
# nodes in the migration graph). para não ocasionar problemas de migração,
# vamos manter a ordem padrão do django.
('materia', '0012_auto_20170829_1321'),
]
operations = [
migrations.RunPython(gera_status_tramitacao),
]

24
sapl/norma/migrations/0007_auto_20170904_1708.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2017-09-04 17:08
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('norma', '0006_normajuridica_data_ultima_atualizacao'),
]
operations = [
migrations.AlterModelOptions(
name='assuntonorma',
options={'ordering': ['assunto'], 'verbose_name': 'Assunto de Norma Jurídica', 'verbose_name_plural': 'Assuntos de Normas Jurídicas'},
),
migrations.AlterField(
model_name='normajuridica',
name='esfera_federacao',
field=models.CharField(choices=[('M', 'Municipal'), ('E', 'Estadual'), ('F', 'Federal')], max_length=1, verbose_name='Esfera Federação'),
),
]

3
sapl/norma/models.py

@ -20,6 +20,7 @@ class AssuntoNorma(models.Model):
class Meta:
verbose_name = _('Assunto de Norma Jurídica')
verbose_name_plural = _('Assuntos de Normas Jurídicas')
ordering = ['assunto']
def __str__(self):
return self.assunto
@ -67,9 +68,9 @@ def norma_upload_path(instance, filename):
@reversion.register()
class NormaJuridica(models.Model):
ESFERA_FEDERACAO_CHOICES = Choices(
('M', 'municipal', _('Municipal')),
('E', 'estadual', _('Estadual')),
('F', 'federal', _('Federal')),
('M', 'municipal', _('Municipal')),
)
texto_integral = models.FileField(

23
sapl/norma/tests/test_norma.py

@ -1,11 +1,13 @@
import pytest
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
from sapl.norma.forms import (NormaJuridicaForm,)
from sapl.norma.models import NormaJuridica, TipoNormaJuridica
from sapl.norma.forms import NormaJuridicaForm, NormaRelacionadaForm
from sapl.norma.models import (NormaJuridica, TipoNormaJuridica)
@pytest.mark.django_db(transaction=False)
@ -96,7 +98,6 @@ def test_norma_juridica_materia_inexistente():
@pytest.mark.django_db(transaction=False)
def test_norma_juridica_materia_existente():
tipo = mommy.make(TipoNormaJuridica)
tipo_materia = mommy.make(TipoMateriaLegislativa)
materia = mommy.make(MateriaLegislativa,
@ -115,3 +116,19 @@ def test_norma_juridica_materia_existente():
'ano_materia': '2017'
})
assert form.is_valid()
@pytest.mark.django_db(transaction=False)
def test_norma_relacionada_form_campos_obrigatorios():
form = NormaRelacionadaForm(data={})
assert not form.is_valid()
errors = form.errors
assert errors['tipo'] == [_('Este campo é obrigatório.')]
assert errors['numero'] == [_('Este campo é obrigatório.')]
assert errors['ano'] == [_('Este campo é obrigatório.')]
assert errors['tipo_vinculo'] == [_('Este campo é obrigatório.')]
assert len(errors) == 4

5
sapl/norma/urls.py

@ -2,7 +2,8 @@ from django.conf.urls import include, url
from sapl.norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView,
NormaRelacionadaCrud, NormaTaView, TipoNormaCrud,
TipoVinculoNormaJuridicaCrud, recuperar_norma)
TipoVinculoNormaJuridicaCrud, recuperar_norma,
recuperar_numero_norma)
from .apps import AppConfig
@ -25,5 +26,7 @@ urlpatterns = [
NormaPesquisaView.as_view(), name='norma_pesquisa'),
url(r'^norma/recuperar-norma$', recuperar_norma, name="recuperar_norma"),
url(r'^norma/recuperar-numero-norma$', recuperar_numero_norma,
name="recuperar_numero_norma"),
]

21
sapl/norma/views.py

@ -1,3 +1,4 @@
from datetime import datetime
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.http import JsonResponse
@ -145,6 +146,7 @@ class NormaCrud(Crud):
def layout_key(self):
return 'NormaJuridicaCreate'
class ListView(Crud.ListView, RedirectView):
def get_redirect_url(self, *args, **kwargs):
@ -185,3 +187,22 @@ def recuperar_norma(request):
response = JsonResponse({'ementa': '', 'id': 0})
return response
def recuperar_numero_norma(request):
tipo = TipoNormaJuridica.objects.get(pk=request.GET['tipo'])
ano = request.GET.get('ano', '')
param = {'tipo': tipo}
param['ano'] = ano if ano else datetime.now().year
norma = NormaJuridica.objects.filter(**param).order_by(
'tipo', 'ano', 'numero').values_list('numero', 'ano').last()
if norma:
response = JsonResponse({'numero': int(norma[0]) + 1,
'ano': norma[1]})
else:
response = JsonResponse(
{'numero': 1, 'ano': ano})
return response

37
sapl/parlamentares/fixtures/pre_popula_cargosmesa.json

@ -0,0 +1,37 @@
[
{
"model": "parlamentares.CargoMesa",
"pk": 1,
"fields": {
"descricao": "Presidente",
"unico": true
}
},
{
"model": "parlamentares.CargoMesa",
"pk": 2,
"fields": {
"descricao": "Vice-Presidente",
"unico": true
}
},
{
"model": "parlamentares.CargoMesa",
"pk": 3,
"fields": {
"descricao": "Primeiro-Secretário",
"unico": true
}
},
{
"model": "parlamentares.CargoMesa",
"pk": 4,
"fields": {
"descricao": "Segundo-Secretário",
"unico": true
}
}
]

282
sapl/parlamentares/fixtures/pre_popula_partidos.json

@ -0,0 +1,282 @@
[
{
"model": "parlamentares.Partido",
"pk": 1,
"fields": {
"sigla": "PMDB",
"nome": "PARTIDO DO MOVIMENTO DEMOCRÁTICO BRASILEIRO"
}
},
{
"model": "parlamentares.Partido",
"pk": 2,
"fields": {
"sigla": "PTB",
"nome": "PARTIDO TRABALHISTA BRASILEIRO"
}
},
{
"model": "parlamentares.Partido",
"pk": 3,
"fields": {
"sigla": "PDT",
"nome": "PARTIDO DEMOCRÁTICO TRABALHISTA"
}
},
{
"model": "parlamentares.Partido",
"pk": 4,
"fields": {
"sigla": "PT",
"nome": "PARTIDO DOS TRABALHADORES"
}
},
{
"model": "parlamentares.Partido",
"pk": 5,
"fields": {
"sigla": "DEM",
"nome": "DEMOCRATAS"
}
},
{
"model": "parlamentares.Partido",
"pk": 6,
"fields": {
"sigla": "PCdoB",
"nome": "PARTIDO COMUNISTA DO BRASIL"
}
},
{
"model": "parlamentares.Partido",
"pk": 7,
"fields": {
"sigla": "PSB",
"nome": "PARTIDO SOCIALISTA BRASILEIRO"
}
},
{
"model": "parlamentares.Partido",
"pk": 8,
"fields": {
"sigla": "PSDB",
"nome": "PARTIDO DA SOCIAL DEMOCRACIA BRASILEIRA"
}
},
{
"model": "parlamentares.Partido",
"pk": 9,
"fields": {
"sigla": "PTC",
"nome": "PARTIDO TRABALHISTA CRISTÃO"
}
},
{
"model": "parlamentares.Partido",
"pk": 10,
"fields": {
"sigla": "PSC",
"nome": "PARTIDO SOCIAL CRISTÃO"
}
},
{
"model": "parlamentares.Partido",
"pk": 11,
"fields": {
"sigla": "PMN",
"nome": "PARTIDO DA MOBILIZAÇÃO NACIONAL"
}
},
{
"model": "parlamentares.Partido",
"pk": 12,
"fields": {
"sigla": "PRP",
"nome": "PARTIDO REPUBLICANO PROGRESSISTA"
}
},
{
"model": "parlamentares.Partido",
"pk": 13,
"fields": {
"sigla": "PPS",
"nome": "PARTIDO POPULAR SOCIALISTA"
}
},
{
"model": "parlamentares.Partido",
"pk": 14,
"fields": {
"sigla": "PV",
"nome": "PARTIDO VERDE"
}
},
{
"model": "parlamentares.Partido",
"pk": 15,
"fields": {
"sigla": "PTdoB",
"nome": "PARTIDO TRABALHISTA DO BRASIL"
}
},
{
"model": "parlamentares.Partido",
"pk": 16,
"fields": {
"sigla": "PP",
"nome": "PARTIDO PROGRESSISTA"
}
},
{
"model": "parlamentares.Partido",
"pk": 17,
"fields": {
"sigla": "PSTU",
"nome": "PARTIDO SOCIALISTA DOS TRABALHADORES UNIFICADO"
}
},
{
"model": "parlamentares.Partido",
"pk": 18,
"fields": {
"sigla": "PCB",
"nome": "PARTIDO COMUNISTA BRASILEIRO"
}
},
{
"model": "parlamentares.Partido",
"pk": 19,
"fields": {
"sigla": "PRTB",
"nome": "PARTIDO RENOVADOR TRABALHISTA BRASILEIRO"
}
},
{
"model": "parlamentares.Partido",
"pk": 20,
"fields": {
"sigla": "PHS",
"nome": "PARTIDO HUMANISTA DA SOLIDARIEDADE"
}
},
{
"model": "parlamentares.Partido",
"pk": 21,
"fields": {
"sigla": "PSDC",
"nome": "PARTIDO SOCIAL DEMOCRATA CRISTÃO"
}
},
{
"model": "parlamentares.Partido",
"pk": 22,
"fields": {
"sigla": "PCO",
"nome": "PARTIDO DA CAUSA OPERÁRIA"
}
},
{
"model": "parlamentares.Partido",
"pk": 23,
"fields": {
"sigla": "PODE",
"nome": "PODEMOS"
}
},
{
"model": "parlamentares.Partido",
"pk": 24,
"fields": {
"sigla": "PSL",
"nome": "PARTIDO SOCIAL LIBERAL"
}
},
{
"model": "parlamentares.Partido",
"pk": 25,
"fields": {
"sigla": "PRB",
"nome": "PARTIDO REPUBLICANO BRASILEIRO"
}
},
{
"model": "parlamentares.Partido",
"pk": 26,
"fields": {
"sigla": "PSOL",
"nome": "PARTIDO SOCIALISMO E LIBERDADE"
}
},
{
"model": "parlamentares.Partido",
"pk": 27,
"fields": {
"sigla": "PR",
"nome": "PARTIDO DA REPÚBLICA"
}
},
{
"model": "parlamentares.Partido",
"pk": 28,
"fields": {
"sigla": "PSD",
"nome": "PARTIDO SOCIAL DEMOCRÁTICO"
}
},
{
"model": "parlamentares.Partido",
"pk": 29,
"fields": {
"sigla": "PPL",
"nome": "PARTIDO PÁTRIA LIVRE"
}
},
{
"model": "parlamentares.Partido",
"pk": 30,
"fields": {
"sigla": "PEN",
"nome": "PARTIDO ECOLÓGICO NACIONAL"
}
},
{
"model": "parlamentares.Partido",
"pk": 31,
"fields": {
"sigla": "PROS",
"nome": "PARTIDO REPUBLICANO DA ORDEM SOCIAL"
}
},
{
"model": "parlamentares.Partido",
"pk": 32,
"fields": {
"sigla": "SD",
"nome": "SOLIDARIEDADE"
}
},
{
"model": "parlamentares.Partido",
"pk": 33,
"fields": {
"sigla": "NOVO",
"nome": "PARTIDO NOVO"
}
},
{
"model": "parlamentares.Partido",
"pk": 34,
"fields": {
"sigla": "REDE",
"nome": "REDE SUSTENTABILIDADE"
}
},
{
"model": "parlamentares.Partido",
"pk": 35,
"fields": {
"sigla": "PMB",
"nome": "PARTIDO DA MULHER BRASILEIRA"
}
}
]

8
sapl/parlamentares/forms.py

@ -73,15 +73,15 @@ class MandatoForm(ModelForm):
if data_inicio_mandato:
if (data_inicio_mandato < legislatura.data_inicio or
data_inicio_mandato > legislatura.data_fim):
raise ValidationError(_("Data início mandato fora do intervalo "
"de legislatura informada"))
raise ValidationError(_("Data início mandato fora do intervalo"
" de legislatura informada"))
data_fim_mandato = data['data_fim_mandato']
if data_fim_mandato:
if (data_fim_mandato < legislatura.data_inicio or
data_fim_mandato > legislatura.data_fim):
raise ValidationError(_("Data fim mandato fora do intervalo de "
"legislatura informada"))
raise ValidationError(_("Data fim mandato fora do intervalo de"
" legislatura informada"))
existe_mandato = Mandato.objects.filter(
parlamentar=data['parlamentar'],

19
sapl/parlamentares/migrations/0006_auto_20170831_1400.py

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.13 on 2017-08-31 14:00
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0005_auto_20170814_1615'),
]
operations = [
migrations.AlterModelOptions(
name='votante',
options={'permissions': (('can_vote', 'Can Vote'),), 'verbose_name': 'Usuário Votante', 'verbose_name_plural': 'Usuários Votantes'},
),
]

40
sapl/parlamentares/migrations/0007_adiciona_partidos.py

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
import json
import os
from django.core.management import call_command
def gera_partidos_tse(apps, schema_editor):
Partido = apps.get_model("parlamentares", "Partido")
db_alias = schema_editor.connection.alias
partidos = Partido.objects.all().exists()
if partidos:
# Caso haja algum partido cadastrado na base de dados,
# a migração não deve ser carregada para evitar duplicações de dados.
print("Carga de Partido não efetuada. Já Existem partidos cadastrados...")
else:
fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures'))
# pega partidos listados em fixtures/pre_popula_partidos.json
fixture_filename = 'pre_popula_partidos.json'
fixture_file = os.path.join(fixture_dir, fixture_filename)
call_command('loaddata', fixture_file)
class Migration(migrations.Migration):
dependencies = [
# A dependencia real desse script é o arquivo 0001_initial.py, mas
# isso gera um erro (Conflicting migrations detected; multiple leaf
# nodes in the migration graph). para não ocasionar problemas de migração,
# vamos manter a ordem padrão do django.
('parlamentares', '0006_auto_20170831_1400'),
]
operations = [
migrations.RunPython(gera_partidos_tse),
]

41
sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
import json
import os
from django.core.management import call_command
def gera_cargos_mesa(apps, schema_editor):
CargoMesa = apps.get_model("parlamentares", "CargoMesa")
db_alias = schema_editor.connection.alias
cargos_mesa = CargoMesa.objects.all().exists()
if cargos_mesa:
# Caso haja algum CargoMesa cadastrado na base de dados,
# a migração não deve ser carregada para evitar duplicações de dados.
print("Carga de {} não efetuada. Já Existem {} cadastrados...".format(
CargoMesa._meta.verbose_name, CargoMesa._meta.verbose_name_plural))
else:
fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures'))
# pega partidos listados em fixtures/pre_popula_partidos.json
fixture_filename = 'pre_popula_cargosmesa.json'
fixture_file = os.path.join(fixture_dir, fixture_filename)
call_command('loaddata', fixture_file)
class Migration(migrations.Migration):
dependencies = [
# A dependencia real desse script é o arquivo 0001_initial.py, mas
# isso gera um erro (Conflicting migrations detected; multiple leaf
# nodes in the migration graph). para não ocasionar problemas de migração,
# vamos manter a ordem padrão do django.
('parlamentares', '0007_adiciona_partidos'),
]
operations = [
migrations.RunPython(gera_cargos_mesa),
]

4
sapl/parlamentares/models.py

@ -576,8 +576,8 @@ class Votante(models.Model):
max_length=30, null=True, blank=True)
class Meta:
verbose_name = _('Usuário')
verbose_name_plural = _('Usuários')
verbose_name = _('Usuário Votante')
verbose_name_plural = _('Usuários Votantes')
permissions = (
('can_vote', _('Can Vote')),
)

35
sapl/parlamentares/tests/test_parlamentares.py

@ -3,7 +3,7 @@ from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy
from sapl.parlamentares.forms import (LegislaturaForm, MandatoForm)
from sapl.parlamentares.forms import (FrenteForm, LegislaturaForm, MandatoForm)
from sapl.parlamentares.models import (Dependente, Filiacao, Legislatura,
Mandato, Parlamentar, Partido,
TipoDependente)
@ -181,7 +181,9 @@ def test_mandato_form_duplicado():
assert not form.is_valid()
assert form.errors['__all__'] == [_('Mandato nesta legislatura já existe.')]
assert form.errors['__all__'] == [
_('Mandato nesta legislatura já existe.')]
@pytest.mark.django_db(transaction=False)
def test_mandato_form_datas_invalidas():
@ -230,6 +232,7 @@ def test_legislatura_form_invalido():
assert len(errors) == 4
def test_legislatura_form_datas_invalidas():
legislatura_form = LegislaturaForm(data={'numero': '1',
@ -254,3 +257,31 @@ def test_legislatura_form_datas_invalidas():
assert legislatura_form.errors['__all__'] == \
[_("Intervalo de início e fim inválido para legislatura.")]
@pytest.mark.django_db(transaction=False)
def test_valida_campos_obrigatorios_frente_form():
form = FrenteForm(data={})
assert not form.is_valid()
errors = form.errors
assert errors['nome'] == [_('Este campo é obrigatório.')]
assert errors['data_criacao'] == [_('Este campo é obrigatório.')]
assert len(errors) == 2
@pytest.mark.django_db(transaction=False)
def test_frente_form_valido():
parlamentares = mommy.make(Parlamentar)
form = FrenteForm(data={'nome': 'Nome da Frente',
'parlamentar': str(parlamentares.pk),
'data_criacao': '10/11/2017',
'data_extincao': '10/12/2017',
'descricao': 'teste'
})
assert form.is_valid()

9
sapl/protocoloadm/tests/test_protocoloadm.py

@ -6,11 +6,12 @@ from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy
from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao)
from sapl.materia.models import UnidadeTramitacao
from sapl.protocoloadm.forms import (AnularProcoloAdmForm,
DocumentoAdministrativoForm,
MateriaLegislativa,
ProtocoloDocumentForm,
ProtocoloMateriaForm,)
ProtocoloMateriaForm)
from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo,
StatusTramitacaoAdministrativo,
TipoDocumentoAdministrativo,
@ -258,7 +259,6 @@ def test_create_tramitacao(admin_client):
@pytest.mark.django_db(transaction=False)
def test_anular_protocolo_dados_invalidos():
protocolo = mommy.make(Protocolo, pk=1, numero=1, ano=2017)
form = AnularProcoloAdmForm(data={})
@ -300,6 +300,7 @@ def test_anular_protocolo_form_anula_protocolo_anulado():
assert form.errors['__all__'] == [_(
'Protocolo 1/2017 já encontra-se anulado')]
@pytest.mark.django_db(transaction=False)
def test_anular_protocolo_form_anula_protocolo_com_doc_vinculado():
tipo_materia = mommy.make(TipoMateriaLegislativa)
@ -326,6 +327,7 @@ def test_anular_protocolo_form_anula_protocolo_com_doc_vinculado():
"documentos vinculados a ele.")]
tipo_documento = mommy.make(TipoDocumentoAdministrativo)
protocolo_documento = mommy.make(Protocolo,
numero=2,
ano=2017,
@ -397,6 +399,7 @@ def test_protocolo_documento_form_invalido():
assert len(errors) == 5
def test_protocolo_materia_invalido():
form = ProtocoloMateriaForm(data={})

5
sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py

@ -111,8 +111,11 @@ def inf_basicas(inf_basicas_dic):
nom_sessao + '</para>\n'
tmp += '\t\t<para style="P2" spaceAfter="5"><b>Abertura: </b> ' + \
dat_inicio_sessao + ' <b>- </b> ' + hr_inicio_sessao + '</para>\n'
data_fim_sessao = dat_fim_sessao + ' <b>- </b> ' if dat_fim_sessao else ''
tmp += '\t\t<para style="P2" spaceAfter="5"><b>Encerramento: </b> ' + \
dat_fim_sessao + ' <b>- </b> ' + hr_fim_sessao + '</para>\n'
dat_fim_sessao + hr_fim_sessao + '</para>\n'
return tmp

5
sapl/relatorios/views.py

@ -693,8 +693,9 @@ def get_sessao_plenaria(sessao, casa):
if tramitacao.turno == turno[0]:
dic_votacao["des_turno"] = turno[1]
dic_votacao["txt_ementa"] = materia.ementa
dic_votacao["ordem_observacao"] = votacao.observacao
# https://github.com/interlegis/sapl/issues/1009
dic_votacao["txt_ementa"] = html.unescape(materia.ementa)
dic_votacao["ordem_observacao"] = html.unescape(votacao.observacao)
dic_votacao["nom_autor"] = ' '
autoria = Autoria.objects.filter(

61
sapl/sessao/tests/test_sessao.py

@ -2,7 +2,7 @@ import pytest
from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy
from sapl.parlamentares.models import Legislatura, SessaoLegislativa
from sapl.parlamentares.models import Legislatura, Partido, SessaoLegislativa
from sapl.sessao import forms
from sapl.sessao.models import SessaoPlenaria, TipoSessaoPlenaria
@ -14,12 +14,12 @@ def test_valida_campos_obrigatorios_sessao_plenaria_form():
errors = form.errors
assert errors['legislatura'] == ['Este campo é obrigatório.']
assert errors['sessao_legislativa'] == ['Este campo é obrigatório.']
assert errors['tipo'] == ['Este campo é obrigatório.']
assert errors['numero'] == ['Este campo é obrigatório.']
assert errors['data_inicio'] == ['Este campo é obrigatório.']
assert errors['hora_inicio'] == ['Este campo é obrigatório.']
assert errors['legislatura'] == [_('Este campo é obrigatório.')]
assert errors['sessao_legislativa'] == [_('Este campo é obrigatório.')]
assert errors['tipo'] == [_('Este campo é obrigatório.')]
assert errors['numero'] == [_('Este campo é obrigatório.')]
assert errors['data_inicio'] == [_('Este campo é obrigatório.')]
assert errors['hora_inicio'] == [_('Este campo é obrigatório.')]
assert len(errors) == 6
@ -66,3 +66,50 @@ def test_numero_duplicado_sessao_plenaria_form():
"para a Legislatura, Sessão Legislativa "
"e Tipo informados. Favor escolher um "
"número distinto."]
@pytest.mark.django_db(transaction=False)
def test_valida_campos_obrigatorios_bancada_form():
form = forms.BancadaForm(data={})
assert not form.is_valid()
errors = form.errors
assert errors['legislatura'] == [_('Este campo é obrigatório.')]
assert errors['nome'] == [_('Este campo é obrigatório.')]
assert len(errors) == 2
@pytest.mark.django_db(transaction=False)
def test_bancada_form_valido():
legislatura = mommy.make(Legislatura)
partido = mommy.make(Partido)
form = forms.BancadaForm(data={'legislatura': str(legislatura.pk),
'nome': 'Nome da Bancada',
'partido': str(partido.pk),
'data_criacao': '10/11/2017',
'data_extincao': '10/12/2017',
'descricao': 'teste'
})
assert form.is_valid()
@pytest.mark.django_db(transaction=False)
def test_bancada_form_datas_invalidas():
legislatura = mommy.make(Legislatura)
partido = mommy.make(Partido)
form = forms.BancadaForm(data={'legislatura': str(legislatura.pk),
'nome': 'Nome da Bancada',
'partido': str(partido.pk),
'data_criacao': '2016-11-01',
'data_extincao': '2016-10-01',
'descricao': 'teste'
})
assert not form.is_valid()
assert form.errors['__all__'] == [_('Data de extinção não pode ser menor '
'que a de criação')]

4
sapl/sessao/views.py

@ -1098,13 +1098,13 @@ class ResumoView(DetailView):
abertura = data_inicio.strftime('%d/%m/%Y') if data_inicio else ''
data_fim = self.object.data_fim
encerramento = data_fim.strftime('%d/%m/%Y') if data_fim else ''
encerramento = data_fim.strftime('%d/%m/%Y') + ' -' if data_fim else ''
context.update({'basica': [
_('Tipo de Sessão: %(tipo)s') % {'tipo': self.object.tipo},
_('Abertura: %(abertura)s - %(hora_inicio)s') % {
'abertura': abertura, 'hora_inicio': self.object.hora_inicio},
_('Encerramento: %(encerramento)s - %(hora_fim)s') % {
_('Encerramento: %(encerramento)s %(hora_fim)s') % {
'encerramento': encerramento, 'hora_fim': self.object.hora_fim}
]})
# =====================================================================

24
sapl/static/styles/compilacao.scss

@ -205,9 +205,8 @@ a:link:after, a:visited:after {
.titulo_generico {
text-align: center;
font-weight: bold;
margin-bottom: 1em;
font-size: 1.5em;
font-size: 1.15em;
margin-top: 3em;
}
@ -229,14 +228,15 @@ a:link:after, a:visited:after {
.capitulo {
@extend .titulo_generico;
margin-top: 1.5em;
font-size: 1.3em;
font-size: 1.15em;
}
.secao {
@extend .titulo_generico;
margin-top: 1.2em;
margin-bottom: 0.7em;
font-size: 1.2em;
font-weight: bold;
font-size: 1.15em;
}
.subsecao,
@ -244,8 +244,8 @@ a:link:after, a:visited:after {
@extend .titulo_generico;
margin-top: 1em;
margin-bottom: 0.6em;
font-size: 1.2em;
font-style: italic;
font-weight: bold;
font-size: 1.15em;
}
.artigo {
@ -281,6 +281,16 @@ a:link:after, a:visited:after {
margin-top: 2px;
}
.assinatura {
margin-top: 0.6em;
font-size: 1.15em;
}
.fecho_lei {
margin-top: 0.6em;
font-size: 1.15em;
}
.bloco_alteracao {
padding-left: 10%;
font-style: italic;
@ -393,7 +403,7 @@ a:link:after, a:visited:after {
.dptt {
clear: left;
& > a {
color: #444444;
color: #000000;
&.nota-alteracao {
color: #02baf2;
font-size: 0.75em;

17
sapl/templates/norma/normajuridica_form.html

@ -24,6 +24,23 @@
for (i = 0; i < fields.length; i++) {
$(fields[i]).change(recuperar_materia);
}
function recuperar_norma() {
var tipo = $("#id_tipo").val()
var ano = $("#id_ano").val()
if (tipo) {
$.get("/norma/recuperar-numero-norma",{tipo: tipo,
ano: ano},
function(data, status) {
$("#id_numero").val(data.numero);
$("#id_ano").val(data.ano);
});
}
}
var fields = ["#id_tipo", "#id_ano"]
for (i = 0; i < fields.length; i++) {
$(fields[i]).change(recuperar_norma);
}
</script>
{% endblock %}

Loading…
Cancel
Save