grantforge-api / backend /core /date_utils.py
GrantForge Bot
Deploy to Hugging Face
afd56bc
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