U
    {hB                     @   s  d 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mZ ddlmZ ddlmZ G dd dedZG dd deZG dd dZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZ G d d! d!e Z!G d"d# d#eZ"G d$d% d%eZ#G d&d' d'eZ$G d(d) d)eZ%G d*d+ d+eZ&G d,d- d-eZ'd.S )/z,Helper classes for formatting data as tables    )OrderedDict)Mapping)quote)MediaDefiningClass)get_template)reverse)cached_property)capfirst)gettextgettext_lazy)	Component)multigetattrc                   @   s   e Zd ZG dd dZG dd dZdZdZdddZ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dS )
BaseColumnc                   @   s   e Zd Zdd Zdd ZdS )zBaseColumn.Headerc                 C   s
   || _ d S N)columnselfr    r   h/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/admin/ui/tables/__init__.py__init__   s    zBaseColumn.Header.__init__c                 C   s   | j |S r   )r   render_header_htmlr   parent_contextr   r   r   render_html   s    zBaseColumn.Header.render_htmlN__name__
__module____qualname__r   r   r   r   r   r   Header   s   r   c                   @   s   e Zd Zdd Zdd ZdS )zBaseColumn.Cellc                 C   s   || _ || _d S r   )r   instance)r   r   r   r   r   r   r   !   s    zBaseColumn.Cell.__init__c                 C   s   | j | j|S r   )r   render_cell_htmlr   r   r   r   r   r   %   s    zBaseColumn.Cell.render_htmlNr   r   r   r   r   Cell   s   r!   z&wagtailadmin/tables/column_header.htmlNc	           	      C   s`   || _ |p|| _|d kr,t|dd| _n|| _|| _|| _t| | _	|| _
|| _|| _d S )N_ )nameaccessorr	   replacelabel	classnamesort_keyColumnr   headerwidthascending_title_textdescending_title_text)	r   r$   r'   r%   r(   r)   r,   r-   r.   r   r   r   r   +   s    
zBaseColumn.__init__c              
   C   sb   |d }| |t | j| jo$|j| jk| jo8|jd| j k|d| jpN|| | jp\|| dS )zq
        Compiles the context dictionary to pass to the header template when rendering the column header
        table-request)r   r/   Zis_orderableZis_ascendingZis_descendingr1   r-   r.   )boolr)   orderinggetr-   get_ascending_title_textr.   get_descending_title_text)r   r   r/   r   r   r   get_header_context_dataC   s    z"BaseColumn.get_header_context_datac                 C   s
   t | jS r   )r   header_template_namer   r   r   r   header_templateU   s    zBaseColumn.header_templatec                 C   s    | j d krtd|  t| j S )Nz*cell_template_name must be specified on %r)cell_template_nameNotImplementedErrorr   r9   r   r   r   cell_templateY   s
    
zBaseColumn.cell_templatec                 C   s   |  |}| j|S )z-
        Renders the column's header
        )r7   r:   renderr   r   contextr   r   r   r   a   s    
zBaseColumn.render_header_htmlc                 C   s   || |d |d | ddS )z
        Compiles the context dictionary to pass to the cell template when rendering a table cell for
        the given instance
        rowr/   r1   )r   r   rA   r/   r1   )r4   r   r   r   r   r   r   get_cell_context_datah   s    z BaseColumn.get_cell_context_datac                 C   s   |  ||}| j|S )zM
        Renders a table cell containing data for the given instance
        )rC   r=   r>   r   r   r   r@   r   r   r   r    u   s    zBaseColumn.render_cell_htmlc                 C   s   t | |S )z
        Return an object encapsulating this column and an item of data, which we can use for
        rendering a table cell into a template
        )r*   r!   r   r   r   r   r   get_cell|   s    zBaseColumn.get_cellc                 C   s   d | jj| jj| jS )Nz<{}.{}: {}>)format	__class__r   r   r$   r9   r   r   r   __repr__   s
    zBaseColumn.__repr__)NNNNNNN)r   r   r   r   r!   r8   r;   r   r7   r   r:   r=   r   rC   r    rF   rI   r   r   r   r   r      s,   
       


r   )	metaclassc                       s,   e Zd ZdZdZdd Z fddZ  ZS )r*   z<A column that displays a single field of data from the modelzwagtailadmin/tables/cell.htmlc                 C   s>   t | jr| |S zt|| jW S  tk
r8   Y dS X dS )z
        Given an instance (i.e. any object containing data), extract the field of data to be
        displayed in a cell of this column
        N)callabler%   r   AttributeErrorrE   r   r   r   	get_value   s    

zColumn.get_valuec                    s    t  ||}| ||d< |S )Nvalue)superrC   rM   rD   rH   r   r   rC      s    zColumn.get_cell_context_data)r   r   r   __doc__r;   rM   rC   __classcell__r   r   rP   r   r*      s   r*   c                       s,   e Zd ZdZg Z fddZdd Z  ZS )ButtonsColumnMixinz(A mixin for columns that contain buttonsc                    s&   t  ||}t| |||d< |S )Nbuttons)rO   rC   sortedget_buttonsrD   rP   r   r   rC      s    z(ButtonsColumnMixin.get_cell_context_datac                 C   s   | j S r   )rT   rB   r   r   r   rV      s    zButtonsColumnMixin.get_buttons)r   r   r   rQ   rT   rC   rV   rR   r   r   rP   r   rS      s   rS   c                       sR   e Zd ZdZdZd fdd	Z fddZd	d
 Zdd Zdd Z	dd Z
  ZS )TitleColumnzIA column where data is styled as a title and wrapped in a link or <label>z#wagtailadmin/tables/title_cell.htmlNpkc
                    sH   t  j|f|
 || _|| _|| _|| _|| _|p4i | _|| _|	| _	d S r   )
rO   r   url_name_get_url_func_get_title_id_funclabel_prefix_get_label_id_func
link_attrslink_classnameid_accessor)r   r$   rY   get_urlget_title_idr\   get_label_idr_   r^   r`   kwargsrP   r   r   r      s    
zTitleColumn.__init__c                    sv   t  ||}| |||d< | || |d d< |d< | jd k	rR| j|d d< | |||d< | |||d< |S )Nr^   hrefZlink_urlclassZtitle_idZlabel_id)rO   rC   get_link_attrsget_link_urlr_   rb   rc   rD   rP   r   r   rC      s     
z!TitleColumn.get_cell_context_datac                 C   s
   | j  S r   )r^   copyrB   r   r   r   rg      s    zTitleColumn.get_link_attrsc                 C   s:   | j r|  |S | jr6t|| j}t| jt|fdS d S )N)args)rZ   rY   r   r`   r   r   r   r   r   idr   r   r   rh      s
    
zTitleColumn.get_link_urlc                 C   s   | j r|  |S d S r   )r[   rB   r   r   r   rb      s    zTitleColumn.get_title_idc                 C   s6   | j r|  |S | jr2t|| j}| j d| S d S )Nr0   )r]   r\   r   r`   rk   r   r   r   rc      s
    
