1
1
import secrets
2
- from typing import Any , Dict , List , Optional , Union
2
+ from typing import Any , List , Optional , Union
3
3
4
- from pydantic import AnyHttpUrl , EmailStr , HttpUrl , PostgresDsn , validator
5
- from pydantic_settings import BaseSettings
6
4
from dotenv import load_dotenv
7
-
8
- load_dotenv ()
5
+ from pydantic import (AnyHttpUrl , AnyUrl , EmailStr , HttpUrl , PostgresDsn ,
6
+ ValidationInfo , field_validator )
7
+ from pydantic_settings import BaseSettings , SettingsConfigDict
9
8
10
9
11
10
class Settings (BaseSettings ):
@@ -20,7 +19,8 @@ class Settings(BaseSettings):
20
19
# "http://localhost:8080", "http://local.dockertoolbox.tiangolo.com"]'
21
20
BACKEND_CORS_ORIGINS : List [AnyHttpUrl ] = []
22
21
23
- @validator ("BACKEND_CORS_ORIGINS" , pre = True )
22
+ @field_validator ("BACKEND_CORS_ORIGINS" , mode = "before" )
23
+ @classmethod
24
24
def assemble_cors_origins (cls , v : Union [str , List [str ]]) -> Union [List [str ], str ]:
25
25
if isinstance (v , str ) and not v .startswith ("[" ):
26
26
return [i .strip () for i in v .split ("," )]
@@ -31,7 +31,8 @@ def assemble_cors_origins(cls, v: Union[str, List[str]]) -> Union[List[str], str
31
31
PROJECT_NAME : str
32
32
SENTRY_DSN : Optional [HttpUrl ] = None
33
33
34
- @validator ("SENTRY_DSN" , pre = True )
34
+ @field_validator ("SENTRY_DSN" , mode = "before" )
35
+ @classmethod
35
36
def sentry_dsn_can_be_blank (cls , v : Optional [str ]) -> Optional [str ]:
36
37
if v is None or len (v ) == 0 :
37
38
return None
@@ -43,14 +44,15 @@ def sentry_dsn_can_be_blank(cls, v: Optional[str]) -> Optional[str]:
43
44
POSTGRES_DB : str
44
45
SQLALCHEMY_DATABASE_URI : Optional [PostgresDsn ] = None
45
46
46
- @validator ("SQLALCHEMY_DATABASE_URI" , pre = True )
47
- def assemble_db_connection (cls , v : Optional [str ], values : Dict [str , Any ]) -> Any :
47
+ @field_validator ("SQLALCHEMY_DATABASE_URI" , mode = "before" )
48
+ @classmethod
49
+ def assemble_db_connection (cls , v : Optional [str ], info : ValidationInfo ) -> Any :
48
50
if isinstance (v , str ):
49
51
return v
50
- user = values .get ("POSTGRES_USER" )
51
- password = values .get ("POSTGRES_PASSWORD" )
52
- host = values .get ("POSTGRES_SERVER" )
53
- db = values .get ("POSTGRES_DB" )
52
+ user = info . data .get ("POSTGRES_USER" )
53
+ password = info . data .get ("POSTGRES_PASSWORD" )
54
+ host = info . data .get ("POSTGRES_SERVER" )
55
+ db = info . data .get ("POSTGRES_DB" )
54
56
55
57
if all ([user , password , host , db ]):
56
58
return f"postgresql://{ user } :{ password } @{ host } /{ db } "
@@ -65,31 +67,32 @@ def assemble_db_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any
65
67
EMAILS_FROM_EMAIL : Optional [EmailStr ] = None
66
68
EMAILS_FROM_NAME : Optional [str ] = None
67
69
68
- @validator ("EMAILS_FROM_NAME" )
69
- def get_project_name (cls , v : Optional [str ], values : Dict [str , Any ]) -> str :
70
+ @field_validator ("EMAILS_FROM_NAME" , mode = "before" )
71
+ @classmethod
72
+ def get_project_name (cls , v : Optional [str ], info : ValidationInfo ) -> str :
70
73
if not v :
71
- return values [ "PROJECT_NAME" ]
74
+ return info . data . get ( "PROJECT_NAME" )
72
75
return v
73
76
74
77
EMAIL_RESET_TOKEN_EXPIRE_HOURS : int = 48
75
78
EMAIL_TEMPLATES_DIR : str = "/app/app/email-templates/build"
76
79
EMAILS_ENABLED : bool = False
77
80
78
- @validator ("EMAILS_ENABLED" , pre = True )
79
- def get_emails_enabled (cls , v : bool , values : Dict [str , Any ]) -> bool :
81
+ @field_validator ("EMAILS_ENABLED" , mode = "before" )
82
+ @classmethod
83
+ def get_emails_enabled (cls , v : bool , info : ValidationInfo ) -> bool :
80
84
return bool (
81
- values .get ("SMTP_HOST" )
82
- and values .get ("SMTP_PORT" )
83
- and values .get ("EMAILS_FROM_EMAIL" )
85
+ info . data .get ("SMTP_HOST" )
86
+ and info . data .get ("SMTP_PORT" )
87
+ and info . data .get ("EMAILS_FROM_EMAIL" )
84
88
)
85
89
86
- EMAIL_TEST_USER : EmailStr = "test@example.com" # type: ignore
90
+ EMAIL_TEST_USER : EmailStr = "test@example.com"
87
91
FIRST_SUPERUSER : EmailStr
88
92
FIRST_SUPERUSER_PASSWORD : str
89
93
USERS_OPEN_REGISTRATION : bool = False
90
-
91
- class Config :
92
- case_sensitive = True
94
+ model_config = SettingsConfigDict (case_sensitive = True )
93
95
94
96
97
+ load_dotenv ()
95
98
settings = Settings ()
0 commit comments