This defines how a schema should be created..
{"fields": [
{
"name": pythonidentifier,
"title": short_string,
"description": long_string,
"type": schema_type,
"validator": validatish_validator,
},
]
}
This will be used in couchdb and in python so only valid python identifiers can be used. It will also be used in html forms.
Used as meta data (for instance, title will override the name for the label in formish)
Any schemaish types. We should probably use the same format as the type itself (i.e. String, DateParts) in order to keep consistency.
Note
should type default to string - I think so personally
This is a single validator or combination.. This will be eval”d but checked to be valid first (i.e. no arbitrary execution of python). e.g.
{
"validator": "Required()"
}
{
"validator": "Any(Integer(), Float())"
}
widgets are added as below
{"fields": [
{
"name": pythonidentifier,
"title": short_string,
"description": long_string,
"type": schema_type,
"validator": validatish_validator,
"widget": {
"type": widget_type,
.... any keyword or positional arguments, use arg name for positionals ...
}
}
},
]
}
Here are a few examples
{"fields": [
{
"name": "title",
"widget": {
"type": "SelectChoice",
"options": [("mr","Mr"),("mrs","Mrs"),("miss","Miss")],
"none_option": ("None","--select your title--"),
}
},
{
"name": "first_name",
"title": "First Name",
"validator": "Required()"
},
{
"name": "interests",
"type": "Sequence(String())",
"widget": {
"type": "CheckboxMultiChoice",
"options": ["golf","quantum physics","knitting"],
}
},
]
}
If we want to include references to other objects, we need to make sure we can point to them.. e.g. The select for title in the first part
here is a simple example of a book refering to an author
{"fields": [
{
"name": "title",
"type": "String()",
},
{
"name": "author",
"type": "Reference()",
"refersto": "author_name"
},
]
}
{"views": [
{
"name": "author_name",
"url": "author/name_by_id",
"uses": ["author.first_name","author.last_name"]
}
],
}
Here is a more complicated version where we have a book and an author .. The books author uses a view to pull in the reference. This creates dictionary structure for the author that I”ve shown at the end of this section.
book
{"fields": [
{
"name": "title",
},
{
"name": "author",
"type": "Reference()",
"refersto": "author_name",
},
]
}
author
{"fields": [
{
"name": "title",
"widget": {
"type": "SelectChoice",
"options": [("mr","Mr"),("mrs","Mrs"),("miss","Miss")],
"none_option": ("None","--select your title--"),
}
},
{
"name": "first_name",
"title": "First Name",
"validator": "Required()"
},
{
"name": "last_name",
"title": "Last Name",
"validator": "Required()"
},
{
"name": "birthday",
"type": "Date()",
},
]
}
views
{"views": [
{
"name": "author_name",
"url": "author/name_by_id",
"map" : "function(doc) { if (doc.model_type=='author') { emit(doc._id, {first_name: doc.first_name, last_name: doc.last_name} ); } }"
"uses": ["author.first_name","author.last_name"],
}
],
}
{
"author": {
"_ref": "42e29d907e04087a8ab1e40cc467a259",
"first_name": "Isaac",
"last_name": "Asimov",
}
"title": "I, Robot",
}
{
"title": "Mr",
"first_name": "Isaac",
"last_name": "Asimov",
"birthday": "1936-09-01",
}
book:
fields:
- name: title
- name: author
type: Reference()
view: author_name
author:
fields:
- name: first_name
- name: last_name
- name: birthday
type: date
views:
- name: author_name
url: author/name_by_id
map : function(doc) { if (doc.model_type=='author') { emit(doc._id, {first_name: doc.first_name, last_name: doc.last_name} ); } }
uses: [author.first_name, author.last_name]
You can let couchish work out the url automatically or even just provide a designdoc namespace
automatic
views:
- name: author_name
map : function(doc) { if (doc.model_type=='author') { emit(doc._id, {first_name: doc.first_name, last_name: doc.last_name} ); } }
uses: [author.first_name, author.last_name]
supply the design doc
views:
- name: author_name
designdoc: author
map : function(doc) { if (doc.model_type=='author') { emit(doc._id, {first_name: doc.first_name, last_name: doc.last_name} ); } }
uses: [author.first_name, author.last_name]
You can also let couchish build the map if you want (this only works if the map is just nested dictionary accessors of a single model type
views:
- name: author_name
uses: [author.first_name, author.last_name]