
    sh                         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$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+  G d de      Z,y)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)ALLOWED_SAFE_EXPRESSIONSNOT_ALLOWED_EXPRESSION)ExpressionServiceError)Logger)to_boolc            
       0   e Zd ZdefdZdefdZdedededdfdZ	e
d	eeef   dededdfd
       Ze
d	eeef   dededdfd       Ze
d	eeef   dededdfd       Ze
d	eeef   dededdfd       Zedededefd       Zededededeegfd       Zy)ExpressionServicereturnc                      y)z Service name
        
EXPRESSION selfs    @/var/www/qgis-server/plugins/lizmap_server/expression_service.pynamezExpressionService.name/   s         c                      y)z Service version
        z1.0.0r&   r'   s    r)   versionzExpressionService.version4   s     r+   requestresponseprojectNc                 p   t        ||      }t        |      }t        |      }|j                         }||d<   t	        |      |d<   |j                  |       |j                         }	 |j                  dd      j                         }		 t        |j                               j                          |	d	k(  r| j                  |||       y|	d
k(  r| j                  |||       y|	dk(  r| j!                  |||       y|	dk(  r| j#                  |||       yt        ddj%                  |	      d      # t        $ r t        dd|	 dd      w xY w# t        $ r}
|
j'                  |       Y d}
~
yd}
~
wt        $ r<}t)        j*                  |       t        dd      }
|
j'                  |       Y d}~yd}~ww xY w)z( Execute a 'EXPRESSION' request
        lizmap_userlizmap_user_groupsREQUEST Bad request errorzInvalid POST DATA for ''  EVALUATEREPLACEEXPRESSIONTEXTGETFEATUREWITHFORMSCOPEVIRTUALFIELDSzInvalid 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virtual_fieldsformatformatResponser   log_exception)r(   r.   r/   r0   request_handlergroups
user_login
custom_varparamsreqparamerres               r)   executeRequestz ExpressionService.executeRequest?   s    ,GX>"?3*?;
,,.
$.
=!+/<
'("":.##%	)zz)R0668Hglln%,,. :%fh844,,VXwG66007K_,##FHg>,'MMSVT\M]	   ,'-hZq9 * & 	)x(( 	)  #()@BcdCx((	)sT   ( E 	'D0 0E 	E "E ;E E 0EE 	F5E--F592F00F5rR   c                 *   t               }| j                  dd      }|st        ddd      t        ||      }|st        dd| dd      | j                  dd      }|s'| j                  d	d      }|st        dd
d      d| d}	 t	        j
                  |      }t               }	|	j                  t        j                                |	j                  t        j                  |             |	j                  t        j                  |             t!               }
