diff --git a/.travis.yml b/.travis.yml index 9d469a9b4..d3ba4e10e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,45 +1,23 @@ language: python -sudo: required python: - - "3.4.3" + - 3.4.3 + services: - postgresql -addons: - postgresql: "9.3" - install: - - sudo apt-get install git nginx python3-dev libpq-dev graphviz-dev graphviz pkg-config python-psycopg2 nodejs npm - - sudo ln -s /usr/bin/node - pip install -r requirements/test-requirements.txt - - pip install --upgrade setuptools - -# Line 24 to 35 is a hack found in this link below -# It was used to fix an error in database building -# https://dockyard.com/blog/ruby/2013/03/29/running-postgresql-9-2-on-travis-ci before_script: - - sudo /etc/init.d/postgresql stop - - sudo cp /etc/postgresql/9.2/main/pg_hba.conf ./ - - sudo apt-get remove postgresql postgresql-9.2 -qq --purge - - source /etc/lsb-release - - echo "deb http://apt.postgresql.org/pub/repos/apt/ $DISTRIB_CODENAME-pgdg main" > pgdg.list - - sudo mv pgdg.list /etc/apt/sources.list.d/ - - wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add - - - sudo apt-get update - - sudo apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confnew" install postgresql-9.3 postgresql-contrib-9.3 -qq - - sudo /etc/init.d/postgresql stop - - sudo cp ./pg_hba.conf /etc/postgresql/9.3/main - - sudo /etc/init.d/postgresql start - npm install -g bower - - cp .env_dev .env - - sed -i -e 's/getpass.getuser()/"postgres"/g' sapl/settings.py - - psql -c 'create database sapl;' -U postgres + - cp sapl/.env_test sapl/.env + - psql -c "CREATE USER sapl WITH PASSWORD 'sapl'" -U postgres; + - psql -c "CREATE DATABASE sapl OWNER sapl;" -U postgres script: - ./manage.py migrate - ./manage.py bower install - - pip freeze - - ./test_and_check_qa.sh \ No newline at end of file + - py.test + # - ./test_and_check_qa.sh \ No newline at end of file diff --git a/README.rst b/README.rst index 9770c0015..67d1e84db 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,5 @@ -.. image:: https://badge.waffle.io/interlegis/sapl.png?label=ready&title=Ready - :target: https://waffle.io/interlegis/sapl - :alt: 'Stories in Ready' +.. image:: https://travis-ci.org/interlegis/sapl.svg?branch=master + :target: https://travis-ci.org/interlegis/sapl *********************************************** SAPL - Sistema de Apoio ao Processo Legislativo @@ -246,18 +245,18 @@ Boas Práticas * Em caso de Implementação de modelo que envolva a classe ``django.contrib.auth.models.User``, não a use diretamente, use para isso a função ``get_settings_auth_user_model()`` de ``sapl.utils``. Exemplo: - - no lugar de ``owner = models.ForeignKey(User, ... )`` - - use ``owner = models.ForeignKey(get_settings_auth_user_model(), ... )`` + - no lugar de ``owner = models.ForeignKey(User, ... )`` + - use ``owner = models.ForeignKey(get_settings_auth_user_model(), ... )`` - Não use em qualquer modelagem futura, ``ForeignKey`` com ``User`` ou mesmo ``settings.AUTH_USER_MODEL`` sem o import correto que não é o do projeto e sim o que está em ``sapl.utils``, ou seja (``from django.conf import settings``) - - em https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#referencing-the-user-model é explicado por que ser dessa forma! + - em https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#referencing-the-user-model é explicado por que ser dessa forma! - Já em qualquer uso em implementação de execução, ao fazer uma query, por exemplo: - não use ``django.contrib.auth.models.User`` para utilizar as caracteristicas do model, para isso, use esta função: django.contrib.auth.get_user_model() - - Seguir esses passos simplificará qualquer customização futura que venha a ser feita na autenticação do usuários ao evitar correções de inúmeros import's e ainda, desta forma, torna a funcionalidade de autenticação reimplementável por qualquer outro projeto que venha usar partes ou o todo do SAPL. + - Seguir esses passos simplificará qualquer customização futura que venha a ser feita na autenticação do usuários ao evitar correções de inúmeros import's e ainda, desta forma, torna a funcionalidade de autenticação reimplementável por qualquer outro projeto que venha usar partes ou o todo do SAPL. Atenção: diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 44ef147c0..9c8faaa2d 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,4 +1,5 @@ dj-database-url==0.4.1 +django==1.9.7 django-admin-bootstrapped==2.5.7 django-bootstrap3==7.0.1 django-bower==5.1.0 @@ -10,8 +11,7 @@ django-extra-views==0.8.0 django-filter==0.13.0 django-floppyforms==1.6.2 django-model-utils==2.5 -django-sass-processor==0.4.0 -django==1.9.7 +django-sass-processor==0.4.6 djangorestframework easy-thumbnails==2.3 git+git://github.com/interlegis/trml2pdf.git diff --git a/.env_dev b/sapl/.env_test similarity index 100% rename from .env_dev rename to sapl/.env_test diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py index c6c4437a6..40f6b01e4 100644 --- a/sapl/crispy_layout_mixin.py +++ b/sapl/crispy_layout_mixin.py @@ -1,12 +1,12 @@ from math import ceil -import rtyaml from crispy_forms.bootstrap import FormActions from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit from django import template from django.utils import formats from django.utils.translation import ugettext as _ +import rtyaml def heads_and_tails(list_of_lists): @@ -50,8 +50,9 @@ class SaplFormLayout(Layout): def get_field_display(obj, fieldname): field = obj._meta.get_field(fieldname) - verbose_name = str(field.verbose_name) - if field.choices: + verbose_name = str(field.verbose_name)\ + if hasattr(field, 'verbose_name') else '' + if hasattr(field, 'choices') and field.choices: value = getattr(obj, 'get_%s_display' % fieldname)() else: value = getattr(obj, fieldname) @@ -74,6 +75,14 @@ def get_field_display(obj, fieldname): value.name.split('/')[-1:][0]) else: display = '' + elif 'ManyRelatedManager' in str(type(value))\ + or 'RelatedManager' in str(type(value)): + display = '' + if not verbose_name: + verbose_name = str(field.related_model._meta.verbose_name_plural) else: display = str(value) return verbose_name, display @@ -147,7 +156,9 @@ class CrispyLayoutFormMixin: def read_yaml_from_file(yaml_layout): # TODO cache this at application level t = template.loader.get_template(yaml_layout) - rendered = t.render() + # aqui é importante converter para str pois, dependendo do ambiente, + # o rtyaml pode usar yaml.CSafeLoader, que exige str ou stream + rendered = str(t.render()) return rtyaml.load(rendered) diff --git a/sapl/static/styles/app.scss b/sapl/static/styles/app.scss index e4163a499..901f7286c 100644 --- a/sapl/static/styles/app.scss +++ b/sapl/static/styles/app.scss @@ -131,13 +131,11 @@ body { } } - fieldset { - fieldset { font-size: 95%; legend { font-size: 18px; } } -} \ No newline at end of file +}