""" Component for use with Component.CPage, for Webware. """ from Component.CPage import ServletComponent, Component from formencode.formprocessor import FormProcessor class FormServletComponent(ServletComponent): _servletMethods = [] def __init__(self, name='form', schema=None): self.name = name self.schema = schema def addComponentTo(self, servlet): ServletComponent.addComponentTo(self, servlet) if self.schema is None: if not hasattr(servlet, self.name + "Schema"): if not hasattr(servlet, 'schema'): assert 0, "You must provide a schema to the constructor, or else define servlet variable 'schema' or '%sSchema'" % self.name self.schema = servlet.schema else: self.schema = getattr(servlet, self.name + "Schema") if isinstance(self.schema, type): self.schema = self.schema() nameCap = self.name[0].upper() + self.name[1:] processName = 'process' + nameCap renderName = 'render' + nameCap writeName = 'write' + nameCap self.formProcessor = FormProcessor(self.schema, self.name) fp = self.formProcessor setattr(servlet, processName, self.processForm) setattr(servlet, renderName, fp.renderForm) setattr(servlet, writeName, self.writeForm) def awakeEvent(self, trans): self._errors = None def sleepEvent(self, trans): self._errors = None def writeForm(self, defaults=None, options=None, httpRequest=None): if self._errors: httpRequest = self.servlet().request().fields() self.servlet().write(self.formProcessor.renderForm( defaults=defaults, options=options, errors=self._errors, httpRequest=httpRequest, action=self.servlet().__class__.__name__, )) def processForm(self): input = self.servlet().request().fields() success, data = self.formProcessor.processForm(input, state=self.servlet()) if not success: self._errors = data return success, data class FormComponent(Component): _componentClass = FormServletComponent