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>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_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   )r8   r   r   r   W   s     z0BaseViewMeta._create_jinja_env.<locals>.<lambda>)r5   r6   configr7   r8   r9   r:   )r    Zselect_jinja_autoescapeZjinja2ZFileSystemLoaderr=   ZEnvironmentZflask.helpersr5   r6   Zflask.globalsr7   r8   r9   globalsupdater   r>   filters)	clsr*   optionsZjinja_loaderrvr5   r6   r7   r9   r   )r8   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  }|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  )r7   environr&   valuesr   r!   getattrlower)selfr   r   rJ   r   r   r   r   e   s    



zBaseView.dispatchc             K   s   | j |}|jf |S )N)r   Zget_templaterender)rP   tempalte_namecontexttemplater   r   r   render_with_paramsv   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   )rS      c                s   |  kr |   |<  | = d S )Nr   )oldnew)namespace_paramsr   r   
rename_key   s    z#BaseView.render.<locals>.rename_keyrP   Z	view_selfr   Z	view_argsr   Zview_kwargs)r'   inspectstackframer@   	f_globalsf_localsrU   )rP   rR   r   r   Z
view_framerZ   r   )rY   r   rQ   z   s    #


zBaseView.renderN)rE   r   rF   r   rU   rQ   r   r   r   r   rH   d   s   rH   )	metaclassc             C   s
   d| _ | S )NT)r   )fr   r   r   rK      s    rK   c                 s    fdd}|S )Nc                s    fdd}|S )Nc                 s    rt jkrtd  | |S )Ni  )r7   rJ   r   )r   r   )ra   r   r   r   wrapper   s    z-methods.<locals>.real_action.<locals>.wrapperr   )ra   rb   )r   )ra   r   real_action   s    zmethods.<locals>.real_actionr   )r   rc   r   )r   r   r      s    r   )Zcmf.includer<   r   r   Zuuid	tracebacktyper   objectrH   rK   r   r   r   r   r   <module>   s   ][