diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bac4a2..f0fc76f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ 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.0.2] - 2024-03-19 + +### Hinzugefügt +- Wetterinformationen für jeden Suchtreffer +- Integration der OpenWeather API +- Wetter-Icons und Temperaturanzeige +- Umgebungsvariablen für API-Keys + +### Geändert +- Anpassung der API-Antwortstruktur +- Verbesserte Fehlerbehandlung für API-Anfragen + ## [1.0.1] - 2024-03-19 ### Hinzugefügt diff --git a/app.py b/app.py index 2163733..c28cbcd 100644 --- a/app.py +++ b/app.py @@ -4,6 +4,8 @@ import os import logging import numpy as np from datetime import datetime +from dotenv import load_dotenv +import requests app = Flask(__name__, static_folder='static') logging.basicConfig(level=logging.DEBUG) @@ -15,6 +17,9 @@ VERSION = "1.0.1" # Pfad zur CSV-Datei CSV_FILE = "data/customers.csv" +# Lade Umgebungsvariablen +load_dotenv() + def clean_dataframe(df): """Konvertiert NaN-Werte in None für JSON-Kompatibilität""" return df.replace({np.nan: None}) @@ -35,6 +40,31 @@ def load_data(): logger.error(f"Fehler beim Laden der CSV-Datei: {str(e)}") return None +def get_weather(city): + """Holt Wetterinformationen für eine Stadt von der OpenWeather API""" + api_key = os.getenv('OPENWEATHER_API_KEY') + base_url = "http://api.openweathermap.org/data/2.5/weather" + + try: + params = { + 'q': city, + 'appid': api_key, + 'units': 'metric', # Temperatur in Celsius + 'lang': 'de' + } + response = requests.get(base_url, params=params) + data = response.json() + + if response.status_code == 200: + return { + 'temperature': round(data['main']['temp']), + 'icon': data['weather'][0]['icon'], + 'description': data['weather'][0]['description'] + } + except Exception as e: + print(f"Fehler beim Abrufen der Wetterdaten: {e}") + return None + @app.route('/') def index(): return render_template('index.html') @@ -95,7 +125,19 @@ def search(): results = df[mask].to_dict('records') logger.info(f"{len(results)} Ergebnisse gefunden") - return jsonify(results) + + # Füge Wetterinformationen für jeden Treffer hinzu + for result in results: + weather = get_weather(result['Ort']) + if weather: + result['weather'] = weather + else: + result['weather'] = None + + return jsonify({ + 'results': results, + 'total': len(results) + }) except Exception as e: logger.error(f"Fehler bei der Suche: {str(e)}") return jsonify({"error": str(e)}), 500 diff --git a/requirements.txt b/requirements.txt index c5c0cae..330e9bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ flask==3.0.2 pandas==2.2.1 numpy==1.26.4 -python-dotenv==1.0.1 \ No newline at end of file +python-dotenv==1.0.1 +requests==2.31.0 \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index 3b90e7b..8644763 100644 --- a/templates/index.html +++ b/templates/index.html @@ -139,6 +139,18 @@ margin-left: 4px; font-size: 1.2em; } + .weather-info { + display: inline-flex; + align-items: center; + margin-left: 10px; + font-size: 0.9em; + color: #666; + } + .weather-info img { + width: 24px; + height: 24px; + margin-right: 4px; + }