U
    6gk                     @   s`   d dl T d dlmZmZ d dlZd dlZG dd deZG dd deedZ	d	d
 Z
dd ZdS )    )*)abortResponseNc                       s$   e Zd Z fddZdd Z  ZS )BaseViewMetac           
         s  t t| | ||| |d }|dd s. S |dsN|dsN|dr|dd }|dkr|d d	sd
| |d  }n|d }| _|d | }| | | _t	j
|| fdddddgd g  _ j D ]"\}}	t|	dr܈ j|  qntd S )N
__module__Z__url__zcmf.modulesmodulesZcustom.)indexZ
confluenceZjiraz/pub//c                     s     j | |S N)dispatchargskwargs	new_class ./cmf/views/base_view.py<lambda>$       z&BaseViewMeta.__new__.<locals>.<lambda>GETPOSTPUTmethodscmf_is_actionuq   Вьюхи можем определять только в modules и переопределять их в custom)superr   __new__get
startswithsplitZreal_url_create_jinja_env	jinja_envAPPZadd_url_rulecmf_action_list__dict__itemshasattrappendupper	Exception)
ZmclnamebasesZnmspcZmodule_pathmodule_nameurlZendpointaction_nameZaction_method	__class__r   r   r      s>    

zBaseViewMeta.__new__c           	   
      s   t  }tdd d|d|dd|ddfD }||d	< tjf |}d
dlm}m} d
dlm	}m
 m} |jtjj |jj||t| | fddd tjj|_|S )Nc                 S   s   g | ]}t jt|qS r   )ospathjoinZPROJECT_DIR).0dirr   r   r   
<listcomp>;   s   z2BaseViewMeta._create_jinja_env.<locals>.<listcomp>zcustom/{}/templateszmodules/{}/templateszcommon/templateszcmf/modules/{}/templateszcmf/templatesz./loaderr   )url_forget_flashed_messages)requestsessiongc                      s$     dr tdtj S dS )N
csrf_tokenz2<input name="csrf_token" type="hidden" value={} /> )r   flaskZMarkupformatZcmfZviewsZget_csrf_tokenr   r=   r   r   r   T   s    z0BaseViewMeta._create_jinja_env.<locals>.<lambda>)r:   r;   configr<   r=   r>   r?   )dictZjinja2ZFileSystemLoaderrB   ZEnvironmentZflask.helpersr:   r;   Zflask.globalsr<   r=   r>   globalsupdater$   r#   rD   filters)	clsr.   optionsZjinja_loaderrvr:   r;   r<   r>   r   rC   r   r"   3   s8    

zBaseViewMeta._create_jinja_env)__name__r   __qualname__r   r"   __classcell__r   r   r1   r   r      s   +r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )BaseViewc                 O   s   t jd  }dt jkr&t jd  }dt jkr>t jd  }dt jkrVt jd  }|dkrx|t jd  krxtd || jkrt| | ||S td d S )NZREQUEST_METHOD_methodmethodaction)r   r   r   ZHEADi  )r<   environr*   valuesr   r%   getattrlower)selfr   r   rQ   r   r   r   r   b   s    



zBaseView.dispatchc                 K   s   | j |}|jf |S r   )r#   Zget_templaterender)rW   tempalte_namecontexttemplater   r   r   render_with_paramss   s    zBaseView.render_with_paramsc                    sv   |s|rt di  tjddd j} |j  |j  fdd}|dd |d	d
 |dd | j|f S )Nu@  
Функция self.render() берет окружение из текущего view
Не используйте"

self.render("example.html", qwe="qwe")

Используйте:

qwe="qwe"
self.render("example.html")

Пример:

=== view ===

@cmf.views.action
def get(self):
    qwe="qwe"
    return self.render("example.html")

=== example.html ===

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    {{ qwe }}
</body>
</html>

 r   )rZ      c                    s   |  kr |   |<  | = d S r   r   )oldnewZnamespace_paramsr   r   
rename_key   s    z#BaseView.render.<locals>.rename_keyrW   Z	view_selfr   Z	view_argsr   Zview_kwargs)r+   inspectstackframerG   	f_globalsf_localsr\   )rW   rY   r   r   Z
view_framera   r   r`   r   rX   w   s    *


zBaseView.renderN)rL   r   rM   r   r\   rX   r   r   r   r   rO   a   s   rO   )	metaclassc                 C   s
   d| _ | S )NT)r   fr   r   r   rR      s    rR   c                     s    fdd}|S )Nc                    s    fdd}|S )Nc                     s    rt jkrtd  | |S )Ni  )r<   rQ   r   r   )ri   r   r   r   wrapper   s    z-methods.<locals>.real_action.<locals>.wrapperr   )ri   rj   r   rh   r   real_action   s    zmethods.<locals>.real_actionr   )r   rk   r   r   r   r      s    r   )Zcmf.includerA   r   r   Zuuid	tracebacktyper   objectrO   rR   r   r   r   r   r   <module>   s   Z[