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