U
    {h7}                     @   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
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 d dlmZ d dlmZ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& zd dl'm(Z( W n" e)k
r
   d dl*m(Z( Y nX G dd de&Z+G dd de#Z,e$e, e+ G dd de+Z-G dd de+Z.G dd de.Z/G dd de+Z0G dd  d e+Z1G d!d" d"e+Z2G d#d$ d$e+Z3G d%d& d&e+Z4G d'd( d(e+Z5G d)d* d*e+Z6G d+d, d,e+Z7G d-d. d.e+Z8G d/d0 d0e+Z9G d1d2 d2e+Z:G d3d4 d4e:Z;G d5d6 d6e:Z<G d7d8 d8e+Z=G d9d: d:e+Z>G d;d< d<e+Z?G d=d> d>e?Z@e+e-e3e=e>e?e@e.e4e5e6e7e;e<e8e9e0e1e2e/gZAd?d@ eAD ZBdAdB eAD ZCdS )C    NDecimal)forms)Model)BLANK_CHOICE_DASH)
parse_dateparse_datetime
parse_time)	force_str)cached_propertyformat_html	mark_safe)gettext)versioned_static)camelcase_to_underscoreresolve_model_string)RichTextRichTextMaxLengthValidator!extract_references_from_rich_textget_text_for_indexing)Adapterregister   )Block)CallableChoiceIteratorc                   @   sb   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd Zdd ZG dd dZdS )
FieldBlockz&A block that wraps a Django form fieldc                 C   s   | j j|S N)fieldwidgetid_for_label)selfprefix r$   b/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/blocks/field_block.pyr!   $   s    zFieldBlock.id_for_labelc                 C   s   |S )a  
        The value that we get back from the form field might not be the type
        that this block works with natively; for example, the block may want to
        wrap a simple value such as a string in an object that provides a fancy
        HTML rendering (e.g. EmbedBlock).

        We therefore provide this method to perform any necessary conversion
        from the form field value to the block's native value. As standard,
        this returns the form field value unchanged.
        r$   r"   valuer$   r$   r%   value_from_form'   s    zFieldBlock.value_from_formc                 C   s   |S )z
        Reverse of value_from_form; convert a value of this block's native value type
        to one that can be rendered by the form field
        r$   r&   r$   r$   r%   value_for_form4   s    zFieldBlock.value_for_formc                 C   s   |  | jj|||S r   )r(   r   r    value_from_datadictr"   datafilesr#   r$   r$   r%   r*   ;   s    zFieldBlock.value_from_datadictc                 C   s   | j j|||S r   )r   r    value_omitted_from_datar+   r$   r$   r%   r.   @   s    z"FieldBlock.value_omitted_from_datac                 C   s   |  | j| |S r   )r(   r   cleanr)   r&   r$   r$   r%   r/   C   s    zFieldBlock.cleanc                 C   s   | j jS r   )r   requiredr"   r$   r$   r%   r0   I   s    zFieldBlock.requiredc                 C   s   | j j| j | |S r   )r   r    Zformat_valueZprepare_valuer)   r&   r$   r$   r%   get_form_stateN   s    zFieldBlock.get_form_statec                   @   s   e Zd ZdZdZdS )zFieldBlock.MetaplaceholderN)__name__
__module____qualname__icondefaultr$   r$   r$   r%   MetaS   s   r9   N)r4   r5   r6   __doc__r!   r(   r)   r*   r.   r/   propertyr0   r2   r9   r$   r$   r$   r%   r   !   s   
r   c                   @   s$   e Zd ZdZdd Zedd ZdS )FieldBlockAdapterzwagtail.blocks.FieldBlockc                 C   s   ddt |jjj dt |jjjj g}t|jdd}|rH|| t|jdd}|rd|| |j|j	|jj
d|t|jjddd	td
id}|jjr|jj|d< t|dr|jd k	r|j|d< |j|jj|gS )Nzw-fieldz	w-field--form_classname 	classname Zshow_add_comment_buttonTZADD_COMMENTzAdd Comment)labelr0   r7   r?   ZshowAddCommentButtonstringsZhelpText
max_lengthZ	maxLength)r   r   	__class__r4   r    getattrmetaappendrA   r0   r7   join_	help_texthasattrrC   name)r"   blockr?   r=   Zlegacy_classnamerF   r$   r$   r%   js_args^   s:    

  


