This commit is contained in:
Ross
2021-06-13 21:14:21 +01:00
parent 5c54257065
commit 2b8190efb8
7 changed files with 223 additions and 328 deletions
+43 -9
View File
@@ -74,6 +74,9 @@ class SingleShift(object):
self.total_shifts = length * len(days) * len(shift_days)
def __str__(self):
return f"name: {self.name}, site: {self.site}, length: {self.length}, balance weighting: {self.balance_weighting}, balance offset: {self.balance_offset}, hard_constrain: {self.hard_constrain_shift}, workers required : {self.workers_required}, rota on nwds {self.rota_on_nwds}, assign as block: {self.assign_as_block}, force as block: {self.force_as_block}, constraints: {self.constraints}, total shifts: {self.total_shifts}"
def get_shift_summary(self):
"""
Returns a text summary of the shift
@@ -154,7 +157,7 @@ class RotaBuilder(object):
"prevent_monday_and_tuesday_after_full_weekends": [],
"prevent_fridays_before_full_weekends": [],
"prevent_thursdays_before_full_weekends": [],
"avoid_st1_first_month": False,
"avoid_st2_first_month": False,
}
# Generate a map for week, day combinations to a given date
@@ -612,7 +615,7 @@ class RotaBuilder(object):
for worker in self.workers:
if self.constraint_options[
"avoid_st1_first_month"] and worker.grade == 2:
"avoid_st2_first_month"] and worker.grade == 2:
# Avoid ST1s on the first month
self.model.constraints.add(0 == sum(
self.model.works[worker.id, week, day, shift] for week,
@@ -1201,8 +1204,10 @@ class RotaBuilder(object):
self.full_time_equivalent = sum([w.fte_adj for w in self.workers])
self.full_time_equivalent_sites = {}
self.workers_at_sites = {}
for site in self.sites:
self.workers_at_sites[site] = [w for w in self.workers if w.site == site]
self.full_time_equivalent_sites[site] = sum(
[w.fte_adj for w in self.workers if w.site == site])
@@ -1579,6 +1584,8 @@ class RotaResults(object):
timetable = []
timetable.append("<h2>Rota start date: {} ({} weeks)</h2>".format(self.rota.start_date.isoformat(), self.rota.weeks[-1]))
date_row = ["<th class='worker'></th>"]
n = 0
@@ -1590,7 +1597,13 @@ class RotaResults(object):
timetable.append("<tr class='data-row'>{}</tr>".format(
"".join(date_row)))
current_site = ""
for worker in self.rota.workers:
if worker.site != current_site:
timetable.append("<tr><th class='site-title'>{} n={} fte={}</th><tr>".format(worker.site, len(self.rota.workers_at_sites[worker.site]), self.rota.full_time_equivalent_sites[worker.site]))
current_site = worker.site
shifts = []
if worker.nwd is not None:
nwds = ", ".join(worker.nwd)
@@ -1619,13 +1632,20 @@ class RotaResults(object):
break
title = "{} ({})".format(shift_name, d)
css_class = day
unavailable_reason = ""
if model.available[worker.id, week, day] > 0:
available = True
unavailable_reason = ""
else:
available = False
css_class = "unavailable"
unavailable_reason = self.rota.unavailable_to_work
try:
unavailable_reason = self.rota.unavailable_to_work_reason[(worker.id, week, day)]
except KeyError:
print("Error getting reason")
print(worker.id, worker.name)
print("Week {}, Day {}".format(week, day))
unavailable_reason = "????"
title = "{} / {}".format(title, unavailable_reason)
bank_holiday = ""
if d in bank_holiday_map:
@@ -1641,8 +1661,8 @@ class RotaResults(object):
self.rota.work_requests_map[(worker.id, week, day)])
shift_tds.append(
"<td title='{}' class='rota-day {}' data-shift='{}' data-available='{}' data-date='{}' data-week='{}' data-day='{}'{}{}>{}</td>"
.format(title, css_class, shift_name, available, d, week,
"<td title='{}' class='rota-day {}' data-shift='{}' data-available='{}' data-unavailable_reason='{}' data-date='{}' data-week='{}' data-day='{}'{}{}>{}</td>"
.format(title, css_class, shift_name, available, unavailable_reason, d, week,
day, requests, bank_holiday, a))
shift_count = ""
@@ -1652,8 +1672,8 @@ class RotaResults(object):
shift_count_dict[s] = c
shift_count = shift_count + "{}: {}, ".format(s, c)
worker_td = "<td title='Site: {}' class='worker {}' data-nwds='{}' data-site='{}' data-worker='{}' data-fte='{}' data-fte_adj='{}' data-end_date='{}' data-worker-targets='{}' data-shift-counts='{}' data-weekend-target='{}' data-night-at-derriford='{}'>{} ({}) [{}]</td>".format(
worker.site, worker.site, nwds, worker.site, worker.name,
worker_td = "<td title='Site: {}' class='worker {}' data-nwds='{}' data-site='{}' data-worker='{}' data-fte='{}' data-fte_adj='{}' data-end_date='{}' data-worker-targets='{}' data-shift-counts='{}' data-weekend-target='{}' data-night-at-derriford='{}'><span class='name' title='{}'>{}</span> ({}) [{}]</td>".format(
worker.site, worker.site, nwds, worker.site, worker.name, worker.name,
worker.fte, worker.fte_adj, worker.end_date, worker_targets,
json.dumps(shift_count_dict),
worker.weekend_shift_target_number, worker.night_at_derriford, worker.name, worker.grade,
@@ -1697,8 +1717,22 @@ class RotaResults(object):
<div class="table-div" id="{}">
<table>{}</table>
</div>
<details>
<summary><h2>Rota settings</h2></summary>
<div>
<pre>
{}
</pre>
</details>
</div>
<details>
<summary><h2>Shifts settings</h2></summary>
<div>
{}
</div>
</details>
</body>
""".format(table_name, "\n".join(timetable))
""".format(table_name, "\n".join(timetable), json.dumps(self.rota.constraint_options, indent=4), "<br/>".join(str(i) for i in self.rota.shifts))
if include_html_tag:
html = """<html>