|
j#                  |j%                         |j'                                |
j)                  |j+                                i }g }g }t-        |t.              rt1        |      }n t-        |t2              r|j5                         }|D ]  \  }}t7        |      }|j9                  |
       |j;                  |j=                                |j?                  |jA                                |jC                         r&|jE                  d| d|jG                                 |jI                         s|jE                  d| d       |jK                  |	       |||<    |r+t        ddjM                  djO                  |            d      | j                  dd      }|s| j                  dd      }|rd|z   dz   }dg g dd}|si }i }|j5                         D ]j  \  }}|jQ                  |	      }|jS                         rd||<   |jU                         ||<   @t	        j
                  tW        jX                  |            ||<   l |d   jE                  |       |d    jE                  |       t[        ||       y	 t	        j
                  |      }|rt-        |t.              rt]        |      dk(  rt        dd"| dd      d#|d   vs|d   d#   d$k7  rt        dd%jM                  |      d      tW        j^                  d&|z   d'z   ta        jb                  d(            }tW        jd                  d&|z   d'z   |ta        jb                  d(            }|st        dd)| d      tg        |ji                               }|jk                  |       tm        | j                  d*            }|D ]  }to        |      }|jq                  |js                                |ji                         D ]<  }|ju                         }|jw                  |      d+k7  s(|jy                  |||          > |r$|	j                  t        jz                  |             |	j}                  |       |	j                  |ji                                i }i }|j5                         D ]  \  }}|r|jK                  |	       |jQ                  |	      }|jS                         rd||<   |jU                         ||<   St	        j
                  tW        jX                  |            ||<   |j                         ||<    |d   jE                  |       |d    jE                  |       |d,xx   d-z  cc<    t[        ||       y# t        $ r; |j                  d| dt        j                                 t        dd| dd      w xY w# t        $ r; |j                  d!| dt        j                                 t        dd"| dd      w xY w).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
        LAYERr5   r6   z8Invalid 'Evaluate' REQUEST: LAYER parameter is mandatoryr8   z(Invalid LAYER parameter for 'Evaluate': 	 provided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featuresNrk   rl   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_SCOPErm      )Ar   rA   r   r   jsonloadsrF   critical	traceback
format_excr   appendScoper   globalScopeprojectScope
layerScoper   setSourceCrscrstransformContextsetEllipsoid	ellipsoid
isinstancer>   	enumeratedictitemsr   setGeomCalculatorsetDistanceUnitsdistanceUnitssetAreaUnits	areaUnitshasParserErrorappendparserErrorStringisValidpreparerK   joinrG   hasEvalErrorevalErrorStringr   encodeValuer   lenstringToFieldsr   codecForNamestringToFeatureListr   fieldsextendr    r	   setGeometrygeometryr*   indexOfsetAttribute	formScope
setFeature	setFields
expression) rR   r/   r0   logger
layer_namelayerexpressionsr   exp_jsonexp_contextdaexp_mapexp_parser_errors	exp_itemskrU   exprm   featurebodyresulterrorvaluegeojsonfeature_fieldsfeature_listfeat_fieldsadd_form_scopeffeatfield
field_names                                    r)   rG   zExpressionService.evaluater   s   $ ZZ,
(#J  "*g6(#::,iP  jj3L"5J,'b  zl"-K	zz+.H +, 9 E E GH 9 F Fw OP 9 D DU KL 
		W%=%=%?@
))+, 	h%!(+I$' (I 	DAq"C!!"%  !6!6!89W..01!!#!((71#S9N9N9P8Q)RS;;=!((+A!A)FGKK$GAJ	$ (#9@@K\A]^  ::j"-jjB/G=3.  	
 FE!--/ L3[1##% $F1I"224E!H $

<+C+CE+J KF1IL O""6*N!!%(h/	jj*G j$73w<1;L(#8
BWX 
 #wqz&'9Y'F(##VH-	  &447(BSH##G,. $777(BSH##G,. (#XYaXbc   />* !L!9:  !	"A k*DQZZ\* A"ZZ\
&&z2b8%%j!J-@A ''(A(K(KD(QR""4(!!$++-0 FE!--/ 
03!KK,[1##% $F1I"224E!H $

<+C+CE+J KF1I"~~/E!H
0 O""6*N!!%(!C!	"F 	D(+Q  	OO*;-~iFZFZF\E]^`(#;K=H]^ 	j  	OO'z	@T@T@V?WXZ(#8
BWX 	s   Z [ A[A\c           
         t               }| j                  dd      }|st        ddd      t        ||      }|st        dd| dd      | j                  dd      }|s'| j                  d	d      }|st        dd
d      d| d}	 t	        j
                  |      }| j                  dd      }	|	s| j                  dd      }
|
rd|
z   dz   }	t               }|j                  t        j                                |j                  t        j                  |             |j                  t        j                  |             t!               }|j#                  |j%                         |j'                                |j)                  |j+                                i }g }t-        |t.              rt1        |      }n t-        |t2              r|j5                         }|D ]
  \  }}|||<    dg g dd}|	s}i }|j5                         D ]G  \  }}t7        j8                  |||      }t	        j
                  t;        j<                  |            ||<   I |d   j?                  |       tA        ||       y|	jC                         dk(  r!|jE                         }|jG                         }n	 t	        j
                  |	      }|rt-        |t.              rtI        |      dk(  rt        dd|	 dd      d|d   vs|d   d   dk7  rt        ddjK                  |	      d      t;        jL                  d |	z   d!z   tO        jP                  d"            }t;        jR                  d |	z   d!z   |tO        jP                  d"            }|st        dd#jK                  |	      d      tU        |jE                               }|jW                  |       tY        | j                  d$            }| j                  d%d      jC                         d&k(  }|rt[               }|j#                  |j%                                tU               }|j]                         D ]{  }t_        j`                         d'k  r$tc        te        |      tf        jh                        }n-tc        te        |      tj        jl                  jn                        }|j?                  |       } nd}d}|D ]  }tq        |      }|js                  |ju                                |jE                         D ]<  }|jw                         }|jy                  |      d(k7  s(|j{                  |||          > |r$|j                  t        j|                  |             |j                  |       |j                  |jE                                i }|j5                         D ]G  \  }}t7        j8                  |||      }t	        j
                  t;        j<                  |            ||<   I |rtq        ||j                               }
