a
    Dg?                     @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d d	lmZ d d
lmZmZ ddlmZmZmZmZmZmZ g dZG dd deZG dd de jZG dd deZ G dd deZ!G dd de!edZ"G dd deZ#ee# e" dS )    N)forms)ValidationError)	ErrorList)render_to_string)cached_property)format_htmlformat_html_join)	mark_safe)versioned_static)Adapterregister   )Block
BoundBlockDeclarativeSubBlocksMetaclassget_error_json_dataget_error_list_json_dataget_help_icon)BaseStructBlockStructBlockStructValueStructBlockValidationErrorc                       s&   e Zd Zd fdd	Zdd Z  ZS )r   Nc                    s~   t || _i | _|d u rnT| D ]J\}}t|t rH| d | j|< q"t|trb|d | j|< q"|| j|< q"t d d S )Nr   zValidation error in StructBlock)	r   non_block_errorsblock_errorsitems
isinstanceZas_datalistsuper__init__)selfr   r   nameval	__class__ Z/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/blocks/struct_block.pyr       s    



z#StructBlockValidationError.__init__c                 C   s:   i }| j rt| j |d< | jr6dd | j D |d< |S )Nmessagesc                 S   s   i | ]\}}|t |qS r$   )r   ).0r    errorr$   r$   r%   
<dictcomp>B   s   z;StructBlockValidationError.as_json_data.<locals>.<dictcomp>ZblockErrors)r   r   r   r   )r   resultr$   r$   r%   as_json_data=   s    
z'StructBlockValidationError.as_json_data)NN)__name__
__module____qualname__r   r+   __classcell__r$   r$   r"   r%   r      s   r   c                       sF   e Zd ZdZ fddZdd ZdddZed	d
 Zdd Z	  Z
S )r   zCA class that generates a StructBlock value from provided sub-blocksc                    s   t  j|  || _d S N)r   r   block)r   r1   argsr"   r$   r%   r   L   s    zStructValue.__init__c                 C   s   | j | S r0   r1   renderr   r$   r$   r%   __html__P   s    zStructValue.__html__Nc                 C   s   | j j| |dS )Ncontextr3   r   r8   r$   r$   r%   render_as_blockS   s    zStructValue.render_as_blockc                    s    t  fdd jj D S )Nc                    s$   g | ]\}}||  |fqS r$   )bindgetr'   r    r1   r5   r$   r%   
<listcomp>Y   s   z,StructValue.bound_blocks.<locals>.<listcomp>)collectionsOrderedDictr1   child_blocksr   r5   r$   r5   r%   bound_blocksV   s
    

zStructValue.bound_blocksc                 C   s   | j | jfd d t|  fS r0   )r#   r1   iterr   r5   r$   r$   r%   
__reduce___   s    zStructValue.__reduce__)N)r,   r-   r.   __doc__r   r6   r:   r   rB   rD   r/   r$   r$   r"   r%   r   I   s   

r   c                   @   s   e Zd ZdZdd ZdS )PlaceholderBoundBlockzj
    Provides a render_form method that outputs a block placeholder, for use in custom form_templates
    c                 C   s   t d| jjS )Nz'<div data-structblock-child="{}"></div>)r   r1   r    r5   r$   r$   r%   render_formh   s    z!PlaceholderBoundBlock.render_formN)r,   r-   r.   rE   rG   r$   r$   r$   r%   rF   c   s   rF   c                       s   e Zd Zd6 fdd	Ze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d7ddZdd Zdd  Zd!d" Zd#d$ Zd%d& Z fd'd(Zd8d)d*Zd+d, Z fd-d.Zd9d0d1Zed2d3 ZG d4d5 d5Z  ZS ):r   NTc                    sT   || _ || _t jf i | | j | _|rP|D ]\}}|| || j|< q2d S r0   )_constructor_kwargssearch_indexr   r   Zbase_blockscopyrA   set_name)r   Zlocal_blocksrI   kwargsr    r1   r"   r$   r%   r   m   s    
zBaseStructBlock.__init__c                    s&   |r fdd|D }| |fi |S )Nc                    s   g | ]\}}|  |fqS r$   )Z	get_block)r'   r    indexlookupr$   r%   r>   }   s   z9BaseStructBlock.construct_from_lookup.<locals>.<listcomp>r$   )clsrO   rA   rL   r$   rN   r%   construct_from_lookupz   s
    
z%BaseStructBlock.construct_from_lookupc                    s      fdd j D S )z
        Any default value passed in the constructor or self.meta is going to be a dict
        rather than a StructValue; for consistency, we need to convert it to a StructValue
        for StructBlock to work with
        c                    s2   i | ]*\}}|| j jv r& j j| n| qS r$   )metadefaultget_defaultr=   r5   r$   r%   r)      s
   
z/BaseStructBlock.get_default.<locals>.<dictcomp>)	normalizerA   r   r5   r$   r5   r%   rT      s
    
