U
    {h+                     @   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 d dlmZmZmZmZ d d	lmZmZ d d
lmZmZmZ G dd dejZG dd dZG dd dejZdS )    N)DjangoJSONEncoder)MaxLengthValidator)models)KeyTransform)	force_str)cached_property)Block
BlockFieldStreamBlockStreamValue)BlockDefinitionLookupBlockDefinitionLookupBuilder)RichTextMaxLengthValidator!extract_references_from_rich_textget_text_for_indexingc                       s@   e Zd Z fddZdd Z fddZdd Zd	d
 Z  ZS )RichTextFieldc                    s.   | dd| _| dd | _t j|| d S )Neditordefaultfeatures)popr   r   super__init__)selfargskwargs	__class__ V/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/fields.pyr      s    zRichTextField.__init__c                 C   s0   |   \}}}}| j|d< | j|d< | j||S )Nr   r   )deconstructr   r   r   )r   namepathr   r   r   r   r   clone    s    

zRichTextField.clonec                    sp   ddl m} d|| j| jdi}|| t jf |}t|jD ](\}}t	|t
rBt|j|jd|j|< qB|S )Nr   )get_rich_text_editor_widgetZwidget)r   )message)Zwagtail.admin.rich_textr#   r   r   updater   	formfield	enumerateZ
validators
isinstancer   r   Zlimit_valuer$   )r   r   r#   defaultsfieldi	validatorr   r   r   r&   '   s     

 zRichTextField.formfieldc                 C   s   t |}t|gS N)r   r   )r   valuesourcer   r   r   get_searchable_content9   s    z$RichTextField.get_searchable_contentc                 c   s   t t|E d H  d S r-   )r   r   r   r.   r   r   r   extract_references>   s    z RichTextField.extract_references)	__name__
__module____qualname__r   r"   r&   r0   r2   __classcell__r   r   r   r   r      s
   	r   c                   @   s*   e Zd ZdZdd Zd	ddZdd ZdS )
CreatorzT
    A placeholder class that provides a way to set the attribute on the model.
    c                 C   s
   || _ d S r-   )r*   )r   r*   r   r   r   r   H   s    zCreator.__init__Nc                 C   s6   |d kr| S | j j}||jkr,|j|gd |j| S )N)fields)r*   r    __dict__Zrefresh_from_db)r   objtype
field_namer   r   r   __get__K   s    
zCreator.__get__c                 C   s   | j ||j| j j< d S r-   )r*   	to_pythonr9   r    r   r:   r.   r   r   r   __set__U   s    zCreator.__set__)N)r3   r4   r5   __doc__r   r=   r@   r   r   r   r   r7   C   s   

r7   c                       s   e Zd Zd( fdd	Zedd Zedd Zd	d
 Zdd Z	dd Z
 fddZdd Zdd Zd) fdd	Zdd Z fddZdd Zdd Zd d! Zd"d# Z fd$d%Z fd&d'Z  ZS )*StreamFieldTNc                    sZ   i | _ dD ]}||kr
||| j |< q
|dd | j d< || _|| _t jf | dS )a  
        Construct a StreamField.

        :param block_types: Either a list of block types that are allowed in this StreamField
            (as a list of tuples of block name and block instance) or a StreamBlock to use as
            the top level block (as a block instance or class).
        :param use_json_field: Ignored, but retained for compatibility with historical migrations.
        :param block_lookup: Used in migrations to provide a more compact block definition -
            see ``wagtail.blocks.definition_lookup.BlockDefinitionLookup``. If passed, ``block_types``
            can contain integer indexes into this lookup table, in place of actual block instances.
        )Zmin_numZmax_numZblock_counts	collapsedblankFrequiredN)
