U
    8ÄT_„Y  ã                   @   s<  d dl 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mZ d dlmZmZmZ d dlmZmZmZmZ d d	lmZmZmZ d d
lmZ d dlmZ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Z+dZ,dZ-dZ.dZ/dZ0e+e,e-e/eefZ1G dd„ dej2ƒZ3G dd„ dƒZ4dS )é    )ÚdatetimeÚ	timedelta)Úforms)Úsettings)Úmessages)ÚFieldListFilter)ÚDisallowedModelAdminLookupÚDisallowedModelAdminToField)ÚIS_POPUP_VARÚTO_FIELD_VARÚIncorrectLookupParameters)Úget_fields_from_pathÚlookup_needs_distinctÚprepare_lookup_valueÚquote)ÚFieldDoesNotExistÚImproperlyConfiguredÚSuspiciousOperation)ÚInvalidPage)ÚFÚFieldÚManyToOneRelÚOrderBy)Ú
Combinable)Úreverse)Ú	urlencode)Ú
make_aware)ÚgettextÚallÚoZotÚpÚqÚec                       s   e Zd Z‡ fdd„Z‡  ZS )ÚChangeListSearchFormc                    s&   t ƒ j||Ž ttjddd�i| _d S )NF)ÚrequiredÚstrip)ÚsuperÚ__init__Ú
SEARCH_VARr   Z	CharFieldÚfields)ÚselfÚargsÚkwargs©Ú	__class__© úC/tmp/pip-unpacked-wheel-dv63caxw/django/contrib/admin/views/main.pyr'   (   s     ÿzChangeListSearchForm.__init__)Ú__name__Ú
__module__Ú__qualname__r'   Ú__classcell__r/   r/   r-   r0   r#   '   s   r#   c                   @   s„   e Zd ZeZdd„ Zddd„Zdd„ Zd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„ Zdd„ ZdS ) Ú
ChangeListc                 C   sö  || _ |j| _| j| _| |¡| _|| _|| _|| _d | _	d | _
d | _|| _|| _|| _|	| _|
| _|| _| |¡| _|| _|  |j¡}| ¡ s²|j ¡ D ]}t |d |¡¡ qš|j t¡pÀd| _ zt!|j t"d¡ƒ| _#W n t$k
rö   d| _#Y nX t%|jk| _&t'|jk| _(|j t)¡}|�r<| *||¡�s<t+d| ƒ‚|| _,t-|j .¡ ƒ| _/t"| j/k�rf| j/t"= t0| j/k�rz| j/t0= | j(�rŠd| _1n|| _1|  |¡| _2|  3|¡ | j(�r¸t4dƒ}n | j 5|¡�rÐt4dƒ}nt4dƒ}|| jj6 | _7| jj8j9| _:d S )	Nz, Ú r   z"The field %s cannot be referenced.r/   z	Select %szSelect %s to changezSelect %s to view);ÚmodelZ_metaÚoptsÚlookup_optsÚget_querysetÚroot_querysetÚlist_displayÚlist_display_linksÚlist_filterÚhas_filtersÚhas_active_filtersÚclear_all_filters_qsÚdate_hierarchyÚsearch_fieldsÚlist_select_relatedÚlist_per_pageÚlist_max_show_allÚmodel_adminZget_preserved_filtersZpreserved_filtersÚsortable_byÚsearch_form_classÚGETZis_validÚerrorsÚvaluesr   ÚerrorÚjoinZcleaned_dataÚgetr(   ÚqueryÚintÚPAGE_VARÚpage_numÚ
ValueErrorÚALL_VARÚshow_allr
   Zis_popupr   Zto_field_allowedr	   Úto_fieldÚdictÚitemsÚparamsÚ
ERROR_FLAGÚlist_editableÚquerysetÚget_resultsr   Zhas_change_permissionZverbose_nameÚtitleÚpkÚattnameÚ
pk_attname)r*   Úrequestr7   r<   r=   r>   rB   rC   rD   rE   rF   r\   rG   rH   Z_search_formrM   rW   r_   r/   r/   r0   r'   3   sd    


