|
|
from datetime import datetime, date |
|
|
from . import domain |
|
|
|
|
|
|
|
|
|
|
|
def employee_to_model(employee: domain.Employee) -> domain.EmployeeModel: |
|
|
return domain.EmployeeModel( |
|
|
name=employee.name, |
|
|
skills=list(employee.skills), |
|
|
unavailable_dates=[d.isoformat() for d in employee.unavailable_dates], |
|
|
undesired_dates=[d.isoformat() for d in employee.undesired_dates], |
|
|
desired_dates=[d.isoformat() for d in employee.desired_dates], |
|
|
) |
|
|
|
|
|
|
|
|
def shift_to_model(shift: domain.Shift) -> domain.ShiftModel: |
|
|
return domain.ShiftModel( |
|
|
id=shift.id, |
|
|
start=shift.start.isoformat(), |
|
|
end=shift.end.isoformat(), |
|
|
location=shift.location, |
|
|
required_skill=shift.required_skill, |
|
|
employee=employee_to_model(shift.employee) if shift.employee else None, |
|
|
) |
|
|
|
|
|
|
|
|
def schedule_to_model( |
|
|
schedule: domain.EmployeeSchedule, |
|
|
) -> domain.EmployeeScheduleModel: |
|
|
return domain.EmployeeScheduleModel( |
|
|
employees=[employee_to_model(e) for e in schedule.employees], |
|
|
shifts=[shift_to_model(s) for s in schedule.shifts], |
|
|
score=str(schedule.score) if schedule.score else None, |
|
|
solver_status=schedule.solver_status.name if schedule.solver_status else None, |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
def model_to_employee(model: domain.EmployeeModel) -> domain.Employee: |
|
|
return domain.Employee( |
|
|
name=model.name, |
|
|
skills=set(model.skills), |
|
|
unavailable_dates={date.fromisoformat(d) for d in model.unavailable_dates}, |
|
|
undesired_dates={date.fromisoformat(d) for d in model.undesired_dates}, |
|
|
desired_dates={date.fromisoformat(d) for d in model.desired_dates}, |
|
|
) |
|
|
|
|
|
|
|
|
def model_to_shift(model: domain.ShiftModel, employee_lookup: dict) -> domain.Shift: |
|
|
|
|
|
employee = None |
|
|
if model.employee: |
|
|
if isinstance(model.employee, str): |
|
|
employee = employee_lookup[model.employee] |
|
|
else: |
|
|
employee = model_to_employee(model.employee) |
|
|
|
|
|
return domain.Shift( |
|
|
id=model.id, |
|
|
start=datetime.fromisoformat(model.start), |
|
|
end=datetime.fromisoformat(model.end), |
|
|
location=model.location, |
|
|
required_skill=model.required_skill, |
|
|
employee=employee, |
|
|
) |
|
|
|
|
|
|
|
|
def model_to_schedule(model: domain.EmployeeScheduleModel) -> domain.EmployeeSchedule: |
|
|
|
|
|
employees = [model_to_employee(e) for e in model.employees] |
|
|
|
|
|
|
|
|
employee_lookup = {e.name: e for e in employees} |
|
|
|
|
|
|
|
|
shifts = [model_to_shift(s, employee_lookup) for s in model.shifts] |
|
|
|
|
|
|
|
|
score = None |
|
|
if model.score: |
|
|
from solverforge_legacy.solver.score import HardSoftDecimalScore |
|
|
|
|
|
score = HardSoftDecimalScore.parse(model.score) |
|
|
|
|
|
|
|
|
solver_status = domain.SolverStatus.NOT_SOLVING |
|
|
if model.solver_status: |
|
|
solver_status = domain.SolverStatus[model.solver_status] |
|
|
|
|
|
return domain.EmployeeSchedule( |
|
|
employees=employees, shifts=shifts, score=score, solver_status=solver_status |
|
|
) |
|
|
|