î
ªÍ XÝ!  ã               @   sÙ   d  d l  Z  d  d l m Z 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 e ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd 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   úE/home/ubuntu/projects/ifolica/build/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                s6   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   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   sJ   i d d 6d d 6d  d 6} | g |  _  | d  k	 rF |  j  j | ƒ n  d  S)NTÚTrueFÚ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 Wd  S)N)Úreversedr   )r   Údr   r   r   Ú__iter__0   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   r'   r   r   r   Úpush4   s    zBaseContext.pushc             C   s+   t  |  j ƒ d k r t ‚ n  |  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   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__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 Sq
 Wd S)NTF)r   )r   r.   r'   r   r   r   Ú__contains__X   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   Ú
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 Sd S)zO
        Compares two contexts by comparing theirs 'dicts' attributes.
        F)r*   r   r?   )r   Úotherr   r   r   Ú__eq__}   s    zBaseContext.__eq__)r   r   r	   r   r   r#   r%   r(   r+   r   r/   r1   r2   r5   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                sS   | |  _  | |  _ | |  _ d |  _ t ƒ  |  _ d  |  _ t t |  ƒ j	 | ƒ d  S)NÚunknown)
Ú
autoescapeÚuse_l10nÚuse_tzZtemplate_nameÚRenderContextÚrender_contextÚtemplater   rB   r   )r   r   rD   rE   rF   )r   r   r   r   Œ   s    					zContext.__init__c             c   sA   |  j  d  k	 r t d ƒ ‚ n  | |  _  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  t |  ƒ j ƒ  } t |  j ƒ | _ | S)N)r   rB   r#   r   rH   )r   r"   )r   r   r   r#   ¡   s    zContext.__copy__c             C   sV   t  | d ƒ s t d ƒ ‚ n  t | t ƒ rI | j d d … j ƒ  } n  t |  | ƒ S)z=Pushes 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               @   sI   e  Z d  Z d Z d d „  Z d d „  Z d d d „ Z 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.
    c             c   s!   x |  j  d D] } | Vq Wd  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   r6   Â   s    zRenderContext.__contains__Nc             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__)r   r   r	   r
   r(   r6   r8   r1   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  t |  ƒ j | d | d | d | ƒ| |  _ | d  k rC f  n	 t | ƒ |  _ t |  j ƒ |  _ |  j	 i  ƒ |  j	 i  ƒ d  S)NrE   rF   rD   )
r   rO   r   ÚrequestÚtupleÚ_processorsr,   r   Ú_processors_indexr>   )r   rP   r   Ú
processorsrE   rF   rD   )r   r   r   r   Ó   s    	!zRequestContext.__init__c             c   s¡   |  j  d  k	 r t d ƒ ‚ n  | |  _  | j j |  j } i  } x$ | D] } | j | |  j ƒ ƒ qG 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_processorsrR   r>   rP   r   rS   )r   rI   rT   ZupdatesÚ	processorr   r   r   rK   á   s    		
		zRequestContext.bind_templatec                s4   t  t |  ƒ j | ƒ } t | d ƒ r0 | ` n  | S)NrS   )r   rO   r=   rL   rS   )r   r;   r<   )r   r   r   r=   ö   s    	zRequestContext.new)r   r   r	   r
   r   r   rK   r=   r   r   )r   r   rO   Ì   s   !rO   c             K   sM   | d k r t  |  |  }  n+ |  } t | |  }  | rI |  j | ƒ n  |  S)zT
    Create a suitable Context from a plain dict and optionally an HttpRequest.
    N)rB   rO   r+   )r   rP   r   Zoriginal_contextr   r   r   Úmake_contextÿ   s    rV   )r   )r3   Ú
contextlibr   r   Zdjango.utils.deprecationr   Z_builtin_context_processorsÚ	Exceptionr   Údictr   Úobjectr   rB   rG   rO   rV   r   r   r   r   Ú<module>   s   l%3