
    ;\hc@                     "   d Z dZdZ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 dd
lmZmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZmZ ddl m!Z!m"Z"  G d de#      Z$e G d d             Z%dZ&dZ'dZ(dedefdZ) G d de      Z*y)zCopyright 2021, 3LizzGPL version 3zinfo@3liz.org    N)	dataclass)BufferedReader)Path)Optional)minidom)QgsCoordinateReferenceSystemQgsCoordinateTransform
QgsProjectQgsVectorFileWriterQgsVectorLayer)QgsBufferServerRequestQgsBufferServerResponseQgsRequestHandlerQgsServerExceptionQgsServerFilterQgsServerInterfaceQgsServerRequest)FormatOutputFormats)Loggerlog_functionc                       e Zd ZdZy)ProcessingRequestExceptionz,When an exception occurs during the process.N)__name__
__module____qualname____doc__     =/var/www/qgis-server/plugins/wfsOutputExtension/wfs_filter.pyr   r   #   s    6r   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   dZee	j                     ed<   d	Zeed
<   d	Zeed<   dZeed<   y)Contextoutput_formattypenamefilenamebase_name_targettemp_dirformat_definitionNlock_dirFall_gml
has_errors 
request_id)r   r   r   str__annotations__r   r   r)   r   tempfileTemporaryDirectoryr*   boolr+   r-   r   r   r    r"   r"   )   sV    MMN6:Hhx223:GTJJr   r"   )yestrue1zQGIS_WfsOutputExtension-i   handlerstreamc                     t        t              }|j                  |      }|r9| j                  |d |        | j	                          |j                  |      }|r8y y )N)	bytearray
CHUNK_SIZEreadinto
appendBodysendResponse)r6   r7   data	num_bytess       r    stream_bytesr@   @   sS     Z D%I
4
+,OOD)	 r   c            	            e Zd Zededdf fd       Zed        ZddZedede	de
fd	       Zed
edede	de
fd       Zedd       Z xZS )	WFSFilterserver_ifacereturnNc                     t         |   |       || _        t               | _        t        j                  dd      j                         t        v | _	        d | _
        y )NDEBUG_WFSOUTPUTEXTENSIONr,   )super__init__rC   r   loggerosgetenvlowerTRUE_STR
debug_modecontext)selfrC   	__class__s     r    rH   zWFSFilter.__init__M   sK    &(h))$>CIIKxW +/r   c           
      R   d | _         | j                         j                         }|j                         }|j	                  dd      j                         }|dk7  ry |j	                  dd      j                         }|dk7  ry |j	                  dd      j                         }t        j                  |      }|sy |j                  dd       | j                  r&d }t        t        j                  t                    }n/t        j                  t              }t        |j                         }d	| }	|j#                  d
      }
t%        |||j	                  dd      d|	|||
      | _         | j&                  j)                  d|
xs d d       |j+                          |j-                  d|j.                         |j0                  r+|j-                  dd| j                   j2                   d       y |j-                  dd| j                   j2                   d|j4                   d       y )NSERVICEr,   WFSREQUEST
GETFEATUREOUTPUTFORMATGML2)prefixzto-zX-Request-IdTYPENAMEgml_features)r#   r(   r$   r%   r&   r)   r'   r-   zREQ_ID:-z	 request acceptedContent-TypeContent-Dispositionattachment; filename=".zip".")rO   serverInterfacerequestHandlerparameterMapgetupperrL   r   findsetParameterrN   r   r0   mkdtempTMPDIR_PREFIXr1   namerequestHeaderr"   rI   infoclearsetResponseHeadercontent_typezipr$   filename_ext)rP   r6   paramsservicerequestr#   r(   r)   r'   r&   r-   s              r    requestReadyzWFSFilter.requestReadyW   s    &&(779%%' **Y+113e **Y+113l" 

>26<<>)..}= ^V4 ??HH,,MBCH  22-HHHMM*H 0**>:
 '/ ZZ
B/#-!
 	7:#4"55HIJ 	!!.2C2P2PQ  %%%)?@U@U?VV['\^ %%%()>)>(?qARA_A_@``abdr   c                 
   | j                   r| j                   j                  ry | j                   }| j                         j                         }|j	                         j                         j                  d      }|j                  j                  |j                   d      }|j                  d      5 }|j                  d      dk(  r |j                  |j	                                n7dd l}|j                  dd|      }|j                  |j                  d             d d d        |j                   }|j#                         s|j%                          |j'                  d	|j(                         |j*                  r!|j'                  d
