예제 #1
0
    def __init__(self, method, action, csrf=False):
        self.form = BaseForm({})
        self.elements = dict()
        self.method = method
        self.action = action

        if not csrf:
            self.form._csrf = None
예제 #2
0
    def __init__(self, course_id, questions, total_marks):
        course = Course.query.filter(Course.id == course_id).first()
        units = Unit.query.filter(Unit.course == course).all()

        question_translator = defaultdict(dict)
        form_fields = {}
        validators = defaultdict(list)
        flatten_data = defaultdict(list)

        flatten_data["units"].extend([0] * len(units))
        flatten_data["cognitive"].extend([0] * len(CognitiveEnum.__members__))
        flatten_data["difficulty"].extend([0] *
                                          len(DifficultyEnum.__members__))
        flatten_data["questions"].extend([0] * sum(questions))

        for unit in units:
            field = f"Unit:{unit.chapter_no:02d}"
            form_fields.update(
                {field: IntegerField(field, validators=[DataRequired()])})
            validators["units"].append(field)
        for c_level in CognitiveEnum.__members__:
            form_fields.update(
                {c_level: IntegerField(c_level, validators=[DataRequired()])})
            validators["cognitive"].append(c_level)
        for d_level in DifficultyEnum.__members__:
            form_fields.update(
                {d_level: IntegerField(d_level, validators=[DataRequired()])})
            validators["difficulty"].append(d_level)

        idx = 0
        for question_no, subquestions in enumerate(questions):
            for subquestion in range(subquestions):
                field = f"Que.{question_no + 1}.{ascii_uppercase[subquestion]}"
                form_fields.update(
                    {field: IntegerField(field, validators=[DataRequired()])})
                validators["questions"].append(field)
                question_translator[question_no +
                                    1][ascii_uppercase[subquestion]] = idx
                idx += 1

        for i, validator in validators.items():
            validators[i] = IsSumOf(*validator)

        form_fields.update({
            "total_marks":
            IntegerField("total_marks",
                         validators=[DataRequired(),
                                     *validators.values()])  # *validators
        })

        self.form = BaseForm(form_fields)
        self.flatten_data = flatten_data
        self.course = course
        self.total_marks = total_marks
        self.unit_field_regex = re.compile(r"Unit:(\d\d)")
        self.question_field_regex = re.compile(r"Que.(\d+).([A-Z])")
        self.question_translator = question_translator
예제 #3
0
    def test_create(self):
        q_multi = QuestionMultiple(30, 'Alcohol')
        self.assertEqual(q_multi.id, 30)
        self.assertEqual(q_multi.group_name, 'Alcohol')
        self.assertEqual(q_multi.set_response, None)
        self.assertEqual(q_multi.response_type, 'MULTIPLE')
        self.assertEqual(
            q_multi.question,
            'What type(s) of alcohol do you typically consume '
            '(select all that apply)?')
        self.assertEqual(
            q_multi.american_question,
            'What type(s) of alcohol do you typically consume '
            '(select all that apply)?')
        self.assertEqual(q_multi.triggers, tuple())
        self.assertEqual(q_multi.qid, 'Alcohol_30')
        self.assertEqual(q_multi.interface_element_ids, ['Alcohol_30_0'])

        # Test rendering of form object
        form = BaseForm(
            {q_multi.interface_element_ids[0]: q_multi.interface_elements[0]})
        eid = q_multi.interface_element_ids[0]
        self.assertEqual(str(type(form[eid])),
                         "<class 'wtforms.fields.core.SelectMultipleField'>")
        self.assertEqual(form[eid].choices, [(0, 'Beer/Cider'),
                                             (1, 'Sour beers'),
                                             (2, 'White wine'),
                                             (3, 'Red wine'),
                                             (4, 'Spirits/hard alcohol')])
예제 #4
0
    def __init__(self, request):
        """Base class for input validation. Subclass to add validators.

        :param request: flask.Request object to validate.
        """

        #: List of errors from all validators.
        self.errors = []

        self._request = request
        self._forms = dict()

        for name in dir(self):
            if not name.startswith('_') and name not in [
                    'errors', 'validate', 'valid_attrs'
            ]:
                input = getattr(self, name)
                fields = dict()

                if isinstance(input, dict):
                    for field, validators in input.items():
                        fields[field] = Field(validators=validators)
                elif isinstance(input, collections.Iterable):
                    fields['_input'] = Field(validators=input)

                self._forms[name] = BaseForm(fields)
