B
    EDb&b  ã               @   s  d dl mZmZmZmZmZ d dlmZ d dlm	Z	m
Z
mZmZ d dlmZmZ d dlmZ d dlmZ d dlZd dlZd dlZe e	dƒej¡ZG d	d
„ d
eƒZdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!eG dd„ deƒƒZ"dS )é    )ÚBaseInterfaceÚServiceDescriptorÚBaseRequestHandlerÚBaseResponseHandlerÚBaseFaultHandler)Úexpose)ÚPORTABLE_STRINGÚtype_to_xsdÚpytype_supportÚBytesIO)ÚContentHandlerÚfeature_namespaces)Úmake_parser)ÚInputSourceNz^\w*[:]{0,1}nil$c               @   s   e Zd ZeZdZdd„ ZdS )ÚSOAPServiceDescriptorztext/xmlc       1   	   C   sF
  |j }|j}dd„ }	ddlm  m}
 |
 ¡ }| d¡}| dd¡ | dd	¡ | d
d¡ | d|¡ | dd| ¡ | dd| ¡ | dd¡ | dd¡ | dd¡ | dd¡ | d| d| ¡ | dd	¡ | |¡ | d¡}| |¡ | d¡}| dd| ¡ | dd¡ | dd¡ | dd¡ | dd¡ | d| d| ¡ | dd¡ | |¡ | d¡}| dd¡ | |¡ xŽ|D ]„}t	|t
ƒrâ|d }| d¡}| dd|j ¡ | |¡ | d ¡}| |¡ | d!¡}| d"d#¡ | |¡ | d$¡}| d%¡}| dd&¡ ||krH| d'd(||jf ¡ n| d'd)|	|ƒ ¡ | d*d+¡ | d,d-¡ | |¡ | |¡ | d.¡}| d/d0¡ ||krÀ| d1d2||jf ¡ n| d1d3|	|ƒ ¡ | |¡ q’| d¡}| d|d ¡ | |¡ | d$¡}| |¡ xú|d4 D ]î\}}}| d%¡}| d| d5d6¡¡ | d,d7¡ | d*d7¡ | d8¡d9krŒ| d*d+¡ | d:d;¡ t	|t
ƒrÐ|d }| d'd<||jf ¡ | d*d+¡ | d:d;¡ n6||krò| d'd(||jf ¡ n| d'd)|	|ƒ ¡ | |¡ q$W q’W xP|D ]F}| d=¡}| d| ¡ ¡ | |¡ x´| ¡ D ]¨}| d>¡}| d|d  d5d6¡¡ t	|d' t
tfƒr²| d'd<||d' d jf ¡ nB|d' |krÜ| d'd(||d' jf ¡ n| d'd)|	|d' ƒ ¡ | |¡ qXW | d=¡}| dd?| ¡  ¡ | |¡ t	|jt
tfƒr|| d>¡}| dd@¡ | d'd<||jd jf ¡ | |¡ nî|j|kr4xà||j d4 D ]–\}}}| d>¡}| d| d5d6¡¡ t	|t
ƒrì|d }| d'd<||jf ¡ n6||kr| d'd(||jf ¡ n| d'd)|	|ƒ ¡ | |¡ q˜W n6| d>¡}| dd@¡ | d'd)|	|jƒ ¡ | |¡ q$W | dA¡}| ddB| ¡ | |¡ x°|D ]¨}| dC¡} |  d| ¡ ¡ | | ¡ |jrð| dD¡}!|! | |j¡¡ |  |!¡ | dE¡}"|" d=dF| ¡  ¡ |  |"¡ | dG¡}#|# d=dH| ¡  ¡ |  |#¡ qšW | dI¡}$|$ d|¡ |$ d'dJ| ¡ | dK¡}%|% dLdM¡ |% dNdO¡ |$ |%¡ | |$¡ xê|D ]à}| dC¡} |  d| ¡ ¡ |$ | ¡ | dP¡}&|& dLdM¡ |& dQdR|| ¡ f ¡ |  |&¡ |j | dE¡}"|"}'|jrˆ| dS¡}(| dT¡})|)}'| dT¡}*| dU¡}+|+ d'dV¡ |" |(¡ |( |)¡ |( |*¡ |* |+¡ | dW¡},|, dXdY¡ |, dd| ¡ |, dZd¡ |' |,¡ |  |"¡ | dG¡}#|#}'|j	rD| dS¡}(| dT¡})|)}'| dT¡}*| d[¡}+|+ d'dV¡ |# |(¡ |( |)¡ |( |*¡ |* |+¡ | dW¡}-|- dXdY¡ |- dd| ¡ |- dZd¡ |' |-¡ |  |#¡ qªW | d\¡}.|. d|¡ | dD¡}!|! | d]¡¡ |. |!¡ | d^¡}/|/ d|¡ |/ dIdF| ¡ |. |/¡ | d_¡}0|0 d`|¡ |/ |0¡ | |.¡ tjd dak
r<| ¡ S | |¡S )bz*
		Generate WSDL file for SOAPInterface
		c             S   s   | t jkrt j|  S | jS d S )N)r   Úxsd_type_mapÚ__name__)Útyp© r   ú5G:\easytimepro\master/mysite/ladon\interfaces\soap.pyÚmap_type   s    

