33f4666bad
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.
57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
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")
|