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:
@@ -0,0 +1,55 @@
|
||||
"""
|
||||
DAG: sync jadwal sidang eDOXID -> Google Calendar "Jadwal Sidang" + reminder email.
|
||||
|
||||
Baca DB doxid2022 (read-only, user calendar_sync_ro) tiap 5 menit, lalu:
|
||||
1. create/update/delete event Google Calendar sesuai jadwal sidang yang
|
||||
baru/berubah/dibatalkan.
|
||||
2. Kirim email reminder terpisah (subjek "[PENGINGAT SEBELUM H-1]" dan
|
||||
"[PENGINGAT 1 JAM SEBELUM]") ke semua attendee (mahasiswa+pembimbing+penguji)
|
||||
pas jam H-1 07:00 dan 1 jam sebelum sidang — karena reminders.overrides
|
||||
bawaan Calendar API cuma berlaku untuk kalender pemilik event (TU), TIDAK
|
||||
ikut ke kalender pribadi tiap attendee (keterbatasan Google Calendar,
|
||||
dikonfirmasi 2026-07-27).
|
||||
|
||||
Auth Google pakai OAuth refresh token sebagai tu@informatika.untan.ac.id
|
||||
langsung (bukan service account — service account tidak bisa invite attendee
|
||||
tanpa Domain-Wide Delegation, sudah dicoba dan ditolak Google 2026-07-27).
|
||||
Refresh token perlu scope gabungan: calendar + gmail.send.
|
||||
|
||||
Tidak menyentuh kode/DB aplikasi eDOXID (`/var/www/manajemen-usulan`) sama
|
||||
sekali selain query SELECT read-only ke 3 tabel: submissions, verificators, users.
|
||||
|
||||
Environment yang wajib di-set di Coolify (service airflow-scheduler):
|
||||
EDOXID_DB_PASSWORD
|
||||
EDOXID_GOOGLE_CLIENT_ID, EDOXID_GOOGLE_CLIENT_SECRET, EDOXID_GOOGLE_REFRESH_TOKEN
|
||||
(refresh token WAJIB scope "calendar" + "gmail.send" sekaligus, bukan cuma calendar)
|
||||
Opsional (lihat scripts/edoxid_calendar_config.py untuk default):
|
||||
EDOXID_DB_HOST, EDOXID_DB_PORT, EDOXID_DB_DATABASE, EDOXID_DB_USERNAME,
|
||||
EDOXID_GOOGLE_CALENDAR_ID, EDOXID_STATE_SQLITE_PATH, EDOXID_SYNC_MIN_DATE
|
||||
"""
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from airflow import DAG
|
||||
from airflow.operators.python import PythonOperator
|
||||
|
||||
from scripts.edoxid_calendar_sync import run_sync
|
||||
|
||||
with DAG(
|
||||
dag_id="edoxid_calendar_sync",
|
||||
description="Sync jadwal sidang eDOXID ke Google Calendar 'Jadwal Sidang'",
|
||||
start_date=datetime(2026, 7, 27),
|
||||
schedule_interval="*/5 * * * *",
|
||||
catchup=False,
|
||||
max_active_runs=1,
|
||||
default_args={
|
||||
"owner": "informatika",
|
||||
"retries": 1,
|
||||
"retry_delay": timedelta(minutes=1),
|
||||
},
|
||||
tags=["edoxid", "calendar", "sidang"],
|
||||
) as dag:
|
||||
sync_task = PythonOperator(
|
||||
task_id="sync_jadwal_sidang",
|
||||
python_callable=run_sync,
|
||||
)
|
||||
Reference in New Issue
Block a user