update
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user