
    sh 0                        d Z dZdZddlZddlZddlmc m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mZmZmZmZmZ dd	lmZmZm Z  dd
l!m"Z" ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z) 	  e
dg d      Z* G d de      Z+y)zCopyright 2021, 3LizzGPL version 3zinfo@3liz.org    N)
namedtuple)Path)	GeneratorListTupleUnion)
QgisQgsDistanceAreaQgsEditFormConfigQgsExpressionQgsExpressionContextQgsExpressionContextUtils
QgsFeatureQgsFeatureRequest
QgsProjectQgsRelationManager)QgsServerFeatureIdQgsServerFilterQgsServerProjectUtils)find_vector_layer)Loggerexception_handler)to_bool)TooltipResult)layer
feature_id
expressionc                       e Zd Zededeeeef   ddf   fd       Zedededeee	f   dedef
d       Z
ed	ed
ededededee   fd       Zed        Zy)GetFeatureInfoFilterstringreturnNc              #      K   t        j                  |      }|D ]E  }|D ]>  }|j                  j                  d      s|j                  d   |j                  d   f @ G yw)zB Generator for layer and feature found in the XML GetFeatureInfo. idnameN)ET
fromstringattribget)clsr!   rootr   features        >/var/www/qgis-server/plugins/lizmap_server/get_feature_info.py	parse_xmlzGetFeatureInfoFilter.parse_xml)   sg      }}V$ 	EE  E>>%%d+,,v.t0DDDE	Es
   ;A#%A#
layer_namer   maptipc                 d   t        j                  |      }|D ]  }|j                  j                         dk7  r!|j                  d   |k7  r4|D ]  }|j                  d   t        |      k7  r|j                  d      }|||j                  d<   Bt        j                  d      }d|j                  d<   ||j                  d<   |j                  |         t        j                  |d	d
      j                  d      j                  d      }	dj                  |	dd       }
|
j                         S )zR Edit the XML GetFeatureInfo by adding a maptip for a given layer and feature ID. LAYERr%   r$   zAttribute[@name='maptip']Nvalue	Attributer0   utf8xml)encodingmethodutf-8
   )r&   r'   tagupperr(   strfindElementappendtostringdecodesplitjoinstrip)r*   r!   r/   r   r0   r+   r   r,   item	xml_lines
xml_strings              r-   append_maptipz"GetFeatureInfoFilter.append_maptip2   s    }}V$ 	)Eyy G+||F#z1  ) >>$'3z?:||$?@#+1DKK(::k2D*2DKK'+1DKK(NN4()	)0 KKveDKKGTZZ[_`	YYy}-
!!    cfgprojectrelation_managerr6   css_frameworkc                    g }t         j                  |      D ]7  \  }}t        ||      }	|	st        j                  d| d       /||	j                         k7  r3t        j                  dj                  ||	j                                      |j                  d      }
|
s(t        j                  d|j                          d       |
j                  |	j                               }|sCt        j                  dj                  |	j                         |j                                      t        |j                  d            s0|j                  d	      d
k7  rF|	j                         }|j                         t        j                  j                  k7  rt        j                   d       |j#                         }t%        j&                  |	|dg d||dk(        }t%        j(                  |      }|dk(  r|t%        j*                         z  }|j-                  t/        |	||             t        j                  dj                  ||             : |S )zJ Parse the XML and check for each layer according to the Lizmap CFG file. zSkipping the layer 'z!' because it's not a vector layerz3Request on layer shortname '{}' and layer name '{}'layersz$No 'layers' section in the CFG file .cfgz:No layer configuration for layer {} in the CFG file {}.cfgpopuppopupSourceformzPThe CFG is requesting a form popup, but the layer is not a form drag&drop layoutr    
BOOTSTRAP5z=The popup has been replaced for feature ID '{}' in layer '{}')r    r.   r   r   infor%   formatr)   criticalfileNamer   editFormConfiglayoutr   EditorLayout	TabLayoutwarninginvisibleRootContainerr    create_popup_node_item_from_formcreate_popupcssrA   r   )r*   rL   rM   rN   r6   rO   featuresr/   r   r   rQ   layer_configconfigr+   html_contents                  r-   feature_list_to_replacez,GetFeatureInfoFilter.feature_list_to_replaceR   s
    &:&D&DS&I 7	-"J
%j':E2:,>_`aUZZ\)QXX

. / WWX&F"FwGWGWGYFZZ^ _`!::ejjl3LPWW

