3
š(ƒhÝ!  ã               @   sž   d dl Z d dlmZ d dlmZ d dlmZ dZG dd„ deƒZG dd	„ d	e	ƒZ
G d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZddd„ZdS )é    N)Úcontextmanager)Úcopy)ÚRemovedInDjango20Warningú'django.template.context_processors.csrfc               @   s   e Zd ZdZdS )ÚContextPopExceptionz,pop() has been called more times than push()N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú;/tmp/pip-install-q3hcpn_q/Django/django/template/context.pyr      s   r   c                   s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚContextDictc                s(   t t| ƒj||Ž |jj| ƒ || _d S )N)Úsuperr   Ú__init__ÚdictsÚappendÚcontext)Úselfr   ÚargsÚkwargs)Ú	__class__r   r   r      s    zContextDict.__init__c             C   s   | S )Nr   )r   r   r   r   Ú	__enter__   s    zContextDict.__enter__c             O   s   | j jƒ  d S )N)r   Úpop)r   r   r   r   r   r   Ú__exit__   s    zContextDict.__exit__)r   r   r	   r   r   r   Ú__classcell__r   r   )r   r   r      s   r   c                   s¦   e Zd Zd$dd„Zd%dd„Z‡ fdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zd&dd„Zd'dd„Zd(dd„Zd d!„ Zd"d#„ Z‡  ZS ))ÚBaseContextNc             C   s   | j |ƒ d S )N)Ú_reset_dicts)r   Údict_r   r   r   r      s    zBaseContext.__init__c             C   s,   ddd dœ}|g| _ |d k	r(| j j|ƒ d S )NTF)ÚTrueÚFalseÚNone)r   r   )r   ÚvalueÚbuiltinsr   r   r   r   "   s    zBaseContext._reset_dictsc                s"   t tt| ƒƒ}| jd d … |_|S )N)r   r   r   r   )r   Ú	duplicate)r   r   r   Ú__copy__(   s    zBaseContext.__copy__c             C   s
   t | jƒS )N)Úreprr   )r   r   r   r   Ú__repr__-   s    zBaseContext.__repr__c             c   s   xt | jƒD ]
}|V  qW d S )N)Úreversedr   )r   Údr   r   r   Ú__iter__0   s    zBaseContext.__iter__c             O   sJ   g }x4|D ],}t |tƒr,||jdd … 7 }q
|j|ƒ q
W t| f|ž|ŽS )Né   )Ú
isinstancer   r   r   r   )r   r   r   r   r(   r   r   r   Úpush4   s    

zBaseContext.pushc             C   s   t | jƒdkrt‚| jjƒ S )Nr*   )Úlenr   r   r   )r   r   r   r   r   =   s    zBaseContext.popc             C   s   || j d |< dS )z%Set a variable in the current contextr*   Néÿÿÿÿ)r   )r   Úkeyr!   r   r   r   Ú__setitem__B   s    zBaseContext.__setitem__c             C   s0   x"t | jƒD ]}||kr|| S qW t|ƒ‚dS )zHGet a variable's value, starting at the current context and going upwardN)r'   r   ÚKeyError)r   r/   r(   r   r   r   Ú__getitem__F   s    zBaseContext.__getitem__c             C   s   | j d |= dS )z*Delete a variable from the current contextr*   Nr.   )r   )r   r/   r   r   r   Ú__delitem__M   s    zBaseContext.__delitem__c             C   s   t jd| jj tƒ || kS )Nz9%s.has_key() is deprecated in favor of the 'in' operator.)ÚwarningsÚwarnr   r   r   )r   r/   r   r   r   Úhas_keyQ   s    
zBaseContext.has_keyc             C   s    x| j D ]}||krdS qW dS )NTF)r   )r   r/   r(   r   r   r   Ú__contains__X   s    zBaseContext.__contains__c             C   s(   x"t | jƒD ]}||kr|| S qW |S )N)r'   r   )r   r/   Ú	otherwiser(   r   r   r   Úget^   s    zBaseContext.getc             C   s*   y| | S  t k
r$   || |< Y nX |S )N)r1   )r   r/   Údefaultr   r   r   Ú
setdefaultd   s
    zBaseContext.setdefaultc             C   s   t | ƒ}|j|ƒ |S )z|
        Returns a new context with the same properties, but with only the
        values given in 'values' stored.
        )r   r   )r   ÚvaluesÚnew_contextr   r   r   Únewk   s    
zBaseContext.newc             C   s"   i }x| j D ]}|j|ƒ qW |S )z6
        Returns self.dicts as one dictionary
        )r   Úupdate)r   Zflatr(   r   r   r   Úflattent   s    zBaseContext.flattenc             C   s   t |tƒr| jƒ |jƒ kS dS )zO
        Compares two contexts by comparing theirs 'dicts' attributes.
        F)r+   r   r@   )r   Úotherr   r   r   Ú__eq__}   s    
