Skip to content

Instantly share code, notes, and snippets.

@cmd-ntrf
Created February 2, 2017 23:40
Show Gist options
  • Save cmd-ntrf/477cf51d3b574d008c4b123b1aaecf9c to your computer and use it in GitHub Desktop.
Save cmd-ntrf/477cf51d3b574d008c4b123b1aaecf9c to your computer and use it in GitHub Desktop.
Wrapper to allow any spawner to be launch with an option form.
from wtforms import Form
from jinja2 import Template
from collections import Sequence
from traitlets import Type, HasTraits
class MetaSpawnerForm(Form):
form_template = Template("""
{% for field in form %}
{{ field.label() }}
{{ field() }}
<br>
{% endfor %}""")
class MockMultiDict(dict):
def getlist(self, key):
value = self[key]
return value if isinstance(value, list) else [self[key]]
@property
def options_form(self):
return self.form_template.render(form=self)
def options_from_form(self, options):
self.process(formdata=self.MockMultiDict(options))
if not self.validate():
raise Exception(self.errors)
return self.data
class FormSpawner(HasTraits):
form_type = Type(MetaSpawnerForm, allow_none=False, help="")
def __init__(self, *args, **kargs):
super().__init__(*args, **kargs)
self.form = self.form_type()
self.options_form = self.form.options_form
self.options_from_form = self.form.options_from_form
def generate_form_spawner(baseclass, **kargs):
form_type = type("SpawnerForm", (MetaSpawnerForm,), kargs)
return type(baseclass.__name__ + "_form", (baseclass, FormSpawner), {'form_type': form_type})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment