U
    ô‰Vb/*  ã                   @   sn  d Z dZdZddlZddlZddlmZmZmZ ddl	m
Z
mZ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+eeef eeddœdd„Zdd„ Zeeedef dœdd„Zeeedœdd„Zeeedf dœdd„Zeeedf dœdd„Zeeeedf dœdd„Z eee dœd d!„Z!eedœd"d#„Z"ee#dœd$d%„Z$ee#dœd&d'„Z%eeed(œd)d*„Z&dS ),zCopyright 2021, 3LizzGPL version 3zinfo@3liz.orgé    N)ÚDictÚTupleÚUnion)ÚQgsExpressionÚ
QgsFeatureÚ	QgsFieldsÚQgsMapLayerÚ
QgsProjectÚQgsVectorLayer)ÚQgsRequestHandlerÚQgsServerResponse)ÚLogger)Úto_booléÈ   )ÚdataÚresponseÚcodeÚreturnc                 C   s:   |  |¡ | dd¡ t d | ¡¡ | t | ¡¡ dS )z Write data as JSON response. zContent-Typezapplication/jsonzSending JSON response : {}N)ÚsetStatusCodeÚ	setHeaderr   ÚinfoÚformatÚwriteÚjsonÚdumps)r   r   r   © r   ú./var/qgis-server/plugins/lizmap/server/core.pyÚwrite_json_response   s    
r   c                 C   s6   |   d|   dd¡¡}|sdS t||ƒ}|s.dS d|fS )z; Trying to find the layer in the URL in the given project. ÚLAYERÚlayerÚ )FNT)ÚgetÚfind_vector_layer)ÚparamsÚprojectÚ
layer_namer   r   r   r   Úfind_vector_layer_from_params    s    
r&   )r%   r$   r   c                 C   sx   |  ¡  ¡ D ]P}| ¡ tjkr q| ¡ | kr4|  S | ¡ | krH|  S | ¡ | kr|  S qt 	d 
| | ¡ ¡¡ dS )z6 Find vector layer with name, short name or layer id. z8The vector layer {} has not been found in the project {}N)Ú	mapLayersÚvaluesÚtyper   ÚVectorLayerÚnameÚ	shortNameÚidr   Úwarningr   ÚfileName)r%   r$   r   r   r   r   r"   0   s    
ÿr"   )ÚfeatureÚpk_attributesr   c                    s(   |st ˆ  ¡ ƒS d ‡ fdd„|D ƒ¡S )z Build server feature ID. ú@@c                    s   g | ]}t ˆ  |¡ƒ‘qS r   )ÚstrÚ	attribute)Ú.0Zpk©r0   r   r   Ú
<listcomp>J   s     z"get_server_fid.<locals>.<listcomp>)r3   r-   Újoin)r0   r1   r   r6   r   Úget_server_fidE   s    r9   )Úqgis_project_pathr   c                 C   sØ   t ƒ }tj | ¡sdS | d }tj |¡s8| d¡ dS t|dƒŒ}z>t | ¡ ¡}|sr| 	d¡ W W 5 Q R £ dS |W W  5 Q R £ S  t
k
rÈ } z(| d¡ | |¡ W Y ¢W 5 Q R £ dS d}~X Y nX W 5 Q R X dS )z2 Get the lizmap config based on QGIS project path Nz.cfgzLizmap config does not existÚrzLizmap config is emptyzLizmap config not well formed)r   ÚosÚpathÚexistsr   Úopenr   ÚloadsÚreadr.   Ú	ExceptionÚcriticalÚlog_exception)r:   ÚloggerZconfig_pathZcfg_fileZcfgÚer   r   r   Úget_lizmap_configM   s$    



rG   )Úconfigr   c                 C   sP   | sdS t ƒ }d| ks| d s,| d¡ dS | d }t|tƒsL| d¡ dS |S )z Get layers Lizmap config NÚlayerszLizmap config has no layersz Layers lizmap config is not dict)r   r.   Ú
isinstanceÚdict)rH   rE   Z
cfg_layersr   r   r   Úget_lizmap_layers_configq   s    


rL   )rH   r%   r   c                 C   sÊ   | rt | tƒsdS |r t |tƒs$dS tƒ }d| ks:| d sH| d¡ dS | d }||ks`|| st| d |¡¡ dS || }t |tƒsš| d |¡¡ dS d|ks²d|ks²d|krÆ| d	 |¡¡ dS |S )
z# Get loginFilteredLayers for layer NZloginFilteredLayersz(Lizmap config has no loginFilteredLayersz#Layer {} has no loginFilteredLayersz,loginFilteredLayers for layer {} is not dictZlayerIdZfilterAttributeZfilterPrivatez0loginFilteredLayers for layer {} not well formed)rJ   rK   r3   r   r   r   r.   )rH   r%   rE   Zlogin_filtered_layersZcfg_layer_login_filterr   r   r   Úget_lizmap_layer_login_filter‹   s0    

ÿþrM   )Úhandlerr   c                 C   sÖ   g }t ƒ }|  ¡ }|r^| d¡ | d¡}|dk	rhdd„ | d¡D ƒ}| d d |¡¡¡ n
| d¡ t|ƒd	kr|t|ƒS | d
¡ |  	¡ }|rÎ| d¡}|dk	rÎdd„ | d¡D ƒ}| d d |¡¡¡ t|ƒS )z0 Get Lizmap user groups provided by the request úRequest headers providedzX-Lizmap-User-GroupsNc                 S   s   g | ]}|  ¡ ‘qS r   ©Ústrip©r5   Úgr   r   r   r7   Ã   s     z%get_lizmap_groups.<locals>.<listcomp>ú,z*Lizmap user groups in request headers : {}úNo request headers providedr   z(No lizmap user groups in request headersÚLIZMAP_USER_GROUPSc                 S   s   g | ]}|  ¡ ‘qS r   rP   rR   r   r   r   r7   Ô   s     z%Lizmap user groups in parameters : {})
r   ÚrequestHeadersr   r!   Úsplitr   r8   ÚlenÚtupleÚparameterMap)rN   ÚgroupsrE   ÚheadersÚuser_groupsr#   r   r   r   Úget_lizmap_groupsµ   s(    




r_   c                 C   sš   d}t ƒ }|  ¡ }|rH| d¡ | d¡}|dk	rR|}| d |¡¡ n
| d¡ |rZ|S | d¡ |  ¡ }|r–| d¡}|dk	r–|}| d	 |¡¡ |S )
ú/ Get Lizmap user login provided by the request r    rO   zX-Lizmap-UserNz)Lizmap user login in request headers : {}rU   z'No lizmap user login in request headersÚLIZMAP_USERz$Lizmap user login in parameters : {})r   rW   r   r!   r   r[   )rN   ÚloginrE   r]   Ú
user_loginr#   r   r   r   Úget_lizmap_user_loginÛ   s(    




rd   c                 C   sª   d}t ƒ }|  ¡ }|rF| d¡ | d¡}|dk	rPt|ƒ}| d¡ n
| d¡ |dk	r\|S | d¡ |  ¡ }|r¦| d¡}|dk	r˜t|ƒ}| d¡ nd	}| d
¡ |S )r`   NrO   zX-Lizmap-Override-Filterz)Lizmap override filter in request headersrU   z,No lizmap override filter in request headersÚLIZMAP_OVERRIDE_FILTERz$Lizmap override filter in parametersFz'No lizmap override filter in parameters)r   rW   r   r!   r   r[   )rN   ÚoverriderE   r]   Zoverride_filterr#   r   r   r   Úget_lizmap_override_filterÿ   s,    





rg   c                 C   s’   t ƒ }|  ¡ }|r@| d¡}|dk	r@t|ƒ}| d |¡¡ |S | d¡ |  ¡ }|r„| d¡}|dk	r„t|ƒ}| d |¡¡ |S | d¡ dS )	z3 Check if headers are defining an editing context. zX-Lizmap-Edition-ContextNz7Lizmap editing context is found in request headers : {}z+No editing context found in request headersZLIZMAP_EDITION_CONTEXTz2Lizmap editing context is found in parameters : {}zDNo lizmap editing context filter in parameters : default value falseF)r   rW   r!   r   r   r   r[   )rN   rE   r]   Zediting_contextÚresultr#   r   r   r   Úis_editing_context&  s$    



ri   )r1   Úfieldsr   c                 C   sf   t |ƒdkrdS d}|  d¡}t|ƒD ]:\}}|dkr>|d7 }| |¡ ¡ }|t ||| ¡7 }q&|S )zo Port of QgsServerFeatureId::getExpressionFromServerFid.

    The value "@@" is hardcoded in the CPP file.
    r   r    r2   z AND )rY   rX   Ú	enumerateÚatr+   r   ZcreateFieldEqualityExpression)Z
feature_idr1   rj   Ú
expressionZ	pk_valuesÚiZpk_valueÚ
field_namer   r   r   Úserver_feature_id_expression@  s    
rp   )r   )'Ú__copyright__Ú__license__Ú	__email__r   r<   Útypingr   r   r   Ú	qgis.corer   r   r   r   r	   r
   Úqgis.serverr   r   Úlizmap.server.loggerr   Úlizmap.server.toolsr   r3   Úintr   r&   r"   Úlistr9   rG   rL   rM   r_   rd   Úboolrg   ri   rp   r   r   r   r   Ú<module>   s*    $*&$'