|
|
|
import os
|
|
|
|
|
|
|
|
import django
|
|
|
|
|
|
|
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sapl.settings")
|
|
|
|
django.setup()
|
|
|
|
|
|
|
|
if True:
|
|
|
|
from django.apps import apps
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
from django.contrib.auth.models import Group, Permission
|
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
|
|
|
|
|
|
|
|
class InicializaGruposAutorizacoes():
|
|
|
|
|
|
|
|
def cria_ou_reseta_grupo(self, nome):
|
|
|
|
grupo = Group.objects.get_or_create(name=nome)[0]
|
|
|
|
for p in list(grupo.permissions.all()):
|
|
|
|
grupo.permissions.remove(p)
|
|
|
|
return grupo
|
|
|
|
|
|
|
|
def cria_usuario(self, nome, grupo):
|
|
|
|
nome_usuario = nome
|
|
|
|
usuario = get_user_model().objects.get_or_create(
|
|
|
|
username=nome_usuario)[0]
|
|
|
|
usuario.set_password('interlegis')
|
|
|
|
usuario.save()
|
|
|
|
grupo.user_set.add(usuario)
|
|
|
|
|
|
|
|
def cria_grupos_permissoes(self):
|
|
|
|
|
|
|
|
nomes_apps = ['base', 'parlamentares', 'comissoes',
|
|
|
|
'materia', 'norma', 'sessao', 'painel']
|
|
|
|
|
|
|
|
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')
|
|
|
|
|
|
|
|
# documento administrativo
|
|
|
|
permissoes['documento_administrativo'] = list(
|
|
|
|
Permission.objects.filter(content_type__in=cts))
|
|
|
|
nome_grupo = 'Operador Administrativo'
|
|
|
|
grupo = self.cria_ou_reseta_grupo(nome_grupo)
|
|
|
|
for p in permissoes['documento_administrativo']:
|
|
|
|
grupo.permissions.add(p)
|
|
|
|
|
|
|
|
nome_usuario = 'operador_administrativo'
|
|
|
|
self.cria_usuario(nome_usuario, grupo)
|
|
|
|
|
|
|
|
# prolocolo administrativo
|
|
|
|
cts = cts.exclude(model__icontains='tramitacao').exclude(
|
|
|
|
model__icontains='documentoadministrativo')
|
|
|
|
permissoes['protocoloadm'] = list(
|
|
|
|
Permission.objects.filter(content_type__in=cts))
|
|
|
|
nome_grupo = 'Operador de Protocolo Administrativo'
|
|
|
|
grupo = self.cria_ou_reseta_grupo(nome_grupo)
|
|
|
|
for p in permissoes['protocoloadm']:
|
|
|
|
grupo.permissions.add(p)
|
|
|
|
|
|
|
|
nome_usuario = 'operador_protocoloadm'
|
|
|
|
self.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 = self.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 = get_user_model().objects.get_or_create(
|
|
|
|
username=nome_usuario)[0]
|
|
|
|
usuario.set_password('interlegis')
|
|
|
|
usuario.save()
|
|
|
|
grupo.user_set.add(usuario)
|
|
|
|
|
|
|
|
# Operador Geral
|
|
|
|
grupo_geral = self.cria_ou_reseta_grupo('Operador Geral')
|
|
|
|
for lista in permissoes.values():
|
|
|
|
for p in lista:
|
|
|
|
grupo_geral.permissions.add(p)
|
|
|
|
|
|
|
|
nome_usuario = 'operador_geral'
|
|
|
|
self.cria_usuario(nome_usuario, grupo_geral)
|
|
|
|
|
|
|
|
# Autor
|
|
|
|
grupo = self.cria_ou_reseta_grupo('Autor')
|
|
|
|
|
706 refatorar model autor tipoautor (#739)
* Ref Autor, TipoAutor, cria app api DRF
- Autor e TipoAutor migrados para app base.
- Foram refatorados para GR - Generic Relations
- Em TipoAutor: passou se a apontar também para um ContentType que
é usado para contextualização de dados da GR em Autor.
- A captura da combo de ContentTypes é feita através do apontamento
reverso nos models que se queira disponibilizar conceitualmente como
Autor
- Em Autor: neste commit, o form de create está em desenvolvimento, com
o buscador de possiveis autores baseados na seleção do usuário de
TipoAutor que, se não possui ContentType, abre o campo nome para
insersão, se possui ContentType, abre caixa de busca com atualização
jquery de radiobox's para o usuário selecionar um possível autor.
- api rest: para a busca funcionar e como objetivo de futuras
implementações em DRF, a app api foi criada, anotada nas configurações
gerais de sapl.urls com o prefixo /api.
- na api foi criada a uma ListAPIView para pesquisa de possiveis autores
baseados no tipo autor enviado, url /api/autor/possiveis/?P<pk>[0-9]*)$
que sem pk devolve a lista de TipoAutor e, com pk, devolve a lista dos
registros ligados ao ContentType, filtrados pelo parametro q
* Ajusta front para busca por possiveis autores
Ajusta front e implementa SaplGenericRelation, uma customização que
adiciona o atributo fields_search que possibilita passar para qualquer
implementação de busca quais são os campos de busca padrão do do
GenericRelation
* Conc refatoração no Cada de Autor e Tipos de Autor
* Alt backend de perm e pag de drf e ref layout topo
* Add procedimento na alteração de username de Autor
Na edição de Autores foi adicionado o tratamento por opção do usuário do
que deve ser feito com o usuário que está sendo desvinculado no caso de
uma alteração do username de um Autor.
Foram dadas três opções:
1) Apenas retirar Perfil de Autor do Usuário que está sendo desvinculado
2) Retirar Perfil de Autor e desativar Usuário que está sendo desvinculado
3) Excluir Usuário
* Add field cargo em AutorForm para tipos sem CT
Cadastro de Autores de Tipos sem ContentType podem adicionar nome, cargo
e usuário.
* Add Bloco, Bancada, Frente possíveis Tip de Autores
* Corrige frase de mensagem no cadastro de Autor
* ref buscador modal de Autores c pesq param reversa
* Add documentação e faz modificações na api/autor
* Ref Crud para Listar GenericRelations
* Ref List da aba Proposições para parlamentares
* Altera imports de teste na app materia
* Corrige comentários da classe AutorListView
* Customiza layout do drf docs.
* Altera criação do grp Autor para inc list e detail
* Remove customização do bootstrap
Após fork e ajustes feitos no tema drunken-parrot-ui-flat, alterações
feitas nos arquivos deste commit não são mais necessárias, passando a
ser renderizado os arquivos que são padrão da biblioteca
django-crispy-forms.
* Adequa inserção dinamica de radio ao crispy-forms
8 years ago
|
|
|
list(map(lambda permissao: grupo.permissions.add(permissao),
|
|
|
|
list(Permission.objects.filter(
|
|
|
|
content_type=ContentType.objects.get_by_natural_key(
|
|
|
|
app_label='materia', model='proposicao')))))
|
|
|
|
|
|
|
|
"""
|
|
|
|
Mesmo para teste, um usuário com perfil Autor criado via /admin
|
|
|
|
não deverá ser criado pois esse é um papel do operador_geral fazer
|
|
|
|
nas tabelas auxiliares.
|
|
|
|
A tentativa de acesso a qualquer container (hoje apenas proposições)
|
|
|
|
do SAPL de Usuários com perfil Autor mas sem um Autor cadastrado
|
|
|
|
nas tabelas auxiliares será negado e notificado via front-end.
|
|
|
|
"""
|
|
|
|
# nome_usuario = 'operador_autor'
|
|
|
|
# self.cria_usuario(nome_usuario, grupo)
|
|
|
|
|
|
|
|
def __call__(self):
|
|
|
|
self.cria_grupos_permissoes()
|
|
|
|
|
|
|
|
|
|
|
|
cria_grupos_permissoes = InicializaGruposAutorizacoes()
|
|
|
|
if __name__ == '__main__':
|
|
|
|
cria_grupos_permissoes.cria_grupos_permissoes()
|