from __future__ import annotations from collections.abc import Callable from typing import Annotated, Any from pydantic import Field SafeResult = Callable[[Callable[[], dict[str, Any]]], dict[str, Any]] SafeRawResult = Callable[[bool, Callable[[], dict[str, Any]]], dict[str, Any]] def register_write_tools(server: Any, project_service: Any, safe_result: SafeResult) -> None: @server.tool() def create_project( name: Annotated[str, Field(description="Project name. It must not be blank.")], customer_id: Annotated[Any | None, Field(description="Optional NocoBase customer ID.")] = None, inquiry_date: Annotated[ str | None, Field(description="Optional project inquiry date in YYYY-MM-DD format.") ] = None, progress: Annotated[ str | None, Field(description="Optional configured Chinese project progress label.") ] = None, applications: Annotated[str | None, Field(description="Optional project applications.")] = None, part_numbers: Annotated[str | None, Field(description="Optional project part numbers.")] = None, period_usage: Annotated[str | None, Field(description="Optional project period usage.")] = None, details: Annotated[str | None, Field(description="Optional project details.")] = None, attachment_ids: Annotated[ list[Any] | None, Field(description="Optional uploaded attachment IDs to associate.") ] = None, ) -> dict[str, Any]: """Create one fixed-schema NocoBase project and optionally associate uploaded attachments.""" assert project_service is not None return safe_result( lambda: project_service.create_project( name=name, customer_id=customer_id, inquiry_date=inquiry_date, progress=progress, applications=applications, part_numbers=part_numbers, period_usage=period_usage, details=details, attachment_ids=attachment_ids, ) ) @server.tool() def update_project( project_id: Annotated[Any, Field(description="NocoBase project ID.")], name: Annotated[str | None, Field(description="Optional project name.")] = None, customer_id: Annotated[Any | None, Field(description="Optional NocoBase customer ID.")] = None, inquiry_date: Annotated[ str | None, Field(description="Optional project inquiry date in YYYY-MM-DD format.") ] = None, progress: Annotated[ str | None, Field(description="Optional configured Chinese project progress label.") ] = None, applications: Annotated[str | None, Field(description="Optional project applications.")] = None, part_numbers: Annotated[str | None, Field(description="Optional project part numbers.")] = None, period_usage: Annotated[str | None, Field(description="Optional project period usage.")] = None, details: Annotated[str | None, Field(description="Optional project details.")] = None, add_attachment_ids: Annotated[ list[Any] | None, Field(description="Attachment IDs to add incrementally.") ] = None, remove_attachment_ids: Annotated[ list[Any] | None, Field(description="Attachment IDs to remove incrementally.") ] = None, ) -> dict[str, Any]: """Update fixed project fields and incrementally add or remove uploaded attachments.""" assert project_service is not None return safe_result( lambda: project_service.update_project( project_id, name=name, customer_id=customer_id, inquiry_date=inquiry_date, progress=progress, applications=applications, part_numbers=part_numbers, period_usage=period_usage, details=details, add_attachment_ids=add_attachment_ids, remove_attachment_ids=remove_attachment_ids, ) )