
vÅÏ^#  ã               @   sº   d  d l  m Z d  d l m Z d Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d	 „  d	 ƒ Z Gd
 d „  d e ƒ Z	 Gd d „  d e ƒ Z
 Gd d „  d e	 ƒ Z d d d „ Z d S)é    )Úcontextmanager)Úcopyú'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
   ú9/tmp/pip-build-8lau8j11/django/django/template/context.pyr      s   r   c                   s:   e  Z d  Z ‡  f d d †  Z d d „  Z d d „  Z ‡  S)ÚContextDictc                s0   t  ƒ  j | | Ž  | j j |  ƒ | |  _ d  S)N)ÚsuperÚ__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   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 ‡  S)$ÚBaseContextNc             C   s   |  j  | ƒ d  S)N)Ú_reset_dicts)r   Údict_r
   r
   r   r      s    zBaseContext.__init__c             C   sD   d d d d d d  i } | g |  _  | d  k	 r@ |  j  j | ƒ d  S)NÚTrueTÚFalseFÚNone)r   r   )r   ÚvalueÚbuiltinsr
   r
   r   r      s    zBaseContext._reset_dictsc                s)   t  t ƒ  ƒ } |  j d  d  … | _ | S)N)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   t  |  j ƒ S)N)Úreversedr   )r   r
   r
   r   Ú__iter__-   s    zBaseContext.__iter__c             O   s]   g  } xD | D]< } t  | t ƒ r< | | j d d  … 7} q | j | ƒ q Wt |  | | Ž S)Né   )Ú
isinstancer   r   r   r   )r   r   r   r   Údr
   r
   r   Úpush0   s    zBaseContext.pushc             C   s(   t  |  j ƒ d k r t ‚ |  j j ƒ  S)Nr'   )Úlenr   r   r   )r   r
   r
   r   r   9   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__>   s    zBaseContext.__setitem__c             C   sH   |  j  d } x* t |  j  ƒ D] } | | k r | } Pq W| | | <d S)z|
        Set a variable in one of the higher contexts if it exists there,
        otherwise in the current context.
        r'   Nr,   )r   r%   )r   r-   r   r   r)   r
   r
   r   Ú
set_upwardB   s    zBaseContext.set_upwardc             C   s>   x+ t  |  j ƒ D] } | | k r | | Sq Wt | ƒ ‚ 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__N   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__U   s    zBaseContext.__delitem__c                s    t  ‡  f d d †  |  j Dƒ ƒ S)Nc             3   s   |  ] } ˆ  | k Vq d  S)Nr
   )Ú.0r)   )r-   r
   r   ú	<genexpr>Z   s    z+BaseContext.__contains__.<locals>.<genexpr>)Úanyr   )r   r-   r
   )r-   r   Ú__contains__Y   s    zBaseContext.__contains__c             C   s2   x+ t  |  j ƒ D] } | | k r | | Sq W| S)N)r%   r   )r   r-   Ú	otherwiser)   r
   r
   r   Úget\   s    zBaseContext.getc             C   s/   y |  | SWn t  k
 r* | |  | <Yn X| S)N)r0   )r   r-   Údefaultr
   r
   r   Ú
setdefaultb   s
    zBaseContext.setdefaultc             C   s   t  |  ƒ } | j | ƒ | S)z{
        Return a new context with the same properties, but with only the
        values given in 'values' stored.
        )r   r   )r   ÚvaluesÚnew_contextr
   r
   r   Únewi   s    zBaseContext.newc             C   s+   i  } x |  j  D] } | j | ƒ q W| S)z6
        Return self.dicts as one dictionary.
        )r   Úupdate)r   Zflatr)   r
   r
   r   Úflattenr   s    zBaseContext.flattenc             C   s%   t  | t ƒ o$ |  j ƒ  | j ƒ  k S)zN
        Compare two contexts by comparing theirs 'dicts' attributes.
        )r(   r   r?   )r   Úotherr
   r
   r   Ú__eq__{   s    zBaseContext.__eq__)r   r   r   r   r   r"   r$   r&   r*   r   r.   r/   r1   r2   r6   r8   r:   r=   r?   rA   r
   r
   )r   r   r      s"   			r   c                   sd   e  Z d  Z d Z d d d d ‡  f d d † Z e d d „  ƒ Z ‡  f d d	 †  Z d
 d „  Z ‡  S)ÚContextz&A stack container for variable contextNTc                sM   | |  _  | |  _ | |  _ d |  _ t ƒ  |  _ d  |  _ t ƒ  j | ƒ d  S)NÚunknown)	Ú