zChangeList.__init__Nc                 C   s.   |p| j }| ¡ }tD ]}||kr||= q|S )z:
        Return all params except IGNORED_PARAMS.
        )rZ   ÚcopyÚIGNORED_PARAMS)r*   rZ   Úlookup_paramsZignoredr/   r/   r0   Úget_filters_paramsn   s    
zChangeList.get_filters_paramsc              
   C   s¸  |   ¡ }d}d}| ¡ D ]"\}}| j ||¡std| ƒ‚qg }| jD ]È}t|ƒ}	t|ƒrn|||| j| jƒ}
nzd }t	|t
tfƒrŠ|\}}n|tj }}t	|tƒs´|}t| j|ƒd }||||| j| j|d�}
|	t|ƒkrè|pæt| j|ƒ}|
rF|
 ¡ rF| |
¡ |	t|ƒkrFd}qF| j�r<| d| j d ¡}|d k	�r<| d| j d ¡}| d| j d ¡}z8tt|ƒt|d k	�rr|nd	ƒt|d k	�r†|nd	ƒƒ}W n. tk
�r¾ } zt|ƒ|‚W 5 d }~X Y nX |�rÖ|td	d
� }n0|�rô|tdd
� jd	d�}n|j|jd	 d�}tj�rt|ƒ}t|ƒ}|  d| j |d| j |i¡ zH| ¡ D ]*\}}t!||ƒ||< |�plt| j|ƒ}�qF|t"|ƒ|||fW S  t#k
�r² } zt|ƒ|‚W 5 d }~X Y nX d S )NFzFiltering by %s not allowedéÿÿÿÿ)Ú
field_pathTz%s__yearz	%s__monthz%s__dayé   )Údaysé    )Úday)Úyearz%s__gtez%s__lt)$rg   rY   rG   Zlookup_allowedr   r>   ÚlenÚcallabler7   Ú
isinstanceÚtupleÚlistr   Úcreater   r   r   r9   Z
has_outputÚappendrB   Úpopr   rQ   rT   r   r   Úreplacern   r   ZUSE_TZr   Úupdater   Úboolr   )r*   rc   rf   Zuse_distinctr@   ÚkeyÚvalueÚfilter_specsr>   Zlookup_params_countÚspecri   ÚfieldZfield_list_filter_classrn   Úmonthrm   Z	from_dater"   Zto_dater/   r/   r0   Úget_filters{   sŽ    


    þ

ý  þ   þzChangeList.get_filtersc                 C   s�   |d kri }|d krg }| j  ¡ }|D ]"}t|ƒD ]}| |¡r2||= q2q&| ¡ D ](\}}|d krr||krz||= qR|||< qRdtt| ¡ ƒƒ S )Nz?%s)rZ   rd   rs   Ú
startswithrY   r   Úsorted)r*   Ú
new_paramsÚremover    ÚrÚkÚvr/   r/   r0   Úget_query_stringÖ   s    



