U
    TGˆh¬  ã                   @   sà   d Z dZdZddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZ ddlmZmZmZ ddlmZmZmZmZ dd	lmZmZm Z m!Z!m"Z" dd
l#m$Z$ ddl%m&Z& ddl'm(Z( G dd„ deƒZ)dS )zCopyright 2021, 3LizzGPL version 3zinfo@3liz.orgé    N)ÚDict)ÚQgisÚQgsDistanceAreaÚQgsExpressionÚQgsExpressionContextÚQgsExpressionContextUtilsÚ
QgsFeatureÚQgsFeatureRequestÚQgsFieldÚ	QgsFieldsÚQgsJsonExporterÚQgsJsonUtilsÚ
QgsProject)Ú	QMetaTypeÚ
QTextCodecÚQVariant)ÚQgsRequestHandlerÚQgsServerRequestÚQgsServerResponseÚ
QgsService)Úfind_vector_layerÚget_lizmap_groupsÚget_lizmap_user_loginÚget_server_fidÚwrite_json_response)ÚExpressionServiceError)ÚLogger)Úto_boolc                   @   s¼   e Zd Zedœdd„Zedœdd„Zeeeddœdd	„Z	e
eeef eedd
œdd„ƒZe
eeef eedd
œdd„ƒZe
eeef eedd
œdd„ƒZe
eeef eedd
œdd„ƒZdS )ÚExpressionService)Úreturnc                 C   s   dS )z Service name
        Ú
EXPRESSION© ©Úselfr!   r!   úB/var/www/lizmap/lizmap/plugins/lizmap_server/expression_service.pyÚname.   s    zExpressionService.namec                 C   s   dS )z Service version
        z1.0.0r!   r"   r!   r!   r$   Úversion3   s    zExpressionService.versionN)ÚrequestÚresponseÚprojectr   c              
   C   s€  t ||ƒ}t|ƒ}t|ƒ}| ¡ }||d< t|ƒ|d< | |¡ | ¡ }zÄ| dd¡ ¡ }	zt	| 
¡ ƒ ¡  W n( tk
r–   tdd|	› ddƒ‚Y nX |	d	kr°|  |||¡ nZ|	d
krÈ|  |||¡ nB|	dkrà|  |||¡ n*|	dkrø|  |||¡ ntdd |	¡dƒ‚W nn tk
r: }
 z|
 |¡ W 5 d}
~
X Y nB tk
rz } z"t |¡ tddƒ}
|
 |¡ W 5 d}~X Y nX dS )z( Execute a 'EXPRESSION' request
        Zlizmap_userZlizmap_user_groupsÚREQUESTÚ úBad request errorzInvalid POST DATA for 'ú'é  ZEVALUATEZREPLACEEXPRESSIONTEXTZGETFEATUREWITHFORMSCOPEZVIRTUALFIELDSz…Invalid REQUEST parameter: must be one of 'Evaluate', 'ReplaceExpressionText', 'GetFeatureWithFormScope', 'VirtualFields'; found '{}'NzInternal server errorzInternal 'lizmap' service error)r   r   r   ÚcustomVariablesÚlistÚsetCustomVariablesÚ
parametersÚgetÚupperÚbytesÚdataÚdecodeÚ	Exceptionr   ÚevaluateÚreplace_expression_textÚget_feature_with_form_scopeÚvirtualFieldsÚformatZformatResponser   Úlog_exception)r#   r'   r(   r)   Zrequest_handlerÚgroupsZ
user_loginZ
custom_varÚparamsZreqparamÚerrÚer!   r!   r$   ÚexecuteRequest>   sN    


ý
ÿü

z ExpressionService.executeRequest)r@   r(   r)   r   c               
   C   s4  t ƒ }|  dd¡}|s"tdddƒ‚t||ƒ}|sDtdd|› ddƒ‚|  dd¡}|s||  d	d¡}|sptdd