zBaseStructBlock.get_defaultc                    s"   |   fdd| j D S )Nc              
      s,   g | ]$\}}||   d | fqS )-)value_from_datadictr=   datafilesprefixr$   r%   r>      s   z7BaseStructBlock.value_from_datadict.<locals>.<listcomp>_to_struct_valuerA   r   r   rY   rZ   r[   r$   rX   r%   rW      s
    z#BaseStructBlock.value_from_datadictc                    s    t  fdd| j D S )Nc                 3   s*   | ]"\}}|   d | V  qdS )rV   N)value_omitted_from_datar=   rX   r$   r%   	<genexpr>   s   z:BaseStructBlock.value_omitted_from_data.<locals>.<genexpr>)allrA   r   r^   r$   rX   r%   r_      s    z'BaseStructBlock.value_omitted_from_datac                 C   s|   g }i }|  D ]T\}}z||| j| |f W q tyb } z|||< W Y d }~qd }~0 0 q|rrt|| |S r0   )r   appendrA   cleanr   r   r]   )r   valuer*   errorsr    r!   er$   r$   r%   rc      s     zBaseStructBlock.cleanc                    s   |   fdd| j D S )zBRecursively call to_python on children and return as a StructValuec                    s2   g | ]*\}}|| v r$|  | n| fqS r$   )	to_pythonrT   )r'   r    child_blockrd   r$   r%   r>      s   z-BaseStructBlock.to_python.<locals>.<listcomp>r\   r   rd   r$   ri   r%   rg      s
    
zBaseStructBlock.to_pythonc              
      s   i  j  D ]\}}g }g }t|D ](\}}||v r&|| |||  q&||}tt||}	g |< tdt|D ]:}z|	| }
W n t	y   |
 }
Y n0 | |
 q~q fddtdt|D S )Nr   c                    s,   g | ]$   fd dj D qS )c                    s   i | ]}||   qS r$   r$   )r'   r    )ivalues_by_subfieldr$   r%   r)          z=BaseStructBlock.bulk_to_python.<locals>.<listcomp>.<dictcomp>)r]   rA   keys)r'   r   rl   )rk   r%   r>      s   z2BaseStructBlock.bulk_to_python.<locals>.<listcomp>)rA   r   	enumeraterb   bulk_to_pythondictziprangelenKeyErrorrT   )r   valuesr    rh   ZindexesZ
raw_valuesrk   r!   Zconverted_valuesZconverted_values_by_indexZconverted_valuer$   ro   r%   rq      s(    

zBaseStructBlock.bulk_to_pythonc                 C   s   | j | |S )zCReturn a Structvalue representation of the sub-blocks in this block)rR   value_class)r   Zblock_itemsr$   r$   r%   r]      s    z BaseStructBlock._to_struct_valuec                    s    fdd|  D S )zFRecursively call get_prep_value on children and return as a plain dictc                    s"   i | ]\}}| j | |qS r$   )rA   get_prep_valuer'   r    r!   r5   r$   r%   r)      s   z2BaseStructBlock.get_prep_value.<locals>.<dictcomp>r   rj   r$   r5   r%   ry      s    
zBaseStructBlock.get_prep_valuec                    s.   t | jjr|S   fdd| D S )Nc                    s"   i | ]\}}| j | |qS r$   )rA   rU   )r'   kvr5   r$   r%   r)      rm   z-BaseStructBlock.normalize.<locals>.<dictcomp>)r   rR   rx   r]   r   rj   r$   r5   r%   rU      s
    zBaseStructBlock.normalizec                    s    fdd|  D S )Nc                    s"   i | ]\}}| j | |qS r$   )rA   get_form_staterz   r5   r$   r%   r)      s   z2BaseStructBlock.get_form_state.<locals>.<dictcomp>r{   rj   r$   r5   r%   r~      s    
