From ad79724e8a96640227c4fe1b31c2d53468ea132b Mon Sep 17 00:00:00 2001 From: consultoria-as Date: Sun, 15 Feb 2026 00:42:19 +0000 Subject: [PATCH] Fix case-insensitive brand search, add hotspots endpoint and clean URLs - Make brand and model name queries case-insensitive using UPPER() - Add /api/diagrams//hotspots endpoint for fetching diagram hotspots - Add /admin and /landing clean URL routes for HTML pages Co-Authored-By: Claude Opus 4.6 --- dashboard/server.py | 76 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 11 deletions(-) diff --git a/dashboard/server.py b/dashboard/server.py index 0114d7c..a902656 100644 --- a/dashboard/server.py +++ b/dashboard/server.py @@ -59,7 +59,7 @@ def get_models_by_brand(brand_name=None): JOIN brands b ON m.brand_id = b.id JOIN model_year_engine mye ON mye.model_id = m.id JOIN vehicle_parts vp ON vp.model_year_engine_id = mye.id - WHERE b.name = ? + WHERE UPPER(b.name) = UPPER(?) ORDER BY m.name """, (brand_name,)) else: @@ -109,10 +109,10 @@ def search_vehicles(brand=None, model=None, year=None, engine=None, with_parts=T params = [] if brand: - query += " AND b.name = ?" + query += " AND UPPER(b.name) = UPPER(?)" params.append(brand) if model: - query += " AND m.name = ?" + query += " AND UPPER(m.name) = UPPER(?)" params.append(model) if year: query += " AND y.year = ?" @@ -153,6 +153,16 @@ def index(): """Serve the main dashboard page""" return send_from_directory('.', 'index.html') +@app.route('/admin') +def admin_page(): + """Serve the admin panel""" + return send_from_directory('.', 'admin.html') + +@app.route('/landing') +def landing_page(): + """Serve the customer landing page""" + return send_from_directory('.', 'customer-landing.html') + @app.route('/') def static_files(path): """Serve static files""" @@ -184,10 +194,10 @@ def api_years(): params = [] if brand: - query += " AND b.name = ?" + query += " AND UPPER(b.name) = UPPER(?)" params.append(brand) if model: - query += " AND m.name = ?" + query += " AND UPPER(m.name) = UPPER(?)" params.append(model) query += " ORDER BY y.year DESC" @@ -221,10 +231,10 @@ def api_engines(): params = [] if brand: - query += " AND b.name = ?" + query += " AND UPPER(b.name) = UPPER(?)" params.append(brand) if model: - query += " AND m.name = ?" + query += " AND UPPER(m.name) = UPPER(?)" params.append(model) if year: query += " AND y.year = ?" @@ -661,11 +671,11 @@ def api_model_year_engine(): params = [] if brand: - query += " AND b.name = ?" + query += " AND UPPER(b.name) = UPPER(?)" params.append(brand) if model: - query += " AND m.name = ?" + query += " AND UPPER(m.name) = UPPER(?)" params.append(model) if year: @@ -1127,6 +1137,50 @@ def api_diagram_detail(diagram_id): return jsonify({'error': str(e)}), 500 +@app.route('/api/diagrams//hotspots') +def api_diagram_hotspots(diagram_id): + """Get all hotspots for a specific diagram""" + try: + conn = get_db_connection() + cursor = conn.cursor() + + cursor.execute(""" + SELECT + h.id, + h.part_id, + h.callout_number, + h.label, + h.shape, + h.coords, + h.color, + p.name AS part_name, + p.oem_part_number AS part_number + FROM diagram_hotspots h + LEFT JOIN parts p ON h.part_id = p.id + WHERE h.diagram_id = ? + ORDER BY h.callout_number + """, (diagram_id,)) + + hotspots = [] + for row in cursor.fetchall(): + hotspots.append({ + 'id': row['id'], + 'part_id': row['part_id'], + 'callout_number': row['callout_number'], + 'label': row['label'], + 'shape': row['shape'], + 'coords': row['coords'], + 'color': row['color'], + 'part_name': row['part_name'], + 'part_number': row['part_number'] + }) + + conn.close() + return jsonify(hotspots) + except Exception as e: + return jsonify({'error': str(e)}), 500 + + @app.route('/api/groups//diagrams') def api_group_diagrams(group_id): """Get all diagrams for a specific part group""" @@ -2899,11 +2953,11 @@ def api_admin_list_fitment(): params.append(mye_id) if brand: - where_clause += " AND b.name = ?" + where_clause += " AND UPPER(b.name) = UPPER(?)" params.append(brand) if model: - where_clause += " AND m.name = ?" + where_clause += " AND UPPER(m.name) = UPPER(?)" params.append(model) # Count query