o
    g,G                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d d
lmZ d dlmZ e eZG dd dZG dd dZG dd dZdS )    N)OrderedDict)etree)
exceptionsns)load_external)Settings)const)elements)types)builtins)SchemaVisitorc                   @   s@  e Zd ZdZd<ddZdd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zdejej deddfddZdeddfddZdejfddZd=ddZdejfd d!Zdejfd"d#Zdejfd$d%Zd&d' Zd(d) Zd*d+ Z d>d,d-Z!d.d/ Z"d0d1 Z#d2d3 Z$d4d5 Z%d6d7 Z&d8d9 Z'd=d:d;Z(dS )?Schemaz-A schema is a collection of schema documents.Nc                 C   s`   |pt  | _|| _t | _i | _i | _|   t|t	s&|dur#|gng }n|}| 
|| dS )z
        :param node:
        :param transport:
        :param location:
        :param settings: The settings object

        N)r   settings
_transport_SchemaContainer	documents_prefix_map_auto_prefix_map_custom_load_default_documents
isinstancelistadd_documents)selfnode	transportlocationr   nodes r   H/home/ubuntu/webapp/venv/lib/python3.10/site-packages/zeep/xsd/schema.py__init__   s   
zSchema.__init__c                 C   s   | j }|rd|j|jf S dS )Nz<Schema(location=%r, tns=%r)>z
<Schema()>)root_document	_location_target_namespace)r   main_docr   r   r   __repr__/   s   zSchema.__repr__c                    s2   i    | j    fdd| j D   S )Nc                    s"   i | ]\}}|   vr||qS r   values).0kvretvalr   r   
<dictcomp>=   s   " z%Schema.prefix_map.<locals>.<dictcomp>)updater   r   itemsr   r   r*   r   
prefix_map8   s   zSchema.prefix_mapc                 C   s   t dd | jD d S )Nc                 s   s    | ]}|j s|V  qd S N)_is_internal)r'   docr   r   r   	<genexpr>C   s    z'Schema.root_document.<locals>.<genexpr>)nextr   r/   r   r   r   r    A      zSchema.root_documentc                 C   s   t dd | jD S )zABoolean to indicate if this schema contains any types or elementsc                 s   s    | ]}|j V  qd S r1   )is_empty)r'   documentr   r   r   r4   H   s    z"Schema.is_empty.<locals>.<genexpr>)allr   r/   r   r   r   r7   E   s   zSchema.is_emptyc                 C   s
   | j  S r1   )r   get_all_namespacesr/   r   r   r   
namespacesJ   s   
zSchema.namespacesc                 c   D    t  }| jD ]}|j D ]}|j|vr|V  ||j qqdS )zYYield all globla xsd.Type objects

        :rtype: Iterable of zeep.xsd.Element

        N)setr   	_elementsr&   qnameadd)r   seenr8   elementr   r   r   r	   N      

zSchema.elementsc                 c   r<   )z]Yield all global xsd.Type objects

        :rtype: Iterable of zeep.xsd.ComplexType

        N)r=   r   _typesr&   r?   r@   )r   rA   r8   type_r   r   r   r
   \   rC   zSchema.typesschema_nodesr   returnc                 C   sD   g }|D ]}|  ||}|| q|D ]}|  q|  | _d S r1   )create_new_documentappendresolve_create_prefix_mapr   )r   rF   r   resolve_queuer   r8   r   r   r   r   j   s   
zSchema.add_documentsurlc                 C   s,   t || j| jd}| j||d}|  d S )N)r   )rM   )r   r   r   rH   rJ   )r   rM   schema_noder8   r   r   r   add_document_by_urlw   s   zSchema.add_document_by_urlc                 C   s   |  |}| |ddS )z7Return a global xsd.Element object with the given qnameget_elementrB   )_create_qname_get_instancer   r?   r   r   r   rP   |   s   
zSchema.get_elementFc              
   C   sZ   |  |}z| |ddW S  tjy, } z|r tt| n W Y d}~dS d}~ww )zReturn a global xsd.Type object with the given qname

        :rtype: zeep.xsd.ComplexType or zeep.xsd.AnySimpleType


        get_typetypeN)rQ   rR   r   NamespaceErrorloggerdebugstr)r   r?   fail_silentlyexcr   r   r   rT      s   