dƒ‚d|› d}zt |¡}W nB tk
rÌ   | d|› dt 	¡ › ¡ tdd|› ddƒ‚Y nX t
ƒ }	|	 t ¡ ¡ |	 t |¡¡ |	 t |¡¡ tƒ }
|
 | ¡ | ¡ ¡ |
 | ¡ ¡ i }g }g }t|tƒrLt|ƒ}nt|tƒr`| ¡ }|D ]’\}}t|ƒ}| |
¡ | | ¡ ¡ | |  ¡ ¡ | !¡ rÂ| "d|› d| #¡ › ¡ qd| $¡ sâ| "d|› d¡ qd| %|	¡ |||< qd|rtdd &d '|¡¡dƒ‚|  dd¡}|sF|  dd¡}|rFd| d }dg g ddœ}|sÞi }i }| ¡ D ]H\}}| (|	¡}| )¡ rœd||< | *¡ ||< nt t+ ,|¡¡||< qj|d  "|¡ |d   "|¡ t-||ƒ dS zt |¡}W nD tk
r0   | d!|› dt 	¡ › ¡ tdd"|› ddƒ‚Y nX |rRt|tƒrRt.|ƒdkrftdd"|› ddƒ‚d#|d ks†|d d# d$kr˜tdd% &|¡dƒ‚t+ /d&| d' t0 1d(¡¡}t+ 2d&| d' |t0 1d(¡¡}|sætdd)|› dƒ‚t3| 4¡ ƒ}| 5|¡ t6|  d*¡ƒ}|D ]}t7|ƒ}| 8| 9¡ ¡ | 4¡ D ].}| :¡ }| ;|¡d+kr2| <||| ¡ q2|rx|	 t =|¡¡ |	 >|¡ |	 ?| 4¡ ¡ i }i }| ¡ D ]d\}}|r¸| %|	¡ | (|	¡}| )¡ râd||< | *¡ ||< n t t+ ,|¡¡||< | @¡ ||< q |d  "|¡ |d   "|¡ qt-||ƒ dS ),a    Evaluate expressions against layer or features
        In parameters:
            LAYER=wms-layer-name
            EXPRESSION=An expression to evaluate
            or
            EXPRESSIONS=["first expression", "second expression"]
            or
            EXPRESSIONS={"key1": "first expression", "key2": "second expression"}
            // optionals
            FEATURE={"type": "Feature", "geometry": {}, "properties": {}}
            or
            FEATURES=[{"type": "Feature", "geometry": {}, "properties": {}}, {"type": "Feature", "geometry": {},
            "properties": {}}]
            FORM_SCOPE=boolean to add formScope based on provided features
        ÚLAYERr+   r,   z8Invalid 'Evaluate' REQUEST: LAYER parameter is mandatoryr.   z(Invalid LAYER parameter for 'Evaluate': ú	 providedZEXPRESSIONSr    zLInvalid 'Evaluate' REQUEST: EXPRESSION or EXPRESSIONS parameter is mandatoryú["ú"]zJSON loads expressions 'ú' exception:
z)Invalid 'Evaluate' REQUEST: EXPRESSIONS 'ú' are not well formedúError "ú": úExpression not valid "ú"z&Invalid EXPRESSIONS for 'Evaluate':
{}Ú
ÚFEATURESÚFEATUREú[ú]Úsuccessr   ©ÚstatusÚresultsÚerrorsÚfeaturesNrV   rW   úJSON loads features 'ú&Invalid 'Evaluate' REQUEST: FEATURES 'ÚtypeÚFeatureú_Invalid 'Evaluate' REQUEST: FEATURES '{}' are not well formed: type not defined or not Feature.ú){ "type": "FeatureCollection","features":ú}úUTF-8zEInvalid FEATURES for 'Evaluate': not GeoJSON features array provided
Ú
FORM_SCOPEéÿÿÿÿ)Ar   r3   r   r   ÚjsonÚloadsr8   ÚcriticalÚ	tracebackÚ
format_excr   ÚappendScoper   ÚglobalScopeÚprojectScopeÚ
layerScoper   ÚsetSourceCrsÚcrsÚtransformContextÚsetEllipsoidÚ	ellipsoidÚ
isinstancer0   Ú	enumerateÚdictÚitemsr   ÚsetGeomCalculatorÚsetDistanceUnitsÚdistanceUnitsÚsetAreaUnitsÚ	areaUnitsÚhasParserErrorÚappendÚparserErrorStringÚisValidÚpreparer=   Újoinr9   ÚhasEvalErrorÚevalErrorStringr   ÚencodeValuer   ÚlenÚstringToFieldsr   ÚcodecForNameÚstringToFeatureListr   ÚfieldsÚextendr   r   ÚsetGeometryÚgeometryr%   ÚindexOfÚsetAttributeÚ	formScopeÚ
setFeatureÚ	setFieldsÚ
expression) r@   r(   r)   ÚloggerÚ
layer_nameÚlayerZexpressionsr   Zexp_jsonÚexp_contextÚdaÚexp_mapÚexp_parser_errorsZ	exp_itemsÚkrB   ÚexprX   ÚfeatureÚbodyÚresultÚerrorÚvalueÚgeojsonÚfeature_fieldsÚfeature_listÚfeat_fieldsÚadd_form_scopeÚfÚfeatÚfieldÚ
field_namer!   r!   r$   r9   q   sB   ý

ýýÿ
ý





ýü


ÿ
ý
 
ý ÿü
þ
ýý






zExpressionService.evaluatec               
   C   sL  t ƒ }|  dd¡}|s"tdddƒ‚t||ƒ}|sDtdd|› ddƒ‚|  dd¡}|s||  d	d¡}|sptdd
dƒ‚d|› d}zt |¡}W nB tk
rÌ   | d|› dt 	¡ › ¡ tdd|› ddƒ‚Y nX |  dd¡}	|	sú|  dd¡}
|
rúd|
 d }	t
ƒ }| t ¡ ¡ | t |¡¡ | t |¡¡ tƒ }| | ¡ | ¡ ¡ | | ¡ ¡ i }g }t|tƒrtt|ƒ}nt|tƒrˆ| ¡ }|D ]\}}|||< qŒdg g ddœ}|	s
i }| ¡ D ],\}}t |||¡}t t |¡¡||< qÀ|d  |¡ t ||ƒ dS |	 !¡ dkr*| "¡ }| #¡ }nðzt |	¡}W nD tk
r|   | d|	› dt 	¡ › ¡ tdd|	› ddƒ‚Y nX |ržt|tƒržt$|ƒdkr²tdd|	› ddƒ‚d|d ksÒ|d d dkrätdd %|	¡dƒ‚t &d |	 d! t' (d"¡¡}t )d |	 d! |t' (d"¡¡}|s2tdd# %|	¡dƒ‚t*| "¡ ƒ}| +|¡ t,|  d$¡ƒ}|  d%d¡ !¡ d&k}|rÖt-ƒ }| | ¡ ¡ t*ƒ }| .¡ D ]@}t/ 0¡ d'k r¶t1t2|ƒt3j4ƒ}nt1t2|ƒt5j6ƒ}| |¡ q’nd}d}|D ]}t7|ƒ}| 8| 9¡ ¡ | "¡ D ].}| :¡ }| ;|¡d(kr| <||| ¡ q|rL| t =|¡¡ | >|¡ | ?| "¡ ¡ i }| ¡ D ],\}}t |||¡}t t |¡¡||< qp|rèt7|| @¡ ƒ}
|
 8| 9¡ ¡ |
 At| B¡ ƒ¡ |d  | C|
¡¡ n|d  |¡ qâ|r>| Dd)¡ | Ed*d+¡ | Fd, Gd-d.d, G|d ¡ d/ g¡¡ n
t ||ƒ dS )0av   Replace expression texts against layer or features

        In parameters:
            LAYER=wms-layer-name
            STRING=A string with expression between [% and %]
            or
            STRINGS=["first string with expression", "second string with expression"]
            or
            STRINGS={"key1": "first string with expression", "key2": "second string with expression"}
            // optionals
            FEATURE={"type": "Feature", "geometry": {}, "properties": {}}
            or
            FEATURES=[{"type": "Feature", "geometry": {}, "properties": {}}, {"type": "Feature", "geometry": {},
            "properties": {}}]
            or
            FEATURES=ALL to get Replace expression texts for all features of the layer
            FORM_SCOPE=boolean to add formScope based on provided features
            FORMAT=GeoJSON to get response as GeoJSON
        rD   r+   r,   zEInvalid 'ReplaceExpressionText' REQUEST: LAYER parameter is mandatoryr.   z5Invalid LAYER parameter for 'ReplaceExpressionText': rE   ZSTRINGSÚSTRINGzQInvalid 'ReplaceExpressionText' REQUEST: STRING or STRINGS parameter is mandatoryrF   rG   zJSON loads strings 'rH   z2Invalid 'ReplaceExpressionText' REQUEST: STRINGS 'rI   rO   rP   rQ   rR   rS   r   rT   rV   NZALLrY   rZ   r[   r\   r]   r^   r_   r`   zTInvalid FEATURES for 'ReplaceExpressionText': not GeoJSON features array provided
{}ra   ZFORMATÚGEOJSONi„  rb   éÈ   úContent-Typez'application/vnd.geo+json; charset=utf-8ú,
z{"type": "FeatureCollection"z"features": [ú]})Hr   r3   r   r   rc   rd   r8   re   rf   rg   r   rh   r   ri   rj   rk   r   rl   rm   rn   ro   rp   rq   r0   rr   rs   rt   r   ZreplaceExpressionTextr   r‚   r{   r   r4   r‡   ÚgetFeaturesrƒ   r=   r„   r   r…   r†   r   rˆ   r   r   Úkeysr   Ú
versionIntr
   Ústrr   ÚStringr   ZQStringr   r‰   rŠ   r%   r‹   rŒ   r   rŽ   r   ÚidÚsetAttributesÚvaluesÚexportFeatureÚsetStatusCodeÚ	setHeaderÚwriter   ) r@   r(   r)   r‘   r’   r“   ZstringsZ
