- Fix Python formatting (sync no longer strips blank lines from .py files) - Remove test_community_build.py (tests private sync module) - Fix ruff warnings in test files - Add CODE_OF_CONDUCT.md - Add .github/PULL_REQUEST_TEMPLATE.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
246 lines
7.8 KiB
Python
246 lines
7.8 KiB
Python
"""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()
|