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:
LS
2025-04-03 15:58:07 -03:00
parent 8dac8dc234
commit cbaf227e58
37 changed files with 4305 additions and 953 deletions

66
sql/migrate_db.py Normal file
View 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
View 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
View 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');