U
    -d                     @   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/pub//c                     s     j | |S N)dispatchargskwargs	new_class ./views/base_view.py<lambda>$       z&BaseViewMeta.__new__.<locals>.<lambda>ZGETZPOSTZ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_nameZurlZendpointaction_nameZaction_method	__class__r   r   r      s>    

zBaseViewMeta.__new__c           	   
      s   ddgt jd}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 )Nzjinja2.ext.autoescapezjinja2.ext.with_)
extensionsZ
autoescapec                 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   W   s    z0BaseViewMeta._create_jinja_env.<locals>.<lambda>)r7   r8   configr9   r:   r;   r<   )r!   Zselect_jinja_autoescapeZjinja2ZFileSystemLoaderr?   ZEnvironmentZflask.helpersr7   r8   Zflask.globalsr9   r:   r;   globalsupdater    rA   filters)	clsr+   optionsZjinja_loaderrvr7   r8   r9   r;   r   r@   r   r   3   s<    	

zBaseViewMeta._create_jinja_env)__name__r   __qualname__r   r   __classcell__r   r   r-   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  }|| jkrtt| | ||S td d S )NZREQUEST_METHOD_methodmethodactioni  )r9   environr'   valuesr"   getattrlowerr   )selfr   r   rM   r   r   r   r   e   s    



zBaseView.dispatchc                 K   s   | j |}|jf |S r   )r    Zget_templaterender)rS   tempalte_namecontexttemplater   r   r   render_with_paramsq   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   )rV      c                    s   |  kr |   |<  | = d S r   r   )oldnewZnamespace_paramsr   r   
rename_key   s    z#BaseView.render.<locals>.rename_keyrS   Z	view_selfr   Z	view_argsr   Zview_kwargs)r(   inspectstackframerC   	f_globalsf_localsrX   )rS   rU   r   r   Z
view_framer]   r   r\   r   rT   u   s    *


zBaseView.renderN)rH   r   rI   r   rX   rT   r   r   r   r   rK   d   s   rK   )	metaclassc                 C   s
   d| _ | S )NT)r   fr   r   r   rN      s    rN   c                     s    fdd}|S )Nc                    s    fdd}|S )Nc                     s    rt jkrtd  | |S )Ni  )r9   rM   r   r   )re   r   r   r   wrapper   s    z-methods.<locals>.real_action.<locals>.wrapperr   )re   rf   r   rd   r   real_action   s    zmethods.<locals>.real_actionr   )r   rg   r   r   r   r      s    r   )Zcmf.includer>   r   r   Zuuid	tracebacktyper   objectrK   rN   r   r   r   r   r   <module>   s   ]V