feat: implementa sistema de responsabilidades e instâncias - Adiciona responsabilidades de Finanças e Imprensa para todas as instâncias - Cria templates genéricos para gerenciamento de instâncias - Implementa sistema de permissões baseado em RBAC - Adiciona status de Aspirante com avaliação obrigatória - Atualiza documentação com novas regras e responsabilidades - Cria testes para validação das permissões - Adiciona migração para novos campos no banco de dados
This commit is contained in:
66
sql/migrate_db.py
Normal file
66
sql/migrate_db.py
Normal file
@@ -0,0 +1,66 @@
|
||||
import os
|
||||
import sqlite3
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Adiciona o diretório raiz ao PYTHONPATH
|
||||
root_dir = str(Path(__file__).parent.parent)
|
||||
sys.path.append(root_dir)
|
||||
|
||||
from functions.base import Base, engine
|
||||
from functions.database import init_database
|
||||
from functions.rbac import init_rbac
|
||||
|
||||
def execute_sql_file(file_path):
|
||||
"""Executa um arquivo SQL"""
|
||||
print(f"Executando arquivo {file_path}...")
|
||||
|
||||
try:
|
||||
with open(file_path, 'r') as sql_file:
|
||||
sql_commands = sql_file.read().split(';')
|
||||
|
||||
conn = sqlite3.connect('database.db')
|
||||
cursor = conn.cursor()
|
||||
|
||||
for command in sql_commands:
|
||||
command = command.strip()
|
||||
if command:
|
||||
try:
|
||||
cursor.execute(command)
|
||||
except sqlite3.OperationalError as e:
|
||||
if "already exists" in str(e):
|
||||
print(f"Aviso: {str(e)}")
|
||||
else:
|
||||
raise e
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
print(f"Arquivo {file_path} executado com sucesso!")
|
||||
except Exception as e:
|
||||
print(f"Erro ao executar {file_path}: {str(e)}")
|
||||
raise e
|
||||
|
||||
def migrate_database():
|
||||
"""Executa a migração do banco de dados"""
|
||||
print("Inicializando banco de dados...")
|
||||
|
||||
# Criar todas as tabelas
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
# Executar scripts SQL
|
||||
sql_dir = Path(__file__).parent
|
||||
rbac_tables_sql = sql_dir / 'rbac_tables.sql'
|
||||
|
||||
if rbac_tables_sql.exists():
|
||||
execute_sql_file(rbac_tables_sql)
|
||||
|
||||
# Inicializar RBAC
|
||||
init_rbac()
|
||||
|
||||
# Inicializar banco de dados
|
||||
init_database()
|
||||
|
||||
print("Migração concluída com sucesso!")
|
||||
|
||||
if __name__ == '__main__':
|
||||
migrate_database()
|
||||
47
sql/migrate_rbac.py
Normal file
47
sql/migrate_rbac.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from functions.database import get_db_connection, Usuario
|
||||
from functions.rbac import Role, Permission
|
||||
|
||||
def migrate_existing_users():
|
||||
"""Migra os usuários existentes para o novo sistema RBAC"""
|
||||
session = get_db_connection()
|
||||
|
||||
try:
|
||||
# Buscar todos os usuários
|
||||
usuarios = session.query(Usuario).all()
|
||||
|
||||
# Buscar ou criar role de administrador
|
||||
admin_role = session.query(Role).filter_by(nome="Administrador").first()
|
||||
if not admin_role:
|
||||
admin_role = Role(nome="Administrador", nivel=Role.SECRETARIO_GERAL)
|
||||
session.add(admin_role)
|
||||
|
||||
# Buscar ou criar role de militante básico
|
||||
militante_role = session.query(Role).filter_by(nome="Militante Básico").first()
|
||||
if not militante_role:
|
||||
militante_role = Role(nome="Militante Básico", nivel=Role.MILITANTE_BASICO)
|
||||
session.add(militante_role)
|
||||
|
||||
# Atualizar usuários
|
||||
for usuario in usuarios:
|
||||
# Se o usuário já tem roles, pular
|
||||
if usuario.roles:
|
||||
continue
|
||||
|
||||
# Atribuir role com base no is_admin
|
||||
if usuario.is_admin:
|
||||
usuario.roles.append(admin_role)
|
||||
else:
|
||||
usuario.roles.append(militante_role)
|
||||
|
||||
session.commit()
|
||||
print("Migração de usuários concluída com sucesso!")
|
||||
|
||||
except Exception as e:
|
||||
session.rollback()
|
||||
print(f"Erro durante a migração de usuários: {str(e)}")
|
||||
raise e
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
if __name__ == '__main__':
|
||||
migrate_existing_users()
|
||||
152
sql/rbac_tables.sql
Normal file
152
sql/rbac_tables.sql
Normal file
@@ -0,0 +1,152 @@
|
||||
-- Tabela de roles
|
||||
CREATE TABLE IF NOT EXISTS roles (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
nome VARCHAR(50) NOT NULL UNIQUE,
|
||||
nivel INTEGER NOT NULL,
|
||||
descricao TEXT
|
||||
);
|
||||
|
||||
-- Tabela de permissões
|
||||
CREATE TABLE IF NOT EXISTS permissions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
nome VARCHAR(50) NOT NULL UNIQUE,
|
||||
descricao TEXT
|
||||
);
|
||||
|
||||
-- Tabela de mapeamento Role-Permission
|
||||
CREATE TABLE IF NOT EXISTS role_permissions (
|
||||
role_id INTEGER NOT NULL,
|
||||
permission_id INTEGER NOT NULL,
|
||||
PRIMARY KEY (role_id, permission_id),
|
||||
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Tabela de mapeamento User-Role
|
||||
CREATE TABLE IF NOT EXISTS user_roles (
|
||||
user_id INTEGER NOT NULL,
|
||||
role_id INTEGER NOT NULL,
|
||||
PRIMARY KEY (user_id, role_id),
|
||||
FOREIGN KEY (user_id) REFERENCES usuarios(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Inserir roles básicas
|
||||
INSERT OR IGNORE INTO roles (nome, nivel, descricao) VALUES
|
||||
('Militante Básico', 1, 'Militante com permissões básicas'),
|
||||
('Secretário de Célula', 2, 'Responsável por uma célula'),
|
||||
('Membro de Setor', 3, 'Membro de um setor'),
|
||||
('Secretário de Setor', 4, 'Responsável por um setor'),
|
||||
('Membro de CR', 5, 'Membro de um Comitê Regional'),
|
||||
('Secretário de CR', 6, 'Responsável por um Comitê Regional'),
|
||||
('Membro do CC', 7, 'Membro do Comitê Central'),
|
||||
('Secretário Geral', 8, 'Secretário Geral ou de Organização do CC');
|
||||
|
||||
-- Inserir permissões básicas
|
||||
INSERT OR IGNORE INTO permissions (nome, descricao) VALUES
|
||||
-- Permissões básicas
|
||||
('view_own_data', 'Visualizar próprios dados'),
|
||||
('edit_own_data', 'Editar próprios dados'),
|
||||
('view_cell_data', 'Visualizar dados da célula'),
|
||||
('create_militant', 'Criar novos militantes'),
|
||||
|
||||
-- Permissões de célula
|
||||
('manage_cell_members', 'Gerenciar membros da célula'),
|
||||
('create_cell_member', 'Criar membros na célula'),
|
||||
('view_cell_reports', 'Visualizar relatórios da célula'),
|
||||
|
||||
-- Permissões de setor
|
||||
('manage_sector_cells', 'Gerenciar células do setor'),
|
||||
('create_sector_cell', 'Criar células no setor'),
|
||||
('view_sector_reports', 'Visualizar relatórios do setor'),
|
||||
|
||||
-- Permissões de CR
|
||||
('manage_cr_sectors', 'Gerenciar setores do CR'),
|
||||
('create_cr_sector', 'Criar setores no CR'),
|
||||
('view_cr_reports', 'Visualizar relatórios do CR'),
|
||||
|
||||
-- Permissões de CC
|
||||
('manage_cc_crs', 'Gerenciar CRs'),
|
||||
('create_cc_cr', 'Criar CRs'),
|
||||
('view_cc_reports', 'Visualizar relatórios nacionais'),
|
||||
('system_config', 'Configurar sistema');
|
||||
|
||||
-- Mapear permissões para roles
|
||||
-- Militante Básico
|
||||
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
|
||||
SELECT r.id, p.id
|
||||
FROM roles r, permissions p
|
||||
WHERE r.nome = 'Militante Básico'
|
||||
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data');
|
||||
|
||||
-- Secretário de Célula
|
||||
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
|
||||
SELECT r.id, p.id
|
||||
FROM roles r, permissions p
|
||||
WHERE r.nome = 'Secretário de Célula'
|
||||
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
|
||||
'manage_cell_members', 'create_cell_member', 'view_cell_reports',
|
||||
'create_militant');
|
||||
|
||||
-- Membro de Setor
|
||||
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
|
||||
SELECT r.id, p.id
|
||||
FROM roles r, permissions p
|
||||
WHERE r.nome = 'Membro de Setor'
|
||||
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
|
||||
'manage_cell_members', 'create_cell_member', 'view_cell_reports',
|
||||
'view_sector_reports', 'create_militant');
|
||||
|
||||
-- Secretário de Setor
|
||||
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
|
||||
SELECT r.id, p.id
|
||||
FROM roles r, permissions p
|
||||
WHERE r.nome = 'Secretário de Setor'
|
||||
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
|
||||
'manage_cell_members', 'create_cell_member', 'view_cell_reports',
|
||||
'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
|
||||
'create_militant');
|
||||
|
||||
-- Membro de CR
|
||||
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
|
||||
SELECT r.id, p.id
|
||||
FROM roles r, permissions p
|
||||
WHERE r.nome = 'Membro de CR'
|
||||
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
|
||||
'manage_cell_members', 'create_cell_member', 'view_cell_reports',
|
||||
'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
|
||||
'view_cr_reports', 'create_militant');
|
||||
|
||||
-- Secretário de CR
|
||||
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
|
||||
SELECT r.id, p.id
|
||||
FROM roles r, permissions p
|
||||
WHERE r.nome = 'Secretário de CR'
|
||||
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
|
||||
'manage_cell_members', 'create_cell_member', 'view_cell_reports',
|
||||
'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
|
||||
'view_cr_reports', 'manage_cr_sectors', 'create_cr_sector',
|
||||
'create_militant');
|
||||
|
||||
-- Membro do CC
|
||||
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
|
||||
SELECT r.id, p.id
|
||||
FROM roles r, permissions p
|
||||
WHERE r.nome = 'Membro do CC'
|
||||
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
|
||||
'manage_cell_members', 'create_cell_member', 'view_cell_reports',
|
||||
'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
|
||||
'view_cr_reports', 'manage_cr_sectors', 'create_cr_sector',
|
||||
'view_cc_reports', 'create_militant');
|
||||
|
||||
-- Secretário Geral
|
||||
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
|
||||
SELECT r.id, p.id
|
||||
FROM roles r, permissions p
|
||||
WHERE r.nome = 'Secretário Geral'
|
||||
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
|
||||
'manage_cell_members', 'create_cell_member', 'view_cell_reports',
|
||||
'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
|
||||
'view_cr_reports', 'manage_cr_sectors', 'create_cr_sector',
|
||||
'view_cc_reports', 'manage_cc_crs', 'create_cc_cr',
|
||||
'system_config', 'create_militant');
|
||||
Reference in New Issue
Block a user