zSchema.get_typec                 C      |  |ddS )z6Return a global xsd.Group object with the given qname.	get_groupgrouprR   rS   r   r   r   r]         zSchema.get_groupc                 C   r\   )z9Return a global xsd.attribute object with the given qnameget_attribute	attributer_   rS   r   r   r   ra      r`   zSchema.get_attributec                 C   r\   )z>Return a global xsd.attributeGroup object with the given qnameget_attribute_groupattributeGroupr_   rS   r   r   r   rc      r`   zSchema.get_attribute_groupc                 C   s   || j |< d S r1   )r   )r   prefix	namespacer   r   r   set_ns_prefix      zSchema.set_ns_prefixc                 C   sJ   zz| j | W W S  ty   | j|  Y W S w  ty$   td| w )NzNo such prefix %r)r   KeyErrorr   
ValueError)r   re   r   r   r   get_ns_prefix   s   zSchema.get_ns_prefixc                 C   sX   | j  D ]\}}||kr|  S q| j D ]\}}||kr#|  S q|dkr*dS |S )Nz)http://schemas.xmlsoap.org/soap/envelope/zsoap-env)r   r.   r   )r   rf   re   other_namespacer   r   r   get_shorthand_for_ns   s   zSchema.get_shorthand_for_nsc                 C   sR   |dur	| dnd}|s|}|du r|}t|||}| j| || | |S )z:

        :rtype: zeep.xsd.schema.SchemaDocument

        NtargetNamespace)getSchemaDocumentr   r@   load)r   r   rM   base_urltarget_namespacerf   schemar   r   r   rH      s   zSchema.create_new_documentc                 C   s&   |j D ]}| j | q|  | _dS )z%Merge an other XSD schema in this oneN)r   r@   rK   r   )r   rt   r8   r   r   r   merge   s   
zSchema.mergec                 C   s   |  |j}|j|| dS )N)rt   )rP   tagparse)r   r   elmr   r   r   deserialize   s   zSchema.deserializec                 C   sh   t tjd d }tjD ]}|dd}||j| q
tjD ]}| }|	|j
| qd|_| j| |S )NT)	is_global)rp   r   XSDxsd_builtins_typesrD   register_type_default_qnamexsd_builtins_elementsr>   register_elementr?   r2   r   r@   )r   rt   clsinstancer   r   r   r      s   


zSchema._load_default_documentsc                 C   s   |  |}z6d}| |jD ]$}t||}z||W   W S  tjy2 } z|}W Y d}~qd}~ww |dur9|W dS  tjyO   td||j|jf w )z1Return an object from one of the SchemaDocument'sNzBUnable to resolve %s %s. No schema available for the namespace %r.)rQ   _get_schema_documentsrf   getattrr   LookupErrorrV   text)r   r?   method_namenamelast_exceptionrt   methodr[   r   r   r   rR      s,   

zSchema._get_instancec                 C   s   t |tjr|S |ds>d|v r>| jr>|dd\}}|| jv r*t| j| |S || jv r8t| j| |S td| t|S )zCreate an `lxml.etree.QName()` object for the given qname string.

        This also expands the shorthand notation.

        :rtype: lxml.etree.QNaame

        {:   z&No namespace defined for the prefix %r)r   r   QName
startswithr   splitr   rj   )r   r   re   	localnamer   r   r   rQ      s   


zSchema._create_qnamec                 C   sJ   ddi}d}| j  D ]}|d u s|| v rq||d| < |d7 }q|S )Nxsdz http://www.w3.org/2001/XMLSchemar   zns%dr   )r   r:   r&   )r   r0   irf   r   r   r   rK     s   
zSchema._create_prefix_mapc                 C   s:   | j |s|tjv rtd| | | | j ||S )zlReturn a list of SchemaDocument's for the given namespace.

        :rtype: list of SchemaDocument

        z'Auto importing missing known schema: %s)r   has_schema_document_for_nsr   AUTO_IMPORT_NAMESPACESrW   rX   rO   get_by_namespacer   rf   rZ   r   r   r   r     s   


