diff --git a/scripts/inicializa_grupos_autorizacoes.py b/scripts/inicializa_grupos_autorizacoes.py index d9d3c2232..d1c322d95 100644 --- a/scripts/inicializa_grupos_autorizacoes.py +++ b/scripts/inicializa_grupos_autorizacoes.py @@ -3,6 +3,12 @@ from django.contrib.auth.models import Group, Permission, User from django.contrib.contenttypes.models import ContentType +def cria_ou_reseta_grupo(nome): + grupo = Group.objects.get_or_create(name=nome)[0] + grupo.permissions.all().delete() + return grupo + + def cria_grupos_permissoes(): nomes_apps = ['base', 'parlamentares', 'comissoes', @@ -19,9 +25,9 @@ def cria_grupos_permissoes(): permissoes['documento_administrativo'] = list( Permission.objects.filter(content_type__in=cts)) nome_grupo = 'Operador Administrativo' - grupo = Group.objects.get_or_create(name=nome_grupo)[0] + grupo = cria_ou_reseta_grupo(nome_grupo) for p in permissoes['documento_administrativo']: - grupo.permissions.add(p) + grupo.permissions.add(p) nome_usuario = 'operador_administrativo' usuario = User.objects.get_or_create(username=nome_usuario)[0] @@ -35,9 +41,9 @@ def cria_grupos_permissoes(): permissoes['protocoloadm'] = list( Permission.objects.filter(content_type__in=cts)) nome_grupo = 'Operador de Protocolo Administrativo' - grupo = Group.objects.get_or_create(name=nome_grupo)[0] + grupo = cria_ou_reseta_grupo(nome_grupo) for p in permissoes['protocoloadm']: - grupo.permissions.add(p) + grupo.permissions.add(p) nome_usuario = 'operador_protocoloadm' usuario = User.objects.get_or_create(username=nome_usuario)[0] @@ -58,7 +64,7 @@ def cria_grupos_permissoes(): # Cria Grupo nome_grupo = 'Operador de %s' % apps.get_app_config( nome_app).verbose_name - grupo = Group.objects.get_or_create(name=nome_grupo)[0] + grupo = cria_ou_reseta_grupo(nome_grupo) # Elimina o acesso a proposicoes pelo Operador de Matérias if nome_app == 'materia': @@ -79,7 +85,7 @@ def cria_grupos_permissoes(): grupo.user_set.add(usuario) # Operador Geral - grupo_geral = Group.objects.get_or_create(name='Operador Geral')[0] + grupo_geral = cria_ou_reseta_grupo('Operador Geral') for lista in permissoes.values(): for p in lista: grupo_geral.permissions.add(p) @@ -91,7 +97,7 @@ def cria_grupos_permissoes(): perms_autor.append(Permission.objects.get(name='Can delete Proposição')) # Configura Permissoes Autor - grupo = Group.objects.get_or_create(name='Autor')[0] + grupo = cria_ou_reseta_grupo('Autor') for p in perms_autor: grupo.permissions.add(p) nome_usuario = 'operador_autor' diff --git a/scripts/test_inicializa_grupos_autorizacoes.py b/scripts/test_inicializa_grupos_autorizacoes.py new file mode 100644 index 000000000..1e41c39db --- /dev/null +++ b/scripts/test_inicializa_grupos_autorizacoes.py @@ -0,0 +1,59 @@ +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', 'materia', '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() + + +# Operador de Comissões +# Operador de Matéria +# Operador de Norma Jurídica +# Operador de Sessão Plenária + +# Operador de Protocolo Administrativo +# Operador de Documento Administrativo + + +# Operador Geral