a
    Dg/                     @   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 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 d dlmZ G dd dej 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%ee$ e# dS )    N)forms)ImproperlyConfigured)widgets)render_to_string)reverse)cached_property)	mark_safe)capfirst)gettext_lazy)AdminURLFinder)versioned_static)resolve_model_string)Page)register)WidgetAdapterc                       s   e Zd ZedZedZedZedZdZdZ	dZ
dZdZdZdZd	Zi Zd
ZdZ fddZedd Z fddZ f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 e!d&d' Z"d(d) Z#d*d+ Z$ed,d- Z%  Z&S )/BaseChooserzChoose an itemzChoose another itemzClear choicezEdit this itemTz!wagtailadmin/widgets/chooser.htmltitleNZChooserhiddenFc                    s:   dD ]}||v rt | ||| qt jf i | d S )N)choose_one_textchoose_another_textclear_choice_textlink_to_chosen_textshow_edit_linkshow_clear_linkiconlinked_fields)setattrpopsuper__init__)selfkwargsvar	__class__ \/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/admin/widgets/chooser.pyr   +   s    
zBaseChooser.__init__c                 C   s
   t | jS N)r   modelr    r%   r%   r&   model_class;   s    zBaseChooser.model_classc                    s$   t  |||}|dkrd S |S d S )N )r   value_from_datadict)r    datafilesnameresultr#   r%   r&   r,   ?   s    zBaseChooser.value_from_datadictc                    s   t  |||S )ze
        Return the context variables required to render the underlying hidden input element
        )r   get_contextr    r/   valueattrsr#   r%   r&   get_hidden_input_contextG   s    z$BaseChooser.get_hidden_input_contextc                 C   s   |  d| |||S )z7Render the HTML for the underlying hidden input elementzdjango/forms/widgets/input.html)Z_renderr5   r2   r%   r%   r&   render_hidden_inputM   s    zBaseChooser.render_hidden_inputc                 C   s
   t | jS r'   )r   chooser_modal_url_namer)   r%   r%   r&   get_chooser_modal_urlT   s    z!BaseChooser.get_chooser_modal_urlc              
   C   sJ   |  ||d|}| ||t||dd|| jd|  | j| jd	S )Nidedit_urlr+   )	widgetoriginal_field_htmlr4   r3   r:   display_titleZchooser_urlr   	classname)r6   getbooldisplay_title_keyr8   r   r>   )r    r/   
value_datar4   r<   r%   r%   r&   r1   W   s    
zBaseChooser.get_contextc                 C   s   t | j| ||pi |S r'   )r   template_namer1   )r    r/   rB   r4   r%   r%   r&   render_htmli   s    zBaseChooser.render_htmlc                 C   sL   |du rdS t || jr|S z| jjj|dW S  | jjyF   Y dS 0 dS )z
        Given a value passed to this widget for rendering (which may be None, an id, or a model
        instance), return a model instance or None
        N)pk)
isinstancer*   Zobjectsr?   ZDoesNotExist)r    r3   r%   r%   r&   get_instanceo   s    zBaseChooser.get_instancec                 C   s   t |S )zK
        Return the text to display as the title for this instance
        )strr    instancer%   r%   r&   get_display_title~   s    zBaseChooser.get_display_titlec                 C   s"   d|j dt || j| |iS )a+  
        Given a model instance, return a value that we can pass to both the server-side template
        and the client-side rendering code (via telepath) that contains all the information needed
        for display. Typically this is a dict of id, title etc; it must be JSON-serialisable.
        r9   r:   )rE   r   Zget_edit_urlrA   rK   rI   r%   r%   r&   get_value_data_from_instance   s    z(BaseChooser.get_value_data_from_instancec                 C   s   |  |}|r| |S dS )a~  
        Given a value passed to this widget for rendering (which may be None, an id, or a model
        instance), return a value that we can pass to both the server-side template and the
        client-side rendering code (via telepath) that contains all the information needed
        for display. Typically this is a dict of id, title etc; it must be JSON-serialisable.
        N)rG   rL   r    r3   rJ   r%   r%   r&   get_value_data   s    
zBaseChooser.get_value_datac           
   	   C   sj   z|d }W n t tfy*   tdY n0 | |}| |||}| |||}| d| d}	t|	S )Nr9   z8BaseChooser cannot be rendered without an 'id' attributez<script>z	</script>)KeyError	TypeErrorrN   rD   render_js_initr   )
r    r/   r3   r4   Zrendererid_rB   Zwidget_htmljsoutr%   r%   r&   render   s    
zBaseChooser.renderc                 C   s    d|   i}| jr| j|d< |S )zThe set of options to pass to the JS initialiser that are constant every time this widget
        instance is rendered (i.e. do not vary based on id / name / value)ZmodalUrlZlinkedFields)r8   r   )r    optsr%   r%   r&   base_js_init_options   s
    
z BaseChooser.base_js_init_optionsc                 C   s
   i | j S r'   )rW   )r    rR   r/   rB   r%   r%   r&   get_js_init_options   s    zBaseChooser.get_js_init_optionsc                 C   s4   |  |||}d| j dt| dt| dS )Nznew (z, z);)rX   js_constructorjsondumps)r    rR   r/   rB   rV   r%   r%   r&   rQ      s    zBaseChooser.render_js_initc                 C   s   t jtdgdS )Nz!wagtailadmin/js/chooser-widget.jsrS   r   ZMediar   r)   r%   r%   r&   media   s    zBaseChooser.media)NN)'__name__
