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
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