예제 #5
0
파일: user.py 프로젝트: kwilcox/glider-dac
def admin():
    if not current_user.is_admin():
        # No permission
        flash("Permission denied", 'danger')
        return redirect(url_for("index"))

    form = UserForm()

    if form.is_submitted() and BaseForm.validate(
            form, extra_validators={'password': [validators.Required()]}):
        user = db.User()
        form.populate_obj(user)
        user.save()
        User.update(username=user.username, password=form.password.data)

        flash("Account for '%s' created" % user.username, 'success')
        return redirect(url_for("admin"))

    users = db.User.find()

    deployment_counts_raw = db.User.get_deployment_count_by_user()
    deployment_counts = {m['_id']: m['count'] for m in deployment_counts_raw}

    return render_template('admin.html',
                           form=form,
                           users=users,
                           deployment_counts=deployment_counts)
예제 #6
0
    def get_form(self, **kwargs):
        def validate_test(form, field):
            if field.data != "foobar":
                raise ValidationError("error")

        return BaseForm({"test": StringField(validators=[validate_test])},
                        **kwargs)
예제 #7
0
파일: form.py 프로젝트: vprints/wtforms
    def get_form(self, **kwargs):
        def validate_test(form, field):
            if field.data != 'foobar':
                raise ValidationError('error')

        return BaseForm({'test': TextField(validators=[validate_test])},
                        **kwargs)
예제 #8
0
def admin():
    if not current_user.is_admin():
        # No permission
        flash("Permission denied", 'danger')
        return redirect(url_for("index"))

    form = UserForm()

    if form.is_submitted() and BaseForm.validate(form, extra_validators={'password':[validators.Required()]}):
        user = db.User()
        form.populate_obj(user)
        user.save()
        User.update(username=user.username, password=form.password.data)

        # make sure user dirs exist
        user.ensure_dir('upload')

        flash("Account for '%s' created" % user.username, 'success')
        return redirect(url_for("admin"))

    users = db.User.find()

    mission_counts_raw = db.User.get_mission_count_by_user()
    mission_counts = {m['_id']:m['count'] for m in mission_counts_raw}

    return render_template('admin.html', form=form, users=users, mission_counts=mission_counts)
예제 #9
0
    def test_create_no_triggers(self):
        q_single = QuestionSingle(23, 'Education')
        self.assertEqual(q_single.id, 23)
        self.assertEqual(q_single.group_name, 'Education')
        self.assertEqual(q_single.set_response, None)
        self.assertEqual(q_single.response_type, 'SINGLE')
        self.assertEqual(q_single.question,
                         'What is your highest level of education?')
        self.assertEqual(q_single.american_question,
                         'What is your highest level of education?')
        self.assertEqual(q_single.triggers, tuple())
        self.assertEqual(q_single.qid, 'Education_23')
        self.assertEqual(q_single.interface_element_ids, ['Education_23_0'])

        # Test rendering of form object
        form = BaseForm({
            q_single.interface_element_ids[0]:
            q_single.interface_elements[0]
        })
        eid = q_single.interface_element_ids[0]
        self.assertEqual(str(type(form[eid])),
                         "<class 'wtforms.fields.core.SelectField'>")
        self.assertEqual(form[eid].choices,
                         [(0, 'Unspecified'),
                          (1, 'Did not complete high school'),
                          (2, 'High School or GED equilivant'),
                          (3, 'Some college or technical school'),
                          (4, "Associate's degree"), (5, "Bachelor's degree"),
                          (6, 'Some graduate school or professional'),
                          (7, 'Graduate or Professional degree')])
예제 #10
0
    def get_form(self, **kwargs):
        def validate_formdata_test(form, field):
            if field.data != 'foobar':
                raise ValidationError('error')

        def validate_kwargs_test(form, field):
            if field.data != 'batz':
                raise ValidationError('error')

        return BaseForm(
            {
                'test_fd': StringField(validators=[validate_formdata_test]),
                'test_kwargs': StringField(validators=[validate_kwargs_test]),
                'other_prop': StringField()
            }, **kwargs)