the_stringZstr_jsonrX   rš   r”   r•   Zstr_mapZ	str_itemsr˜   Úsr›   rœ   rž   r    r¡   rŸ   r¢   r£   Zgeojson_outputZexporterZgeojson_fieldsr¦   r¤   r¥   r§   r!   r!   r$   r:   K  sB   ý

ýýÿ
ý

ü

ÿ
ý
 
ý ÿü
þ
ýÿü



þÿ
z)ExpressionService.replace_expression_textc              
   C   s  t ƒ }|  dd¡}|s"tdddƒ‚t||ƒ}|sDtdd|› ddƒ‚|  dd¡}|s`tdd	dƒ‚|  d
d¡}|s|tdddƒ‚zt |¡}W n@ tk
rÊ   | d|› dt 	¡ › ¡ tdd 
|¡dƒ‚Y nX |rÚt|tƒsìtdd 
|¡dƒ‚d|ks|d dkrtdd 
|¡dƒ‚t |t d¡¡}	t ||	t d¡¡}
|
sTtdd 
|¡dƒ‚t|
ƒdkrttdd 
|¡dƒ‚|
d }|  dd¡}d}|r~zt |¡}W nB tk
râ   | d|› dt 	¡ › ¡ tdd 
|¡dƒ‚Y nX |röt|tƒstdd 
|¡dƒ‚| d¡dkr*tdd 
|¡dƒ‚t |t d¡¡}t ||t d¡¡}|rdt|ƒdkrvtdd 
|¡dƒ‚|d }tƒ }| t ¡ ¡ | t |¡¡ | t |¡¡ | t |¡¡ |rØ| t |¡¡ tƒ }| | ¡ | ¡ ¡ | |  ¡ ¡ t!|ƒ}| "|¡ | #| $¡ ¡ | %| &¡ ¡ | '¡ rPtdd 
|| (¡ ¡dƒ‚| )¡ sltdd 
|¡dƒ‚| *|¡ t+||ƒ}t,|  d¡ƒ}|s | -t+j.¡ | /¡ }dd„ |D ƒ}| 0¡ }d d„ |  d!d¡ 1d"¡D ƒ}|D ]}| 2| 3|¡¡ qÞ| 4d#¡ | 5d$d%¡ | 6d&¡ | 7¡  t8|ƒ}|r6| 9|¡ d}| :|¡D ]<}|d' t;||ƒ }| 6|| <|i |¡ ¡ | 7¡  d(}qD| 6d)¡ dS )*a²   Get filtered features with a form scope

        In parameters:
            LAYER=wms-layer-name
            FILTER=An expression to filter layer
            FORM_FEATURE={"type": "Feature", "geometry": {}, "properties": {}}
            // optionals
            PARENT_FEATURE={"type": "Feature", "geometry": {}, "properties": {}}
            FIELDS=list of requested field separated by comma
            WITH_GEOMETRY=False
        rD   r+   r,   zGInvalid 'GetFeatureWithFormScope' REQUEST: LAYER parameter is mandatoryr.   z,Invalid LAYER parameter for 'VirtualField': rE   ÚFILTERzHInvalid 'GetFeatureWithFormScope' REQUEST: FILTER parameter is mandatoryZFORM_FEATUREzNInvalid 'GetFeatureWithFormScope' REQUEST: FORM_FEATURE parameter is mandatoryzJSON loads form feature 'rH   zPInvalid 'GetFeatureWithFormScope' REQUEST: FORM_FEATURE '{}' are not well formedr[   r\   zrInvalid 'GetFeatureWithFormScope' REQUEST: FORM_FEATURE '{}' are not well formed: type not defined or not Feature.r`   zSInvalid FORM_FEATURE for 'GetFeatureWithFormScope': not GeoJSON feature provided
{}é   r   ZPARENT_FEATURENzRInvalid 'GetFeatureWithFormScope' REQUEST: PARENT_FEATURE '{}' are not well formedztInvalid 'GetFeatureWithFormScope' REQUEST: PARENT_FEATURE '{}' are not well formed: type not defined or not Feature.zUInvalid PARENT_FEATURE for 'GetFeatureWithFormScope': not GeoJSON feature provided
{}z<Invalid FILTER for 'GetFeatureWithFormScope': Error "{}": {}zGInvalid FILTER for 'GetFeatureWithFormScope': Expression not valid "{}"ÚWITH_GEOMETRYc                 S   s   g | ]}|‘qS r!   r!   ©Ú.0Úir!   r!   r$   Ú
<listcomp>í  s     zAExpressionService.get_feature_with_form_scope.<locals>.<listcomp>c                 S   s   g | ]}|r|  ¡ ‘qS r!   ©Ústrip©r¿   r¤   r!   r!   r$   rÁ   ï  s      ÚFIELDSú,rª   r«   úapplication/jsonú*{ "type": "FeatureCollection","features":[Ú.r¬   r­   )=r   r3   r   r   rc   rd   r8   re   rf   rg   r=   rq   rs   r   r„   r   r…   r†   rƒ   r   rh   r   ri   rj   rk   r   ZparentFormScoper   rl   rm   rn   ro   rp   r   ru   rv   rw   rx   ry   rz   r|   r}   r~   r	   r   ÚsetFlagsÚ
NoGeometryÚprimaryKeyAttributesr‡   Úsplitr{   r‹   r·   r¸   r¹   Úflushr   r´   r®   r   r¶   )r@   r(   r)   r‘   r’   r“   Z
exp_filterZform_featurerŸ   Zform_feature_fieldsZform_feature_listZ	form_featZparent_featureZparent_featZparent_feature_fieldsZparent_feature_listr”   r•   Zexp_fÚreqÚ	with_geomÚpk_attributesÚattribute_listr‡   Úr_fieldsr¤   Újson_exporterÚ	separatorr¥   Úfidr!   r!   r$   r;   '  s„   ý