|
js                  |ju                                |
j                  t/        |j                                      |d   j?                  |j                  |
             |d   j?                  |        |r^|j                  d)       |j                  d*d+       |j                  d,j                  d-d.d,j                  |d         z   d/z   g             ytA        ||       y# t        $ r; |j                  d| dt        j                                 t        dd| dd      w xY w# t        $ r; |j                  d|	 dt        j                                 t        dd|	 dd      w xY w)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
        rX   r5   r6   zEInvalid 'ReplaceExpressionText' REQUEST: LAYER parameter is mandatoryr8   z5Invalid LAYER parameter for 'ReplaceExpressionText': rY   STRINGSSTRINGzQInvalid 'ReplaceExpressionText' REQUEST: STRING or STRINGS parameter is mandatoryr[   r\   zJSON loads strings 'r]   z2Invalid 'ReplaceExpressionText' REQUEST: STRINGS 'r^   rd   re   rf   rg   rh   r   ri   rk   NALLrn   ro   rp   rq   rr   rs   rt   ru   zTInvalid FEATURES for 'ReplaceExpressionText': not GeoJSON features array provided
{}rv   FORMATGEOJSONi  rw      Content-Typez'application/vnd.geo+json; charset=utf-8,
z{"type": "FeatureCollection"z"features": []})Ir   rA   r   r   ry   rz   rF   r{   r|   r}   r   r~   r   r   r   r   r   r   r   r   r   r   r   r>   r   r   r   r   replaceExpressionTextr   r   r   r   rB   r   getFeaturesr   rK   r   r   r   r   r   r   r    r   keysr   
versionIntr   strr   Stringr   TypeQStringr	   r   r   r*   r   r   r   r   r   idsetAttributesvaluesexportFeaturesetStatusCode	setHeaderwriter   ) rR   r/   r0   r   r   r   strings
the_stringstr_jsonrm   r   r   r   str_map	str_itemsr   sr   r   r   r   r   r   r   r   geojson_outputexportergeojson_fieldsr   r   r   r   s                                    r)   rH   z)ExpressionService.replace_expression_textM  s/   , ZZ,
(#W  "*g6(#G
|S\]  **Y+Hb1J,'g  :,b)G	zz'*H ::j"-jjB/G=3. +, 9 E E GH 9 F Fw OP 9 D DU KL 
		W%=%=%?@
))+, 	h%!(+I$' (I 	DAqGAJ	
  	
 F H1%;;A{BO JJ|'?'?'FGq	H O""6*h/ >>u$"\\^N ,,.L**X. *Wd";s7|q?P,'<XJF[\ 
 gaj(WQZ-?9-L,'#$*F8$4	  *88;hFL''02N (;;;hFL''02L (# !'!1	   />* !L!9:Hb1779YF&(H!!%))+.&[N\\^ -??$u,$SVX__=E$SVY^^-C-CDE%%e,- H!N  	/A k*DQZZ\* A"ZZ\
&&z2b8%%j!J-@A ''(A(K(KD(QR""4(!!$++-0 F H1%;;A{BO JJ|'?'?'FGq	H $^QTTV<##AJJL1%%d6==?&;<Y&&x'='=g'FGY&&v.9	/< ""3'~/XYNN

2#ejji&AADH  	  h/K  	OO&wi~i>R>R>T=UVX(#DWIMbc 	z  +H:^IDXDXDZC[\^,'<XJF[\ s   [? "] ?A]A^
c           	         t               }| j                  dd      }|st        ddd      t        ||      }|st        dd| dd      | j                  dd      }|st        dd	d      | j                  d
d      }|st        ddd      	 t	        j
                  |      }|rt        |t              st        ddj                  |      d      d|vs|d   dk7  rt        ddj                  |      d      t        j                  |t        j                   d            }	t        j"                  ||	t        j                   d            }
