Fix all Pydantic v2 deprecation warnings (17 model classes)

Convert deprecated class Config pattern to modern ConfigDict pattern
across all data models:

- models/asset.py: Updated 6 classes (AssetFolder, Asset, AssetUpload,
  AssetRename, AssetMove, FolderCreate)
- models/group.py: Updated 8 classes (GroupPermission, GroupPageRule,
  GroupUser, Group, GroupCreate, GroupUpdate, GroupAssignUser,
  GroupUnassignUser)
- models/user.py: Updated 3 classes (User, UserCreate, UserUpdate)

Changes:
- Added ConfigDict import from pydantic
- Replaced 'class Config:' with 'model_config = ConfigDict(...)'
- Preserved all config options (populate_by_name, str_strip_whitespace)

Impact:
- Eliminated 19 Pydantic deprecation warnings
- All 423 tests still passing
- No breaking changes to functionality
- Future-proofed for Pydantic v3

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude
2025-10-23 01:49:39 +00:00
parent 8e9bd5973a
commit c7e53b652b
3 changed files with 28 additions and 82 deletions

View File

@@ -2,7 +2,7 @@
from typing import Optional from typing import Optional
from pydantic import Field, field_validator from pydantic import ConfigDict, Field, field_validator
from .base import BaseModel, TimestampedModel from .base import BaseModel, TimestampedModel
@@ -10,15 +10,12 @@ from .base import BaseModel, TimestampedModel
class AssetFolder(BaseModel): class AssetFolder(BaseModel):
"""Asset folder model.""" """Asset folder model."""
model_config = ConfigDict(populate_by_name=True)
id: int = Field(..., description="Folder ID") id: int = Field(..., description="Folder ID")
slug: str = Field(..., description="Folder slug/path") slug: str = Field(..., description="Folder slug/path")
name: Optional[str] = Field(None, description="Folder name") name: Optional[str] = Field(None, description="Folder name")
class Config:
"""Pydantic configuration."""
populate_by_name = True
class Asset(TimestampedModel): class Asset(TimestampedModel):
"""Wiki.js asset model. """Wiki.js asset model.
@@ -75,10 +72,7 @@ class Asset(TimestampedModel):
"""Get file size in kilobytes.""" """Get file size in kilobytes."""
return self.file_size / 1024 return self.file_size / 1024
class Config: model_config = ConfigDict(populate_by_name=True)
"""Pydantic configuration."""
populate_by_name = True
class AssetUpload(BaseModel): class AssetUpload(BaseModel):
@@ -102,10 +96,7 @@ class AssetUpload(BaseModel):
raise ValueError("File path cannot be empty") raise ValueError("File path cannot be empty")
return v.strip() return v.strip()
class Config: model_config = ConfigDict(populate_by_name=True)
"""Pydantic configuration."""
populate_by_name = True
class AssetRename(BaseModel): class AssetRename(BaseModel):
@@ -137,10 +128,7 @@ class AssetRename(BaseModel):
raise ValueError("Filename cannot be empty") raise ValueError("Filename cannot be empty")
return v.strip() return v.strip()
class Config: model_config = ConfigDict(populate_by_name=True)
"""Pydantic configuration."""
populate_by_name = True
class AssetMove(BaseModel): class AssetMove(BaseModel):
@@ -170,10 +158,7 @@ class AssetMove(BaseModel):
raise ValueError("Folder ID must be non-negative") raise ValueError("Folder ID must be non-negative")
return v return v
class Config: model_config = ConfigDict(populate_by_name=True)
"""Pydantic configuration."""
populate_by_name = True
class FolderCreate(BaseModel): class FolderCreate(BaseModel):
@@ -199,7 +184,4 @@ class FolderCreate(BaseModel):
raise ValueError("Slug cannot be just slashes") raise ValueError("Slug cannot be just slashes")
return v return v
class Config: model_config = ConfigDict(populate_by_name=True)
"""Pydantic configuration."""
populate_by_name = True

View File

