def test_integer_field(): assert Form(data=Data(foo=' 7 '), fields=[Field.integer(name='foo')]).fields[0].parsed_data == 7 actual_errors = Form(data=Data(foo=' foo '), fields=[Field.integer(name='foo')]).fields[0].errors assert_one_error_and_matches_reg_exp( actual_errors, "invalid literal for int\(\) with base 10: u?'foo'")
def test_float_field(): assert Form(data=Data(foo=' 7.3 '), fields=[Field.float(name='foo')]).fields[0].parsed_data == 7.3 assert Form(data=Data(foo=' foo '), fields=[Field.float(name='foo')]).fields[0].errors == { "could not convert string to float: foo" }
def test_comma_separated_errors_on_parse(): def raise_always_value_error(string_value, **_): raise ValueError('foo %s!' % string_value) def raise_always_validation_error(string_value, **_): raise ValidationError( ['foo %s!' % string_value, 'bar %s!' % string_value]) assert Form(data=Data(foo='5, 7'), fields=[ Field.comma_separated( Field(name='foo', parse=raise_always_value_error)) ]).fields[0].errors == { u'Invalid value "5": foo 5!', u'Invalid value "7": foo 7!' } assert Form(data=Data(foo='5, 7'), fields=[ Field.comma_separated( Field(name='foo', parse=raise_always_validation_error)) ]).fields[0].errors == { u'Invalid value "5": foo 5!', u'Invalid value "5": bar 5!', u'Invalid value "7": foo 7!', u'Invalid value "7": bar 7!' }
def test_email_field(): assert Form(data=Data(foo=' 5 '), fields=[Field.email(name='foo')]).fields[0].errors == { u'Enter a valid email address.' } assert Form(data=Data(foo='*****@*****.**'), fields=[Field.email(name='foo')]).is_valid()
def test_show(): assert list( Form(data=Data(), fields=[Field(name='foo', show=False)]).fields_by_name.keys()) == [] assert list( Form(data=Data(), fields=[Field(name='foo', show=lambda form, field: False) ]).fields_by_name.keys()) == []
def test_phone_field(): assert Form( data=Data(foo=' asdasd '), fields=[Field.phone_number(name='foo')] ).fields[0].errors == { u'Please use format +<country code> (XX) XX XX. Example of US number: +1 (212) 123 4567 or +1 212 123 4567' } assert Form(data=Data(foo='+1 (212) 123 4567'), fields=[Field.phone_number(name='foo')]).is_valid() assert Form(data=Data(foo='+46 70 123 123'), fields=[Field.phone_number(name='foo')]).is_valid()
def test_render_datetime_iso(): table = Form(fields=[ Field.datetime(name='foo', initial=datetime(2001, 2, 3, 12, 13, 14, 7777)) ]).table() assert '2001-02-03 12:13:14' in table assert '7777' not in table
def test_render_custom(): sentinel = '!!custom!!' assert sentinel in Form(fields=[ Field(name='foo', initial='not sentinel value', render_value=lambda form, field, value: sentinel), ]).table()
def test_render_template_string(): assert Form(data=Data(foo='7'), fields=[ Field(name='foo', template=None, template_string='{{ field.value }} {{ form.style }}') ]).compact() == '7 compact\n' + AVOID_EMPTY_FORM
def test_boolean_initial_true(): fields = [ Field.boolean(name='foo', initial=True), Field(name='bar', required=False) ] form = Form(data=Data(), fields=fields) assert form.fields_by_name['foo'].value is True # If there are arguments, but not for key foo it means checkbox for foo has been unchecked. # Field foo should therefore be false. form = Form(data=Data(bar='baz', **{'-': '-'}), fields=fields) assert form.fields_by_name['foo'].value is False form = Form(data=Data(foo='on', bar='baz', **{'-': '-'}), fields=fields) assert form.fields_by_name['foo'].value is True
def test_comma_separated_errors_on_validation(): assert Form(data=Data(foo='5, 7'), fields=[ Field.comma_separated( Field(name='foo', is_valid=lambda parsed_data, **_: (False, 'foo %s!' % parsed_data))) ]).fields[0].errors == { u'Invalid value "5": foo 5!', u'Invalid value "7": foo 7!' }
def test_radio(): choices = [ 'a', 'b', 'c', ] soup = BeautifulSoup( Form(data=Data(foo='a'), fields=[Field.radio(name='foo', choices=choices)]).table()) assert len( soup.find_all('input')) == len(choices) + 1 # +1 for AVOID_EMPTY_FORM assert [ x.attrs['value'] for x in soup.find_all('input') if 'checked' in x.attrs ] == ['a']
def test_render_table(): form = Form(data=Data(foo='!!!7!!!'), fields=[ Field( name='foo', input_container_css_classes={'###5###'}, label_container_css_classes={'$$$11$$$'}, help_text='^^^13^^^', label='***17***', ) ]) table = form.table() assert '!!!7!!!' in table assert '###5###' in table assert '$$$11$$$' in table assert '^^^13^^^' in table assert '***17***' in table assert '<tr' in table # Assert that table is the default assert table == "%s" % form
def test_multi_choice(): soup = BeautifulSoup( Form(data=Data(foo=['0']), fields=[Field.multi_choice(name='foo', choices=['a'])]).table()) assert [x.attrs['multiple'] for x in soup.find_all('select')] == ['']
def test_password(): assert ' type="password" ' in Form(data=Data(foo='1'), fields=[Field.password(name='foo') ]).table()
def test_hidden(): soup = BeautifulSoup( Form(data=Data(foo='1'), fields=[Field.hidden(name='foo')]).table()) assert [(x.attrs['type'], x.attrs['value']) for x in soup.find_all('input')] == [('hidden', '1'), ('hidden', '-')]
def test_info(): form = Form(data={}, fields=[Field.info(value='#foo#')]) assert form.is_valid() assert '#foo#' in form.table()
def test_heading(): assert '<th colspan="2">#foo#</th>' in Form( data={}, fields=[Field.heading(label='#foo#')]).table()
def test_text_fields(): assert '<input type="text" ' in Form(data=Data(), fields=[Field.text(name='foo') ]).compact() assert '<textarea' in Form(data=Data(), fields=[Field.textarea(name='foo')]).compact()
def test_multi_select_with_one_value_only(): assert ['a'] == Form( data=Data(foo=['a']), fields=[Field.multi_choice(name='foo', choices=['a', 'b'])]).fields[0].value_list
def test_initial_list_from_instance(): assert Form(instance=Struct(a=Struct(b=[7])), fields=[Field(name='a__b', is_list=True)]).fields[0].initial_list == [7]
def test_datetime_not_required(): assert Form(fields=[Field.datetime(required=False, name='foo')], data={ 'foo': '' }).is_valid()
def test_non_editable(): assert Form(data=Data(), fields=[ Field(name='foo', editable=False) ]).fields[0].input_template == 'tri_form/non_editable.html'
def test_help_text_from_model(): assert Form(data=Data(foo='1'), fields=[Field.from_model(model=Foo, field_name='foo')], model=Foo).fields[0].help_text == 'foo_help_text'
def test_render_template(): assert '<form' in Form(request=RequestFactory().get('/'), data=Data(foo='7'), fields=[Field(name='foo')]).render()
def test_multi_email(): assert Form(data=Data(foo='[email protected], [email protected]'), fields=[Field.comma_separated(Field.email(name='foo')) ]).is_valid()
def test_render_attrs(): assert Form(data=Data(foo='7'), fields=[Field(name='foo', attrs={'foo': '1'}) ]).fields[0].render_attrs() == ' foo="1"' assert Form(data=Data(foo='7'), fields=[Field(name='foo')]).fields[0].render_attrs() == ' '
def test_render_attrs_new_style(): assert Form(data=Data(foo='7'), fields=[Field(name='foo', attrs__foo='1') ]).fields[0].render_attrs() == ' foo="1"' assert Form(data=Data(foo='7'), fields=[Field(name='foo')]).fields[0].render_attrs() == ' '
def prepare(self, request): if self._has_prepared: return self.request = request def bind_columns(): for index, column in enumerate(self.columns): values = evaluate_recursive(Struct(column), table=self, column=column) values = merged(values, column=column, table=self, index=index) yield BoundColumn(**values) self.bound_columns = list(bind_columns()) self.bound_column_by_name = OrderedDict( (bound_column.name, bound_column) for bound_column in self.bound_columns) self._has_prepared = True self._prepare_evaluate_members() self._prepare_sorting() headers = self._prepare_headers() if self.Meta.model: def generate_variables(): for column in self.bound_columns: if column.query.show: query_kwargs = setdefaults_path( Struct(), column.query, dict( name=column.name, gui__label=column.display_name, attr=column.attr, model=column.table.Meta.model, ), { 'class': Variable, }) yield query_kwargs.pop('class')(**query_kwargs) variables = list(generate_variables()) self.query = Query(request=request, variables=variables, **self.query_kwargs) self.query_form = self.query.form( ) if self.query.variables else None self.query_error = '' if self.query_form: try: self.data = self.data.filter(self.query.to_q()) except QueryException as e: self.query_error = str(e) def generate_bulk_fields(): for column in self.bound_columns: if column.bulk.show: bulk_kwargs = setdefaults_path( Struct(), column.bulk, dict( name=column.name, attr=column.attr, required=False, empty_choice_tuple=(None, '', '---', True), model=self.Meta.model, ), { 'class': Field.from_model, }) if bulk_kwargs['class'] == Field.from_model: bulk_kwargs['field_name'] = column.attr yield bulk_kwargs.pop('class')(**bulk_kwargs) bulk_fields = list(generate_bulk_fields()) self.bulk_form = Form(data=request.POST, fields=bulk_fields, endpoint_dispatch_prefix='bulk', **self.bulk_kwargs) if bulk_fields else None self._prepare_auto_rowspan() return headers, self.header_levels
def test_initial_from_instance(): assert Form(instance=Struct(a=Struct(b=7)), fields=[Field(name='a__b')]).fields[0].initial == 7