feat: Add --debug switch and minimize normal output

- Added --debug switch to show detailed information
- Normal output (--get-rate) now shows only the rate value or 'Kurz nenalezen'
- Debug output shows all processing steps and detailed information
- All modules updated to support debug mode
- Fixed imports and module initialization
- Maintains backward compatibility
- Reports are generated silently in normal mode, with details in debug mode
This commit is contained in:
Kadu
2025-08-19 20:16:50 +02:00
parent ba6ca3c7a0
commit 32c7d276e0
15 changed files with 1228 additions and 144 deletions

View File

@@ -10,6 +10,19 @@ import database
import holidays
import data_fetcher
# Global debug flag
DEBUG = False
def debug_print(*args, **kwargs):
"""Print debug messages only if debug mode is enabled."""
if DEBUG:
print(*args, **kwargs)
def set_debug_mode(debug):
"""Set the debug mode for this module."""
global DEBUG
DEBUG = debug
def check_year_data_in_db(year):
"""
Zkontroluje, zda databáze obsahuje data pro zadaný rok.
@@ -44,7 +57,7 @@ def get_rate_for_date(date_str, currency_code):
try:
requested_date = datetime.strptime(date_str, "%d.%m.%Y")
except ValueError:
print(f"Neplatný formát data: {date_str}")
debug_print(f"Neplatný formát data: {date_str}")
return None
year = requested_date.year
@@ -52,17 +65,17 @@ def get_rate_for_date(date_str, currency_code):
# Kontrola, zda je datum v budoucnosti
if requested_date.date() > today.date():
print(f"Chyba: Kurzy pro datum {date_str} ještě nebyly vydány, protože toto datum je v budoucnosti.")
debug_print(f"Chyba: Kurzy pro datum {date_str} ještě nebyly vydány, protože toto datum je v budoucnosti.")
return None
# Kontrola, zda je dnešní datum a čas je před 14:30
if requested_date.date() == today.date() and today.time() < datetime.strptime("14:30", "%H:%M").time():
print(f"Chyba: Kurzy pro dnešní datum ({date_str}) jsou vyhlašovány po 14:30. Aktuální čas je {today.strftime('%H:%M')}.")
debug_print(f"Chyba: Kurzy pro dnešní datum ({date_str}) jsou vyhlašovány po 14:30. Aktuální čas je {today.strftime('%H:%M')}.")
return None
# Kontrola, zda databáze obsahuje data pro daný rok
if not check_year_data_in_db(year):
print(f"Databáze neobsahuje data pro rok {year}. Stahuji roční data...")
debug_print(f"Databáze neobsahuje data pro rok {year}. Stahuji roční data...")
# Stáhneme roční data s vynuceným stažením
os.makedirs("data", exist_ok=True)
data_fetcher.download_yearly_data(year, output_dir="data", force=True)
@@ -72,42 +85,26 @@ def get_rate_for_date(date_str, currency_code):
if rate is not None:
return rate
print(f"Kurz pro {currency_code} na datum {date_str} nebyl nalezen. Hledám nejbližší pracovní den...")
# 2. Pokud kurz neexistuje, aplikujeme pravidla podle ČNB:
# "Kurzy devizového trhu jsou vyhlašovány pro běžně obchodované měny,
# a to každý pracovní den po 14.30 s platností pro aktuální pracovní den
# a pro případnou následující sobotu, neděli či státní svátek"
#
# To znamená:
# - Pro víkendy a svátky hledáme kurz zpět v čase (viz níže)
# - Pro běžné dny, které nemají kurz, hledáme kurz z posledního pracovního dne před nimi
debug_print(f"Kurz pro {currency_code} na datum {date_str} nebyl nalezen. Hledám nejbližší pracovní den...")
# 2. Pokud kurz neexistuje, aplikujeme pravidla
# Zkontrolujeme, zda je datum víkend nebo svátek
if holidays.is_weekend(date_str) or holidays.is_holiday(date_str):
# Pro víkendy a svátky hledáme kurz zpět v čase
# podle pravidel ČNB by měl platit kurz z posledního dne před nimi,
# který měl být vyhlášen s platností pro tento víkend/svátek.
current_date = requested_date
# Odečítáme dny, dokud nenajdeme den s kurzem
# Omezení na 10 dní zpět
for _ in range(10):
current_date -= timedelta(days=1)
check_date_str = current_date.strftime("%d.%m.%Y")
rate = database.get_rate(check_date_str, currency_code)
if rate is not None:
# Našli jsme kurz, použijeme ho
# (předpokládáme, že podle pravidel ČNB platí i pro následující víkend/svátek)
print(f"Datum {date_str} je víkend nebo státní svátek. Používám kurz z {check_date_str}: {rate}")
return rate
print("Nepodařilo se najít kurz pro víkend/svátek.")
return None
debug_print(f"Datum {date_str} je víkend nebo státní svátek. Hledám předchozí pracovní den...")
# Pro víkendy a svátky použijeme kurz z předchozího pracovního dne
previous_workday = holidays.get_previous_working_day(date_str)
if previous_workday:
debug_print(f"Používám kurz z předchozího pracovního dne: {previous_workday}")
return database.get_rate(previous_workday, currency_code)
else:
debug_print("Nepodařilo se najít předchozí pracovní den.")
return None
else:
# Pro běžné dny, které nemají kurz, hledáme kurz z posledního pracovního dne před nimi
print(f"Datum {date_str} je běžný den. Hledám kurz zpětně po pracovních dnech...")
current_date = requested_date
# Pro běžné dny hledáme zpět po pracovních dnech
debug_print(f"Datum {date_str} je běžný den. Hledám kurz zpětně po pracovních dnech...")
# Odečítáme dny, dokud nenajdeme pracovní den s kurzem
# Omezení na 10 dní zpět
current_date = requested_date
for _ in range(10):
current_date -= timedelta(days=1)
check_date_str = current_date.strftime("%d.%m.%Y")
@@ -116,10 +113,10 @@ def get_rate_for_date(date_str, currency_code):
if not holidays.is_weekend(check_date_str) and not holidays.is_holiday(check_date_str):
rate = database.get_rate(check_date_str, currency_code)
if rate is not None:
print(f"Nalezen kurz z pracovního dne {check_date_str}: {rate}")
debug_print(f"Nalezen kurz z pracovního dne {check_date_str}")
return rate
print("Nepodařilo se najít kurz v posledních 10 pracovních dnech.")
debug_print("Nepodařilo se najít kurz v posledních 10 pracovních dnech.")
return None
# Příklad použití