예제 #11
0
    def test_create(self):
        q_text = QuestionText(98, 'Pregnancy')
        self.assertEqual(q_text.id, 98)
        self.assertEqual(q_text.group_name, 'Pregnancy')
        self.assertEqual(q_text.set_response, None)
        self.assertEqual(q_text.response_type, 'TEXT')
        self.assertEqual(q_text.question, 'Pregnancy due date:')
        self.assertEqual(q_text.american_question, 'Pregnancy due date:')
        self.assertEqual(q_text.triggers, tuple())
        self.assertEqual(q_text.qid, 'Pregnancy_98')
        self.assertEqual(q_text.interface_element_ids, ['Pregnancy_98_0'])

        # Test rendering of form object
        form = BaseForm(
            {q_text.interface_element_ids[0]: q_text.interface_elements[0]})
        eid = q_text.interface_element_ids[0]
        self.assertEqual(str(type(form[eid])),
                         "<class 'wtforms.fields.simple.TextAreaField'>")
예제 #12
0
    def test_create(self):
        q_string = QuestionString(127, 'PetName')
        self.assertEqual(q_string.id, 127)
        self.assertEqual(q_string.group_name, 'PetName')
        self.assertEqual(q_string.set_response, None)
        self.assertEqual(q_string.response_type, 'STRING')
        self.assertEqual(q_string.question, 'Name')
        self.assertEqual(q_string.american_question, 'Name')
        self.assertEqual(q_string.triggers, tuple())
        self.assertEqual(q_string.qid, 'PetName_127')
        self.assertEqual(q_string.interface_element_ids, ['PetName_127_0'])

        # Test rendering of form object
        form = BaseForm({
            q_string.interface_element_ids[0]:
            q_string.interface_elements[0]
        })
        eid = q_string.interface_element_ids[0]
        self.assertEqual(str(type(form[eid])),
                         "<class 'wtforms.fields.simple.TextField'>")
예제 #13
0
    def test_create_triggers(self):
        q_single = QuestionSingle(20, 'dog')
        self.assertEqual(q_single.id, 20)
        self.assertEqual(q_single.group_name, 'dog')
        self.assertEqual(q_single.set_response, None)
        self.assertEqual(q_single.response_type, 'SINGLE')
        self.assertEqual(q_single.question, 'Do you have a dog(s)?')
        self.assertEqual(q_single.american_question, 'Do you have a dog(s)?')
        self.assertEqual(q_single.triggers, {101: [1], 105: [1]})
        self.assertEqual(q_single.qid, 'dog_20')
        self.assertEqual(q_single.interface_element_ids, ['dog_20_0'])

        # Test form object
        form = BaseForm({
            q_single.interface_element_ids[0]:
            q_single.interface_elements[0]
        })
        eid = q_single.interface_element_ids[0]
        self.assertEqual(str(type(form[eid])),
                         "<class 'wtforms.fields.core.SelectField'>")
        self.assertEqual(form[eid].choices, [(0, 'Unspecified'), (1, 'Yes'),
                                             (2, 'No')])
예제 #14
0
    def __init__(self, req=None):
        if req is None:
            req = request
        self._request = req
        self.errors = {}

        fields = {}
        for name, validators in self.headers.items():
            fields[name] = Field(validators=validators)
        self._headers_form = BaseForm(fields)

        fields.clear()
        for name, validators in self.args.items():
            fields[name] = Field(validators=validators)
        self._args_form = BaseForm(fields)

        fields.clear()
        for name, validators in self.form.items():
            fields[name] = Field(validators=validators)
        self._form_form = BaseForm(fields)

        fields.clear()
        fields['_jsonschema'] = Field(validators=self.json)
        self._json_form = BaseForm(fields)
예제 #15
0
    def test_automatic_wrapping(self):
        def _check(formdata):
            self.assertTrue(isinstance(formdata, WebobInputWrapper))

        form = BaseForm({'a': SneakyField(_check)})
        form.process(self.filled_mdict)
예제 #16
0
def test_automatic_wrapping(filled_mdict):
    def _check(formdata):
        assert isinstance(formdata, WebobInputWrapper)

    form = BaseForm({"a": SneakyField(_check)})
    form.process(filled_mdict)
