o
    h\H                     @   s   d dl Z d dlmZ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 ddgZG dd deZG dd deZG dd deZ G dd deZ!ee! e  e diZ"dS )    N)MappingMutableSequence)forms)ValidationError)	ErrorList)cached_property)format_htmlformat_html_join)gettext)versioned_static)Adapterregister   )Block
BoundBlockget_error_json_dataget_error_list_json_dataget_help_icon	ListBlockListBlockValidationErrorc                       s&   e Zd Zd fdd	Zdd Z  ZS )r   Nc                    s   t || _|d u ri }nt|tr|}nt|tr#dd t|D }ntd| i | _| D ]%\}}t|t rC|	 d | j|< q0t|trP|d | j|< q0|| j|< q0t
 d d S )Nc                 S   s   i | ]\}}|d ur||qS N ).0indexvalr   r   Y/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/blocks/list_block.py
<dictcomp>5   s    z5ListBlockValidationError.__init__.<locals>.<dictcomp>z.Expected dict or list for block_errors, got %rr   zValidation error in ListBlock)r   non_block_errors
isinstancer   list	enumerate
ValueErrorblock_errorsitemsas_datasuper__init__)selfr"   r   block_errors_dictr   r   	__class__r   r   r&      s(   
	



z!ListBlockValidationError.__init__c                 C   s:   i }| j rt| j |d< | jrdd | j D |d< |S )Nmessagesc                 S   s   i | ]	\}}|t |qS r   )r   )r   r   errorr   r   r   r   N   s    z9ListBlockValidationError.as_json_data.<locals>.<dictcomp>blockErrors)r   r   r"   r#   )r'   resultr   r   r   as_json_dataI   s   
z%ListBlockValidationError.as_json_dataNN)__name__
__module____qualname__r&   r/   __classcell__r   r   r)   r   r      s    /c                   @   sZ   e Zd ZdZG dd deZdddZdd Zd	d
 Zdd Z	dd Z
dd Zdd ZdS )	ListValuez
    The native data type used by ListBlock. Behaves as a list of values, but also provides
    a bound_blocks property giving access to block IDs
    c                       s$   e Zd Z fddZdd Z  ZS )zListValue.ListChildc                    s8   | dd | _| jptt | _t j|i | d S )Nid)poporiginal_idstruuiduuid4r6   r%   r&   )r'   argskwargsr)   r   r   r&   ^   s   zListValue.ListChild.__init__c                 C   s   d| j | j| jdS )Nitem)typevaluer6   )blockget_prep_valuer@   r6   r'   r   r   r   rB   c   s   z"ListValue.ListChild.get_prep_value)r1   r2   r3   r&   rB   r4   r   r   r)   r   	ListChild\   s    rD   Nc                    sB   | _ |d ur| _d S |d ur fdd|D  _d S g  _d S )Nc                    s   g | ]
}t  jj|qS r   )r5   rD   
list_blockchild_block)r   r@   rC   r   r   
<listcomp>p       z&ListValue.__init__.<locals>.<listcomp>)rE   bound_blocks)r'   rE   valuesrI   r   rC   r   r&   j   s   


zListValue.__init__c                 C   s   | j | jS r   )rI   r@   r'   ir   r   r   __getitem__w      zListValue.__getitem__c                 C   s   t | jj|| j|< d S r   )r5   rD   rE   rF   rI   r'   rL   r>   r   r   r   __setitem__z   s   zListValue.__setitem__c                 C   s   | j |= d S r   rI   rK   r   r   r   __delitem__}   rN   zListValue.__delitem__c                 C   s
   t | jS r   )lenrI   rC   r   r   r   __len__   s   
zListValue.__len__c                 C   s   | j |t| jj| d S r   )rI   insertr5   rD   rE   rF   rO   r   r   r   rU      s   zListValue.insertc                 C   s   ddd | j D dS )Nz<ListValue: c                 S   s   g | ]}|j qS r   r@   )r   bbr   r   r   rG      s    z&ListValue.__repr__.<locals>.<listcomp>>rQ   rC   r   r   r   __repr__   s   zListValue.__repr__r0   )r1   r2   r3   __doc__r   rD   r&   rM   rP   rR   rT   rU   rY   r   r   r   r   r5   V   s    
r5   c                       s   e Zd Zd- fdd	Zde_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d.ddZd.ddZdd  Zd!d" Zd#d$ Z fd%d&Z fd'd(ZG d)d* d*Zd+d,gZ  ZS )/r   Tc                    s^   t  jdi | || _t|tr| | _n|| _t| jd| _| js-| j	 g| j_
d S d S )Ndefaultr   )r%   r&   search_indexr   r?   rF   hasattrmeta_has_defaultget_defaultr[   )r'   rF   r\   r=   r)   r   r   r&      s   

zListBlock.__init__c                 O   sx   t | jddr5|r"t|d tr"||d }|g|dd  R }n|d}t|tr5||}||d< | |i |S Nhas_child_block_argFr   r   rF   )getattrr&   r   int	get_blockget)clslookupr<   r=   rF   child_block_kwargr   r   r   construct_from_lookup   s   


zListBlock.construct_from_lookupc                 C   s   t |d|  }g }td|D ]2}|d||f  rq|t |d||f  tj| j| j||d||f |d||f df q|  t| dd	 |D d
S )N%s-countr   z%s-%d-deletedz%s-%d-orderz%s-%d-valuez%s-%d-idr6   c                 S   s   g | ]\}}|qS r   r   )r   rL   br   r   r   rG      s    z1ListBlock.value_from_datadict.<locals>.<listcomp>rQ   )	rd   rangeappendr5   rD   rF   value_from_datadictrf   sort)r'   datafilesprefixcountchild_blocks_with_indexesrL   r   r   r   rp      s$   zListBlock.value_from_datadictc                 C   s   d| |vS )Nrk   r   )r'   rr   rs   rt   r   r   r   value_omitted_from_data   rN   z!ListBlock.value_omitted_from_datac                 C   s  |  |}g }i }t }t|jD ].\}}z|tj| j| j|j	|j
d W q ty? } z
|||< W Y d }~qd }~ww | jjd ur]| jjt|kr]|ttdd| jji  | jjd urz| jjt|k rz|ttdd| jji  |s~|rt||dt| |dS )Nrl   z*The minimum number of items is %(min_num)dmin_numz*The maximum number of items is %(max_num)dmax_num)r"   r   rQ   )	normalizer   r    rI   ro   r5   rD   rF   cleanr@   r6   r   r^   rx   rS   _ry   r   )r'   r@   r.   r"   r   r   bound_blocker   r   r   r{      sL   


zListBlock.cleanc                    sL   t |tr|S t |trt  fdd|D dS td|dt|d)Nc                    s   g | ]} j |qS r   )rF   rz   )r   xrC   r   r   rG      s    z'ListBlock.normalize.<locals>.<listcomp>rJ   zCannot handle z (type z) as a value of a ListBlock)r   r5   r   	TypeErrorr?   r'   r@   r   rC   r   rz      s   

zListBlock.normalizec                 C   s   t | g dS Nr   )r5   rC   r   r   r   empty_value   rN   zListBlock.empty_valuec                 C   s(   t |tod|v od|v o|ddkS )Nr6   r@   r?   r>   )r   dictrf   )r'   r>   r   r   r   _item_is_in_block_format  s   
z"ListBlock._item_is_in_block_formatc                    st    fdd|D } j |}g }t|D ]\}} |r#|d }nd }|tj j || |d qt |dS )Nc                    s"   g | ]}  |r|d  n|qS rV   )r   r   r>   rC   r   r   rG     s    z'ListBlock.to_python.<locals>.<listcomp>r6   rl   rQ   )rF   bulk_to_pythonr    r   ro   r5   rD   )r'   r@   
raw_valuesconverted_valuesrI   rL   r>   list_item_idr   rC   r   	to_python  s   


zListBlock.to_pythonc              	   C   s   g }g }|D ] }| t| |D ]}| |r | |d  q| | qq| j|}g }d}t|}t|D ]>\}	}
g }t|
D ]&}| ||	 | rW||	 | d }nd }| tj	| j|||  |d qC| t| |d ||
7 }q9|S )Nr@   r   r6   rl   rQ   )
ro   rS   r   rF   r   r   r    rn   r5   rD   )r'   rJ   lengthsr   list_stream
list_childr   r.   offsetrL   sublist_lenrI   jr   r   r   r   r   #  s6   

zListBlock.bulk_to_pythonc                 C   sL   t |tst| |d}g }|jD ]}|jstt |_||  q|S r   )	r   r5   rI   r6   r9   r:   r;   ro   rB   )r'   r@   
prep_valuer>   r   r   r   rB   I  s   

