U
    %	Àd  ã                   @   s¤   d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZ dd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ ZG dd„ dƒZdS )é    )Úsettings)ÚTemplateÚVariableÚVariableNode)ÚContext)Úget_template)Ú	BlockNodeÚExtendsNodec                 C   s   t | tƒr| jS | jjS d S ©N)Ú
isinstancer   ÚnodelistÚtemplate)Ztpl© r   úH/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sekizai/helpers.pyÚ_get_nodelist   s    
r   c                 C   sH   t | dƒr| jrdS t | dƒrDt | jdƒrD| jjs@t| jjtƒrDdS dS )NÚparent_name_exprTÚparent_nameÚfiltersF)Úhasattrr   r   r   r   Úvarr   )Únoder   r   r   Úis_variable_extend_node   s    ÿr   c                  C   s   t ƒ } tdƒ| _| S )NÚ )r   r   r   )Úcontextr   r   r   Úget_context   s    
r   c                 C   s¦   t | ƒrdS |  tƒ ¡}t|ƒ t¡D ]X}|j|kr@|||j< q&||j }g }t|jdƒrx|j|krx| 	|j¡ |j}qN||_q&t|ƒ t
¡D ]}t||ƒ  q¢qŽdS )z^
    Extends the dictionary `blocks` with *new* blocks in the parent node
    (recursive)
    Nr   )r   Ú
get_parentr   r   Úget_nodes_by_typer   Únamer   ÚsuperÚappendr	   Ú_extend_blocks)Úextend_nodeÚblocksÚparentr   ÚblockZseen_supersr   r   r   r       s"    

ÿ
r    c                 C   s‚   t | ƒrg S | j}t| |ƒ g }| ¡ D ]}|t|j|ƒ7 }q(|  tƒ ¡}t|ƒ 	t
¡sl|tt|ƒdƒ7 }n|tt|ƒ| ƒ7 }|S )z^
    Returns a list of namespaces found in the parent template(s) of this
    ExtendsNode
    N)r   r"   r    ÚvaluesÚ_scan_namespacesr   r   r   r   r   r	   )r!   r"   Úfoundr$   Zparent_templater   r   r   Ú_extend_nodelist;   s$    
þþr(   Nc                 C   s®   ddl m}m} g }| D ]�}t|||fƒrV| |jd  i ¡¡ |t|jd |ƒ7 }qt|t	ƒrn|t
|ƒ7 }qt|tƒr|r|jjdkrt|jdƒr|t|jj|jƒ7 }q|S )Nr   )ÚRenderBlockÚWithDatar   r   zblock.super)Z!sekizai.templatetags.sekizai_tagsr)   r*   r   r   ÚkwargsÚresolver&   r"   r	   r(   r   Zfilter_expressionÚtokenr   r   r   )r   Zcurrent_blockr)   r*   r'   r   r   r   r   r&   Y   s     
þr&   c                 C   s   t | ƒ}tt|ƒƒS r
   )r   r&   r   )r   Zcompiled_templater   r   r   Úget_namespacesq   s    r.   c                 C   s4   t tddƒrdS t| ƒ}|D ]}||kr dS qdS )zs
    Validates that a template (or it's parents if check_inheritance is True)
    contain all given namespaces
    ZSEKIZAI_IGNORE_VALIDATIONFT)Úgetattrr   r.   )r   Ú
namespacesr'   Ú	namespacer   r   r   Úvalidate_templatev   s    r2   c                   C   s   t tddƒS )NZSEKIZAI_VARNAMEZSEKIZAI_CONTENT_HOLDER)r/   r   r   r   r   r   Úget_varname„   s    r3   c                   @   s,   e Zd ZdZdd„ Zedd„ ƒZdd„ ZdS )	ÚWatcherzÉ
    Watches a context for changes to the sekizai data, so it can be replayed
    later. This is useful for caching.

    NOTE: This class assumes you ONLY ADD, NEVER REMOVE data from the context!
    c                 C   s    || _ dd„ | j ¡ D ƒ| _d S )Nc                 S   s   i | ]\}}|t |ƒ“qS r   )Úlist)Ú.0ÚkeyÚvaluer   r   r   Ú
<dictcomp>‘   s     z$Watcher.__init__.<locals>.<dictcomp>)r   ÚdataÚitemsÚfrozen)Úselfr   r   r   r   Ú__init__�   s    ÿzWatcher.__init__c                 C   s   | j  tƒ i ¡S r
   )r   Úgetr3   )r=   r   r   r   r:   •   s    zWatcher.datac                    s€   t | jƒ}t | jƒ}||A }i }|D ]}t| j| ƒ||< q$||@ }|D ]2}t | j| ƒ‰ ‡ fdd„| j| D ƒ}|||< qH|S )Nc                    s   g | ]}|ˆ kr|‘qS r   r   )r6   Úitem©Zold_setr   r   Ú
<listcomp>£   s     z'Watcher.get_changes.<locals>.<listcomp>)Úsetr<   r:   r5   )r=   ZsfrozenZsdataZnew_keysÚchangesr7   Zshared_keysÚ
new_valuesr   rA   r   Úget_changes™   s    


ÿ
zWatcher.get_changesN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r>   Úpropertyr:   rF   r   r   r   r   r4   ˆ   s
   
r4   )N)Zdjango.confr   Zdjango.template.baser   r   r   Zdjango.template.contextr   Zdjango.template.loaderr   Zdjango.template.loader_tagsr   r	   r   r   r   r    r(   r&   r.   r2   r3   r4   r   r   r   r   Ú<module>   s   

