75 lines
2.2 KiB
Python
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()
|