Files
l3ocho b0f903660e
Some checks failed
Test Suite / lint (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.10) (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.11) (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.12) (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.8) (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.9) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.10) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.11) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.12) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.8) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.9) (pull_request) Has been cancelled
Test Suite / package (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.10) (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.11) (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.12) (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.8) (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.9) (pull_request) Has been cancelled
Test Suite / security (pull_request) Has been cancelled
second commit
2025-07-31 22:32:51 -04:00

93 lines
2.5 KiB
Python

"""Base model functionality for wikijs-python-sdk."""
from datetime import datetime
from typing import Any, Dict, Optional
from pydantic import BaseModel as PydanticBaseModel
from pydantic import ConfigDict, field_serializer
class BaseModel(PydanticBaseModel):
"""Base model with common functionality for all data models.
Provides:
- Automatic validation via Pydantic
- JSON serialization/deserialization
- Field aliases for API compatibility
- Consistent datetime handling
"""
model_config = ConfigDict(
# Allow population by field name or alias
populate_by_name=True,
# Validate assignment to attributes
validate_assignment=True,
# Use enum values instead of names
use_enum_values=True,
# Allow extra fields for forward compatibility
extra="ignore",
)
def to_dict(self, exclude_none: bool = True) -> Dict[str, Any]:
"""Convert model to dictionary.
Args:
exclude_none: Whether to exclude None values
Returns:
Dictionary representation of the model
"""
return self.model_dump(exclude_none=exclude_none, by_alias=True)
def to_json(self, exclude_none: bool = True) -> str:
"""Convert model to JSON string.
Args:
exclude_none: Whether to exclude None values
Returns:
JSON string representation of the model
"""
return self.model_dump_json(exclude_none=exclude_none, by_alias=True)
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "BaseModel":
"""Create model instance from dictionary.
Args:
data: Dictionary data
Returns:
Model instance
"""
return cls(**data)
@classmethod
def from_json(cls, json_str: str) -> "BaseModel":
"""Create model instance from JSON string.
Args:
json_str: JSON string
Returns:
Model instance
"""
return cls.model_validate_json(json_str)
class TimestampedModel(BaseModel):
"""Base model with timestamp fields."""
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
@field_serializer('created_at', 'updated_at')
def serialize_datetime(self, value: Optional[datetime]) -> Optional[str]:
"""Serialize datetime to ISO format."""
return value.isoformat() if value else None
@property
def is_new(self) -> bool:
"""Check if this is a new (unsaved) model."""
return self.created_at is None