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. 2
      sapl/base/tests/teststub_urls.py
  4. 16
      sapl/compilacao/compilacao_data_tables.sql
  5. 2
      sapl/compilacao/models.py
  6. 42
      sapl/compilacao/tests/test_tipo_texto_articulado_form.py
  7. 7
      sapl/compilacao/views.py
  8. 361
      sapl/materia/fixtures/pre_popula_status_tramitacao.json
  9. 44
      sapl/materia/migrations/0013_adiciona_status_tramitacao.py
  10. 6
      sapl/norma/forms.py
  11. 24
      sapl/norma/migrations/0007_auto_20170904_1708.py
  12. 3
      sapl/norma/models.py
  13. 23
      sapl/norma/tests/test_norma.py
  14. 5
      sapl/norma/urls.py
  15. 21
      sapl/norma/views.py
  16. 37
      sapl/parlamentares/fixtures/pre_popula_cargosmesa.json
  17. 282
      sapl/parlamentares/fixtures/pre_popula_partidos.json
  18. 12
      sapl/parlamentares/forms.py
  19. 19
      sapl/parlamentares/migrations/0006_auto_20170831_1400.py
  20. 40
      sapl/parlamentares/migrations/0007_adiciona_partidos.py
  21. 41
      sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py
  22. 4
      sapl/parlamentares/models.py
  23. 39
      sapl/parlamentares/tests/test_parlamentares.py
  24. 21
      sapl/protocoloadm/tests/test_protocoloadm.py
  25. 5
      sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
  26. 5
      sapl/relatorios/views.py
  27. 61
      sapl/sessao/tests/test_sessao.py
  28. 4
      sapl/sessao/views.py
  29. 24
      sapl/static/styles/compilacao.scss
  30. 17
      sapl/templates/norma/normajuridica_form.html
  31. 4
      sapl/test_urls.py

2
docker-compose.yml

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

2
sapl/base/tests/teststub_urls.py

