o
    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 d dlm	Z	 d dl
mZmZmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ eeZdgZG dd deZdS )    N)etree)
exceptions)UnexpectedElementError)
qname_attr)NilNotSetxsi_ns)XmlParserContext)Base)create_prefixed_namemax_occurs_iter)CompoundValueElementc                   @   s   e Zd Z							d)ddZdd Zdd	 Zd
d Zdd Zdd Ze	dd Z
d*ddZd+ddZdd Zd,ddZd-ddZdd Zd-ddZd d! Zd"d# Zd$d% Zd.d'd(ZdS )/r   N   Fc	           	      C   st   |d u r
t d| jt|tjst|}|r|jnd | _|| _|| _|| _	|| _
|| _|| _|| _|p6| j| _d S )Nzname cannot be None)
ValueError	__class__
isinstancer   QName	localnamenameqnametype
min_occurs
max_occursnillable	is_globaldefault	attr_name)	selfr   type_r   r   r   r   r   r    r    R/home/ubuntu/webapp/venv/lib/python3.10/site-packages/zeep/xsd/elements/element.py__init__   s   
zElement.__init__c                 C   s>   | j r| j jrd| j| j jf S d| j| j  f S d| j S )N%s(%s)z%s())r   r   r   r   	signaturer   r    r    r!   __str__1   s
   
zElement.__str__c                 O   s$   | j |i |}t|tr| |_|S N)r   r   r   _xsd_elm)r   argskwargsinstancer    r    r!   __call__9   s   
zElement.__call__c                 C   s   d| j j| j| jf S )Nz<%s(name=%r, type=%r)>)r   __name__r   r   r%   r    r    r!   __repr__?   s
   zElement.__repr__c                 C   s    |d uo| j |j ko| j|jkS r'   )r   __dict__)r   otherr    r    r!   __eq__F   s
   

zElement.__eq__c                 C   s   t | j|S r'   )r   r   )r   schemar    r    r!   get_prefixed_nameM   s   zElement.get_prefixed_namec                 C   s   | j rg S | jr
d S | jS r'   )accepts_multipleis_optionalr   r%   r    r    r!   default_valueP   s
   zElement.default_valuec                 C   sJ   t  | }|rt|tjst|}|j|_||_|j|_||_||_	|S r'   )
copyr   r   r   r   r   r   r   r   r   )r   r   r   r   newr    r    r!   cloneX   s   

zElement.clonec                 C   sN   |pt  }t|td}d}|r|j|dd}|p| j}|j||||| jdS )a  Process the given xmlelement. If it has an xsi:type attribute then
        use that for further processing. This should only be done for subtypes
        of the defined type but for now we just accept everything.

        This is the entrypoint for parsing an xml document.

        :param xmlelement: The XML element to parse
        :type xmlelements: lxml.etree._Element
        :param schema: The parent XML schema
        :type schema: zeep.xsd.Schema
        :param allow_none: Allow none
        :type allow_none: bool
        :param context: Optional parsing context (for inline schemas)
        :type context: zeep.xsd.context.XmlParserContext
        :return: dict or None

        r   NT)fail_silently)
allow_nonecontextschema_type)r	   r   r   get_typer   parse_xmlelement)r   
xmlelementr2   r;   r<   instance_typexsd_typer    r    r!   parsef   s   

zElement.parsec                 C   s   | j ||p| j|S r'   )r   parse_kwargsr   )r   r*   r   available_kwargsr    r    r!   rD      s   zElement.parse_kwargsc                    sB  g }d}t  jD ]}|s nt|d j}|jr+ jjr+|j jjkr+|jjr+ ni|j	 jj	krI|
 }	|d7 } j|	|d|d}
||
 q	|dur|jjrtt fdd|rtt fdd|d }	||	 |d7 } j|	|d|d}
||
 q	|dkr jstd	|j jjf   js|r|d nd}|S )
