Skip to content

Config

leadr.config

Application configuration management.

This module defines the configuration settings for the LEADR application using Pydantic Settings. Configuration values are loaded from environment variables and .env files, with validation and type checking.

Environment files - .env: Production/development configuration (default) - .env.test: Test environment configuration (when ENV=TEST)
Example Settings are automatically loaded based on the ENV variable: > > > from leadr.config import settings > > > settings.API_PREFIX > > > '/v1'

Classes:

  • CommonSettings – Base configuration settings shared across all environments.
  • Settings – Production/development environment settings.
  • TestSettings – Test environment settings.

Attributes:

leadr.config.CommonSettings

Bases: BaseSettings

Base configuration settings shared across all environments.

This class defines all configuration fields that are common to both production and test environments. Specific environment classes can override defaults or add environment-specific settings.

All settings can be configured via environment variables matching the field names (case-sensitive).

Functions:

Attributes:

leadr.config.CommonSettings.ACCESS_TOKEN_EXPIRY_HOURS
ACCESS_TOKEN_EXPIRY_HOURS: int = Field(default=24, description='Device access token expiration time in hours (default: 24 hours)')
leadr.config.CommonSettings.ANTICHEAT_DUPLICATE_WINDOW_SECONDS
ANTICHEAT_DUPLICATE_WINDOW_SECONDS: int = Field(default=300, description='Time window in seconds for detecting duplicate score submissions (default: 5 minutes)')
leadr.config.CommonSettings.ANTICHEAT_ENABLED
ANTICHEAT_ENABLED: bool = Field(default=False, description='Enable anti-cheat checks on score submissions')
leadr.config.CommonSettings.ANTICHEAT_LOGGING_ONLY
ANTICHEAT_LOGGING_ONLY: bool = Field(default=True, description="Log anti-cheat detections but don't reject/flag submissions (dry-run mode)")
leadr.config.CommonSettings.ANTICHEAT_MIN_SAMPLES_FOR_STATS
ANTICHEAT_MIN_SAMPLES_FOR_STATS: int = Field(default=10, description='Minimum number of scores required before statistical outlier detection is enabled')
leadr.config.CommonSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_A
ANTICHEAT_OUTLIER_THRESHOLD_TIER_A: float = Field(default=4.0, description='Outlier threshold for Tier A devices: standard deviations from mean')
leadr.config.CommonSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_B
ANTICHEAT_OUTLIER_THRESHOLD_TIER_B: float = Field(default=3.0, description='Outlier threshold for Tier B devices: standard deviations from mean')
leadr.config.CommonSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_C
ANTICHEAT_OUTLIER_THRESHOLD_TIER_C: float = Field(default=2.5, description='Outlier threshold for Tier C devices: standard deviations from mean')
leadr.config.CommonSettings.ANTICHEAT_RATE_LIMIT_TIER_A
ANTICHEAT_RATE_LIMIT_TIER_A: int = Field(default=100, description='Rate limit for Tier A (trusted) devices: submissions per hour')
leadr.config.CommonSettings.ANTICHEAT_RATE_LIMIT_TIER_B
ANTICHEAT_RATE_LIMIT_TIER_B: int = Field(default=50, description='Rate limit for Tier B (verified) devices: submissions per hour')
leadr.config.CommonSettings.ANTICHEAT_RATE_LIMIT_TIER_C
ANTICHEAT_RATE_LIMIT_TIER_C: int = Field(default=20, description='Rate limit for Tier C (unverified) devices: submissions per hour')
leadr.config.CommonSettings.ANTICHEAT_VELOCITY_THRESHOLD_SECONDS
ANTICHEAT_VELOCITY_THRESHOLD_SECONDS: float = Field(default=2.0, description='Minimum time between submissions to avoid velocity detection (in seconds)')
leadr.config.CommonSettings.API_KEY_SECRET
API_KEY_SECRET: str = Field(default='your-super-secret-api-key-pepper-change-in-production', description='Secret pepper for API key hashing. MUST be changed in production.')
leadr.config.CommonSettings.API_PREFIX
API_PREFIX: str = Field(default='/v1', description="API route prefix for versioning (e.g., '/v1')")
leadr.config.CommonSettings.APP
APP: str = Field(default='LEADR', description='Application name identifier')
leadr.config.CommonSettings.BACKGROUND_TASK_EXPIRE_INTERVAL
BACKGROUND_TASK_EXPIRE_INTERVAL: int = Field(default=60, description='Interval in seconds for expiring boards (default: 60s)')
leadr.config.CommonSettings.BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL
BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL: int = Field(default=3600, description='Interval in seconds for cleaning up expired nonces (default: 3600s / 1 hour)')
leadr.config.CommonSettings.BACKGROUND_TASK_TEMPLATE_INTERVAL
BACKGROUND_TASK_TEMPLATE_INTERVAL: int = Field(default=60, description='Interval in seconds for processing due board templates (default: 60s)')
leadr.config.CommonSettings.BASE_URL
BASE_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description="Base URL for the API server (e.g., 'https://api.leadr.gg')")
leadr.config.CommonSettings.DASHBOARD_URL
DASHBOARD_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description="URL for the web dashboard (e.g., 'https://dashboard.leadr.gg')")
leadr.config.CommonSettings.DB_ECHO
DB_ECHO: bool = Field(default=False, description='Log all SQL queries to stdout (useful for debugging)')
leadr.config.CommonSettings.DB_HOST
DB_HOST: str = Field(default='localhost', description='PostgreSQL database host')
leadr.config.CommonSettings.DB_HOST_DIRECT
DB_HOST_DIRECT: str | None = Field(default=None, description='Direct PostgreSQL host for migrations (bypasses connection pooler). If not set, falls back to DB_HOST. For Neon, use the non-pooler endpoint.')
leadr.config.CommonSettings.DB_NAME
DB_NAME: str = Field(default='leadr', description='PostgreSQL database name')
leadr.config.CommonSettings.DB_PASSWORD
DB_PASSWORD: str = Field(default='leadr', description='PostgreSQL database password')
leadr.config.CommonSettings.DB_POOL_MAX_OVERFLOW
DB_POOL_MAX_OVERFLOW: int = Field(default=10, description='Maximum overflow connections beyond pool size')
leadr.config.CommonSettings.DB_POOL_RECYCLE
DB_POOL_RECYCLE: int = Field(default=3600, description='Recycle database connections after this many seconds (default: 1 hour)')
leadr.config.CommonSettings.DB_POOL_SIZE
DB_POOL_SIZE: int = Field(default=20, description='Number of database connections to maintain in the pool')
leadr.config.CommonSettings.DB_PORT
DB_PORT: int = Field(default=5432, description='PostgreSQL database port')
leadr.config.CommonSettings.DB_USER
DB_USER: str = Field(default='leadr', description='PostgreSQL database user')
leadr.config.CommonSettings.DEBUG
DEBUG: bool = Field(default=False, description='Enable debug mode with verbose logging and error details')
leadr.config.CommonSettings.DEV_OVERRIDE_IP
DEV_OVERRIDE_IP: str | None = Field(default=None, description='Override IP address for development/testing (bypasses localhost detection)')
leadr.config.CommonSettings.ENABLE_ADMIN_API
ENABLE_ADMIN_API: bool = Field(default=False, description='Enable admin API endpoints')
leadr.config.CommonSettings.ENABLE_CLIENT_API
ENABLE_CLIENT_API: bool = Field(default=False, description='Enable client API endpoints')
leadr.config.CommonSettings.ENV
ENV: str = Field(default=..., description="Environment name (e.g., 'DEV', 'PROD', 'TEST'). Required.")
leadr.config.CommonSettings.GEOIP_DATABASE_PATH
GEOIP_DATABASE_PATH: Path = Field(default=(PROJ_ROOT / '.geoip'), description='Directory path for storing GeoIP databases')
leadr.config.CommonSettings.GEOIP_REFRESH_DAYS
GEOIP_REFRESH_DAYS: int = Field(default=7, description='Number of days between GeoIP database refresh downloads (default: 7 days)')
leadr.config.CommonSettings.JWT_LIFETIME_SECONDS
JWT_LIFETIME_SECONDS: int = Field(default=3600, description='JWT token lifetime in seconds (default: 1 hour)')
leadr.config.CommonSettings.JWT_SECRET
JWT_SECRET: str = Field(default='your-super-secret-jwt-key-change-in-production', description='Secret key for JWT token signing. MUST be changed in production.')
leadr.config.CommonSettings.KEYS_PATH
KEYS_PATH: Path = Field(default=(PROJ_ROOT / '.keys'), description='Directory path for storing cryptographic keys')
leadr.config.CommonSettings.LOG_DIR
LOG_DIR: Path = Field(default=(Path('/var/log/leadr')), description='Directory for log files when LOG_TO_FILE is enabled')
leadr.config.CommonSettings.LOG_JSON
LOG_JSON: bool = Field(default=True, description='Use JSON format for logs (disable for colored console in dev)')
leadr.config.CommonSettings.LOG_TO_FILE
LOG_TO_FILE: bool = Field(default=False, description='Enable file logging in addition to stdout')
leadr.config.CommonSettings.MAILGUN_API_KEY
MAILGUN_API_KEY: str = Field(default='mailgun_api_key', description='Mailgun API key for email sending')
leadr.config.CommonSettings.MAILGUN_DOMAIN
MAILGUN_DOMAIN: str = Field(default='example.mailgun.org', description='Mailgun domain for email sending')
leadr.config.CommonSettings.MAXMIND_ACCOUNT_ID
MAXMIND_ACCOUNT_ID: str = Field(default='', description='MaxMind account ID for database downloads (used for basic auth)')
leadr.config.CommonSettings.MAXMIND_CITY_DB_URL
MAXMIND_CITY_DB_URL: str = Field(default='https://download.maxmind.com/geoip/databases/GeoLite2-City/download?suffix=tar.gz', description='MaxMind GeoLite2 City database download URL')
leadr.config.CommonSettings.MAXMIND_COUNTRY_DB_URL
MAXMIND_COUNTRY_DB_URL: str = Field(default='https://download.maxmind.com/geoip/databases/GeoLite2-Country/download?suffix=tar.gz', description='MaxMind GeoLite2 Country database download URL')
leadr.config.CommonSettings.MAXMIND_LICENSE_KEY
MAXMIND_LICENSE_KEY: str = Field(default='', description='MaxMind license key for database downloads (used for basic auth)')
leadr.config.CommonSettings.REFRESH_TOKEN_EXPIRY_DAYS
REFRESH_TOKEN_EXPIRY_DAYS: int = Field(default=30, description='Device refresh token expiration time in days (default: 30 days)')
leadr.config.CommonSettings.REGISTRATION_RATE_LIMIT_PER_HOUR
REGISTRATION_RATE_LIMIT_PER_HOUR: int = Field(default=3, description='Maximum verification code requests per email per hour (default: 3)')
leadr.config.CommonSettings.SCORE_METADATA_MAX_SIZE_BYTES
SCORE_METADATA_MAX_SIZE_BYTES: int = Field(default=1024, description='Maximum size in bytes for score metadata JSON (default: 1KB)')
leadr.config.CommonSettings.SOURCE_OAUTH_BASE_URL
SOURCE_OAUTH_BASE_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description='Base URL for OAuth provider')
leadr.config.CommonSettings.SUPERADMIN_ACCOUNT_NAME
SUPERADMIN_ACCOUNT_NAME: str = Field(default='LEADR', description='Name of the system account for superadmin users')
leadr.config.CommonSettings.SUPERADMIN_ACCOUNT_SLUG
SUPERADMIN_ACCOUNT_SLUG: str = Field(default='leadr', description='URL-friendly slug for the superadmin system account')
leadr.config.CommonSettings.SUPERADMIN_API_KEY
SUPERADMIN_API_KEY: str = Field(default=..., description='API key for the superadmin user. REQUIRED for bootstrap.')
leadr.config.CommonSettings.SUPERADMIN_API_KEY_NAME
SUPERADMIN_API_KEY_NAME: str = Field(default='Superadmin Key', description='Display name for the superadmin API key')
leadr.config.CommonSettings.SUPERADMIN_DISPLAY_NAME
SUPERADMIN_DISPLAY_NAME: str = Field(default='LEADR Admin', description='Display name for the superadmin user')
leadr.config.CommonSettings.SUPERADMIN_EMAIL
SUPERADMIN_EMAIL: str = Field(default='admin@leadr.gg', description='Email address for the superadmin user')
leadr.config.CommonSettings.TESTING_EMAIL
TESTING_EMAIL: str = Field(default='hello@example.com', description='Email address used for testing purposes')
leadr.config.CommonSettings.VERIFICATION_CODE_EXPIRY_SECONDS
VERIFICATION_CODE_EXPIRY_SECONDS: int = Field(default=600, description='Expiry time for email verification codes in seconds (default: 10 minutes)')
leadr.config.CommonSettings.VERIFICATION_TOKEN_EXPIRY_SECONDS
VERIFICATION_TOKEN_EXPIRY_SECONDS: int = Field(default=600, description='Expiry time for verification JWT tokens in seconds (default: 10 minutes)')
leadr.config.CommonSettings.model_config
model_config = SettingsConfigDict(case_sensitive=True, extra='ignore')
leadr.config.CommonSettings.validate_api_enabled
validate_api_enabled()

