def __init__(self, context, request, form, retrieve_data=True, defaults=None): """ Initiate the form view. If retrieve_data is True(ish), the submission handler will be asked for the data. If defaults is given, any fields available in the defaults will be preloaded. """ if not defaults: defaults = {} self.context = context self.request = request self.form = form # vocabs for method in getmembers(context, ismethod): if getattr(method[1], "__vocab__", False): Registry.register_vocab(method[0], method[1]) if retrieve_data: try: data = self.form.submission.retrieve(form, context) self.form.data.update(data) except: pass if defaults: for key in defaults.keys(): self.form.data.getField(key).value = defaults[key]
def lexVal(self, value, **kwargs): """ Lexical value of select should return the label of the matching option. """ if type([]) == type(value): res = [] for val in value: res.append(self.lexVal(val)) return res options = [] if self.vocab: vocab = Registry.get_vocab(self.vocab) args = [] if self.vocab_args: args = self.vocab_args.split(",") if callable(vocab): options = vocab(*args, **kwargs) options.extend(self.options) for opt in options: if self._is_same(opt.value, value): return opt.label return value
def get_template(tpl_type): """ Return a template for the given type. If template path is set, try that, but fall back on default template.""" if tpl_type in TPL_CACHE.keys(): return TPL_CACHE[tpl_type] tpl_paths = Registry.get_html_template_path() tpl = None for tpl_path in tpl_paths: if tpl_path and not tpl_path.startswith("."): tpl = "%s/%s.pt" % (tpl_path, tpl_type) else: tpl = find_file("templates/%s/%s.pt" % (tpl_path, tpl_type), __file__) if os.path.isfile(tpl): break if not (tpl and os.path.isfile(tpl)): tpl = find_file("templates/%s.pt" % tpl_type, __file__) tpl = PageTemplateFile(tpl, encoding="utf-8") TPL_CACHE[tpl_type] = tpl return tpl
def processInput(self, data=None, datatype="string"): """ Base implementation """ val = None if data: # for multiselects we need to read all values from the request. # TODO: note that this is done in different ways per framework # I think for plone the HTML markup should use ":list" as a # control name. But for now I need this in pyramid, and the # getall method works fine.. if self.multiple: val = data.getall(self.id) else: val = data.get(self.id, None) try: converter = Registry.get_converter(datatype) val = converter(val) # TODO: what to do when multiple values are present? convert each # item in the list? # if self.multiple: # newval = [] # for item in val: # newval.append(converter(item)) # val = newval # else: # val = converter(val) except: pass return val
def render(self, renderer, form, renderable, out, **kwargs): fmtmap = renderer.createFormatMap(form, renderable, **kwargs) opts = [] if renderable.vocab: vocab = Registry.get_vocab(renderable.vocab) if callable(vocab): opts = vocab() else: opts = renderable.options value = form.data[renderable.bind] if renderable.format == "full": print >> out, TEMPLATES['SELECT_FULL']( control=renderable, value=value, options=opts, extra_classes=fmtmap['extra_classes'] ) else: print >> out, TEMPLATES['SELECT_COMPACT']( control=renderable, value=value, options=opts, extra_classes=fmtmap['extra_classes'] )
def processInput(self, data=None, datatype="string"): val = None if data: val = data.get(self.id, None) try: converter = Registry.get_converter(datatype) val = converter(val) except: pass return val
def create_submission(self, root): cls = Registry.get_submission(root.get("type")) if not cls: return None kwargs = {} for prop in root.xpath("./property"): kwargs[prop.get("name")] = prop.text submission = cls(**kwargs) return submission
def processInput(self, data=None, datatype="datetime"): """ Base implementation """ val = None if data: val = data.get(self.id, None) try: converter = Registry.get_converter(datatype) val = converter(val.strip(), self.format) except: pass return val
def render(self, renderer, form, renderable, out, **kwargs): fmtmap = renderer.createFormatMap(form, renderable, **kwargs) opts = [] if renderable.vocab: vocab = Registry.get_vocab(renderable.vocab) if callable(vocab): args = [] if renderable.vocab_args: args = renderable.vocab_args.split(",") opts = vocab(*args, **kwargs) opts.extend(renderable.options) value = form.data[renderable.bind] # some hacking for multiple type. sometimes the saved data is just a # plain old type (int) and we expect a list of strings in the template if fmtmap['multiple'] and fmtmap['multiple'].lower() == 'true': value = form.getFieldValue(renderable.id, lexical=False) if type(value) == ListType: # just to be sure? value = [str(val) for val in value] if renderable.format == "full": print >> out, get_template('select_full')(control=renderable, value=value, options=opts, fmtmap=fmtmap) else: print >> out, get_template('select')(control=renderable, value=value, options=opts, multiple=fmtmap['multiple'], fmtmap=fmtmap)
def render(self, renderer, form, renderable, out, **kwargs): fmtmap = renderer.createFormatMap(form, renderable, **kwargs) opts = [] if renderable.vocab: vocab = Registry.get_vocab(renderable.vocab) if callable(vocab): args = [] if renderable.vocab_args: args = renderable.vocab_args.split(",") opts = vocab(*args, **kwargs) opts.extend(renderable.options) value = form.data[renderable.bind] # some hacking for multiple type. sometimes the saved data is just a # plain old type (int) and we expect a list of strings in the template if fmtmap["multiple"] and fmtmap["multiple"].lower() == "true": value = form.getFieldValue(renderable.id, lexical=False) if type(value) == ListType: # just to be sure? value = [str(val) for val in value] if renderable.format == "full": print >> out, get_template("select_full")(control=renderable, value=value, options=opts, fmtmap=fmtmap) else: print >> out, get_template("select")( control=renderable, value=value, options=opts, multiple=fmtmap["multiple"], fmtmap=fmtmap )
from select import SelectRenderer from checkbox import CheckboxRenderer from input import InputRenderer from password import PasswordRenderer from hidden import HiddenRenderer from text import TextRenderer from cardgroup import CardGroupRenderer from flowgroup import FlowGroupRenderer from stepgroup import StepGroupRenderer from submit import SubmitRenderer from cancel import CancelRenderer from reset import ResetRenderer from richtext import RichTextRenderer from file import FileRenderer Registry.register_renderer("submit", "html", SubmitRenderer) Registry.register_renderer("cancel", "html", CancelRenderer) Registry.register_renderer("reset", "html", ResetRenderer) Registry.register_renderer("text", "html", TextRenderer) Registry.register_renderer("input", "html", InputRenderer) Registry.register_renderer("datetime", "html", InputRenderer) Registry.register_renderer("password", "html", PasswordRenderer) Registry.register_renderer("hidden", "html", HiddenRenderer) Registry.register_renderer("file", "html", FileRenderer) Registry.register_renderer("checkbox", "html", CheckboxRenderer) Registry.register_renderer("richtext", "html", RichTextRenderer) Registry.register_renderer("select", "html", SelectRenderer) Registry.register_renderer("range", "html", SelectRenderer) Registry.register_renderer("flowgroup", "html", FlowGroupRenderer) Registry.register_renderer("cardgroup", "html", CardGroupRenderer) Registry.register_renderer("stepgroup", "html", StepGroupRenderer)
""" Being there """ from control import * #from group import Group from renderables import * from w20e.forms.registry import Registry Registry.register_renderable('input', Input) Registry.register_renderable('hidden', Hidden) Registry.register_renderable('password', Password) Registry.register_renderable('table', Table) Registry.register_renderable('select', Select) Registry.register_renderable('range', Range) Registry.register_renderable('group', None) Registry.register_renderable('text', Text) Registry.register_renderable('richtext', RichText) Registry.register_renderable('file', File) Registry.register_renderable('submit', Submit) Registry.register_renderable('cancel', Cancel) Registry.register_renderable('checkbox', Checkbox) Registry.register_renderable('date', Date)
""" Being there """ from w20e.forms.registry import Registry from attrstorage import AttrStorage from attrsstorage import AttrsStorage from pyramidsession import PyramidSessionStorage from methodcall import MethodCall from none import NoSubmission Registry.register_submission('attr', AttrStorage) Registry.register_submission('attrs', AttrsStorage) Registry.register_submission('methodcall', MethodCall) Registry.register_submission('none', NoSubmission) Registry.register_submission('pyramidsession', PyramidSessionStorage) try: from emailsubmission import EmailSubmission Registry.register_submission('email', EmailSubmission) except: pass
def getRendererForType(self, renderableType, rendererType): return Registry.get_renderer(renderableType, rendererType)
def register(): Registry.register_converter("string", to_str) Registry.register_converter("str", to_str) Registry.register_converter("int", int) Registry.register_converter("bool", to_bool) Registry.register_converter("float", float) Registry.register_converter("date", to_date) Registry.register_converter("datetime", to_date) Registry.register_converter("list", to_list)
from checkbox import CheckboxRenderer from input import InputRenderer from password import PasswordRenderer from hidden import HiddenRenderer from text import TextRenderer from cardgroup import CardGroupRenderer from flowgroup import FlowGroupRenderer from stepgroup import StepGroupRenderer from submit import SubmitRenderer from cancel import CancelRenderer from richtext import RichTextRenderer from file import FileRenderer from table import TableRenderer Registry.register_renderer("submit", "html", SubmitRenderer) Registry.register_renderer("cancel", "html", CancelRenderer) Registry.register_renderer("text", "html", TextRenderer) Registry.register_renderer("input", "html", InputRenderer) Registry.register_renderer("password", "html", PasswordRenderer) Registry.register_renderer("hidden", "html", HiddenRenderer) Registry.register_renderer("table", "html", TableRenderer) Registry.register_renderer("file", "html", FileRenderer) Registry.register_renderer("checkbox", "html", CheckboxRenderer) Registry.register_renderer("richtext", "html", RichTextRenderer) try: from plonerichtext import PloneRichTextRenderer Registry.register_renderer("plonerichtext", "html", PloneRichTextRenderer) except: ##No Plone available! pass
def register(): validate_int = CheckInstance(int) validate_bool = CheckInstance(bool) validate_float = CheckInstance(float) validate_date = CheckInstance(datetime) Registry.register_validator("string", validate_string) Registry.register_validator("int", validate_int) Registry.register_validator("bool", validate_bool) Registry.register_validator("float", validate_float) Registry.register_validator("date", validate_date) Registry.register_validator("datetime", validate_date) Registry.register_validator("file", validate_file)
def getRendererForType(self, renderableType, rendererType): clazz = Registry.get_renderer(renderableType, rendererType) return clazz()
def _create_renderables(self, child, view): cls = "" if child.tag in XMLFormFactory.controlClasses: cls = XMLFormFactory.controlClasses[child.tag] elif Registry.get_renderable(child.tag): cls = Registry.get_renderable(child.tag) else: cls = eval(child.tag.capitalize()) kwargs = {} for elt in child.xpath("./property"): kwargs[elt.get("name")] = elt.text for elt in ["hint", "help", "alert"]: if child.xpath("./%s" % elt): kwargs[elt] = child.xpath("./%s" % elt)[0].text or '' if cls == Text: ctrl = cls(child.get("id"), child.text, bind=child.get("bind"), **kwargs) elif cls.__name__ == "Hidden": ctrl = cls(child.get("id"), bind=child.get("bind"), **kwargs) elif cls == Submit: ctrl = cls(child.get("id"), child.find("label").text, **kwargs) elif cls == Group: cls = eval("%sGroup" % child.get("layout", "flow").capitalize()) label = '' try: label = child.find("label").text except: pass ctrl = cls(child.get("id"), label, **kwargs) else: label = '' try: label = child.find("label").text except: pass ctrl = cls(child.get("id"), label, bind=child.get("bind"), **kwargs) if hasattr(ctrl, "addOption"): for subchild in child.xpath("option"): ctrl.addOption( Option(subchild.get("value"), subchild.text or '')) for subchild in child.xpath("|".join( Registry.get_registered_renderables())): self._create_renderables(subchild, ctrl) view.addRenderable(ctrl)
from zope.component import getSiteManager from pyramid.config import Configurator from pyramid_zodbconn import get_connection from pyramid.session import ( UnencryptedCookieSessionFactoryConfig as SessionFactory) import pyramid_zcml from events import AppRootReady from w20e.forms.registry import Registry from w20e.forms.pyramid.file import PyramidFile from models.imagefolder import ImageFolder from json_adapters import register_json_adapters from migration import migrate import pkg_resources Registry.register_renderable("file", PyramidFile) tpl_path = os.path.join(os.path.dirname(__file__), "templates/w20e_forms_overrides/") Registry.add_html_template_path(tpl_path) Registry.add_html_template_path("./bootstrap") here = os.path.abspath(os.path.dirname(__file__)) version = pkg_resources.get_distribution("w20e.pycms").version def class_from_string(clazz_name): """ We'll need to follow the dotted path, and find the module that starts with some part, and provides the rest of the path... """
def _create_renderables(self, child, view): cls = "" if child.tag in XMLFormFactory.controlClasses: cls = XMLFormFactory.controlClasses[child.tag] elif Registry.get_renderable(child.tag): cls = Registry.get_renderable(child.tag) else: cls = eval(child.tag.capitalize()) kwargs = {} for attrib in child.keys(): if attrib in kwargs_attrs: kwargs[attrib] = child.get(attrib) for elt in child.xpath("./property"): kwargs[elt.get("name")] = elt.text for elt in ["hint", "help", "alert", "placeholder"]: if child.xpath("./%s" % elt): kwargs[elt] = child.xpath("./%s" % elt)[0].text or '' if cls == Text: ctrl = cls(child.get("id"), ''.join(child.xpath("./text()")), **kwargs) elif cls == Hidden: ctrl = cls(child.get("id"), **kwargs) elif cls == Submit: ctrl = cls(child.get("id"), child.find("label").text, **kwargs) elif cls == Group: layout_class = "%sGroup" % child.get("layout", "flow").capitalize() if Registry.get_renderable(layout_class.lower()): cls = Registry.get_renderable(layout_class.lower()) else: cls = eval(layout_class) label = '' try: label = child.find("label").text except: pass ctrl = cls(child.get("id"), label, **kwargs) else: label = '' try: label = child.find("label").text except: pass ctrl = cls(child.get("id"), label, **kwargs) if hasattr(ctrl, "addOption") and getattr(ctrl, "addOption"): for subchild in child.xpath("option"): if subchild.xpath("label"): # assume only one text = subchild.xpath("label")[0].text else: text = subchild.text or '' ctrl.addOption(Option(subchild.get("value"), text)) for subchild in child.xpath("|".join( Registry.get_registered_renderables())): self._create_renderables(subchild, ctrl) view.addRenderable(ctrl)