o
    h0                     @   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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)	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                    s2   | dd| _| dd | _t j|i | d S )Neditordefaultfeatures)popr   r   super__init__)selfargskwargs	__class__ N/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/fields.pyr      s   zRichTextField.__init__c                 C   s4   |   \}}}}| j|d< | j|d< | j|i |S )Nr   r   )deconstructr   r   r   )r   namepathr   r   r   r   r   clone   s   

zRichTextField.clonec                    st   ddl m} d|| j| jdi}|| t jdi |}t|jD ]\}}t	|t
r7t|j|jd|j|< q#|S )Nr   )get_rich_text_editor_widgetwidget)r   )messager   )wagtail.admin.rich_textr"   r   r   updater   	formfield	enumerate
validators
isinstancer   r   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_content8   s   
z$RichTextField.get_searchable_contentc                 c   s    t t|E d H  d S r0   )r   r   r   r1   r   r   r   extract_references=      z RichTextField.extract_references)	__name__
__module____qualname__r   r!   r'   r3   r5   __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 r0   )r-   )r   r-   r   r   r   r   G   s   
zCreator.__init__Nc                 C   s6   |d u r| S | j j}||jvr|j|gd |j| S )N)fields)r-   r   __dict__refresh_from_db)r   objtype
field_namer   r   r   __get__J   s   

zCreator.__get__c                 C   s   | j ||j| j j< d S r0   )r-   	to_pythonr=   r   r   r?   r1   r   r   r   __set__T   s   zCreator.__set__r0   )r7   r8   r9   __doc__r   rB   rE   r   r   r   r   r;   B   s
    

r;   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 fddZd+ddZdd Z f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                    s^   i | _ dD ]}||v r||| j |< q|dd | j d< || _|| _t jdi | 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.
        )min_nummax_numblock_counts	collapsedblankFrequiredNr   )
block_optsr   getblock_types_argblock_lookupr   r   )r   block_typesuse_json_fieldrQ   r   argr   r   r   r   Y   s   zStreamField.__init__c                 C   s   | j d u}|rt| j }t| jtr| j}nAt| jtr%|r%|| j}n2t| jtr0|  }n'g }| jD ]\}}t|trK|rK||||f q5|||f q5t	|}|
| j |S r0   )rQ   r   r*   rP   r   int	get_blockr@   appendr	   set_meta_optionsrN   )r   has_block_lookuplookupblockchild_blocksr   child_blockr   r   r   stream_blockx   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 )Nr`   r   ra   r   r   r   get_internal_type   s   zStreamField.get_internal_typec                 C      | j |S r0   )rb   
get_lookupr   lookup_namer   r   r   re         zStreamField.get_lookupc                 C   rd   r0   )rb   get_transformrf   r   r   r   ri      rh   zStreamField.get_transformc                    sP   t   \}}}}t   fdd| jj D }|g}  |d< ||||fS )Nc                    s   g | ]\}}|  |fqS r   )	add_block).0r   r[   rZ   r   r   
<listcomp>   s    z+StreamField.deconstruct.<locals>.<listcomp>rQ   )r   r   r   r^   r\   itemsget_lookup_as_dict)r   r   r    _r   rR   r   r   rl   r   r      s   

zStreamField.deconstructc                 C   s   | j |}| |_|S r0   )r^   rC   _stream_field)r   r1   resultr   r   r   rC      s   zStreamField.to_pythonc                    sL   t  |}t|tr|s|jd ur|jS t|tr | j|S t  |S r0   )r   get_prep_valuer*   r
   raw_textr^   r4   r   r   r   rs      s   

zStreamField.get_prep_valueFc                 C   s    |s|  |}| jj||ddS )NT)
connectionprepared)rs   rb   get_db_prep_value)r   r1   ru   rv   r   r   r   rw      s
   
zStreamField.get_db_prep_valuec                 C   s   | j |||}| |S r0   )rb   from_db_valuerC   )r   r1   
expressionru   r   r   r   rx      s   
zStreamField.from_db_valuec                    s(   t | jd}|| t jdi |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).
        )
form_classr[   Nr   )r   r^   r&   r   r'   )r   r   r,   r   r   r   r'      s   
zStreamField.formfieldc                    s   | j t  S r0   )r^   	normalizer   get_defaultra   r   r   r   r|      s   zStreamField.get_defaultc                 C   s"   |  |}tj| || jjdS )N)cls)value_from_objectjsondumpsrs   rb   r_   rD   r   r   r   value_to_string   s   
zStreamField.value_to_stringc                 C   rd   r0   )r^   r3   r4   r   r   r   r3     rh   z"StreamField.get_searchable_contentc                 c   s    | j |E d H  d S r0   )r^   r5   r4   r   r   r   r5     r6   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.
        )r^   get_block_by_content_path)r   r1   path_elementsr   r   r   r     s   z%StreamField.get_block_by_content_pathc                    s2   t  jdi |}|| jjdd| i| |S )Nr-   r   )r   checkextendr^   )r   r   errorsr   r   r   r     s   zStreamField.checkc                    s,   t  j||fi | t|| jt|  d S r0   )r   contribute_to_classsetattrr   r;   )r   r}   r   r   r   r   r   r     s   zStreamField.contribute_to_class)TN)F)r7   r8   r9   r   r   r^   propertyrb   rc   re   ri   r   rC   rs   rw   rx   r'   r|   r   r3   r5   r   r   r   r:   r   r   r   r   rG   X   s,    



	rG   )r   django.core.serializers.jsonr   django.core.validatorsr   	django.dbr   django.utils.encodingr   django.utils.functionalr   wagtail.blocksr   r   r	   r
    wagtail.blocks.definition_lookupr   r   wagtail.rich_textr   r   r   	TextFieldr   r;   FieldrG   r   r   r   r   <module>   s    -