zTitleColumn.get_label_id)NNNNNNNrX   )r   r   r   rQ   r;   r   rC   rg   rh   rb   rc   rR   r   r   rP   r   rW      s            rW   c                       s&   e Zd ZdZdZd fdd	Z  ZS )StatusFlagColumnz`Represents a boolean value as a status tag (or lack thereof, if the corresponding label is None)z)wagtailadmin/tables/status_flag_cell.htmlNc                    s    t  j|f| || _|| _d S r   )rO   r   
true_labelfalse_label)r   r$   rn   ro   rd   rP   r   r   r      s    zStatusFlagColumn.__init__)NN)r   r   r   rQ   r;   r   rR   r   r   rP   r   rm      s   rm   c                       s:   e Zd ZdZdZd
 fdd	Zdd Z fdd	Z  ZS )StatusTagColumnzRepresents a status tagz(wagtailadmin/tables/status_tag_cell.htmlNc                    s   t  j|f| || _d S r   )rO   r   primary)r   r$   rq   rd   rP   r   r   r      s    zStatusTagColumn.__init__c                 C   s   t | jr| |S | jS r   )rK   rq   rE   r   r   r   get_primary  s    

zStatusTagColumn.get_primaryc                    s    t  ||}| ||d< |S )Nrq   )rO   rC   rr   rD   rP   r   r   rC     s    z%StatusTagColumn.get_cell_context_data)N)	r   r   r   rQ   r;   r   rr   rC   rR   r   r   rP   r   rp      s
   rp   c                   @   s   e Zd ZdZdZdS )BooleanColumnz@Represents a True/False/None value as a tick/cross/question iconz%wagtailadmin/tables/boolean_cell.htmlNr   r   r   rQ   r;   r   r   r   r   rs     s   rs   c                       s    e Zd ZdZ fddZ  ZS )LiveStatusTagColumnz"Represents a live/draft status tagc                    s6   t  jd	|dtd|dddd d| d S )
Nstatus_stringr'   Statusr)   livec                 S   s   | j S r   )rx   )r   r   r   r   <lambda>      z.LiveStatusTagColumn.__init__.<locals>.<lambda>)r'   r)   rq   )rv   rO   r   popr
   r   rd   rP   r   r   r     s     
zLiveStatusTagColumn.__init__r   r   r   rQ   r   rR   r   r   rP   r   ru     s   ru   c                   @   s   e Zd ZdZdZdS )
DateColumnz'Outputs a date in human-readable formatz"wagtailadmin/tables/date_cell.htmlNrt   r   r   r   r   r   !  s   r   c                       s    e Zd ZdZ fddZ  ZS )UpdatedAtColumnz@Outputs the _updated_at date annotation in human-readable formatc                    s0   t  jd|dtd|ddd| d S )N_updated_atr'   ZUpdatedr)   )r'   r)   )r   r{   r}   rP   r   r   r   *  s     
zUpdatedAtColumn.__init__r~   r   r   rP   r   r   '  s   r   c                       s2   e Zd ZdZdZd fdd	Z fddZ  ZS )	
UserColumnz*Outputs the username and avatar for a userz"wagtailadmin/tables/user_cell.html c                    s   t  j|f| || _d S r   )rO   r   blank_display_name)r   r$   r   rd   rP   r   r   r   8  s    zUserColumn.__init__c                    sd   t  ||}|d }|rVz|  }W n tk
rB   d}Y nX |pN| |d< n
| j|d< |S )NrN   r   display_name)rO   rC   Zget_full_namestriprL   Zget_usernamer   )r   r   r   r@   userZ	full_namerP   r   r   rC   <  s    

z UserColumn.get_cell_context_data)r   )r   r   r   rQ   r;   r   rC   rR   r   r   rP   r   r   3  s   r   c                       s<   e Zd ZdZdZdZ fddZdd Z fdd	Z  Z	S )
BulkActionsCheckboxColumna(  
    A checkbox column for the bulk actions feature.

    When using this column, there should be another column (e.g. a TitleColumn)
    that has an element with the id "{obj_type}_{instance.pk}_title" that contains
    the title of the object (and nothing else) for screen reader purposes.
    z7wagtailadmin/bulk_actions/select_all_checkbox_cell.htmlz4wagtailadmin/bulk_actions/listing_checkbox_cell.htmlc                   s   t  j|| || _d S r   )rO   r   obj_type)r   r   rj   rd   rP   r   r   r   W  s    z"BulkActionsCheckboxColumn.__init__c                 C   s   | j  dt|j dS )Nr"   _title)r   r   rX   rE   r   r   r   get_aria_describedby[  s    z.BulkActionsCheckboxColumn.get_aria_describedbyc                    s*   t  ||}|| j| |d |S )N)r   Zaria_describedby)rO   rC   updater   r   rD   rP   r   r   rC   ^  s    z/BulkActionsCheckboxColumn.get_cell_context_data)
r   r   r   rQ   r8   r;   r   r   rC   rR   r   r   rP   r   r   K  s   r   c                       s6   e Zd ZdZd
 fdd	Zdd Z fdd	Z  ZS )ReferencesColumnz(wagtailadmin/tables/references_cell.htmlNFc	           	         s&   t  |||||| || _|| _d S r   )rO   r   rZ   describe_on_delete)	r   r$   r'   r%   r(   r)   r,   ra   r   rP   r   r   r   l  s    zReferencesColumn.__init__c                 C   s   | j r|  |S d S r   )rZ   rE   r   r   r   get_edit_url{  s    zReferencesColumn.get_edit_urlc                    s*   t  ||}| ||d< | j|d< |S )NZedit_urlr   )rO   rC   r   r   rD   rP   r   r   rC     s    
z&ReferencesColumn.get_cell_context_data)NNNNNNF)r   r   r   r;   r   r   rC   rR   r   r   rP   r   r   i  s          r   c                       s    e Zd ZdZ fddZ  ZS )DownloadColumnz&wagtailadmin/tables/download_cell.htmlc                    s   t  ||}|j|d< |S )Ndownload_url)rO   rC   urlrD   rP   r   r   rC     s    
z$DownloadColumn.get_cell_context_data)r   r   r   r;   rC   rR   r   r   rP   r   r     s   r   c                   @   s   e Zd ZdZdZdd ZdS )RelatedObjectsColumnzROutputs a list of objects related to the object through a one-to-many relationshipz-wagtailadmin/tables/related_objects_cell.htmlc                 C   s   t || j S r   )getattrr%   allrE   r   r   r   rM     s    zRelatedObjectsColumn.get_valueN)r   r   r   rQ   r;   rM   r   r   r   r   r     s   r   c                       s   e Zd ZdZdZdZedZedZd!ddZ	d	d
 Z
 fddZe fddZe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G dd  d eZ  ZS )"Tablezwagtailadmin/tables/table.htmlZlistingr   z'Sort by '%(label)s' in ascending order.z(Sort by '%(label)s' in descending order.Nc	           	      C   sR   t dd |D | _|| _|| _|r*|| _|| _|| _|d k	rD|| _|pJi | _d S )Nc                 S   s   g | ]}|j |fqS r   )r$   .0r   r   r   r   
<listcomp>  s     z"Table.__init__.<locals>.<listcomp>)	r   columnscaptiondatatemplate_namebase_urlr3   r(   
base_attrs)	r   r   r   r   r   r3   r(   attrsr   r   r   r   r     s    zTable.__init__c                 C   s   | j S r   )r   r9   r   r   r   get_caption  s    zTable.get_captionc                    s&   t  |}| |d< |d|d< |S )Nr/   r1   )rO   get_context_datar4   r?   rP   r   r   r     s    zTable.get_context_datac                    s&   t  j}| j D ]}||j7 }q|S r   )rO   mediar   values)r   r   colrP   r   r   r     s    zTable.mediac                 c   s(   t | jD ]\}}t| ||V  q
d S r   )	enumerater   r   Row)r   indexr   r   r   r   rows  s    z
Table.rowsc                 C   s
   t | jS r   )lenr   r9   r   r   r   	row_count  s    zTable.row_countc                 C   s   | j  }| j|d< |S Nrf   )r   ri   r(   )r   r   r   r   r   r     s    

zTable.attrsc                 C   s   dS )Nr   r   rE   r   r   r   get_row_classname  s    zTable.get_row_classnamec                 C   s   i }|  |}|r||d< |S r   )r   )r   r   r   r(   r   r   r   get_row_attrs  s
    
zTable.get_row_attrsc                 C   s   t dd | j D S )Nc                 s   s   | ]}|j V  qd S r   )r,   r   r   r   r   	<genexpr>  s     z*Table.has_column_widths.<locals>.<genexpr>)anyr   r   r9   r   r   r   has_column_widths  s    zTable.has_column_widthsc                 C   s   | j r| j d|ji S d S Nr'   )ascending_title_text_formatr'   r   r   r   r   r5     s    zTable.get_ascending_title_textc                 C   s   | j r| j d|ji S d S r   )descending_title_text_formatr'   r   r   r   r   r6     s    zTable.get_descending_title_textc                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zedd Z	edd Z
dS )z	Table.Rowc                 C   s   || _ |j| _|| _|| _d S r   )r/   r   r   r   )r   r/   r   r   r   r   r   r     s    zTable.Row.__init__c                 C   s
   t | jS r   )r   r   r9   r   r   r   __len__  s    zTable.Row.__len__c                 C   s   | j | | jS r   )r   rF   r   )r   keyr   r   r   __getitem__  s    zTable.Row.__getitem__c                 c   s   | j E d H  d S r   )r   r9   r   r   r   __iter__  s    zTable.Row.__iter__c                    s   t  fdd j D S )Nc                    s   g | ]}|  jqS r   )rF   r   )r   r   r9   r   r   r      s     z&Table.Row.__repr__.<locals>.<listcomp>)reprr   r   r9   r   r9   r   rI     s    zTable.Row.__repr__c                 C   s   | j | jS r   )r/   r   r   r9   r   r   r   r(     s    zTable.Row.classnamec                 C   s   | j | jS r   )r/   r   r   r9   r   r   r   r     s    zTable.Row.attrsN)r   r   r   r   r   r   r   rI   r   r(   r   r   r   r   r   r     s   
r   )NNNNNN)r   r   r   r   r(   Zheader_row_classnamer   r   r   r   r   r   propertyr   r   r   r   r   r   r   r5   r6   r   r   rR   r   r   rP   r   r     s@         



r   N)(rQ   collectionsr   collections.abcr   Zdjango.contrib.admin.utilsr   Zdjango.formsr   Zdjango.template.loaderr   Zdjango.urlsr   Zdjango.utils.functionalr   Zdjango.utils.textr	   Zdjango.utils.translationr
   r   Zwagtail.admin.ui.componentsr   Zwagtail.coreutilsr   r   r*   rS   rW   rm   rp   rs   ru   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s6   y>		