@ -5,5 +5,5 @@ from sapl.urls import urlpatterns as original_patterns
urlpatterns = original_patterns + patterns('', url(r'^zzzz$', urlpatterns = original_patterns + patterns('', url(r'^zzzz$',
TemplateView.as_view( TemplateView.as_view(
template_name='index.html'), template_name='index.html'),
name='zzzz')) name='zzzz'))

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 (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 (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 (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 (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 (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 (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 (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 (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;&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 (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 (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 (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 (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;&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 (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 (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); 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 from datetime import datetime
import reversion
from django.contrib import messages from django.contrib import messages
from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType 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.decorators import classonlymethod
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import reversion
from sapl.compilacao.utils import (get_integrations_view_names, int_to_letter, from sapl.compilacao.utils import (get_integrations_view_names, int_to_letter,
int_to_roman) 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 import pytest
from django.utils.translation import ugettext as _
from model_mommy import mommy
from sapl.compilacao import forms 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 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 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 logging
import sys import sys
from collections import OrderedDict
from datetime import timedelta
from braces.views import FormMessagesMixin from braces.views import FormMessagesMixin
from django import forms 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.shortcuts import get_object_or_404, redirect
from django.utils.dateparse import parse_date from django.utils.dateparse import parse_date
from django.utils.encoding import force_text 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 ugettext_lazy as _
from django.utils.translation import string_concat
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.views.generic.edit import (CreateView, DeleteView, FormView, 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.crud.base import Crud, CrudListView, make_pagination
from sapl.settings import BASE_DIR from sapl.settings import BASE_DIR
TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota') TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota')
TipoVideCrud = Crud.build(TipoVide, 'tipo_vide') TipoVideCrud = Crud.build(TipoVide, 'tipo_vide')
TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao') 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),
]

6
sapl/norma/forms.py

@ -133,9 +133,9 @@ class NormaJuridicaForm(ModelForm):
ano=cleaned_data['ano_materia']) ano=cleaned_data['ano_materia'])
except ObjectDoesNotExist: except ObjectDoesNotExist:
raise forms.ValidationError( raise forms.ValidationError(
_("Matéria %s/%s é inexistente." % ( _("Matéria %s/%s é inexistente." % (
self.cleaned_data['numero_materia'], self.cleaned_data['numero_materia'],
self.cleaned_data['ano_materia']))) self.cleaned_data['ano_materia'])))
else: else:
cleaned_data['materia'] = materia cleaned_data['materia'] = materia

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

23
sapl/norma/tests/test_norma.py

@ -1,11 +1,13 @@
import pytest import pytest
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy from model_mommy import mommy
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
from sapl.norma.forms import (NormaJuridicaForm,) from sapl.norma.forms import NormaJuridicaForm, NormaRelacionadaForm
from sapl.norma.models import NormaJuridica, TipoNormaJuridica from sapl.norma.models import (NormaJuridica, TipoNormaJuridica)
@pytest.mark.django_db(transaction=False) @pytest.mark.django_db(transaction=False)
@ -96,7 +98,6 @@ def test_norma_juridica_materia_inexistente():
@pytest.mark.django_db(transaction=False) @pytest.mark.django_db(transaction=False)
def test_norma_juridica_materia_existente(): def test_norma_juridica_materia_existente():
tipo = mommy.make(TipoNormaJuridica) tipo = mommy.make(TipoNormaJuridica)
tipo_materia = mommy.make(TipoMateriaLegislativa) tipo_materia = mommy.make(TipoMateriaLegislativa)
materia = mommy.make(MateriaLegislativa, materia = mommy.make(MateriaLegislativa,
@ -115,3 +116,19 @@ def test_norma_juridica_materia_existente():
'ano_materia': '2017' 'ano_materia': '2017'
}) })
assert form.is_valid() 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, from sapl.norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView,
NormaRelacionadaCrud, NormaTaView, TipoNormaCrud, NormaRelacionadaCrud, NormaTaView, TipoNormaCrud,
TipoVinculoNormaJuridicaCrud, recuperar_norma) TipoVinculoNormaJuridicaCrud, recuperar_norma,
recuperar_numero_norma)
from .apps import AppConfig from .apps import AppConfig
@ -25,5 +26,7 @@ urlpatterns = [
NormaPesquisaView.as_view(), name='norma_pesquisa'), NormaPesquisaView.as_view(), name='norma_pesquisa'),
url(r'^norma/recuperar-norma$', recuperar_norma, name="recuperar_norma"), 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.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import JsonResponse from django.http import JsonResponse
@ -145,6 +146,7 @@ class NormaCrud(Crud):
def layout_key(self): def layout_key(self):
return 'NormaJuridicaCreate' return 'NormaJuridicaCreate'
class ListView(Crud.ListView, RedirectView): class ListView(Crud.ListView, RedirectView):
def get_redirect_url(self, *args, **kwargs): def get_redirect_url(self, *args, **kwargs):
@ -185,3 +187,22 @@ def recuperar_norma(request):
response = JsonResponse({'ementa': '', 'id': 0}) response = JsonResponse({'ementa': '', 'id': 0})
return response 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"
}
}
]

12
sapl/parlamentares/forms.py

@ -72,16 +72,16 @@ class MandatoForm(ModelForm):
data_inicio_mandato = data['data_inicio_mandato'] data_inicio_mandato = data['data_inicio_mandato']
if data_inicio_mandato: if data_inicio_mandato:
if (data_inicio_mandato < legislatura.data_inicio or if (data_inicio_mandato < legislatura.data_inicio or
data_inicio_mandato > legislatura.data_fim): data_inicio_mandato > legislatura.data_fim):
raise ValidationError(_("Data início mandato fora do intervalo " raise ValidationError(_("Data início mandato fora do intervalo"
"de legislatura informada")) " de legislatura informada"))
data_fim_mandato = data['data_fim_mandato'] data_fim_mandato = data['data_fim_mandato']
if data_fim_mandato: if data_fim_mandato:
if (data_fim_mandato < legislatura.data_inicio or if (data_fim_mandato < legislatura.data_inicio or
data_fim_mandato > legislatura.data_fim): data_fim_mandato > legislatura.data_fim):
raise ValidationError(_("Data fim mandato fora do intervalo de " raise ValidationError(_("Data fim mandato fora do intervalo de"
"legislatura informada")) " legislatura informada"))
existe_mandato = Mandato.objects.filter( existe_mandato = Mandato.objects.filter(
parlamentar=data['parlamentar'], 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) max_length=30, null=True, blank=True)
class Meta: class Meta:
verbose_name = _('Usuário') verbose_name = _('Usuário Votante')
verbose_name_plural = _('Usuários') verbose_name_plural = _('Usuários Votantes')
permissions = ( permissions = (
('can_vote', _('Can Vote')), ('can_vote', _('Can Vote')),
) )

39
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 django.utils.translation import ugettext_lazy as _
from model_mommy import mommy 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, from sapl.parlamentares.models import (Dependente, Filiacao, Legislatura,
Mandato, Parlamentar, Partido, Mandato, Parlamentar, Partido,
TipoDependente) TipoDependente)
@ -181,7 +181,9 @@ def test_mandato_form_duplicado():
assert not form.is_valid() 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) @pytest.mark.django_db(transaction=False)
def test_mandato_form_datas_invalidas(): def test_mandato_form_datas_invalidas():
@ -230,13 +232,14 @@ def test_legislatura_form_invalido():
assert len(errors) == 4 assert len(errors) == 4
def test_legislatura_form_datas_invalidas(): def test_legislatura_form_datas_invalidas():
legislatura_form = LegislaturaForm(data={'numero': '1', legislatura_form = LegislaturaForm(data={'numero': '1',
'data_inicio': '2017-02-01', 'data_inicio': '2017-02-01',
'data_fim': '2021-12-31', 'data_fim': '2021-12-31',
'data_eleicao': '2017-02-01' 'data_eleicao': '2017-02-01'
}) })
assert not legislatura_form.is_valid() assert not legislatura_form.is_valid()
@ -248,9 +251,37 @@ def test_legislatura_form_datas_invalidas():
'data_inicio': '2017-02-01', 'data_inicio': '2017-02-01',
'data_fim': '2017-01-01', 'data_fim': '2017-01-01',
'data_eleicao': '2016-11-01' 'data_eleicao': '2016-11-01'
}) })
assert not legislatura_form.is_valid() assert not legislatura_form.is_valid()
assert legislatura_form.errors['__all__'] == \ assert legislatura_form.errors['__all__'] == \
[_("Intervalo de início e fim inválido para legislatura.")] [_("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()

21
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 django.utils.translation import ugettext_lazy as _
from model_mommy import mommy from model_mommy import mommy
from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao) from sapl.materia.models import UnidadeTramitacao
from sapl.protocoloadm.forms import (AnularProcoloAdmForm, from sapl.protocoloadm.forms import (AnularProcoloAdmForm,
DocumentoAdministrativoForm, DocumentoAdministrativoForm,
MateriaLegislativa,
ProtocoloDocumentForm, ProtocoloDocumentForm,
ProtocoloMateriaForm,) ProtocoloMateriaForm)
from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo,
StatusTramitacaoAdministrativo, StatusTramitacaoAdministrativo,
TipoDocumentoAdministrativo, TipoDocumentoAdministrativo,
@ -258,7 +259,6 @@ def test_create_tramitacao(admin_client):
@pytest.mark.django_db(transaction=False) @pytest.mark.django_db(transaction=False)
def test_anular_protocolo_dados_invalidos(): def test_anular_protocolo_dados_invalidos():
protocolo = mommy.make(Protocolo, pk=1, numero=1, ano=2017)
form = AnularProcoloAdmForm(data={}) form = AnularProcoloAdmForm(data={})
@ -300,6 +300,7 @@ def test_anular_protocolo_form_anula_protocolo_anulado():
assert form.errors['__all__'] == [_( assert form.errors['__all__'] == [_(
'Protocolo 1/2017 já encontra-se anulado')] 'Protocolo 1/2017 já encontra-se anulado')]
@pytest.mark.django_db(transaction=False) @pytest.mark.django_db(transaction=False)
def test_anular_protocolo_form_anula_protocolo_com_doc_vinculado(): def test_anular_protocolo_form_anula_protocolo_com_doc_vinculado():
tipo_materia = mommy.make(TipoMateriaLegislativa) tipo_materia = mommy.make(TipoMateriaLegislativa)
@ -323,14 +324,15 @@ def test_anular_protocolo_form_anula_protocolo_com_doc_vinculado():
assert form.errors['__all__'] == \ assert form.errors['__all__'] == \
[_("Protocolo 1/2017 não pode ser removido pois existem " [_("Protocolo 1/2017 não pode ser removido pois existem "
"documentos vinculados a ele.")] "documentos vinculados a ele.")]
tipo_documento = mommy.make(TipoDocumentoAdministrativo) tipo_documento = mommy.make(TipoDocumentoAdministrativo)
protocolo_documento = mommy.make(Protocolo, protocolo_documento = mommy.make(Protocolo,
numero=2, numero=2,
ano=2017, ano=2017,
tipo_documento=tipo_documento, tipo_documento=tipo_documento,
anulado=False) anulado=False)
documento_administrativo = mommy.make(DocumentoAdministrativo, documento_administrativo = mommy.make(DocumentoAdministrativo,
protocolo=protocolo_documento) protocolo=protocolo_documento)
@ -344,7 +346,7 @@ def test_anular_protocolo_form_anula_protocolo_com_doc_vinculado():
assert form.errors['__all__'] == \ assert form.errors['__all__'] == \
[_("Protocolo 2/2017 não pode ser removido pois existem " [_("Protocolo 2/2017 não pode ser removido pois existem "
"documentos vinculados a ele.")] "documentos vinculados a ele.")]
def test_documento_administrativo_invalido(): def test_documento_administrativo_invalido():
@ -397,6 +399,7 @@ def test_protocolo_documento_form_invalido():
assert len(errors) == 5 assert len(errors) == 5
def test_protocolo_materia_invalido(): def test_protocolo_materia_invalido():
form = ProtocoloMateriaForm(data={}) 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' nom_sessao + '</para>\n'
tmp += '\t\t<para style="P2" spaceAfter="5"><b>Abertura: </b> ' + \ tmp += '\t\t<para style="P2" spaceAfter="5"><b>Abertura: </b> ' + \
dat_inicio_sessao + ' <b>- </b> ' + hr_inicio_sessao + '</para>\n' 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> ' + \ 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 return tmp

5
sapl/relatorios/views.py

@ -693,8 +693,9 @@ def get_sessao_plenaria(sessao, casa):
if tramitacao.turno == turno[0]: if tramitacao.turno == turno[0]:
dic_votacao["des_turno"] = turno[1] dic_votacao["des_turno"] = turno[1]
dic_votacao["txt_ementa"] = materia.ementa # https://github.com/interlegis/sapl/issues/1009
dic_votacao["ordem_observacao"] = votacao.observacao dic_votacao["txt_ementa"] = html.unescape(materia.ementa)
dic_votacao["ordem_observacao"] = html.unescape(votacao.observacao)
dic_votacao["nom_autor"] = ' ' dic_votacao["nom_autor"] = ' '
autoria = Autoria.objects.filter( 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 django.utils.translation import ugettext_lazy as _
from model_mommy import mommy 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 import forms
from sapl.sessao.models import SessaoPlenaria, TipoSessaoPlenaria from sapl.sessao.models import SessaoPlenaria, TipoSessaoPlenaria
@ -14,12 +14,12 @@ def test_valida_campos_obrigatorios_sessao_plenaria_form():
errors = form.errors errors = form.errors
assert errors['legislatura'] == ['Este campo é obrigatório.'] assert errors['legislatura'] == [_('Este campo é obrigatório.')]
assert errors['sessao_legislativa'] == ['Este campo é obrigatório.'] assert errors['sessao_legislativa'] == [_('Este campo é obrigatório.')]
assert errors['tipo'] == ['Este campo é obrigatório.'] assert errors['tipo'] == [_('Este campo é obrigatório.')]
assert errors['numero'] == ['Este campo é obrigatório.'] assert errors['numero'] == [_('Este campo é obrigatório.')]
assert errors['data_inicio'] == ['Este campo é obrigatório.'] assert errors['data_inicio'] == [_('Este campo é obrigatório.')]
assert errors['hora_inicio'] == ['Este campo é obrigatório.'] assert errors['hora_inicio'] == [_('Este campo é obrigatório.')]
assert len(errors) == 6 assert len(errors) == 6
@ -66,3 +66,50 @@ def test_numero_duplicado_sessao_plenaria_form():
"para a Legislatura, Sessão Legislativa " "para a Legislatura, Sessão Legislativa "
"e Tipo informados. Favor escolher um " "e Tipo informados. Favor escolher um "
"número distinto."] "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 '' abertura = data_inicio.strftime('%d/%m/%Y') if data_inicio else ''
data_fim = self.object.data_fim 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': [ context.update({'basica': [
_('Tipo de Sessão: %(tipo)s') % {'tipo': self.object.tipo}, _('Tipo de Sessão: %(tipo)s') % {'tipo': self.object.tipo},
_('Abertura: %(abertura)s - %(hora_inicio)s') % { _('Abertura: %(abertura)s - %(hora_inicio)s') % {
'abertura': abertura, 'hora_inicio': self.object.hora_inicio}, '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} '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 { .titulo_generico {
text-align: center; text-align: center;
font-weight: bold;
margin-bottom: 1em; margin-bottom: 1em;
font-size: 1.5em; font-size: 1.15em;
margin-top: 3em; margin-top: 3em;
} }
@ -229,14 +228,15 @@ a:link:after, a:visited:after {
.capitulo { .capitulo {
@extend .titulo_generico; @extend .titulo_generico;
margin-top: 1.5em; margin-top: 1.5em;
font-size: 1.3em; font-size: 1.15em;
} }
.secao { .secao {
@extend .titulo_generico; @extend .titulo_generico;
margin-top: 1.2em; margin-top: 1.2em;
margin-bottom: 0.7em; margin-bottom: 0.7em;
font-size: 1.2em; font-weight: bold;
font-size: 1.15em;
} }
.subsecao, .subsecao,
@ -244,8 +244,8 @@ a:link:after, a:visited:after {
@extend .titulo_generico; @extend .titulo_generico;
margin-top: 1em; margin-top: 1em;
margin-bottom: 0.6em; margin-bottom: 0.6em;
font-size: 1.2em; font-weight: bold;
font-style: italic; font-size: 1.15em;
} }
.artigo { .artigo {
@ -281,6 +281,16 @@ a:link:after, a:visited:after {
margin-top: 2px; margin-top: 2px;
} }
.assinatura {
margin-top: 0.6em;
font-size: 1.15em;
}
.fecho_lei {
margin-top: 0.6em;
font-size: 1.15em;
}
.bloco_alteracao { .bloco_alteracao {
padding-left: 10%; padding-left: 10%;
font-style: italic; font-style: italic;
@ -393,7 +403,7 @@ a:link:after, a:visited:after {
.dptt { .dptt {
clear: left; clear: left;
& > a { & > a {
color: #444444; color: #000000;
&.nota-alteracao { &.nota-alteracao {
color: #02baf2; color: #02baf2;
font-size: 0.75em; font-size: 0.75em;

17
sapl/templates/norma/normajuridica_form.html

@ -24,6 +24,23 @@
for (i = 0; i < fields.length; i++) { for (i = 0; i < fields.length; i++) {
$(fields[i]).change(recuperar_materia); $(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> </script>
{% endblock %} {% endblock %}

4
sapl/test_urls.py

@ -173,7 +173,7 @@ apps_url_patterns_prefixs_and_users = {
'/ta', '/ta',
]}, ]},
'redireciona_urls': { 'redireciona_urls': {
'prefixs': [ 'prefixs': [
'/default_index_html', '/default_index_html',
'/consultas/parlamentar/parlamentar_', '/consultas/parlamentar/parlamentar_',
'/consultas/comissao/comissao_', '/consultas/comissao/comissao_',
@ -192,7 +192,7 @@ apps_url_patterns_prefixs_and_users = {
'/presencaSessao', '/presencaSessao',
'/resumoPropositurasAutor', '/resumoPropositurasAutor',
'/propositurasAnoAutorTipo', '/propositurasAnoAutorTipo',
]}, ]},
'lexml': { 'lexml': {
'prefixs': [ 'prefixs': [
'/lexml', '/lexml',

Loading…
Cancel
Save