U
    {hG                     @   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 kri }n:t|tr(|}n*t|trFdd t|D }ntd| i | _| D ]J\}}t|t r|	 d | j|< q`t|tr|d | j|< q`|| j|< q`t
 d d S )Nc                 S   s   i | ]\}}|d k	r||qS N ).0indexvalr   r   a/var/www/dating/data/www/fatepal.com/env/lib/python3.8/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itemsZas_datasuper__init__)selfr"   r   Zblock_errors_dictr   r   	__class__r   r   r%      s(    	




z!ListBlockValidationError.__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   )r   r   errorr   r   r   r   N   s    z9ListBlockValidationError.as_json_data.<locals>.<dictcomp>Z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                    s4   | dd | _| jptt | _t j|| d S )Nid)popZoriginal_idstruuiduuid4r2   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valuer2   )blockget_prep_valuer;   r2   r&   r   r   r   r=   c   s    z"ListValue.ListChild.get_prep_value)r-   r.   r/   r%   r=   r0   r   r   r'   r   	ListChild\   s   r?   Nc                    s>   | _ |d k	r| _n$|d k	r4 fdd|D  _ng  _d S )Nc                    s   g | ]}t  jj|qS r   )r1   r?   
list_blockchild_block)r   r;   r>   r   r   
<listcomp>p   s   z&ListValue.__init__.<locals>.<listcomp>)r@   bound_blocks)r&   r@   valuesrC   r   r>   r   r%   j   s    

zListValue.__init__c                 C   s   | j | jS r   )rC   r;   r&   ir   r   r   __getitem__w   s    zListValue.__getitem__c                 C   s   t | jj|| j|< d S r   )r1   r?   r@   rA   rC   r&   rF   r9   r   r   r   __setitem__z   s    zListValue.__setitem__c                 C   s   | j |= d S r   rC   rE   r   r   r   __delitem__}   s    zListValue.__delitem__c                 C   s
   t | jS r   )lenrC   r>   r   r   r   __len__   s    zListValue.__len__c                 C   s   | j |t| jj| d S r   )rC   insertr1   r?   r@   rA   rH   r   r   r   rN      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   Zbbr   r   r   rB      s     z&ListValue.__repr__.<locals>.<listcomp>>rJ   r>   r   r   r   __repr__   s    zListValue.__repr__)NN)r-   r.   r/   __doc__r   r?   r%   rG   rI   rK   rM   rN   rQ   r   r   r   r   r1   V   s   
r1   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 )0r   Tc                    sN   t  jf | || _t|tr(| | _n|| _t| jdsJ| j g| j_	d S )Ndefault)
r$   r%   search_indexr   r:   rA   hasattrmetaget_defaultrS   )r&   rA   rT   r8   r'   r   r   r%      s    

zListBlock.__init__c                 O   sr   t | jddrh|rBt|d trB||d }|f|dd  }n&|d}t|trh||}||d< | ||S Nhas_child_block_argFr   r   rA   )getattrr%   r   intZ	get_blockget)clslookupr7   r8   rA   Zchild_block_kwargr   r   r   construct_from_lookup   s    


zListBlock.construct_from_lookupc                 C   s   t |d|  }g }td|D ]d}|d||f  r4q|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r2   c                 S   s   g | ]\}}|qS r   r   )r   rF   br   r   r   rB      s     z1ListBlock.value_from_datadict.<locals>.<listcomp>rJ   )	r[   rangeappendr1   r?   rA   value_from_datadictr\   sort)r&   datafilesprefixcountZchild_blocks_with_indexesrF   r   r   r   re      s(      
zListBlock.value_from_datadictc                 C   s   d| |kS )Nr`   r   )r&   rg   rh   ri   r   r   r   value_omitted_from_data   s    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k
r| } z|||< W 5 d }~X Y q"X q"| jjd k	r| jjt|kr|ttdd| jji  | jjd k	r| jjt|k r|ttdd| jji  |s|r
t||dt| |dS )Nra   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   rJ   )	normalizer   r    rC   rd   r1   r?   rA   cleanr;   r2   r   rV   rl   rL   _rm   r   )r&   r;   r+   r"   r   r   Zbound_blocker   r   r   ro      sJ    



 zListBlock.cleanc                    sP   t |tr|S t |tr2t  fdd|D dS td|dt|dd S )Nc                    s   g | ]} j |qS r   )rA   rn   )r   xr>   r   r   rB      s     z'ListBlock.normalize.<locals>.<listcomp>rD   zCannot handle z (type z) as a value of a ListBlock)r   r1   r   	TypeErrorr:   r&   r;   r   r>   r   rn      s    

 zListBlock.normalizec                 C   s   t | g dS Nrs   )r1   r>   r   r   r   empty_value   s    zListBlock.empty_valuec                 C   s(   t |to&d|ko&d|ko&|ddkS )Nr2   r;   r:   r9   )r   dictr\   )r&   r9   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 ]<\}} |rF|d }nd }|tj j || |d q*t |dS )Nc                    s"   g | ]}  |r|d  n|qS rO   )ry   r   r9   r>   r   r   rB     s   z'ListBlock.to_python.<locals>.<listcomp>r2   ra   rJ   )rA   bulk_to_pythonr    ry   rd   r1   r?   )r&   r;   
