Viewing file: formbuilder.py (2.57 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
## formbuilder
from zope.interface import implements
from nevow import rend from nevow import loaders from nevow import tags as T 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)
|