|
st        ddj                  |      d      t%        |
      dk7  rt        ddj                  |      d      |
d   }| j                  dd      }d}|r	 t	        j
                  |      }|rt        |t              st        ddj                  |      d      |j                  d      dk7  rt        ddj                  |      d      t        j                  |t        j                   d            }t        j"                  ||t        j                   d            }|rt%        |      dk7  rt        ddj                  |      d      |d   }t'               }|j)                  t+        j,                                |j)                  t+        j.                  |             |j)                  t+        j0                  |             |j)                  t+        j2                  |             |r$|j)                  t+        j4                  |             t7               }|j9                  |j;                         |j=                                |j?                  |jA                                tC        |      }|jE                  |       |jG                  |jI                                |jK                  |jM                                |jO                         r+t        ddj                  ||jQ                               d      |jS                         st        ddj                  |      d      |jU                  |       tW        ||      }tY        | j                  d            }|s)|j[                  tV        j\                  j^                         |ja                         }|D cg c]  }| }}|jc                         }| j                  dd      je                  d      D cg c]  }|s|jg                          }}|D ]"  }|ji                  |jk                  |             $ |jm                  d        |jo                  d!d"       |jq                  d#       |js                          tu        |      }|r|jw                  |       d}|jy                  |      D ]K  }|d$z   t{        ||      z   }|jq                  ||j}                  |i |      z          |js                          d%}M |jq                  d&       y# t        $ rF |j                  d| dt        j                                 t        ddj                  |      d      w xY w# t        $ rF |j                  d| dt        j                                 t        ddj                  |      d      w xY wc c}w c c}w )'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
        rX   r5   r6   zGInvalid 'GetFeatureWithFormScope' REQUEST: LAYER parameter is mandatoryr8   z,Invalid LAYER parameter for 'VirtualField': rY   FILTERzHInvalid 'GetFeatureWithFormScope' REQUEST: FILTER parameter is mandatoryFORM_FEATUREzNInvalid 'GetFeatureWithFormScope' REQUEST: FORM_FEATURE parameter is mandatoryzJSON loads form feature 'r]   zPInvalid 'GetFeatureWithFormScope' REQUEST: FORM_FEATURE '{}' are not well formedrp   rq   zrInvalid 'GetFeatureWithFormScope' REQUEST: FORM_FEATURE '{}' are not well formed: type not defined or not Feature.ru   zSInvalid FORM_FEATURE for 'GetFeatureWithFormScope': not GeoJSON feature provided
{}rx   r   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_GEOMETRYFIELDS,r   r   application/json*{ "type": "FeatureCollection","features":[.r   r   )?r   rA   r   r   ry   rz   rF   r{   r|   r}   rK   r   r   r   r   r   r   r   r   r   r~   r   r   r   r   r   parentFormScoper   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r    setFlagsFlag
NoGeometryprimaryKeyAttributesr   splitstripr   r   r   r   r   flushr   r   r   r   r   )rR   r/   r0   r   r   r   
exp_filterform_featurer   form_feature_fieldsform_feature_list	form_featparent_featureparent_featparent_feature_fieldsparent_feature_listr   r   exp_freq	with_geompk_attributesiattribute_listr   r   r_fieldsjson_exporter	separatorr   fids                                  r)   rI   z-ExpressionService.get_feature_with_form_scope)  s    ZZ,
(#Y  "*g6(#>zl)T  ZZ"-
(#Z  zz."5(#` 		jj.G j$7(#bii "	  '!gfo&B(#2396,3G	  +99##G,. )<<##G,. !(#vl+	   !Q&(#vl+	  &a(	  $4b9	**^4 *Wd";,'hoo&(	  {{6"i/,'67=vn7M	  %1$?$?''0%2! #/"B"B%''0#2
 '#.A*Ba*G,'$f^4	  .a0K +, 9 E E GH 9 F Fw OP 9 D DU KL 9 C CI NO##$=$M$Mk$Z[ 
		W%=%=%?@
))+, j)#w44677,,./!(#PWW 7 7 9;	  }}(#[bb 	  	k"{3 FJJ78	LL*//::; 224%23!33'-zz(B'?'E'Ec'JP!aAGGIPP 	5A!!&.."34	5 	s#>+=>CD'.''7	%%c* 	Ds"^D-%HHCNN9}'B'B4S'QQRNNI		
 	tW  	OO+L>	H\H\H^G_`b(#bii "	 	v  //?~iNbNbNdMefh,'hoo&(	 r 4Ps,   Y
 0Z 4	[.2[3:[3
AZA[+c                 2   t               }| j                  dd      }|st        ddd      t        ||      }|st        dd| dd      | j                  dd      }|st        dd	d      t        j                  d|      }| j                  d
      }t        j                  d
|      }	t               }
|
j                  t        j                                |
j                  t        j                  |             |
j                  t        j                  |             t               }|j                  |j                         |j                                |j!                  |j#                                i }g }|j%                         D ]I  \  }}t        j'                  |||      \  }}|r|j)                  |       4|j+                  |
       |||<   K |	j%                         D ]  \  }}t        j'                  |||      \  }}|r|j)                  |       4|j-                         D ]b  }|t.        vsdj1                  t.              }|j3                  d|j5                          d| d| dt6         d| d       t9        t6              }d |j+                  |
       |||<    |r+t        ddj;                  dj1                  |            d      t=               }| j                  dd      }|rt9        |      }|j?                  |       |jA                  |jC                                |jE                  |jG                                |jI                         r+t        ddj;                  ||jK                               d      |jM                         st        dd| dd      |j+                  |
       t=        ||
      }| j                  dd      }	 |jO                  tQ        |             | j                  dd      jU                         }|dv rQ| j                  dd      }t=        jV                  ||dk(        }|jY                  t=        jZ                  |g             n|dk7  rt        dd| dd      t]        | j                  d             }|s)|j_                  t<        j`                  jb                         |je                         }|D cg c]  }| }}|jg                         }| j                  d!d      ji                  d      D  cg c]  } | s| jk                          }!} |!D ]"  } |j)                  |jm                  |              $ |jo                  d"       |jq                  d#d$       |js                  d%       |ju                          tw        |      }"|r|"jy                  |       d}#|j{                  |      D ]  }$|d&z   t}        |$|      z   }%i }&|
