throttle polling outside business hours

Single DAG, single 30-min schedule instead of 5-min or two separate
DAGs. run_sync() itself decides whether to do real work: always during
business hours (default 07:00-17:00 WIB), otherwise only once per
EDOXID_OFF_HOURS_INTERVAL_MINUTES (default 120) tracked via a
last_full_sync timestamp in the sqlite state. Off-hours skips return
immediately without touching DB/Calendar/Gmail at all.
This commit is contained in:
Power BI Dev
2026-07-27 22:33:04 +07:00
parent 7a6dc7d9ae
commit a357e0622e
5 changed files with 90 additions and 9 deletions
+17 -3
View File
@@ -1,7 +1,19 @@
"""
DAG: sync jadwal sidang eDOXID -> Google Calendar "Jadwal Sidang" + reminder email.
Baca DB doxid2022 (read-only, user calendar_sync_ro) tiap 5 menit, lalu:
DAG ini trigger tiap 30 menit sepanjang hari (1 DAG, 1 schedule — bukan 2 DAG
terpisah untuk jam-kerja/luar-jam-kerja, biar sederhana), tapi `run_sync()`
sendiri yang memutuskan kerja BENERAN atau skip:
- Jam kerja (default 07:00-17:00 WIB, EDOXID_BUSINESS_HOURS_START/END): tiap
trigger (~30 menit) langsung kerja penuh.
- Di luar jam kerja: cuma kerja penuh kalau sudah >=
EDOXID_OFF_HOURS_INTERVAL_MINUTES (default 120 menit) sejak sync terakhir;
kalau belum, skip (tidak buka koneksi DB/Calendar/Gmail sama sekali, murah).
Alasan: 30 menit sepanjang hari dianggap kurang efisien (bukan soal Google
menganggap ini "bot" — ini OAuth API resmi dengan izin, bukan scraping —
tapi soal efisiensi jumlah run), tapi tetap ingin responsif di jam kerja.
Kerja penuh artinya:
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
@@ -25,7 +37,9 @@ Environment yang wajib di-set di Coolify (service airflow-scheduler):
(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
EDOXID_GOOGLE_CALENDAR_ID, EDOXID_STATE_SQLITE_PATH, EDOXID_SYNC_MIN_DATE,
EDOXID_BUSINESS_HOURS_START (default 7), EDOXID_BUSINESS_HOURS_END (default 17),
EDOXID_OFF_HOURS_INTERVAL_MINUTES (default 120)
"""
from datetime import datetime, timedelta
@@ -39,7 +53,7 @@ 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 * * * *",
schedule_interval="*/30 * * * *",
catchup=False,
max_active_runs=1,
default_args={