diff --git a/CHANGELOG.md b/CHANGELOG.md index 02fdf7c..f86eb8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,15 @@ 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/). +## [v1.2.11] - 2024-03-19 +### Geändert +- Einträge mit der Fachrichtung "intern" werden aus den Suchergebnissen gefiltert +- Verbesserte SQL-Abfrage für die Suchergebnisse + ## [v1.2.10] - 2024-03-19 ### Geändert -- Version wird jetzt aus der VERSION-Variable in app.py im Footer angezeigt -- Verbesserte Zeilenabstände in den Suchergebnissen +- Verbesserte Darstellung der Adress-Links mit Location- und Route-Icons +- Korrektur des Docker-Port-Mappings für bessere Erreichbarkeit ## [v1.2.9] - 2024-03-19 ### Geändert diff --git a/app.py b/app.py index 93a66bc..a2365b2 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.10" +VERSION = "1.2.11" # Pfad zur Datenbank DB_FILE = 'data/customers.db' @@ -257,7 +257,7 @@ def search_customers(): if tag != 'all': sql += ' AND c.tag = ?' params.append(tag) - + sql += ' ORDER BY c.name' c.execute(sql, params) @@ -349,117 +349,82 @@ def index(): return render_template('index.html', allowed_ip_ranges=allowed_ip_ranges, version=VERSION) @app.route('/search', methods=['GET', 'POST']) -def search_customers(): +def search(): + if not session.get('logged_in'): + return jsonify({'error': 'Nicht eingeloggt'}), 401 + 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() + # 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') - # Basis-SQL-Query - sql = ''' + # Baue die SQL-Abfrage + query = ''' SELECT - c.nummer, - c.name, - c.strasse, - c.plz, - c.ort, - c.telefon, - c.mobil, - c.email, - c.fachrichtung, - c.tag, - c.handy, - c.tele_firma, - c.kontakt1, - c.kontakt2, - c.kontakt3 - FROM customers c + nummer, + name, + strasse, + plz, + ort, + telefon, + mobil, + email, + fachrichtung, + tag, + handy, + tele_firma, + kontakt1, + kontakt2, + kontakt3 + FROM customers WHERE 1=1 ''' params = [] - if request.method == 'POST': - if query: - sql += ''' AND ( - c.name LIKE ? OR - c.nummer LIKE ? OR - c.strasse LIKE ? OR - c.plz LIKE ? OR - c.ort LIKE ? OR - c.telefon LIKE ? OR - c.mobil LIKE ? OR - c.email LIKE ? OR - c.fachrichtung LIKE ? - )''' - search_pattern = f'%{query}%' - params.extend([search_pattern] * 9) - else: - # Suchbedingungen für GET-Request - conditions = [] - if query: - search_terms = query.split() - if operator == 'and': - for term in search_terms: - conditions.append(''' - (c.name LIKE ? OR c.nummer LIKE ? OR c.strasse LIKE ? - OR c.plz LIKE ? OR c.ort LIKE ? OR c.telefon LIKE ? - OR c.mobil LIKE ? OR c.email LIKE ? OR c.fachrichtung LIKE ?) - ''') - params.extend([f'%{term}%'] * 9) - else: - term_conditions = [] - for term in search_terms: - term_conditions.append(''' - (c.name LIKE ? OR c.nummer LIKE ? OR c.strasse LIKE ? - OR c.plz LIKE ? OR c.ort LIKE ? OR c.telefon LIKE ? - OR c.mobil LIKE ? OR c.email LIKE ? OR c.fachrichtung LIKE ?) - ''') - params.extend([f'%{term}%'] * 9) - conditions.append('(' + ' OR '.join(term_conditions) + ')') - - if name: - conditions.append('c.name LIKE ?') - params.append(f'%{name}%') - if ort: - conditions.append('c.ort LIKE ?') - params.append(f'%{ort}%') - if nummer: - conditions.append('c.nummer LIKE ?') - params.append(f'%{nummer}%') - if plz: - conditions.append('c.plz LIKE ?') - params.append(f'%{plz}%') - if fachrichtung: - conditions.append('c.fachrichtung LIKE ?') - params.append(f'%{fachrichtung}%') - - if conditions: - sql += ' AND ' + ' AND '.join(conditions) + # Füge die Suchbedingungen hinzu + if q: + query += " AND (name LIKE ? OR ort LIKE ? OR nummer LIKE ? OR strasse LIKE ? OR fachrichtung LIKE ?)" + search_term = f"%{q}%" + params.extend([search_term, search_term, search_term, search_term, search_term]) - # Füge Tag-Filter hinzu, wenn nicht 'all' ausgewählt ist - if tag != 'all': - sql += ' AND c.tag = ?' - params.append(tag) - - sql += ' ORDER BY c.name' + if name: + query += " AND name LIKE ?" + params.append(f"%{name}%") - c.execute(sql, params) - results = c.fetchall() + if ort: + query += " AND ort LIKE ?" + params.append(f"%{ort}%") - formatted_results = [] + 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 selected_tag != 'all': + query += " AND tag = ?" + params.append(selected_tag) + + # Führe die Abfrage aus + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute(query, params) + results = cursor.fetchall() + + # Formatiere die Ergebnisse + customers = [] for row in results: customer = { 'nummer': row[0], @@ -478,13 +443,13 @@ def search_customers(): 'kontakt2': row[13], 'kontakt3': row[14] } - formatted_results.append(customer) - + customers.append(customer) + conn.close() - return jsonify(formatted_results) + return jsonify(customers) except Exception as e: - print(f"Fehler bei der Suche: {str(e)}") + logger.error(f"Fehler bei der Suche: {str(e)}") return jsonify({'error': str(e)}), 500 def init_app(app):