"""Site Handler - manages WordPress site management operations""" import json from typing import Any from plugins.wordpress.client import WordPressClient def get_tool_specifications() -> list[dict[str, Any]]: """Return tool specifications for ToolGenerator""" return [ # === PLUGINS === { "name": "list_plugins", "method_name": "list_plugins", "description": "List installed WordPress plugins. Shows plugin status (active/inactive), version, and details.", "schema": { "type": "object", "properties": { "status": { "type": "string", "description": "Filter plugins by status", "enum": ["active", "inactive", "all"], "default": "all", } }, }, "scope": "read", }, # === THEMES === { "name": "list_themes", "method_name": "list_themes", "description": "List installed WordPress themes. Returns all themes with their status and metadata.", "schema": { "type": "object", "properties": { "status": { "type": "string", "description": "Filter themes by status", "enum": ["active", "inactive", "all"], "default": "all", } }, }, "scope": "read", }, { "name": "get_active_theme", "method_name": "get_active_theme", "description": "Get information about the currently active WordPress theme including name, version, and author.", "schema": {"type": "object", "properties": {}}, "scope": "read", }, # === SETTINGS === { "name": "get_settings", "method_name": "get_settings", "description": "Get WordPress site settings. Includes site title, description, URL, email, timezone, and language.", "schema": {"type": "object", "properties": {}}, "scope": "read", }, # === HEALTH === { "name": "get_site_health", "method_name": "get_site_health", "description": "Check WordPress site health and accessibility. Returns comprehensive health status including WordPress, WooCommerce, and SEO plugin availability.", "schema": {"type": "object", "properties": {}}, "scope": "read", }, ] class SiteHandler: """Handle site management operations for WordPress""" def __init__(self, client: WordPressClient): """ Initialize site handler. Args: client: WordPress API client instance """ self.client = client # === PLUGINS === async def list_plugins(self, status: str = "all") -> str: """ List installed WordPress plugins. Args: status: Filter by plugin status (active, inactive, all) Returns: JSON string with plugins list """ try: # Build endpoint with status filter params = {} if status != "all": params["status"] = status plugins = await self.client.get("plugins", params=params) result = { "total": len(plugins), "plugins": [ { "plugin": p["plugin"], "name": p["name"], "version": p["version"], "status": p["status"], "description": p.get("description", {}).get("raw", "")[:100], } for p in plugins ], } return json.dumps(result, indent=2) except Exception as e: return json.dumps( {"error": str(e), "message": f"Failed to list plugins: {str(e)}"}, indent=2 ) # === THEMES === async def list_themes(self, status: str = "all") -> str: """ List installed WordPress themes. Args: status: Filter by theme status (active, inactive, all) Returns: JSON string with themes list """ try: # Build endpoint with status filter params = {} if status != "all": params["status"] = status themes = await self.client.get("themes", params=params) result = { "total": len(themes), "themes": [ { "stylesheet": t["stylesheet"], "name": t["name"]["rendered"], "version": t["version"], "status": t["status"], } for t in themes ], } return json.dumps(result, indent=2) except Exception as e: return json.dumps( {"error": str(e), "message": f"Failed to list themes: {str(e)}"}, indent=2 ) async def get_active_theme(self) -> str: """ Get the currently active WordPress theme. Returns: JSON string with active theme details """ try: themes = await self.client.get("themes", params={"status": "active"}) if themes: theme = themes[0] result = { "stylesheet": theme["stylesheet"], "name": theme["name"]["rendered"], "version": theme["version"], "author": theme.get("author", {}).get("raw", "Unknown"), } else: result = {"message": "No active theme found"} return json.dumps(result, indent=2) except Exception as e: return json.dumps( {"error": str(e), "message": f"Failed to get active theme: {str(e)}"}, indent=2 ) # === SETTINGS === async def get_settings(self) -> str: """ Get WordPress site settings. Returns: JSON string with site settings including title, description, URL, email, timezone, and language """ try: settings = await self.client.get("settings") result = { "title": settings.get("title", ""), "description": settings.get("description", ""), "url": settings.get("url", ""), "email": settings.get("email", ""), "timezone": settings.get("timezone_string", ""), "language": settings.get("language", ""), } return json.dumps(result, indent=2) except Exception as e: return json.dumps( {"error": str(e), "message": f"Failed to get settings: {str(e)}"}, indent=2 ) # === HEALTH === async def get_site_health(self) -> str: """ Check WordPress site health and accessibility. Returns: JSON string with comprehensive health status """ try: health = await self.client.check_site_health() return json.dumps(health, indent=2) except Exception as e: return json.dumps( {"error": str(e), "message": f"Failed to get site health: {str(e)}"}, indent=2 ) async def health_check(self) -> dict[str, Any]: """ Perform health check using client's check_site_health method. This method is used internally and returns a dict instead of JSON string. Returns: Dict with health status information """ return await self.client.check_site_health()