diff --git a/.gitignore b/.gitignore index 3bf1301ec..429873229 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ __pycache__/ # C extensions *.so +# Nodejs +node_modules/ + # Distribution / packaging .Python env/ diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 992ce558b..7e64c33cd 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -231,7 +231,7 @@ class AutorForm(ModelForm): if 'status_user' in self.Meta.fields: if self.instance.pk and self.instance.user_id: if getattr( - self.instance.user.username, + self.instance.user, get_user_model().USERNAME_FIELD) != cd['username']: if 'status_user' not in cd or not cd['status_user']: raise ValidationError( diff --git a/sapl/base/tests/test_form.py b/sapl/base/tests/test_form.py index 72e5a69e7..35f1c82bf 100644 --- a/sapl/base/tests/test_form.py +++ b/sapl/base/tests/test_form.py @@ -1,3 +1,4 @@ +import pytest from django.utils.translation import ugettext_lazy as _ from sapl.base.forms import CasaLegislativaForm @@ -18,3 +19,23 @@ def test_valida_campos_obrigatorios_casa_legislativa_form(): assert errors['uf'] == [_('Este campo é obrigatório.')] assert len(errors) == 6 + + +@pytest.mark.django_db(transaction=False) +def test_casa_legislativa_form_invalido(): + form = CasaLegislativaForm(data={'codigo': 'codigo', + 'nome': 'nome', + 'sigla': 'sg', + 'endereco': 'endereco', + 'cep': '7000000', + 'municipio': 'municipio', + 'uf': 'uf', + 'telefone': '33333333', + 'fax': '33333333', + 'logotipo': 'image', + 'endereco_web': 'web', + 'email': 'email', + 'informacao_geral': 'informacao_geral' + }) + + assert not form.is_valid() diff --git a/sapl/base/tests/test_view_base.py b/sapl/base/tests/test_view_base.py new file mode 100644 index 000000000..fc61ac160 --- /dev/null +++ b/sapl/base/tests/test_view_base.py @@ -0,0 +1,35 @@ +import pytest +from django.core.urlresolvers import reverse +from django.utils.translation import ugettext_lazy as _ + + +@pytest.mark.django_db(transaction=False) +def test_incluir_casa_legislativa_errors(admin_client): + + response = admin_client.post(reverse('sapl.base:casalegislativa_create'), + {'salvar': 'salvar'}, + follow=True) + + assert (response.context_data['form'].errors['nome'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['sigla'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['endereco'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['cep'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['municipio'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['uf'] == + [_('Este campo é obrigatório.')]) + + +@pytest.mark.django_db(transaction=False) +def test_incluir_tipo_autor_errors(admin_client): + + response = admin_client.post(reverse('sapl.base:tipoautor_create'), + {'salvar': 'salvar'}, + follow=True) + + assert (response.context_data['form'].errors['descricao'] == + [_('Este campo é obrigatório.')]) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 8f3749d0c..d34cf935a 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -17,7 +17,8 @@ from django.db.models import Count, Max from django.db.models.base import ModelBase from sapl.base.models import AppConfig as AppConf -from sapl.base.models import Autor, ProblemaMigracao, TipoAutor +from sapl.base.models import (Autor, CasaLegislativa, ProblemaMigracao, + TipoAutor) from sapl.comissoes.models import Comissao, Composicao, Participacao from sapl.legacy.models import TipoNumeracaoProtocolo from sapl.materia.models import (AcompanhamentoMateria, Proposicao, @@ -208,7 +209,8 @@ def fill_vinculo_norma_juridica(): TipoVinculoNormaJuridica.objects.bulk_create(lista_objs) -def fill_tipo_numeracao_protocolo(): +def fill_dados_basicos(): + # Ajusta sequencia numérica e cria base.AppConfig letra = 'A' try: tipo = TipoNumeracaoProtocolo.objects.latest('dat_inicial_protocolo') @@ -223,6 +225,10 @@ def fill_tipo_numeracao_protocolo(): appconf = AppConf(sequencia_numeracao=letra) appconf.save() + # Cria instância de CasaLegislativa + casa = CasaLegislativa() + casa.save() + # Uma anomalia no sapl 2.5 causa a duplicação de registros de votação. # Essa duplicação deve ser eliminada para que não haja erro no sapl 3.1 @@ -338,7 +344,7 @@ class DataMigrator: '--database=default', '--no-input'], stdout=PIPE) fill_vinculo_norma_juridica() - fill_tipo_numeracao_protocolo() + fill_dados_basicos() info('Começando migração: %s...' % obj) self._do_migrate(obj) diff --git a/sapl/legacy/scripts/migra_dbs.sh b/sapl/legacy/scripts/migra_dbs.sh index 0e52a9483..729e813cb 100755 --- a/sapl/legacy/scripts/migra_dbs.sh +++ b/sapl/legacy/scripts/migra_dbs.sh @@ -3,9 +3,8 @@ # rodar esse script na raiz do projeto if [ $# -eq 2 ]; then - parallel -eta --verbose ./sapl/legacy/scripts/migra_um_db.sh :::: <(mysql -u $1 -p$2 -e 'show databases;' | grep '^sapl_' | grep -v '_copy$') ::: $1 ::: $2 + parallel -eta --verbose -j+0 ./sapl/legacy/scripts/migra_um_db.sh :::: <(mysql -u $1 -p$2 -e 'show databases;' | grep '^sapl_' | grep -v '_copy$') ::: $1 ::: $2 else echo "USO:" - echo " ./sapl/legacy/scripts/migra_dbs.sh [usuário mysql] [senha mysql]" -fi; - + echo " $0 [usuário mysql] [senha mysql]" +fi; \ No newline at end of file diff --git a/sapl/legacy/scripts/recria_dbs_postgres.sh b/sapl/legacy/scripts/recria_dbs_postgres.sh index d84fa4c4d..450a306b4 100755 --- a/sapl/legacy/scripts/recria_dbs_postgres.sh +++ b/sapl/legacy/scripts/recria_dbs_postgres.sh @@ -1,11 +1,11 @@ +#!/bin/bash + # (Re)cria todos os bancos postgres para migração # cria um banco postgres (de mesmo nome) para cada banco mysql cujo nome começa com "sapl_" - if [ $# -eq 2 ]; then - parallel --verbose ./recria_um_db_postgres.sh :::: <(mysql -u $1 -p$2 -e 'show databases;' | grep '^sapl_' | grep -v '_copy$') + parallel --verbose -j+0 ./recria_um_db_postgres.sh :::: <(mysql -u $1 -p$2 -e 'show databases;' | grep '^sapl_' | grep -v '_copy$') else echo "USO:" - echo " ./recria_dbs_postgres.sh [usuário mysql] [senha mysql]" -fi; - + echo " $0 [usuário mysql] [senha mysql]" +fi; \ No newline at end of file diff --git a/sapl/parlamentares/migrations/0010_corrige_data_inicio_mandato.py b/sapl/parlamentares/migrations/0010_corrige_data_inicio_mandato.py index 9cc3cccaf..ae2e83d50 100644 --- a/sapl/parlamentares/migrations/0010_corrige_data_inicio_mandato.py +++ b/sapl/parlamentares/migrations/0010_corrige_data_inicio_mandato.py @@ -1,12 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations -import json -import os -from datetime import timedelta -from django.core.management import call_command +from django.db import migrations def altera_data_inicio_mandato(apps, schema_editor): @@ -16,7 +12,9 @@ def altera_data_inicio_mandato(apps, schema_editor): for mandato in mandatos: data_inicio = mandato.data_inicio_mandato data_inicio_legislatura = mandato.legislatura.data_inicio - days = abs((data_inicio - data_inicio_legislatura).days) + + days = abs((data_inicio - data_inicio_legislatura + ).days) if data_inicio else 60 if days >= 60: mandato.data_inicio_mandato = data_inicio_legislatura @@ -28,8 +26,8 @@ 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. + # nodes in the migration graph). para não ocasionar problemas de migração, + # vamos manter a ordem padrão do django. ('parlamentares', '0009_auto_20170905_1617'), ] diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 9110b9920..3384e4934 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -1,3 +1,4 @@ + from braces.views import FormValidMessageMixin from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin diff --git a/sapl/sessao/tests/test_sessao.py b/sapl/sessao/tests/test_sessao.py index d92f7cabb..ed28bf6ef 100644 --- a/sapl/sessao/tests/test_sessao.py +++ b/sapl/sessao/tests/test_sessao.py @@ -2,9 +2,11 @@ import pytest from django.utils.translation import ugettext_lazy as _ from model_mommy import mommy +from sapl.materia.models import TipoMateriaLegislativa, MateriaLegislativa from sapl.parlamentares.models import Legislatura, Partido, SessaoLegislativa from sapl.sessao import forms -from sapl.sessao.models import SessaoPlenaria, TipoSessaoPlenaria +from sapl.sessao.models import (ExpedienteMateria, SessaoPlenaria, + TipoSessaoPlenaria) def test_valida_campos_obrigatorios_sessao_plenaria_form(): @@ -113,3 +115,25 @@ def test_bancada_form_datas_invalidas(): assert not form.is_valid() assert form.errors['__all__'] == [_('Data de extinção não pode ser menor ' 'que a de criação')] + + +@pytest.mark.django_db(transaction=False) +def test_expediente_materia_form_valido(): + tipo_materia = mommy.make(TipoMateriaLegislativa) + materia = mommy.make(MateriaLegislativa, tipo=tipo_materia) + + sessao = mommy.make(SessaoPlenaria) + + instance = mommy.make(ExpedienteMateria, sessao_plenaria=sessao, + materia=materia) + + form = forms.ExpedienteMateriaForm(data={'data_ordem': '28/12/2009', + 'numero_ordem': 1, + 'tipo_materia': tipo_materia.pk, + 'numero_materia': materia.numero, + 'ano_materia': materia.ano, + 'tipo_votacao': 1, + 'sessao_plenaria': sessao.pk + }, + instance=instance) + assert form.is_valid() diff --git a/sapl/sessao/tests/test_sessao_view.py b/sapl/sessao/tests/test_sessao_view.py new file mode 100644 index 000000000..50a94d970 --- /dev/null +++ b/sapl/sessao/tests/test_sessao_view.py @@ -0,0 +1,49 @@ +import pytest +from django.core.urlresolvers import reverse +from django.utils.translation import ugettext_lazy as _ +from model_mommy import mommy + +from sapl.parlamentares.models import Legislatura, SessaoLegislativa +from sapl.sessao.models import SessaoPlenaria, TipoSessaoPlenaria + + +@pytest.mark.django_db(transaction=False) +def test_incluir_sessao_plenaria_submit(admin_client): + legislatura = mommy.make(Legislatura) + sessao = mommy.make(SessaoLegislativa) + tipo = mommy.make(TipoSessaoPlenaria) + + response = admin_client.post(reverse('sapl.sessao:sessaoplenaria_create'), + {'legislatura': str(legislatura.pk), + 'numero': '1', + 'tipo': str(tipo.pk), + 'sessao_legislativa': str(sessao.pk), + 'data_inicio': '10/11/2017', + 'hora_inicio': '10:10' + }, follow=True) + + assert response.status_code == 200 + + sessao_plenaria = SessaoPlenaria.objects.first() + assert sessao_plenaria.tipo == tipo + + +@pytest.mark.django_db(transaction=False) +def test_incluir_sessao_errors(admin_client): + + response = admin_client.post(reverse('sapl.sessao:sessaoplenaria_create'), + {'salvar': 'salvar'}, + follow=True) + + assert (response.context_data['form'].errors['legislatura'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['sessao_legislativa'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['tipo'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['numero'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['data_inicio'] == + [_('Este campo é obrigatório.')]) + assert (response.context_data['form'].errors['hora_inicio'] == + [_('Este campo é obrigatório.')]) diff --git a/setup.py b/setup.py index e123f703f..8fa9eef5c 100644 --- a/setup.py +++ b/setup.py @@ -10,6 +10,13 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) install_requires = [ 'dj-database-url==0.4.1', + 'django-haystack==2.6.0', + 'django>=1.9,<1.10', + # TODO O django-admin-bootstrapped 2.5.7 não inseriu a mudança que permite + # a compatibilidade com Django 1.9+. A linha abaixo será mudada quando uma + # nova versão do django-admin-bootstrapped for lançada + # 'git+git://github.com/django-admin-bootstrapped/ + # django-admin-bootstrapped.git', 'django-bootstrap3==7.0.1', 'django-bower==5.1.0', 'django-braces==1.9.0', @@ -20,24 +27,29 @@ install_requires = [ 'django-filter==0.15.3', 'django-floppyforms==1.6.2', 'django-model-utils==2.5', - 'django-sass-processor==0.4.6', - 'django>=1.9,<1.10', + 'django-sass-processor==0.5.4', 'djangorestframework', + 'drfdocs', 'easy-thumbnails==2.3', + # 'git+git://github.com/interlegis/trml2pdf.git', 'libsass==0.11.1', 'psycopg2==2.6.2', 'python-decouple==3.0', 'pytz==2016.4', 'pyyaml==3.11', 'rtyaml==0.0.3', + 'textract==1.5.0', 'unipath==1.1', + 'pysolr==3.6.0', 'python-magic==0.4.12', 'gunicorn==19.6.0', - # git+git://github.com/interlegis/trml2pdf.git + 'django-reversion==2.0.8', + 'WeasyPrint==0.30', + 'whoosh==2.7.4' ] setup( name='interlegis-sapl', - version='3.1.1-alpha', + version='3.1.24-BETA', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',