autoescapeÚuse_l10nÚuse_tzZtemplate_nameÚRenderContextÚrender_contextÚtemplater   r   )r   r   rD   rE   rF   )r   r
   r   r   ‰   s    					zContext.__init__c             c   s>   |  j  d  k	 r t d ƒ ‚ | |  _  z	 d  VWd  d  |  _  Xd  S)Nz&Context is already bound to a template)rI   ÚRuntimeError)r   rI   r
   r
   r   Úbind_template”   s    		zContext.bind_templatec                s%   t  ƒ  j ƒ  } t |  j ƒ | _ | S)N)r   r"   r   rH   )r   r!   )r   r
   r   r"   ž   s    zContext.__copy__c             C   sP   t  | d ƒ s t d ƒ ‚ t | t ƒ rC | j d d … j ƒ  } t |  | ƒ S)z;Push other_dict to the stack of dictionaries in the Contextr1   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)	r   r   r   r	   r   r   rK   r"   r>   r
   r
   )r   r   rB   ‡   s
   
rB   c               @   sd   e  Z d  Z d Z d Z d d „  Z d d „  Z d d d „ Z d	 d
 „  Z e	 d d d „ ƒ Z
 d S)rG   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.
    Nc             c   s   |  j  d Ed  Hd  S)Nr'   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   r6   À   s    zRenderContext.__contains__c             C   s   |  j  d j | | ƒ S)Nr'   r,   )r   r8   )r   r-   r7   r
   r
   r   r8   Ã   s    zRenderContext.getc             C   s   |  j  d | S)Nr'   r,   )r   )r   r-   r
   r
   r   r1   Æ   s    zRenderContext.__getitem__Tc             c   sL   |  j  } | |  _  | r" |  j ƒ  z	 d  VWd  | |  _  | rG |  j ƒ  Xd  S)N)rI   r*   r   )r   rI   Zisolated_contextÚinitialr
   r
   r   Ú
push_stateÉ   s    		
		zRenderContext.push_state)r   r   r   r	   rI   r&   r6   r8   r1   r   rP   r
   r
   r
   r   rG   ¬   s   rG   c                   s^   e  Z d  Z d Z d d d d d ‡  f d d † Z e d d „  ƒ Z d ‡  f d d	 † 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                s|   t  ƒ  j | d | d | d | ƒ| |  _ | d  k r= f  n	 t | ƒ |  _ t |  j ƒ |  _ |  j i  ƒ |  j i  ƒ d  S)NrE   rF   rD   )	r   r   ÚrequestÚtupleÚ_processorsr+   r   Ú_processors_indexr>   )r   rR   r   Ú
processorsrE   rF   rD   )r   r
   r   r   Þ   s    "	!zRequestContext.__init__c             c   sž   |  j  d  k	 r t d ƒ ‚ | |  _  | j j |  j } i  } x$ | D] } | j | |  j ƒ ƒ qD W| |  j |  j <z	 d  VWd  d  |  _  i  |  j |  j <Xd  S)Nz&Context is already bound to a template)	rI   rJ   ZengineZtemplate_context_processorsrT   r>   rR   r   rU   )r   rI   rV   ZupdatesÚ	processorr
   r
   r   rK   ë   s    		
		zRequestContext.bind_templatec                s+   t  ƒ  j | ƒ } t | d ƒ r' | ` | S)NrU   )r   r=   rL   rU   )r   r;   r<   )r   r
   r   r=      s    zRequestContext.new)r   r   r   r	   r   r   rK   r=   r
   r
   )r   r   rQ   ×   s   !rQ   Nc             K   s|   |  d k	 r2 t  |  t ƒ r2 t d |  j j ƒ ‚ | d k rP t |  |  }  n( |  } t | |  }  | rx |  j | ƒ |  S)zT
    Create a suitable Context from a plain dict and optionally an HttpRequest.
    Nz&context must be a dict rather than %s.)r(   ÚdictrM   r   r   rB   rQ   r*   )r   rR   r   Zoriginal_contextr
   r
   r   Úmake_context	  s    rY   )r   )Ú
contextlibr   r   Z_builtin_context_processorsÚ	Exceptionr   rX   r   r   rB   rG   rQ   rY   r
   r
   r
   r   Ú<module>   s   l%+2