zFieldBlockAdapter.js_argsc                 C   s   t jtdgdS )Nz"wagtailadmin/js/telepath/blocks.js)js)r   ZMediar   r1   r$   r$   r%   media   s    zFieldBlockAdapter.mediaN)r4   r5   r6   Zjs_constructorrN   r   rP   r$   r$   r$   r%   r<   [   s   &r<   c                       s&   e Zd Zd fdd	Zdd Z  ZS )		CharBlockTNr$   c                    s.   || _ tj|||||d| _t jf | d S N)r0   rJ   rC   
min_length
validators)search_indexr   	CharFieldr   super__init__)r"   r0   rJ   rC   rS   rT   rU   kwargsrD   r$   r%   rX      s    zCharBlock.__init__c                 C   s   | j rt|gS g S r   rU   r
   r&   r$   r$   r%   get_searchable_content   s    z CharBlock.get_searchable_content)TNNNr$   T)r4   r5   r6   rX   r\   __classcell__r$   r$   rZ   r%   rQ      s         rQ   c                       s@   e Zd Zd fdd	Zedd Zd	d
 ZG dd dZ  ZS )	TextBlockTNr   r$   c           	         s0   |||||d| _ || _|| _t jf | d S rR   )field_optionsrowsrU   rW   rX   )	r"   r0   rJ   r`   rC   rS   rU   rT   rY   rZ   r$   r%   rX      s    zTextBlock.__init__c                 C   s8   ddl m} d|d| jidi}|| j tjf |S )Nr   )AdminAutoHeightTextInputr    r`   )attrs)wagtail.admin.widgetsra   r`   updater_   r   rV   )r"   ra   field_kwargsr$   r$   r%   r      s    zTextBlock.fieldc                 C   s   | j rt|gS g S r   r[   r&   r$   r$   r%   r\      s    z TextBlock.get_searchable_contentc                   @   s   e Zd ZdZdS )zTextBlock.MetapilcrowNr4   r5   r6   r7   r$   r$   r$   r%   r9      s   r9   )TNr   NNTr$   )	r4   r5   r6   rX   r   r   r\   r9   r]   r$   r$   rZ   r%   r^      s          
r^   c                   @   s$   e Zd ZdddZG dd dZdS )BlockQuoteBlockNc                 C   s   |rt d|S dS d S )Nz<blockquote>{0}</blockquote>r>   r   r"   r'   contextr$   r$   r%   render_basic   s    
zBlockQuoteBlock.render_basicc                   @   s   e Zd ZdZdS )zBlockQuoteBlock.MetaZ	openquoteNrg   r$   r$   r$   r%   r9      s   r9   )N)r4   r5   r6   rk   r9   r$   r$   r$   r%   rh      s   
rh   c                       s,   e Zd Zd fdd	ZG dd dZ  ZS )	
FloatBlockTNr$   c                    s&   t j||||d| _t j|| d S )N)r0   	max_value	min_valuerT   )r   Z
FloatFieldr   rW   rX   )r"   r0   rm   rn   rT   argsrY   rZ   r$   r%   rX      s    	zFloatBlock.__init__c                   @   s   e Zd ZdZdS )zFloatBlock.MetadecimalNrg   r$   r$   r$   r%   r9      s   r9   )TNNr$   r4   r5   r6   rX   r9   r]   r$   r$   rZ   r%   rl      s       rl   c                       s4   e Zd Zd
 fdd	Zdd ZG dd	 d	Z  ZS )DecimalBlockTNr$   c           
   	      s,   t j|||||||d| _t j||	 d S )N)r0   rJ   rm   rn   
max_digitsdecimal_placesrT   )r   ZDecimalFieldr   rW   rX   )
r"   r0   rJ   rm   rn   rs   rt   rT   ro   rY   rZ   r$   r%   rX      s    	zDecimalBlock.__init__c                 C   s   |d kr|S t |S d S r   r   r&   r$   r$   r%   	to_python
  s    zDecimalBlock.to_pythonc                   @   s   e Zd ZdZdS )zDecimalBlock.Metarp   Nrg   r$   r$   r$   r%   r9     s   r9   )TNNNNNr$   )r4   r5   r6   rX   ru   r9   r]   r$   r$   rZ   r%   rr      s          rr   c                       s,   e Zd Zd fdd	ZG dd dZ  ZS )	
