def create_gelijk_model(self, stuf_entiteit=None):
        # TODO [TECH]: The gelijk model is required, and should always be set.
        stuf_entiteit = stuf_entiteit or self.stuf_entiteit
        type_info = TypeInfo()
        for related_field in stuf_entiteit.get_related_fields():
            try:
                # This is not consistent with the prototype-XSD. See Taiga issue #88
                type_info[related_field.field_name] = self.create_gelijk_model(related_field.stuf_entiteit)
            except EmptyResultError:
                pass

        # Create spyne model for 'gerelateerde'
        # TODO [TECH]: In the WSDL this should be minOccurs and maxOccurs of 1.
        gerelateerde = stuf_entiteit.get_gerelateerde()
        if gerelateerde:
            _, gerelateerde_data = gerelateerde
            if isinstance(gerelateerde_data, tuple) or isinstance(gerelateerde_data, list):
                for relation_name, related_cls in gerelateerde_data:
                    try:
                        sub_type_info = []
                        for relation_name, related_cls in gerelateerde_data:
                            sub_type_info.append((relation_name, self.create_gelijk_model(related_cls).customize(xml_choice_group='gerelateerde')))
                        sub_model = self.create_reusable_model(self.create_gelijk_name(stuf_entiteit, 'gerelateerde'), stuf_entiteit.get_namespace(), sub_type_info)
                        type_info['gerelateerde'] = sub_model
                    except EmptyResultError:
                        pass
            else:
                related_cls = gerelateerde_data
                try:
                    type_info.append(('gerelateerde', self.create_gelijk_model(related_cls)))
                except EmptyResultError:
                    pass

        field_mapping = stuf_entiteit.get_django_field_mapping(filter_fields=True)
        if not field_mapping and not type_info:
            raise EmptyResultError()

        # Build the Spyne model
        for field_name, django_field_name, django_field in field_mapping:
            type_info[field_name] = django_field_to_spyne_model(django_field)
        complex_model = self.create_reusable_model(
            self.create_gelijk_name(stuf_entiteit), stuf_entiteit.get_namespace(), type_info)

        if stuf_entiteit.is_entiteit():
            complex_model._type_info['entiteittype'] = XmlAttribute(simple_types.Entiteittype, ref='entiteittype', ns=STUF_XML_NS)
        complex_model._type_info.update(type_info)
        complex_model.stuf_entiteit = stuf_entiteit

        complex_model._type_info = reorder_type_info(stuf_entiteit.get_fields(), complex_model._type_info, allow_partial=True)

        return complex_model
    def create_gelijk_model(self, stuf_entiteit=None):
        # TODO [TECH]: The gelijk model is required, and should always be set.
        stuf_entiteit = stuf_entiteit or self.stuf_entiteit
        type_info = TypeInfo()
        for related_field in stuf_entiteit.get_related_fields():
            try:
                # This is not consistent with the prototype-XSD. See Taiga issue #88
                type_info[related_field.field_name] = self.create_gelijk_model(related_field.stuf_entiteit)
            except EmptyResultError:
                pass

        # Create spyne model for 'gerelateerde'
        # TODO [TECH]: In the WSDL this should be minOccurs and maxOccurs of 1.
        gerelateerde = stuf_entiteit.get_gerelateerde()
        if gerelateerde:
            _, gerelateerde_data = gerelateerde
            if isinstance(gerelateerde_data, tuple) or isinstance(gerelateerde_data, list):
                for relation_name, related_cls in gerelateerde_data:
                    try:
                        sub_type_info = []
                        for relation_name, related_cls in gerelateerde_data:
                            sub_type_info.append((relation_name, self.create_gelijk_model(related_cls).customize(xml_choice_group='gerelateerde')))
                        sub_model = self.create_reusable_model(self.create_gelijk_name(stuf_entiteit, 'gerelateerde'), stuf_entiteit.get_namespace(), sub_type_info)
                        type_info['gerelateerde'] = sub_model
                    except EmptyResultError:
                        pass
            else:
                related_cls = gerelateerde_data
                try:
                    type_info.append(('gerelateerde', self.create_gelijk_model(related_cls)))
                except EmptyResultError:
                    pass

        field_mapping = stuf_entiteit.get_django_field_mapping(filter_fields=True)
        if not field_mapping and not type_info:
            raise EmptyResultError()

        # Build the Spyne model
        for field_name, django_field_name, django_field in field_mapping:
            type_info[field_name] = django_field_to_spyne_model(django_field)
        complex_model = self.create_reusable_model(
            self.create_gelijk_name(stuf_entiteit), stuf_entiteit.get_namespace(), type_info)

        if stuf_entiteit.is_entiteit():
            complex_model._type_info['entiteittype'] = XmlAttribute(simple_types.Entiteittype, ref='entiteittype', ns=STUF_XML_NS)
        complex_model._type_info.update(type_info)
        complex_model.stuf_entiteit = stuf_entiteit

        complex_model._type_info = reorder_type_info(stuf_entiteit.get_fields(), complex_model._type_info, allow_partial=True)

        return complex_model
    def create_object_model(self, stuf_entiteit=None, topfundamenteel=False):
        """
        From a StUFEntiteit create a hierarchy of ComplexModels for everything under the object element.
        """
        stuf_entiteit = stuf_entiteit or self.stuf_entiteit

        type_info = TypeInfo()
        if stuf_entiteit.is_entiteit():
            type_info['entiteittype'] = entiteittype.customize(fixed=stuf_entiteit.get_mnemonic())
            type_info['verwerkingssoort'] = verwerkingssoort

        for related_field in stuf_entiteit.get_related_fields():
            # In the case of an update the element can be optional (since it isn't modified)
            model_kwargs = {
                'min_occurs': 0,
                'max_occurs': related_field.max_occurs or 'unbounded'
            }
            # On create, the min_occurs _is_ required.
            if not self.update:  # Create
                model_kwargs['min_occurs'] = related_field.min_occurs

            type_info[related_field.field_name] = self.create_object_model(
                related_field.stuf_entiteit).customize(**model_kwargs)

        # TODO [TECH]: In the WSDL this should be minOccurs and maxOccurs of 1.
        gerelateerde = stuf_entiteit.get_gerelateerde()
        if gerelateerde:
            _, gerelateerde_data = gerelateerde
            type_info['gerelateerde'] = self.create_related_model(stuf_entiteit, 'gerelateerde', gerelateerde_data)

        # Build up spyne model
        field_mapping = stuf_entiteit.get_django_field_mapping()
        file_fields = stuf_entiteit.get_file_fields()
        for field_name, django_field_name, django_field in field_mapping:
            #
            # These field requirement rules are not exactly as the KING XSD defines them,
            # but they're close enough (TM). On the highest level (topfundamenteel)
            # and on a 'creeer' service only a 'T' (create) can be done, so all django
            # required fields, are required for that, on the lower levels a 'I' might
            # be done, so not all fields are required.
            #
            if topfundamenteel and not self.update:  # create topfundamenteel -> read the Django field definitions
                customize_kwargs = {}
            else:
                required = False
                customize_kwargs = dict(
                    nullable=not required,
                    min_occurs=1 if required else 0
                )

            # TODO [TECH]: figure out if we can put this in the DJANGO -> SPYNE mapping
            if field_name in file_fields:
                spyne_model = BinaireInhoud.customize(**customize_kwargs)
            else:
                spyne_model = django_field_to_spyne_model(django_field, **customize_kwargs)

            type_info[field_name] = spyne_model

        for field_name, spyne_model, _ in stuf_entiteit.get_custom_fields():
            type_info[field_name] = spyne_model

        tijdvak_geldigheid = stuf_entiteit.get_tijdvak_geldigheid()
        if tijdvak_geldigheid:
            type_info.append(
                ('tijdvakGeldigheid', TijdvakGeldigheid.customize(ref='tijdvakGeldigheid')),
            )

        tijdvak_relatie = stuf_entiteit.get_tijdvak_relatie()
        if tijdvak_relatie:
            type_info.append(
                ('tijdvakRelatie', TijdvakRelatie.customize(ref='tijdvakRelatie')),
            )

        tijdstip_registratie = stuf_entiteit.get_tijdstip_registratie()
        if tijdstip_registratie:
            type_info.append(
                ('tijdstipRegistratie', Tijdstip_e.customize(ref='tijdstipRegistratie')),
            )

        complex_model = self.create_reusable_model(
            self.create_object_name(stuf_entiteit),
            stuf_entiteit.get_namespace(),
            type_info
        )

        complex_model._type_info = reorder_type_info(stuf_entiteit.get_fields(), complex_model._type_info)

        return complex_model
