U
    Įwh                     @   s2   d dl T d dlmZ d dlZG dd dejZdS )    )*)cmf_answer_templateNc                
       s   e Zd Ze Zejjddg Z fddZ	dd fdd
Z
ed	d
 Zedd ZeedddZedd Zddddddddddg
Z  ZS )CmfAnswerTemplatetemplate_renderget_template_fieldsc                    s   | j stddd | jr2| jjd| jdds2d| _| jdkrhd	d
| jgdd
| j gdd| jgdd
dgg}n4d	d
| jgdd
| j gdd| jgdd
dgdd
tj	gg}t
jj|drtd| j ddd | jr| jstj	| _t j||S )Nue   Внимание! Шаблонный ответ должен быть создан в проекте.T)abortzPPP-PR-ADMINF)objZraise_errorZprivatecommonnamez==parentidz!=answer_typeperson)filteruT   В этом проекте уже есть шаблон с таким именем ())r   Z	cmf_alertZis_newZprojectZcheck_project_role_accessr   r
   r   gcurrent_userZmodelsr   getr   supersave)selfargskwargsr   	__class__ 3./modules/servicedesk/models/cmf_answer_template.pyr      s    
, 
zCmfAnswerTemplate.saveT)	recursivec                   s   t  j|d|i|S )Nr   )r   delete)r   r   r   r   r   r   r   r   "   s    zCmfAnswerTemplate.deletec                 C   s   | j S )uh   Возвращает на фронт список возможных переменных шаблона)_template_fieldsclsr   r   r   r   %   s    z%CmfAnswerTemplate.get_template_fieldsc           	      K   s   dd }| j dddg }tj||d}tdd}i }|D ]@}t||r8t|| d	rht|| j||< q8t|| ||< q8ttjj|d
< t|d j|d< | |j	 |d< ||||d< t|j
j|d< |S )z	
        c                 S   s>   | j jdr*| d| j j d| j j S | | j j S d S )Nzproject.servicedeskzservicedesk//)r   Zlogic_prefix
startswithZui_namecodehref)r   urlr   r   r   
portal_url.   s    z:CmfAnswerTemplate.prepare_template_ctx.<locals>.portal_urlZ	cmf_ownerr   zparent.logic_prefix)fieldsT)Zfull_urlr
   r   reportertask_urlr'   client_status)r   ZcmfutilZget_obj_by_idZapp_base_hrefhasattrstrr
   r   r   r%   status)	r!   obj_idr   r'   r(   r   r&   ZctxZfieldr   r   r   prepare_template_ctx*   s     

z&CmfAnswerTemplate.prepare_template_ctx)returnc                    s,   t d} fdd}d}t |||}|S )u*  
        Быстрое решение чтобы прикрыть дыру. Обсудить на техкоме!
        Так как шаблоны может создавать любой пользователь, а не только администратор, то возможна SSTI атака на Jinja
        https://bcrm.carbonsoft.ru/project/List/SPR-011412?obj=Task:TEM-1625035715#stp-skb-ssti-v-shablonnyh-otveta-v-devel
        Разрешаем только заранее ограниченный список полей!
        z\{\{(.*?)\}\}c                    s@   |  d }| jkr6d| d}t| t||  dS )N   u,   Некорректное выражение u    в шаблоне!r   )groupstripr   Zloggingerror	Exception)matchZ
expressionr5   r    r   r   escape_matchR   s    

z6CmfAnswerTemplate.clean_template.<locals>.escape_match)recompilesub)r!   templateZre_expressionsr8   patternZescaped_templater   r    r   clean_templateI   s
    
	z CmfAnswerTemplate.clean_templatec                 K   s0   |  |}| j|}| j|f|}|jf |S )N)r>   
_jinja_envZfrom_stringr0   Zrender)r!   r/   textr   r<   Ztemplate_ctxr   r   r   r   b   s    
z!CmfAnswerTemplate.template_renderr   Zresponsibler@   r$   r)   r+   r
   r'   r.   r*   )__name__
__module____qualname__Zjinja2ZEnvironmentr?   r   r   Zapi_methodsr   r   classmethodr   r0   r-   r>   r   r   __classcell__r   r   r   r   r      s    


r   )Zcmf.includeZmodules.servicedesk.fieldsr   r9   r   r   r   r   r   <module>   s   