a
    5¤Xh,#  ã                   @   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	   ú\/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/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__   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   |   |¡ d S r   )Ú_reset_dicts)r   Údict_r	   r	   r
   r      s    zBaseContext.__init__c                 C   s,   ddd dœ}|g| _ |d ur(| j  |¡ d S )NTF)ÚTrueÚFalseÚNone)r   r   )r   ÚvalueÚbuiltinsr	   r	   r
   r      s    zBaseContext._reset_dictsc                    s   t tƒ ƒ}| jd d … |_|S r   )r   r   r   ©r   Z	duplicater   r	   r
   Ú__copy__%   s    
zBaseContext.__copy__c                 C   s
   t | jƒS r   )Úreprr   r   r	   r	   r
   Ú__repr__*   s    zBaseContext.__repr__c                 C   s
   t | jƒS r   ©Úreversedr   r   r	   r	   r
   Ú__iter__-   s    zBaseContext.__iter__c                 O   sL   g }|D ],}t |tƒr*||jdd … 7 }q| |¡ qt| g|¢R i |¤Ž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 ¡ S r+   )Ú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 contextéÿÿÿÿN©r   )r   Úkeyr"   r	   r	   r
   Ú__setitem__>   s    zBaseContext.__setitem__c                 C   s6   | j d }t| j ƒD ]}||v r|} q*q|||< dS )z|
        Set a variable in one of the higher contexts if it exists there,
        otherwise in the current context.
        r1   N)r   r)   )r   r3   r"   r   r.   r	   r	   r
   Ú
set_upwardB   s    
zBaseContext.set_upwardc                 C   s0   t | jƒD ]}||v r
||   S q
t|ƒ‚dS )zHGet a variable's value, starting at the current context and going upwardN)r)   r   ÚKeyError)r   r3   r.   r	   r	   r
   Ú__getitem__N   s    zBaseContext.__getitem__c                 C   s   | j d |= dS )z*Delete a variable from the current contextr1   Nr2   ©r   r3   r	   r	   r
   Ú__delitem__U   s    zBaseContext.__delitem__c                    s   t ‡ fdd„| jD ƒƒS )Nc                 3   s   | ]}ˆ |v V  qd S r   r	   )Ú.0r.   ©r3   r	   r
   Ú	<genexpr>Z   ó    z+BaseContext.__contains__.<locals>.<genexpr>)Úanyr   r8   r	   r;   r
   Ú__contains__Y   s    zBaseContext.__contains__c                 C   s(   t | jƒD ]}||v r
||   S q
|S r   r(   )r   r3   Ú	otherwiser.   r	   r	   r
   Úget\   s    zBaseContext.getc                 C   s*   z
| | W S  t y$   || |< Y n0 |S r   )r6   )r   r3   Údefaultr	   r	   r
   Ú
setdefaultb   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   ÚvaluesZnew_contextr	   r	   r
   Únewi   s    
zBaseContext.newc                 C   s   i }| j D ]}| |¡ q
|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ƒstS |  ¡ | ¡ kS )zN
        Compare two contexts by comparing theirs 'dicts' attributes.
        )r-   r   ÚNotImplementedrH   )r   Úotherr	   r	   r
   Ú__eq__{   s    
zBaseContext.__eq__)N)N)N)N)N)r   r   r   r   r   r%   r'   r*   r/   r   r4   r5   r7   r9   r?   rA   rC   rF   rH   rK   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                    s6   || _ || _|| _d| _tƒ | _d | _tƒ  |¡ d S )NÚunknown)	Ú
autoescapeÚuse_l10nÚuse_tzZtemplate_nameÚRenderContextÚrender_contextÚtemplater   r   )r   r   rN   rO   rP   r   r	   r
   r   ˆ   s    zContext.__init__c                 c   s6   | j d urtdƒ‚|| _ zd V  W d | _ nd | _ 0 d S ©Nz&Context is already bound to a template)rS   ÚRuntimeError)r   rS   r	   r	   r
   Úbind_template“   s    
zContext.bind_templatec                    s   t ƒ  ¡ }t| jƒ|_|S r   )r   r%   r   rR   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 Contextr7   z6other_dict must be a mapping (dictionary-like) object.r,   N)ÚhasattrÚ	TypeErrorr-   r   r   r   r   )r   Ú
other_dictr	   r	   r
   rG   ¢   s
    

zContext.update)NTNN)
r   r   r   r   r   r   rV   r%   rG   r   r	   r	   r   r
   rL   …   s   
	rL   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 )rQ   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 ©Nr1   r2   r   r	   r	   r
   r*   ½   s    zRenderContext.__iter__c                 C   s   || j d v S rZ   r2   r8   r	   r	   r
   r?   À   s    zRenderContext.__contains__c                 C   s   | j d  ||¡S rZ   )r   rA   )r   r3   r@   r	   r	   r
   rA   Ã   s    zRenderContext.getc                 C   s   | j d | S rZ   r2   r8   r	   r	   r
   r7   Æ   s    zRenderContext.__getitem__Tc                 c   sN   | j }|| _ |r|  ¡  zd V  W || _ |rJ|  ¡  n|| _ |rH|  ¡  0 d S r   )rS   r/   r   )r   rS   Zisolated_contextÚinitialr	   r	   r
   Ú
push_stateÉ   s    
þzRenderContext.push_state)N)T)r   r   r   r   rS   r*   r?   rA   r7   r   r\   r	   r	   r	   r
   rQ   «   s   
rQ   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                    sT   t ƒ j||||d || _|d u r&dnt|ƒ| _t| jƒ| _|  i ¡ |  i ¡ d S )N)rO   rP   rN   r	   )	r   r   ÚrequestÚtupleÚ_processorsr0   r   Ú_processors_indexrG   )r   r^   r   Ú
processorsrO   rP   rN   r   r	   r
   r   ß   s    	
zRequestContext.__init__c              	   c   s†   | j d urtdƒ‚|| _ |jj| j }i }|D ]}| || jƒ¡ q.|| j| j< zd V  W d | _ i | j| j< nd | _ i | j| j< 0 d S rT   )	rS   rU   ZengineZtemplate_context_processorsr`   rG   r^   r   ra   )r   rS   rb   ZupdatesÚ	processorr	   r	   r
   rV   ô   s    
þzRequestContext.bind_templatec                    s   t ƒ  |¡}t|dƒr|`|S )Nra   )r   rF   rW   ra   rD   r   r	   r
   rF     s    
zRequestContext.new)NNNNT)N)	r   r   r   r   r   r   rV   rF   r   r	   r	   r   r
   r]   ×   s   
     ù
r]   Nc                 K   sb   | dur"t | tƒs"td| jj ƒ‚|du r<t| fi |¤Ž} n"| }t|fi |¤Ž} |r^|  |¡ | S )zT
    Create a suitable Context from a plain dict and optionally an HttpRequest.
    Nz&context must be a dict rather than %s.)r-   ÚdictrX   r   r   rL   r]   r/   )r   r^   r   Zoriginal_contextr	   r	   r
   Úmake_context  s    
ÿ
re   )N)Ú
contextlibr   r   Z_builtin_context_processorsÚ	Exceptionr   rd   r   r   rL   rQ   r]   re   r	   r	   r	   r
   Ú<module>   s   j&,: