mirror of https://github.com/interlegis/sapl.git
				
				
			
				 16 changed files with 383 additions and 421 deletions
			
			
		| @ -1,45 +1,23 @@ | |||||
| language: python | language: python | ||||
| sudo: required |  | ||||
| 
 | 
 | ||||
| python: | python: | ||||
|   - "3.4.3" |   - 3.4.3 | ||||
|  | 
 | ||||
| 
 | 
 | ||||
| services: | services: | ||||
|   - postgresql |   - postgresql | ||||
| 
 | 
 | ||||
| addons: |  | ||||
|   postgresql: "9.3" |  | ||||
| 
 |  | ||||
| install: | 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 -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: | 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 |   - npm install -g bower | ||||
|   - cp .env_dev .env |   - cp sapl/.env_test sapl/.env | ||||
|   - sed -i -e 's/getpass.getuser()/"postgres"/g' sapl/settings.py |   - psql -c "CREATE USER sapl WITH PASSWORD 'sapl'" -U postgres; | ||||
|   - psql -c 'create database sapl;' -U postgres |   - psql -c "CREATE DATABASE sapl OWNER sapl;" -U postgres | ||||
| 
 | 
 | ||||
| script: | script: | ||||
|   - ./manage.py migrate |   - ./manage.py migrate | ||||
|   - ./manage.py bower install |   - ./manage.py bower install | ||||
|   - pip freeze |   - py.test | ||||
|   - ./test_and_check_qa.sh |   # - ./test_and_check_qa.sh | ||||
| @ -1,188 +1,114 @@ | |||||
|  | from django.apps import apps | ||||
| from django.contrib.auth.models import Group, Permission, User | from django.contrib.auth.models import Group, Permission, User | ||||
| from django.contrib.contenttypes.models import ContentType | from django.contrib.contenttypes.models import ContentType | ||||
| 
 | 
 | ||||
| 
 | 
 | ||||
| def cria_grupos_permissoes(): | def cria_ou_reseta_grupo(nome): | ||||
| 
 |     grupo = Group.objects.get_or_create(name=nome)[0] | ||||
|     if not Group.objects.filter("Teste"): |     for p in list(grupo.permissions.all()): | ||||
|         pass |         grupo.permissions.remove(p) | ||||
| 
 |     return grupo | ||||
|     # Cria todos os grupos necessários para a aplicação |  | ||||
| 
 |  | ||||
|     op_geral = Group.objects.get_or_create(name="Operador Geral") |  | ||||
|     op_prot = Group.objects.get_or_create(name="Operador de Protocolo") |  | ||||
|     op_sessao = Group.objects.get_or_create(name="Operador de Sessão") |  | ||||
|     op_comissao = Group.objects.get_or_create(name="Operador de Comissão") |  | ||||
|     op_adm = Group.objects.get_or_create(name="Operador de Administração") |  | ||||
|     op_norma = Group.objects.get_or_create(name="Operador de Norma Jurídica") |  | ||||
|     op_materia = Group.objects.get_or_create( |  | ||||
|         name="Operador de Matéria Legislativa") |  | ||||
|     op_painel = Group.objects.get_or_create(name="Operador de Painel") |  | ||||
|     op_autor = Group.objects.get_or_create(name="Autor") |  | ||||
| 
 |  | ||||
|     op_geral = op_geral[0] |  | ||||
|     op_prot = op_prot[0] |  | ||||
|     op_sessao = op_sessao[0] |  | ||||
|     op_comissao = op_comissao[0] |  | ||||
|     op_adm = op_adm[0] |  | ||||
|     op_norma = op_norma[0] |  | ||||
|     op_materia = op_materia[0] |  | ||||
|     op_painel = op_painel[0] |  | ||||
|     op_autor = op_autor[0] |  | ||||
| 
 |  | ||||
|     # Base |  | ||||
| 
 |  | ||||