j                  |$       |
j                  |$jg                                i }'|j%                         D ]}  \  }}|j                  |
      }(|j                         rd'|&|<   |j                         |'|<   @t        j                  t        j                  |(            |&|<   |j                         |'|<    |js                  |#|"j                  |$|&|%      z          |ju                          d(}# |js                  d)       y'# tR        $ r t        dd| dd      w xY wc c}w c c} w )*aZ   Get virtual fields for features

        In parameters:
            LAYER=wms-layer-name
            VIRTUALS={"key1": "first expression", "key2": "second expression"}
            // optionals
            SAFE_VIRTUALS={"key1": "first expression", "key2": "second expression"}
            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
        rX   r5   r6   z=Invalid 'VirtualFields' REQUEST: LAYER parameter is mandatoryr8   z-Invalid LAYER parameter for 'VirtualFields': rY   VIRTUALSz@Invalid 'VirtualFields' REQUEST: VIRTUALS parameter is mandatorySAFE_VIRTUALSr   zProject z, layer z, input expression 'z3' has been discarded from evaluation, replaced by 'z	'. Only 'z' are allowed.z9Invalid VIRTUALS or SAFE_VIRTUALS for 'VirtualFields':
{}rc   r   z1Invalid FILTER for 'VirtualFields' Error "{}": {}z9Invalid FILTER for 'VirtualFields' Expression not valid "rb   LIMITz-1z$Invalid LIMIT for 'VirtualFields': "SORTING_ORDER)ascdescSORTING_FIELDr  z,Invalid SORTING_ORDER for 'VirtualFields': "r   r   r   r   r   r   r   Nr   r   )Jr   rA   r   r   r"   check_json_virtualsr   r~   r   r   r   r   r   r   r   r   r   r   r   check_expressionr   r   referencedFunctionsr   r   warningfileNamer   r   rK   r
   r   r   r   r   r   r   r   r   setLimitint
ValueErrorlowerOrderByClause
setOrderByOrderByr    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   ry   rz   r   r   r   r   ))rR   r/   r0   r   r   r   virtualsvir_jsonsafe_virtualssafe_vir_jsonr   distance_arear   r   r   r   r   r   memberallowedr   
req_filterreq_exp	req_limitreq_sorting_order_paramreq_sorting_fieldorder_by_clauser   r  r  r  r   r   r  r  r  r   r  extrarl   r   s)                                            r)   rJ   z ExpressionService.virtual_fields  s     ZZ,
(#O  "*g6(#?
|9U  ::j"-(#R 
 %88XN

?3)==o}] +, 9 E E GH 9 F Fw OP 9 D DU KL ()""599;0H0H0JK""7#4#4#67 !)!1 	!E:*;;JW^_JC!((/KK$ GEN	! "/!4!4!6 	!E:*;;JW^_JC!((/113 
@!99!hh'?@GNN"7#3#3#5"6 7!!+ ---7L 9((>'? @!!(		9 ((>?C
@ KK$ GEN'	!, (#LSSTXT]T]^oTpq 
  ! ZZ"-
#J/G%%m4$$W%:%:%<=  !2!2!45%%','IPP"G$=$=$?A	  ??$,'PQ[P\\^_ 
 OOK(#G[9C JJw-		LLY( #)**_b"A"G"G"I"o5 &

?B ?/==>OQhlqQqrONN,44o5FGH$*(#?@W?XXZ[  FJJ78	LL*//::; 224%23!33'-zz(B'?'E'Ec'JP!aAGGIPP 	5A!!&.."34	5 	s#>+=>CD'.''7	%%c* 	Ds"^D-%HHCE ""4(!!$++-0 F%mmo 5
s[1##%#'E%L$'$7$7$9F5M#'::l.F.Fu.M#NE%L$'NN$4F5M5 NN9}'B'B4PS'TTUNNI-	. 	tI  	(#7	{"E 	6 4Ps   [1 	\\\1\r*   r  c           
      $   |si S 	 t        j                  |      }t        |t              st        dd| dd      |S # t        $ rH t               }|j	                  d| d| dt        j                                 t        dd| dd      w xY w)z. Load virtuals dictionary from string to JSON.zJSON loads z 'r]   r6   z+Invalid 'VirtualFields' REQUEST: VIRTUALS 'r^   r8   )
ry   rz   rF   r   r{   r|   r}   r   r   r   )clsr*   r  virtual_jsonr   s        r)   r  z%ExpressionService.check_json_virtuals  s     I		::h/L ,-(#=hZG\] 
   	XFOOdV2hZ~i>R>R>T=UVX(#=hZG\] 		s
   > ABexpression_strr   c                 >   t        |      }|j                  |       |j                  |j                                |j	                  |j                                |j                         rdd| d|j                          fS |j                         sdd| dfS |dfS )z8 Check if an expression as a string has an error or not.Nr_   r`   ra   rb   r5   )	r   r   r   r   r   r   r   r   r   )r+  r-  r   r0   r   s        r)   r  z"ExpressionService.check_expression  s     #>2
$$]3##G$9$9$;< 1 1 34$$&7>"2#j6R6R6T5UVVV!!#1.1ACCC2~r+   )__name__
__module____qualname__r   r*   r-   r   r   r   rV   staticmethodr   rG   rH   rI   rJ   classmethodr   r  r   r   r  r&   r+   r)   r"   r"   -   s   c 
 0)&6 0)BS 0) *0)/30)f Xc3h X3D Xz X^b X Xt YcNY.?YJTYY]Y Yv \cN\.?\JT\Y]\ \| DtCH~ D9J DU_ Ddh D DL s c d  0 !$5DOY_lnq^r r+   r"   )-__copyright____license__	__email__ry   r|   typingr   	qgis.corer   r   r   r   r   r	   r
   r   r   r   r   r   qgis.PyQt.QtCorer   r   r   qgis.serverr   r   r   r   lizmap_server.corer   r   r   r   r   *lizmap_server.definitions.safe_expressionsr   r   lizmap_server.exceptionr   lizmap_server.loggerr   lizmap_server.toolsr    r"   r&   r+   r)   <module>r@     sj   &	       = <   h : ' 'J
 Jr+   