78 lines
2.0 KiB
Python
78 lines
2.0 KiB
Python
from typing import List, Optional
|
|
import re
|
|
from pydantic import EmailStr, validator
|
|
from models import Intern
|
|
|
|
def validate_phone_number(phone_number: str) -> bool:
|
|
"""
|
|
Validate a phone number format.
|
|
|
|
Args:
|
|
phone_number: The phone number to validate
|
|
|
|
Returns:
|
|
bool: True if phone number format is valid, False otherwise
|
|
"""
|
|
pattern = r'^\+?\d{10,13}$'
|
|
return bool(re.match(pattern, phone_number))
|
|
|
|
def get_all_interns(db_session) -> List[Intern]:
|
|
"""
|
|
Get a list of all interns from the database.
|
|
|
|
Args:
|
|
db_session: The database session
|
|
|
|
Returns:
|
|
List[Intern]: A list of Intern objects
|
|
"""
|
|
return db_session.query(Intern).all()
|
|
|
|
def get_intern_by_email(db_session, email: EmailStr) -> Optional[Intern]:
|
|
"""
|
|
Get an intern by their email address.
|
|
|
|
Args:
|
|
db_session: The database session
|
|
email: Email to search for
|
|
|
|
Returns:
|
|
Intern object if found, None otherwise
|
|
"""
|
|
return db_session.query(Intern).filter(Intern.email == email).first()
|
|
|
|
class InternBase:
|
|
first_name: str
|
|
last_name: str
|
|
email: EmailStr
|
|
phone_number: str
|
|
track: str
|
|
bio: Optional[str] = None
|
|
|
|
@validator('phone_number')
|
|
def validate_phone_number(cls, phone_number):
|
|
if not validate_phone_number(phone_number):
|
|
raise ValueError('Invalid phone number format')
|
|
return phone_number
|
|
|
|
def create_intern(db_session, intern_data: InternBase) -> Intern:
|
|
"""
|
|
Create a new intern in the database.
|
|
|
|
Args:
|
|
db_session: The database session
|
|
intern_data: The data for the new intern
|
|
|
|
Returns:
|
|
Intern: The created Intern object
|
|
"""
|
|
existing_intern = get_intern_by_email(db_session, intern_data.email)
|
|
if existing_intern:
|
|
raise ValueError('Email already registered')
|
|
|
|
new_intern = Intern(**intern_data.dict())
|
|
db_session.add(new_intern)
|
|
db_session.commit()
|
|
db_session.refresh(new_intern)
|
|
|
|
return new_intern |