From e0a6efd204bae80c47ab7deaea526ea8e40c2783 Mon Sep 17 00:00:00 2001 From: Power BI Dev Date: Mon, 27 Jul 2026 22:10:10 +0700 Subject: [PATCH] fix python 3.8 compat for edoxid calendar sync apache/airflow:2.7.1 base image ships Python 3.8, which doesn't have zoneinfo (3.9+) and can't evaluate `X | Y` / list[X] type hints at runtime (3.10+). Add `from __future__ import annotations` everywhere and swap zoneinfo -> pytz (already a dependency in this repo). --- scripts/edoxid_calendar_config.py | 2 ++ scripts/edoxid_calendar_database.py | 2 ++ scripts/edoxid_calendar_gmail.py | 2 ++ scripts/edoxid_calendar_google.py | 24 ++++++++++++++---------- scripts/edoxid_calendar_state_store.py | 2 ++ scripts/edoxid_calendar_sync.py | 7 +++++-- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/scripts/edoxid_calendar_config.py b/scripts/edoxid_calendar_config.py index 3577fe3..9b6de87 100644 --- a/scripts/edoxid_calendar_config.py +++ b/scripts/edoxid_calendar_config.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from dataclasses import dataclass diff --git a/scripts/edoxid_calendar_database.py b/scripts/edoxid_calendar_database.py index 14c0818..1474b90 100644 --- a/scripts/edoxid_calendar_database.py +++ b/scripts/edoxid_calendar_database.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from datetime import date, datetime import pymysql diff --git a/scripts/edoxid_calendar_gmail.py b/scripts/edoxid_calendar_gmail.py index 669939d..af5d18d 100644 --- a/scripts/edoxid_calendar_gmail.py +++ b/scripts/edoxid_calendar_gmail.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import base64 from email.mime.text import MIMEText diff --git a/scripts/edoxid_calendar_google.py b/scripts/edoxid_calendar_google.py index 9818353..bcf3f91 100644 --- a/scripts/edoxid_calendar_google.py +++ b/scripts/edoxid_calendar_google.py @@ -1,6 +1,8 @@ -from datetime import datetime, timedelta -from zoneinfo import ZoneInfo +from __future__ import annotations +from datetime import datetime, timedelta + +import pytz from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from googleapiclient.discovery import build @@ -8,7 +10,7 @@ from googleapiclient.errors import HttpError from scripts.edoxid_calendar_config import GoogleConfig -JAKARTA_TZ = ZoneInfo("Asia/Jakarta") +JAKARTA_TZ = pytz.timezone("Asia/Jakarta") TYPE_LABELS = { 1: "Seminar Proposal", @@ -34,7 +36,9 @@ def get_schedule_datetime(submission: dict) -> datetime: schedule = submission["schedule"] if isinstance(schedule, str): schedule = datetime.fromisoformat(schedule) - return schedule.replace(tzinfo=JAKARTA_TZ) + if schedule.tzinfo is not None: + return schedule + return JAKARTA_TZ.localize(schedule) def get_type_label(submission: dict) -> str: @@ -50,8 +54,8 @@ def format_indonesian_date(date: datetime) -> str: def build_description(submission: dict) -> str: schedule = get_schedule_datetime(submission) type_label = get_type_label(submission) - pembimbing = [v for v in submission["verificators"] if v["type"] == "Pembimbing"] - penguji = [v for v in submission["verificators"] if v["type"] == "Penguji"] + pembimbing = [v["name"] for v in submission["verificators"] if v["type"] == "Pembimbing"] + penguji = [v["name"] for v in submission["verificators"] if v["type"] == "Penguji"] lines = [ f"UNDANGAN {type_label.upper()} SECARA LURING", @@ -69,10 +73,10 @@ def build_description(submission: dict) -> str: "", ] - for i, v in enumerate(pembimbing, start=1): - lines.append(f"📕 Pembimbing {i} : {v['name']}") - for i, v in enumerate(penguji, start=1): - lines.append(f"📒 Penguji {i} : {v['name']}") + for i, name in enumerate(pembimbing, start=1): + lines.append(f"📕 Pembimbing {i} : {name}") + for i, name in enumerate(penguji, start=1): + lines.append(f"📒 Penguji {i} : {name}") lines += [ "", diff --git a/scripts/edoxid_calendar_state_store.py b/scripts/edoxid_calendar_state_store.py index defe633..2161d03 100644 --- a/scripts/edoxid_calendar_state_store.py +++ b/scripts/edoxid_calendar_state_store.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import hashlib import json import sqlite3 diff --git a/scripts/edoxid_calendar_sync.py b/scripts/edoxid_calendar_sync.py index 7720605..2c49242 100644 --- a/scripts/edoxid_calendar_sync.py +++ b/scripts/edoxid_calendar_sync.py @@ -1,6 +1,9 @@ +from __future__ import annotations + import logging from datetime import datetime, timedelta -from zoneinfo import ZoneInfo + +import pytz from scripts.edoxid_calendar_config import ( get_db_config, @@ -22,7 +25,7 @@ from scripts.edoxid_calendar_state_store import StateStore logger = logging.getLogger(__name__) -JAKARTA_TZ = ZoneInfo("Asia/Jakarta") +JAKARTA_TZ = pytz.timezone("Asia/Jakarta") # Toleransi jendela waktu untuk cek reminder — harus >= interval polling DAG (5 menit) # supaya tidak ada window yang "kelewat" di antara 2 run.