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'
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
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())
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
def on_bind(self) -> None: self.attrs = evaluate_attrs(self, **self.evaluate_attribute_kwargs())
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())