""" ROLODEX CSV Importer """ from typing import Dict, List, Any from datetime import date from sqlalchemy.orm import Session from .base import BaseCSVImporter, ImportValidationError from app.models.rolodex import Rolodex class RolodexCSVImporter(BaseCSVImporter): """CSV importer for ROLODEX table""" @property def table_name(self) -> str: return "rolodex" @property def required_fields(self) -> List[str]: return ["id", "last"] # Only ID and last name are required @property def field_mapping(self) -> Dict[str, str]: """Map CSV headers to database field names""" return { "id": "id", "last": "last", "first": "first", "middle": "middle", "prefix": "prefix", "suffix": "suffix", "title": "title", "group": "group", "a1": "a1", "a2": "a2", "a3": "a3", "city": "city", "abrev": "abrev", "zip": "zip", "email": "email", "dob": "dob", "ss_number": "ss_number", "legal_status": "legal_status", "memo": "memo" } def create_model_instance(self, row_data: Dict[str, Any]) -> Rolodex: """Create a Rolodex instance from processed row data""" # Validate required fields if not row_data.get("id"): raise ImportValidationError("ID is required") if not row_data.get("last"): raise ImportValidationError("Last name is required") # Check for duplicate ID existing = self.db_session.query(Rolodex).filter_by(id=row_data["id"]).first() if existing: raise ImportValidationError(f"Rolodex ID '{row_data['id']}' already exists") # Parse date of birth dob = None if row_data.get("dob"): try: dob = self.parse_date(row_data["dob"]) except ValueError as e: raise ImportValidationError(f"Invalid date of birth: {e}") # Create instance with field length validation rolodex = Rolodex( id=self.normalize_string(row_data["id"], 80), last=self.normalize_string(row_data["last"], 80), first=self.normalize_string(row_data.get("first", ""), 45), middle=self.normalize_string(row_data.get("middle", ""), 45), prefix=self.normalize_string(row_data.get("prefix", ""), 45), suffix=self.normalize_string(row_data.get("suffix", ""), 45), title=self.normalize_string(row_data.get("title", ""), 45), group=self.normalize_string(row_data.get("group", ""), 45), a1=self.normalize_string(row_data.get("a1", ""), 45), a2=self.normalize_string(row_data.get("a2", ""), 45), a3=self.normalize_string(row_data.get("a3", ""), 45), city=self.normalize_string(row_data.get("city", ""), 80), abrev=self.normalize_string(row_data.get("abrev", ""), 45), zip=self.normalize_string(row_data.get("zip", ""), 45), email=self.normalize_string(row_data.get("email", ""), 100), dob=dob, ss_number=self.normalize_string(row_data.get("ss_number", ""), 20), legal_status=self.normalize_string(row_data.get("legal_status", ""), 45), memo=row_data.get("memo", "") # Text field, no length limit ) return rolodex