zBaseContext.__eq__)N)N)N)N)N)r   r   r	   r   r   r$   r&   r)   r,   r   r0   r2   r3   r6   r7   r9   r;   r>   r@   rB   r   r   r   )r   r   r      s"   

	


		r   c                   sB   e Zd ZdZd‡ fdd„	Zedd„ ƒZ‡ fdd	„Zd
d„ Z‡  Z	S )ÚContextz&A stack container for variable contextNTc                s:   || _ || _|| _d| _tƒ | _d | _tt| ƒj	|ƒ d S )NÚunknown)
Ú
autoescapeÚuse_l10nÚuse_tzZtemplate_nameÚRenderContextÚrender_contextÚtemplater   rC   r   )r   r   rE   rF   rG   )r   r   r   r   Œ   s    zContext.__init__c             c   s0   | j d k	rtdƒ‚|| _ z
d V  W d d | _ X d S )Nz&Context is already bound to a template)rJ   ÚRuntimeError)r   rJ   r   r   r   Úbind_template—   s    

zContext.bind_templatec                s   t t| ƒjƒ }t| jƒ|_|S )N)r   rC   r$   r   rI   )r   r#   )r   r   r   r$   ¡   s    zContext.__copy__c             C   s8   t |dƒstdƒ‚t|tƒr.|jdd… jƒ }t| |ƒS )z=Pushes other_dict to the stack of dictionaries in the Contextr2   z6other_dict must be a mapping (dictionary-like) object.r*   N)ÚhasattrÚ	TypeErrorr+   r   r   r   r   )r   Ú
other_dictr   r   r   r?   ¦   s
    

zContext.update)NTNN)
r   r   r	   r
   r   r   rL   r$   r?   r   r   r   )r   r   rC   Š   s
   
rC   c               @   s2   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ ZdS )rH   aÈ  
    A stack container for storing Template state.

    RenderContext simplifies the implementation of template Nodes by providing a
    safe place to store state between invocations of a node's `render` method.

    The RenderContext also provides scoping rules that are more sensible for
    'template local' variables. The render context stack is pushed before each
    template is rendered, creating a fresh scope with nothing in it. Name
    resolution fails if a variable is not found at the top of the RequestContext
    stack. Thus, variables are local to a specific template and don't affect the
    rendering of other templates as they would if they were stored in the normal
    template context.
    c             c   s   x| j d D ]
}|V  qW d S )Nr*   r.   )r   )r   r(   r   r   r   r)   ¾   s    zRenderContext.__iter__c             C   s   || j d kS )Nr*   r.   )r   )r   r/   r   r   r   r7   Â   s    zRenderContext.__contains__Nc             C   s   | j d j||ƒS )Nr*   r.   )r   r9   )r   r/   r8   r   r   r   r9   Å   s    zRenderContext.getc             C   s   | j d | S )Nr*   r.   )r   )r   r/   r   r   r   r2   È   s    zRenderContext.__getitem__)N)r   r   r	   r
   r)   r7   r9   r2   r   r   r   r   rH   ¯   s
   
rH   c                   s<   e Zd ZdZd
‡ fdd„	Zedd„ ƒZd‡ fdd	„	Z‡  ZS )ÚRequestContextzù
    This subclass of template.Context automatically populates itself using
    the processors defined in the engine's configuration.
    Additional processors can be specified as a list of callables
    using the "processors" keyword argument.
    NTc                sX   t t| ƒj||||d || _|d kr*f nt|ƒ| _t| jƒ| _| j	i ƒ | j	i ƒ d S )N)rF   rG   rE   )
r   rP   r   ÚrequestÚtupleÚ_processorsr-   r   Ú_processors_indexr?   )r   rQ   r   Ú
processorsrF   rG   rE   )r   r   r   r   Ó   s    

zRequestContext.__init__c             c   sx   | j d k	rtdƒ‚|| _ |jj| j }i }x|D ]}|j|| jƒƒ q0W || j| j< z
d V  W d d | _ i | j| j< X d S )Nz&Context is already bound to a template)	rJ   rK   ZengineZtemplate_context_processorsrS   r?   rQ   r   rT   )r   rJ   rU   ZupdatesÚ	processorr   r   r   rL   á   s    


zRequestContext.bind_templatec                s"   t t| ƒj|ƒ}t|dƒr|`|S )NrT   )r   rP   r>   rM   rT   )r   r<   r=   )r   r   r   r>   ö   s    
zRequestContext.new)NNNNT)N)	r   r   r	   r
   r   r   rL   r>   r   r   r   )r   r   rP   Ì   s   rP   c             K   s8   |dkrt | f|Ž} n| }t|f|Ž} |r4| j|ƒ | S )zT
    Create a suitable Context from a plain dict and optionally an HttpRequest.
    N)rC   rP   r,   )r   rQ   r   Zoriginal_contextr   r   r   Úmake_contextÿ   s    
rW   )r   )N)r4   Ú
contextlibr   r   Zdjango.utils.deprecationr   Z_builtin_context_processorsÚ	Exceptionr   Údictr   Úobjectr   rC   rH   rP   rW   r   r   r   r   Ú<module>   s   l%3