104 lines
2.7 KiB
Python
104 lines
2.7 KiB
Python
from typing import Optional, Dict, List, Union
|
|
from enum import Enum
|
|
from datetime import datetime
|
|
from sqlalchemy.orm import Session
|
|
import re
|
|
import requests
|
|
from PIL import Image
|
|
from io import BytesIO
|
|
|
|
class ImageStatus(Enum):
|
|
PENDING = "pending"
|
|
GENERATING = "generating"
|
|
COMPLETED = "completed"
|
|
FAILED = "failed"
|
|
|
|
def validate_image_url(image_url: str) -> bool:
|
|
"""
|
|
Validates if the provided URL is a valid image URL.
|
|
|
|
Args:
|
|
image_url: URL string to validate
|
|
|
|
Returns:
|
|
bool: True if valid image URL, False otherwise
|
|
"""
|
|
try:
|
|
response = requests.head(image_url)
|
|
return response.headers.get('content-type', '').startswith('image/')
|
|
except:
|
|
return False
|
|
|
|
def validate_prompt(prompt: str) -> bool:
|
|
"""
|
|
Validates if the provided prompt meets requirements.
|
|
|
|
Args:
|
|
prompt: The prompt string to validate
|
|
|
|
Returns:
|
|
bool: True if valid prompt, False otherwise
|
|
"""
|
|
# Prompt should be between 3 and 500 chars and not just whitespace
|
|
if not prompt or len(prompt.strip()) < 3 or len(prompt) > 500:
|
|
return False
|
|
return True
|
|
|
|
def get_food_image_by_status(
|
|
db: Session,
|
|
status: ImageStatus
|
|
) -> List['FoodImage']:
|
|
"""
|
|
Retrieves food images by status.
|
|
|
|
Args:
|
|
db: Database session
|
|
status: Status to filter by
|
|
|
|
Returns:
|
|
List of FoodImage objects matching the status
|
|
"""
|
|
return db.query(FoodImage).filter(FoodImage.status == status.value).all()
|
|
|
|
def update_image_status(
|
|
db: Session,
|
|
food_image_id: int,
|
|
new_status: ImageStatus
|
|
) -> Optional['FoodImage']:
|
|
"""
|
|
Updates the status of a food image.
|
|
|
|
Args:
|
|
db: Database session
|
|
food_image_id: ID of image to update
|
|
new_status: New status to set
|
|
|
|
Returns:
|
|
Updated FoodImage object if found, None otherwise
|
|
"""
|
|
food_image = db.query(FoodImage).filter(FoodImage.id == food_image_id).first()
|
|
if food_image:
|
|
food_image.status = new_status.value
|
|
db.commit()
|
|
db.refresh(food_image)
|
|
return food_image
|
|
|
|
def verify_image_dimensions(image_url: str, min_width: int = 512, min_height: int = 512) -> bool:
|
|
"""
|
|
Verifies if image meets minimum dimension requirements.
|
|
|
|
Args:
|
|
image_url: URL of image to verify
|
|
min_width: Minimum required width
|
|
min_height: Minimum required height
|
|
|
|
Returns:
|
|
bool: True if image meets requirements, False otherwise
|
|
"""
|
|
try:
|
|
response = requests.get(image_url)
|
|
img = Image.open(BytesIO(response.content))
|
|
width, height = img.size
|
|
return width >= min_width and height >= min_height
|
|
except:
|
|
return False |