__module____qualname___r   r   r   r   r   r   rC   rA   r   r>   r(   rZ   r   Z
input_typeZ	is_hiddenr   r   r*   r,   r5   r6   r8   r1   rD   rG   rK   rL   rN   rU   propertyrW   rX   rQ   r_   __classcell__r%   r%   r#   r&   r      sH   



r   c                   @   s$   e Zd ZdZdd Zedd ZdS )BaseChooserAdapterzwagtail.admin.widgets.Chooserc                 C   s"   |j dd ddid|d|jgS )NZ__NAME__r9   Z__ID__)r4   )rD   Zid_for_labelrW   )r    r;   r%   r%   r&   js_args   s    zBaseChooserAdapter.js_argsc                 C   s   t jtdgdS )Nz*wagtailadmin/js/chooser-widget-telepath.jsr]   r^   r)   r%   r%   r&   r_      s    zBaseChooserAdapter.mediaN)r`   ra   rb   rZ   rg   r   r_   r%   r%   r%   r&   rf      s   rf   c                       s   e Zd ZedZedZedZdZdZdZ	dZ
dZd fdd	Zedd Ze fddZ fddZdd Z fddZ fddZedd Z  ZS )AdminPageChooserzChoose a pagezChoose another pagezEdit this pager=   Zwagtailadmin_choose_pagezdoc-empty-inversezpage-chooserZPageChooserNFc              
      s   t  jf i | |rtt|tttfs,|g}g }|D ]<}z|t| W q4 tt	fyn   t
d|f Y q40 q4ntg}t|dkr|d turt|d jj}|  jd| d 7  _|| _|| _t| jdkr| jd | _nt| _t|| _d S )NzYCould not resolve %r into a model. Model names should be in the form app_label.model_name   r   z ())r   r   rF   setlisttupleappendr   
ValueErrorLookupErrorr   r   lenr	   _metaZverbose_namer   
user_permstarget_modelsr(   r@   can_choose_root)r    rt   ru   rs   r!   Zcleaned_target_modelsr(   
model_namer#   r%   r&   r      s0    zAdminPageChooser.__init__c                 C   s   dd | j D S )Nc                 S   s"   g | ]}d j |jj|jjdqS )z{app}.{model})Zappr(   )formatrr   Z	app_labelrv   ).0r(   r%   r%   r&   
<listcomp>  s   z0AdminPageChooser.model_names.<locals>.<listcomp>)rt   r)   r%   r%   r&   model_names	  s    zAdminPageChooser.model_namesc                    s   | j | j| jdt jS )N)Z
modelNamesZcanChooseRootZ	userPerms)rz   ru   rs   r   rW   r)   r#   r%   r&   rW     s    z%AdminPageChooser.base_js_init_optionsc                    s   t  |}|r|jS d S r'   )r   rG   ZspecificrM   r#   r%   r&   rG     s    zAdminPageChooser.get_instancec                 C   s   |  S r'   )Zget_admin_display_titlerI   r%   r%   r&   rK   "  s    z"AdminPageChooser.get_display_titlec                    s*   t  |}| }|r|jnd |d< |S )N	parent_id)r   rL   Z
get_parentrE   )r    rJ   r-   Zparent_pager#   r%   r&   rL   %  s    z-AdminPageChooser.get_value_data_from_instancec                    s6   t  |||}|pi }|d}|d ur2||d< |S )Nr{   ZparentId)r   rX   r?   )r    rR   r/   rB   rV   r{   r#   r%   r&   rX   +  s    
z$AdminPageChooser.get_js_init_optionsc                 C   s   t jtdtdgdS )N%wagtailadmin/js/page-chooser-modal.jszwagtailadmin/js/page-chooser.jsr]   r^   r)   r%   r%   r&   r_   3  s
    zAdminPageChooser.media)NFN)r`   ra   rb   rc   r   r   r   rA   r7   r   r>   rZ   r   rd   rz   rW   rG   rK   rL   rX   r_   re   r%   r%   r#   r&   rh      s(    $

rh   c                   @   s   e Zd ZdZedd ZdS )PageChooserAdapterzwagtail.widgets.PageChooserc                 C   s   t jtdtdgdS )Nr|   z(wagtailadmin/js/page-chooser-telepath.jsr]   r^   r)   r%   r%   r&   r_   @  s
    zPageChooserAdapter.mediaN)r`   ra   rb   rZ   r   r_   r%   r%   r%   r&   r}   =  s   r}   c                       s.   e Zd Zd fdd	Ze fddZ  ZS )AdminPageMoveChooserNFc                    s,   | dg | _t jf |||d| d S )Npages_to_move)rt   ru   rs   )r   r   r   r   )r    rt   ru   rs   r!   r#   r%   r&   r   K  s    zAdminPageMoveChooser.__init__c                    s   | j ddt jS )NF)ZtargetPagesZmatchSubclass)r   r   rW   r)   r#   r%   r&   rW   V  s
    z)AdminPageMoveChooser.base_js_init_options)NFN)r`   ra   rb   r   rd   rW   re   r%   r%   r#   r&   r~   J  s    r~   )&r[   Zdjangor   Zdjango.core.exceptionsr   Zdjango.formsr   Zdjango.template.loaderr   Zdjango.urlsr   Zdjango.utils.functionalr   Zdjango.utils.safestringr   Zdjango.utils.textr	   Zdjango.utils.translationr
   rc   Zwagtail.admin.admin_url_finderr   Zwagtail.admin.staticfilesr   Zwagtail.coreutilsr   Zwagtail.modelsr   Zwagtail.telepathr   Zwagtail.widget_adaptersr   ZInputr   rf   rh   r}   r~   r%   r%   r%   r&   <module>   s.    1b