ýýýÿÿü
ÿüÿþüþýÿüÿüÿÿü
ÿüÿþüþýÿþü

 ÿü
ÿü





z-ExpressionService.get_feature_with_form_scopec           #   
   C   sÈ  t ƒ }|  dd¡}|s"tdddƒ‚t||ƒ}|sDtdd|› ddƒ‚|  dd¡}|s`tdd	dƒ‚zt |¡}W nB tk
r°   | d
|› dt 	¡ › ¡ tdd|› ddƒ‚Y nX t
|tƒsÐtdd|› ddƒ‚tƒ }| t ¡ ¡ | t |¡¡ | t |¡¡ tƒ }	|	 | ¡ | ¡ ¡ |	 | ¡ ¡ i }
g }| ¡ D ]’\}}t|ƒ}| |	¡ | | ¡ ¡ | | ¡ ¡ | ¡ rš|  d|› d| !¡ › ¡ q<| "¡ sº|  d|› d¡ q<| #|¡ ||
|< q<|rîtdd $d %|¡¡dƒ‚t&ƒ }|  dd¡}|rˆt|ƒ}| |	¡ | | ¡ ¡ | | ¡ ¡ | ¡ rVtdd $|| !¡ ¡dƒ‚| "¡ sttdd|› ddƒ‚| #|¡ t&||ƒ}|  dd¡}z| 't(|ƒ¡ W n* t)k
rÐ   tdd|› ddƒ‚Y nX |  dd¡ *¡ }|dkr|  dd¡}t& +||dk¡}| ,t& -|g¡¡ n|dkr:tdd|› ddƒ‚t.|  d¡ƒ}|sZ| /t&j0¡ | 1¡ }d d!„ |D ƒ}| 2¡ }d"d!„ |  d#d¡ 3d$¡D ƒ}|D ]}|  | 4|¡¡ q˜| 5d%¡ | 6d&d'¡ | 7d(¡ | 8¡  t9|ƒ}|rð| :|¡ d}| ;|¡D ]º}|d) t<||ƒ }i } | =|¡ | >| 2¡ ¡ i }!|
 ¡ D ]T\}}| ?|¡}"| @¡ rnd*| |< | A¡ |!|< n t tB C|"¡¡| |< | D¡ |!|< q<| 7|| E|| |¡ ¡ | 8¡  d+}qþ| 7d,¡ d*S )-a   Get virtual fields for features

        In parameters:
            LAYER=wms-layer-name
            VIRTUALS={"key1": "first expression", "key2": "second expression"}
            // optionals
            FILTER=An expression to filter layer
            FIELDS=list of requested field separated by comma
            WITH_GEOMETRY=False
            LIMIT=number of features to return or nothing to return all
            SORTING_ORDER=asc or desc, default = asc
            SORTING_FIELD=field name to sort by
        rD   r+   r,   z=Invalid 'VirtualFields' REQUEST: LAYER parameter is mandatoryr.   z-Invalid LAYER parameter for 'VirtualFields': rE   ZVIRTUALSz@Invalid 'VirtualFields' REQUEST: VIRTUALS parameter is mandatoryzJSON loads virtuals 'rH   z+Invalid 'VirtualFields' REQUEST: VIRTUALS 'rI   rJ   rK   rL   rM   z(Invalid VIRTUALS for 'VirtualFields':
{}rN   r»   z1Invalid FILTER for 'VirtualFields' Error "{}": {}z9Invalid FILTER for 'VirtualFields' Expression not valid "ZLIMITz-1z$Invalid LIMIT for 'VirtualFields': "ZSORTING_ORDER)ÚascZdescZSORTING_FIELDr×   z,Invalid SORTING_ORDER for 'VirtualFields': "r½   c                 S   s   g | ]}|‘qS r!   r!   r¾   r!   r!   r$   rÁ   ž  s     z3ExpressionService.virtualFields.<locals>.<listcomp>c                 S   s   g | ]}|r|  ¡ ‘qS r!   rÂ   rÄ   r!   r!   r$   rÁ      s      rÅ   rÆ   rª   r«   rÇ   rÈ   rÉ   Nr¬   r­   )Fr   r3   r   r   rc   rd   r8   re   rf   rg   rq   rs   r   rh   r   ri   rj   rk   r   rl   rm   rn   ro   rp   rt   r   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r=   r   r	   ÚsetLimitÚintÚ
ValueErrorÚlowerZOrderByClauseÚ
setOrderByZOrderByr   rÊ   rË   rÌ   r‡   rÍ   r‹   r·   r¸   r¹   rÎ   r   r´   r®   r   rŽ   r   r9   r€   r   r   r‚   r   r¶   )#r@   r(   r)   r‘   r’   r“   ZvirtualsZvir_jsonr”   r•   r–   r—   r˜   rB   r™   rÏ   Z
req_filterZreq_expZ	req_limitZreq_sorting_order_paramZreq_sorting_fieldZorder_by_clauserÐ   rÑ   rÒ   r‡   rÓ   r¤   rÔ   rÕ   r¥   rÖ   ZextrarW   rž   r!   r!   r$   r<     s$   ý

ýýÿ
ý


ý



ý

 ÿü

ý


ý



ý






zExpressionService.virtualFields)Ú__name__Ú
__module__Ú__qualname__r±   r%   r&   r   r   r   rC   Ústaticmethodr   r9   r:   r;   r<   r!   r!   r!   r$   r   ,   s2    ÿ3 Z
   ÿ \
   ÿ _r   )*Ú__copyright__Ú__license__Ú	__email__rc   rf   Útypingr   Ú	qgis.corer   r   r   r   r   r   r	   r
   r   r   r   r   Zqgis.PyQt.QtCorer   r   r   Úqgis.serverr   r   r   r   Zlizmap_server.corer   r   r   r   r   Zlizmap_server.exceptionr   Úlizmap_server.loggerr   Úlizmap_server.toolsr   r   r!   r!   r!   r$   Ú<module>   s   8