B
    CVvgöY  ã               @   sD  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 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Z0dZ1dZ2e-e.e/e1eefZ3G dd„ dej4ƒZ5G dd„ dƒZ6d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)ÚExistsÚFÚFieldÚManyToOneRelÚOrderByÚOuterRef)Ú
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-install-o3oxmrkh/Django/django/contrib/admin/views/main.pyr)   (   s    zChangeListSearchForm.__init__)Ú__name__Ú
__module__Ú__qualname__r)   Ú__classcell__r0   r0   )r/   r1   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¶x$|j ¡ D ]}t |d |¡¡ qœW |j t¡pÄd| _ y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�rj| j/t"= t0| j/k�r~| 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, Ú é   z"The field %s cannot be referenced.r0   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,   Úrequestr9   r>   r?   r@   rD   rE   rF   rG   rH   r^   rI   rJ   Z_search_formrO   rY   ra   r0   r0   r1   r)   3   sd    


zChangeList.__init__Nc             C   s2   |p| j }| ¡ }xtD ]}||kr||= qW |S )z:
        Return all params except IGNORED_PARAMS.
        )r\   ÚcopyÚIGNORED_PARAMS)r,   r\   Úlookup_paramsZignoredr0   r0   r1   Úget_filters_paramsn   s    


zChangeList.get_filters_paramsc          
   C   sÀ  |   ¡ }d}d}x.| ¡ D ]"\}}| j ||¡std| ƒ‚qW g }xÒ| jD ]È}t|ƒ}	t|ƒrt|||| j| jƒ}
nzd }t	|t
tfƒr�|\}}n|tj }}t	|tƒsº|}t| j|ƒd }||||| j| j|d�}
|	t|ƒkrî|t| j|ƒO }|
rL|
 ¡ rL| |
¡ |	t|ƒkrLd}qLW | j�rD| d| j d ¡}|d k	�rD| d| j d ¡}| d| j d ¡}y8tt|ƒt|d k	�rz|nd	ƒt|d k	�rŽ|nd	ƒƒ}W n. tk
�rÆ } zt|ƒ|‚W d 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¡ yHx4| ¡ D ](\}}t!||ƒ||< |t| j|ƒO }�qPW |t"|ƒ|||fS  t#k
�rº } zt|ƒ|‚W d d }~X Y nX d S )NFzFiltering by %s not allowedéÿÿÿÿ)Ú
field_pathTz%s__yearz	%s__monthz%s__dayr8   )Údaysé    )Úday)Úyearz%s__gtez%s__lt)$ri   r[   rI   Zlookup_allowedr   r@   ÚlenÚcallabler9   Ú
isinstanceÚtupleÚlistr   Úcreater   r   r   r;   Z
has_outputÚappendrD   Úpopr   rS   rV   r   r   Úreplacero   r   ZUSE_TZr   Úupdater   Úboolr   )r,   re   rh   Zmay_have_duplicatesrB   ÚkeyÚvalueÚfilter_specsr@   Zlookup_params_countÚspecrk   ÚfieldZfield_list_filter_classro   Úmonthrn   Z	from_dater$   Zto_dater0   r0   r1   Úget_filters{   st    




	zChangeList.get_filtersc             C   sœ   |d kri }|d krg }| j  ¡ }x.|D ]&}x t|ƒD ]}| |¡r6||= q6W q(W x4| ¡ D ](\}}|d kr|||kr„||= q\|||< q\W dtt| ¡ ƒƒ S )Nz?%s)r\   rf   rt   Ú
