From 156078ff3ab0435f1dc4a177e099bb7ca1b9aa10 Mon Sep 17 00:00:00 2001 From: elpatron Date: Thu, 20 Mar 2025 11:55:07 +0100 Subject: [PATCH] =?UTF-8?q?Version=201.2.13:=20Korrektur=20der=20SQL-Abfra?= =?UTF-8?q?ge=20f=C3=BCr=20die=20allgemeine=20Suche?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 5 ++ README.md | 4 +- app.py | 199 +++++++++++++-------------------------------------- 3 files changed, 57 insertions(+), 151 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f46d081..0c64d7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ Alle wichtigen Änderungen an diesem Projekt werden in dieser Datei dokumentiert Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.0.0/), und dieses Projekt adhäriert zu [Semantic Versioning](https://semver.org/lang/de/). +## [1.2.13] - 2024-03-20 +### Fixed +- Korrektur der Parameteranzahl in der SQL-Abfrage für die allgemeine Suche +- Behebung des Fehlers bei der Suche in allen Datenbankfeldern + ## [v1.2.12] - 2024-03-19 ### Geändert - Performance-Optimierung der Suchfunktion durch Reduzierung der Suchfelder diff --git a/README.md b/README.md index 73e3194..77c873c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# medisoftware Kundensuche +# Medi-Customers Eine moderne Webanwendung zur Suche und Verwaltung von Kundendaten, die MEDISOFT und MEDICONSULT Daten kombiniert. @@ -14,7 +14,7 @@ Eine moderne Webanwendung zur Suche und Verwaltung von Kundendaten, die MEDISOFT ## Version -Aktuelle Version: v1.2.12 +Aktuelle Version: 1.2.13 ## Installation diff --git a/app.py b/app.py index 9575f28..dfec69c 100644 --- a/app.py +++ b/app.py @@ -18,7 +18,7 @@ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Version der Anwendung -VERSION = "1.2.12" +VERSION = "1.2.13" # Pfad zur Datenbank DB_FILE = 'data/customers.db' @@ -174,133 +174,16 @@ def import_csv(): if conn: conn.close() -def search_customers(): - try: - if request.method == 'POST': - data = request.get_json() - query = data.get('query', '') - tag = data.get('tag', 'medisoft') - else: - query = request.args.get('q', '') - name = request.args.get('name', '') - ort = request.args.get('ort', '') - nummer = request.args.get('nummer', '') - plz = request.args.get('plz', '') - fachrichtung = request.args.get('fachrichtung', '') - operator = request.args.get('operator', 'or') - tag = request.args.get('tag', 'medisoft') - - conn = get_db_connection() - c = conn.cursor() - - # Baue die SQL-Abfrage - query = ''' - SELECT - nummer, - name, - strasse, - plz, - ort, - telefon, - mobil, - email, - fachrichtung, - tag, - handy, - tele_firma, - kontakt1, - kontakt2, - kontakt3 - FROM customers - WHERE 1=1 - ''' - params = [] - - # Füge die Suchbedingungen hinzu - if query: - # Optimierte Suche mit FTS (Full Text Search) - query += """ - AND ( - name LIKE ? OR - nummer LIKE ? OR - fachrichtung LIKE ? - ) - """ - search_term = f"%{query}%" - params.extend([search_term, search_term, search_term]) - - if name: - query += " AND name LIKE ?" - params.append(f"%{name}%") - - if ort: - query += " AND ort LIKE ?" - params.append(f"%{ort}%") - - if nummer: - query += " AND nummer LIKE ?" - params.append(f"%{nummer}%") - - if plz: - query += " AND plz LIKE ?" - params.append(f"%{plz}%") - - if fachrichtung: - query += " AND fachrichtung LIKE ?" - params.append(f"%{fachrichtung}%") - - # Filter nach Tag - if tag != 'all': - query += " AND tag = ?" - params.append(tag) - - # Füge LIMIT hinzu und optimiere die Sortierung - query += " ORDER BY name LIMIT 100" - - # Führe die Abfrage aus - cursor = conn.cursor() - cursor.execute(query, params) - results = cursor.fetchall() - - formatted_results = [] - for row in results: - customer = { - 'nummer': row[0], - 'name': row[1], - 'strasse': row[2], - 'plz': row[3], - 'ort': row[4], - 'telefon': row[5], - 'mobil': row[6], - 'email': row[7], - 'fachrichtung': row[8], - 'tag': row[9], - 'handy': row[10], - 'tele_firma': row[11], - 'kontakt1': row[12], - 'kontakt2': row[13], - 'kontakt3': row[14] - } - formatted_results.append(customer) - - conn.close() - return jsonify(formatted_results) - - except Exception as e: - print(f"Fehler bei der Suche: {str(e)}") - return jsonify({'error': str(e)}), 500 - def clean_dataframe(df): """Konvertiert NaN-Werte in None für JSON-Kompatibilität""" return df.replace({np.nan: None}) - @app.route('/login', methods=['GET', 'POST']) def login(): # Überprüfe, ob die Client-IP in einem der erlaubten Bereiche liegt client_ip = request.headers.get('X-Forwarded-For', request.remote_addr) - # Überprüfe, ob die Client-IP in einem der erlaubten Bereiche liegt + # Überprüfe, ob die Client-IP in einem der erlaubten Bereichen liegt is_allowed = any(isIPInSubnet(client_ip, range.strip()) for range in ALLOWED_IP_RANGES if range.strip()) if is_allowed: @@ -339,17 +222,24 @@ def search(): return jsonify({'error': 'Nicht eingeloggt'}), 401 try: - # Hole die Suchparameter - q = request.args.get('q', '').strip() - name = request.args.get('name', '').strip() - ort = request.args.get('ort', '').strip() - nummer = request.args.get('nummer', '').strip() - plz = request.args.get('plz', '').strip() - fachrichtung = request.args.get('fachrichtung', '').strip() - selected_tag = request.args.get('tag', 'medisoft') + if request.method == 'POST': + data = request.get_json() + search_query = data.get('query', '') + tag = data.get('tag', 'medisoft') + else: + search_query = request.args.get('q', '') + name = request.args.get('name', '') + ort = request.args.get('ort', '') + nummer = request.args.get('nummer', '') + plz = request.args.get('plz', '') + fachrichtung = request.args.get('fachrichtung', '') + tag = request.args.get('tag', 'medisoft') + + conn = get_db_connection() + c = conn.cursor() # Baue die SQL-Abfrage - query = ''' + sql_query = ''' SELECT nummer, name, @@ -372,54 +262,65 @@ def search(): params = [] # Füge die Suchbedingungen hinzu - if q: + if search_query: # Optimierte Suche mit FTS (Full Text Search) - query += """ + sql_query += """ AND ( name LIKE ? OR nummer LIKE ? OR - fachrichtung LIKE ? + fachrichtung LIKE ? OR + ort LIKE ? OR + plz LIKE ? OR + strasse LIKE ? OR + telefon LIKE ? OR + mobil LIKE ? OR + email LIKE ? OR + bemerkung LIKE ? OR + tag LIKE ? OR + handy LIKE ? OR + tele_firma LIKE ? OR + kontakt1 LIKE ? OR + kontakt2 LIKE ? OR + kontakt3 LIKE ? ) """ - search_term = f"%{q}%" - params.extend([search_term, search_term, search_term]) + search_term = f"%{search_query}%" + params.extend([search_term] * 16) # 16 Felder für die allgemeine Suche if name: - query += " AND name LIKE ?" + sql_query += " AND name LIKE ?" params.append(f"%{name}%") if ort: - query += " AND ort LIKE ?" + sql_query += " AND ort LIKE ?" params.append(f"%{ort}%") if nummer: - query += " AND nummer LIKE ?" + sql_query += " AND nummer LIKE ?" params.append(f"%{nummer}%") if plz: - query += " AND plz LIKE ?" + sql_query += " AND plz LIKE ?" params.append(f"%{plz}%") if fachrichtung: - query += " AND fachrichtung LIKE ?" + sql_query += " AND fachrichtung LIKE ?" params.append(f"%{fachrichtung}%") # Filter nach Tag - if selected_tag != 'all': - query += " AND tag = ?" - params.append(selected_tag) + if tag != 'all': + sql_query += " AND tag = ?" + params.append(tag) # Füge LIMIT hinzu und optimiere die Sortierung - query += " ORDER BY name LIMIT 100" + sql_query += " ORDER BY name LIMIT 100" # Führe die Abfrage aus - conn = get_db_connection() cursor = conn.cursor() - cursor.execute(query, params) + cursor.execute(sql_query, params) results = cursor.fetchall() - # Formatiere die Ergebnisse - customers = [] + formatted_results = [] for row in results: customer = { 'nummer': row[0], @@ -438,10 +339,10 @@ def search(): 'kontakt2': row[13], 'kontakt3': row[14] } - customers.append(customer) - + formatted_results.append(customer) + conn.close() - return jsonify(customers) + return jsonify(formatted_results) except Exception as e: logger.error(f"Fehler bei der Suche: {str(e)}")