""" TreeTrack Application Constants Centralized configuration constants to eliminate magic numbers """ from datetime import timedelta # Authentication Constants SESSION_TIMEOUT_HOURS = 8 SESSION_TIMEOUT = timedelta(hours=SESSION_TIMEOUT_HOURS) AUTH_TOKEN_LENGTH = 32 # File Upload Constants MAX_FILE_SIZE_MB = 10 MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024 DEFAULT_SIGNED_URL_EXPIRY = 3600 # 1 hour EXTENDED_SIGNED_URL_EXPIRY = 7200 # 2 hours # Database Constants DEFAULT_TREES_LIMIT = 100 MAX_TREES_LIMIT = 1000 DEFAULT_SPECIES_LIMIT = 20 DEFAULT_OFFSET = 0 # Validation Constants (units in feet) MAX_SPECIES_NAME_LENGTH = 200 MAX_NOTES_LENGTH = 2000 MAX_STORYTELLING_TEXT_LENGTH = 5000 MAX_TREE_CODE_LENGTH = 20 MAX_HEIGHT_FEET = 1000 MAX_GIRTH_FEET = 200 # Application Constants APP_VERSION = "3.0.0" BUILD_TIME_KEY = "BUILD_TIME" # File Categories VALID_IMAGE_CATEGORIES = ["Leaf", "Bark", "Fruit", "Seed", "Flower", "Full tree"] # Utilities VALID_UTILITIES = [ "Religious", "Timber", "Biodiversity", "Hydrological benefit", "Faunal interaction", "Food", "Medicine", "Shelter", "Cultural" ] # Phenology Stages VALID_PHENOLOGY_STAGES = [ "New leaves", "Old leaves", "Open flowers", "Fruiting", "Ripe fruit", "Recent fruit drop", "Other" ] # API Rate Limiting DEFAULT_RATE_LIMIT = 100 # requests per minute BURST_RATE_LIMIT = 200 # Pagination Constants MIN_LIMIT = 1 MAX_LIMIT_PER_REQUEST = 1000 # Logging LOG_LEVEL_DEFAULT = "INFO" LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" # Security BCRYPT_ROUNDS = 12 # For password hashing # Cache TTL CACHE_TTL_SECONDS = 300 # 5 minutes CACHE_TTL_LONG_SECONDS = 3600 # 1 hour # Default Development Credentials DEV_PASSWORDS = { 'AALEKH_PASSWORD': 'dev_password_aalekh', 'ADMIN_PASSWORD': 'dev_password_admin', 'ISHITA_PASSWORD': 'dev_password_ishita', 'JEEB_PASSWORD': 'dev_password_jeeb' } # Environment Variables REQUIRED_ENV_VARS = { 'production': [ 'SUPABASE_URL', 'SUPABASE_ANON_KEY', 'SUPABASE_SERVICE_ROLE_KEY', 'AALEKH_PASSWORD', 'ADMIN_PASSWORD', 'ISHITA_PASSWORD', 'JEEB_PASSWORD' ], 'development': [] # Optional in development }