11import secrets
2- import warnings
32from typing import Annotated , Any , Literal
43
54from pydantic import (
65 AnyUrl ,
76 BeforeValidator ,
8- EmailStr ,
9- HttpUrl ,
107 PostgresDsn ,
118 computed_field ,
12- model_validator ,
139)
1410from pydantic_core import MultiHostUrl
1511from pydantic_settings import BaseSettings , SettingsConfigDict
@@ -31,12 +27,12 @@ class Settings(BaseSettings):
3127 env_ignore_empty = True ,
3228 extra = "ignore" ,
3329 )
30+ PROJECT_NAME : str = "SQLBot"
3431 API_V1_STR : str = "/api/v1"
3532 SECRET_KEY : str = secrets .token_urlsafe (32 )
3633 # 60 minutes * 24 hours * 8 days = 8 days
3734 ACCESS_TOKEN_EXPIRE_MINUTES : int = 60 * 24 * 8
3835 FRONTEND_HOST : str = "http://localhost:5173"
39- ENVIRONMENT : Literal ["local" , "staging" , "production" ] = "local"
4036
4137 BACKEND_CORS_ORIGINS : Annotated [
4238 list [AnyUrl ] | str , BeforeValidator (parse_cors )
@@ -49,8 +45,6 @@ def all_cors_origins(self) -> list[str]:
4945 self .FRONTEND_HOST
5046 ]
5147
52- PROJECT_NAME : str
53- SENTRY_DSN : HttpUrl | None = None
5448 POSTGRES_SERVER : str
5549 POSTGRES_PORT : int = 5432
5650 POSTGRES_USER : str
@@ -81,55 +75,8 @@ def SQLALCHEMY_DATABASE_URI(self) -> PostgresDsn:
8175 path = self .POSTGRES_DB ,
8276 )
8377
84- SMTP_TLS : bool = True
85- SMTP_SSL : bool = False
86- SMTP_PORT : int = 587
87- SMTP_HOST : str | None = None
88- SMTP_USER : str | None = None
89- SMTP_PASSWORD : str | None = None
90- EMAILS_FROM_EMAIL : EmailStr | None = None
91- EMAILS_FROM_NAME : EmailStr | None = None
9278 MCP_IMAGE_PATH : str
9379 MCP_IMAGE_HOST : str
9480 SERVER_IMAGE_HOST : str
9581
96- @model_validator (mode = "after" )
97- def _set_default_emails_from (self ) -> Self :
98- if not self .EMAILS_FROM_NAME :
99- self .EMAILS_FROM_NAME = self .PROJECT_NAME
100- return self
101-
102- EMAIL_RESET_TOKEN_EXPIRE_HOURS : int = 48
103-
104- @computed_field # type: ignore[prop-decorator]
105- @property
106- def emails_enabled (self ) -> bool :
107- return bool (self .SMTP_HOST and self .EMAILS_FROM_EMAIL )
108-
109- EMAIL_TEST_USER :
EmailStr = "[email protected] " 110- FIRST_SUPERUSER : EmailStr
111- FIRST_SUPERUSER_PASSWORD : str
112-
113- def _check_default_secret (self , var_name : str , value : str | None ) -> None :
114- if value == "changethis" :
115- message = (
116- f'The value of { var_name } is "changethis", '
117- "for security, please change it, at least for deployments."
118- )
119- if self .ENVIRONMENT == "local" :
120- warnings .warn (message , stacklevel = 1 )
121- else :
122- raise ValueError (message )
123-
124- @model_validator (mode = "after" )
125- def _enforce_non_default_secrets (self ) -> Self :
126- self ._check_default_secret ("SECRET_KEY" , self .SECRET_KEY )
127- self ._check_default_secret ("POSTGRES_PASSWORD" , self .POSTGRES_PASSWORD )
128- self ._check_default_secret (
129- "FIRST_SUPERUSER_PASSWORD" , self .FIRST_SUPERUSER_PASSWORD
130- )
131-
132- return self
133-
134-
13582settings = Settings () # type: ignore
0 commit comments