add worker requirements
This commit is contained in:
@@ -2,7 +2,7 @@ import datetime
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
from rota.shifts import NoWorkers, RotaBuilder, SingleShift, days
|
||||
from rota.shifts import NoWorkers, RotaBuilder, SingleShift, WorkerRequirement, days
|
||||
import typer
|
||||
import subprocess
|
||||
|
||||
@@ -30,6 +30,7 @@ from rota.workers import (
|
||||
OutOfProgramme,
|
||||
)
|
||||
|
||||
|
||||
@app.command()
|
||||
def main(
|
||||
suspend_on_finish: bool = False,
|
||||
@@ -40,11 +41,13 @@ def main(
|
||||
weeks: int = 26,
|
||||
bom: int = 1,
|
||||
):
|
||||
|
||||
rota_start_date = start_date.date()
|
||||
|
||||
Rota = RotaBuilder(
|
||||
rota_start_date, weeks_to_rota=weeks, balance_offset_modifier=bom, name="proc_rota"
|
||||
rota_start_date,
|
||||
weeks_to_rota=weeks,
|
||||
balance_offset_modifier=bom,
|
||||
name="proc_rota",
|
||||
)
|
||||
# Rota = RotaBuilder(start_date, weeks_to_rota=20, balance_offset_modifier=1)
|
||||
Rota.constraint_options["balance_weekends"] = True
|
||||
@@ -54,6 +57,17 @@ def main(
|
||||
Rota.constraint_options["hard_constrain_pair_separation"] = True
|
||||
# Rota.constraint_options["avoid_st2_first_month"] = True
|
||||
|
||||
wr = [
|
||||
WorkerRequirement(
|
||||
end_date=datetime.datetime.strptime("2025-06-02", "%Y-%m-%d").date(),
|
||||
number=3,
|
||||
),
|
||||
WorkerRequirement(
|
||||
start_date=datetime.datetime.strptime("2025-06-02", "%Y-%m-%d").date(),
|
||||
number=4,
|
||||
),
|
||||
]
|
||||
|
||||
Rota.add_shifts(
|
||||
SingleShift(
|
||||
sites=(
|
||||
@@ -137,8 +151,8 @@ def main(
|
||||
length=12.5,
|
||||
days=days[4:],
|
||||
balance_offset=3,
|
||||
#rota_on_nwds=True,
|
||||
#force_as_block=True,
|
||||
# rota_on_nwds=True,
|
||||
# force_as_block=True,
|
||||
assign_as_block=True,
|
||||
constraint=[{"name": "pre", "options": 2}, {"name": "post", "options": 2}],
|
||||
# force_as_block_unless_nwd=True
|
||||
@@ -209,7 +223,7 @@ def main(
|
||||
balance_offset=3.9,
|
||||
balance_weighting=1,
|
||||
# hard_constrain_shift=False,
|
||||
workers_required=3,
|
||||
workers_required=wr,
|
||||
force_as_block=True,
|
||||
rota_on_nwds=True,
|
||||
constraint=[
|
||||
@@ -223,7 +237,7 @@ def main(
|
||||
{"name": "limit_grade_number", "options": {2: 1}},
|
||||
{"name": "minimum_grade_number", "options": (4, 1)},
|
||||
],
|
||||
end_date=datetime.datetime.strptime("2025-06-01", "%Y-%m-%d").date(),
|
||||
#end_date=datetime.datetime.strptime("2025-06-01", "%Y-%m-%d").date(),
|
||||
),
|
||||
SingleShift(
|
||||
sites=[
|
||||
@@ -239,7 +253,7 @@ def main(
|
||||
balance_offset=2.9,
|
||||
balance_weighting=1,
|
||||
# hard_constrain_shift=False,
|
||||
workers_required=3,
|
||||
workers_required=wr,
|
||||
force_as_block=True,
|
||||
rota_on_nwds=True,
|
||||
constraint=[
|
||||
@@ -253,62 +267,62 @@ def main(
|
||||
{"name": "limit_grade_number", "options": {2: 1}},
|
||||
{"name": "minimum_grade_number", "options": (4, 1)},
|
||||
],
|
||||
end_date=datetime.datetime.strptime("2025-06-01", "%Y-%m-%d").date(),
|
||||
),
|
||||
SingleShift(
|
||||
sites=sites,
|
||||
name="night_weekday4",
|
||||
length=12.25,
|
||||
days=days[:4],
|
||||
balance_offset=3.9,
|
||||
balance_weighting=1,
|
||||
# hard_constrain_shift=False,
|
||||
workers_required=NIGHT_REGISTRAR_NUMBER,
|
||||
force_as_block=True,
|
||||
rota_on_nwds=True,
|
||||
constraint=[
|
||||
{"name": "night"},
|
||||
{"name": "pre", "options": 2},
|
||||
{"name": "post", "options": 2},
|
||||
{
|
||||
"name": "require_remote_site_presence_week",
|
||||
"options": ("plymouth", 1),
|
||||
},
|
||||
{"name": "limit_grade_number", "options": {2: 1}},
|
||||
{"name": "minimum_grade_number", "options": (4, 1)},
|
||||
],
|
||||
start_date=datetime.datetime.strptime("2025-06-02", "%Y-%m-%d").date(),
|
||||
),
|
||||
SingleShift(
|
||||
sites=[
|
||||
*sites,
|
||||
"plymouth twilights, weekends and weekend nights",
|
||||
"truro twilights and weekend nights",
|
||||
"weekend nights",
|
||||
"truro twilights, weekends and weekend nights",
|
||||
],
|
||||
name="night_weekend4",
|
||||
length=12.25,
|
||||
days=days[4:],
|
||||
balance_offset=2.9,
|
||||
balance_weighting=1,
|
||||
# hard_constrain_shift=False,
|
||||
workers_required=NIGHT_REGISTRAR_NUMBER,
|
||||
force_as_block=True,
|
||||
rota_on_nwds=True,
|
||||
constraint=[
|
||||
{"name": "night"},
|
||||
{"name": "pre", "options": 2},
|
||||
{"name": "post", "options": 3},
|
||||
{
|
||||
"name": "require_remote_site_presence_week",
|
||||
"options": ("plymouth", 1),
|
||||
},
|
||||
{"name": "limit_grade_number", "options": {2: 1}},
|
||||
{"name": "minimum_grade_number", "options": (4, 1)},
|
||||
],
|
||||
start_date=datetime.datetime.strptime("2025-06-02", "%Y-%m-%d").date(),
|
||||
#end_date=datetime.datetime.strptime("2025-06-01", "%Y-%m-%d").date(),
|
||||
),
|
||||
# SingleShift(
|
||||
# sites=sites,
|
||||
# name="night_weekday4",
|
||||
# length=12.25,
|
||||
# days=days[:4],
|
||||
# balance_offset=3.9,
|
||||
# balance_weighting=1,
|
||||
# # hard_constrain_shift=False,
|
||||
# workers_required=NIGHT_REGISTRAR_NUMBER,
|
||||
# force_as_block=True,
|
||||
# rota_on_nwds=True,
|
||||
# constraint=[
|
||||
# {"name": "night"},
|
||||
# {"name": "pre", "options": 2},
|
||||
# {"name": "post", "options": 2},
|
||||
# {
|
||||
# "name": "require_remote_site_presence_week",
|
||||
# "options": ("plymouth", 1),
|
||||
# },
|
||||
# {"name": "limit_grade_number", "options": {2: 1}},
|
||||
# {"name": "minimum_grade_number", "options": (4, 1)},
|
||||
# ],
|
||||
# start_date=datetime.datetime.strptime("2025-06-02", "%Y-%m-%d").date(),
|
||||
# ),
|
||||
# SingleShift(
|
||||
# sites=[
|
||||
# *sites,
|
||||
# "plymouth twilights, weekends and weekend nights",
|
||||
# "truro twilights and weekend nights",
|
||||
# "weekend nights",
|
||||
# "truro twilights, weekends and weekend nights",
|
||||
# ],
|
||||
# name="night_weekend4",
|
||||
# length=12.25,
|
||||
# days=days[4:],
|
||||
# balance_offset=2.9,
|
||||
# balance_weighting=1,
|
||||
# # hard_constrain_shift=False,
|
||||
# workers_required=NIGHT_REGISTRAR_NUMBER,
|
||||
# force_as_block=True,
|
||||
# rota_on_nwds=True,
|
||||
# constraint=[
|
||||
# {"name": "night"},
|
||||
# {"name": "pre", "options": 2},
|
||||
# {"name": "post", "options": 3},
|
||||
# {
|
||||
# "name": "require_remote_site_presence_week",
|
||||
# "options": ("plymouth", 1),
|
||||
# },
|
||||
# {"name": "limit_grade_number", "options": {2: 1}},
|
||||
# {"name": "minimum_grade_number", "options": (4, 1)},
|
||||
# ],
|
||||
# start_date=datetime.datetime.strptime("2025-06-02", "%Y-%m-%d").date(),
|
||||
# ),
|
||||
)
|
||||
|
||||
# Rota.add_grade_constraint_by_week([2], [1, 2], ["night_weekday", "night_weekend"])
|
||||
@@ -381,7 +395,7 @@ def main(
|
||||
elif "to" in dates:
|
||||
s, e = dates.split(" to ")
|
||||
else:
|
||||
raise ValueError(f"Cannot parse OOP dates: {dates}")
|
||||
raise ValueError(f"Cannot parse OOP dates: '{oop}' for {worker}")
|
||||
try:
|
||||
formatted_oops.append(
|
||||
{
|
||||
@@ -474,13 +488,13 @@ def main(
|
||||
# Rota.build_model()
|
||||
|
||||
solver_options = {"ratio": ratio, "seconds": time_to_run, "threads": 10}
|
||||
#solver_options = {"seconds": time_to_run, "threads": 10}
|
||||
# solver_options = {"seconds": time_to_run, "threads": 10}
|
||||
|
||||
# start_time = time.time()
|
||||
Rota.build_and_solve(solver_options, export=True, solve=solve, solver="appsi_highs")
|
||||
|
||||
#Rota.solve_shifts_by_block(solver_options, block_length=13)
|
||||
#Rota.solve_shifts_individually(solver_options)
|
||||
# Rota.solve_shifts_by_block(solver_options, block_length=13)
|
||||
# Rota.solve_shifts_individually(solver_options)
|
||||
# Rota.solve_model(options=solver_options)
|
||||
# end_time = time.time()
|
||||
|
||||
@@ -503,7 +517,9 @@ def main(
|
||||
|
||||
# Rota.export_rota_to_html("proc_rota")
|
||||
# Rota.export_rota_to_csv("rota")
|
||||
subprocess.run(["scp", Rota.exported_rota_file, "ross@46.101.13.46:proc/proc-rota/output/"])
|
||||
subprocess.run(
|
||||
["scp", Rota.exported_rota_file, "ross@46.101.13.46:proc/proc-rota/output/"]
|
||||
)
|
||||
|
||||
if suspend_on_finish:
|
||||
os.system("systemctl suspend")
|
||||
|
||||
Reference in New Issue
Block a user