RegexBlockTNr$   c           
   	      s,   t j|||||||d| _t j||	 d S )N)regexr0   rJ   rC   rS   error_messagesrT   )r   Z
RegexFieldr   rW   rX   )
r"   rw   r0   rJ   rC   rS   rx   rT   ro   rY   rZ   r$   r%   rX     s    	zRegexBlock.__init__c                   @   s   e Zd ZdZdS )zRegexBlock.Metarw   Nrg   r$   r$   r$   r%   r9   ,  s   r9   )TNNNNr$   rq   r$   r$   rZ   r%   rv     s         rv   c                       s,   e Zd Zd fdd	ZG dd dZ  ZS )	URLBlockTNr$   c                    s(   t j|||||d| _t jf | d S rR   )r   ZURLFieldr   rW   rX   r"   r0   rJ   rC   rS   rT   rY   rZ   r$   r%   rX   1  s    	zURLBlock.__init__c                   @   s   e Zd ZdZdS )zURLBlock.Metazlink-externalNrg   r$   r$   r$   r%   r9   C  s   r9   )TNNNr$   rq   r$   r$   rZ   r%   ry   0  s        ry   c                       s4   e Zd Zd	 fdd	Zdd ZG dd dZ  ZS )
BooleanBlockTNc                    s"   t j||d| _t jf | d S )N)r0   rJ   )r   ZBooleanFieldr   rW   rX   )r"   r0   rJ   rY   rZ   r$   r%   rX   H  s    zBooleanBlock.__init__c                 C   s   t |S r   )boolr&   r$   r$   r%   r2   P  s    zBooleanBlock.get_form_statec                   @   s   e Zd ZdZdS )zBooleanBlock.Metaztick-inverseNrg   r$   r$   r$   r%   r9   V  s   r9   )TN)r4   r5   r6   rX   r2   r9   r]   r$   r$   rZ   r%   r{   G  s   r{   c                       s@   e Zd Zd fdd	Zedd Zdd	 ZG d
d dZ  ZS )	DateBlockTNr$   c                    sP   |||d| _ z|d| j d< W n tk
r6   Y nX || _t jf | d S )Nr0   rJ   rT   Zinput_formats)r_   popKeyErrorformatrW   rX   r"   r0   rJ   r   rT   rY   rZ   r$   r%   rX   [  s    zDateBlock.__init__c                 C   s4   ddl m} d|| jdi}|| j tjf |S )Nr   )AdminDateInputr    r   )rc   r   r   rd   r_   r   Z	DateField)r"   r   re   r$   r$   r%   r   j  s     
zDateBlock.fieldc                 C   s$   |d kst |tjr|S t|S d S r   )
isinstancedatetimedater   r&   r$   r$   r%   ru   t  s    zDateBlock.to_pythonc                   @   s   e Zd ZdZdS )zDateBlock.Metar   Nrg   r$   r$   r$   r%   r9   }  s   r9   )TNNr$   	r4   r5   r6   rX   r   r   ru   r9   r]   r$   r$   rZ   r%   r}   Z  s          
		r}   c                       s@   e Zd Zd fdd	Zedd Zdd	 ZG d
