158 lines
5.6 KiB
Python
158 lines
5.6 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Update unified_schema.json to match frontend types
|
|
"""
|
|
import json
|
|
|
|
# Load existing schema
|
|
with open('unified_schema.json', 'r') as f:
|
|
schema = json.load(f)
|
|
|
|
# Find sites collection and add missing fields
|
|
for collection in schema:
|
|
if collection['collection'] == 'sites':
|
|
# Add domain (alias for url)
|
|
collection['fields'].append({
|
|
"field": "domain",
|
|
"type": "string",
|
|
"meta": {
|
|
"interface": "input",
|
|
"note": "Primary domain (alias for url)"
|
|
}
|
|
})
|
|
# Add domain_aliases
|
|
collection['fields'].append({
|
|
"field": "domain_aliases",
|
|
"type": "json",
|
|
"meta": {
|
|
"interface": "list",
|
|
"note": "Additional domains"
|
|
}
|
|
})
|
|
# Add settings
|
|
collection['fields'].append({
|
|
"field": "settings",
|
|
"type": "json",
|
|
"meta": {
|
|
"interface": "input-code",
|
|
"options": {
|
|
"language": "json"
|
|
}
|
|
}
|
|
})
|
|
print("✅ Updated sites collection")
|
|
|
|
elif collection['collection'] == 'generated_articles':
|
|
# Add missing fields
|
|
new_fields = [
|
|
{
|
|
"field": "priority",
|
|
"type": "string",
|
|
"meta": {
|
|
"interface": "select-dropdown",
|
|
"options": {
|
|
"choices": [
|
|
{"text": "High", "value": "high"},
|
|
{"text": "Medium", "value": "medium"},
|
|
{"text": "Low", "value": "low"}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"field": "assignee",
|
|
"type": "string",
|
|
"meta": {
|
|
"interface": "input",
|
|
"note": "Assigned user"
|
|
}
|
|
},
|
|
{
|
|
"field": "due_date",
|
|
"type": "timestamp",
|
|
"meta": {
|
|
"interface": "datetime"
|
|
}
|
|
},
|
|
{
|
|
"field": "seo_score",
|
|
"type": "integer",
|
|
"meta": {
|
|
"interface": "input",
|
|
"note": "SEO quality score 0-100"
|
|
}
|
|
},
|
|
{
|
|
"field": "sync_status",
|
|
"type": "string",
|
|
"meta": {
|
|
"interface": "input",
|
|
"note": "WordPress sync status"
|
|
}
|
|
}
|
|
]
|
|
collection['fields'].extend(new_fields)
|
|
print("✅ Updated generated_articles collection")
|
|
|
|
# Add globals collection
|
|
globals_collection = {
|
|
"collection": "globals",
|
|
"meta": {
|
|
"icon": "settings",
|
|
"note": "Site-wide settings and branding",
|
|
"singleton": True
|
|
},
|
|
"fields": [
|
|
{"field": "site", "type": "uuid", "meta": {"interface": "select-dropdown-m2o", "special": ["m2o"]}},
|
|
{"field": "site_name", "type": "string", "meta": {"interface": "input"}},
|
|
{"field": "site_tagline", "type": "string", "meta": {"interface": "input"}},
|
|
{"field": "logo", "type": "uuid", "meta": {"interface": "file-image", "special": ["file"]}},
|
|
{"field": "favicon", "type": "uuid", "meta": {"interface": "file-image", "special": ["file"]}},
|
|
{"field": "primary_color", "type": "string", "meta": {"interface": "select-color"}},
|
|
{"field": "secondary_color", "type": "string", "meta": {"interface": "select-color"}},
|
|
{"field": "footer_text", "type": "text", "meta": {"interface": "input-rich-text-html"}},
|
|
{"field": "social_links", "type": "json", "meta": {"interface": "list"}},
|
|
{"field": "scripts_head", "type": "text", "meta": {"interface": "input-code", "options": {"language": "html"}}},
|
|
{"field": "scripts_body", "type": "text", "meta": {"interface": "input-code", "options": {"language": "html"}}}
|
|
]
|
|
}
|
|
|
|
# Add navigation collection
|
|
navigation_collection = {
|
|
"collection": "navigation",
|
|
"meta": {
|
|
"icon": "menu",
|
|
"note": "Site menus"
|
|
},
|
|
"fields": [
|
|
{"field": "site", "type": "uuid", "meta": {"interface": "select-dropdown-m2o", "special": ["m2o"]}},
|
|
{"field": "label", "type": "string", "meta": {"interface": "input", "required": True}},
|
|
{"field": "url", "type": "string", "meta": {"interface": "input", "required": True}},
|
|
{"field": "target", "type": "string", "meta": {"interface": "select-dropdown", "options": {"choices": [{"text": "Same Window", "value": "_self"}, {"text": "New Window", "value": "_blank"}]}}},
|
|
{"field": "parent", "type": "uuid", "meta": {"interface": "select-dropdown-m2o", "special": ["m2o"]}},
|
|
{"field": "sort", "type": "integer", "meta": {"interface": "input"}}
|
|
]
|
|
}
|
|
|
|
# Check if collections already exist
|
|
has_globals = any(c['collection'] == 'globals' for c in schema)
|
|
has_navigation = any(c['collection'] == 'navigation' for c in schema)
|
|
|
|
if not has_globals:
|
|
schema.append(globals_collection)
|
|
print("✅ Added globals collection")
|
|
else:
|
|
print("⚠️ globals collection already exists")
|
|
|
|
if not has_navigation:
|
|
schema.append(navigation_collection)
|
|
print("✅ Added navigation collection")
|
|
else:
|
|
print("⚠️ navigation collection already exists")
|
|
|
|
# Save updated schema
|
|
with open('unified_schema.json', 'w') as f:
|
|
json.dump(schema, f, indent=4)
|
|
|
|
print(f"\n✅ Schema updated! Total collections: {len(schema)}")
|