Ensure at least one API (Admin or Client) is enabled.

leadr.config.PROJ_ROOT

PROJ_ROOT = Path.cwd()

leadr.config.Settings

Bases: CommonSettings

Production/development environment settings.

Inherits all settings from CommonSettings. Loads configuration from the .env file at the project root.

This is the default settings class used when ENV != 'TEST'.

Functions:

Attributes:

leadr.config.TestSettings

Bases: CommonSettings

Test environment settings.

Inherits all settings from CommonSettings. Loads configuration from the .env.test file at the project root.

Used automatically when ENV='TEST' (set by test.sh script). Test-specific overrides can be added here.

Functions:

Attributes:

leadr.config.TestSettings.ACCESS_TOKEN_EXPIRY_HOURS
ACCESS_TOKEN_EXPIRY_HOURS: int = Field(default=24, description='Device access token expiration time in hours (default: 24 hours)')
leadr.config.TestSettings.ANTICHEAT_DUPLICATE_WINDOW_SECONDS
ANTICHEAT_DUPLICATE_WINDOW_SECONDS: int = Field(default=300, description='Time window in seconds for detecting duplicate score submissions (default: 5 minutes)')
leadr.config.TestSettings.ANTICHEAT_ENABLED
ANTICHEAT_ENABLED: bool = Field(default=False, description='Enable anti-cheat checks on score submissions')
leadr.config.TestSettings.ANTICHEAT_LOGGING_ONLY
ANTICHEAT_LOGGING_ONLY: bool = Field(default=True, description="Log anti-cheat detections but don't reject/flag submissions (dry-run mode)")
leadr.config.TestSettings.ANTICHEAT_MIN_SAMPLES_FOR_STATS
ANTICHEAT_MIN_SAMPLES_FOR_STATS: int = Field(default=10, description='Minimum number of scores required before statistical outlier detection is enabled')
leadr.config.TestSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_A
ANTICHEAT_OUTLIER_THRESHOLD_TIER_A: float = Field(default=4.0, description='Outlier threshold for Tier A devices: standard deviations from mean')
leadr.config.TestSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_B
ANTICHEAT_OUTLIER_THRESHOLD_TIER_B: float = Field(default=3.0, description='Outlier threshold for Tier B devices: standard deviations from mean')
leadr.config.TestSettings.ANTICHEAT_OUTLIER_THRESHOLD_TIER_C
ANTICHEAT_OUTLIER_THRESHOLD_TIER_C: float = Field(default=2.5, description='Outlier threshold for Tier C devices: standard deviations from mean')
leadr.config.TestSettings.ANTICHEAT_RATE_LIMIT_TIER_A
ANTICHEAT_RATE_LIMIT_TIER_A: int = Field(default=100, description='Rate limit for Tier A (trusted) devices: submissions per hour')
leadr.config.TestSettings.ANTICHEAT_RATE_LIMIT_TIER_B
ANTICHEAT_RATE_LIMIT_TIER_B: int = Field(default=50, description='Rate limit for Tier B (verified) devices: submissions per hour')
leadr.config.TestSettings.ANTICHEAT_RATE_LIMIT_TIER_C
ANTICHEAT_RATE_LIMIT_TIER_C: int = Field(default=20, description='Rate limit for Tier C (unverified) devices: submissions per hour')
leadr.config.TestSettings.ANTICHEAT_VELOCITY_THRESHOLD_SECONDS
ANTICHEAT_VELOCITY_THRESHOLD_SECONDS: float = Field(default=2.0, description='Minimum time between submissions to avoid velocity detection (in seconds)')
leadr.config.TestSettings.API_KEY_SECRET
API_KEY_SECRET: str = Field(default='your-super-secret-api-key-pepper-change-in-production', description='Secret pepper for API key hashing. MUST be changed in production.')
leadr.config.TestSettings.API_PREFIX
API_PREFIX: str = Field(default='/v1', description="API route prefix for versioning (e.g., '/v1')")
leadr.config.TestSettings.APP
APP: str = Field(default='LEADR', description='Application name identifier')
leadr.config.TestSettings.BACKGROUND_TASK_EXPIRE_INTERVAL
BACKGROUND_TASK_EXPIRE_INTERVAL: int = Field(default=60, description='Interval in seconds for expiring boards (default: 60s)')
leadr.config.TestSettings.BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL
BACKGROUND_TASK_NONCE_CLEANUP_INTERVAL: int = Field(default=3600, description='Interval in seconds for cleaning up expired nonces (default: 3600s / 1 hour)')
leadr.config.TestSettings.BACKGROUND_TASK_TEMPLATE_INTERVAL
BACKGROUND_TASK_TEMPLATE_INTERVAL: int = Field(default=60, description='Interval in seconds for processing due board templates (default: 60s)')
leadr.config.TestSettings.BASE_URL
BASE_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description="Base URL for the API server (e.g., 'https://api.leadr.gg')")
leadr.config.TestSettings.DASHBOARD_URL
DASHBOARD_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description="URL for the web dashboard (e.g., 'https://dashboard.leadr.gg')")
leadr.config.TestSettings.DB_ECHO
DB_ECHO: bool = Field(default=False, description='Log all SQL queries to stdout (useful for debugging)')
leadr.config.TestSettings.DB_HOST
DB_HOST: str = Field(default='localhost', description='PostgreSQL database host')
leadr.config.TestSettings.DB_HOST_DIRECT
DB_HOST_DIRECT: str | None = Field(default=None, description='Direct PostgreSQL host for migrations (bypasses connection pooler). If not set, falls back to DB_HOST. For Neon, use the non-pooler endpoint.')
leadr.config.TestSettings.DB_NAME
DB_NAME: str = Field(default='leadr', description='PostgreSQL database name')
leadr.config.TestSettings.DB_PASSWORD
DB_PASSWORD: str = Field(default='leadr', description='PostgreSQL database password')
leadr.config.TestSettings.DB_POOL_MAX_OVERFLOW
DB_POOL_MAX_OVERFLOW: int = Field(default=10, description='Maximum overflow connections beyond pool size')
leadr.config.TestSettings.DB_POOL_RECYCLE
DB_POOL_RECYCLE: int = Field(default=3600, description='Recycle database connections after this many seconds (default: 1 hour)')
leadr.config.TestSettings.DB_POOL_SIZE
DB_POOL_SIZE: int = Field(default=20, description='Number of database connections to maintain in the pool')
leadr.config.TestSettings.DB_PORT
DB_PORT: int = Field(default=5432, description='PostgreSQL database port')
leadr.config.TestSettings.DB_USER
DB_USER: str = Field(default='leadr', description='PostgreSQL database user')
leadr.config.TestSettings.DEBUG
DEBUG: bool = Field(default=False, description='Enable debug mode with verbose logging and error details')
leadr.config.TestSettings.DEV_OVERRIDE_IP
DEV_OVERRIDE_IP: str | None = Field(default=None, description='Override IP address for development/testing (bypasses localhost detection)')
leadr.config.TestSettings.ENABLE_ADMIN_API
ENABLE_ADMIN_API: bool = Field(default=False, description='Enable admin API endpoints')
leadr.config.TestSettings.ENABLE_CLIENT_API
ENABLE_CLIENT_API: bool = Field(default=False, description='Enable client API endpoints')
leadr.config.TestSettings.ENV
ENV: str = Field(default=..., description="Environment name (e.g., 'DEV', 'PROD', 'TEST'). Required.")
leadr.config.TestSettings.GEOIP_DATABASE_PATH
GEOIP_DATABASE_PATH: Path = Field(default=(PROJ_ROOT / '.geoip'), description='Directory path for storing GeoIP databases')
leadr.config.TestSettings.GEOIP_REFRESH_DAYS
GEOIP_REFRESH_DAYS: int = Field(default=7, description='Number of days between GeoIP database refresh downloads (default: 7 days)')
leadr.config.TestSettings.JWT_LIFETIME_SECONDS
JWT_LIFETIME_SECONDS: int = Field(default=3600, description='JWT token lifetime in seconds (default: 1 hour)')
leadr.config.TestSettings.JWT_SECRET
JWT_SECRET: str = Field(default='your-super-secret-jwt-key-change-in-production', description='Secret key for JWT token signing. MUST be changed in production.')
leadr.config.TestSettings.KEYS_PATH
KEYS_PATH: Path = Field(default=(PROJ_ROOT / '.keys'), description='Directory path for storing cryptographic keys')
leadr.config.TestSettings.LOG_DIR
LOG_DIR: Path = Field(default=(Path('/var/log/leadr')), description='Directory for log files when LOG_TO_FILE is enabled')
leadr.config.TestSettings.LOG_JSON
LOG_JSON: bool = Field(default=True, description='Use JSON format for logs (disable for colored console in dev)')
leadr.config.TestSettings.LOG_TO_FILE
LOG_TO_FILE: bool = Field(default=False, description='Enable file logging in addition to stdout')
leadr.config.TestSettings.MAILGUN_API_KEY
MAILGUN_API_KEY: str = Field(default='mailgun_api_key', description='Mailgun API key for email sending')
leadr.config.TestSettings.MAILGUN_DOMAIN
MAILGUN_DOMAIN: str = Field(default='example.mailgun.org', description='Mailgun domain for email sending')
leadr.config.TestSettings.MAXMIND_ACCOUNT_ID
MAXMIND_ACCOUNT_ID: str = Field(default='', description='MaxMind account ID for database downloads (used for basic auth)')
leadr.config.TestSettings.MAXMIND_CITY_DB_URL
MAXMIND_CITY_DB_URL: str = Field(default='https://download.maxmind.com/geoip/databases/GeoLite2-City/download?suffix=tar.gz', description='MaxMind GeoLite2 City database download URL')
leadr.config.TestSettings.MAXMIND_COUNTRY_DB_URL
MAXMIND_COUNTRY_DB_URL: str = Field(default='https://download.maxmind.com/geoip/databases/GeoLite2-Country/download?suffix=tar.gz', description='MaxMind GeoLite2 Country database download URL')
leadr.config.TestSettings.MAXMIND_LICENSE_KEY
MAXMIND_LICENSE_KEY: str = Field(default='', description='MaxMind license key for database downloads (used for basic auth)')
leadr.config.TestSettings.REFRESH_TOKEN_EXPIRY_DAYS
REFRESH_TOKEN_EXPIRY_DAYS: int = Field(default=30, description='Device refresh token expiration time in days (default: 30 days)')
leadr.config.TestSettings.REGISTRATION_RATE_LIMIT_PER_HOUR
REGISTRATION_RATE_LIMIT_PER_HOUR: int = Field(default=3, description='Maximum verification code requests per email per hour (default: 3)')
leadr.config.TestSettings.SCORE_METADATA_MAX_SIZE_BYTES
SCORE_METADATA_MAX_SIZE_BYTES: int = Field(default=1024, description='Maximum size in bytes for score metadata JSON (default: 1KB)')
leadr.config.TestSettings.SOURCE_OAUTH_BASE_URL
SOURCE_OAUTH_BASE_URL: HttpUrl = Field(default=(HttpUrl('http://localhost:8000')), description='Base URL for OAuth provider')
leadr.config.TestSettings.SUPERADMIN_ACCOUNT_NAME
SUPERADMIN_ACCOUNT_NAME: str = Field(default='LEADR', description='Name of the system account for superadmin users')
leadr.config.TestSettings.SUPERADMIN_ACCOUNT_SLUG
SUPERADMIN_ACCOUNT_SLUG: str = Field(default='leadr', description='URL-friendly slug for the superadmin system account')
leadr.config.TestSettings.SUPERADMIN_API_KEY
SUPERADMIN_API_KEY: str = Field(default='ldr_test_superadmin_key_for_testing_12345678', description='Test superadmin API key (must start with ldr_)')
leadr.config.TestSettings.SUPERADMIN_API_KEY_NAME
SUPERADMIN_API_KEY_NAME: str = Field(default='Superadmin Key', description='Display name for the superadmin API key')
leadr.config.TestSettings.SUPERADMIN_DISPLAY_NAME
SUPERADMIN_DISPLAY_NAME: str = Field(default='LEADR Admin', description='Display name for the superadmin user')
leadr.config.TestSettings.SUPERADMIN_EMAIL
SUPERADMIN_EMAIL: str = Field(default='admin@leadr.gg', description='Email address for the superadmin user')
leadr.config.TestSettings.TESTING_EMAIL
TESTING_EMAIL: str = Field(default='hello@example.com', description='Email address used for testing purposes')
leadr.config.TestSettings.VERIFICATION_CODE_EXPIRY_SECONDS
VERIFICATION_CODE_EXPIRY_SECONDS: int = Field(default=600, description='Expiry time for email verification codes in seconds (default: 10 minutes)')
leadr.config.TestSettings.VERIFICATION_TOKEN_EXPIRY_SECONDS
VERIFICATION_TOKEN_EXPIRY_SECONDS: int = Field(default=600, description='Expiry time for verification JWT tokens in seconds (default: 10 minutes)')
leadr.config.TestSettings.model_config
model_config = SettingsConfigDict(case_sensitive=True, extra='ignore')
leadr.config.TestSettings.validate_api_enabled
validate_api_enabled()

Ensure at least one API (Admin or Client) is enabled.

leadr.config.settings

settings = TestSettings(_env_file=(Path(PROJ_ROOT, '.env.test'))) if os.environ.get('ENV') == 'TEST' else Settings(_env_file=(Path(PROJ_ROOT, '.env')))