d dZ  ZS )	TimeBlockTNr$   c                    s&   |||d| _ || _t jf | d S Nr~   r_   r   rW   rX   r   rZ   r$   r%   rX     s    zTimeBlock.__init__c                 C   s4   ddl m} d|| jdi}|| j tjf |S )Nr   )AdminTimeInputr    r   )rc   r   r   rd   r_   r   Z	TimeField)r"   r   re   r$   r$   r%   r     s    zTimeBlock.fieldc                 C   s$   |d kst |tjr|S t|S d S r   )r   r   timer	   r&   r$   r$   r%   ru     s    zTimeBlock.to_pythonc                   @   s   e Zd ZdZdS )zTimeBlock.Metar   Nrg   r$   r$   r$   r%   r9     s   r9   )TNNr$   r   r$   r$   rZ   r%   r     s          
r   c                       s@   e Zd Zd fdd	Zedd Zdd	 ZG d
d dZ  ZS )DateTimeBlockTNr$   c                    s&   |||d| _ || _t jf | d S r   r   r   rZ   r$   r%   rX     s    zDateTimeBlock.__init__c                 C   s4   ddl m} d|| jdi}|| j tjf |S )Nr   )AdminDateTimeInputr    r   )rc   r   r   rd   r_   r   ZDateTimeField)r"   r   re   r$   r$   r%   r     s     
zDateTimeBlock.fieldc                 C   s$   |d kst |tjr|S t|S d S r   )r   r   r   r&   r$   r$   r%   ru     s    zDateTimeBlock.to_pythonc                   @   s   e Zd ZdZdS )zDateTimeBlock.Metar   Nrg   r$   r$   r$   r%   r9     s   r9   )TNNr$   r   r$   r$   rZ   r%   r     s          
	r   c                       s,   e Zd Zd fdd	ZG dd dZ  ZS )	
EmailBlockTNr$   c                    s$   t j|||d| _t jf | d S r   )r   Z
EmailFieldr   rW   rX   r"   r0   rJ   rT   rY   rZ   r$   r%   rX     s    zEmailBlock.__init__c                   @   s   e Zd ZdZdS )zEmailBlock.MetamailNrg   r$   r$   r$   r%   r9     s   r9   )TNr$   rq   r$   r$   rZ   r%   r     s   r   c                       s,   e Zd Zd fdd	ZG dd dZ  ZS )	IntegerBlockTNr$   c                    s(   t j|||||d| _t jf | d S )N)r0   rJ   rn   rm   rT   )r   ZIntegerFieldr   rW   rX   )r"   r0   rJ   rn   rm   rT   rY   rZ   r$   r%   rX     s    	zIntegerBlock.__init__c                   @   s   e Zd ZdZdS )zIntegerBlock.Metar3   Nrg   r$   r$   r$   r%   r9     s   r9   )TNNNr$   rq   r$   r$   rZ   r%   r     s        r   c                       s:   e Zd ZdZd
 fdd	ZdddZG dd	 d	Z  ZS )BaseChoiceBlockr$   NTc                    s   || _ || _|| _|d kr | j}t|r6|}	t|}nt| }	}| | _|	| jd< |dk	rh|| jd< |d k	rz|| jd< | 	|}
| j
|
||||d| _t jf d|i| d S )NchoicesTr0   rJ   )r   r0   rJ   rT   r    r8   )	_required_defaultrU   r   callabler   listcopy_constructor_kwargs_get_callable_choices	get_fieldr   rW   rX   )r"   r   r8   r0   rJ   rU   r    rT   rY   Zchoices_for_constructorZcallable_choicesrZ   r$   r%   rX     s0    





zBaseChoiceBlock.__init__c                    s    fdd}|S )z
        Return a callable that we can pass into `forms.ChoiceField`, which will provide the
        choices list with the addition of a blank choice (if blank_choice=True and one does not
        already exist).
        c                     sl   t }  s| S d}| D ]B\}}t|t tfrJtdd |D }|rZ q\q|dkrd} q\q|sht|  S | S )NFc                 s   s   | ]\}}|d kV  qdS )r>   NNr$   ).0r'   rA   r$   r$   r%   	<genexpr>6  s     zRBaseChoiceBlock._get_callable_choices.<locals>.choices_callable.<locals>.<genexpr>r   T)r   r   tupleanyr   )Zlocal_choicesZhas_blank_choiceZv1v2blank_choicer   r$   r%   choices_callable$  s    z?BaseChoiceBlock._get_callable_choices.<locals>.choices_callabler$   )r"   r   r   r   r$   r   r%   r     s     z%BaseChoiceBlock._get_callable_choicesc                   @   s   e Zd ZdZdS )zBaseChoiceBlock.Metar3   Nrg   r$   r$   r$   r%   r9   F  s   r9   )NNTNTNr$   )T)r4   r5   r6   r   rX   r   r9   r]   r$   r$   rZ   r%   r     s          7
)r   c                       s6   e Zd Zdd Zd
 fdd	Zdd Zdd	 Z  ZS )ChoiceBlockc                 K   s   t jf |S r   )r   ZChoiceFieldr"   rY   r$   r$   r%   r   N  s    zChoiceBlock.get_fieldNc                    s&   |d kr| j o| j }t j||dS )Nr   )r   r   rW   r   r"   r   r   rZ   r$   r%   r   Q  s    z!ChoiceBlock._get_callable_choicesc                 C   s   dg | j fS )a  
        Always deconstruct ChoiceBlock instances as if they were plain ChoiceBlocks with their
        choice list passed in the constructor, even if they are actually subclasses. This allows
        users to define subclasses of ChoiceBlock in their models.py, with specific choice lists
        passed in, without references to those classes ending up frozen into migrations.
        zwagtail.blocks.ChoiceBlockr   r1   r$   r$   r%   deconstructW  s    zChoiceBlock.deconstructc                 C   s   | j s
