
    shk,              	          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
mZmZmZ ddl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(de
eef   dededdfdZd Zdededee   fdZdededee   fdZ dede!defdZ"dedee
df   fdZ# ed      dede$dee
df   fd       Z%d e
dee
df   fd!Z&d e
dedee
df   fd"Z'd#edee   fd$Z(d#edefd%Z)d#ede*fd&Z+d#ede*fd'Z,y))zCopyright 2021, 3LizzGPL version 3zinfo@3liz.org    N)	lru_cache)Path)DictOptionalTupleUnion)Qgis
QgsFeatureQgsMapLayer
QgsProjectQgsVectorLayer)QgsRequestHandlerQgsServerResponse)Logger)to_booldataresponsecodereturnc                     |j                  |       |j                  dd       t        j                  d|         |j	                  t        j                  |              y)z Write data as JSON response. zContent-Typezapplication/jsonzSending JSON response : N)setStatusCode	setHeaderr   infowritejsondumps)r   r   r   s      2/var/www/qgis-server/plugins/lizmap_server/core.pywrite_json_responser      sJ    4 ~'9:
KK*4&12NN4::d#$    c                 r    | j                  d| j                  dd            }|syt        ||      }|sy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"   s       r   find_vector_layer_from_paramsr)   !   sA     GVZZ%<=Jj'2E;r   r(   r'   c                 N   d}|j                         j                         D ]  }|j                         | k(  r|} nt        j                         dk  r|j                         | k(  r|} nUt        j                         dk\  r%|j                         j                         | k(  r|} n|j                         | k(  s|} n |s+t        j                  d|  d|j                          d       y|j                         s*t        j                  d|  d|j                          d       |S )z/ Find layer with name, short name or layer ID. Ni  zThe layer 'z%' has not been found in the project ''z5' has been found but it is not valid in the project ')	mapLayersvaluesnamer	   
versionInt	shortNameserverPropertiesidr   warningfileNameisValid)r(   r'   foundr"   s       r   
find_layerr7   1   s#   E""$++-  ::<:%E ??u$):j)HE__%'E,B,B,D,N,N,PT^,^E 88:#E%( *%J7K[K[K]J^^_`	b ==?* &  "#1&	
 Lr   c                 |    t        | |      }|sy|j                         t        j                  j                  k(  sy|S )z6 Find vector layer with name, short name or layer ID. N)r7   typer   	LayerTypeVectorLayer)r(   r'   r"   s      r   r%   r%   V   s6    z7+E::<;00<<<Lr   featurepk_attributesc           
          |st        | j                               S dj                  |D cg c]  }t        | j                  |             c}      S c c}w )z Build server feature ID. z@@)strr2   join	attribute)r<   r=   pks      r   get_server_fidrC   b   sC    7::<  99=IRc'++B/0IJJIs   !Aqgis_project_pathc                 N   t               }t        j                  j                  |       sy| dz   }t        j                  j                  |      s|j	                  d       yt        |      j                         j                  }|j	                  d| d|        t        ||      S )z2 Get the lizmap config based on QGIS project path Nz.cfgzLizmap config does not existz	Fetching z) cfg file with last modified timestamp : )	r   ospathexistsr   r   statst_mtime_get_lizmap_config)rD   loggerconfig_pathlast_modifieds       r   get_lizmap_configrO   j   s     XF 77>>+,  $f,K77>>+&23%**,55M
