B
    f+                 @   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  _x: j D ]"\}}	t|	drވ j|  qW n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>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      s4    



zBaseViewMeta.__new__c       	   
      s   ddgt jd}tdd d|d|dd	|d
dg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   )r5   r   r   r   W   s     z0BaseViewMeta._create_jinja_env.<locals>.<lambda>)r2   r3   configr4   r5   r6   r7   )r   Zselect_jinja_autoescapeZjinja2ZFileSystemLoaderr:   ZEnvironmentZflask.helpersr2   r3   Zflask.globalsr4   r5   r6   globalsupdater   r;   filters)	clsr'   optionsZjinja_loaderrvr2   r3   r4   r6   r   )r5   r   r   3   s2    
	
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  )r4   environr#   valuesr   getattrlowerr   )selfr   r   rG   r   r   r   r   e   s    



zBaseView.dispatchc             K   s   | j |}|jf |S )N)r   Zget_templaterender)rM   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   )rP      c                s   |  kr |   |<  | = d S )Nr   )oldnew)namespace_paramsr   r   
rename_key   s    z#BaseView.render.<locals>.rename_keyrM   Z	view_selfr   Z	view_argsr   Zview_kwargs)r$   inspectstackframer=   	f_globalsf_localsrR   )rM   rO   r   r   Z
view_framerW   r   )rV   r   rN   u   s    #


zBaseView.renderN)rB   r   rC   r   rR   rN   r   r   r   r   rE   d   s   rE   )	metaclassc             C   s
   d| _ | S )NT)r   )fr   r   r   rH      s    rH   c                 s    fdd}|S )Nc                s    fdd}|S )Nc                 s    rt jkrtd  | |S )Ni  )r4   rG   r   )r   r   )r^   r   r   r   wrapper   s    z-methods.<locals>.real_action.<locals>.wrapperr   )r^   r_   )r   )r^   r   real_action   s    zmethods.<locals>.real_actionr   )r   r`   r   )r   r   r      s    r   )Zcmf.includer9   r   r   Zuuid	tracebacktyper   objectrE   rH   r   r   r   r   r   <module>   s   ]V