U
    TGhI                      @   s   d Z dZdZddlZddlmZ ddlmZ ddl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mZmZ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" ddl#m$Z$ G dd deZ%G dd deZ&dS )zCopyright 2021, 3LizzGPL version 3zinfo@3liz.org    N)Dict)gdal)Qgis
QgsProject)QgsServerInterfaceQgsServerRequestQgsServerResponse
QgsService)find_vector_layer_from_paramsget_lizmap_configget_lizmap_groupsget_lizmap_layers_configget_lizmap_override_filterget_lizmap_user_loginis_editing_contextwrite_json_response)ServiceError)ALL_FEATURESNO_FEATURESFilterByPolygon
FilterType)Logger	profiling)versionc                   @   s   e Zd ZdS )LizmapServiceErrorN)__name__
__module____qualname__ r   r   >/var/www/lizmap/lizmap/plugins/lizmap_server/lizmap_service.pyr   '   s   r   c                       s   e Zd Zedd fd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f e	e
ddddZ  ZS )LizmapServiceN)server_ifacereturnc                    s   t    || _t | _d S )N)super__init__r!   r   logger)selfr!   	__class__r   r   r$   /   s    
zLizmapService.__init__)r"   c                 C   s   dS )z Service name
        LIZMAPr   r&   r   r   r   name7   s    zLizmapService.namec                 C   s   dS )z Service version
        z1.0.0r   r*   r   r   r   r   =   s    zLizmapService.version)requestresponseprojectr"   c              
   C   s*  |  }z|dd }zt|   W n( tk
rV   tdd| ddY nX |dkrp| ||| n*|dkr| 	||| ntdd	
|dW n tk
r } z|| W 5 d
}~X Y n^ tk
r$ } z>| jdt   | jt| tdd}|| W 5 d
}~X Y nX d
S )z$ Execute a 'LIZMAP' request
        REQUEST Bad request errorzInvalid POST DATA for ''  ZGETSERVERSETTINGSZGETSUBSETSTRINGzGInvalid REQUEST parameter: must be one of GETSERVERSETTINGS, found '{}'NzUnhandled exception:
zInternal server errorzInternal 'lizmap' service error)
parametersgetupperbytesdatadecode	Exceptionr   get_server_settingspolygon_filterformatformatResponser%   critical	traceback
format_excstr)r&   r,   r-   r.   paramsZ	req_paramerrer   r   r   executeRequestB   s:    


zLizmapService.executeRequest)rC   r-   r.   r"   c              
   C   s  t ||\}}|stddddtdd}t| j rFt|| dS t| j }|sft|| dS t	|}|st|| dS |
 }	|	|krt|| dS z|dd }
|
d	krtj}n&|
d
krtj}n|
dkrtj}ntj}t| j }t|d|||d}| r| sFtd dtdd}t|| W dS t| j }|}| rzt| j }t|g}||\}}d||d}t|| W dS W nN tk
r } z.t| td dtdd}t|| W 5 d}~X Y nX dS )z' The subset string to use a on a layer.r1   zInvalid LAYER parameterr3   successr0   )statusfilterpolygonsNZFILTER_TYPEZSQLZSAFESQL
EXPRESSIONfilter_by_polygon)filter_typezKThe filter by polygon configuration is not valid.
 All features are hidden.zXAn error occurred when trying to read the filtering by polygon.
All features are hidden.)r
   r   r   r   r!   requestHandlerr   r   configFilePathr   r+   r5   r6   r   PlainSqlQuerySafeSqlQueryQgisExpressionr   r   is_filteredis_validr   r?   r   r   is_filtered_by_userr   tuple
subset_sqlr:   log_exception)r&   rC   r-   r.   flaglayerbodycfg
cfg_layers
layer_nameZfilter_type_paramrM   edition_contextfilter_polygon_configgroupsgroups_or_user
user_loginsqlrJ   rE   r   r   r   r<   h   s    











zLizmapService.polygon_filterc           
      C   s   |}|}i i g i d}t jd}|d |d d< |d |d d< t j|d d< td	|d
 d< td|d
 d< | j }ddddddddg}|D ]}	||	r|d 	|	 qd|d d< t
 |d d< t|| dS )z$ Get Lizmap Server settings
        )qgisgdalogrserviceslizmap-r   re   r      r+   Zversion_intNAMErf   ZVERSION_NUMWMSWFSZWCSZWMTSZATLASZCADASTRErK   r)   rg   Lizmaprh   N)r   QGIS_VERSIONsplitQGIS_VERSION_INTr   ZVersionInfor!   serviceRegistryZ
getServiceappendr   r   )
r&   rC   r-   r.   _r[   Zqgis_version_splitZregrg   sr   r   r   r;      s,    


z!LizmapService.get_server_settings)r   r   r   r   r$   rB   r+   r   r   r   r   rF   r   r   r<   r;   __classcell__r   r   r'   r   r    -   s$    &
   f
   r    )'__copyright____license__	__email__r@   typingr   Zosgeor   	qgis.corer   r   qgis.serverr   r   r   r	   lizmap_server.corer
   r   r   r   r   r   r   r   lizmap_server.exceptionr   lizmap_server.filter_by_polygonr   r   r   r   lizmap_server.loggerr   r   lizmap_server.toolsr   r   r    r   r   r   r   <module>   s   (
