diff --git a/daybed/schemas/base.py b/daybed/schemas/base.py index 54ecad2..9177676 100644 --- a/daybed/schemas/base.py +++ b/daybed/schemas/base.py @@ -17,7 +17,8 @@ Regex, Email, Date, - DateTime + DateTime, + drop ) from . import registry, TypeField @@ -27,7 +28,7 @@ __all__ = ['IntField', 'StringField', 'RangeField', 'RegexField', 'EmailField', 'URLField', 'EnumField', 'ChoicesField', 'DecimalField', - 'DateField', 'DateTimeField'] + 'DateField', 'DateTimeField', 'GroupField'] @registry.add('int') @@ -209,3 +210,14 @@ class DateTimeField(AutoNowMixin, TypeField): @deferred def auto_value(node, kw): return datetime.datetime.now() + + +@registry.add('group') +class GroupField(TypeField): + @classmethod + def definition(cls): + schema = super(GroupField, cls).definition() + schema.add(SchemaNode(String(), name='description', missing=drop)) + schema.add(SchemaNode(Sequence(), TypeField.definition(), name='fields', + validator=Length(min=1))) + return schema diff --git a/daybed/tests/test_schemas_base.py b/daybed/tests/test_schemas_base.py index 9280be1..38d399f 100644 --- a/daybed/tests/test_schemas_base.py +++ b/daybed/tests/test_schemas_base.py @@ -145,6 +145,38 @@ def test_url(self): 'http://lolnet/org') +class GroupFieldTests(unittest.TestCase): + def setUp(self): + self.schema = schemas.GroupField.definition() + self.definition = {'type': u'group', + 'name': u'adress', + 'label': u'Address', + 'required': True, + 'hint': u'Fill all fields', + 'description': u'A small text...', + 'fields': [{'type': u'int', + 'name': u'a', + 'hint': u'', + 'label': u'', + 'required': True}]} + + def test_a_group_can_have_label_and_description(self): + field = self.schema.deserialize(self.definition) + self.assertDictEqual(self.definition, field) + + def test_a_group_must_have_at_least_one_field(self): + definition = self.definition.copy() + definition['fields'] = [] + self.assertRaises(colander.Invalid, self.schema.deserialize, + definition) + + def test_a_group_must_have_valid_fields(self): + definition = self.definition.copy() + definition['fields'].append({'type': u'int'}) + self.assertRaises(colander.Invalid, self.schema.deserialize, + definition) + + class DateFieldTests(unittest.TestCase): def test_date(self): schema = schemas.DateField.definition()