o
    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 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titleNChooserhiddenFc                    s:   dD ]}||v rt | ||| qt jd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__r   ]/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/admin/widgets/chooser.pyr!   +   s
   
zBaseChooser.__init__c                 C   
   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 )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"   r1   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)_renderr7   r4   r   r   r'   render_hidden_inputM   s   zBaseChooser.render_hidden_inputc                 C   r(   r)   )r   chooser_modal_url_namer+   r   r   r'   get_chooser_modal_urlT      
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_htmlr6   r5   r>   display_titlechooser_urlr   	classname)r9   getbooldisplay_title_keyr;   r   rC   )r"   r1   
value_datar6   r@   r   r   r'   r3   W   s   
zBaseChooser.get_contextc                 C   s   t | j| ||p	i |S r)   )r   template_namer3   )r"   r1   rG   r6   r   r   r'   render_htmli   s   zBaseChooser.render_htmlc                 C   sH   |du rdS t || jr|S z	| jjj|dW S  | jjy#   Y dS w )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,   objectsrD   DoesNotExist)r"   r5   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.
        r=   r>   )rJ   r   get_edit_urlrF   rR   rP   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)rN   rT   r"   r5   rQ   r   r   r'   get_value_data   s   

zBaseChooser.get_value_datac           
   	   C   sf   z|d }W n t tfy   tdw | |}| |||}| |||}| d| d}	t|	S )Nr=   z8BaseChooser cannot be rendered without an 'id' attributez<script>z	</script>)KeyError	TypeErrorrV   rI   render_js_initr   )
r"   r1   r5   r6   rendererid_rG   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)modalUrllinkedFields)r;   r   )r"   optsr   r   r'   base_js_init_options   s
   
z BaseChooser.base_js_init_optionsc                 C   s
   i | j S r)   )rc   )r"   r[   r1   rG   r   r   r'   get_js_init_options   r<   zBaseChooser.get_js_init_optionsc                 C   s4   |  |||}d| j dt| dt| dS )Nznew (z, z);)rd   js_constructorjsondumps)r"   r[   r1   rG   rb   r   r   r'   rY      s   &zBaseChooser.render_js_initc                 C      t jtdgdS )Nz!wagtailadmin/js/chooser-widget.jsr]   r   Mediar   r+   r   r   r'   media      zBaseChooser.media)NN)'__name__
__module____qualname___r   r   r   r   r   r   rH   rF   r   rC   r*   rf   r   
input_type	is_hiddenr!   r   r,   r.   r7   r9   r;   r3   rI   rN   rR   rT   rV   r_   propertyrc   rd   rY   rm   __classcell__r   r   r%   r'   r      sJ    



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 )N__NAME__r=   __ID__)r6   )rI   id_for_labelrc   )r"   r?   r   r   r'   js_args   s   zBaseChooserAdapter.js_argsc                 C   ri   )Nz*wagtailadmin/js/chooser-widget-telepath.jsrj   rk   r+   r   r   r'   rm      rn   zBaseChooserAdapter.mediaN)ro   rp   rq   rf   r{   r   rm   r   r   r   r'   rw      s
    rw   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 pagerA   wagtailadmin_choose_pagezdoc-empty-inversezpage-chooserPageChooserNFc              
      s   t  jdi | |r7t|tttfs|g}g }|D ]}z	|t| W q tt	fy5   t
d|f w ntg}t|dkrY|d turYt|d jj}|  jd| d 7  _|| _|| _t| jdkrm| 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    r!   rK   setlisttupleappendr   
ValueErrorLookupErrorr   r   lenr	   _metaverbose_namer   
user_permstarget_modelsr*   rE   can_choose_root)r"   r   r   r   r#   cleaned_target_modelsr*   
model_namer%   r   r'   r!      s4   
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})appr*   )formatr   	app_labelr   ).0r*   r   r   r'   
<listcomp>  s    z0AdminPageChooser.model_names.<locals>.<listcomp>)r   r+   r   r   r'   model_names	  s   zAdminPageChooser.model_namesc                    s   | j | j| jdt jS )N)
modelNamescanChooseRoot	userPerms)r   r   r   r    rc   r+   r%   r   r'   rc     s   z%AdminPageChooser.base_js_init_optionsc                    s   t  |}|r|jS d S r)   )r    rN   specificrU   r%   r   r'   rN     s   zAdminPageChooser.get_instancec                 C   s   |  S r)   )get_admin_display_titlerP   r   r   r'   rR   "  s   z"AdminPageChooser.get_display_titlec                    s*   t  |}| }|r|jnd |d< |S )N	parent_id)r    rT   
get_parentrJ   )r"   rQ   r/   parent_pager%   r   r'   rT   %  s   z-AdminPageChooser.get_value_data_from_instancec                    s6   t  |||}|pi }|d}|d ur||d< |S )Nr   parentId)r    rd   rD   )r"   r[   r1   rG   rb   r   r%   r   r'   rd   +  s   
z$AdminPageChooser.get_js_init_optionsc                 C      t jtdtdgdS )N%wagtailadmin/js/page-chooser-modal.jszwagtailadmin/js/page-chooser.jsrj   rk   r+   r   r   r'   rm   3  
   zAdminPageChooser.mediaNFN)ro   rp   rq   rr   r   r   r   rF   r:   r   rC   rf   r!   ru   r   rc   rN   rR   rT   rd   rm   rv   r   r   r%   r'   r|      s*    $

r|   c                   @   s   e Zd ZdZedd ZdS )PageChooserAdapterzwagtail.widgets.PageChooserc                 C   r   )Nr   z(wagtailadmin/js/page-chooser-telepath.jsrj   rk   r+   r   r   r'   rm   @  r   zPageChooserAdapter.mediaN)ro   rp   rq   rf   r   rm   r   r   r   r'   r   =  s    r   c                       s0   e Zd Z	d fdd	Ze fddZ  ZS )AdminPageMoveChooserNFc                    s,   | dg | _t jd|||d| d S )Npages_to_move)r   r   r   r   )r   r   r    r!   )r"   r   r   r   r#   r%   r   r'   r!   K  s   
zAdminPageMoveChooser.__init__c                    s   | j ddt jS )NF)targetPagesmatchSubclass)r   r    rc   r+   r%   r   r'   rc   V  s
   z)AdminPageMoveChooser.base_js_init_optionsr   )ro   rp   rq   r!   ru   rc   rv   r   r   r%   r'   r   J  s
    r   )&rg   djangor   django.core.exceptionsr   django.formsr   django.template.loaderr   django.urlsr   django.utils.functionalr   django.utils.safestringr   django.utils.textr	   django.utils.translationr
   rr   wagtail.admin.admin_url_finderr   wagtail.admin.staticfilesr   wagtail.coreutilsr   wagtail.modelsr   wagtail.telepathr   wagtail.widget_adaptersr   Inputr   rw   r|   r   r   r   r   r   r'   <module>   s0     1b