import random import string from typing import Optional from sqlalchemy.orm import Session from models.name import Name def generate_random_name_code(length: int = 6) -> str: """ Generate a random name code of the specified length. Args: length (int): Length of the name code (default: 6). Returns: str: Random name code. """ characters = string.ascii_uppercase + string.digits return ''.join(random.choice(characters) for _ in range(length)) def get_name_by_code(db: Session, name_code: str) -> Optional[Name]: """ Get a name by its code. Args: db (Session): SQLAlchemy database session. name_code (str): Name code to search for. Returns: Optional[Name]: Name object if found, None otherwise. """ return db.query(Name).filter(Name.name_code == name_code).first() def create_name(db: Session, name_code: Optional[str] = None) -> Name: """ Create a new name with a unique name code. Args: db (Session): SQLAlchemy database session. name_code (Optional[str]): Custom name code (default: None). Returns: Name: Created name object. """ if name_code is None: name_code = generate_random_name_code() # Check if the name code already exists existing_name = get_name_by_code(db, name_code) if existing_name: raise ValueError(f"Name code '{name_code}' already exists.") db_name = Name(name_code=name_code) db.add(db_name) db.commit() db.refresh(db_name) return db_name def generate_name_code(db: Session) -> str: """ Generate a unique name code. Args: db (Session): SQLAlchemy database session. Returns: str: Unique name code. """ while True: name_code = generate_random_name_code() if not get_name_by_code(db, name_code): return name_code