示例#4
0
    def create_object_model(self, stuf_entiteit=None, topfundamenteel=False):
        """
        From a StUFEntiteit create a hierarchy of ComplexModels for everything under the object element.
        """
        stuf_entiteit = stuf_entiteit or self.stuf_entiteit

        type_info = TypeInfo()
        if stuf_entiteit.is_entiteit():
            type_info['entiteittype'] = entiteittype.customize(
                fixed=stuf_entiteit.get_mnemonic())
            type_info['verwerkingssoort'] = verwerkingssoort

        for related_field in stuf_entiteit.get_related_fields():
            # In the case of an update the element can be optional (since it isn't modified)
            model_kwargs = {
                'min_occurs': 0,
                'max_occurs': related_field.max_occurs or 'unbounded'
            }
            # On create, the min_occurs _is_ required.
            if not self.update:  # Create
                model_kwargs['min_occurs'] = related_field.min_occurs

            type_info[related_field.field_name] = self.create_object_model(
                related_field.stuf_entiteit).customize(**model_kwargs)

        # TODO [TECH]: In the WSDL this should be minOccurs and maxOccurs of 1.
        gerelateerde = stuf_entiteit.get_gerelateerde()
        if gerelateerde:
            _, gerelateerde_data = gerelateerde
            type_info['gerelateerde'] = self.create_related_model(
                stuf_entiteit, 'gerelateerde', gerelateerde_data)

        # Build up spyne model
        field_mapping = stuf_entiteit.get_django_field_mapping()
        file_fields = stuf_entiteit.get_file_fields()
        for field_name, django_field_name, django_field in field_mapping:
            #
            # These field requirement rules are not exactly as the KING XSD defines them,
            # but they're close enough (TM). On the highest level (topfundamenteel)
            # and on a 'creeer' service only a 'T' (create) can be done, so all django
            # required fields, are required for that, on the lower levels a 'I' might
            # be done, so not all fields are required.
            #
            if topfundamenteel and not self.update:  # create topfundamenteel -> read the Django field definitions
                customize_kwargs = {}
            else:
                required = False
                customize_kwargs = dict(nullable=not required,
                                        min_occurs=1 if required else 0)

            # TODO [TECH]: figure out if we can put this in the DJANGO -> SPYNE mapping
            if field_name in file_fields:
                spyne_model = BinaireInhoud.customize(**customize_kwargs)
            else:
                spyne_model = django_field_to_spyne_model(
                    django_field, **customize_kwargs)

            type_info[field_name] = spyne_model

        for field_name, spyne_model, _ in stuf_entiteit.get_custom_fields():
            type_info[field_name] = spyne_model

        tijdvak_geldigheid = stuf_entiteit.get_tijdvak_geldigheid()
        if tijdvak_geldigheid:
            type_info.append(
                ('tijdvakGeldigheid',
                 TijdvakGeldigheid.customize(ref='tijdvakGeldigheid')), )

        tijdvak_relatie = stuf_entiteit.get_tijdvak_relatie()
        if tijdvak_relatie:
            type_info.append(
                ('tijdvakRelatie',
                 TijdvakRelatie.customize(ref='tijdvakRelatie')), )

        tijdstip_registratie = stuf_entiteit.get_tijdstip_registratie()
        if tijdstip_registratie:
            type_info.append(
                ('tijdstipRegistratie',
                 Tijdstip_e.customize(ref='tijdstipRegistratie')), )

        complex_model = self.create_reusable_model(
            self.create_object_name(stuf_entiteit),
            stuf_entiteit.get_namespace(), type_info)

        complex_model._type_info = reorder_type_info(
            stuf_entiteit.get_fields(), complex_model._type_info)

        return complex_model