From 745803fef3244ce25459840c3db0a7c2cd15c9af Mon Sep 17 00:00:00 2001 From: andersonid Date: Fri, 4 Apr 2025 02:34:51 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20corrige=20problemas=20de=20permiss=C3=B5?= =?UTF-8?q?es=20e=20rotas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 78 +++-- functions/database.py | 6 +- functions/rbac.py | 36 +- templates/listar_militantes.html | 501 ++------------------------- templates/modals/militante_novo.html | 2 +- 5 files changed, 110 insertions(+), 513 deletions(-) diff --git a/app.py b/app.py index 9edcc3c..7ef7b2e 100644 --- a/app.py +++ b/app.py @@ -60,6 +60,12 @@ login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'login' +# Adicionar filtros Jinja2 +@app.template_filter('bitwise_and') +def bitwise_and(value1, value2): + """Filtro para operação bit a bit AND""" + return value1 & value2 + @login_manager.user_loader def load_user(user_id): """Carrega o usuário pelo ID""" @@ -381,20 +387,12 @@ def criar_militante(): # Rota para listar militantes @app.route("/militantes") @require_login -@require_permission(Permission.VIEW_CELL_DATA) +@require_permission(Permission.MANAGE_CELL_MEMBERS) def listar_militantes(): + db = get_db_connection() try: - print("Buscando militantes...") - db = get_db_connection() - militantes = db.query(Militante).order_by(Militante.nome).all() - print(f"Total de militantes encontrados: {len(militantes)}") - for militante in militantes: - print(f"Militante: {militante.nome} (ID: {militante.id})") - return render_template("listar_militantes.html", militantes=militantes) - except Exception as e: - print(f"Erro ao listar militantes: {e}") - flash('Erro ao listar militantes', 'danger') - return render_template("listar_militantes.html", militantes=[]) + militantes = db.query(Militante).all() + return render_template('listar_militantes.html', militantes=militantes) finally: db.close() @@ -424,7 +422,7 @@ def excluir_militante(id): # Rota para criar uma nova cota @app.route("/cotas/novo", methods=["GET", "POST"]) @require_login -@require_permission(Permission.VIEW_CELL_REPORTS) +@require_permission(Permission.MANAGE_CELL_REPORTS) def nova_cota(): if request.method == "POST": militante_id = request.form.get("militante_id") @@ -479,19 +477,16 @@ def nova_cota(): # Rota para listar cotas @app.route("/cotas") @require_login -@require_permission(Permission.VIEW_CELL_REPORTS) +@require_permission(Permission.MANAGE_CELL_REPORTS) def listar_cotas(): try: print("Buscando cotas...") - # Buscar cotas com informações do militante db = get_db_connection() cotas = db.query(CotaMensal)\ .join(Militante)\ .order_by(CotaMensal.data_vencimento.desc())\ .all() - print(f"Total de cotas encontradas: {len(cotas)}") - # Calcular status de cada cota for cota in cotas: if cota.pago: @@ -500,7 +495,6 @@ def listar_cotas(): cota.status = "atrasada" else: cota.status = "pendente" - print(f"Cota {cota.id}: Militante={cota.militante.nome}, Valor={cota.valor_novo}, Status={cota.status}") # Buscar militantes para o modal de nova cota militantes = db.query(Militante).order_by(Militante.nome).all() @@ -622,18 +616,60 @@ def novo_pagamento(): # Rota para listar pagamentos @app.route("/pagamentos") @require_login +@require_permission(Permission.MANAGE_CELL_REPORTS) def listar_pagamentos(): try: + print("Buscando pagamentos...") db = get_db_connection() - pagamentos = db.query(Pagamento).order_by(Pagamento.data_pagamento.desc()).all() - return render_template("listar_pagamentos.html", pagamentos=pagamentos) + pagamentos = db.query(Pagamento)\ + .join(Militante)\ + .order_by(Pagamento.data_pagamento.desc())\ + .all() + + militantes = db.query(Militante).order_by(Militante.nome).all() + tipos_pagamento = db.query(TipoPagamento).all() + + return render_template("listar_pagamentos.html", + pagamentos=pagamentos, + militantes=militantes, + tipos_pagamento=tipos_pagamento) except Exception as e: print(f"Erro ao listar pagamentos: {e}") flash('Erro ao listar pagamentos', 'danger') - return render_template("listar_pagamentos.html", pagamentos=[]) + return render_template("listar_pagamentos.html", pagamentos=[], militantes=[]) finally: db.close() +# Rota para adicionar pagamento +@app.route("/pagamentos/adicionar", methods=["POST"]) +@require_login +@require_permission(Permission.MANAGE_CELL_REPORTS) +def adicionar_pagamento(): + if request.method == "POST": + try: + militante_id = request.form.get("militante_id") + tipo_pagamento = request.form.get("tipo_pagamento") + valor = float(request.form.get("valor")) + data_pagamento = datetime.strptime(request.form.get("data_pagamento"), "%Y-%m-%d").date() + + db = get_db_connection() + pagamento = Pagamento( + militante_id=militante_id, + tipo_pagamento=tipo_pagamento, + valor=valor, + data_pagamento=data_pagamento + ) + db.add(pagamento) + db.commit() + flash('Pagamento adicionado com sucesso!', 'success') + except Exception as e: + db.rollback() + flash(f'Erro ao adicionar pagamento: {str(e)}', 'danger') + finally: + db.close() + + return redirect(url_for('listar_pagamentos')) + # Rota para criar um novo material vendido @app.route("/materiais/novo", methods=["GET", "POST"]) @require_login diff --git a/functions/database.py b/functions/database.py index e8083eb..ee76a07 100644 --- a/functions/database.py +++ b/functions/database.py @@ -507,7 +507,11 @@ class Usuario(Base, UserMixin): return time_diff.total_seconds() > (self.session_timeout * 60) def has_permission(self, permission_name): - """Verifica se o usuário tem uma determinada permissão""" + """Verifica se o usuário tem uma permissão específica""" + if self.is_admin: # Se for admin, tem todas as permissões + return True + + # Verifica se o usuário tem a permissão através de suas roles for role in self.roles: for permission in role.permissions: if permission.nome == permission_name: diff --git a/functions/rbac.py b/functions/rbac.py index 4f8133d..21baf57 100644 --- a/functions/rbac.py +++ b/functions/rbac.py @@ -137,14 +137,22 @@ def init_rbac(): session = get_db_connection() try: - # Criar roles se não existirem - for nivel, nome in Role.get_roles_list(): - role = session.query(Role).filter_by(nivel=nivel).first() - if not role: - role = Role(nome=nome, nivel=nivel) - session.add(role) + # Criar role de administrador primeiro + 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) + session.commit() - # Criar permissões se não existirem + # Criar outras roles + for nivel, nome in Role.get_roles_list(): + if nome != "Administrador": # Pular Administrador pois já foi criado + role = session.query(Role).filter_by(nivel=nivel).first() + if not role: + role = Role(nome=nome, nivel=nivel) + session.add(role) + + # Criar permissões for nome, descricao in Permission.get_permissions_list(): permission = session.query(Permission).filter_by(nome=nome).first() if not permission: @@ -153,13 +161,6 @@ def init_rbac(): session.commit() - # Buscar 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) - session.commit() - # Dar todas as permissões para o admin all_permissions = session.query(Permission).all() admin_role.permissions = all_permissions @@ -167,9 +168,10 @@ def init_rbac(): # Buscar usuário admin e atribuir role de administrador admin_user = session.query(Usuario).filter_by(username="admin").first() - if admin_user and admin_role not in admin_user.roles: - admin_user.roles.append(admin_role) - session.commit() + if admin_user: + if admin_role not in admin_user.roles: + admin_user.roles = [admin_role] # Substituir roles existentes + session.commit() # Mapear permissões para outros roles for role in session.query(Role).filter(Role.nome != "Administrador").all(): diff --git a/templates/listar_militantes.html b/templates/listar_militantes.html index 5ee67a5..0028f95 100644 --- a/templates/listar_militantes.html +++ b/templates/listar_militantes.html @@ -3,104 +3,44 @@ {% block title %}Militantes{% endblock %} {% block content %} -<<<<<<< HEAD
-

