Пример #1
0
    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
Пример #2
0
    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'],
        })
Пример #3
0
 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'],
     })
Пример #4
0
 def test_no_lodging(self):
     (schema, ui_schema) = get_lodging_schema(self.event)
     self.assertEqual(schema, None)
     self.assertEqual(ui_schema, None)
Пример #5
0
    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],
                },
            })
Пример #6
0
    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',
                ],
            })