d|j,                   d       n>|j'                  d
d|j,                   d|j.                   d       n|j1                          |j3                         j5                  d      r	 d|_        | j9                  ||       y y # 1 sw Y   xY w# t:        $ rW}| j<                  j?                  |       d|_        |j1                          |jA                  tC        dd             Y d }~y d }~ww xY w)Nutf8.gmlabzxsi:schemaLocationr   zxsi:schemaLocation=\".*\"zxsi:schemaLocation=""r]   r^   r_   r`   ra   rb   </wfs:FeatureCollection>TInternal error  )"rO   r+   rc   rd   bodyr>   decoder'   joinpathr%   openrh   writeresubencoder(   headersSentro   rp   rq   rr   r$   rs   	clearBodyrstripendswithr*   send_output_file	ExceptionrI   log_exceptionsetServiceExceptionr   )	rP   rO   r6   r>   output_filefr   r(   es	            r    r=   zWFSFilter.sendResponse   s0   ||t||66,,&&(779 ||~""$++F3&&//73C3C2DD0IJd# 	-qyy-."4' vv:<SUYZF+,	- $55 ""$MMO%%n6G6T6TU $$)))-CGDTDTCUUZ+[] ))),W-=-=,>a@Q@^@^?__`ac ;;=!!"<=W"&%%gw7	 >7	- 	-@  W))!,%)"!!#++,>?OQT,UVV	Ws&   4A,H;H" H"	J+AI==Jr6   rO   c                 	   |j                   }| j                  j                  d|j                          |j                  }|j                         }| j                  |||      }|j                  j                  |j                   d      }|r| dn| }t        |dd      }	| j                  j                  d|        |	j                         st        d| d      |j                  j                  |j                   d	|j                         }
| j                  j                  d
|j                   d|
        t        j                          }|j                  |_        d|_        |j&                  rEt)        |	j+                         t-        |j&                        t/        j0                               |_        |j4                  r|j4                  |_        t        j8                  |	t;        |
      t/        j0                         j=                         |      \  }}}}|t        j>                  k7  r-|jA                  d       | j                  jC                  |       y|tD        jF                  k(  rb|j                  j                  |j                   d      }|jI                  dd      5 }|jK                  |j$                   d       ddd       |jL                  rNddl'}	 ddl(}|jR                  }|j                  j                  |j                   d      }| j                  j                  d|        |jY                  |d      5 }|j                   d	|j                   }|jK                  |
||       |jZ                  D ]b  }|j                  j                  |j                   d	|       }|j]                         s>|j                   d	| }|jK                  |||       d |j_                          ddd       |jI                  d      5 }ta        ||       	 ddd       y| j                  j                  d       |
jI                  d      5 }ta        ||       	 ddd       y# 1 sw Y   xY w# tT        $ r |jV                  }Y w xY w# 1 sw Y   xY w# 1 sw Y   nxY w# 1 sw Y   nxY w|jA                  d       | j                  jC                  d       y)z` Process the request.

        :raise ProcessingRequestException when there is an error
        zWFS request to get format rz   z|option:FORCE_SRS_DETECTION=YESqgis_server_wfs_featuresogrzTemporary GML file is zOutput layer z is not valid.ra   z
Temporary z	 file is utf-8r   Fz.cpgwry   )encoding
Nr   z.zipzZipping the output in )compress_typearcnamerbTzSending the output filezError no output file)1r(   rI   rn   ogr_providerr$   requestHeadersxsd_for_layerr'   r   r%   r   isValidr   r&   rs   r   SaveVectorOptions
driverNamefileEncoding	force_crsr	   crsr   r
   instancectogr_datasource_optionsdatasourceOptionswriteAsVectorFormatV3r.   transformContextNoErrorr<   criticalr   Shpr   r   rr   zipfilezlibZIP_DEFLATEDImportError
ZIP_STOREDZipFile
ext_to_zipexistscloser@   )rP   r6   rO   r(   	type_nameheadersresultgml_pathgml_urloutput_layerr   optionswrite_resulterror_message_cpg_filer   r   r   compressionzip_file_pathzfarc_filename	extension	file_paths                            r    r   zWFSFilter.send_output_file   s    $5556G6T6T5UVW $$	((*##Iw@ ##,,0@0@/A-FGBHXJ=>QYPZ%g/I5Q1';<##%,}WI^-TUU &&//''(*;*H*H)IJ
 	:&7&D&D%EY{m\] &779.;;& &&/  ",->-H-HI##%'GJ 33(9(P(PG% -@,U,U!224	-)mQ .666s#KK  / 1 11''00G4L4L3MT1RSHsV4 57//0345   1%22
 $,,559Q9Q8RRV6WXMKK5m_EF4  #*"2"2!315F5S5S4TU"-(   "3!=!= I ' 0 0 9 9W=U=U<VVWXaWb:c dI '')*1*:*:);1YK'H%*5$0 ! 	 
), ##D) QWa( 
 KK67!!$' 1Wa( Y5 5  1%001 ,   	334sI   -Q2&Q? A9R7RR'R32Q<?RRR$'R03R<r   r   c                    t        j                         }|j                         ddd|dd}ddj                  d |j	                         D              z   }t        |t        j                  |d	      }| j                  j                         j                  dd      }t               }	|j                  ||	|       |	j                          | j                  j                  d
|	j!                          d|        t#        |	j%                               j'                  d      }
|
dk(  r| j                  j)                  d       y|	j!                         dk7  r-| j                  j)                  d|	j!                                 y|j*                  j-                  |j.                   d      j1                  d      5 }|j3                  |
       d	d	d	       y# 1 sw Y   yxY w)z# Get the XSD describing the layer. rT   1.0.0DescribeFeatureType	XMLSCHEMA)MAPrS   VERSIONrU   rZ   OUTPUT?&c              3   0   K   | ]  \  }}| d |   yw)=Nr   ).0keyvalues      r    	<genexpr>z*WFSFilter.xsd_for_layer.<locals>.<genexpr>S  s     %\:3Qug&6%\s   NzFetching XSD : HTTP code z