예제 #17
0
class Input(object):
    headers = {}
    args = {}
    form = {}
    json = []

    def __init__(self, req=None):
        if req is None:
            req = request
        self._request = req
        self.errors = {}

        fields = {}
        for name, validators in self.headers.items():
            fields[name] = Field(validators=validators)
        self._headers_form = BaseForm(fields)

        fields.clear()
        for name, validators in self.args.items():
            fields[name] = Field(validators=validators)
        self._args_form = BaseForm(fields)

        fields.clear()
        for name, validators in self.form.items():
            fields[name] = Field(validators=validators)
        self._form_form = BaseForm(fields)

        fields.clear()
        fields['_jsonschema'] = Field(validators=self.json)
        self._json_form = BaseForm(fields)

    def validate(self):
        success = True
        self._headers_form.process(self._request.headers)
        if not self._headers_form.validate():
            success = False
            self.errors['headers'] = self._headers_form.errors
        self._args_form.process(self._request.args)
        if not self._args_form.validate():
            success = False
            self.errors['query_string'] = self._args_form.errors
        self._form_form.process(self._request.form)
        if not self._form_form.validate():
            success = False
            self.errors['form'] = self._form_form.errors
        self._json_form.process(MultiDict(
            dict(_jsonschema=self._request.get_json(force=True, silent=True))),
                                coerse=False)
        if not self._json_form.validate():
            success = False
            self.errors['json'] = self._json_form.errors
        return success
예제 #18
0
def model_as_form(model, initObj=None, ignore=[], override={}):
    """
    Will take a model (non instantiated) object and produce a ``WTForm`` Form instance, this function only works one-way.

    ``model_as_form`` can take three parameters:

    - ``initObj`` - If you want to inittialise the form with data, pass it an instance of the model in question and it will do it's best to instantiate it
    - ``ignore`` - If you want to exclude a list of fields from the automated conversion you can specify them as a list of strings corresponding to the name of the field in your model
    - ``override`` - To specify a custom wtForm field type, pass these as a dictionary of ``{"field name":FieldType,}``

    *note*: The override function takes either classes or instantiated objects, so if you want to pass through custom validators
     as part of the override, simply specify them in the override as if you would in a standard Form definition.

     **Usage:** ::

        from Mojo.Forms.MojoFormHelper import model_as_form

        # Let's get some data from our imaginary blog app
        posts = yield gen.Task(BlogPost.find_async, {'published':True}, sort=[('date_published',1)])
        a_post = posts[0]

        # Define a custom override set, the first is a base class,
        # the second is an instance with my custom validators:

        overrides = {'post_body': TextAreaField,
                     'post_intro': TextAreaField('Your intro text', [validators.required(),
                                                                     validators.length(max=10)]}

        # Create the form - we will ignore tags and
        # comments (these are Lists, and not implemented),
        # and override with our custom fields (StringFields are by
        # default TextFields, but we want TextAreas):

        thisForm = model_as_form(BlogPost, initObj=a_post, ignore=['tags', 'comments'], override=overrides)

        # ...Now do something with the form

     The system will automatically transform required model fields to required Form fields, no other validation checks are
     passed through yet.

     For the 'friendly name' o your form field, Mojo will use the ``friendly`` Mojo Model Form parameter, if none is present,
     Mojo will use the name of the Modle Field.

    """
    if model:
        form_fields = {}

        if not initObj:
            ignore.append('_id')

        class_attrs = [attr for attr in model.__dict__ if '__' not in attr]

        for c in class_attrs:
            if c not in EXCLUSIONS:
                form_validators = []
                field_type = type(model.__dict__[c]).__name__
                field_name = str(c)

                if model.__dict__[c].friendly == '':
                    friendly_name = model.__name__
                else:
                    friendly_name = unicode(model.__dict__[c].friendly)

                if model.__dict__[c].allow_empty:
                    form_validators.append(validators.required())

                new_form_field = None
                if field_name not in ignore:
                    if field_name not in override.keys():
                        if field_type in fieldMap.keys():
                            new_form_field = fieldMap[field_type](
                                friendly_name, form_validators)
                        else:
                            raise NotImplementedError(
                                'This field (%s) has not been implemented, please add it manually using override.'
                                % field_type)
                    else:
                        #Now for some magic, this makes sure overrides can provide field instances and custom validators
                        if inspect.isclass(override[field_name]):
                            #instantiate a fresh object
                            new_form_field = override[field_name](
                                friendly_name, form_validators)
                        else:
                            #Pass everything through
                            new_form_field = override[field_name]

                    if new_form_field:
                        if field_name == '_id': field_name = 'id'
                        form_fields[field_name] = new_form_field

        new_form = BaseForm(form_fields)

        if initObj:
            temp_data = dict(initObj)
            if '_id' in temp_data.keys():
                #Need to get rid of _id as it clashes with WTForms
                temp_data['id'] = temp_data['_id']
                del temp_data['_id']

            for key, value in temp_data.iteritems():
                if key not in ignore:
                    new_form[key].data = value

        return new_form
    else:
        return None
