o
    {,h$                     @   s   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	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 )    )contextmanager)copy)z'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	   M/var/www/html/rh/venv/lib/python3.10/site-packages/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  j|i | |j|  || _d S N)super__init__dictsappendcontext)selfr   argskwargs	__class__r	   r
   r      s   
zContextDict.__init__c                 C   s   | S r   r	   r   r	   r	   r
   	__enter__   s   zContextDict.__enter__c                 O   s   | j   d S r   )r   pop)r   r   r   r	   r	   r
   __exit__      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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dS )%BaseContextNc                 C   s   |  | d S r   )_reset_dicts)r   dict_r	   r	   r
   r      r   zBaseContext.__init__c                 C   sV   ddd d}|g| _ t|tr|  j |j dd  7  _ d S |d ur)| j | d S d S )NTF)TrueFalseNone   )r   
isinstancer   r   )r   valuebuiltinsr	   r	   r
   r       s   
zBaseContext._reset_dictsc                 C   s.   t  }| j|_t| j|_| jd d  |_|S r   )r   r   r   __dict__r   r   	duplicater	   r	   r
   __copy__(   s
   zBaseContext.__copy__c                 C   
   t | jS r   )reprr   r   r	   r	   r
   __repr__/      
zBaseContext.__repr__c                 C   r+   r   reversedr   r   r	   r	   r
   __iter__2   r.   zBaseContext.__iter__c                 O   sL   g }|D ]}t |tr||jdd  7 }q|| qt| g|R i |S Nr#   )r$   r   r   r   r   )r   r   r   r   dr	   r	   r
   push5   s   
zBaseContext.pushc                 C   s   t | jdkr	t| j S r2   )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 contextNr   )r   keyr%   r	   r	   r
   __setitem__C   s   zBaseContext.__setitem__c                 C   s6   | j d }t| j D ]
}||v r|} nq
|||< dS )z|
        Set a variable in one of the higher contexts if it exists there,
        otherwise in the current context.
        r6   N)r   r0   )r   r8   r%   r   r3   r	   r	   r
   
set_upwardG   s   
zBaseContext.set_upwardc                 C   s,   t | jD ]}||v r||   S qt|)zHGet a variable's value, starting at the current context and going upward)r0   r   KeyError)r   r8   r3   r	   r	   r
   __getitem__S   s
   zBaseContext.__getitem__c                 C   s   | j d |= dS )z*Delete a variable from the current contextr6   Nr7   r   r8   r	   r	   r
   __delitem__Z   s   zBaseContext.__delitem__c                    s   t  fdd| jD S )Nc                 3   s    | ]} |v V  qd S r   r	   ).0r3   r8   r	   r
   	<genexpr>_   s    z+BaseContext.__contains__.<locals>.<genexpr>)anyr   r=   r	   r@   r
   __contains__^   s   zBaseContext.__contains__c                 C   s(   t | jD ]}||v r||   S q|S r   r/   )r   r8   	otherwiser3   r	   r	   r
   geta   s
   zBaseContext.getc                 C   s(   z| | W S  t y   || |< Y |S w r   )r;   )r   r8   defaultr	   r	   r
   
setdefaultg   s   

zBaseContext.setdefaultc                 C   s   t | }|| |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
   newn   s   
zBaseContext.newc                 C   s   i }| j D ]}|| q|S )z6
        Return self.dicts as one dictionary.
        )r   update)r   flatr3   r	   r	   r
   flattenw   s   
zBaseContext.flattenc                 C   s   t |tstS |  | kS )zN
        Compare two contexts by comparing theirs 'dicts' attributes.
        )r$   r   NotImplementedrN   )r   otherr	   r	   r
   __eq__   s   
zBaseContext.__eq__r   )r   r   r   r   r   r*   r-   r1   r4   r   r9   r:   r<   r>   rC   rE   rG   rK   rN   rQ   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                    s6   || _ || _|| _d| _t | _d | _t | d S )Nunknown)	
autoescapeuse_l10nuse_tztemplate_nameRenderContextrender_contexttemplater   r   )r   r   rT   rU   rV   r   r	   r
   r      s   zContext.__init__c                 c   s6    | j d ur
td|| _ z	d V  W d | _ d S d | _ w )N&Context is already bound to a template)rZ   RuntimeError)r   rZ   r	   r	   r
   bind_template   s   
zContext.bind_templatec                    s   t   }t| j|_|S r   )r   r*   r   rY   r(   r   r	   r
   r*      s   
zContext.__copy__c                 C   s8   t |ds	tdt|tr|jdd  }t| |S )z;Push other_dict to the stack of dictionaries in the Contextr<   z6other_dict must be a mapping (dictionary-like) object.r#   N)hasattr	TypeErrorr$   r   r   r   r   )r   
other_dictr	   r	   r
   rL      s
   


zContext.update)NTNN)
r   r   r   r   r   r   r]   r*   rL   r   r	   r	   r   r
   rR      s    
	rR   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 )rX   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 E d H  d S Nr6   r7   r   r	   r	   r
   r1      s   zRenderContext.__iter__c                 C   s   || j d v S ra   r7   r=   r	   r	   r
   rC      r   zRenderContext.__contains__c                 C   s   | j d ||S ra   )r   rE   )r   r8   rD   r	   r	   r
   rE      s   zRenderContext.getc                 C   s   | j d | S ra   r7   r=   r	   r	   r
   r<      r   zRenderContext.__getitem__Tc                 c   sT    | j }|| _ |r|   zd V  W || _ |r|   d S d S || _ |r)|   w w r   )rZ   r4   r   )r   rZ   isolated_contextinitialr	   r	   r
   
push_state   s   
zRenderContext.push_stater   )T)r   r   r   r   rZ   r1   rC   rE   r<   r   rd   r	   r	   r	   r
   rX      s    
rX   c                       sF   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                    sT   t  j||||d || _|d u rdnt|| _t| j| _| i  | i  d S )N)rU   rV   rT   r	   )	r   r   requesttuple_processorsr5   r   _processors_indexrL   )r   rf   r   
processorsrU   rV   rT   r   r	   r
   r      s   	
zRequestContext.__init__c                 c   s    | j d ur
td|| _ |jj| j }i }|D ]$}|| j}z|| W q ty< } z
td|j d|d }~ww || j	| j
< zd V  W d | _ i | j	| j
< d S d | _ i | j	| j
< w )Nr[   zContext processor z didn't return a dictionary.)rZ   r\   enginetemplate_context_processorsrh   rf   rL   r_   r   r   ri   )r   rZ   rj   updates	processorr   er	   r	   r
   r]      s2   

zRequestContext.bind_templatec                    s   t  |}t|dr|`|S )Nri   )r   rK   r^   ri   rH   r   r	   r
   rK     s   
zRequestContext.new)NNNNTr   )	r   r   r   r   r   r   r]   rK   r   r	   r	   r   r
   re      s    

re   Nc                 K   sd   | durt | tstd| jj |du rt| fi |} | S | }t|fi |} |r0| | | S )zT
    Create a suitable Context from a plain dict and optionally an HttpRequest.
    Nz&context must be a dict rather than %s.)r$   dictr_   r   r   rR   re   r4   )r   rf   r   original_contextr	   r	   r
   make_context  s   

rr   r   )
contextlibr   r   _builtin_context_processors	Exceptionr   rp   r   r   rR   rX   re   rr   r	   r	   r	   r
   <module>   s    n&,B