, request ry   r,   z%Content for the XSD request is empty.F   z,HTTP error when requesting the XSD : return z.xsdr   T)r
   r   fileNamejoinitemsr   r   	GetMethodrC   serviceRegistry
getServicer   executeRequestflushrI   rn   
statusCodebytesr   r   r   r'   r   r%   r   r   )rP   r   r   rO   project
parametersquery_stringrv   ru   responsecontentr   s               r    r   zWFSFilter.xsd_for_layerD  s   
 %%'##%,!!

 SXX%\IYIYI[%\\\(&&	
 ##335@@P*,w':4X5H5H5J4K:VbUcde(//7b=KK  !HI C'KK  #OPXPcPcPeOf!gh&&'*:*:);4'@AFFsK 	qGGG	 	 s   7GGc                    | j                   }d | _         |r|j                  ry | j                         j                         }|j	                         }|j                  dd      j                         }|dk7  ry |j                  dd      j                         }|dvry |dk(  r|r|j                  su	 |j                          |j                  j                  |j                   d      j                  d      5 }|j                  d	       d d d        | j                  ||       y y |dk(  r=|j+                         j-                         }t/        j0                  |      }	d}
|	j2                  j4                  d   j6                  dk(  ru|	j9                  d      D ]_  }|	j9                  d      D ]I  }d}
t:        D ]<  }|	j=                  |j>                  j                               }|jA                  |       > K a n|	j9                  d      D ]  }|j9                  d      D ]  }d|j4                  vr|j4                  d   j6                  dk7  r/|j9                  d      D ]  }d|j4                  vr|j4                  d   j6                  dk7  r/d}
t:        D ]^  }|	j=                  d      }|	jC                  |j>                  j                               }|jA                  |       |jA                  |       `    |
r| j                   jE                  d       n| j                   jE                  d       |j                          |jG                  |	jI                  d             y y # 1 sw Y   bxY w# t        $ rk}| j                   j#                  d
       | j                   j%                  |       |j                          |j'                  t)        dd             Y d }~y d }~ww xY w)NrS   r,   rT   rU   )GETCAPABILITIESrV   rV   rz   ar}   z0Critical exception when processing the request :r~   r   r   Fversionr   
GetFeatureResultFormatTzows:OperationsMetadatazows:Operationrl   zows:ParameteroutputFormatz	ows:Valuez2All formats have been added in the GetCapabilitiesz1No formats have been added in the GetCapabilitiesr   )%rO   r+   rc   rd   re   rf   rg   r*   r   r'   r   r%   r   r   r   r   rI   r   r   r   r   r   r>   r   parseStringdocumentElement
attributesr   getElementsByTagNamer   createElementrs   appendChildcreateTextNodern   r<   toxml)rP   rO   r6   rt   ru   rv   r   r   r>   domformats_addedr   result_format_nodeoutputformat_nodeoperation_metadata_nodeoperation_node
param_node
value_node	text_nodes                       r    responseCompletezWFSFilter.responseCompletep  s    ,, w)) &&(779%%'**Y+113e**Y+113;;l"w??
[%%' ))22g6F6F5Gt3LMRRSVW <[\ :;<))'7; ''<<>&&(D%%d+C!M""--i8>>'I11,? HA.1.F.F~.V H*(,&3 HF*-*;*;F<O<O<U<U<W*XK.::;GHHH 03/G/GH`/a C+*A*V*VWf*g C!)B)BB$)44V<BBlR$*8*M*Mo*^ CJ%Z-B-BB ()44V<BBnT (,0M*7 C-0->->{-K
,/,>,>v?R?R?X?X?Z,[	 * 6 6y A * 6 6z B	CCCC,   !UV  !TUsyy12[ (< < ! [KK(()[\KK--a0%%'//0BCSUX0YZZ[s2   0AM6 7M)	M6 )M3.M6 6	O*?A!O%%O*)rD   N)r   r   r   r   r   rH   rw   r=   r   r"   r2   r   r.   dictr   r  __classcell__)rQ   s   @r    rB   rB   L   s    /%7 /D / / @d @dD1Wf t(9 tG tPT t tl )s )T )G )PT ) )V S Sr   rB   )+__copyright____license__	__email__rJ   r0   dataclassesr   ior   pathlibr   typingr   xml.domr   	qgis.corer   r	   r
   r   r   qgis.serverr   r   r   r   r   r   r   wfsOutputExtension.definitionsr   r   wfsOutputExtension.loggingr   r   r   r   r"   rM   rk   r:   r@   rB   r   r   r    <module>r     s   &	 	  !        A ;	 	     * 
	*+ 	*^ 	*x xr   