Ejemplo n.º 1
0
    def _evaluate(self):
        """
        Evaluates callable/lambda members. After this function is called all members will be values.
        """
        evaluated_attributes = [
            'name',
            'include',
            'attr',
            'display_name',
            'after',
            'parse_empty_string_as_none',
            'template',
            'template_string',
            'required',
            'initial',
            'is_list',
            'is_boolean',
            'model_field',
            'editable',
            'strip_input',
            'choices',
            'choice_tuples',
            'empty_label',
            'empty_choice_tuple',
            'help_text',
            # This is useful for example when doing file upload. In that case the data is on request.FILES, not request.POST so we can use this to grab it from there
            'raw_data',
            'raw_data_list',
        ]
        for key in evaluated_attributes:
            self._evaluate_attribute(key)

        # non-strict because the model is callable at the end. Not ideal, but what can you do?
        self._evaluate_attribute('model', strict=False)

        self.attrs = evaluate_attrs(self, **self.evaluate_attribute_kwargs())

        self.extra_evaluated = evaluate_strict_container(
            self.extra_evaluated, **self.evaluate_attribute_kwargs())

        self.input = self.input.bind(parent=self)
        self.label = self.label.bind(parent=self)
        # TODO: special class for label that does this?
        assert not self.label._children
        self.label._children = [self.display_name]

        if not self.editable:
            # TODO: style!
            self.input.template = 'iommi/form/non_editable.html'
Ejemplo n.º 2
0
def test_evaluate_attrs_show_debug_paths():
    actual = evaluate_attrs(
        Struct(
            attrs=Namespace(class__table=True, ),
            name='foo',
            dunder_path=lambda: '<path here>',
        ), )

    expected = {
        'class': {
            'table': True,
        },
        'data-iommi-path': '<path here>',
    }

    assert actual == expected
Ejemplo n.º 3
0
    def on_bind(self) -> None:
        if self.parent is not None and self.parent.parent is not None:
            for k, v in getattr(self.parent.parent, '_actions_unapplied_data', {}).get(self.name, {}).items():
                setattr_path(self, k, v)
        evaluated_attributes = [
            'tag',
            'group',
            'template',
            'display_name',
            'name',
            'after',
            'default_child',
            'style',
        ]
        for key in evaluated_attributes:
            self._evaluate_attribute(key)

        self.extra_evaluated = evaluate_strict_container(self.extra_evaluated, **self.evaluate_attribute_kwargs())
        self.attrs = evaluate_attrs(self, **self.evaluate_attribute_kwargs())
Ejemplo n.º 4
0
def test_evaluate_attrs():
    actual = evaluate_attrs(Struct(attrs=Namespace(
        class__table=True,
        class__foo=lambda foo: True,
        data=1,
        data2=lambda foo: foo,
    ), ),
                            foo=3)

    expected = {
        'class': {
            'table': True,
            'foo': True,
        },
        'data': 1,
        'data2': 3,
    }

    assert actual == expected
Ejemplo n.º 5
0
 def on_bind(self) -> None:
     self.attrs = evaluate_attrs(self, **self.evaluate_attribute_kwargs())
Ejemplo n.º 6
0
    def on_bind(self) -> None:
        assert self.actions_template
        self._valid = None
        request = self.request()
        self._request_data = request_data(request) if request else None

        if self._request_data is not None and self.is_target():
            self.mode = FULL_FORM_FROM_REQUEST

        # TODO: seems a bit convoluted to do this and the None check above
        if self._request_data is None:
            self._request_data = {}

        bind_members(self, name='actions')
        bind_members(self, name='fields', default_child=True)

        if self.instance is not None:
            for field in self.fields.values():
                if field.attr:
                    initial = field.read_from_instance(field, self.instance)

                    # TODO: we always overwrite here, even if we got passed something.. seems strange
                    field.initial = initial

        if self._request_data is not None:
            for field in self.fields.values():
                if field.is_list:
                    if field.raw_data_list is not None:
                        continue
                    try:
                        # django and similar
                        # noinspection PyUnresolvedReferences
                        raw_data_list = self._request_data.getlist(
                            field.path())
                    except AttributeError:  # pragma: no cover
                        # werkzeug and similar
                        raw_data_list = self._request_data.get(field.path())

                    if raw_data_list and field.strip_input:
                        raw_data_list = [x.strip() for x in raw_data_list]

                    if raw_data_list is not None:
                        field.raw_data_list = raw_data_list
                else:
                    if field.raw_data is not None:
                        continue
                    field.raw_data = self._request_data.get(field.path())
                    if field.raw_data and field.strip_input:
                        field.raw_data = field.raw_data.strip()

        for field in self.fields.values():
            field._evaluate()

        self.attrs = evaluate_attrs(self, **self.evaluate_attribute_kwargs())

        self.is_valid()

        self.errors = Errors(parent=self, errors=self.errors)

        self.extra_evaluated = evaluate_strict_container(
            self.extra_evaluated, **self.evaluate_attribute_kwargs())