import csv import re date_re = r"[\d]{1,2}\/[\d]{1,2}\/[\d]{2}" def load_leave(Rota, use_live_rota): file_name = "leave.csv" with open(file_name, newline="") as f: shifts = Rota.get_shift_names() workers = {} reader = csv.reader(f, delimiter=",", quotechar='"') leave = {} requests = {} site_prefs = {} order = [] n = 0 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"] 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 == "End Date": worker["end_date"] = lower_item 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"] = 0 else: worker["pair"] = int(lower_item) elif row_title.startswith("Extra_"): if lower_item: shift = row_title[len("Extra_") :] worker["shift_balance_extra"] = shift elif re.match(date_re, row_title) is not None: if lower_item != "": # This may be easier to do as a dict if lower_item in shifts: worker["requests"].append((row[0], lower_item)) else: worker["leave"].append((row[0], lower_item)) n = n + 1 return workers # load_leave()