block_optsr   getblock_types_argblock_lookupr   r   )r   block_typesZuse_json_fieldrI   r   argr   r   r   r   Z   s    zStreamField.__init__c                 C   s   | j d k	}|rt| j }t| jtr,| j}nt| jtrJ|rJ|| j}ndt| jtr`|  }nNg }| jD ]:\}}t|tr|r||||f qj|||f qjt	|}|
| j |S r-   )rI   r   r(   rH   r   intZ	get_blockr;   appendr
   Zset_meta_optionsrF   )r   Zhas_block_lookuplookupblockchild_blocksr    Zchild_blockr   r   r   stream_blocky   s"    


zStreamField.stream_blockc                 C   s   t jtdS )N)encoder)r   	JSONFieldr   r   r   r   r   
json_field   s    zStreamField.json_fieldc                 C   s   dS )NrS   r   rT   r   r   r   get_internal_type   s    zStreamField.get_internal_typec                 C   s   | j |S r-   )rU   
get_lookupr   lookup_namer   r   r   rW      s    zStreamField.get_lookupc                 C   s   | j |S r-   )rU   get_transformrX   r   r   r   rZ      s    zStreamField.get_transformc                    sP   t   \}}}}t   fdd| jj D }|g}  |d< ||||fS )Nc                    s   g | ]\}}|  |fqS r   )Z	add_block).0r    rO   rN   r   r   
<listcomp>   s   z+StreamField.deconstruct.<locals>.<listcomp>rI   )r   r   r   rQ   rP   itemsZget_lookup_as_dict)r   r    r!   _r   rJ   r   r   r\   r   r      s    

zStreamField.deconstructc                 C   s   | j |}| |_|S r-   )rQ   r>   Z_stream_field)r   r.   resultr   r   r   r>      s    zStreamField.to_pythonc                 C   sN   t |tr|s|jd k	r|jS t |tr>tj| j|tdS | j|S d S )N)cls)	r(   r   Zraw_textjsondumpsrQ   get_prep_valuer   rU   r1   r   r   r   rd      s    	

 zStreamField.get_prep_valueFc                    s*   t |ts| j|||S t |||S r-   )r(   r   rU   get_db_prep_valuer   )r   r.   
connectionpreparedr   r   r   re      s    
zStreamField.get_db_prep_valuec                 C   s:   t |tr0zt|W S  tk
r.   | Y S X | |S r-   )r(   r   rb   loads
ValueErrorr>   )r   r.   
expressionrf   r   r   r   from_db_value   s    

zStreamField.from_db_valuec                    s$   t | jd}|| t jf |S )z
        Override formfield to use a plain forms.Field so that we do no transformation on the value
        (as distinct from the usual fallback of forms.CharField, which transforms it into a string).
        )Z
form_classrO   )r	   rQ   r%   r   r&   )r   r   r)   r   r   r   r&      s    
zStreamField.formfieldc                 C   s   |  |}| |S r-   )Zvalue_from_objectrd   r?   r   r   r   value_to_string   s    
zStreamField.value_to_stringc                 C   s   | j |S r-   )rQ   r0   r1   r   r   r   r0      s    z"StreamField.get_searchable_contentc                 c   s   | j |E d H  d S r-   )rQ   r2   r1   r   r   r   r2      s    zStreamField.extract_referencesc                 C   s   | j ||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.
        )rQ   get_block_by_content_path)r   r.   Zpath_elementsr   r   r   rm      s    z%StreamField.get_block_by_content_pathc                    s.   t  jf |}|| jjf d| i| |S )Nr*   )r   checkextendrQ   )r   r   errorsr   r   r   rn     s    zStreamField.checkc                    s(   t  j||f| t|| jt|  d S r-   )r   contribute_to_classsetattrr    r7   )r   ra   r    r   r   r   r   rq     s    zStreamField.contribute_to_class)TN)F)r3   r4   r5   r   r   rQ   propertyrU   rV   rW   rZ   r   r>   rd   re   rk   r&   rl   r0   r2   rm   rn   rq   r6   r   r   r   r   rB   Y   s(   


	rB   )rb   Zdjango.core.serializers.jsonr   Zdjango.core.validatorsr   Z	django.dbr   Zdjango.db.models.fields.jsonr   Zdjango.utils.encodingr   Zdjango.utils.functionalr   Zwagtail.blocksr   r	   r
   r   Z wagtail.blocks.definition_lookupr   r   Zwagtail.rich_textr   r   r   Z	TextFieldr   r7   FieldrB   r   r   r   r   <module>   s   -