+

Militantes

{% if current_user.has_permission('gerenciar_militantes') %} -
- - +
-
- - - - - - - - - - - - - {% for militante in militantes %} - - - - - - - - - {% endfor %} - -
NomeCPFEmailTelefoneFiliadoAções
{{ militante.nome }}{{ militante.cpf }}{{ militante.email }}{{ militante.telefone }} - - {{ 'Sim' if militante.filiado else 'Não' }} - - -
- - -
-
-
+
+
+
+
+
+ + + + +
+
+
+
+ + + +
+ +
+
-<<<<<<< HEAD
@@ -123,13 +63,13 @@ @@ -168,7 +108,7 @@
{{ militante.telefone }} {{ militante.celula.nome }} - {% if militante.responsabilidades & Militante.RESPONSAVEL_FINANCAS %} + {% if militante.responsabilidades|bitwise_and(Militante.RESPONSAVEL_FINANCAS) %} Finanças {% endif %} - {% if militante.responsabilidades & Militante.RESPONSAVEL_IMPRENSA %} + {% if militante.responsabilidades|bitwise_and(Militante.RESPONSAVEL_IMPRENSA) %} Imprensa {% endif %} - {% if militante.responsabilidades & Militante.QUADRO_ORIENTADOR %} + {% if militante.responsabilidades|bitwise_and(Militante.QUADRO_ORIENTADOR) %} Quadro-Orientador {% endif %}
-
+
Mostrando {{ militantes|length }} militantes
@@ -185,403 +125,18 @@ -======= -
-
- Mostrando {{ militantes|length }} militantes ->>>>>>> ee71e7b (feat: padroniza componentes e estilos globais - Cria components.css, ajusta cores e organiza modais) -
- -
-
- -<<<<<<< HEAD - - - - - - - -======= {% include 'modals/militante_novo.html' %} {% include 'modals/militante_editar.html' %} {% include 'modals/militante_excluir.html' %} ->>>>>>> ee71e7b (feat: padroniza componentes e estilos globais - Cria components.css, ajusta cores e organiza modais) {% endblock %} {% block scripts %} -<<<<<<< HEAD - -======= ->>>>>>> 4b99410 (fix: corrige funcionamento do modal de edição de militantes - Corrige bloco de scripts e melhora tratamento de dados) {% endblock %} {% block extra_css %} diff --git a/templates/modals/militante_novo.html b/templates/modals/militante_novo.html index 36a3899..692c7a5 100644 --- a/templates/modals/militante_novo.html +++ b/templates/modals/militante_novo.html @@ -9,7 +9,7 @@