class UUIDWithAttribute(ComplexModel): __type_name__ = 'ID' _type_info = [ ('idType', XmlAttribute(Unicode)), ('idAuthority', XmlAttribute(Unicode)), ('kind', XmlAttribute(IDKindType)), ('objectType', XmlAttribute(Unicode)), ('value', XmlData(Uuid)), ] # def __init__(self): # super().__init__() def __init__(self, kind=None, objectType=None, value=None, idType=None, idAuthority=None, **kwargs): super().__init__(kind=kind, objectType=objectType, value=value, idType=idType, idAuthority=idAuthority, **kwargs) self.kind = kind self.objectType = objectType self.value = value self.idType = idType self.idAuthority = idAuthority
class Security(ComplexModel): code = XmlAttribute(Unicode, use="required") name = XmlAttribute(Unicode, use="required") module = XmlAttribute(Unicode, use="required") Param = Param.customize(min_occurs=0, max_occurs="unbounded")
class Application(ComplexModel): name = XmlAttribute(Unicode, use="required") service = XmlAttribute(Unicode, use="required") tns = XmlAttribute(Unicode) InProtocol = ProtocolDirection.customize(min_occurs=1, max_occurs=1) OutProtocol = ProtocolDirection.customize(min_occurs=1, max_occurs=1)
def create_object_model(self): type_info = ( ('identificatie', Unicode.customize(sub_ns=self.stuf_zkn_ns)), ('functie', XmlAttribute(Unicode.customize(sub_ns=self.stuf_ns), ns='http://www.egem.nl/StUF/StUF0301')), ('entiteittype', XmlAttribute(Unicode.customize(sub_ns=self.stuf_ns, ns='http://www.egem.nl/StUF/StUF0301'))), ) object_model = complex_model_factory( '{}_{}'.format(self.entiteittype, self.shortname), self.stuf_zkn_ns, type_info) return object_model
class Module(ComplexModel): """ Security module """ path = XmlAttribute(Unicode, use="required") code = XmlAttribute(Unicode, use="required") name = XmlAttribute(Unicode, use="required") Param = ParamDeclaration.customize(min_occurs=0, max_occurs="unbounded")
class Protocol(ComplexModel): code = XmlAttribute(Unicode, use="required") name = XmlAttribute(Unicode, use="required") module = XmlAttribute(Unicode, use="required") direction = XmlAttribute( Unicode(values=["IN", "OUT", "BOTH"]), use="required", ) Param = ParamDeclaration.customize(min_occurs=0, max_occurs="unbounded")
class OverdragenZaak_ZAK_opdracht_e(ComplexModel): __namespace__ = ZKN_XML_NS __type_name__ = 'OverdragenZaak-ZAK-opdracht-e' __extends__ = OverdragenZaak_ZAK_opdracht_r _type_info = [ # Attributes ('functie', XmlAttribute(simple_types.FunctieVrijBerichtElement.customize( fixed='entiteit'), ref='functie')), # use=required ]
class OverdragenZaak_ZAK_opdrachtbevestiging_e(ComplexModel): __namespace__ = ZKN_XML_NS __type_name__ = 'OverdragenZaak-ZAK-opdrachtbevestiging-e' __extends__ = OverdragenZaak_ZAK_opdrachtbevestiging_r _type_info = [ # Attributes ('functie', XmlAttribute(simple_types.FunctieVrijBerichtElement.customize( fixed='entiteit'), ref='functie')), # use=required, default should be fixed # Elements ('antwoord', simple_types.OverdragenZaak_antwoord), ]
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
class OverdragenZaak_ZKT_kerngegevens(ComplexModel): __namespace__ = ZKN_XML_NS __type_name__ = 'OverdragenZaak-ZKT-kerngegevens' _type_info = [ # Attributes ('entiteittype', XmlAttribute(simple_types.Entiteittype.customize(fixed='ZKT'), ref='entiteittype')), # <attribute ref="StUF:sleutelVerzendend"/> # <attribute ref="StUF:sleutelOntvangend"/> # <attribute ref="StUF:sleutelGegevensbeheer"/> # <attribute ref="StUF:sleutelSynchronisatie"/> # <attribute ref="StUF:verwerkingssoort"/> # Elements ('omschrijving', simple_types.Omschrijving), # Omschrijving-e ('code', simple_types.Code), # Code-e # ('ingangsdatumObject', DatumMetIndicator.customize(nillable=True, min_occurs=0)) ]
class OverdragenZaak_ZAK_opdrachtbevestiging_r(ComplexModel): __namespace__ = ZKN_XML_NS __type_name__ = 'OverdragenZaak-ZAK-opdrachtbevestiging-r' _type_info = [ # Attributes ('entiteittype', XmlAttribute(simple_types.Entiteittype.customize(fixed='ZAK'), ref='entiteittype')), # <attribute ref="StUF:sleutelVerzendend"/> # <attribute ref="StUF:sleutelOntvangend"/> # <attribute ref="StUF:sleutelGegevensbeheer"/> # <attribute ref="StUF:sleutelSynchronisatie"/> # <attribute ref="StUF:noValue"/> # <attribute ref="StUF:scope"/> # <attribute ref="StUF:verwerkingssoort"/> # Elements ('identificatie', simple_types.ZaakIdentificatie_r), ]
class OverdragenZaak_ZAKZKT_kerngegevens(ComplexModel): __namespace__ = ZKN_XML_NS __type_name__ = 'OverdragenZaak-ZAKZKT-kerngegevens' _type_info = [ # Attributes ('entiteittype', XmlAttribute(simple_types.Entiteittype.customize(fixed='ZAKZKT'), ref='entiteittype')), # <attribute ref="StUF:aantalVoorkomens"/> # <attribute ref="StUF:aardAantal"/> # <attribute ref="StUF:sleutelVerzendend"/> # <attribute ref="StUF:sleutelOntvangend"/> # <attribute ref="StUF:sleutelGegevensbeheer"/> # <attribute ref="StUF:sleutelSynchronisatie"/> # <attribute ref="StUF:noValue"/> # <attribute ref="StUF:verwerkingssoort"/> # Elements ('gerelateerde', OverdragenZaak_ZKT_kerngegevens) ]
def create_model(self): name = self.name root_type_info = [ ('stuurgegevens', self.create_stuurgegevens_model()), ('parameters', self.get_input_parameters_model()), ] try: root_type_info.append(('gelijk', self.create_gelijk_model())) except EmptyResultError: pass scope_model = self.create_scope_model() scope_model._type_info['scope'] = XmlAttribute(attributes.Scope__Anonymous, ref='scope', ns=STUF_XML_NS) object_type_info = [ ('object', scope_model), ] object_model = self.create_reusable_model(self.create_scope_name(), ZKN_XML_NS, object_type_info) root_type_info.append(('scope', object_model)) root_model = self.create_reusable_model('{}_Lv01'.format(name), ZKN_XML_NS, root_type_info) root_model.stuf_entiteit = self.stuf_entiteit return root_model
class CM(ComplexModel): i = Integer s = String a = XmlAttribute(String)
class Session(ComplexModel): """Session description (used by spyne).""" __namespace__ = "urn:schemas-microsoft-com:xml-analysis" SessionId = XmlAttribute(Unicode)
class SomeObject(ComplexModel): s = XmlAttribute(Unicode(min_occurs=1, sub_name='foo'))
def create_object_model(self, stuf_entiteit=None): """ From a StUFEntiteit create a hierarchy of ComplexModels for everything under the object element. """ stuf_entiteit = stuf_entiteit or self.stuf_entiteit type_info = [] if stuf_entiteit.is_entiteit(): type_info.append( ('entiteittype', XmlAttribute(simple_types.Entiteittype, ref='entiteittype', ns=STUF_XML_NS)) ) 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')), ) if getattr(stuf_entiteit, 'append_object_model', False): for key, append_complex_model in stuf_entiteit.append_object_model: # assert False, append_complex_model.__dict__ type_info.append((key, append_complex_model)) for related_field in stuf_entiteit.get_related_fields(): type_info.append( (related_field.field_name, self.create_object_model(related_field.stuf_entiteit).customize(max_occurs='unbounded')) ) # 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): sub_type_info = [] for relation_name, related_cls in gerelateerde_data: _object_model = self.create_object_model(related_cls).customize(xml_choice_group='gerelateerde') sub_type_info.append((relation_name, _object_model)) # See Stuf 03.01 - 3.2.2 De structuur van een object, why this model does not have a 'entiteittype' # attribute. # # Het element <gerelateerde> mag ook als kind een <choice> bevatten met twee of meer elementen # met een attribute StUF:entiteittype en daarbinnen de elementen voor dat entiteittype. Het element # <gerelateerde> heeft dan geen attributes. # sub_model = self.create_reusable_model( self.create_object_name(stuf_entiteit, 'gerelateerde'), stuf_entiteit.get_namespace(), sub_type_info ).customize(min_occurs=1, max_occurs=1) # TODO [TECH]: min/max_occurs does not show up in the WSDL for some reason. type_info.append(('gerelateerde', sub_model)) else: related_cls = gerelateerde_data # TODO [TECH]: min/max_occurs does not show up in the WSDL for some reason. type_info.append(('gerelateerde', self.create_object_model(related_cls).customize(min_occurs=1, max_occurs=1))) # Build up spyne model field_mapping = stuf_entiteit.get_django_field_mapping() new_type_info = TypeInfo() file_fields = stuf_entiteit.get_file_fields() required_fields = stuf_entiteit.get_required_fields() for field_name, _, django_field in field_mapping: if field_name in file_fields: new_type_info[field_name] = BinaireInhoud else: min_occurs = 1 if field_name in required_fields else 0 new_type_info[field_name] = django_field_to_spyne_model(django_field, min_occurs=min_occurs) complex_model = self.create_reusable_model( self.create_object_name(stuf_entiteit), stuf_entiteit.get_namespace(), new_type_info ) complex_model.stuf_entiteit = stuf_entiteit for k, v in type_info: complex_model._type_info[k] = v for field_name, spyne_model, _ in stuf_entiteit.get_custom_fields(): complex_model._type_info[field_name] = spyne_model complex_model._type_info = reorder_type_info(stuf_entiteit.get_fields(), complex_model._type_info) return complex_model
def create_scope_model(self, stuf_entiteit=None): stuf_entiteit = stuf_entiteit or self.stuf_entiteit field_names = [field_name for field_name, _unused in stuf_entiteit.get_field_mapping()] type_info = [(field_name, ScopeAttribute) for field_name in field_names] # type_info = [] # # file_fields = stuf_entiteit.get_file_fields() # field_mapping = stuf_entiteit.get_django_field_mapping() # for field_name, django_field_name, django_field in field_mapping: # if field_name in file_fields: # type_info.append((field_name, Unicode)) # TODO # else: # type_info.append((field_name, django_field_to_spyne_model(django_field))) for related_field in stuf_entiteit.get_related_fields(): type_info.append((related_field.field_name, self.create_scope_model(related_field.stuf_entiteit))) # 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): sub_type_info = [] for relation_name, related_cls in gerelateerde_data: sub_type_info.append((relation_name, self.create_scope_model(related_cls).customize(xml_choice_group='gerelateerde'))) sub_model = self.create_reusable_model(self.create_scope_name(stuf_entiteit, 'gerelateerde'), stuf_entiteit.get_namespace(), sub_type_info) sub_model.stuf_entiteit = stuf_entiteit type_info.append(('gerelateerde', sub_model)) else: related_cls = gerelateerde_data type_info.append(('gerelateerde', self.create_scope_model(related_cls))) if stuf_entiteit.is_entiteit(): type_info.append(('entiteittype', XmlAttribute(simple_types.Entiteittype, ref='entiteittype', ns=STUF_XML_NS))) 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')), ) scope_model = self.create_reusable_model(self.create_scope_name(stuf_entiteit), stuf_entiteit.get_namespace(), type_info) scope_model.stuf_entiteit = stuf_entiteit scope_model._type_info = reorder_type_info(stuf_entiteit.get_fields(), scope_model._type_info, allow_partial=True) return scope_model
class FooCustomRequest(ComplexModel): AttrA = XmlAttribute(Unicode) AttrB = XmlAttribute(Unicode) Bar = Baz.customize(sub_ns=NS_B) Baz = Unicode
class ServiceApi(ComplexModel): id = XmlAttribute(Unicode, use="required")
class Service(ComplexModel): code = XmlAttribute(Unicode, use="required") name = XmlAttribute(Unicode, use="required") Api = ServiceApi.customize(min_occurs=1, max_occurs="unbounded")
class B(A): s = String sa = XmlAttribute(String)
class Param(ComplexModel): value = XmlData(Unicode) key = XmlAttribute(Unicode, use="required") valueType = XmlAttribute(Unicode, use="required")
class TypeVal(ComplexModel): type = XmlAttribute(Unicode) value = XmlData(Unicode)
class Baz(ComplexModel): __namespace__ = NS_B Thing = Unicode AttrC = XmlAttribute(Unicode)
class PacketAttribute(ComplexModel): __namespace__ = 'myns' Data = XmlAttribute(ByteArray, use='required')
class SomeClass(ComplexModel): a = XmlAttribute(Integer(ge=4))
class Api(ComplexModel): id = XmlAttribute(Unicode, use="required") code = XmlAttribute(Unicode, use="required") name = XmlAttribute(Unicode, use="required") module = XmlAttribute(Unicode, use="required")
class SomeObject(ComplexModel): s = XmlAttribute(Unicode(min_occurs=1))
class A(ComplexModel): i = Integer ia = XmlAttribute(Integer)