a
    Dg0                     @   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__ M/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/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f i |}t|jD ](\}}t	|t
rFt|j|jd|j|< qF|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iZ	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 r+   )r   r   r   r,   r   r   r   extract_references=   s    z RichTextField.extract_references)	__name__
__module____qualname__r   r!   r%   r.   r0   __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   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__Z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 r+   )r)   	to_pythonr7   r   r   r8   r,   r   r   r   __set__T   s    zCreator.__set__)N)r1   r2   r3   __doc__r   r;   r>   r   r   r   r   r5   B   s   

r5   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f 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.
        )Zmin_numZmax_numZblock_counts	collapsedZblankFrequiredN)
block_optsr   getblock_types_argblock_lookupr   r   )r   block_typesZuse_json_fieldrF   r   argr   r   r   r   Y   s    zStreamField.__init__c                 C   s   | j d u}|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+   )rF   r   r'   rE   r   intZ	get_blockr9   appendr	   Zset_meta_optionsrC   )r   Zhas_block_lookuplookupblockchild_blocksr   Z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 )NrP   r   rQ   r   r   r   get_internal_type   s    zStreamField.get_internal_typec                 C   s   | j |S r+   )rR   
get_lookupr   lookup_namer   r   r   rT      s    zStreamField.get_lookupc                 C   s   | j |S r+   )rR   get_transformrU   r   r   r   rW      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   rL   rK   r   r   
<listcomp>   s   z+StreamField.deconstruct.<locals>.<listcomp>rF   )r   r   r   rN   rM   itemsZget_lookup_as_dict)r   r   r    _r   rG   r   r   rY   r   r      s    

zStreamField.deconstructc                 C   s   | j |}| |_|S r+   )rN   r<   Z_stream_field)r   r,   resultr   r   r   r<      s    zStreamField.to_pythonc                    sP   t  |}t|tr*|s*|jd ur*|jS t|tr@| j|S t  |S d S r+   )r   get_prep_valuer'   r
   Zraw_textrN   r/   r   r   r   r^      s    	
zStreamField.get_prep_valueFc                 C   s    |s|  |}| jj||ddS )NT)
connectionprepared)r^   rR   get_db_prep_value)r   r,   r_   r`   r   r   r   ra      s
    
zStreamField.get_db_prep_valuec                 C   s   | j |||}| |S r+   )rR   from_db_valuer<   )r   r,   Z
expressionr_   r   r   r   rb      s    zStreamField.from_db_valuec                    s(   t | jd}|| t jf 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).
        )Z
form_classrL   )r   rN   r$   r   r%   )r   r   r(   r   r   r   r%      s    
zStreamField.formfieldc                    s   | j t  S r+   )rN   	normalizer   get_defaultrQ   r   r   r   rd      s    zStreamField.get_defaultc                 C   s"   |  |}tj| || jjdS )N)cls)Zvalue_from_objectjsondumpsr^   rR   rO   r=   r   r   r   value_to_string   s    
zStreamField.value_to_stringc                 C   s   | j |S r+   )rN   r.   r/   r   r   r   r.     s    z"StreamField.get_searchable_contentc                 c   s   | j |E d H  d S r+   )rN   r0   r/   r   r   r   r0     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.
        )rN   get_block_by_content_path)r   r,   Zpath_elementsr   r   r   ri     s    z%StreamField.get_block_by_content_pathc                    s2   t  jf i |}|| jjf d| i| |S )Nr)   )r   checkextendrN   )r   r   errorsr   r   r   rj     s    zStreamField.checkc                    s,   t  j||fi | t|| jt|  d S r+   )r   contribute_to_classsetattrr   r5   )r   re   r   r   r   r   r   rm     s    zStreamField.contribute_to_class)TN)F)r1   r2   r3   r   r   rN   propertyrR   rS   rT   rW   r   r<   r^   ra   rb   r%   rd   rh   r.   r0   ri   rj   rm   r4   r   r   r   r   r@   X   s*   



	r@   )rf   Zdjango.core.serializers.jsonr   Zdjango.core.validatorsr   Z	django.dbr   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   r5   ZFieldr@   r   r   r   r   <module>   s   -