@@ -2,7 +2,7 @@
from typing import List, Optional from typing import List, Optional
from pydantic import Field, field_validator from pydantic import ConfigDict, Field, field_validator
from .base import BaseModel, TimestampedModel from .base import BaseModel, TimestampedModel
@@ -10,18 +10,17 @@ from .base import BaseModel, TimestampedModel
class GroupPermission(BaseModel): class GroupPermission(BaseModel):
"""Group permission model.""" """Group permission model."""
model_config = ConfigDict(populate_by_name=True)
id: str = Field(..., description="Permission identifier") id: str = Field(..., description="Permission identifier")
name: Optional[str] = Field(None, description="Permission name") name: Optional[str] = Field(None, description="Permission name")
class Config:
"""Pydantic configuration."""
populate_by_name = True
class GroupPageRule(BaseModel): class GroupPageRule(BaseModel):
"""Group page access rule model.""" """Group page access rule model."""
model_config = ConfigDict(populate_by_name=True)
id: str = Field(..., description="Rule identifier") id: str = Field(..., description="Rule identifier")
path: str = Field(..., description="Page path pattern") path: str = Field(..., description="Page path pattern")
roles: List[str] = Field(default_factory=list, description="Allowed roles") roles: List[str] = Field(default_factory=list, description="Allowed roles")
@@ -29,24 +28,16 @@ class GroupPageRule(BaseModel):
deny: bool = Field(default=False, description="Whether this is a deny rule") deny: bool = Field(default=False, description="Whether this is a deny rule")
locales: List[str] = Field(default_factory=list, description="Allowed locales") locales: List[str] = Field(default_factory=list, description="Allowed locales")
class Config:
"""Pydantic configuration."""
populate_by_name = True
class GroupUser(BaseModel): class GroupUser(BaseModel):
"""User member of a group (minimal representation).""" """User member of a group (minimal representation)."""
model_config = ConfigDict(populate_by_name=True)
id: int = Field(..., description="User ID") id: int = Field(..., description="User ID")
name: str = Field(..., description="User name") name: str = Field(..., description="User name")
email: str = Field(..., description="User email") email: str = Field(..., description="User email")
class Config:
"""Pydantic configuration."""
populate_by_name = True
class Group(TimestampedModel): class Group(TimestampedModel):
"""Wiki.js group model. """Wiki.js group model.
@@ -95,10 +86,7 @@ class Group(TimestampedModel):
raise ValueError("Group name cannot exceed 255 characters") raise ValueError("Group name cannot exceed 255 characters")
return v.strip() return v.strip()
class Config: model_config = ConfigDict(populate_by_name=True)
"""Pydantic configuration."""
populate_by_name = True
class GroupCreate(BaseModel): class GroupCreate(BaseModel):
@@ -111,6 +99,8 @@ class GroupCreate(BaseModel):
page_rules: List of page access rule configurations page_rules: List of page access rule configurations
""" """
model_config = ConfigDict(populate_by_name=True)
name: str = Field(..., min_length=1, max_length=255, description="Group name") name: str = Field(..., min_length=1, max_length=255, description="Group name")
redirect_on_login: Optional[str] = Field( redirect_on_login: Optional[str] = Field(
None, alias="redirectOnLogin", description="Redirect path on login" None, alias="redirectOnLogin", description="Redirect path on login"
@@ -134,11 +124,6 @@ class GroupCreate(BaseModel):
raise ValueError("Group name cannot exceed 255 characters") raise ValueError("Group name cannot exceed 255 characters")
return v.strip() return v.strip()
class Config:
"""Pydantic configuration."""
populate_by_name = True
class GroupUpdate(BaseModel): class GroupUpdate(BaseModel):
"""Model for updating an existing group. """Model for updating an existing group.
@@ -152,6 +137,8 @@ class GroupUpdate(BaseModel):
page_rules: Updated page access rules page_rules: Updated page access rules
""" """
model_config = ConfigDict(populate_by_name=True)
name: Optional[str] = Field( name: Optional[str] = Field(
None, min_length=1, max_length=255, description="Group name" None, min_length=1, max_length=255, description="Group name"
) )
@@ -177,11 +164,6 @@ class GroupUpdate(BaseModel):
raise ValueError("Group name cannot exceed 255 characters") raise ValueError("Group name cannot exceed 255 characters")
return v.strip() return v.strip()
class Config:
"""Pydantic configuration."""
populate_by_name = True
class GroupAssignUser(BaseModel): class GroupAssignUser(BaseModel):
"""Model for assigning a user to a group. """Model for assigning a user to a group.
@@ -191,14 +173,11 @@ class GroupAssignUser(BaseModel):
user_id: User ID user_id: User ID
""" """
model_config = ConfigDict(populate_by_name=True)
group_id: int = Field(..., alias="groupId", description="Group ID") group_id: int = Field(..., alias="groupId", description="Group ID")
user_id: int = Field(..., alias="userId", description="User ID") user_id: int = Field(..., alias="userId", description="User ID")
class Config:
"""Pydantic configuration."""
populate_by_name = True
class GroupUnassignUser(BaseModel): class GroupUnassignUser(BaseModel):
"""Model for removing a user from a group. """Model for removing a user from a group.
@@ -208,10 +187,7 @@ class GroupUnassignUser(BaseModel):
user_id: User ID user_id: User ID
""" """
model_config = ConfigDict(populate_by_name=True)
group_id: int = Field(..., alias="groupId", description="Group ID") group_id: int = Field(..., alias="groupId", description="Group ID")
user_id: int = Field(..., alias="userId", description="User ID") user_id: int = Field(..., alias="userId", description="User ID")
class Config:
"""Pydantic configuration."""
populate_by_name = True

View File

@@ -3,7 +3,7 @@
import re import re
from typing import List, Optional from typing import List, Optional
from pydantic import EmailStr, Field, field_validator from pydantic import ConfigDict, EmailStr, Field, field_validator
from .base import BaseModel, TimestampedModel from .base import BaseModel, TimestampedModel
@@ -63,11 +63,7 @@ class User(TimestampedModel):
return v.strip() return v.strip()
class Config: model_config = ConfigDict(populate_by_name=True, str_strip_whitespace=True)
"""Pydantic model configuration."""
populate_by_name = True
str_strip_whitespace = True
class UserCreate(BaseModel): class UserCreate(BaseModel):
@@ -122,11 +118,7 @@ class UserCreate(BaseModel):
return v return v
class Config: model_config = ConfigDict(populate_by_name=True, str_strip_whitespace=True)
"""Pydantic model configuration."""
populate_by_name = True
str_strip_whitespace = True
class UserUpdate(BaseModel): class UserUpdate(BaseModel):
@@ -185,8 +177,4 @@ class UserUpdate(BaseModel):
return v return v
class Config: model_config = ConfigDict(populate_by_name=True, str_strip_whitespace=True)
"""Pydantic model configuration."""
populate_by_name = True
str_strip_whitespace = True