a  Consume matching xmlelements and call parse() on each of them

        :param xmlelements: Dequeue of XML element objects
        :type xmlelements: collections.deque of lxml.etree._Element
        :param schema: The parent XML schema
        :type schema: zeep.xsd.Schema
        :param name: The name of the parent element
        :type name: str
        :param context: Optional parsing context (for inline schemas)
        :type context: zeep.xsd.context.XmlParserContext
        :return: dict or None

        r   r   T)r;   r<   Nc                       t | jj jjkS r'   r   r   tagr   r   elemr%   r    r!   <lambda>       z+Element.parse_xmlelements.<locals>.<lambda>c                    rF   r'   rG   rI   r%   r    r!   rK      rL   z"Unexpected element %r, expected %r)r   r   r   r   rH   	namespacer   settingsstrictr   popleftrC   appendxsd_ignore_sequence_orderlistfilterremover5   r   textr4   )r   xmlelementsr2   r   r<   resultnum_matches_unusedelement_tagr@   itemr    r%   r!   parse_xmlelements   sf   	


zElement.parse_xmlelementsc                 C   sd   |s| j jg}|dusJ | || | jr)t|tr)|D ]	}| ||| qdS | ||| dS )z~Render the value(s) on the parent lxml.Element.

        This actually just calls _render_value_item for each value.

        N)r   r   validater4   r   rS   _render_value_item)r   parentvaluerender_pathvalr    r    r!   render   s   
zElement.renderc                 C   s   |t u rt|| j}|tdd dS |du s|tu r6| jr"dS t|| j}| jr4|tdd dS t|| j}t	|d| j
}|| j
krR|j||||S | j
||d|S )z+Render the value on the parent lxml.ElementniltrueN	_xsd_type)r   r   
SubElementr   setr   r   r5   r   getattrr   rg   rd   )r   r`   ra   rb   elmnoderB   r    r    r!   r_      s    
zElement._render_value_itemc                 C   s   | j rJt|trJt|| jk rtjd| jt|f |d| jdkr=t| jtr=t|| jkr=tjd| jt|f |d|D ]}| 	|| q?dS | j
s`| js`|dtfv r`tjd| j |d| 	|| dS )z Validate that the value is validz<Expected at least %d items (minOccurs check) %d items found.path	unboundedz;Expected at most %d items (maxOccurs check) %d items found.NzMissing element %s)r4   r   rS   lenr   r   ValidationErrorr   int_validate_itemr5   r   r   r   )r   ra   rb   rc   r    r    r!   r^     s4   


zElement.validatec              
   C   sb   | j r|d tfv rd S z| jj|dd W d S  tjy0 } ztjd| j|jf |dd }~ww )NT)requiredzThe element %s is not valid: %srm   )r   r   r   r^   r   rq   r   message)r   ra   rb   excr    r    r!   rs   "  s   zElement._validate_itemc                 C   s   | j  | _ d S r'   )r   resolver%   r    r    r!   resolve_type.  s   zElement.resolve_typec                 C   s   |    | S r'   )rx   r%   r    r    r!   rw   1  s   zElement.resolveTc                 C   s|   ddl m} | jjs|s| jr| j|}n| jj|dd}|s*t| j|r*d| }|r5d| ||f }| jr<d| S |S )Nr   )ComplexTypeF)
standalonez{%s}r#   z%s[])zeep.xsdry   r   r   r3   r$   r   r4   )r   r2   rz   ry   ra   r    r    r!   r$   5  s   zElement.signature)Nr   r   FNFN)Nr   r   )FN)NNr'   )NT)r-   
__module____qualname__r"   r&   r,   r.   r1   r3   propertyr6   r9   rC   rD   r]   rd   r_   r^   rs   rx   rw   r$   r    r    r    r!   r      s6    



 

O
 )r7   logginglxmlr   zeepr   zeep.exceptionsr   
zeep.utilsr   zeep.xsd.constr   r   r   zeep.xsd.contextr	   zeep.xsd.elements.baser
   zeep.xsd.utilsr   r   zeep.xsd.valueobjectsr   	getLoggerr-   logger__all__r   r    r    r    r!   <module>   s    
