Skip to content

Commit 5a2c90c

Browse files
authored
Migrate settings to pydantic v2 (#156)
* Update requirements * Update settings * Install pydantic-settings in github actions
1 parent eb6faa1 commit 5a2c90c

File tree

4 files changed

+23
-23
lines changed

4 files changed

+23
-23
lines changed

.github/workflows/test_full.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
with:
3535
python-version: ${{ matrix.python-version }}
3636
- name: Install core
37-
run: pip install "Django${{ matrix.django-version }}"
37+
run: pip install "Django${{ matrix.django-version }}" "pydantic-settings>=2.0.0"
3838
- name: Install tests
3939
run: pip install pytest pytest-asyncio pytest-django django-ninja-extra 'python-jose==3.3.0' 'pyjwt[crypto]' freezegun
4040
- name: Test

ninja_jwt/schema.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,7 @@ def validate_inputs(cls, values: SCHEMA_INPUT) -> dict:
141141
return values
142142

143143
@model_validator(mode="after")
144-
def post_validate(
145-
self, info: ValidationInfo
146-
) -> BaseModel:
144+
def post_validate(self, info: ValidationInfo) -> BaseModel:
147145
schema_input = SchemaInputService(
148146
self.model_dump(), self.__class__.model_config, info.context.get("request")
149147
)

ninja_jwt/settings.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from django.conf import settings
55
from django.test.signals import setting_changed
66
from 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

1011
class 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

101104
def 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

112113
setting_changed.connect(reload_api_settings)

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ dependencies = [
5151
"pyjwt>=1.7.1,<3",
5252
"pyjwt[crypto]",
5353
"django-ninja-extra >= 0.22.9",
54+
"pydantic-settings>=2.0.0",
5455
]
5556

5657

0 commit comments

Comments
 (0)