Add helper functions for User
This commit is contained in:
parent
3c99b3061b
commit
7a838ba452
136
helpers/user_helpers.py
Normal file
136
helpers/user_helpers.py
Normal file
@ -0,0 +1,136 @@
|
||||
from typing import List, Dict, Optional, Union, Any
|
||||
from datetime import datetime
|
||||
from decimal import Decimal
|
||||
from sqlalchemy.orm import Session
|
||||
from models.house import House
|
||||
from schemas.house import HouseCreate, HouseUpdate
|
||||
|
||||
def validate_property_type(property_type: str) -> bool:
|
||||
"""
|
||||
Validate that property type is one of the accepted values.
|
||||
|
||||
Args:
|
||||
property_type: The property type to validate
|
||||
|
||||
Returns:
|
||||
bool: True if valid property type, False otherwise
|
||||
"""
|
||||
valid_types = ['single_family', 'townhouse', 'condo', 'multi_family', 'apartment']
|
||||
return property_type.lower() in valid_types
|
||||
|
||||
def calculate_price_per_sqft(price: float, square_footage: float) -> float:
|
||||
"""
|
||||
Calculate price per square foot of the property.
|
||||
|
||||
Args:
|
||||
price: Total price of the property
|
||||
square_footage: Total square footage
|
||||
|
||||
Returns:
|
||||
float: Price per square foot
|
||||
"""
|
||||
if square_footage <= 0:
|
||||
raise ValueError("Square footage must be greater than 0")
|
||||
return round(price / square_footage, 2)
|
||||
|
||||
def search_available_houses(
|
||||
db: Session,
|
||||
min_price: Optional[float] = None,
|
||||
max_price: Optional[float] = None,
|
||||
min_beds: Optional[int] = None,
|
||||
min_baths: Optional[float] = None,
|
||||
property_type: Optional[str] = None
|
||||
) -> List[House]:
|
||||
"""
|
||||
Search for available houses matching given criteria.
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
min_price: Minimum price
|
||||
max_price: Maximum price
|
||||
min_beds: Minimum number of bedrooms
|
||||
min_baths: Minimum number of bathrooms
|
||||
property_type: Type of property
|
||||
|
||||
Returns:
|
||||
List of matching House objects
|
||||
"""
|
||||
query = db.query(House).filter(House.is_available == True)
|
||||
|
||||
if min_price:
|
||||
query = query.filter(House.price >= min_price)
|
||||
if max_price:
|
||||
query = query.filter(House.price <= max_price)
|
||||
if min_beds:
|
||||
query = query.filter(House.bedrooms >= min_beds)
|
||||
if min_baths:
|
||||
query = query.filter(House.bathrooms >= min_baths)
|
||||
if property_type:
|
||||
query = query.filter(House.property_type == property_type)
|
||||
|
||||
return query.all()
|
||||
|
||||
def update_house_status(
|
||||
db: Session,
|
||||
house_id: int,
|
||||
new_status: str
|
||||
) -> Union[House, Dict[str, str]]:
|
||||
"""
|
||||
Update the status of a house listing.
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
house_id: ID of house to update
|
||||
new_status: New status value
|
||||
|
||||
Returns:
|
||||
Updated House object or error dict
|
||||
"""
|
||||
valid_statuses = ['available', 'pending', 'sold', 'off_market']
|
||||
|
||||
if new_status not in valid_statuses:
|
||||
return {"error": f"Invalid status. Must be one of: {', '.join(valid_statuses)}"}
|
||||
|
||||
house = db.query(House).filter(House.id == house_id).first()
|
||||
if not house:
|
||||
return {"error": "House not found"}
|
||||
|
||||
house.status = new_status
|
||||
if new_status != 'available':
|
||||
house.is_available = False
|
||||
|
||||
db.commit()
|
||||
db.refresh(house)
|
||||
return house
|
||||
|
||||
def validate_house_data(house_data: Dict[str, Any]) -> Dict[str, str]:
|
||||
"""
|
||||
Validate house data before creation/update.
|
||||
|
||||
Args:
|
||||
house_data: Dictionary containing house data
|
||||
|
||||
Returns:
|
||||
Dictionary with error messages if validation fails, empty dict if valid
|
||||
"""
|
||||
errors = {}
|
||||
|
||||
if house_data.get('square_footage', 0) <= 0:
|
||||
errors['square_footage'] = "Square footage must be greater than 0"
|
||||
|
||||
if house_data.get('price', 0) <= 0:
|
||||
errors['price'] = "Price must be greater than 0"
|
||||
|
||||
if house_data.get('bedrooms', 0) < 0:
|
||||
errors['bedrooms'] = "Bedrooms cannot be negative"
|
||||
|
||||
if house_data.get('bathrooms', 0) < 0:
|
||||
errors['bathrooms'] = "Bathrooms cannot be negative"
|
||||
|
||||
if house_data.get('year_built', 0) > datetime.now().year:
|
||||
errors['year_built'] = "Year built cannot be in the future"
|
||||
|
||||
if not validate_property_type(house_data.get('property_type', '')):
|
||||
errors['property_type'] = "Invalid property type"
|
||||
|
||||
return errors
|
Loading…
x
Reference in New Issue
Block a user