fix: Atualiza valores dos checkboxes de responsabilidades no template do modal
This commit is contained in:
89
app.py
89
app.py
@@ -50,6 +50,7 @@ import random
|
|||||||
import string
|
import string
|
||||||
from sqlalchemy.sql import func
|
from sqlalchemy.sql import func
|
||||||
from flask_wtf.csrf import CSRFProtect
|
from flask_wtf.csrf import CSRFProtect
|
||||||
|
import json
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
@@ -425,7 +426,7 @@ def criar_militante():
|
|||||||
def listar_militantes():
|
def listar_militantes():
|
||||||
db = get_db_connection()
|
db = get_db_connection()
|
||||||
try:
|
try:
|
||||||
militantes = db.query(Militante).all()
|
militantes = db.query(Militante).order_by(Militante.nome).all()
|
||||||
celulas = db.query(Celula).order_by(Celula.nome).all()
|
celulas = db.query(Celula).order_by(Celula.nome).all()
|
||||||
return render_template('listar_militantes.html', militantes=militantes, Militante=Militante, celulas=celulas)
|
return render_template('listar_militantes.html', militantes=militantes, Militante=Militante, celulas=celulas)
|
||||||
finally:
|
finally:
|
||||||
@@ -1051,13 +1052,22 @@ def editar_militante(militante_id):
|
|||||||
militante.celula_id = None
|
militante.celula_id = None
|
||||||
|
|
||||||
# Tratar responsabilidades corretamente
|
# Tratar responsabilidades corretamente
|
||||||
responsabilidades = request.form.getlist('responsabilidades')
|
try:
|
||||||
if responsabilidades:
|
responsabilidades_json = request.form.get('responsabilidades')
|
||||||
try:
|
if responsabilidades_json:
|
||||||
militante.responsabilidades = sum(int(r) for r in responsabilidades)
|
responsabilidades_lista = json.loads(responsabilidades_json)
|
||||||
except (ValueError, TypeError):
|
valor_responsabilidades = 0
|
||||||
|
if 'Finanças' in responsabilidades_lista:
|
||||||
|
valor_responsabilidades |= Militante.RESPONSAVEL_FINANCAS
|
||||||
|
if 'Imprensa' in responsabilidades_lista:
|
||||||
|
valor_responsabilidades |= Militante.RESPONSAVEL_IMPRENSA
|
||||||
|
if 'Quadro-Orientador' in responsabilidades_lista:
|
||||||
|
valor_responsabilidades |= Militante.QUADRO_ORIENTADOR
|
||||||
|
militante.responsabilidades = valor_responsabilidades
|
||||||
|
else:
|
||||||
militante.responsabilidades = 0
|
militante.responsabilidades = 0
|
||||||
else:
|
except (ValueError, TypeError, json.JSONDecodeError) as e:
|
||||||
|
print(f"Erro ao processar responsabilidades: {str(e)}")
|
||||||
militante.responsabilidades = 0
|
militante.responsabilidades = 0
|
||||||
|
|
||||||
print("Dados organizacionais atualizados")
|
print("Dados organizacionais atualizados")
|
||||||
@@ -1555,54 +1565,43 @@ def excluir_assinatura(id):
|
|||||||
finally:
|
finally:
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
@app.route("/militantes/<int:militante_id>/dados")
|
@app.route("/militantes/dados/<int:militante_id>")
|
||||||
@require_login
|
@require_login
|
||||||
@require_permission('gerenciar_militantes')
|
@require_permission('gerenciar_militantes')
|
||||||
def get_militante_dados(militante_id):
|
def buscar_dados_militante(militante_id):
|
||||||
"""Retorna os dados completos de um militante"""
|
"""Retorna os dados de um militante"""
|
||||||
print(f"Buscando dados do militante {militante_id}")
|
|
||||||
db = get_db_connection()
|
db = get_db_connection()
|
||||||
try:
|
try:
|
||||||
militante = db.query(Militante).options(
|
militante = db.query(Militante).options(
|
||||||
joinedload(Militante.endereco),
|
joinedload(Militante.endereco),
|
||||||
joinedload(Militante.emails),
|
joinedload(Militante.emails)
|
||||||
joinedload(Militante.celula)
|
|
||||||
).get(militante_id)
|
).get(militante_id)
|
||||||
|
|
||||||
if not militante:
|
if not militante:
|
||||||
print(f"Militante {militante_id} não encontrado")
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
'status': 'error',
|
'status': 'error',
|
||||||
'message': 'Militante não encontrado'
|
'message': 'Militante não encontrado'
|
||||||
}), 404
|
}), 404
|
||||||
|
|
||||||
print(f"Militante {militante_id} encontrado: {militante.nome}")
|
# Converter responsabilidades para lista de strings
|
||||||
|
responsabilidades = []
|
||||||
|
if militante.responsabilidades & Militante.RESPONSAVEL_FINANCAS:
|
||||||
|
responsabilidades.append('Finanças')
|
||||||
|
if militante.responsabilidades & Militante.RESPONSAVEL_IMPRENSA:
|
||||||
|
responsabilidades.append('Imprensa')
|
||||||
|
if militante.responsabilidades & Militante.QUADRO_ORIENTADOR:
|
||||||
|
responsabilidades.append('Quadro-Orientador')
|
||||||
|
|
||||||
# Formatar datas para o formato YYYY-MM-DD
|
return jsonify({
|
||||||
data_nascimento = militante.data_nascimento.strftime('%Y-%m-%d') if militante.data_nascimento else None
|
|
||||||
data_entrada = militante.data_entrada_oci.strftime('%Y-%m-%d') if militante.data_entrada_oci else None
|
|
||||||
data_efetivacao = militante.data_efetivacao_oci.strftime('%Y-%m-%d') if militante.data_efetivacao_oci else None
|
|
||||||
|
|
||||||
# Buscar o primeiro email do militante
|
|
||||||
email_principal = None
|
|
||||||
if militante.emails and len(militante.emails) > 0:
|
|
||||||
email_principal = militante.emails[0].endereco_email
|
|
||||||
|
|
||||||
dados = {
|
|
||||||
'id': militante.id,
|
|
||||||
'nome': militante.nome,
|
'nome': militante.nome,
|
||||||
'cpf': militante.cpf,
|
'cpf': militante.cpf,
|
||||||
'titulo_eleitoral': militante.titulo_eleitoral,
|
'titulo_eleitoral': militante.titulo_eleitoral,
|
||||||
'data_nascimento': data_nascimento,
|
'data_nascimento': militante.data_nascimento.strftime('%Y-%m-%d') if militante.data_nascimento else None,
|
||||||
'data_entrada_oci': data_entrada,
|
'data_entrada_oci': militante.data_entrada_oci.strftime('%Y-%m-%d') if militante.data_entrada_oci else None,
|
||||||
'data_efetivacao_oci': data_efetivacao,
|
'data_efetivacao_oci': militante.data_efetivacao_oci.strftime('%Y-%m-%d') if militante.data_efetivacao_oci else None,
|
||||||
|
|
||||||
# Contato
|
|
||||||
'telefone1': militante.telefone1,
|
'telefone1': militante.telefone1,
|
||||||
'telefone2': militante.telefone2,
|
'telefone2': militante.telefone2,
|
||||||
'email': email_principal,
|
'email': militante.emails[0].endereco_email if militante.emails else None,
|
||||||
|
|
||||||
# Endereço
|
|
||||||
'endereco': {
|
'endereco': {
|
||||||
'cep': militante.endereco.cep if militante.endereco else None,
|
'cep': militante.endereco.cep if militante.endereco else None,
|
||||||
'estado': militante.endereco.estado if militante.endereco else None,
|
'estado': militante.endereco.estado if militante.endereco else None,
|
||||||
@@ -1612,34 +1611,22 @@ def get_militante_dados(militante_id):
|
|||||||
'numero': militante.endereco.numero if militante.endereco else None,
|
'numero': militante.endereco.numero if militante.endereco else None,
|
||||||
'complemento': militante.endereco.complemento if militante.endereco else None
|
'complemento': militante.endereco.complemento if militante.endereco else None
|
||||||
} if militante.endereco else None,
|
} if militante.endereco else None,
|
||||||
|
|
||||||
# Profissional
|
|
||||||
'profissao': militante.profissao,
|
'profissao': militante.profissao,
|
||||||
'regime_trabalho': militante.regime_trabalho,
|
'regime_trabalho': militante.regime_trabalho,
|
||||||
'empresa': militante.empresa,
|
'empresa': militante.empresa,
|
||||||
'contratante': militante.contratante,
|
'contratante': militante.contratante,
|
||||||
|
|
||||||
# Acadêmico
|
|
||||||
'instituicao_ensino': militante.instituicao_ensino,
|
'instituicao_ensino': militante.instituicao_ensino,
|
||||||
'tipo_instituicao': militante.tipo_instituicao,
|
'tipo_instituicao': militante.tipo_instituicao,
|
||||||
|
|
||||||
# Sindical
|
|
||||||
'sindicato': militante.sindicato,
|
'sindicato': militante.sindicato,
|
||||||
'cargo_sindical': militante.cargo_sindical,
|
'cargo_sindical': militante.cargo_sindical,
|
||||||
'central_sindical': militante.central_sindical,
|
'central_sindical': militante.central_sindical,
|
||||||
'dirigente_sindical': militante.dirigente_sindical,
|
'dirigente_sindical': militante.dirigente_sindical,
|
||||||
|
'estado': militante.estado.name if militante.estado else None,
|
||||||
# Organização
|
|
||||||
'estado': militante.estado.value if militante.estado else 'ATIVO',
|
|
||||||
'celula_id': militante.celula_id,
|
'celula_id': militante.celula_id,
|
||||||
'responsabilidades': militante.responsabilidades
|
'responsabilidades': responsabilidades
|
||||||
}
|
})
|
||||||
|
|
||||||
print(f"Dados formatados: {dados}")
|
|
||||||
return jsonify(dados)
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Erro ao buscar dados do militante {militante_id}: {str(e)}")
|
print(f"Erro ao buscar dados do militante: {str(e)}")
|
||||||
return jsonify({
|
return jsonify({
|
||||||
'status': 'error',
|
'status': 'error',
|
||||||
'message': f'Erro ao buscar dados do militante: {str(e)}'
|
'message': f'Erro ao buscar dados do militante: {str(e)}'
|
||||||
|
|||||||
@@ -45,7 +45,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.table-hover tbody tr:hover {
|
.table-hover tbody tr:hover {
|
||||||
background-color: var(--table-hover-bg);
|
background-color: var(--table-hover-bg) !important;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-hover tbody tr {
|
||||||
|
transition: all 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Botões de ação */
|
/* Botões de ação */
|
||||||
@@ -125,8 +130,8 @@
|
|||||||
|
|
||||||
/* Badges */
|
/* Badges */
|
||||||
.badge {
|
.badge {
|
||||||
padding: 0.5em 0.75em;
|
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
padding: 0.5em 0.8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.badge.bg-success {
|
.badge.bg-success {
|
||||||
@@ -415,4 +420,25 @@
|
|||||||
input[type="date"]:focus {
|
input[type="date"]:focus {
|
||||||
border-color: var(--primary-color);
|
border-color: var(--primary-color);
|
||||||
box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
|
box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Estilo para colunas ordenáveis */
|
||||||
|
th[data-sort] {
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
th[data-sort] i {
|
||||||
|
margin-left: 5px;
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
th[data-sort].sort-asc i,
|
||||||
|
th[data-sort].sort-desc i {
|
||||||
|
color: var(--primary-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Animação para linhas da tabela */
|
||||||
|
#militantesTable tbody tr {
|
||||||
|
transition: all 0.3s ease;
|
||||||
}
|
}
|
||||||
@@ -117,8 +117,8 @@
|
|||||||
<input type="text" class="form-control" id="edit_bairro" name="bairro">
|
<input type="text" class="form-control" id="edit_bairro" name="bairro">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6 mb-3">
|
<div class="col-md-6 mb-3">
|
||||||
<label for="edit_logradouro" class="form-label">Logradouro</label>
|
<label for="edit_rua" class="form-label">Rua</label>
|
||||||
<input type="text" class="form-control" id="edit_logradouro" name="rua">
|
<input type="text" class="form-control" id="edit_rua" name="rua">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-2 mb-3">
|
<div class="col-md-2 mb-3">
|
||||||
<label for="edit_numero" class="form-label">Número</label>
|
<label for="edit_numero" class="form-label">Número</label>
|
||||||
@@ -212,10 +212,10 @@
|
|||||||
<div class="col-md-6 mb-3">
|
<div class="col-md-6 mb-3">
|
||||||
<label for="edit_estado_militante" class="form-label">Estado</label>
|
<label for="edit_estado_militante" class="form-label">Estado</label>
|
||||||
<select class="form-select" id="edit_estado_militante" name="estado">
|
<select class="form-select" id="edit_estado_militante" name="estado">
|
||||||
<option value="ativo">Ativo</option>
|
<option value="ATIVO">Ativo</option>
|
||||||
<option value="licenciado">Licenciado</option>
|
<option value="LICENCIADO">Licenciado</option>
|
||||||
<option value="suspenso">Suspenso</option>
|
<option value="SUSPENSO">Suspenso</option>
|
||||||
<option value="desligado">Desligado</option>
|
<option value="DESLIGADO">Desligado</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6 mb-3">
|
<div class="col-md-6 mb-3">
|
||||||
@@ -228,24 +228,25 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- Responsabilidades -->
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label d-block">Responsabilidades</label>
|
<label class="form-label d-block">Responsabilidades</label>
|
||||||
<div class="row g-3">
|
<div class="row g-3">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="edit_resp_1" name="responsabilidades" value="1">
|
<input type="checkbox" class="form-check-input" id="edit_resp_1" name="responsabilidades" value="256">
|
||||||
<label class="form-check-label" for="edit_resp_1">Finanças</label>
|
<label class="form-check-label" for="edit_resp_1">Finanças</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="edit_resp_2" name="responsabilidades" value="2">
|
<input type="checkbox" class="form-check-input" id="edit_resp_2" name="responsabilidades" value="512">
|
||||||
<label class="form-check-label" for="edit_resp_2">Imprensa</label>
|
<label class="form-check-label" for="edit_resp_2">Imprensa</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="edit_resp_4" name="responsabilidades" value="4">
|
<input type="checkbox" class="form-check-input" id="edit_resp_4" name="responsabilidades" value="64">
|
||||||
<label class="form-check-label" for="edit_resp_4">Quadro-Orientador</label>
|
<label class="form-check-label" for="edit_resp_4">Quadro-Orientador</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user