raw_valuesconverted_valuesrC   rF   r9   list_item_idr   r>   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 ]L}| ||	 | r||	 | d }nd }| tj	| j|||  |d q| t| |d ||
7 }qr|S )Nr;   r   r2   ra   rJ   )
rd   rL   ry   rA   r{   r   r    rc   r1   r?   )r&   rD   lengthsr|   Zlist_streamZ
list_childr}   r+   offsetrF   Zsublist_lenrC   jr~   r   r   r   r{   "  s8    
 
 
zListBlock.bulk_to_pythonc                 C   sL   t |tst| |d}g }|jD ]&}|js8tt |_||  q |S rv   )	r   r1   rC   r2   r4   r5   r6   rd   r=   )r&   r;   Z
prep_valuer9   r   r   r   r=   H  s    

zListBlock.get_prep_valuec                    s*   t |tst |d} fdd|jD S )Nrs   c                    s"   g | ]} j |j|jd qS ))r;   r2   )rA   get_form_stater;   r2   )r   r<   r>   r   r   rB   ]  s   z,ListBlock.get_form_state.<locals>.<listcomp>)r   r1   rC   ru   r   r>   r   r   W  s
    

zListBlock.get_form_stateNc                    s    fdd|D S )Nc                    s   g | ]}j j| d qS )context)rA   get_api_representationrz   r   r&   r   r   rB   g  s   z4ListBlock.get_api_representation.<locals>.<listcomp>r   )r&   r;   r   r   r   r   r   e  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   )rA   render)r   child_valuer   r   r   rB   p  s   z*ListBlock.render_basic.<locals>.<listcomp>z<ul>{0}</ul>)r	   r   )r&   r;   r   childrenr   r   r   render_basicl  s    zListBlock.render_basicc                 C   s.   | j s
g S g }|D ]}|| j| q|S r   )rT   extendrA   get_searchable_content)r&   r;   contentr   r   r   r   r   w  s    z ListBlock.get_searchable_contentc                 c   sf   |j D ]Z}|j|jD ]F\}}}}|r2d| nd}|rJ|j d| n|j}||||fV  qqd S )Nzitem.r9   .)rC   r<   extract_referencesr;   r2   )r&   r;   childmodelZ	object_idZ
model_pathZcontent_pathr   r   r   r     s    
zListBlock.extract_referencesc                 C   sF   |r8|^}}|j D ]"}|j|kr|j|j|  S qn
| |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)rC   r2   r<   get_block_by_content_pathr;   bind)r&   r;   Zpath_elementsr2   Zremaining_elementsr   r   r   r   r     s    

 z#ListBlock.get_block_by_content_pathc                    s&   t  jf |}|| jjf | |S r   )r$   checkr   rA   )r&   r8   errorsr'   r   r   r     s    zListBlock.checkc                    s   t  |\}}}t| jddr|rTt|d trT||d }|f|dd  }n.|d}t|tr||}| }||d< |||fS rX   )	r$   deconstruct_with_lookuprZ   r%   r   r   Z	add_blockr\   copy)r&   r^   pathr7   r8   Zblock_idrA   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)r-   r.   r/   iconform_classnamerl   rm   	collapsedr   r   r   r   Meta  s
   r   rl   rm   )T)N)N)r-   r.   r/   r%   rY   classmethodr_   re   rk   ro   rn   rw   ry   r   r{   r=   r   r   r   r   r   r   r   r   r   ZMUTABLE_META_ATTRIBUTESr0   r   r   r'   r   r      s.   
+
&

	
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tdtdtdtdtddd}t|jdd }|rb||d	< t |d
< |jjd k	rz|jj|d< |jj	d k	r|jj	|d< |j
|j|j|j |gS )NzMove upz	Move downZ	DuplicateDeleteAdd)ZMOVE_UPZ	MOVE_DOWNZ	DUPLICATEDELETEZADD)labelr   	classnamer   strings	help_textZhelpTextZhelpIconZminNumZmaxNum)r   rV   r   r   r   rp   rZ   r   rl   rm   namerA   r   rW   )r&   r<   rV   r   r   r   r   js_args  s0    
zListBlockAdapter.js_argsc                 C   s   t jtdgdS )Nz"wagtailadmin/js/telepath/blocks.js)js)r   ZMediar   r>   r   r   r   media  s    zListBlockAdapter.mediaN)r-   r.   r/   Zjs_constructorr   r   r   r   r   r   r   r     s    r   r   )#r5   collections.abcr   r   djangor   Zdjango.core.exceptionsr   Zdjango.forms.utilsr   Zdjango.utils.functionalr   Zdjango.utils.htmlr   r	   Zdjango.utils.translationr
   rp   Zwagtail.admin.staticfilesr   Zwagtail.telepathr   r   baser   r   r   r   r   __all__r   r1   r   r   ZDECONSTRUCT_ALIASESr   r   r   r   <module>   s*   =6  5, 