예제 #19
0
class MarkDistributionForm:
    def __init__(self, course_id, questions, total_marks):
        course = Course.query.filter(Course.id == course_id).first()
        units = Unit.query.filter(Unit.course == course).all()

        question_translator = defaultdict(dict)
        form_fields = {}
        validators = defaultdict(list)
        flatten_data = defaultdict(list)

        flatten_data["units"].extend([0] * len(units))
        flatten_data["cognitive"].extend([0] * len(CognitiveEnum.__members__))
        flatten_data["difficulty"].extend([0] *
                                          len(DifficultyEnum.__members__))
        flatten_data["questions"].extend([0] * sum(questions))

        for unit in units:
            field = f"Unit:{unit.chapter_no:02d}"
            form_fields.update(
                {field: IntegerField(field, validators=[DataRequired()])})
            validators["units"].append(field)
        for c_level in CognitiveEnum.__members__:
            form_fields.update(
                {c_level: IntegerField(c_level, validators=[DataRequired()])})
            validators["cognitive"].append(c_level)
        for d_level in DifficultyEnum.__members__:
            form_fields.update(
                {d_level: IntegerField(d_level, validators=[DataRequired()])})
            validators["difficulty"].append(d_level)

        idx = 0
        for question_no, subquestions in enumerate(questions):
            for subquestion in range(subquestions):
                field = f"Que.{question_no + 1}.{ascii_uppercase[subquestion]}"
                form_fields.update(
                    {field: IntegerField(field, validators=[DataRequired()])})
                validators["questions"].append(field)
                question_translator[question_no +
                                    1][ascii_uppercase[subquestion]] = idx
                idx += 1

        for i, validator in validators.items():
            validators[i] = IsSumOf(*validator)

        form_fields.update({
            "total_marks":
            IntegerField("total_marks",
                         validators=[DataRequired(),
                                     *validators.values()])  # *validators
        })

        self.form = BaseForm(form_fields)
        self.flatten_data = flatten_data
        self.course = course
        self.total_marks = total_marks
        self.unit_field_regex = re.compile(r"Unit:(\d\d)")
        self.question_field_regex = re.compile(r"Que.(\d+).([A-Z])")
        self.question_translator = question_translator

    @property
    def data(self):
        for constraint in self.fields:
            for field in self.fields[constraint]:
                self.flatten_data[constraint][self.translate(
                    constraint, field.name)] = int(field.data)
        return self.flatten_data

    @property
    def fields(self):
        fields = defaultdict(list)
        for field in self.form._fields:
            if "Unit" in field:
                fields["units"].append(self.form._fields[field])
            elif "Que" in field:
                fields["questions"].append(self.form._fields[field])
            elif field in CognitiveEnum.__members__:
                fields["cognitive"].append(self.form._fields[field])
            elif field in DifficultyEnum.__members__:
                fields["difficulty"].append(self.form._fields[field])
        return fields

    def translate(self, constraint, field):
        if constraint == "cognitive":
            return CognitiveEnum.__members__[field].value - 1
        if constraint == "difficulty":
            return DifficultyEnum.__members__[field].value - 1
        if constraint == "units":
            return int(self.unit_field_regex.search(field).group(1)) - 1
        if constraint == "questions":
            matched = self.question_field_regex.search(field)
            return self.question_translator[int(
                matched.group(1))][matched.group(2)]

    def validate_on_submit(self):
        self.form.process(request.form)
        self.form._fields["total_marks"].process_data(self.total_marks)
        return request.method == "POST" and self.form.validate()
