def get_form_schema(cls, event): (lodging_schema, lodging_ui_schema) = get_lodging_schema(event) schema = { **event.registration_schema, 'definitions': { **event.registration_schema.get('definitions', {}), 'camper': { **event.camper_schema, 'properties': { **event.camper_schema.get('properties', {}), 'lodging': lodging_schema, }, } if lodging_schema else event.camper_schema, }, 'required': [ *event.registration_schema.get('required', []), 'registrant_email', ], 'properties': { 'registrant_email': { 'type': 'string', 'format': 'email', 'title': 'Registrant email', }, **event.registration_schema.get('properties', {}), 'campers': { 'type': 'array', 'minItems': 1, 'items': { '$ref': '#/definitions/camper', }, }, }, } ui_schema = { **event.registration_ui_schema, 'campers': { **event.registration_ui_schema.get('campers', {}), 'items': { **event.registration_ui_schema.get('campers', {}).get( 'items', {}), 'lodging': { **(event.registration_ui_schema.get('campers', {}).get( 'items', {}).get('lodging', {})), **(lodging_ui_schema or {}), } }, }, } return schema, ui_schema
def test_lodging_with_node_with_children(self): root = self.event.lodging_set.create( name='Test Lodging', children_title='Please select a Camp', visible=True, notes='') camp1 = self.event.lodging_set.create(name='Camp 1', parent=root, capacity=30, visible=True, notes='') camp2 = self.event.lodging_set.create(name='Camp 2', parent=root, capacity=30, visible=True, notes='') camp3 = self.event.lodging_set.create(name='Camp 3', parent=root, capacity=30, visible=True, notes='') (schema, ui_schema) = get_lodging_schema(self.event) self.assertEqual( schema, { 'title': 'Test Lodging', 'type': 'object', 'properties': { 'lodging_1': { 'title': 'Please select a Camp', 'enum': [camp1.id, camp2.id, camp3.id], 'enumNames': [camp1.name, camp2.name, camp3.name], }, 'lodging_shared': LODGING_SHARED_PROPERTY, }, 'required': ['lodging_1'], 'dependencies': { 'lodging_shared': LODGING_SHARED_DEPENDENCY, }, }) self.assertEqual(ui_schema, { 'ui:order': ['lodging_1', 'lodging_shared', 'lodging_shared_with'], })
def test_lodging_with_single_node(self): self.event.lodging_set.create(name='Test Lodging', children_title='', capacity=30, visible=True, notes='') (schema, ui_schema) = get_lodging_schema(self.event) self.assertEqual( schema, { 'title': 'Test Lodging', 'type': 'object', 'properties': { 'lodging_shared': LODGING_SHARED_PROPERTY, }, 'dependencies': { 'lodging_shared': LODGING_SHARED_DEPENDENCY, }, }) self.assertEqual(ui_schema, { 'ui:order': ['lodging_shared', 'lodging_shared_with'], })
def test_no_lodging(self): (schema, ui_schema) = get_lodging_schema(self.event) self.assertEqual(schema, None) self.assertEqual(ui_schema, None)
def test_full_lodging_options(self): root = self.event.lodging_set.create(name='root') camp1 = self.event.lodging_set.create(name='camp1', visible=True, parent=root) camp2 = self.event.lodging_set.create(name='camp2', visible=True, parent=root) tents_camp1 = self.event.lodging_set.create(name='tents_camp1', visible=True, parent=camp1, capacity=2) cabins_camp1 = self.event.lodging_set.create(name='cabins_camp1', visible=True, parent=camp1, capacity=2) tents_camp2 = self.event.lodging_set.create(name='tents_camp2', visible=True, parent=camp2, capacity=2) cabins_camp2 = self.event.lodging_set.create(name='cabins_camp2', visible=True, parent=camp2, capacity=2) # fill all the cabins registration = self.event.registration_set.create( event=self.event, attributes={}, registrant_email='*****@*****.**', ) registration.campers.create(lodging=cabins_camp1) registration.campers.create(lodging=cabins_camp1) registration.campers.create(lodging=cabins_camp2) registration.campers.create(lodging=cabins_camp2) (schema, ui_schema) = get_lodging_schema(self.event) # test just the part that's different when options are full self.assertEqual(schema['dependencies']['lodging_1']['oneOf'], [ { 'properties': { 'lodging_1': { 'enum': [camp1.id] }, 'lodging_2': { 'title': '', 'enum': [tents_camp1.id, cabins_camp1.id], 'enumNames': ['tents_camp1', 'cabins_camp1 (full)'] } }, 'required': ['lodging_2'], 'dependencies': {} }, { 'properties': { 'lodging_1': { 'enum': [camp2.id] }, 'lodging_2': { 'title': '', 'enum': [tents_camp2.id, cabins_camp2.id], 'enumNames': ['tents_camp2', 'cabins_camp2 (full)'] } }, 'required': ['lodging_2'], 'dependencies': {} }, ]) self.assertEqual( ui_schema, { 'ui:order': [ 'lodging_1', 'lodging_2', 'lodging_shared', 'lodging_shared_with', ], 'lodging_2': { 'ui:enumDisabled': [cabins_camp1.id, cabins_camp2.id], }, })
def test_lodging_with_node_with_children_and_grandchildren(self): root = self.event.lodging_set.create( name='Test Lodging', children_title='Please select a Camp', visible=True, notes='') camp1 = self.event.lodging_set.create( name='Camp 1', children_title='Please select a Lodging Type', parent=root, visible=True, notes='') camp2 = self.event.lodging_set.create(name='Camp 2', parent=root, visible=True, notes='') # camp1 grandchildren (visible) tents_camp1 = self.event.lodging_set.create(name='Tents in Camp 1', parent=camp1, capacity=30, visible=True, notes='') cabins_camp1 = self.event.lodging_set.create(name='Cabins in Camp 1', parent=camp1, capacity=30, visible=True, notes='') rvs_camp1 = self.event.lodging_set.create(name='RVs in Camp 1', parent=camp1, capacity=30, visible=True, notes='') # camp2 grandchildren (invisible) self.event.lodging_set.create(name='Tents in Camp 2', parent=camp2, capacity=30, visible=False, notes='') self.event.lodging_set.create(name='Cabins in Camp 2', parent=camp2, capacity=30, visible=False, notes='') self.event.lodging_set.create(name='RVs in Camp 2', parent=camp2, capacity=30, visible=False, notes='') # make sure the lodging schema is built with one DB query old_debug = settings.DEBUG settings.DEBUG = True reset_queries() (schema, ui_schema) = get_lodging_schema(self.event) self.assertEqual(len(connection.queries), 1) settings.DEBUG = old_debug self.assertEqual( schema, { 'title': 'Test Lodging', 'type': 'object', 'properties': { 'lodging_1': { 'title': 'Please select a Camp', 'enum': [camp1.id, camp2.id], 'enumNames': [ 'Camp 1', 'Camp 2', ], }, 'lodging_shared': LODGING_SHARED_PROPERTY, }, 'required': ['lodging_1'], 'dependencies': { 'lodging_1': { 'oneOf': [ { 'properties': { 'lodging_1': { 'enum': [camp1.id], }, 'lodging_2': { 'title': 'Please select a Lodging Type', 'enum': [ tents_camp1.id, cabins_camp1.id, rvs_camp1.id, ], 'enumNames': [ 'Tents in Camp 1', 'Cabins in Camp 1', 'RVs in Camp 1', ], }, }, 'required': ['lodging_2'], 'dependencies': {}, }, ], }, 'lodging_shared': LODGING_SHARED_DEPENDENCY, } }) self.assertEqual( ui_schema, { 'ui:order': [ 'lodging_1', 'lodging_2', 'lodging_shared', 'lodging_shared_with', ], })