zSchema._get_schema_documents)NNNN)F)NN))__name__
__module____qualname____doc__r   r$   propertyr0   r    r7   r;   r	   r
   typingListr   _ElementrY   r   rO   xsd_elementsElementrP   rT   Groupr]   	Attributera   AttributeGrouprc   rg   rk   rm   rH   ru   ry   r   rR   rQ   rK   r   r   r   r   r   r      sP    
	








	
r   c                   @   s   e Zd ZdZdd Zdd Zdd
dZdeje	 fddZ
dejd fddZde	de	dejd fddZde	defddZdd Zd	S )r   zUContainer instances to store multiple SchemaDocument objects per
    namespace.

    c                 C   s   t  | _d S r1   )r   
_instancesr/   r   r   r   r   .  s   z_SchemaContainer.__init__c                 c   s    |   E d H  d S r1   r%   r/   r   r   r   __iter__1  s   z_SchemaContainer.__iter__r8   rp   rG   Nc                 C   s2   t d|jt|  | j|jg }|| dS )zAdd a schema documentz%Add document with tns %s to schema %sN)rW   rX   rf   idr   
setdefaultrI   )r   r8   r   r   r   r   r@   4  s
   z_SchemaContainer.addc                 C   s   t | j S r1   )r   r   keysr/   r   r   r   r:   <  rh   z#_SchemaContainer.get_all_namespacesc                 C   s*   || j vr|r	g S td| | j | S )Nz(No schema available for the namespace %r)r   r   rV   r   r   r   r   r   ?  s   

z!_SchemaContainer.get_by_namespacerf   r   c                 C   s.   | j |dd}|D ]}|j|kr|  S q	dS )z<Return a SchemaDocument for the given namespace AND locationT)rZ   N)r   r!   )r   rf   r   r   r8   r   r   r   get_by_namespace_and_locationJ  s   
z._SchemaContainer.get_by_namespace_and_locationc                 C   
   || j v S )zcReturn a boolean if there is a SchemaDocument for the namespace.

        :rtype: boolean

        )r   r   rf   r   r   r   r   T  s   
z+_SchemaContainer.has_schema_document_for_nsc                 c   s     | j  D ]}|E d H  qd S r1   )r   r&   )r   r   r   r   r   r&   \  s   z_SchemaContainer.values)r8   rp   rG   N)r   r   r   r   r   r   r@   r   r   rY   r:   r   Optionalr   boolr   r&   r   r   r   r   r   (  s$    



r   c                   @   s(  e Zd ZdZdd Zdd Zedd Zedd	 Zd
d Z	dd Z
dd Zdd ZdejdejfddZdejdejfddZdejdejfddZdedejfddZdejdejddfddZdejfd d!Zdejfd"d#Zdejfd$d%Zdejfd&d'Zdejfd(d)Z d*d+ Z!d,d- Z"dS ).rp   zA Schema Document consists of a set of schema components for a
    specific target namespace.

    This represents an xsd:Schema object

    c                 C   sj   t d| |p	|| _|| _|| _d| _d| _i | _i | _i | _	i | _
i | _t | _d| _d| _d| _d S )NzInit schema document for %rFunqualified)rW   rX   	_base_urlr!   r"   r2   _has_empty_import_attribute_groups_attributesr>   _groupsrD   r   _imports_element_form_attribute_form	_resolved)r   rf   r   rr   r   r   r   r   i  s   

zSchemaDocument.__init__c                 C   s   d| j | j| jf S )Nz2<SchemaDocument(location=%r, tns=%r, is_empty=%r)>)r!   r"   r7   r/   r   r   r   r$     s
   zSchemaDocument.__repr__c                 C   s   | j S r1   )r"   r/   r   r   r   rf     s   zSchemaDocument.namespacec                 C   s   t | jp	| jp	| j S r1   )r   r   rD   r>   r/   r   r   r   r7     s   zSchemaDocument.is_emptyc                 C   s:   |du rdS |j | jstdt|| }|| dS )zLoad the XML Schema passed in via the node attribute.

        :type schema: zeep.xsd.schema.Schema
        :type node: etree._Element

        NzIThe document needs to be registered in the schema before it can be loaded)r   r   r"   RuntimeErrorr   visit_schema)r   rt   r   visitorr   r   r   rq     s   
