diff --git a/.gitignore b/.gitignore index f8beccd..af9048c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ __pycache__/ venv/ test.xlsx .~lock.test.xlsx# +interns.tsv +sites.tsv +demographic_data.tsv \ No newline at end of file diff --git a/convert2gs.py b/convert2gs.py new file mode 100644 index 0000000..fa9c346 --- /dev/null +++ b/convert2gs.py @@ -0,0 +1,130 @@ +# convert demographic-manager data to google sheets data +# to be interpreted by gas-demoman + +# for information on gas-demoman, see +# https://git.beepboop.systems/stupidcomputer/gas-demoman +# and https://github.com/stupidcomputer/gas-demoman + +# because the majority of the code that is in this repo +# is crap, we'll just be reimplementing the existing +# datastructures + +import json +from typing import Any + +def get_json_for_filename(filename: str) -> Any: + with open(filename, "r") as file: + return json.loads(file.read()) + +def replace_manifest_filename_references(manifest: dict) -> Any: + for site in manifest["sites"]: + to_replace = site["usedrecord"] + site["usedrecord"] = get_json_for_filename("data/" + site["usedrecord"])["payload"] + + return manifest + +json_data = get_json_for_filename("data/manifest.json") +json_data = replace_manifest_filename_references(json_data) +intern_data = get_json_for_filename("data/staffrecord.json")["payload"] + +def translate_shortcodes_to_human_readable(shortcode: Any) -> str: + mapping = { + "a": "Adult", + "c": "Child", + "wh": "White", + "as": "Asian", + "f": "Female", + "m": "Male", + "1+": "More than one race", + "nh": "Not Hispanic", + "h": "Hispanic", + "b/aa": "Black/African American", + "unk": "Unknown", + "u/o": "Unknown/Other", + "ai/an": "American Indian/Alaskan Native", + "nh/opi": "Native Hawaiian/Other Pacific Islander", + "i": "Intern", + "None": "Unknown", + } + + return mapping[str(shortcode)] + +def generate_intern_data_table(intern_data: dict) -> Any: + output = [["First Name", "Last Name", "Gender", "Ethnicity", "Race"]] + for intern in intern_data: + result = [] + name = intern["name"].split(' ') + result.append(name[0]) + result.append(name[1]) + result.append(translate_shortcodes_to_human_readable(intern["innerpayload"]["gender"])) + result.append(translate_shortcodes_to_human_readable(intern["innerpayload"]["ethnicity"])) + result.append(translate_shortcodes_to_human_readable(intern["innerpayload"]["race"])) + + output.append(result) + + return output + +def generate_site_name_data_table(manifest: dict) -> Any: + output = [["Site name", "Date", "Those Present", "Data leads", "On-site lead(s)", "Who collected?"]] + + for site in manifest["sites"]: + result = [] + result.append(site["name"]) + result.append("{} {}".format( + site["date"], + site["time"], + )) + result.append(', '.join(site["present"])) + result.append(', '.join(site["commleads"])) + result.append(', '.join(site["onsiteleads"])) + result.append(site["records"][0]["submitter"]) + + output.append(result) + + return output + +def generate_demographic_data_table(manifest: dict) -> Any: + output = [["Site name", "Count", "Age", "Gender", "Ethnicity", "Race"]] + + for site in manifest["sites"]: + for datum in site["usedrecord"]: + fields = [ + "age", + "gender", + "ethnicity", + "race" + ] + + def mapper(x) -> Any: + return translate_shortcodes_to_human_readable(datum[x]) + + fields = map(mapper, fields) + final = [site["name"], "1", *fields] + output.append(final) + + return output + +def convert_table_to_tsv(table: list[list[str]]) -> str: + output = "" + + for row in table: + output += "\t".join(row) + output += "\n" + + return output + +def write_file(filename: str, data: str) -> None: + with open(filename, "w") as file: + file.write(data) + +write_file("demographic_data.tsv", convert_table_to_tsv( + generate_demographic_data_table(json_data) +)) + +write_file("sites.tsv", convert_table_to_tsv( + generate_site_name_data_table(json_data) +)) + +write_file("interns.tsv", convert_table_to_tsv( + generate_intern_data_table(intern_data) +)) \ No newline at end of file