zBaseStructBlock.get_form_statec                    s    fdd|  D S )zNRecursively call get_api_representation on children and return as a plain dictc                    s&   i | ]\}}|j | j| d qS )r7   )rA   get_api_representationrz   r8   r   r$   r%   r)     s   z:BaseStructBlock.get_api_representation.<locals>.<dictcomp>r{   r   rd   r8   r$   r   r%   r     s    z&BaseStructBlock.get_api_representationc              
   C   sB   | j s
g S g }| j D ]$\}}|||||  q|S r0   )rI   rA   r   extendget_searchable_contentr<   rT   )r   rd   contentr    r1   r$   r$   r%   r     s    z&BaseStructBlock.get_searchable_contentc                 c   sv   | j  D ]f\}}|||| D ]F\}}}}|rF| d| n|}|r\| d| n|}||||fV  q(q
d S )N.)rA   r   extract_referencesr<   rT   )r   rd   r    r1   modelZ	object_idZ
model_pathZcontent_pathr$   r$   r%   r     s    z"BaseStructBlock.extract_referencesc                 C   sZ   |rL|^}}z| j | }W n ty.   Y dS 0 ||| }|||S | |S dS )z
        Given a list of elements from a content path, retrieve the block at that path
        as a BoundBlock object, or None if the path does not correspond to a valid block.
        N)rA   rv   r<   rT   get_block_by_content_pathr;   )r   rd   Zpath_elementsr    Zremaining_elementsrh   Zchild_valuer$   r$   r%   r   !  s    z)BaseStructBlock.get_block_by_content_pathc                 C   s$   d}t | j g}| j}|||fS )a  
        Always deconstruct StructBlock instances as if they were plain StructBlocks with all of the
        field definitions passed to the constructor - even if in reality this is a subclass of StructBlock
        with the fields defined declaratively, or some combination of the two.

        This ensures that the field definitions get frozen into migrations, rather than leaving a reference
        to a custom subclass in the user's models.py that may or may not stick around.
        wagtail.blocks.StructBlock)r   rA   r   rH   )r   pathr2   rL   r$   r$   r%   deconstruct5  s    	zBaseStructBlock.deconstructc                    s.   d} fdd| j  D g}| j}|||fS )Nr   c                    s   g | ]\}}|  |fqS r$   )Z	add_blockr=   rN   r$   r%   r>   F  s   z;BaseStructBlock.deconstruct_with_lookup.<locals>.<listcomp>)rA   r   rH   )r   rO   r   r2   rL   r$   rN   r%   deconstruct_with_lookupC  s    
z'BaseStructBlock.deconstruct_with_lookupc                    sV   t  jf i |}| j D ]4\}}||jf i | ||jf i | q|S r0   )r   checkrA   r   r   _check_name)r   rL   re   r    rh   r"   r$   r%   r   N  s
    zBaseStructBlock.checkc                 C   s   t dtdd| S )Nz<dl>
{}
</dl>
z    <dt>{}</dt>
    <dd>{}</dd>)r   r   r   r   r$   r$   r%   render_basicV  s    zBaseStructBlock.render_basicc                 C   s&   | j |  dd d}tt| jj|S )NZ
__PREFIX__)r[   re   )get_form_contextrT   r	   r   rR   form_templater9   r$   r$   r%   render_form_template\  s    

z$BaseStructBlock.render_form_templatec                    s   t   pt| jddS )N	help_text )r   get_descriptiongetattrrR   r5   r"   r$   r%   r   k  s    zBaseStructBlock.get_descriptionr   c                    s:   t  fdd| j D t| jdd | jj|  dS )Nc              	      s2   g | ]*\}}|t ||  d | dfqS )rV   )r[   )rF   r<   r=   r[   rd   r$   r%   r>   q  s   z4BaseStructBlock.get_form_context.<locals>.<listcomp>r   )childrenr   	classnameZblock_definitionr[   )r?   r@   rA   r   r   rR   form_classname)r   rd   r[   re   r$   r   r%   r   n  s    z BaseStructBlock.get_form_contextc                 C   s   | j jtjjuS r0   )rR   rS   r   Z_meta_classr5   r$   r$   r%   _has_default  s    zBaseStructBlock._has_defaultc                   @   s$   e Zd Zi ZdZdZeZdZdZ	dS )zBaseStructBlock.Metazstruct-blockNplaceholder)
r,   r-   r.   rS   r   r   r   rx   label_formaticonr$   r$   r$   r%   Meta  s   r   )NT)N)N)r   N)r,   r-   r.   r   classmethodrQ   rT   rW   r_   rc   rg   rq   r]   ry   rU   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r/   r$   r$   r"   r%   r   l   s6   
)
	


r   c                   @   s   e Zd ZdS )r   N)r,   r-   r.   r$   r$   r$   r%   r     s   r   )	metaclassc                   @   s$   e Zd ZdZdd Zedd ZdS )StructBlockAdapterr   c                 C   s   |j | |j|jj|j|j|jjd}t|jdd }|rL||d< t	 |d< |jj
r`| |d< |jjrt|jj|d< |j|j |gS )N)labeldescriptionrequiredr   Z
blockDefIdZisPreviewabler   r   ZhelpTextZhelpIconZformTemplateZlabelFormat)r   r   r   rR   r   Zdefinition_prefixZis_previewabler   r   r   r   r   r   r    rA   rw   )r   r1   rR   r   r$   r$   r%   js_args  s(    

zStructBlockAdapter.js_argsc                 C   s   t jtdgdS )Nz"wagtailadmin/js/telepath/blocks.js)Zjs)r   ZMediar
   r5   r$   r$   r%   media  s    zStructBlockAdapter.mediaN)r,   r-   r.   Zjs_constructorr   r   r   r$   r$   r$   r%   r     s   r   )$r?   Zdjangor   Zdjango.core.exceptionsr   Zdjango.forms.utilsr   Zdjango.template.loaderr   Zdjango.utils.functionalr   Zdjango.utils.htmlr   r   Zdjango.utils.safestringr	   Zwagtail.admin.staticfilesr
   Zwagtail.telepathr   r   baser   r   r   r   r   r   __all__r   r@   r   rF   r   r   r   r$   r$   r$   r%   <module>   s(    	*	  '(