import datetime import logging import re logger = logging.getLogger(__name__) def is_grant_active(deadline_str: str) -> bool: """ Sprawdza, czy podana data (deadline) nie upłynęła. Jeśli brak danych lub format nierozpoznany, domyślnie zakłada, że nabór jest aktywny, aby nie odrzucać potencjalnie wartościowych programów. """ if not deadline_str or not isinstance(deadline_str, str): return True deadline_str = deadline_str.strip().lower() if deadline_str in ["brak danych", "brak", "ciągły", "do wyczerpania alokacji"]: return True # Obsługa "do YYYY-MM-DD" deadline_str = deadline_str.replace("do ", "").strip() # Próba sparsowania formatu YYYY-MM-DD match_iso = re.search(r"(\d{4})-(\d{2})-(\d{2})", deadline_str) if match_iso: year, month, day = map(int, match_iso.groups()) try: deadline_date = datetime.date(year, month, day) return deadline_date >= datetime.date.today() except ValueError: pass # Próba sparsowania formatu DD.MM.YYYY match_pl = re.search(r"(\d{2})\.(\d{2})\.(\d{4})", deadline_str) if match_pl: day, month, year = map(int, match_pl.groups()) try: deadline_date = datetime.date(year, month, day) return deadline_date >= datetime.date.today() except ValueError: pass # Jeśli nie uda się zinterpretować daty, zwracamy True (bezpieczniej pokazać niż ukryć) return True def filter_outdated_grants(grants: list) -> list: """ Filtruje listę naborów, usuwając te, których deadline już minął. """ active_grants = [] for grant in grants: deadline = grant.get("deadline", "") if is_grant_active(deadline): active_grants.append(grant) else: logger.info(f"Odrzucono przedawniony nabór: {grant.get('name')} (deadline: {deadline})") return active_grants