U
    Vb@                     @   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 dd
lmZ ddl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is_editing_contextwrite_json_response)ServiceError)ALL_FEATURESNO_FEATURESFilterByPolygon)Logger	profiling)versionc                   @   s   e Zd ZdS )LizmapServiceErrorN)__name__
__module____qualname__ r   r   8/var/qgis-server/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   name5   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
rT   tdd|dY nX |dkrn| 	||| 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   formatget_server_settingspolygon_filterformatResponser#   critical	traceback
format_excstr)r$   r*   r+   r,   paramsZ	req_paramerrer   r   r   executeRequestF   s:    

zLizmapService.executeRequest)r@   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 zt| j }
t|d||
d	d
}| r4| std dtdd}t|| W dS t| j }||\}}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.r/   zInvalid LAYER parameterr0   successr.   )statusfilterpolygonsNfilter_by_polygonF)use_st_relationshipzKThe 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)   r   r   r2   is_filteredis_validr   r<   r   r   
subset_sqlr7   log_exception)r$   r@   r+   r,   flaglayerbodycfg
cfg_layers
layer_nameedition_contextfilter_polygon_configgroupssqlrG   rB   r   r   r   r:   l   sv    



   




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   rZ   r      r)   Zversion_intNAMEr[   ZVERSION_NUMWMSWFSZWCSZWMTSATLASZCADASTRE
EXPRESSIONr'   r\   Lizmapr]   N)r   QGIS_VERSIONsplitQGIS_VERSION_INTr   ZVersionInfor   serviceRegistry
getServiceappendr   r   )
r$   r@   r+   r,   _rR   Zqgis_version_splitregr\   sr   r   r   r9      s,    


z!LizmapService.get_server_settings)r   r   r   r   r"   r?   r)   r   r   r   r   rC   r   r   r:   r9   __classcell__r   r   r%   r   r   +   s$    &
   O
   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   lizmap.server.exceptionr   lizmap.server.filter_by_polygonr   r   r   lizmap.server.loggerr   r   lizmap.server.toolsr   r   r   r   r   r   r   <module>   s   $	