## formbuilder
from zope.interface import implements
from nevow import rend
from nevow import loaders
from nevow import tags
from nevow import util
from formless import annotate
from formless import webform
from formless import configurable
from twisted.python import reflect
class BuilderCore(configurable.Configurable):
def __init__(self):
configurable.Configurable.__init__(self, None)
self.formElements = []
def getBindingNames(self, ctx):
return ['form']
def bind_form(self, ctx):
return annotate.MethodBinding(
'action',
annotate.Method(arguments=self.formElements))
def action(self, **kw):
print "ACTION!", kw
def addElement(self, name, type):
self.formElements.append(
annotate.Argument(name, type()))
allTypes = [annotate.String, annotate.Text, annotate.Integer, annotate.Real, annotate.Password]
typeChoice = annotate.Choice(choices=allTypes, valueToKey=reflect.qual, keyToValue=reflect.namedAny, stringify=lambda x: x.__name__)
class IFormBuilder(annotate.TypedInterface):
def addElement(name=annotate.String(required=True), type=typeChoice):
"""Add Element
Add an element to this form.
"""
pass
addElement = annotate.autocallable(addElement)
def clearForm():
"""Clear Form
Clear this form.
"""
clearForm = annotate.autocallable(clearForm)
class FormBuilder(rend.Page):
implements(IFormBuilder)
addSlash = True
def __init__(self):
rend.Page.__init__(self)
self.clearForm()
def configurable_formBuilder(self, ctx):
return configurable.TypedInterfaceConfigurable(self)
def configurable_dynamicForm(self, ctx):
return self.builderCore
def addElement(self, name, type):
self.builderCore.addElement(name, type)
def clearForm(self):
self.builderCore = BuilderCore()
docFactory = loaders.stan(T.html[
T.head[
T.title["Form builder!"]],
T.style(type="text/css")[
open(util.resource_filename('formless', 'freeform-default.css')).read()],
T.body[
T.h1["Welcome to form builder"],
webform.renderForms('formBuilder'),
T.h2["Here is your form:"],
webform.renderForms('dynamicForm')]])
## Startup glue
from nevow import appserver
from twisted.application import service
from twisted.application import internet
application = service.Application('formbuilder')
internet.TCPServer(8080, appserver.NevowSite(FormBuilder())).setServiceParent(application)
|