feat: update schema to match frontend types - add globals, navigation, and missing fields
This commit is contained in:
@@ -69,6 +69,32 @@
|
||||
"interface": "input",
|
||||
"note": "For velocity calc"
|
||||
}
|
||||
},
|
||||
{
|
||||
"field": "domain",
|
||||
"type": "string",
|
||||
"meta": {
|
||||
"interface": "input",
|
||||
"note": "Primary domain (alias for url)"
|
||||
}
|
||||
},
|
||||
{
|
||||
"field": "domain_aliases",
|
||||
"type": "json",
|
||||
"meta": {
|
||||
"interface": "list",
|
||||
"note": "Additional domains"
|
||||
}
|
||||
},
|
||||
{
|
||||
"field": "settings",
|
||||
"type": "json",
|
||||
"meta": {
|
||||
"interface": "input-code",
|
||||
"options": {
|
||||
"language": "json"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -532,6 +558,60 @@
|
||||
"meta": {
|
||||
"interface": "datetime"
|
||||
}
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1521,5 +1601,178 @@
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
157
update_schema.py
Normal file
157
update_schema.py
Normal file
@@ -0,0 +1,157 @@
|
||||
#!/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)}")
|
||||
Reference in New Issue
Block a user