z0SOAPServiceDescriptor.generate.<locals>.map_typer   NÚdefinitionsz
xmlns:SOAPz%http://schemas.xmlsoap.org/wsdl/soap/z
xmlns:WSDLz http://schemas.xmlsoap.org/wsdl/z
xmlns:mimez%http://schemas.xmlsoap.org/wsdl/mime/ÚnameZtargetNamespacezurn:%sz	xmlns:tnszxmlns:SOAP-ENVz)http://schemas.xmlsoap.org/soap/envelope/zxmlns:SOAP-ENCz)http://schemas.xmlsoap.org/soap/encoding/z	xmlns:xsiz)http://www.w3.org/2001/XMLSchema-instancez	xmlns:xsdz http://www.w3.org/2001/XMLSchemaz
xmlns:ns%dZxmlnsÚtypesÚschemaÚimportÚ	namespaceZcomplexTypez	ArrayOf%sZcomplexContentÚrestrictionÚbasezSOAP-ENC:ArrayÚsequenceÚelementÚitemÚtypezns%d:%szxsd:%sZ	minOccursÚ0Z	maxOccursZ	unboundedÚ	attributeÚrefzSOAP-ENC:arrayTypezWSDL:arrayTypez	ns%d:%s[]zxsd:%s[]Z
attributesÚ_ú-Ú1ZnullableTZnillableÚtruezns%d:ArrayOf%sÚmessageÚpartz
%sResponseÚresultZportTypez
%sPortTypeÚ	operationÚdocumentationÚinputztns:%sÚoutputztns:%sResponseÚbindingztns:%sPortTypezSOAP:bindingZstyleZrpcÚ	transportz$http://schemas.xmlsoap.org/soap/httpzSOAP:operationZ
soapActionz%s/%szmime:multipartRelatedz	mime:partzmime:contentz*/*z	SOAP:bodyZuseZencodedZencodingStylezcontent:partÚservicez"Ladon generated service definitionÚportzSOAP:addressÚlocationé   )Ú	type_dictÚ
type_orderÚxml.dom.minidomÚdomÚminidomÚDocumentÚcreateElementÚsetAttributeÚappendChildÚ
isinstanceÚlistr   ÚreplaceÚgetr   ÚargsÚtupleZ_rtypeÚ__doc__ÚcreateTextNodeZ_multipart_response_requiredZ_multipart_request_requiredÚsysÚversion_infoÚtoxml)1ÚselfÚservicenameZservicenumberZtypemanagerZ
methodlistZservice_urlÚencodingr7   r8   r   ÚmdÚdocr   r   r   Z
import_tagr   ÚinnerZcomplextypeZcomplexcontentr   r   r    r$   ÚkÚvÚpropsÚmr*   Úargr+   Zporttyper-   r.   Z	input_tagZ
output_tagr1   r2   Z
soapactionZbody_parentZmultipart_relatedZmime_body_partZmime_content_partZmime_contentZinput_soapbodyZoutput_soapbodyr3   r4   Zaddressr   r   r   Úgenerate   sœ   





























 























































zSOAPServiceDescriptor.generateN)r   Ú
__module__Ú__qualname__r	   r   Ú_content_typerV   r   r   r   r   r      s   r   c             C   s$   t jd dkrt| dƒS t| ƒS d S )Nr   é   zutf-8)rH   rI   r   )Zinstringr   r   r   ÚuF  s    
r[   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚContainerSetRefc             C   s   || _ || _d S )N)ÚcÚrefval)rK   r]   r^   r   r   r   Ú__init__M  s    zContainerSetRef.__init__c             C   s   || j | j< d S )N)r]   r^   )rK   Úvalr   r   r   ÚsetQ  s    zContainerSetRef.setN)r   rW   rX   r_   ra   r   r   r   r   r\   L  s   r\   c               @   sd   e Zd ZdZdZdZdZdZdZdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚSOAPContentHandleré   rZ   r6   é   é   é   c             C   sb   || _ d| _d| _d| _di i| _| jd | _g | _g | _d| _d| _	i | _
i | _d| _d| _dS )z
		Initialize
		r   éÿÿÿÿNrD   F)ÚparserÚdepthÚmethod_depthÚstateÚreq_dictÚcurrent_arg_objectÚarg_object_stackÚarg_tagname_stackÚ
prev_depthÚin_cdataÚmulti_ref_hrefsÚmulti_ref_idsÚcur_id_depthÚ
cur_id_val)rK   rh   r   r   r   r_   ]  s    
zSOAPContentHandler.__init__c             C   s
   d| _ dS )z+
		Mark that parser is in CDATA Section.
		TN)rq   )rK   r   r   r   ÚstartCdataSectionp  s    z$SOAPContentHandler.startCdataSectionc             C   s
   d| _ dS )z6
		Mark that parser stepped out of a CDATA Section.
		FN)rq   )rK   r   r   r   ÚendCdataSectionv  s    z"SOAPContentHandler.endCdataSectionc             C   s   | j | jj_| j| jj_dS )z†
		Setup XMLParser callbacks, callbacks are setup here as the XMLParser
		is not initialized by XMLReader before it starts parsing.
		N)rv   rh   Z_parserZStartCdataSectionHandlerrw   ZEndCdataSectionHandler)rK   r   r   r   ÚstartDocument|  s    z SOAPContentHandler.startDocumentc             C   s6   x0| j  ¡ D ]"\}}|| jkr| | j| ¡ qW d S )N)rr   Úitemsrs   ra   )rK   Úid_valrR   r   r   r   ÚendDocument„  s    
zSOAPContentHandler.endDocumentc             C   s|  d}d\}}xz|  ¡ D ]n\}}t |¡r:| ¡ dkr:d}q| ¡ dkrT|dd… }q| ¡ dkr|| _| j| _i | j|< | j| | _qW | 	d	d
¡}| 
d¡}t|ƒdkr´|\}	}
ndg| \}	}
| jsÞ|
 ¡ dkrÞ| j| _n’| j| jkr|
 ¡ dkr| j| _nl| j| j| jgkr0|
 ¡ dkr0| j| _n@| j| jkrZ| j| _|
| jd< | j| _n| j| jkrp| j| _| j| jks†| jrjtdƒ| _|rœd}ni }|
 ¡ dkr | jdd… d }| jdd… d }t|| tƒrî|g||< n||  |g7  < |r\t|t|ƒd ƒ| j|< n<|| j|
< | j | j¡ | j |
¡ |r\t| j|
ƒ| j|< || _| j| _|  jd7  _dS )z
		Handle element entrance.
		F)NNr)   TZhrefrc   NÚidr'   r&   ú:Ú ÚenvelopeÚheaderZbodyÚ
methodnamer!   rg   r   )ry   Úrx_nil_attrÚmatchÚlowerru   ri   rt   rs   rm   rB   ÚsplitÚlenÚENVELOPE_INrk   Ú	HEADER_INÚBODY_INÚ	METHOD_INrl   rj   ÚARGS_INr[   Úpickup_contentro   rn   r@   Údictr\   rr   Úappendrp   )rK   r   ZattrsZis_nullZhref_valrz   ZakÚavrT   ÚprefixÚtagnameZ	newobjectÚparent_tagnameÚparent_objectr   r   r   ÚstartElement‰  sd    




"




zSOAPContentHandler.startElementc             C   s²  |  dd¡}|  jd8  _| d¡}t|ƒdkr:|\}}ndg| \}}| j| jkr\| j| _| j| jkrÈtt| j	| j
  ¡ ƒd d ƒr®t| j	| j
  ¡ ƒd d | j	| j
< n| j| j	| j
< d | _
d | _| j| jksÜ| j
r®| ¡ dksX| j| jkr4| jdd … d }| jdd … d }|| d ks4| j||< | j ¡ | _| j| jd	< | j ¡  nV| jdd … d }| jdd … d }t|| dd … d ƒdkr®| jg|| dd …< d S )
Nr'   r&   rc   r}   r~   r   r!   rg   rD   )rB   ri   r…   r†   rj   ÚARGS_OUTrk   rt   rA   rs   ru   ry   rŒ   r‹   r„   rp   ro   rn   Úpoprm   rl   )rK   r   rT   r   r‘   r’   r“   r   r   r   Ú
endElementÕ  s8    

 &
zSOAPContentHandler.endElementc             C   s>   | j | jks| jr:| jr(|  j|7  _n|  j| ¡ 7  _d S )N)rk   r‹   ru   rq   rŒ   Ústrip)rK   Zcontentr   r   r   Ú
characters  s    zSOAPContentHandler.charactersN)r   rW   rX   r‡   rˆ   r‰   rŠ   r‹   r•   r_   rv   rw   rx   r{   r”   r—   r™   r   r   r   r   rb   T  s   L-rb   c               @   s   e Zd Zdd„ ZdS )ÚSOAPRequestHandlerc             C   s<   t ƒ }t|ƒ}| |¡ tƒ }| t|ƒ¡ | |¡ |jS )N)r   rb   ZsetContentHandlerr   ZsetByteStreamr   Úparserl   )rK   Z	soap_bodyÚsinforM   rh   ÚchZinpsrcr   r   r   Úparse_request  s    

z SOAPRequestHandler.parse_requestN)r   rW   rX   rž   r   r   r   r   rš     s   rš   c               @   s*   e Zd ZdZdZed	dd„ƒZdd„ ZdS )
ÚSOAPResponseHandlerztext/xmlTFc             C   sî   t | tƒrPxÞ|  ¡ D ]6\}}| dd¡}| |¡}| |¡ t |||¡ qW nš|rj| d¡}| |¡ n|}t | tt	fƒrÄt
| ƒs’| dd¡ qêxV| D ]&}	| d¡}
t |	|
|¡ | |
¡ q˜W n&| d krÚ| dd¡ n| | | ¡¡ d S )Nr&   r'   r,   zxsi:nilr)   r!   )r@   r   ry   rB   r=   r?   rŸ   Úvalue_to_soapxmlrA   rE   r†   r>   rG   )ÚvalueÚparentrO   Úis_toplevelZ	attr_nameZattr_valZxml_attr_nameZ	attr_elemZvalue_parentr!   Zitem_elementr   r   r   r      s(    





z$SOAPResponseHandler.value_to_soapxmlc       	      C   sÐ   dd l m  m} | ¡ }| d¡}| dd¡ | dd¡ | dd¡ | d	d
¡ | dd|d  ¡ | |¡ | d¡}| dd¡ | |¡ | d|d  ¡}tj|d ||dd | |¡ |j	|dS )Nr   zSOAP-ENV:Envelopezxmlns:SOAP-ENVz)http://schemas.xmlsoap.org/soap/envelope/zxmlns:SOAP-ENCz)http://schemas.xmlsoap.org/soap/encoding/z	xmlns:xsiz)http://www.w3.org/2001/XMLSchema-instancez	xmlns:xsdz http://www.w3.org/2001/XMLSchemazxmlns:nszurn:%srL   zSOAP-ENV:BodyzSOAP-ENV:encodingStylezns:%sResponseÚmethodr,   T)r£   )rM   )
r9   r:   r;   r<   r=   r>   r?   rŸ   r    rJ   )	rK   Zres_dictrœ   rM   rN   rO   r   Z	body_elemZmethod_elemr   r   r   Úbuild_response?  s     




z"SOAPResponseHandler.build_responseN)F)r   rW   rX   rY   Ú_stringify_res_dictÚstaticmethodr    r¥   r   r   r   r   rŸ     s
   rŸ   c               @   s    e Zd ZdZdZdZdd„ ZdS )ÚSOAPFaultHandlerztext/xmlTa²  <?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
	<SOAP-ENV:Body>
		<SOAP-ENV:Fault>
			<faultcode xsi:type="xsd:string"></faultcode>
			<faultstring xsi:type="xsd:string"></faultstring>
			<detail></detail>
		</SOAP-ENV:Fault>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>c             C   sž   dd l m  m} |jr |j}nt ¡ }| | j¡}| d¡d }	| d¡d }
| d¡d }|	 	| 
|j¡¡ |
 	| 
|j¡¡ | 	| 
|¡¡ |j|dS )Nr   Ú	faultcodeÚfaultstringÚdetail)rM   )r9   r:   r;   r«   Ú	tracebackÚ
format_excZparseStringÚsoapfault_templateZgetElementsByTagNamer?   rG   r©   rª   rJ   )rK   Zservice_excrœ   r   rM   Z
reflectionrN   r«   ÚdZfaultcode_elemZfaultstring_elemZdetail_elemr   r   r   Úbuild_fault_responsec  s    z%SOAPFaultHandler.build_fault_responseN)r   rW   rX   rY   r¦   r®   r°   r   r   r   r   r¨   Q  s   r¨   c               @   sD   e Zd Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZdS )ÚSOAPInterfacec             K   s,   t tttdœ}| |¡ tj| |f|Ž d S )N)Zservice_descriptorZrequest_handlerZresponse_handlerZfault_handler)r   rš   rŸ   r¨   Úupdater   r_   )rK   rœ   ÚkwZdef_kwr   r   r   r_   x  s    
zSOAPInterface.__init__c               C   s   dS )NZsoapr   r   r   r   r   Ú_interface_name  s    zSOAPInterface._interface_namec             C   s   t  | ¡dkS )Nr   )r
   Úcount)r   r   r   r   Ú_accept_basetype…  s    zSOAPInterface._accept_basetypec               C   s   dS )NTr   r   r   r   r   Ú_accept_list‰  s    zSOAPInterface._accept_listc               C   s   dS )NFr   r   r   r   r   Ú_accept_dict  s    zSOAPInterface._accept_dictN)	r   rW   rX   r_   r§   r´   r¶   r·   r¸   r   r   r   r   r±   u  s
   	r±   )#Zmysite.ladon.interfaces.baser   r   r   r   r   Zmysite.ladon.interfacesr   Zmysite.ladon.compatr   r	   r
   r   Zxml.sax.handlerr   r   Zxml.saxr   Zxml.sax.xmlreaderr   rH   Úrer¬   ÚcompileÚIr‚   r   r[   Úobjectr\   rb   rš   rŸ   r¨   r±   r   r   r   r   Ú<module>   s&     ; ;7$