|     permissao_add_cl = Permission.objects.get( |  | ||||
|         name="Can add Casa Legislativa") |  | ||||
|     permissao_edit_cl = Permission.objects.get( |  | ||||
|         name="Can change Casa Legislativa") |  | ||||
|     permissao_remove_cl = Permission.objects.get( |  | ||||
|         name="Can delete Casa Legislativa") |  | ||||
| 
 |  | ||||
|     permissoes_base = [permissao_add_cl, |  | ||||
|                        permissao_edit_cl, |  | ||||
|                        permissao_remove_cl] |  | ||||
| 
 | 
 | ||||
|     # Comissao |  | ||||
| 
 | 
 | ||||
|     cts = ContentType.objects.filter(app_label='comissoes') | def cria_usuario(nome, grupo): | ||||
|     perms_comissoes = list(Permission.objects.filter(content_type__in=cts)) |     nome_usuario = nome | ||||
|  |     usuario = User.objects.get_or_create(username=nome_usuario)[0] | ||||
|  |     usuario.set_password('interlegis') | ||||
|  |     usuario.save() | ||||
|  |     grupo.user_set.add(usuario) | ||||
| 
 | 
 | ||||
|     # Materia |  | ||||
| 
 | 
 | ||||
|     cts = ContentType.objects.filter(app_label='materia') | def cria_grupos_permissoes(): | ||||
|     perms_materia = list(Permission.objects.filter(content_type__in=cts)) |  | ||||
| 
 |  | ||||
|     # Norma |  | ||||
| 
 |  | ||||
|     cts = ContentType.objects.filter(app_label='norma') |  | ||||
|     perms_norma = list(Permission.objects.filter(content_type__in=cts)) |  | ||||
| 
 |  | ||||
|     # Painel |  | ||||
| 
 |  | ||||
|     cts = ContentType.objects.filter(app_label='painel') |  | ||||
|     perms_painel = list(Permission.objects.filter(content_type__in=cts)) |  | ||||
| 
 |  | ||||
|     # Parlamentares |  | ||||
| 
 | 
 | ||||
|     cts = ContentType.objects.filter(app_label='parlamentares') |     nomes_apps = ['base', 'parlamentares', 'comissoes', | ||||
|     perms_parlamentares = list(Permission.objects.filter(content_type__in=cts)) |                   'materia', 'norma', 'sessao', 'painel'] | ||||
| 
 | 
 | ||||
|     # ProtocoloADM e DOCADM |     permissoes = {app: list(Permission.objects.filter( | ||||
|  |         content_type__in=ContentType.objects.filter(app_label=app))) | ||||
|  |         for app in nomes_apps} | ||||
| 
 | 
 | ||||
|  |     # permissoes específicas para protocolo e documento administrativo | ||||
|     cts = ContentType.objects.filter(app_label='protocoloadm') |     cts = ContentType.objects.filter(app_label='protocoloadm') | ||||
| 
 | 
 | ||||
|     perms_docadm = list(Permission.objects.filter(content_type__in=cts)) |     # documento administrativo | ||||
| 
 |     permissoes['documento_administrativo'] = list( | ||||
|     cts_exc1 = cts.filter(model__icontains='tramitacao') |         Permission.objects.filter(content_type__in=cts)) | ||||
|     cts_exc2 = cts.filter(model__icontains='documentoadministrativo') |     nome_grupo = 'Operador Administrativo' | ||||
| 
 |     grupo = cria_ou_reseta_grupo(nome_grupo) | ||||
|     cts = cts.exclude(id__in=[o.id for o in cts_exc1]) |     for p in permissoes['documento_administrativo']: | ||||
|     cts = cts.exclude(id__in=[o.id for o in cts_exc2]) |         grupo.permissions.add(p) | ||||
| 
 | 
 | ||||
|     perms_protocoloadm = list(Permission.objects.filter(content_type__in=cts)) |     nome_usuario = 'operador_administrativo' | ||||
| 
 |     cria_usuario(nome_usuario, grupo) | ||||
