9b00530e8e
BREAKING CHANGE
143 lines
5.5 KiB
Python
143 lines
5.5 KiB
Python
"""Pydantic models for Tables app responses."""
|
|
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from .base import BaseResponse, IdResponse, StatusResponse
|
|
|
|
|
|
class TableColumn(BaseModel):
|
|
"""Model for a table column definition."""
|
|
|
|
id: int = Field(description="Column ID")
|
|
title: str = Field(description="Column title")
|
|
type: str = Field(description="Column type (text, number, datetime, etc.)")
|
|
subtype: Optional[str] = Field(None, description="Column subtype")
|
|
mandatory: bool = Field(default=False, description="Whether column is mandatory")
|
|
description: Optional[str] = Field(None, description="Column description")
|
|
text_default: Optional[str] = Field(None, description="Default text value")
|
|
text_allowed_pattern: Optional[str] = Field(
|
|
None, description="Allowed text pattern"
|
|
)
|
|
text_max_length: Optional[int] = Field(None, description="Maximum text length")
|
|
number_default: Optional[float] = Field(None, description="Default number value")
|
|
number_min: Optional[float] = Field(None, description="Minimum number value")
|
|
number_max: Optional[float] = Field(None, description="Maximum number value")
|
|
number_decimals: Optional[int] = Field(None, description="Number of decimal places")
|
|
datetime_default: Optional[str] = Field(None, description="Default datetime value")
|
|
selection_options: List[str] = Field(
|
|
default_factory=list, description="Selection options"
|
|
)
|
|
selection_default: Optional[str] = Field(
|
|
None, description="Default selection value"
|
|
)
|
|
|
|
|
|
class TableRow(BaseModel):
|
|
"""Model for a table row."""
|
|
|
|
id: int = Field(description="Row ID")
|
|
created_by: Optional[str] = Field(None, description="User who created the row")
|
|
created_at: Optional[str] = Field(None, description="Row creation timestamp")
|
|
last_edit_by: Optional[str] = Field(
|
|
None, description="User who last edited the row"
|
|
)
|
|
last_edit_at: Optional[str] = Field(None, description="Last edit timestamp")
|
|
data: Dict[int, Any] = Field(description="Row data keyed by column ID")
|
|
|
|
|
|
class TableView(BaseModel):
|
|
"""Model for a table view."""
|
|
|
|
id: int = Field(description="View ID")
|
|
title: str = Field(description="View title")
|
|
emoji: Optional[str] = Field(None, description="View emoji")
|
|
description: Optional[str] = Field(None, description="View description")
|
|
columns: List[int] = Field(
|
|
default_factory=list, description="List of column IDs in this view"
|
|
)
|
|
sort: List[Dict[str, Any]] = Field(
|
|
default_factory=list, description="Sort configuration"
|
|
)
|
|
filter: List[Dict[str, Any]] = Field(
|
|
default_factory=list, description="Filter configuration"
|
|
)
|
|
|
|
|
|
class Table(BaseModel):
|
|
"""Model for a Nextcloud table."""
|
|
|
|
id: int = Field(description="Table ID")
|
|
title: str = Field(description="Table title")
|
|
emoji: Optional[str] = Field(None, description="Table emoji")
|
|
ownership: str = Field(description="Table ownership")
|
|
owner_display_name: str = Field(description="Display name of table owner")
|
|
created_by: Optional[str] = Field(None, description="User who created the table")
|
|
created_at: Optional[str] = Field(None, description="Table creation timestamp")
|
|
last_edit_by: Optional[str] = Field(
|
|
None, description="User who last edited the table"
|
|
)
|
|
last_edit_at: Optional[str] = Field(None, description="Last edit timestamp")
|
|
row_count: int = Field(default=0, description="Number of rows in the table")
|
|
has_shares: bool = Field(default=False, description="Whether table is shared")
|
|
archived: bool = Field(default=False, description="Whether table is archived")
|
|
is_shared: bool = Field(
|
|
default=False, description="Whether table is shared with current user"
|
|
)
|
|
on_share_permissions: Optional[Dict[str, Any]] = Field(
|
|
None, description="Share permissions"
|
|
)
|
|
|
|
|
|
class TableSchema(BaseModel):
|
|
"""Model for complete table schema including columns and views."""
|
|
|
|
table: Table = Field(description="Table information")
|
|
columns: List[TableColumn] = Field(description="Table columns")
|
|
views: List[TableView] = Field(description="Table views")
|
|
|
|
|
|
class ListTablesResponse(BaseResponse):
|
|
"""Response model for listing tables."""
|
|
|
|
tables: List[Table] = Field(description="List of available tables")
|
|
total_count: int = Field(description="Total number of tables")
|
|
|
|
|
|
class GetSchemaResponse(BaseResponse):
|
|
"""Response model for getting table schema."""
|
|
|
|
table_schema: TableSchema = Field(description="Table schema information")
|
|
|
|
|
|
class ReadTableResponse(BaseResponse):
|
|
"""Response model for reading table rows."""
|
|
|
|
rows: List[TableRow] = Field(description="Table rows")
|
|
table_id: int = Field(description="Table ID")
|
|
total_count: Optional[int] = Field(
|
|
None, description="Total number of rows (if known)"
|
|
)
|
|
offset: Optional[int] = Field(None, description="Offset used for pagination")
|
|
limit: Optional[int] = Field(None, description="Limit used for pagination")
|
|
|
|
|
|
class CreateRowResponse(IdResponse):
|
|
"""Response model for row creation."""
|
|
|
|
row: TableRow = Field(description="The created row")
|
|
table_id: int = Field(description="Table ID the row was created in")
|
|
|
|
|
|
class UpdateRowResponse(BaseResponse):
|
|
"""Response model for row updates."""
|
|
|
|
row: TableRow = Field(description="The updated row")
|
|
|
|
|
|
class DeleteRowResponse(StatusResponse):
|
|
"""Response model for row deletion."""
|
|
|
|
deleted_id: int = Field(description="ID of the deleted row")
|