startswithr[   r   Úsorted)r,   Ú
new_paramsÚremover"   ÚrÚkÚvr0   r0   r1   Ú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 	¡ }n,y| 
| j¡j}W n tk
rŠ   t‚Y nX || _| j j| _| j pªt|ƒ| _|| _|| _|| _|| _|| _d S )N)rI   Zget_paginatorr_   rG   ÚcountZshow_full_result_countr=   rH   rX   Z_cloneÚpagerU   Zobject_listr   r   Úresult_countrz   Zshow_admin_actionsÚfull_result_countÚresult_listÚcan_show_allÚ
multi_pageÚ	paginator)r,   re   r‘   rŒ   r�   r�   r�   rŽ   r0   r0   r1   r`   è   s*    



zChangeList.get_resultsc             C   s*   g }| j jr| j j}n| jjr&| jj}|S )N)rI   Úorderingr;   )r,   r’   r0   r0   r1   Ú_get_default_ordering	  s    
z ChangeList._get_default_orderingc             C   s‚   y| j  |¡}|jS  tk
r|   t|ƒr0|}n&t| j|ƒrJt| j|ƒ}nt| j|ƒ}t	|t
ƒrpt|dƒrp|j}t|ddƒ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)r;   Ú	get_fieldÚnamer   rq   ÚhasattrrI   Úgetattrr9   rr   Úpropertyr”   )r,   Ú
field_namer   Úattrr0   r0   r1   Úget_ordering_field  s    zChangeList.get_ordering_fieldc          
   C   s<  | j }t| j |¡p|  ¡ ƒ}t|k�r$g }|t  d¡}xè|D ]à}y¾| d¡\}}}	| jt	|	ƒ }
|  
|
¡}|stw@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   w@Y q@X q@W | |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_expressionr8   N)r\   rt   rI   Úget_orderingr“   Ú	ORDER_VARÚsplitÚ
rpartitionr>   rS   rœ   rr   r   rf   Zreverse_orderingrv   r—   ÚdescÚascr‚   Ú
IndexErrorrV   ÚextendrR   Úorder_byÚ_get_deterministic_ordering)r,   re   r_   r\   r’   Zorder_paramsr"   ÚnoneÚpfxÚidxrš   Zorder_fieldr0   r0   r1   rŸ   )  s4    	




 zChangeList.get_orderingc       
   	      sJ  t |ƒ}tƒ }dhdd„ ˆ jjD ƒB }�x|D ]¤}d}t|tƒrL| d¡}n0t|tƒr^|j}nt|t	ƒr|t|j
tƒr||j
j}|r.yˆ j |¡}W n tk
r¦   w.Y nX |jrº||jkrºq.|j|krÆP | |j¡ q.W ˆ jjdd„ ˆ jjD ƒ˜}xT|D ]B}‡ fdd	„|D ƒ}	td
d„ |	D ƒƒ�r"qö| dd„ |	D ƒ¡röP qöW | 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.
        rb   c             S   s   h | ]}|j r|js|j’qS r0   )ÚuniqueÚnullrc   )Ú.0r   r0   r0   r1   ú	<setcomp>]  s   z9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nrž   c             s   s   | ]}|j V  qd S )N)r+   )r®   Ú
constraintr0   r0   r1   ú	<genexpr>  s   z9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                s   g | ]}ˆ j  |¡‘qS r0   )r;   r•   )r®   rš   )r,   r0   r1   ú
<listcomp>…  s    z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c             s   s   | ]}|j V  qd S )N)r­   )r®   r   r0   r0   r1   r±   ˆ  s    c             s   s   | ]}|j V  qd S )N)rc   )r®   r   r0   r0   r1   r±   Š  s    z-pk)rt   Úsetr;   r+   rr   ÚstrÚlstripr   r–   r   Ú
expressionr•   r   Úremote_fieldrc   ÚaddZunique_togetherZtotal_unique_constraintsÚanyÚ
issupersetrv   )
r,   r’   Úordering_fieldsZtotal_ordering_fieldsÚpartrš   r   Zconstraint_field_namesÚfield_namesr+   r0   )r,   r1   r¨   T  sB    





z&ChangeList._get_deterministic_orderingc          	   C   s(  |   ¡ }i }t| jkr¾x¤|D ]œ}t|ttfƒrht|tƒs@| ¡ }t|jtƒr|j	rVdnd}|jj
}qˆqn | d¡r„|dd… }d}nd}x.t| jƒD ] \}}|  |¡|kr”|||< P q”W qW nfxd| jt  d¡D ]P}| d¡\}}	}
yt|
ƒ}
W n tk
�r   wÐY nX |	dk�rdnd||
< qÐW |S )zT
        Return a dictionary of ordering field column numbers and asc/desc.
        r£   r¤   rž   r8   Nr�   )r“   r    r\   rr   r   r   r¤   r¶   r   Z
descendingr–   r‚   Ú	enumerater>   rœ   r¡   r¢   rS   rV   )r,   r’   r»   r   Z
order_typeÚindexr›   r"   r©   rª   r«   r0   r0   r1   Úget_ordering_field_columns’  s6    




z%ChangeList.get_ordering_field_columnsc       
   
   C   s  |   |¡\| _| _}}| _| j}x&| jD ]}| ||¡}|d k	r(|}q(W y|jf |Ž}W nB ttfk
rr   ‚ Y n* t	k
rš } zt
|ƒ‚W d d }~X Y nX | j ||| j¡\}}| j||  ¡ d�| _||B rî|jtdƒd�}| j t|ƒ¡}|  ||¡}	|j|	Ž }|jj�s|  |¡}|S )N)r„   r…   rb   )rb   )r�   r}   rA   rB   r=   r_   Úfilterr   r   Ú	Exceptionr   rI   Zget_search_resultsrR   r‰   ri   rC   r   r   rŸ   r§   Úselect_relatedÚapply_select_related)
r,   re   Zremaining_lookup_paramsZfilters_may_have_duplicatesÚqsZfilter_specZnew_qsr$   Zsearch_may_have_duplicatesr’   r0   r0   r1   r<   º  s2    


zChangeList.get_querysetc             C   sB   | j dkr| ¡ S | j dkr,|  ¡ r,| ¡ S | j r>|j| j Ž S |S )NTF)rF   rÃ   Ú!has_related_field_in_list_display)r,   rÅ   r0   r0   r1   rÄ   ó  s    

zChangeList.apply_select_relatedc          	   C   sV   xP| j D ]F}y| j |¡}W n tk
r0   Y qX t|jtƒr|| ¡ krdS qW dS )NTF)r>   r;   r•   r   rr   r·   r   Zget_attname)r,   rš   r   r0   r0   r1   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˜   rd   r   r:   Z	app_labelZ
model_namer   rI   Z
admin_siter–   )r,   Úresultrb   r0   r0   r1   Úurl_for_result  s
    

zChangeList.url_for_result)N)NN)r2   r3   r4   r%   rK   r)   ri   r�   r‰   r`   r“   rœ   rŸ   r¨   rÀ   r<   rÄ   rÆ   rÈ   r0   r0   r0   r1   r6   0   s   ;
[
!+>(9r6   N)7r   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   r   r   Zdjango.db.models.expressionsr   Zdjango.urlsr   Zdjango.utils.httpr   Zdjango.utils.timezoner   Zdjango.utils.translationr   rW   r    ZORDER_TYPE_VARrT   r*   r]   rg   ZFormr%   r6   r0   r0   r0   r1   Ú<module>   s0    	