95 lines
3.4 KiB
Python
95 lines
3.4 KiB
Python
from flask import Flask, render_template, request, jsonify, url_for
|
|
import pandas as pd
|
|
import os
|
|
import logging
|
|
import numpy as np
|
|
|
|
app = Flask(__name__, static_folder='static')
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def clean_dataframe(df):
|
|
"""Konvertiert NaN-Werte in None für JSON-Kompatibilität"""
|
|
return df.replace({np.nan: None})
|
|
|
|
# CSV-Datei laden
|
|
def load_data():
|
|
try:
|
|
logger.info("Versuche CSV-Datei zu laden...")
|
|
if not os.path.exists('spezexpo.csv'):
|
|
logger.error("CSV-Datei 'spezexpo.csv' nicht gefunden!")
|
|
return None
|
|
|
|
df = pd.read_csv('spezexpo.csv', encoding='utf-8')
|
|
df = clean_dataframe(df)
|
|
logger.info(f"CSV-Datei erfolgreich geladen. {len(df)} Einträge gefunden.")
|
|
return df
|
|
except Exception as e:
|
|
logger.error(f"Fehler beim Laden der CSV-Datei: {str(e)}")
|
|
return None
|
|
|
|
@app.route('/')
|
|
def index():
|
|
return render_template('index.html')
|
|
|
|
@app.route('/search')
|
|
def search():
|
|
try:
|
|
# Spezifische Suchparameter
|
|
name = request.args.get('name', '').lower()
|
|
ort = request.args.get('ort', '').lower()
|
|
kundennummer = request.args.get('kundennummer', '').lower()
|
|
fachrichtung = request.args.get('fachrichtung', '').lower()
|
|
|
|
# Allgemeine Suche (für die alte Funktionalität)
|
|
query = request.args.get('q', '').lower()
|
|
|
|
logger.info(f"Suche nach - Name: {name}, Ort: {ort}, Kundennummer: {kundennummer}, Fachrichtung: {fachrichtung}, Query: {query}")
|
|
|
|
df = load_data()
|
|
if df is None:
|
|
return jsonify({"error": "Datenbank konnte nicht geladen werden"}), 500
|
|
|
|
# Basis-Mask (immer True)
|
|
mask = pd.Series(True, index=df.index)
|
|
|
|
# Spezifische Suchkriterien anwenden
|
|
if name:
|
|
name_mask = (
|
|
df['Vorname'].str.lower().str.contains(name, na=False) |
|
|
df['Nachname'].str.lower().str.contains(name, na=False)
|
|
)
|
|
mask &= name_mask
|
|
|
|
if ort:
|
|
ort_mask = df['Ort'].str.lower().str.contains(ort, na=False)
|
|
mask &= ort_mask
|
|
|
|
if kundennummer:
|
|
kunden_mask = df['Nummer'].astype(str).str.contains(kundennummer, na=False)
|
|
mask &= kunden_mask
|
|
|
|
if fachrichtung:
|
|
fach_mask = df['Fachrichtung'].str.lower().str.contains(fachrichtung, na=False)
|
|
mask &= fach_mask
|
|
|
|
# Wenn eine allgemeine Suche vorhanden ist, diese zusätzlich anwenden
|
|
if query:
|
|
query_mask = (
|
|
df['Vorname'].str.lower().str.contains(query, na=False) |
|
|
df['Nachname'].str.lower().str.contains(query, na=False) |
|
|
df['Fachrichtung'].str.lower().str.contains(query, na=False) |
|
|
df['Ort'].str.lower().str.contains(query, na=False) |
|
|
df['Nummer'].astype(str).str.contains(query, na=False)
|
|
)
|
|
mask &= query_mask
|
|
|
|
results = df[mask].to_dict('records')
|
|
logger.info(f"{len(results)} Ergebnisse gefunden")
|
|
return jsonify(results)
|
|
except Exception as e:
|
|
logger.error(f"Fehler bei der Suche: {str(e)}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
if __name__ == '__main__':
|
|
app.run(debug=True) |