g S t|}| jjD ]t\}}t|ttfrl|D ]4\}}||ksP|t|kr4t|t|g    S q4q||ks|t|krt|g  S qg S r   )rU   r
   r   r   r   r   r   )r"   r'   
text_valuekvk2r   r$   r$   r%   r\   `  s    z"ChoiceBlock.get_searchable_content)Nr4   r5   r6   r   r   r   r\   r]   r$   r$   rZ   r%   r   M  s   	r   c                       s6   e Zd Zdd Zd
 fdd	Zdd Zdd	 Z  ZS )MultipleChoiceBlockc                 K   s   t jf |S r   )r   ZMultipleChoiceFieldr   r$   r$   r%   r   r  s    zMultipleChoiceBlock.get_fieldFc                    s   t  j||dS )z)Override to default blank choice to Falser   )rW   r   r   rZ   r$   r%   r   u  s    z)MultipleChoiceBlock._get_callable_choicesc                 C   s   dg | j fS )a  
        Always deconstruct MultipleChoiceBlock instances as if they were plain
        MultipleChoiceBlocks with their choice list passed in the constructor,
        even if they are actually subclasses. This allows users to define
        subclasses of MultipleChoiceBlock in their models.py, with specific choice
        lists passed in, without references to those classes ending up frozen
        into migrations.
        z"wagtail.blocks.MultipleChoiceBlockr   r1   r$   r$   r%   r   y  s    	zMultipleChoiceBlock.deconstructc                 C   s   | j s
g S g }t|}| jjD ]x\}}t|ttfrt|D ]8\}}||ksT|t|kr8|t| |t| q8q||ks|t|kr|t| q|S r   )rU   r
   r   r   r   r   r   rG   )r"   r'   contentr   r   r   r   r   r$   r$   r%   r\     s    z*MultipleChoiceBlock.get_searchable_content)Fr   r$   r$   rZ   r%   r   q  s   r   c                       sp   e Zd Zd fdd	Zdd Zd	d
 Zdd Zedd Zdd Z	dd Z
dd Zdd ZG dd dZ  ZS )RichTextBlockTNr8   r$   c           	         sR   |d k	rt |t|g }|||d| _|| _|| _|| _|| _t jf | d S r   )	r   r   r_   rC   editorfeaturesrU   rW   rX   )	r"   r0   rJ   r   r   rC   rT   rU   rY   rZ   r$   r%   rX     s    zRichTextBlock.__init__c                 C   s   t |S r   r   r&   r$   r$   r%   ru     s    zRichTextBlock.to_pythonc                 C   s   |j S r   sourcer&   r$   r$   r%   get_prep_value  s    zRichTextBlock.get_prep_valuec                 C   s   t |tr|S t|S r   )r   r   r&   r$   r$   r%   	normalize  s    
zRichTextBlock.normalizec                 C   s.   ddl m} tjf d|| j| jdi| jS )Nr   )get_rich_text_editor_widgetr    )r   )Zwagtail.admin.rich_textr   r   rV   r   r   r_   )r"   r   r$   r$   r%   r     s    zRichTextBlock.fieldc                 C   s   |j S r   r   r&   r$   r$   r%   r)     s    zRichTextBlock.value_for_formc                 C   s   t |S r   r   r&   r$   r$   r%   r(     s    zRichTextBlock.value_from_formc                 C   s   | j s
g S t|j}t|gS r   )rU   r
   r   r   )r"   r'   r   r$   r$   r%   r\     s    
z$RichTextBlock.get_searchable_contentc                 c   s   t t|jE d H  d S r   )r   r
   r   r&   r$   r$   r%   extract_references  s    z RichTextBlock.extract_referencesc                   @   s   e Zd ZdZdS )zRichTextBlock.Metarf   Nrg   r$   r$   r$   r%   r9     s   r9   )TNr8   NNr$   T)r4   r5   r6   rX   ru   r   r   r   r   r)   r(   r\   r   r9   r]   r$   r$   rZ   r%   r     s$          
r   c                       s\   e Zd Zd fdd	Zdd Zdd	 Zd
d Zdd Zdd Zdd Z	G dd dZ
  ZS )RawHTMLBlockTNr$   c                    s,   t j|||||t jd| _t jf | d S )N)r0   rJ   rC   rS   rT   r    )r   rV   ZTextarear   rW   rX   rz   rZ   r$   r%   rX     s    	zRawHTMLBlock.__init__c                 C   s   |  | jjpdS Nr>   )r   rF   r8   r1   r$   r$   r%   get_default  s    zRawHTMLBlock.get_defaultc                 C   s   t |S r   r   r&   r$   r$   r%   ru     s    zRawHTMLBlock.to_pythonc                 C   s   t |S r   r   r&   r$   r$   r%   r     s    zRawHTMLBlock.normalizec                 C   s   t |d S r   strr&   r$   r$   r%   r     s    zRawHTMLBlock.get_prep_valuec                 C   s   t |d S r   r   r&   r$   r$   r%   r)     s    zRawHTMLBlock.value_for_formc                 C   s   t |S r   r   r&   r$   r$   r%   r(     s    zRawHTMLBlock.value_from_formc                   @   s   e Zd ZdZdS )zRawHTMLBlock.MetacodeNrg   r$   r$   r$   r%   r9     s   r9   )TNNNr$   )r4   r5   r6   rX   r   ru   r   r   r)   r(   r9   r]   r$   r$   rZ   r%   r     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	dd Z
dd Z fddZdd ZG dd dZ  ZS )ChooserBlockTNr$   c                    s$   || _ || _|| _t jf | d S r   )r   
_help_text_validatorsrW   rX   r   rZ   r$   r%   rX     s    zChooserBlock.__init__c                 C   s
   t | jS r   )r   target_modelr1   r$   r$   r%   model_class  s    zChooserBlock.model_classc                 C   s$   t j| jj | j| j| j| jdS )N)Zquerysetr    r0   rT   rJ   )	r   ZModelChoiceFieldr   objectsallr    r   r   r   r1   r$   r$   r%   r     s    
zChooserBlock.fieldc                 C   s>   |d kr|S z| j jj|dW S  | j jk
r8   Y d S X d S Npk)r   r   getDoesNotExistr&   r$   r$   r%   ru   &  s    zChooserBlock.to_pythonc                    s    | j j|  fdd|D S )zReturn the model instances for the given list of primary keys.

        The instances must be returned in the same order as the values and keep None values.
        c                    s   g | ]}  |qS r$   )r   )r   idr   r$   r%   
<listcomp>6  s    z/ChooserBlock.bulk_to_python.<locals>.<listcomp>)r   r   Zin_bulk)r"   valuesr$   r   r%   bulk_to_python0  s    
zChooserBlock.bulk_to_pythonc                 C   s   |d krd S |j S d S r   r   r&   r$   r$   r%   r   :  s    zChooserBlock.get_prep_valuec                 C   sJ   |d kst || jr|S z| jjj|dW S  | jjk
rD   Y d S X d S r   )r   r   r   r   r   r&   r$   r$   r%   r(   A  s    zChooserBlock.value_from_formc                 C   s   | j |S r   r    Zget_value_datar&   r$   r$   r%   r2   K  s    zChooserBlock.get_form_statec                    s   t || jr|j}t |S r   )r   r   r   rW   r/   r&   rZ   r$   r%   r/   N  s    zChooserBlock.cleanc                 c   s.   |d k	r*t | jtr*| jt|jddfV  d S r   )
issubclassr   r   r   r   r&   r$   r$   r%   r   Z  s    zChooserBlock.extract_referencesc                   @   s   e Zd ZdZdS )zChooserBlock.Metar3   Nrg   r$   r$   r$   r%   r9   ^  s   r9   )TNr$   )r4   r5   r6   rX   r   r   r   ru   r   r   r(   r2   r/   r   r9   r]   r$   r$   rZ   r%   r     s   

	


r   c                       sn   e Zd Zd fdd	Zedd Zedd Zed	d
 Zdd ZdddZ	 fddZ
G dd dZ  ZS )PageChooserBlockNFc                    sD   |r|}|r"t |ttfs&|g}ng }|| _|| _t jf | d S r   )r   r   r   	page_typecan_choose_rootrW   rX   )r"   r   r   r   rY   rZ   r$   r%   rX   f  s    zPageChooserBlock.__init__c                 C   s    t | jdkr| jd S tdS )a  
        Defines the model used by the base ChooserBlock for ID <-> instance
        conversions. If a single page type is specified in target_model,
        we can use that to get the more specific instance "for free"; otherwise
        use the generic Page model.
        r   r   zwagtailcore.Page)lentarget_modelsr   r1   r$   r$   r%   r   z  s    
zPageChooserBlock.target_modelc                 C   s"   g }| j D ]}|t| q
|S r   )r   rG   r   )r"   r   r   r$   r$   r%   r     s    
zPageChooserBlock.target_modelsc                 C   s   ddl m} || j| jdS )Nr   )AdminPageChooser)r   r   )rc   r   r   r   )r"   r   r$   r$   r%   r      s
     zPageChooserBlock.widgetc                 C   s:   | j |}|d krd S |d |d |d |d dS d S )Nr   Z	parent_idZdisplay_titleZedit_url)r   ZparentIdZ
adminTitleZeditUrlr   )r"   r'   Z
value_datar$   r$   r%   r2     s    zPageChooserBlock.get_form_statec                 C   s   |rt d|j|jS dS d S )Nz<a href="{0}">{1}</a>r>   )r   urltitleri   r$   r$   r%   rk     s    zPageChooserBlock.render_basicc                    sl   t   \}}}d|ks d|krbg }| jD ]"}|j}||j d|j  q*|dd  ||d< |||fS )Nr   r   .)rW   r   r   _metarG   Z	app_labelZobject_namer   )r"   rL   ro   rY   r   r   optsrZ   r$   r%   r     s    
zPageChooserBlock.deconstructc                   @   s   e Zd ZdZdS )zPageChooserBlock.Metazdoc-empty-inverseNrg   r$   r$   r$   r%   r9     s   r9   )NFN)N)r4   r5   r6   rX   r   r   r   r    r2   rk   r   r9   r]   r$   r$   rZ   r%   r   e  s        



r   c                 C   s   i | ]}|d |j  qS )zwagtail.blocks.%sr4   r   clsr$   r$   r%   
<dictcomp>  s      r   c                 C   s   g | ]
}|j qS r$   r   r   r$   r$   r%   r     s     r   )Dr   rp   r   djangor   Zdjango.db.modelsr   Zdjango.db.models.fieldsr   Zdjango.utils.dateparser   r   r	   Zdjango.utils.encodingr
   Zdjango.utils.functionalr   Zdjango.utils.htmlr   Zdjango.utils.safestringr   Zdjango.utils.translationr   rI   Zwagtail.admin.staticfilesr   Zwagtail.coreutilsr   r   Zwagtail.rich_textr   r   r   r   Zwagtail.telepathr   r   baser   Zdjango.utils.choicesr   ImportErrorZdjango.forms.fieldsr   r<   rQ   r^   rh   rl   rr   rv   ry   r{   r}   r   r   r   r   r   r   r   r   r   r   r   Zblock_classesZDECONSTRUCT_ALIASES__all__r$   r$   r$   r%   <module>   s   :2&"' j$&K-V[