Files
proc-rota/leave.py
T
2023-12-27 19:15:00 +00:00

155 lines
5.1 KiB
Python

import csv
from datetime import datetime
import re
from requests import Session
from rota.workers import Worker, NotAvailableToWork, NonWorkingDays, WorkRequests, PreferenceNotToWork, OutOfProgramme
date_re = r"[\d]{1,2}\/[\d]{1,2}\/[\d]{2}"
def load_leave(Rota):
with Session() as s:
shifts = Rota.get_shift_names()
workers = {}
headers = {
"Cache-Control": "no-cache",
"Pragma": "no-cache"
}
download = s.get("https://docs.google.com/spreadsheets/d/e/2PACX-1vTQBxt0mHoVS1D5EkQcrekqGveWyTG2MCMyV1NnrSWkptqWbdI6_myaeLT1vpbkbujXJqU6Z5nrzTh9/pub?gid=0&single=true&output=csv", headers=headers)
decoded_content = download.content.decode('utf-8')
reader = csv.reader(decoded_content.splitlines(), delimiter=',')
leave = {}
requests = {}
site_prefs = {}
order = []
n = 1
for row in reader:
row_title = row[0]
r = row[2:]
# header, extract names
if n == 1:
names = r
order = names
for name in names:
workers[name] = {}
workers[name]["leave"] = []
workers[name]["requests"] = []
workers[name]["site_pref"] = []
workers[name]["shift_balance_extra"] = {}
workers[name]["bank_holiday_extra"] = 0
for i in range(len(r)):
try:
a = order[i]
except IndexError:
continue
worker = workers[order[i]]
lower_item = r[i].lower()
if lower_item == "derriford":
lower_item = "plymouth"
if lower_item == "derriford twilights":
lower_item = "plymouth_twilights"
if row_title == "PROC site":
worker["site_pref"] = lower_item
if row_title == "Rotation":
worker["site"] = lower_item
elif row_title == "Grade":
worker["grade"] = lower_item
elif row_title == "%FTE":
worker["fte"] = lower_item
elif row_title == "NWD":
worker["nwd"] = lower_item
elif row_title == "Flexible NWD":
worker["flexible_nwd"] = lower_item
elif row_title in ("End Date", "CCT date"):
if lower_item:
date = datetime.strptime(lower_item, "%d/%m/%y").date()
worker["end_date"] = date
else:
worker["end_date"] = None
elif row_title in ("Start date",):
if lower_item:
date = datetime.strptime(lower_item, "%d/%m/%y").date()
worker["start_date"] = date
else:
worker["start_date"] = None
elif row_title == "OOP":
worker["oop"] = lower_item
elif row_title == "Group":
worker["group"] = lower_item
elif row_title == "Pair":
if lower_item == "":
worker["pair"] = None
else:
worker["pair"] = int(lower_item)
elif row_title.startswith("Extra_"):
if lower_item:
shift = row_title[len("Extra_") :]
if shift == "twilight":
shift = f"{worker['site']}_{shift}"
elif shift == "weekend":
shift = f"weekend_{worker['site']}"
worker["shift_balance_extra"][shift] = float(lower_item)
elif row_title == "bank_holidays_worked":
if lower_item:
worker["bank_holiday_extra"] = int(lower_item)
elif re.match(date_re, row_title) is not None:
if lower_item != "":
try:
try:
date = datetime.strptime(row[0], "%d/%m/%y").date()
except ValueError:
date = datetime.strptime(row[0], "%d/%m/%Y").date()
# This may be easier to do as a dict
if lower_item in shifts:
worker["requests"].append(WorkRequests(date=date, shift=lower_item))
elif lower_item in ("work_request", "happy to work", "offered"):
worker["requests"].append(WorkRequests(date=date, shift="*"))
else:
worker["leave"].append(NotAvailableToWork(date=date, reason=lower_item))
except ValueError as e:
print(f"Error with: {lower_item}")
print(f"{row=}")
raise e
n = n + 1
return workers
# load_leave()