zListBlock.get_prep_valuec                    s*   t |tst |d} fdd|jD S )Nr   c                    s"   g | ]} j |j|jd qS ))r@   r6   )rF   get_form_stater@   r6   )r   rA   rC   r   r   rG   ^  s    z,ListBlock.get_form_state.<locals>.<listcomp>)r   r5   rI   r   r   rC   r   r   X  s
   

zListBlock.get_form_stateNc                    s    fdd|D S )Nc                    s   g | ]
}j j| d qS )context)rF   get_api_representationr   r   r'   r   r   rG   h  rH   z4ListBlock.get_api_representation.<locals>.<listcomp>r   )r'   r@   r   r   r   r   r   f  s   z ListBlock.get_api_representationc                    s&   t dd fdd|D }td|S )N
z<li>{0}</li>c                    s   g | ]}j j| d fqS r   )rF   render)r   child_valuer   r   r   rG   q  s    z*ListBlock.render_basic.<locals>.<listcomp>z<ul>{0}</ul>)r	   r   )r'   r@   r   childrenr   r   r   render_basicm  s   
zListBlock.render_basicc                 C   s.   | j sg S g }|D ]}|| j| q	|S r   )r\   extendrF   get_searchable_content)r'   r@   contentr   r   r   r   r   x  s   z ListBlock.get_searchable_contentc                 c   sh    |j D ]-}|j|jD ]#\}}}}|rd| nd}|r&|j d| n|j}||||fV  qqd S )Nzitem.r>   .)rI   rA   extract_referencesr@   r6   )r'   r@   childmodel	object_id
model_pathcontent_pathr   r   r   r     s   
zListBlock.extract_referencesc                 C   sD   |r|^}}|j D ]}|j|kr|j|j|  S q	dS | |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)rI   r6   rA   get_block_by_content_pathr@   bind)r'   r@   path_elementsr6   remaining_elementsr   r   r   r   r     s   


z#ListBlock.get_block_by_content_pathc                    s.   t  jdi |}|| jjdi | |S )Nr   )r%   checkr   rF   )r'   r=   errorsr)   r   r   r     s   zListBlock.checkc                    s   t  |\}}}t| jddr>|r+t|d tr+||d }|g|dd  R }n|d}t|tr>||}||d< |||fS ra   )r%   deconstruct_with_lookuprc   r&   r   r   	add_blockrf   )r'   rh   pathr<   r=   block_idrF   r)   r   r   r     s   



z!ListBlock.deconstruct_with_lookupc                   @   s    e Zd ZdZdZdZdZdZdS )zListBlock.MetaplaceholderNF)r1   r2   r3   iconform_classnamerx   ry   	collapsedr   r   r   r   Meta  s    r   rx   ry   )Tr   )r1   r2   r3   r&   rb   classmethodrj   rp   rw   r{   rz   r   r   r   r   rB   r   r   r   r   r   r   r   r   r   MUTABLE_META_ATTRIBUTESr4   r   r   r)   r   r      s0    
+
&

	
c                   @   s$   e Zd ZdZdd Zedd ZdS )ListBlockAdapterwagtail.blocks.ListBlockc                 C   s   |j | |jj|j|j|jj|jjtdtdtdtdtdtddd}t	|jd	d }|r;||d
< t
 |d< |jjd urG|jj|d< |jjd urS|jj|d< |j|j|j|j |gS )NzMove upz	Move downDrag	DuplicateDeleteAdd)MOVE_UP	MOVE_DOWNDRAG	DUPLICATEDELETEADD)labeldescriptionr   
blockDefIdisPreviewable	classnamer   strings	help_texthelpTexthelpIconminNummaxNum)r   get_descriptionr^   r   definition_prefixis_previewabler   r   r|   rc   r   rx   ry   namerF   r   r`   )r'   rA   r^   r   r   r   r   js_args  s8   
zListBlockAdapter.js_argsc                 C   s   t jtdgdS )Nz"wagtailadmin/js/telepath/blocks.js)js)r   Mediar   rC   r   r   r   media  s   zListBlockAdapter.mediaN)r1   r2   r3   js_constructorr   r   r   r   r   r   r   r     s
    $r   r   )#r:   collections.abcr   r   djangor   django.core.exceptionsr   django.forms.utilsr   django.utils.functionalr   django.utils.htmlr   r	   django.utils.translationr
   r|   wagtail.admin.staticfilesr   wagtail.telepathr   r   baser   r   r   r   r   __all__r   r5   r   r   DECONSTRUCT_ALIASESr   r   r   r   <module>   s*    =6  50