KK)K=(QR_Q`abk=99r   d   )maxsizerM   rN   c                 b   |}t               }t        |       5 }	 t        j                  |j	                               }|s|j                  d       	 ddd       y|cddd       S # t        $ r4}|j                  d       |j                  |       Y d}~ddd       yd}~ww xY w# 1 sw Y   yxY w)z> Get the lizmap config based on QGIS project path with cache. zLizmap config is emptyNzLizmap config not well formed)	r   openr   loadsreadr3   	Exceptioncriticallog_exception)rM   rN   _rL   cfg_filecfges          r   rK   rK      s     	AXF 
k	 h	**X]]_-C78     	OO;<  # 	 s4   B%6A%A%%	B"."BB%B""B%%B.configc                     | syt               }d| vs| d   s|j                  d       y| d   }t        |t              s|j                  d       y|S )z Get layers Lizmap config NlayerszLizmap config has no layersz Layers lizmap config is not dict)r   r3   
isinstancedict)r]   rL   
cfg_layerss      r   get_lizmap_layers_configrc      sb     XF vVH%545 !J j$'9: r   c                 ~   | rt        | t              sy|rt        |t              syt               }d| vs| d   s|j	                  d       y| d   }||vs||   s|j	                  d| d       y||   }t        |t              s|j                  d| d       yd|vsd	|vsd
|vr|j                  d| d       y|S )z# Get loginFilteredLayers for layer NloginFilteredLayersz(Lizmap config has no loginFilteredLayerszLayer z has no loginFilteredLayerszloginFilteredLayers for layer z is not dictlayerIdfilterAttributefilterPrivatez not well formed)r`   ra   r?   r   r   r3   )r]   r(   rL   login_filtered_layerscfg_layer_login_filters        r   get_lizmap_layer_login_filterrk      s     FD1Z
C8XF F*&9N2O>?"#89 ..6KJ6WfZL(CDE 3:> ,d37
|<PQ..%;;#997
|CSTU!!r   handlerc                    g }t               }| j                         }|rt|j                  d       |j                  d      }|a|j	                  d      D cg c]  }|j                          }}|j                  ddj                  |              n|j                  d       t        |      dk7  rt        |      S |j                  d       | j                         }|rb|j                  d      }|O|j	                  d      D cg c]  }|j                          }}|j                  d	dj                  |              t        |      S c c}w c c}w )
z0 Get Lizmap user groups provided by the request Request headers providedzX-Lizmap-User-Groups,z(Lizmap user groups in request headers : No request headers providedr   z(No lizmap user groups in request headersLIZMAP_USER_GROUPSz#Lizmap user groups in parameters : )
r   requestHeadersr   r$   splitstripr@   lentupleparameterMap)rl   groupsrL   headersuser_groupsgr&   s          r   get_lizmap_groupsr|      s9    FXF $$&G./kk"89")4):):3)?@Aaggi@F@KKB388FCSBTUV12
6{aV}
KK:; !!#Fjj!56")4):):3)?@Aaggi@F@KK=chhv>N=OPQ =+ A" As   EEc                 z   d}t               }| j                         }|r;|j                  d       |j                  d      }|(|}|j                  d|        n|j                  d       |r|S |j                  d       | j	                         }|r)|j                  d      }||}|j                  d|        |S )	/ Get Lizmap user login provided by the request r#   rn   zX-Lizmap-Userz'Lizmap user login in request headers : rp   z'No lizmap user login in request headersLIZMAP_USERz"Lizmap user login in parameters : )r   rr   r   r$   rw   )rl   loginrL   ry   
user_loginr&   s         r   get_lizmap_user_loginr     s     EXF $$&G./[[1
!EKKA%IJ12
KK9: !!#FZZ.
!EKK<UGDELr   c                    d}t               }| j                         }|rA|j                  d       |j                  d      }|.t	        |      }|j                  d       n|j                  d       ||S |j                  d       | j                         }|rD|j                  d      }|t	        |      }|j                  d       |S d	}|j                  d
       |S )r~   Nrn   zX-Lizmap-Override-Filterz)Lizmap override filter in request headersrp   z,No lizmap override filter in request headersLIZMAP_OVERRIDE_FILTERz$Lizmap override filter in parametersFz'No lizmap override filter in parameters)r   rr   r   r$   r   rw   )rl   overriderL   ry   override_filterr&   s         r   get_lizmap_override_filterr   (  s     HXF $$&G./!++&@A&/HKKCD12
KK>? !!#F **%=>&/HKK>?
 O HKKABOr   c                 t   t               }| j                         }|r4|j                  d      }|!t        |      }|j	                  d|        |S |j	                  d       | j                         }|r4|j                  d      }|!t        |      }|j	                  d|        |S |j	                  d       y)z3 Check if headers are defining an editing context. zX-Lizmap-Edition-Contextz5Lizmap editing context is found in request headers : z+No editing context found in request headersLIZMAP_EDITION_CONTEXTz0Lizmap editing context is found in parameters : zDNo lizmap editing context filter in parameters : default value falseF)r   rr   r$   r   r   rw   )rl   rL   ry   editing_contextresultr&   s         r   is_editing_contextr   O  s    XF$$&G!++&@A&_-FKKOPVxXYM
KK=>!!#F45V_FKKJ6(STM
KKVWr   )   )-__copyright____license__	__email__r   rF   	functoolsr   pathlibr   typingr   r   r   r   	qgis.corer	   r
   r   r   r   qgis.serverr   r   lizmap_server.loggerr   lizmap_server.toolsr   r?   intr   r)   r7   r%   listrC   rO   floatrK   rc   rk   r|   r   boolr   r    r   r   <module>r      s  &	  	   / /  = ' '%d38n %8I %QT %_c % "3 " "8M "J	# 	
 	x?W 	KJ Kt K K: :tTz1B :0 3C  %d
BS  .T eD$J.? 4'"$ '"C '"E$PT*DU '"T#0 #U3Z #L!#4 ! !H$(9 $d $N 1 d r   