Fix case-insensitive brand search, add hotspots endpoint and clean URLs

- Make brand and model name queries case-insensitive using UPPER()
- Add /api/diagrams/<id>/hotspots endpoint for fetching diagram hotspots
- Add /admin and /landing clean URL routes for HTML pages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-15 00:42:19 +00:00
parent e66b18f6ae
commit ad79724e8a

View File

@@ -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('/<path:path>')
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/<int:diagram_id>/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/<int:group_id>/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