import csv from io import TextIOWrapper from config import item_attributes def get_csv_data(file): csv_file = TextIOWrapper(file, encoding='utf-8') reader = csv.DictReader(csv_file, delimiter='|') # Validate CSV headers based on config required_headers = {attrib.display_name for attrib in item_attributes} # Use display names csv_headers = set(reader.fieldnames) # Get headers present in the CSV file # Check if the required headers exist if not required_headers.issubset(csv_headers): raise ValueError(f"CSV file must include headers: {', '.join(required_headers)}.") # Check for invalid headers if extra_headers := csv_headers - required_headers: raise ValueError(f"Unexpected headers found: {', '.join(extra_headers)}") # Map display names to attribute names display_to_attrib = {attrib.display_name: attrib.attrib_name for attrib in item_attributes} # Extract data dynamically based on config return [ {display_to_attrib[header]: row[header] for header in required_headers} for row in reader ]