|     # Sessao | 
 | ||||
| 
 |     # prolocolo administrativo | ||||
|     cts = ContentType.objects.filter(app_label='sessao') |     cts = cts.exclude(model__icontains='tramitacao').exclude( | ||||
|     perms_sessao = list(Permission.objects.filter(content_type__in=cts)) |         model__icontains='documentoadministrativo') | ||||
| 
 |     permissoes['protocoloadm'] = list( | ||||
|     # Painel |         Permission.objects.filter(content_type__in=cts)) | ||||
| 
 |     nome_grupo = 'Operador de Protocolo Administrativo' | ||||
|     cts = ContentType.objects.filter(app_label='painel') |     grupo = cria_ou_reseta_grupo(nome_grupo) | ||||
|     perms_painel = list(Permission.objects.filter(content_type__in=cts)) |     for p in permissoes['protocoloadm']: | ||||
|  |         grupo.permissions.add(p) | ||||
|  | 
 | ||||
|  |     nome_usuario = 'operador_protocoloadm' | ||||
|  |     cria_usuario(nome_usuario, grupo) | ||||
|  | 
 | ||||
|  |     # permissoes do base | ||||
|  |     cts = ContentType.objects.filter(app_label='base') | ||||
|  |     permissoes['base'] = list( | ||||
|  |         Permission.objects.filter(content_type__in=cts)) | ||||
|  | 
 | ||||
|  |     for nome_app in nomes_apps: | ||||
|  | 
 | ||||
|  |         if nome_app not in {'base', 'parlamentares'}: | ||||
|  |             # Elimina casos especificos | ||||
|  | 
 | ||||
|  |             # Cria Grupo | ||||
|  |             nome_grupo = 'Operador de %s' % apps.get_app_config( | ||||
|  |                 nome_app).verbose_name | ||||
|  |             grupo = cria_ou_reseta_grupo(nome_grupo) | ||||
|  | 
 | ||||
|  |             # Elimina o acesso a proposicoes pelo Operador de Matérias | ||||
|  |             if nome_app == 'materia': | ||||
|  |                 cts = ContentType.objects.filter( | ||||
|  |                     app_label='materia').exclude(model='proposicao') | ||||
|  |                 permissoes['materia'] = list( | ||||
|  |                     Permission.objects.filter(content_type__in=cts)) | ||||
|  | 
 | ||||
|  |             # Configura as permissoes | ||||
|  |             for p in permissoes[nome_app]: | ||||
|  |                 grupo.permissions.add(p) | ||||
|  | 
 | ||||
|  |             # Cria o Usuario | ||||
|  |             nome_usuario = 'operador_%s' % nome_app | ||||
|  |             usuario = User.objects.get_or_create(username=nome_usuario)[0] | ||||
|  |             usuario.set_password('interlegis') | ||||
|  |             usuario.save() | ||||
|  |             grupo.user_set.add(usuario) | ||||
|  | 
 | ||||
|  |     # Operador Geral | ||||
|  |     grupo_geral = cria_ou_reseta_grupo('Operador Geral') | ||||
|  |     for lista in permissoes.values(): | ||||
|  |         for p in lista: | ||||
|  |             grupo_geral.permissions.add(p) | ||||
|  | 
 | ||||
|  |     nome_usuario = 'operador_geral' | ||||
|  |     cria_usuario(nome_usuario, grupo_geral) | ||||
| 
 | 
 | ||||
|     # Autor |     # Autor | ||||
| 
 |     perms_autor = [] | ||||
|     perms_autor = Permission.objects.get(name="Can add Proposição") |     perms_autor.append(Permission.objects.get(name='Can add Proposição')) | ||||
| 
 |     perms_autor.append(Permission.objects.get(name='Can change Proposição')) | ||||
|     # Configura Permissoes Operador de Protocolo |     perms_autor.append(Permission.objects.get(name='Can delete Proposição')) | ||||
|     for p in perms_protocoloadm: |  | ||||
|         op_prot.permissions.add(p) |  | ||||
| 
 |  | ||||
|     # Configura Permissoes Operador de Sessao |  | ||||
|     for p in perms_sessao: |  | ||||
|         op_sessao.permissions.add(p) |  | ||||
| 
 |  | ||||
|     # Configura Permissoes Operador de Comissao |  | ||||
|     for p in perms_comissoes: |  | ||||
|         op_comissao.permissions.add(p) |  | ||||
| 
 |  | ||||
|     # Configura Permissoes Operador de Administracao |  | ||||
|     for p in perms_docadm: |  | ||||
|         op_adm.permissions.add(p) |  | ||||
| 
 |  | ||||
|     # Configura Permissoes Operador de Norma |  | ||||
|     for p in perms_norma: |  | ||||
|         op_norma.permissions.add(p) |  | ||||
| 
 |  | ||||
|     # Configura Permissoes Operador de Materia |  | ||||
|     for p in perms_materia: |  | ||||
|         op_materia.permissions.add(p) |  | ||||
| 
 |  | ||||
|     # Configura Permissoes Operador de Painel |  | ||||
|     for p in perms_painel: |  | ||||
|         op_painel.permissions.add(p) |  | ||||
| 
 | 
 | ||||
|     # Configura Permissoes Autor |     # Configura Permissoes Autor | ||||
|     op_autor.permissions.add(perms_autor) |     grupo = cria_ou_reseta_grupo('Autor') | ||||
| 
 |     for p in perms_autor: | ||||
|     # Configura Permissoes Operador Geral |         grupo.permissions.add(p) | ||||
|     perms_op_geral = perms_protocoloadm + perms_sessao + perms_comissoes | 
 | ||||
|     perms_op_geral = perms_op_geral + perms_docadm + perms_norma |     nome_usuario = 'operador_autor' | ||||
|     perms_op_geral = perms_op_geral + perms_materia |     cria_usuario(nome_usuario, grupo_geral) | ||||
|     perms_op_geral = perms_op_geral + perms_parlamentares + perms_painel |  | ||||
|     perms_op_geral = perms_op_geral + permissoes_base |  | ||||
| 
 |  | ||||
|     for p in perms_op_geral: |  | ||||
|         op_geral.permissions.add(p) |  | ||||
|     op_geral.permissions.add(perms_autor) |  | ||||
| 
 |  | ||||
|     # Cria usuarios |  | ||||
|     op_geral_user = User.objects.get_or_create(username='op_geral')[0] |  | ||||
|     op_geral_user.set_password('interlegis') |  | ||||
|     op_geral_user.save() |  | ||||
|     op_geral.user_set.add(op_geral_user) |  | ||||
| 
 |  | ||||
|     op_materia_user = User.objects.get_or_create(username='op_materia')[0] |  | ||||
|     op_materia_user.set_password('interlegis') |  | ||||
|     op_materia_user.save() |  | ||||
|     op_materia.user_set.add(op_materia_user) |  | ||||
| 
 |  | ||||
|     op_prot_user = User.objects.get_or_create(username='op_protocolo')[0] |  | ||||
|     op_prot_user.set_password('interlegis') |  | ||||
|     op_prot_user.save() |  | ||||
|     op_prot.user_set.add(op_prot_user) |  | ||||
| 
 |  | ||||
|     op_sessao_user = User.objects.get_or_create(username='op_sessao')[0] |  | ||||
|     op_sessao_user.set_password('interlegis') |  | ||||
|     op_sessao_user.save() |  | ||||
|     op_sessao.user_set.add(op_sessao_user) |  | ||||
| 
 |  | ||||
|     op_comissao_user = User.objects.get_or_create(username='op_comissao')[0] |  | ||||
|     op_comissao_user.set_password('interlegis') |  | ||||
|     op_comissao_user.save() |  | ||||
|     op_comissao.user_set.add(op_comissao_user) |  | ||||
| 
 |  | ||||
|     op_adm_user = User.objects.get_or_create(username='op_adm')[0] |  | ||||
|     op_adm_user.set_password('interlegis') |  | ||||
|     op_adm_user.save() |  | ||||
|     op_adm.user_set.add(op_adm_user) |  | ||||
| 
 |  | ||||
|     op_norma_user = User.objects.get_or_create(username='op_norma')[0] |  | ||||
|     op_norma_user.set_password('interlegis') |  | ||||
|     op_norma_user.save() |  | ||||
|     op_norma.user_set.add(op_norma_user) |  | ||||
| 
 |  | ||||
|     op_painel_user = User.objects.get_or_create(username='op_painel')[0] |  | ||||
|     op_painel_user.set_password('interlegis') |  | ||||
|     op_painel_user.save() |  | ||||
|     op_painel.user_set.add(op_norma_user) |  | ||||
| 
 |  | ||||
|     op_autor_user = User.objects.get_or_create(username='op_autor')[0] |  | ||||
|     op_autor_user.set_password('interlegis') |  | ||||
|     op_autor_user.save() |  | ||||
|     op_autor.user_set.add(op_autor_user) |  | ||||
| 
 | 
 | ||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||
|     cria_grupos_permissoes() |     cria_grupos_permissoes() | ||||
|  | |||||
| @ -0,0 +1,47 @@ | |||||
|  | import pytest | ||||
|  | from django.apps import apps | ||||
|  | from django.contrib.auth.models import Group, Permission | ||||
|  | from django.contrib.contenttypes.models import ContentType | ||||
|  | 
 | ||||
|  | from inicializa_grupos_autorizacoes import cria_grupos_permissoes | ||||
|  | 
 | ||||
|  | pytestmark = pytest.mark.django_db | ||||
|  | 
 | ||||
|  | apps_com_permissao_padrao = [ | ||||
|  |     'comissoes', 'norma', 'sessao', 'painel'] | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | @pytest.mark.parametrize('app_label', apps_com_permissao_padrao) | ||||
|  | def test_grupo_padrao_tem_permissoes_sobre_todo_o_app(app_label): | ||||
|  | 
 | ||||
|  |     app = apps.get_app_config(app_label) | ||||
|  | 
 | ||||
|  |     # código testado | ||||
|  |     cria_grupos_permissoes() | ||||
|  | 
 | ||||
|  |     def gerar_permissoes(app): | ||||
|  |         for model in app.get_models(): | ||||
|  |             for op in ['add', 'change', 'delete']: | ||||
|  |                 yield model, 'Can %s %s' % (op, model._meta.verbose_name) | ||||
|  |     grupo = Group.objects.get(name='Operador de %s' % app.verbose_name) | ||||
|  |     esperado = set(gerar_permissoes(app)) | ||||
|  | 
 | ||||
|  |     real = set((p.content_type.model_class(), p.name) | ||||
|  |                for p in grupo.permissions.all()) | ||||
|  |     assert real == esperado | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | @pytest.mark.parametrize('app_label', apps_com_permissao_padrao) | ||||
|  | def test_permissoes_extras_sao_apagadas(app_label): | ||||
|  | 
 | ||||
|  |     app = apps.get_app_config(app_label) | ||||
|  |     grupo = Group.objects.create(name='Operador de %s' % app.verbose_name) | ||||
|  | 
 | ||||
|  |     permissao_errada = Permission.objects.create( | ||||
|  |         name='STUB', content_type=ContentType.objects.first()) | ||||
|  |     grupo.permissions.add(permissao_errada) | ||||
|  | 
 | ||||
|  |     # código testado | ||||
|  |     cria_grupos_permissoes() | ||||
|  | 
 | ||||
|  |     assert not grupo.permissions.filter(id=permissao_errada.id).exists() | ||||
					Loading…
					
					
				
		Reference in new issue