correcciones finales

This commit is contained in:
2026-09-11 23:30:29 +02:00
parent 5d2912f789
commit 2b8f5374c9
18 changed files with 1582 additions and 440 deletions
+51 -109
View File
@@ -16,7 +16,8 @@ app.secret_key = 'clave-secreta-navbar-app'
# Límite máximo de subida: 5 MiB
# app.config['MAX_CONTENT_LENGTH'] = 5 * 1024 * 1024
DATABASE = 'database/pyfleet.db'
# DATABASE = 'database/pyfleet.db'
DATABASE = 'database/auto.db'
PASSWORD_HASH = generate_password_hash('123')
@@ -236,7 +237,7 @@ def vehiculos_list():
NORM(modelo) LIKE ? OR
NORM(poblacion) LIKE ? OR
NORM(unidad) LIKE ? OR
NORM(denominacion) LIKE ? OR
NORM(tipo) LIKE ? OR
NORM(situacion) LIKE ?
)''')
params.extend([like] * 9)
@@ -245,7 +246,7 @@ def vehiculos_list():
rows = db.execute(
f'''SELECT id, m_oficial, m_reservada, marca, modelo, poblacion, unidad,
denominacion, tipo, situacion, lanzadestellos
tipo, situacion, lanzadestellos
FROM vehiculos
WHERE {where} {filtro_bajas}
ORDER BY id''',
@@ -329,7 +330,7 @@ def vehiculos_editar(id):
desde = request.args.get('desde', '')
hasta = request.args.get('hasta', '')
q_itv = request.args.get('q_itv', '')
origen = request.args.get('origen', '')
origen = request.args.get('origen', '')
q_viat = request.args.get('q_viat', '')
if not vehiculo:
@@ -409,12 +410,20 @@ def vehiculos_eliminar(id):
return redirect(url_for('vehiculos_list', q=q) if q else url_for('vehiculos_list'))
@app.route('/vehiculos/<int:vid>/historial/nuevo', methods=['POST'])
@login_required
def historial_nuevo(vid):
q = request.form.get('_q', '')
db = get_db()
# Recoger TODOS los parámetros de navegación del POST
q = request.form.get('_q', '')
desde = request.form.get('_desde', '')
hasta = request.form.get('_hasta', '')
q_itv = request.form.get('_q_itv', '')
origen = request.form.get('_origen', '')
q_viat = request.form.get('_q_viat', '') # ← POST no GET
# Datos del historial
h_fecha = request.form.get('h_fecha') or None
h_vehiculo_id = request.form.get('h_vehiculo_id', '').strip()
h_matricula = request.form.get('h_matricula', '').strip()
@@ -424,11 +433,7 @@ def historial_nuevo(vid):
h_grupo = request.form.get('h_grupo', '').strip()
h_observaciones = request.form.get('h_observaciones', '').strip()
desde = request.form.get('_desde', '')
hasta = request.form.get('_hasta', '')
q_itv = request.form.get('_q_itv', '')
# Obtener el NOMBRE de la población a partir del id
# Obtener nombre de población
poblacion_nombre = ''
if h_poblacion_id:
row = db.execute('SELECT poblacion FROM poblaciones WHERE id=?', (h_poblacion_id,)).fetchone()
@@ -440,32 +445,47 @@ def historial_nuevo(vid):
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''', (h_fecha, h_vehiculo_id, h_matricula, h_situacion, poblacion_nombre, h_unidad, h_grupo, h_observaciones))
# Si la unidad es BAJA, actualizar situacion del vehiculo
# Actualizar situacion del vehiculo
if h_situacion.upper() == 'BAJA':
db.execute("UPDATE vehiculos SET situacion='BAJA' WHERE id=?", (vid,))
db.execute("UPDATE vehiculos SET situacion='BAJA', poblacion='', unidad='' WHERE id=?", (vid,))
else:
db.execute("UPDATE vehiculos SET situacion=?, poblacion=?, unidad=?, grupo=? WHERE id=?", (h_situacion, poblacion_nombre, h_unidad, h_grupo, vid,))
db.execute(
"UPDATE vehiculos SET situacion=?, poblacion=?, unidad=?, grupo=? WHERE id=?",
(h_situacion, poblacion_nombre, h_unidad, h_grupo, vid)
)
db.commit()
flash('Entrada añadida al historial.', 'ok')
# Volver a ITV si venía de ahí, si no al formulario del vehículo
# Redirect según origen
if origen == 'viat':
return redirect(f'/vehiculos/{vid}/editar?origen=viat&q_viat={q_viat}')
if desde or hasta or q_itv:
return redirect(f'/vehiculos/{vid}/editar?desde={desde}&hasta={hasta}&q_itv={q_itv}')
# return redirect(f'/vehiculos/{vid}/editar?q={q}')
return redirect(f'/vehiculos/{vid}/editar?desde={desde}&hasta={hasta}&q_itv={q_itv}')
return redirect(url_for('vehiculos_editar', id=vid, q=q))
@app.route('/vehiculos/<int:vid>/historial/<int:hid>/eliminar', methods=['POST'])
@login_required
def historial_eliminar(vid, hid):
q = request.form.get('_q', '')
desde = request.form.get('_desde', '')
hasta = request.form.get('_hasta', '')
unidad_itv = request.form.get('_unidad_itv', '')
db = get_db()
# Recoger parámetros de navegación
q = request.form.get('_q', '')
desde = request.form.get('_desde', '')
hasta = request.form.get('_hasta', '')
q_itv = request.form.get('_q_itv', '')
origen = request.form.get('_origen', '')
q_viat = request.form.get('_q_viat', '') # ← POST no GET
# 1. Comprobar que el vehículo existe
vehiculo = db.execute('''
SELECT id, m_oficial
@@ -541,16 +561,16 @@ def historial_eliminar(vid, hid):
WHERE id = ?
''', (vid,))
# 7. Confirmar cambios
db.commit()
flash('Entrada eliminada del historial.', 'ok')
# Volver a ITV si venía de ahí
if desde or hasta or unidad_itv:
return redirect(f'/vehiculos/{vid}/editar?desde={desde}&hasta={hasta}&unidad_itv={unidad_itv}')
# return redirect(f'/vehiculos/{vid}/editar?q={q}')
# Redirect según origen
if origen == 'viat':
return redirect(f'/vehiculos/{vid}/editar?origen=viat&q_viat={q_viat}')
if desde or hasta or q_itv:
return redirect(f'/vehiculos/{vid}/editar?desde={desde}&hasta={hasta}&q_itv={q_itv}')
url = f'/vehiculos/{vid}/editar'
if q:
url += f'?q={q}'
@@ -625,7 +645,7 @@ def vehiculos_exportar():
ws = wb.active
ws.title = 'Vehículos'
headers = ['M. Oficial', 'M. Civil', 'Marca', 'Modelo',
headers = ['M. Oficial', 'M. Reservada', 'Marca', 'Modelo',
'Poblacion', 'Unidad', 'Grupo', 'Denominación', 'Situación' ]
header_fill = PatternFill('solid', fgColor='5C6EF8')
header_font = Font(bold=True, color='FFFFFF', size=11)
@@ -684,7 +704,8 @@ def documentos_upload(id):
q_itv = request.form.get('_q_itv', '')
origen = request.form.get('_origen', '')
q_viat = request.form.get('_q_viat', '')
nombre = request.form.get('nombre_doc', '').strip()
nombre = request.form.get('nombre_doc', '').strip() + '.pdf'
if 'pdf' not in request.files:
flash('No se seleccionó ningún archivo.', 'error')
@@ -757,7 +778,7 @@ def documentos_descargar(doc_id):
return send_from_directory(UPLOAD_FOLDER, doc['filename'],
as_attachment=True,
download_name=doc['nombre'])
# download_name=doc['nombre'] + '.pdf')
# download_name=doc['nombre'] + '.pdf'
@app.route('/vehiculos/documentos/<int:doc_id>/eliminar', methods=['POST'])
@login_required
@@ -781,85 +802,6 @@ def documentos_eliminar(doc_id):
# @app.route('/vehiculos/<int:id>/upload', methods=['POST'])
# @login_required
# def vehiculos_upload(id):
# q = request.form.get('_q', '')
# incl_bajas = request.form.get('_incl_bajas', '0')
# desde = request.form.get('_desde', '')
# hasta = request.form.get('_hasta', '')
# q_itv = request.form.get('_q_itv', '')
# origen = request.form.get('_origen', '')
# q_viat = request.form.get('_q_viat', '')
# if 'pdf' not in request.files:
# flash('No se seleccionó ningún archivo.', 'error')
# return redirect(f'/vehiculos/{id}/editar?q={q}&incl_bajas={incl_bajas}')
# file = request.files['pdf']
# if file.filename == '':
# flash('No se seleccionó ningún archivo.', 'error')
# return redirect(f'/vehiculos/{id}/editar?q={q}&incl_bajas={incl_bajas}')
# if file and allowed_file(file.filename):
# # Guardar con nombre único basado en id del vehículo
# os.makedirs(UPLOAD_FOLDER, exist_ok=True)
# filename = f'ficha_tecnica_id_{id}.pdf'
# filepath = os.path.join(UPLOAD_FOLDER, filename)
# file.save(filepath)
# # Guardar referencia en BD
# db = get_db()
# db.execute('UPDATE vehiculos SET pdf=? WHERE id=?', (filename, id))
# db.commit()
# flash('Documento PDF subido correctamente.', 'ok')
# else:
# flash('Solo se permiten archivos PDF.', 'error')
# url = f'/vehiculos/{id}/editar?q={q}&incl_bajas={incl_bajas}'
# if origen == 'viat':
# url = f'/vehiculos/{id}/editar?origen=viat&q_viat={q_viat}'
# elif desde or hasta or q_itv:
# url = f'/vehiculos/{id}/editar?desde={desde}&hasta={hasta}&q_itv={q_itv}'
# return redirect(url)
# @app.route('/vehiculos/<int:id>/pdf')
# @login_required
# def vehiculos_pdf(id):
# from flask import send_from_directory
# db = get_db()
# vehiculo = db.execute('SELECT pdf FROM vehiculos WHERE id=?', (id,)).fetchone()
# if not vehiculo or not vehiculo['pdf']:
# flash('No hay documento PDF para este vehículo.', 'error')
# return redirect(f'/vehiculos/{id}/editar')
# return send_from_directory(UPLOAD_FOLDER, vehiculo['pdf'], as_attachment=False)
# @app.route('/vehiculos/<int:id>/pdf/eliminar', methods=['POST'])
# @login_required
# def vehiculos_pdf_eliminar(id):
# q = request.form.get('_q', '')
# incl_bajas = request.form.get('_incl_bajas', '0')
# db = get_db()
# vehiculo = db.execute('SELECT pdf FROM vehiculos WHERE id=?', (id,)).fetchone()
# if vehiculo and vehiculo['pdf']:
# filepath = os.path.join(UPLOAD_FOLDER, vehiculo['pdf'])
# if os.path.exists(filepath):
# os.remove(filepath)
# db.execute('UPDATE vehiculos SET pdf=NULL WHERE id=?', (id,))
# db.commit()
# flash('Documento PDF eliminado.', 'ok')
# return redirect(f'/vehiculos/{id}/editar?q={q}&incl_bajas={incl_bajas}')
# Ruta API que devuelve unidades según población
@app.route('/api/unidades/<int:poblacion_id>')
@login_required
@@ -978,7 +920,7 @@ def itv_exportar():
ws = wb.active
ws.title = 'ITV'
headers = ['M. Oficial', 'M. Civil', 'Marca', 'Modelo',
headers = ['M. Oficial', 'M. Reservada', 'Marca', 'Modelo',
'Denominación', 'Tipo', 'Unidad', 'Población', 'Fecha ITV']
header_fill = PatternFill('solid', fgColor='5C6EF8')
header_font = Font(bold=True, color='FFFFFF', size=11)
@@ -1432,7 +1374,7 @@ def viat_exportar():
ws = wb.active
ws.title = 'Via-T'
headers = ['Via-T', 'M. Oficial', 'M. Civil', 'Marca',
headers = ['Via-T', 'M. Oficial', 'M. Reservada', 'Marca',
'Modelo', 'Población', 'Unidad', 'Tipo']
header_fill = PatternFill('solid', fgColor='5C6EF8')
header_font = Font(bold=True, color='FFFFFF', size=11)
@@ -1635,4 +1577,4 @@ if __name__ == '__main__':
# f'SELECT id, m_oficial, m_reservada, marca, modelo, poblacion, unidad, grupo, tipo, situacion FROM vehiculos WHERE {where} {filtro_bajas} ORDER BY id',
# params
# ).fetchall()