demographic-manager-sanitized/convert2gs.py

130 lines
3.9 KiB
Python

# 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)
))