Spaces:
Running
Running
| 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 | |