o
    ӷ6i                     @   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 N)
isinstancer   nodelisttemplate)tpl r   T/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/sekizai/helpers.py_get_nodelist   s   
r   c                 C   sH   t | dr
| jr
dS t | dr"t | jdr"| jjs t| jjtr"d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 ]6}|j|vr |||j< q||j }g }t|jdrF|j|vrF|	|j |j}t|jdrF|j|vs2||_qt|t
D ]	}t||  dS 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   block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
s7|tt|d7 }|S |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%   parent_templater   r   r   _extend_nodelist;   s&   
	r+   Nc                 C   s   ddl m}m} g }| D ]H}t|||fr+||jd i  |t|jd |7 }qt|t	r7|t
|7 }qt|trT|rT|jjdkrTt|jdrT|t|jj|j7 }q|S )Nr   )RenderBlockWithDatar   r   zblock.super)!sekizai.templatetags.sekizai_tagsr,   r-   r   r    kwargsresolver(   r#   r	   r+   r   filter_expressiontokenr   r   r   )r   current_blockr,   r-   r)   r   r   r   r   r(   Y   s"   
r(   c                 C   s   t | }tt|S r
   )r   r(   r   )r   compiled_templater   r   r   get_namespacesq   s   r5   c                 C   s4   t tddrdS t| }|D ]	}||vr dS qdS )zs
    Validates that a template (or it's parents if check_inheritance is True)
    contain all given namespaces
    SEKIZAI_IGNORE_VALIDATIONFT)getattrr   r5   )r   
namespacesr)   	namespacer   r   r   validate_templatev   s   r:   c                   C   s   t tddS )NSEKIZAI_VARNAMESEKIZAI_CONTENT_HOLDER)r7   r   r   r   r   r   get_varname   s   r=   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   getr=   )rG   r   r   r   rD      s   zWatcher.datac                    s   t | j}t | j}||A }i }|D ]}t| j| ||< q||@ }|D ]}t | j|   fdd| j| D }|||< q$|S )Nc                    s   g | ]}| vr|qS r   r   )r@   itemold_setr   r   
<listcomp>   s    z'Watcher.get_changes.<locals>.<listcomp>)setrF   rD   r?   )rG   sfrozensdatanew_keyschangesrA   shared_keys
new_valuesr   rK   r   get_changes   s   



zWatcher.get_changesN)__name__
__module____qualname____doc__rH   propertyrD   rU   r   r   r   r   r>      s    
r>   r
   )django.confr   django.template.baser   r   r   django.template.contextr   django.template.loaderr   django.template.loader_tagsr   r	   r   r   r   r!   r+   r(   r5   r:   r=   r>   r   r   r   r   <module>   s    