g&6&6&8:; <++G45.&8))+F}}"3"@"@"J"JJfh002D #CCtQB(8-<:WYL"//=L "-OOF5*lCDKKOVV
,-k7	-p rK   c                    t               }| j                         j                         }|j                         }|j	                  dd      j                         dk7  ry|j	                  dd      j                         dk7  ry|j	                  dd      j                         dk7  r?|j                  d	j                  |j	                  dd      j                                      yt        | j                         j                               }|j                         s=|j                  d
j                  | j                         j                                      yt        | j                         j                         dz         }|j                         s=|j                  dj                  | j                         j                                      yt        t        |      d      5 }t        j                  |j                               }ddd       t!        j"                         }|j%                         }	|j'                         j)                         j+                  d      }
|j	                  dd      }	 | j-                  ||	|
|      }|s|j                  d|        y|j                  dj                  t;        |      dj=                  |D cg c]  }|j>                  jA                          c}                   tC               }|jE                  tG        jH                                |jE                  tG        jJ                  |             tM        jN                  |      }	 |D ]  }tQ               }|jS                  |j>                  jU                         |jW                                |jY                  |j[                                |jE                  tG        j\                  |j>                               t_        j`                  |jb                  |j>                  je                               }|rttg        ti        |            }|s)|jk                  tf        jl                  jn                         tq               }|j>                  js                  |      ju                  |       n.|j>                  jw                  ty        |jb                              }|j{                         sE|j}                  dj                  |jb                  |j>                  j                                      |j                  |       |j                  |j                                ti        j                  |j                  ||      }|sE|j}                  dj                  |jb                  |j>                  j                                      \t        j                         dk  r|j>                  j                         }n(|j>                  j                         j                         }|s|j>                  jA                         }|j                  dj                  |jb                  |             | j                  |
||jb                  |      }
 |
s|j9                  d       y|j                          |j                  dd       |j                  t        |
d             |j                  d|        y# 1 sw Y   xY w# t.        $ rk}t1        t3        j4                  d            r|j7                  |        |j9                  dj                  |             |j7                  |       Y d}~yd}~ww xY wc c}w # t.        $ r\}t1        t3        j4                  d            r|j7                  |        |j9                  d       |j7                  |       Y d}~yd}~ww xY w)zA Intercept the GetFeatureInfo and add the form maptip if needed. SERVICErV   WMSNREQUESTGETFEATUREINFOINFO_FORMATzTEXT/XMLz9Lizmap is only processing INFO_FORMAT=TEXT/XML, not '{}'.zmThe QGIS project {} does not exist as a file, not possible to process with Lizmap this request GetFeatureInforR   zlThe QGIS project {} is not a Lizmap project, not possible to process with Lizmap this request GetFeatureInfor9   )r7   CSS_FRAMEWORKCIz^Error while reading the XML response GetFeatureInfo for project {}, returning default responsez:No features found in the XML from QGIS Server for project zTReplacing the maptip from QGIS by the drag and drop expression for {} features on {},znThe feature {} for layer {} is not valid, skip replacing this XML GetFeatureInfo, continue to the next featurezThe GetFeatureInfo result for feature {} in layer {} is not valid, skip replacing this XML GetFeatureInfo, , continue to the next featurei  zQReplacing feature '{}' in layer '{}' for the GetFeatureInfo by the drag&drop formzRThe new XML for the GetFeatureInfo is empty. Let's return the default previous XMLzContent-Typeztext/xmlz$GetFeatureInfo replaced for project zQError while rewriting the XML response GetFeatureInfo, returning default response)Nr   serverInterfacerequestHandlerparameterMapr)   r=   rX   rY   r   configFilePathexistsopenr>   jsonloadsreadr   instancerelationManagerbodydatarC   ri   	Exceptionr   osgetenvlog_exceptionrZ   lenrE   r   r%   r   appendScoper   globalScopeprojectScoper   wmsFeatureInfoAddWktGeometryr
   setSourceCrscrstransformContextsetEllipsoid	ellipsoid
layerScoper   getExpressionFromServerFidr   dataProviderr   r   setFlagsFlag
NoGeometryr   getFeaturesnextFeature
getFeatureintisValidr`   r$   
setFeature	setFieldsfieldsreplaceExpressionTextr   r	   
versionInt	shortNameserverPropertiesrJ   clearsetResponseHeader
appendBodybytes)selfloggerrequestparamsproject_pathconfig_pathcfg_filerL   rM   rN   r6   rO   re   eresultexp_contextgeometry_resultdistance_arear   expression_requestr,   r3   r/   s                          r-   responseCompletez%GetFeatureInfoFilter.responseComplete   s`    &&(779%%'::i$**,5::i$**,0@@::mR(..0J>KKKRRJJ}b1779;< D002AACD""$KK))/0D0D0F0U0U0W)XZ 4//1@@BVKL!!#KK))/0D0D0F0U0U0W)XZ  #k"W5 	.**X]]_-C	. %%'"224lln!!#**73

?B7	33CBRTWYfgH  KKL\N[ biiHsxx8(T):):)<(TUW	
 +, 9 E E GH 9 F Fw OP 0LLWUG	" 0T / 1**6<<+;+;+=w?W?W?YZ**7+<+<+>?''(A(L(LV\\(Z[/JJ%%v||'@'@'BD
):=;T)U&**334E4J4J4U4UV(lGLL,,-?@LLWU %ll55c&:K:K6LMG(NNGGMv"--v||/@HB
 &&w/%%gnn&67%;;F<M<M{\ijNNRRXRX"--v||/@SB
 ??$u,!'!7!7!9J!'!>!>!@!J!J!LJ!!'!2!2!4Jgnn)):78 ((j&:K:KUSa0Tf hj MMO%%njAuS'23KK>|nMNW	. 	.  		ryy'$$Q'OO!6,/1   #		* )UV  	ryy'$$Q'OOce  #	sL   $$[,4[9 !]0&L3]5 A]5 ,[69	]-A!]((]-5	_>A__)__name__
__module____qualname__classmethodr>   r   r   r.   r   r   rJ   dictr   r   r   r   ri   r   r    rK   r-   r    r    '   s    Es EysCx$1L'M E E "3 "C "U3PS8_ "^a "fi " "> BB  B 1	B
 B B 
fB BH W WrK   r    ),__copyright____license__	__email__ry   r   xml.etree.ElementTreeetreeElementTreer&   collectionsr   pathlibr   typingr   r   r   r   	qgis.corer	   r
   r   r   r   r   r   r   r   r   qgis.serverr   r   r   lizmap_server.corer   lizmap_server.loggerr   r   lizmap_server.toolsr   lizmap_server.tooltipr   r   r    r   rK   r-   <module>r      sr   &	  	 " " "  0 0   S R 0 : ' ) 
HC	DH? HrK   