44from django .conf import settings
55from django .test .signals import setting_changed
66from ninja_extra .lazy import LazyStrImport
7- from pydantic .v1 import AnyUrl , BaseModel , Field , root_validator
7+ from pydantic import AnyUrl , Field
8+ from pydantic_settings import BaseSettings , SettingsConfigDict
89
910
1011class NinjaJWTUserDefinedSettingsMapper :
@@ -27,10 +28,11 @@ def __init__(self, data: dict) -> None:
2728)
2829
2930
30- class NinjaJWTSettings (BaseModel ):
31- class Config :
32- orm_mode = True
33- validate_assignment = True
31+ class NinjaJWTSettings (BaseSettings ):
32+ model_config = SettingsConfigDict (
33+ validate_assignment = True ,
34+ extra = "ignore" ,
35+ )
3436
3537 ACCESS_TOKEN_LIFETIME : timedelta = Field (timedelta (minutes = 5 ))
3638 REFRESH_TOKEN_LIFETIME : timedelta = Field (timedelta (days = 1 ))
@@ -82,20 +84,21 @@ class Config:
8284 )
8385 TOKEN_VERIFY_INPUT_SCHEMA : Any = Field ("ninja_jwt.schema.TokenVerifyInputSchema" )
8486
85- @root_validator
86- def validate_ninja_jwt_settings (cls , values ):
87- for item in NinjaJWT_SETTINGS_DEFAULTS .keys ():
88- if isinstance (values [item ], (tuple , list )) and isinstance (
89- values [item ][0 ], str
90- ):
91- values [item ] = [LazyStrImport (str (klass )) for klass in values [item ]]
92- if isinstance (values [item ], str ):
93- values [item ] = LazyStrImport (values [item ])
94- return values
87+ def __getattribute__ (self , item ):
88+ # Get the actual value using object.__getattribute__ to avoid recursion
89+ value = object .__getattribute__ (self , item )
90+
91+ if item in NinjaJWT_SETTINGS_DEFAULTS :
92+ if isinstance (value , (list , tuple )) and value and isinstance (value [0 ], str ):
93+ return [LazyStrImport (str (klass )) for klass in value ]
94+ elif isinstance (value , str ):
95+ return LazyStrImport (value )
96+
97+ return value
9598
9699
97100# convert to lazy object
98- api_settings = NinjaJWTSettings .from_orm (USER_SETTINGS )
101+ api_settings = NinjaJWTSettings .model_validate (USER_SETTINGS . __dict__ )
99102
100103
101104def reload_api_settings (* args : Any , ** kwargs : Any ) -> None :
@@ -104,9 +107,7 @@ def reload_api_settings(*args: Any, **kwargs: Any) -> None:
104107 setting , value = kwargs ["setting" ], kwargs ["value" ]
105108
106109 if setting in ["SIMPLE_JWT" , "NINJA_JWT" ]:
107- api_settings = NinjaJWTSettings .from_orm (
108- NinjaJWTUserDefinedSettingsMapper (value )
109- )
110+ api_settings = NinjaJWTSettings .model_validate (value )
110111
111112
112113setting_changed .connect (reload_api_settings )
0 commit comments