zChangeList.get_query_stringc                 C   sÔ   | j  || j| j¡}|j}| j jr.| j ¡ }nd }|| jk}|| jk}| jrP|sT|s`| j 	¡ }n0z| 
| jd ¡j}W n tk
rŽ   t‚Y nX || _| j j| _| j p®t|ƒ| _|| _|| _|| _|| _|| _d S )Nrj   )rG   Zget_paginatorr]   rE   ÚcountZshow_full_result_countr;   rF   rV   Z_cloneÚpagerS   Zobject_listr   r   Úresult_country   Zshow_admin_actionsÚfull_result_countÚresult_listÚcan_show_allÚ
multi_pageÚ	paginator)r*   rc   r�   r‹   rŒ   rŽ   r�   r�   r/   r/   r0   r^   è   s*    



zChangeList.get_resultsc                 C   s*   g }| j jr| j j}n| jjr&| jj}|S ©N)rG   Úorderingr9   )r*   r’   r/   r/   r0   Ú_get_default_ordering	  s    
z ChangeList._get_default_orderingc                 C   sˆ   z| j  |¡}|jW S  tk
r‚   t|ƒr2|}n&t| j|ƒrLt| j|ƒ}nt| j|ƒ}t	|t
ƒrrt|dƒrr|j}t|ddƒ Y S X dS )ai  
        Return the proper model field name corresponding to the given
        field_name to use for ordering. field_name may either be the name of a
        proper model field or the name of a method (on the admin or model) or a
        callable with the 'admin_order_field' attribute. Return None if no
        proper model field name can be matched.
        ÚfgetZadmin_order_fieldN)r9   Ú	get_fieldÚnamer   rp   ÚhasattrrG   Úgetattrr7   rq   Úpropertyr”   )r*   Ú
field_namer~   Úattrr/   r/   r0   Úget_ordering_field  s    zChangeList.get_ordering_fieldc              
   C   s<  | j }t| j |¡p|  ¡ ƒ}t|k�r$g }|t  d¡}|D ]ä}zÀ| d¡\}}}	| jt	|	ƒ }
|  
|
¡}|stW q>t|tƒr¢|dkr–| ¡ }| ¡  | |¡ n^t|dƒrÌ| |dkrÀ| ¡ n| ¡ ¡ n4| d¡rò|dkrò| |dd… ¡ n| || ¡ W q> ttfk
�r    Y q>Y q>X q>| |jj¡ |  |¡S )a–  
        Return the list of ordering fields for the change list.
        First check the get_ordering() method in model admin, then check
        the object's default ordering. Then, any manually-specified ordering
        from the query string overrides anything. Finally, a deterministic
        order is guaranteed by calling _get_deterministic_ordering() with the
        constructed ordering.
        Ú.ú-Zresolve_expressionrj   N)rZ   rs   rG   Úget_orderingr“   Ú	ORDER_VARÚsplitÚ
rpartitionr<   rQ   rœ   rq   r   rd   Zreverse_orderingru   r—   ÚdescÚascr�   Ú
IndexErrorrT   ÚextendrP   Úorder_byÚ_get_deterministic_ordering)r*   rc   r]   rZ   r’   Zorder_paramsr    ÚnoneÚpfxÚidxrš   Zorder_fieldr/   r/   r0   rŸ   )  s4    	



 zChangeList.get_orderingc           
   	      sJ  t |ƒ}tƒ }dhdd„ ˆ jjD ƒB }|D ]ª}d}t|tƒrH| d¡}n0t|tƒrZ|j}nt|t	ƒrxt|j
tƒrx|j
j}|r*zˆ j |¡}W n tk
r¤   Y q*Y nX |jr¸||jkr¸q*|j|krÈ �qF| |j¡ q*ˆ jjdd„ ˆ jjD ƒ˜}|D ]F}‡ fdd	„|D ƒ}	td
d„ |	D ƒƒ�r qô| dd„ |	D ƒ¡rô �qFqô| d¡ |S )a  
        Ensure a deterministic order across all database backends. Search for a
        single field or unique together set of fields providing a total
        ordering. If these are missing, augment the ordering with a descendant
        primary key.
        r`   c                 S   s   h | ]}|j r|js|j’qS r/   )ÚuniqueÚnullra   ©Ú.0r~   r/   r/   r0   Ú	<setcomp>]  s    ÿz9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nrž   c                 s   s   | ]}|j V  qd S r‘   )r)   )r¯   Ú
constraintr/   r/   r0   Ú	<genexpr>~  s   ÿz9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                    s   g | ]}ˆ j  |¡‘qS r/   )r9   r•   )r¯   rš   ©r*   r/   r0   Ú
<listcomp>…  s     z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c                 s   s   | ]}|j V  qd S r‘   )r­   r®   r/   r/   r0   r²   ˆ  s     c                 s   s   | ]}|j V  qd S r‘   )ra   r®   r/   r/   r0   r²   Š  s     z-pk)rs   Úsetr9   r)   rq   ÚstrÚlstripr   r–   r   Ú
expressionr•   r   Úremote_fieldra   ÚaddZunique_togetherZtotal_unique_constraintsÚanyÚ
issupersetru   )
r*   r’   Úordering_fieldsZtotal_ordering_fieldsÚpartrš   r~   Zconstraint_field_namesÚfield_namesr)   r/   r³   r0   r¨   T  sH    
ÿ