예제 #20
0
def release_template_form(path, containers, formdata):
    from lxml import etree

    tree = etree.parse(path)

    formfields = {}
    spec = {"env": [], "ports": [], "folders": [], "links": []}

    for field in tree.iterfind(".//environment/*"):
        spec["env"].append(field.tag)
        default = field.text or None
        formfields[field.tag] = fields.StringField(field.tag, validators=[validators.required()], default=default)

    for field in tree.iterfind(".//shared-folders/folder"):
        name = field.attrib["mountpoint"]
        default = field.attrib.get("local", None)
        spec["folders"].append(name)
        formfields[name] = fields.StringField(name, validators=[validators.required()], default=default)

    for field in tree.iterfind(".//ports/expose"):
        type = field.attrib["type"]
        container = field.attrib["container"]
        label = "{}/{}".format(type, container)
        name = "port_{}_{}".format(type, container)
        spec["ports"].append((name, type, container))
        formfields[name + "_host_ip"] = fields.StringField(
            label, validators=[validators.Optional(), validators.IPAddress()]
        )
        formfields[name + "_host_port"] = fields.IntegerField(
            label, validators=[validators.Optional(), validators.NumberRange(0, 65535)]
        )

    containers_by_repo = {}

    for c in containers:
        try:
            repo, tag = c["Image"].split(":")
        except ValueError:
            continue
        for name in c["Names"]:
            if "/" not in name[1:]:
                label = "{} ({})".format(name[1:], tag)
                containers_by_repo.setdefault(repo, []).append((name, label))

    for field in tree.iterfind(".//links/*"):
        spec["links"].append(field.tag)
        default = field.attrib.get("container", None)

        if "repository" in field.attrib:
            choices = containers_by_repo.get(field.attrib["repository"], [])

            formfields[field.tag] = fields.SelectField(
                field.tag, validators=[validators.required()], default=default, choices=choices
            )
        else:
            formfields[field.tag] = fields.StringField(field.tag, validators=[validators.required()], default=default)

    form = BaseForm(formfields)
    form.process(formdata)

    return form, spec
예제 #21
0
 def new_form(self, paper=None):
     form = BaseForm(fields=self.Fields)
     form.process()
     if paper:
         self.inject_data(form, paper)
     return form
예제 #22
0
    def test_automatic_wrapping(self):
        def _check(formdata):
            self.assert_(isinstance(formdata, WebobInputWrapper))

        form = BaseForm({'a': SneakyField(_check)})
        form.process(self.filled_mdict)
예제 #23
0
class FormCreator:
    def __init__(self, method, action, csrf=False):
        self.form = BaseForm({})
        self.elements = dict()
        self.method = method
        self.action = action

        if not csrf:
            self.form._csrf = None

    def set_field(self, element):
        self.form[element.identifier] = {
            "StringField":
            StringField(element.identifier, element.validators),
            "IntegerField":
            IntegerField(element.identifier, element.validators),
            "SelectField":
            SelectField(element.identifier,
                        element.validators,
                        choices=element.choices),
            "BooleanField":
            BooleanField(element.identifier, element.validators),
            "RadioField":
            RadioField(element.identifier, element.validators)
        }[element.element_type]

    def build_form(self):
        for identifier, element in self.elements.items():
            self.set_field(element)

    def process_form(self, request):
        self.form.process(request.form)

        return self.form

    def add_text_field(self, name, required=False):
        try:
            self.elements[name] = FormElement(
                "StringField", name, [DataRequired()] if required else [])
        except KeyError as exception:
            print(exception)

    def add_number_field(self, name, required=False):
        try:
            self.elements[name] = FormElement(
                "IntegerField", name, [DataRequired()] if required else [])
        except KeyError as exception:
            print(exception)

    def add_select_field(self, name, required=False, options=None):
        if options is None:
            options = [("select", "Select")]

        try:
            self.elements[name] = FormElement(
                "SelectField",
                name, [DataRequired()] if required else [],
                choices=options)
        except KeyError as exception:
            print(exception)

    def add_checkbox_field(self, name, required=False):
        try:
            self.elements[name] = FormElement(
                "BooleanField", name, [DataRequired()] if required else [])
        except KeyError as exception:
            print(exception)

    def add_radio_field(self, name, required=False):
        try:
            self.elements[name] = FormElement(
                "RadioField", name, [DataRequired()] if required else [])
        except KeyError as exception:
            print(exception)

    def load_elements_from_form(self, base_form):
        for field in base_form:
            self.form[field.name] = field
예제 #24
0
파일: app.py 프로젝트: RoboTums/robo-task
 def create_form(prefix='', **kwargs):
     form = BaseForm(fields, prefix=prefix)
     form.process(**kwargs)
     return form