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:
222
functions/permissions.py
Normal file
222
functions/permissions.py
Normal file
@@ -0,0 +1,222 @@
|
||||
from functools import wraps
|
||||
from flask import abort, g
|
||||
from .database import Militante, Celula, Setor, CR, CC
|
||||
|
||||
def check_permission(permission_func):
|
||||
def decorator(f):
|
||||
@wraps(f)
|
||||
def decorated_function(*args, **kwargs):
|
||||
if not permission_func(*args, **kwargs):
|
||||
abort(403)
|
||||
return f(*args, **kwargs)
|
||||
return decorated_function
|
||||
return decorator
|
||||
|
||||
def can_manage_militante(militante_id):
|
||||
"""Verifica se o usuário atual pode gerenciar um militante específico."""
|
||||
if not g.user or not g.user.militante:
|
||||
return False
|
||||
|
||||
militante = Militante.query.get(militante_id)
|
||||
if not militante:
|
||||
return False
|
||||
|
||||
# Secretário Geral e Secretário de Organização podem gerenciar qualquer militante
|
||||
if g.user.militante.responsabilidades & (Militante.SECRETARIO_GERAL | Militante.SECRETARIO_ORGANIZACAO):
|
||||
return True
|
||||
|
||||
# Secretário de CC pode gerenciar militantes do seu CC
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CC:
|
||||
if militante.celula.setor.cr.cc_id == g.user.militante.celula.setor.cr.cc_id:
|
||||
return True
|
||||
|
||||
# Secretário de CR pode gerenciar militantes do seu CR
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CR:
|
||||
if militante.celula.setor.cr_id == g.user.militante.celula.setor.cr_id:
|
||||
return True
|
||||
|
||||
# Secretário de Setor pode gerenciar militantes do seu setor
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_SETOR:
|
||||
if militante.celula.setor_id == g.user.militante.celula.setor_id:
|
||||
return True
|
||||
|
||||
# Secretário de Célula pode gerenciar militantes da sua célula
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CELULA:
|
||||
if militante.celula_id == g.user.militante.celula_id:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def can_manage_celula(celula_id):
|
||||
"""Verifica se o usuário atual pode gerenciar uma célula específica."""
|
||||
if not g.user or not g.user.militante:
|
||||
return False
|
||||
|
||||
celula = Celula.query.get(celula_id)
|
||||
if not celula:
|
||||
return False
|
||||
|
||||
# Secretário Geral e Secretário de Organização podem gerenciar qualquer célula
|
||||
if g.user.militante.responsabilidades & (Militante.SECRETARIO_GERAL | Militante.SECRETARIO_ORGANIZACAO):
|
||||
return True
|
||||
|
||||
# Secretário de CC pode gerenciar células do seu CC
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CC:
|
||||
if celula.setor.cr.cc_id == g.user.militante.celula.setor.cr.cc_id:
|
||||
return True
|
||||
|
||||
# Secretário de CR pode gerenciar células do seu CR
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CR:
|
||||
if celula.setor.cr_id == g.user.militante.celula.setor.cr_id:
|
||||
return True
|
||||
|
||||
# Secretário de Setor pode gerenciar células do seu setor
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_SETOR:
|
||||
if celula.setor_id == g.user.militante.celula.setor_id:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def can_manage_setor(setor_id):
|
||||
"""Verifica se o usuário atual pode gerenciar um setor específico."""
|
||||
if not g.user or not g.user.militante:
|
||||
return False
|
||||
|
||||
setor = Setor.query.get(setor_id)
|
||||
if not setor:
|
||||
return False
|
||||
|
||||
# Secretário Geral e Secretário de Organização podem gerenciar qualquer setor
|
||||
if g.user.militante.responsabilidades & (Militante.SECRETARIO_GERAL | Militante.SECRETARIO_ORGANIZACAO):
|
||||
return True
|
||||
|
||||
# Secretário de CC pode gerenciar setores do seu CC
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CC:
|
||||
if setor.cr.cc_id == g.user.militante.celula.setor.cr.cc_id:
|
||||
return True
|
||||
|
||||
# Secretário de CR pode gerenciar setores do seu CR
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CR:
|
||||
if setor.cr_id == g.user.militante.celula.setor.cr_id:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def can_manage_cr(cr_id):
|
||||
"""Verifica se o usuário atual pode gerenciar um CR específico."""
|
||||
if not g.user or not g.user.militante:
|
||||
return False
|
||||
|
||||
cr = CR.query.get(cr_id)
|
||||
if not cr:
|
||||
return False
|
||||
|
||||
# Secretário Geral e Secretário de Organização podem gerenciar qualquer CR
|
||||
if g.user.militante.responsabilidades & (Militante.SECRETARIO_GERAL | Militante.SECRETARIO_ORGANIZACAO):
|
||||
return True
|
||||
|
||||
# Secretário de CC pode gerenciar CRs do seu CC
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CC:
|
||||
if cr.cc_id == g.user.militante.celula.setor.cr.cc_id:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def can_manage_cc(cc_id):
|
||||
"""Verifica se o usuário atual pode gerenciar um CC específico."""
|
||||
if not g.user or not g.user.militante:
|
||||
return False
|
||||
|
||||
# Apenas Secretário Geral e Secretário de Organização podem gerenciar CCs
|
||||
if g.user.militante.responsabilidades & (Militante.SECRETARIO_GERAL | Militante.SECRETARIO_ORGANIZACAO):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def can_manage_financas(instancia_id, tipo_instancia):
|
||||
"""Verifica se o usuário atual pode gerenciar finanças de uma instância específica."""
|
||||
if not g.user or not g.user.militante:
|
||||
return False
|
||||
|
||||
# Secretário Geral e Secretário de Organização podem gerenciar finanças de qualquer instância
|
||||
if g.user.militante.responsabilidades & (Militante.SECRETARIO_GERAL | Militante.SECRETARIO_ORGANIZACAO):
|
||||
return True
|
||||
|
||||
# Responsável de Finanças da instância pode gerenciar suas finanças
|
||||
if tipo_instancia == 'celula':
|
||||
celula = Celula.query.get(instancia_id)
|
||||
if celula and celula.responsavel_financas_id == g.user.militante.id:
|
||||
return True
|
||||
elif tipo_instancia == 'setor':
|
||||
setor = Setor.query.get(instancia_id)
|
||||
if setor and setor.responsavel_financas_id == g.user.militante.id:
|
||||
return True
|
||||
elif tipo_instancia == 'cr':
|
||||
cr = CR.query.get(instancia_id)
|
||||
if cr and cr.responsavel_financas_id == g.user.militante.id:
|
||||
return True
|
||||
elif tipo_instancia == 'cc':
|
||||
cc = CC.query.get(instancia_id)
|
||||
if cc and cc.responsavel_financas_id == g.user.militante.id:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def can_manage_imprensa(instancia_id, tipo_instancia):
|
||||
"""Verifica se o usuário atual pode gerenciar imprensa de uma instância específica."""
|
||||
if not g.user or not g.user.militante:
|
||||
return False
|
||||
|
||||
# Secretário Geral e Secretário de Organização podem gerenciar imprensa de qualquer instância
|
||||
if g.user.militante.responsabilidades & (Militante.SECRETARIO_GERAL | Militante.SECRETARIO_ORGANIZACAO):
|
||||
return True
|
||||
|
||||
# Responsável de Imprensa da instância pode gerenciar sua imprensa
|
||||
if tipo_instancia == 'celula':
|
||||
celula = Celula.query.get(instancia_id)
|
||||
if celula and celula.responsavel_imprensa_id == g.user.militante.id:
|
||||
return True
|
||||
elif tipo_instancia == 'setor':
|
||||
setor = Setor.query.get(instancia_id)
|
||||
if setor and setor.responsavel_imprensa_id == g.user.militante.id:
|
||||
return True
|
||||
elif tipo_instancia == 'cr':
|
||||
cr = CR.query.get(instancia_id)
|
||||
if cr and cr.responsavel_imprensa_id == g.user.militante.id:
|
||||
return True
|
||||
elif tipo_instancia == 'cc':
|
||||
cc = CC.query.get(instancia_id)
|
||||
if cc and cc.responsavel_imprensa_id == g.user.militante.id:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def can_manage_responsabilidades(militante_id):
|
||||
"""Verifica se o usuário atual pode gerenciar responsabilidades de um militante específico."""
|
||||
if not g.user or not g.user.militante:
|
||||
return False
|
||||
|
||||
militante = Militante.query.get(militante_id)
|
||||
if not militante:
|
||||
return False
|
||||
|
||||
# Secretário Geral e Secretário de Organização podem gerenciar responsabilidades de qualquer militante
|
||||
if g.user.militante.responsabilidades & (Militante.SECRETARIO_GERAL | Militante.SECRETARIO_ORGANIZACAO):
|
||||
return True
|
||||
|
||||
# Secretário de CC pode gerenciar responsabilidades de militantes do seu CC
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CC:
|
||||
if militante.celula.setor.cr.cc_id == g.user.militante.celula.setor.cr.cc_id:
|
||||
return True
|
||||
|
||||
# Secretário de CR pode gerenciar responsabilidades de militantes do seu CR
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_CR:
|
||||
if militante.celula.setor.cr_id == g.user.militante.celula.setor.cr_id:
|
||||
return True
|
||||
|
||||
# Secretário de Setor pode gerenciar responsabilidades de militantes do seu setor
|
||||
if g.user.militante.responsabilidades & Militante.SECRETARIO_SETOR:
|
||||
if militante.celula.setor_id == g.user.militante.celula.setor_id:
|
||||
return True
|
||||
|
||||
return False
|
||||
Reference in New Issue
Block a user