zSchemaDocument.loadc                 C   s|   t d|  | jrd S d| _| j D ]}|D ]}|  qqdd }|| j || j || j || j	 || j
 d S )NzResolving in schema %sTc                 S   st   z|   D ]\}}| }|d usJ d|| |< qW d S  tjy9 } ztd|j|j|j|jd d }~ww )Nz!resolve() should return an objectzGUnable to resolve %(item_name)s %(qname)s in %(file)s. (via %(parent)s))	item_namer?   fileparent)r.   rJ   r   r   r   r?   r   )valkeyobjnewr[   r   r   r   _resolve_dict  s$   
z-SchemaDocument.resolve.<locals>._resolve_dict)rW   rX   r   r   r&   rJ   r   r   r>   r   rD   )r   schemasrt   r   r   r   r   rJ     s   




zSchemaDocument.resolvec                 C   s   | j |g }|| dS )zRegister an import for an other schema document.

        :type namespace: str
        :type schema: zeep.xsd.schema.SchemaDocument

        N)r   r   rI   )r   rf   rt   r   r   r   r   register_import  s   zSchemaDocument.register_importc                 C   r   r1   )r   r   r   r   r   is_imported  s   
zSchemaDocument.is_importedr?   valuec                 C      |  ||| jd dS )z"Register a xsd.Type in this schemarU   N)_add_componentrD   r   r?   r   r   r   r   r}     r6   zSchemaDocument.register_typec                 C   r   )z%Register a xsd.Element in this schemarB   N)r   r>   r   r   r   r   r     r6   zSchemaDocument.register_elementc                 C   r   )z#Register a xsd:Group in this schemar^   N)r   r   r   r   r   r   register_group  r6   zSchemaDocument.register_groupc                 C   r   )z'Register a xsd:Attribute in this schemarb   N)r   r   r   r   r   r   register_attribute  r6   z!SchemaDocument.register_attributerG   Nc                 C   r   )z,Register a xsd:AttributeGroup in this schemaattribute_groupN)r   r   r   r   r   r   register_attribute_group  s   z'SchemaDocument.register_attribute_groupc                 C      |  || jdS )zsReturn a xsd.Type object from this schema

        :rtype: zeep.xsd.ComplexType or zeep.xsd.AnySimpleType

        rU   )_get_componentrD   rS   r   r   r   rT     s   zSchemaDocument.get_typec                 C   r   )z,Return a xsd.Element object from this schemarB   )r   r>   rS   r   r   r   rP        zSchemaDocument.get_elementc                 C   r   )z*Return a xsd.Group object from this schemar^   )r   r   rS   r   r   r   r]     r   zSchemaDocument.get_groupc                 C   r   )z.Return a xsd.Attribute object from this schemarb   )r   r   rS   r   r   r   ra     r   zSchemaDocument.get_attributec                 C   r   )z3Return a xsd.AttributeGroup object from this schemard   )r   r   rS   r   r   r   rc     r   z"SchemaDocument.get_attribute_groupc                 C   s.   t |tjr	|j}td||| |||< d S )Nzregister_%s(%r, %r))r   r   r   r   rW   rX   )r   r   r   r.   r   r   r   r   r     s   zSchemaDocument._add_componentc                 C   sX   z|| W S  t y+   d| }tjd||d |j|j|p!dd ||| jdw )Nz, zpNo %(item_name)s '%(localname)s' in namespace %(namespace)s. Available %(item_name_plural)s are: %(known_items)ssz - )r   item_name_pluralr   rf   known_items)r?   r   r   )ri   joinr   r   r   r   rf   r!   )r   r?   r.   r   r   r   r   r   r     s$   
zSchemaDocument._get_component)#r   r   r   r   r   r$   r   rf   r7   rq   rJ   r   r   r   r   	xsd_typesTyper}   r   r   r   r   r   rY   r   r   r   r   rT   rP   r]   ra   rc   r   r   r   r   r   r   rp   a  s<    

%

rp   ) loggingr   collectionsr   lxmlr   zeepr   r   zeep.loaderr   zeep.settingsr   zeep.xsdr   r	   r   r
   r   zeep.xsd.elementsr   r   zeep.xsd.typesr|   zeep.xsd.visitorr   	getLoggerr   rW   r   r   rp   r   r   r   r   <module>   s&    
  9