JhHardwareWRS_BackPoint/scripts/migrate_attendance_point_schedules.py
2026-06-24 15:19:14 +08:00

75 lines
2.2 KiB
Python

from pathlib import Path
import sys
from sqlalchemy import text
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from app.database import engine # noqa: E402
from app.services.work_schedule import DEFAULT_WORK_SCHEDULE # noqa: E402
SCHEDULE_FIELDS = [
"day_start",
"day_end",
"lunch_start",
"lunch_end",
"dinner_start",
"dinner_end",
"overtime_start",
"overtime_end",
"night_start",
"night_end",
]
def column_exists(conn, table: str, column: str) -> bool:
return bool(conn.execute(text("""
SELECT COUNT(*)
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = :table
AND column_name = :column
"""), {"table": table, "column": column}).scalar_one())
def main() -> None:
with engine.begin() as conn:
for field in SCHEDULE_FIELDS:
if column_exists(conn, "attendance_points", field):
continue
conn.execute(text(
f"ALTER TABLE attendance_points "
f"ADD COLUMN {field} VARCHAR(5) NOT NULL DEFAULT :default_value AFTER radius_meters"
), {"default_value": DEFAULT_WORK_SCHEDULE[field]})
has_global_schedule = bool(conn.execute(text("""
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name = 'work_schedules'
""")).scalar_one())
if has_global_schedule:
set_clause = ", ".join(
f"ap.{field} = COALESCE(ws.{field}, :{field})"
for field in SCHEDULE_FIELDS
)
conn.execute(text(f"""
UPDATE attendance_points ap
JOIN work_schedules ws ON ws.id = 1
SET {set_clause}
"""), DEFAULT_WORK_SCHEDULE)
for field in SCHEDULE_FIELDS:
conn.execute(text(
f"UPDATE attendance_points SET {field} = :default_value "
f"WHERE {field} IS NULL OR {field} = ''"
), {"default_value": DEFAULT_WORK_SCHEDULE[field]})
print("attendance point schedules migrated")
if __name__ == "__main__":
main()