þþ
z&ChangeList._get_deterministic_orderingc              	   C   s   |   ¡ }i }t| jkr¸|D ]š}t|ttfƒrft|tƒs>| ¡ }t|jtƒr|j	rTdnd}|jj
}q†qn | d¡r‚|dd… }d}nd}t| jƒD ]"\}}|  |¡|kr�|||<  qq�qnd| jt  d¡D ]R}| d¡\}}	}
zt|
ƒ}
W n tk
�r   Y qÈY nX |	dk�rdnd||
< qÈ|S )zT
        Return a dictionary of ordering field column numbers and asc/desc.
        r£   r¤   rž   rj   Nr�   )r“   r    rZ   rq   r   r   r¤   r¸   r   Z
descendingr–   r�   Ú	enumerater<   rœ   r¡   r¢   rQ   rT   )r*   r’   r½   r~   Z
order_typeÚindexr›   r    r©   rª   r«   r/   r/   r0   Úget_ordering_field_columns’  s6    





z%ChangeList.get_ordering_field_columnsc           
   
   C   s  |   |¡\| _| _}}| _| j}| jD ]}| ||¡}|d k	r&|}q&z|jf |Ž}W nB ttfk
rn   ‚ Y n* t	k
r– } zt
|ƒ‚W 5 d }~X Y nX |jjsª|  |¡}|  ||¡}|j|Ž }| j ||| j¡\}}	| j||  ¡ d�| _||	B rú| ¡ S |S d S )N)rƒ   r„   )r€   r|   r?   r@   r;   r]   Úfilterr   r   Ú	Exceptionr   rP   Úselect_relatedÚapply_select_relatedrŸ   r§   rG   Zget_search_resultsrˆ   rg   rA   Zdistinct)
r*   rc   Zremaining_lookup_paramsZfilters_use_distinctÚqsZfilter_specZnew_qsr"   r’   Zsearch_use_distinctr/   r/   r0   r:   º  s<    ú


þzChangeList.get_querysetc                 C   sB   | j dkr| ¡ S | j dkr,|  ¡ r,| ¡ S | j r>|j| j Ž S |S ©NTF)rD   rÅ   Ú!has_related_field_in_list_display)r*   rÇ   r/   r/   r0   rÆ   ð  s    

zChangeList.apply_select_relatedc              	   C   sT   | j D ]H}z| j |¡}W n tk
r.   Y qX t|jtƒr|| ¡ kr dS qdS rÈ   )r<   r9   r•   r   rq   r¹   r   Zget_attname)r*   rš   r~   r/   r/   r0   rÉ   ü  s    
z,ChangeList.has_related_field_in_list_displayc                 C   s6   t || jƒ}td| jj| jjf t|ƒf| jjj	d�S )Nzadmin:%s_%s_change)r+   Zcurrent_app)
r˜   rb   r   r8   Z	app_labelZ
model_namer   rG   Z
admin_siter–   )r*   Úresultr`   r/   r/   r0   Úurl_for_result	  s    
ÿýzChangeList.url_for_result)N)NN)r1   r2   r3   r#   rI   r'   rg   r€   rˆ   r^   r“   rœ   rŸ   r¨   rÂ   r:   rÆ   rÉ   rË   r/   r/   r/   r0   r5   0   s   ;
[
!+>(6r5   N)5r   r   Zdjangor   Zdjango.confr   Zdjango.contribr   Zdjango.contrib.adminr   Zdjango.contrib.admin.exceptionsr   r	   Zdjango.contrib.admin.optionsr
   r   r   Zdjango.contrib.admin.utilsr   r   r   r   Zdjango.core.exceptionsr   r   r   Zdjango.core.paginatorr   Zdjango.db.modelsr   r   r   r   Zdjango.db.models.expressionsr   Zdjango.urlsr   Zdjango.utils.httpr   Zdjango.utils.timezoner   Zdjango.utils.translationr   rU   r    ZORDER_TYPE_VARrR   r(   r[   re   ZFormr#   r5   r/   r/   r/   r0   Ú<module>   s<        ÿ	