add edoxid calendar sync dag

Sync jadwal sidang eDOXID ke Google Calendar "Jadwal Sidang" tiap 5 menit
(read-only ke doxid2022), plus reminder email H-1/1-jam via Gmail API
karena reminder Calendar bawaan tidak ikut ke kalender pribadi attendee.
This commit is contained in:
Power BI Dev
2026-07-27 21:59:27 +07:00
parent c6edee7aeb
commit 33f4666bad
9 changed files with 658 additions and 0 deletions
+56
View File
@@ -0,0 +1,56 @@
import os
from dataclasses import dataclass
@dataclass(frozen=True)
class DbConfig:
host: str
port: int
database: str
username: str
password: str
@dataclass(frozen=True)
class GoogleConfig:
client_id: str
client_secret: str
refresh_token: str
calendar_id: str
def get_db_config() -> DbConfig:
return DbConfig(
host=os.environ.get("EDOXID_DB_HOST", "203.24.50.52"),
port=int(os.environ.get("EDOXID_DB_PORT", "3306")),
database=os.environ.get("EDOXID_DB_DATABASE", "doxid2022"),
username=os.environ.get("EDOXID_DB_USERNAME", "calendar_sync_ro"),
password=os.environ["EDOXID_DB_PASSWORD"],
)
def get_google_config() -> GoogleConfig:
return GoogleConfig(
client_id=os.environ["EDOXID_GOOGLE_CLIENT_ID"],
client_secret=os.environ["EDOXID_GOOGLE_CLIENT_SECRET"],
refresh_token=os.environ["EDOXID_GOOGLE_REFRESH_TOKEN"],
# Calendar "Jadwal Sidang" milik tu@informatika.untan.ac.id
calendar_id=os.environ.get(
"EDOXID_GOOGLE_CALENDAR_ID",
"c_1a4ilomn51i1r0mccnjqe9cumg@group.calendar.google.com",
),
)
def get_state_sqlite_path() -> str:
return os.environ.get("EDOXID_STATE_SQLITE_PATH", "/opt/airflow/scripts/edoxid_calendar_state.sqlite")
def get_sync_min_date() -> str:
"""Batas bawah tanggal sidang yang disinkron, format 'YYYY-MM-DD'.
Default: hari ini — supaya run pertama TIDAK langsung mengirim invite
Calendar ke semua submission lama (2019-2026, ~1156 baris per cek 2026-07-27)
yang sudah punya schedule. Ubah lewat env var kalau memang mau backfill sengaja.
"""
return os.environ.get("EDOXID_SYNC_MIN_DATE", "today")