U
    d]                     @   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 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Z1e-e.e0eefZ2G dd dej3Z4G dd dZ5dS )    )datetime	timedelta)forms)settings)messages)FieldListFilter)DisallowedModelAdminLookupDisallowedModelAdminToField)IS_POPUP_VARTO_FIELD_VARIncorrectLookupParameters)get_fields_from_pathlookup_spawns_duplicatesprepare_lookup_valuequote)FieldDoesNotExistImproperlyConfiguredSuspiciousOperation)InvalidPage)ExistsFFieldManyToOneRelOrderByOuterRef)
Combinable)reverse)	urlencode)
make_aware)gettextallo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-7vj2equ7/django/contrib/admin/views/main.pyr)   .   s     zChangeListSearchForm.__init__)__name__
__module____qualname__r)   __classcell__r1   r1   r/   r2   r%   -   s   r%   c                   @   s   e Zd ZeZdd 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 pd| _!zt"|jt#d| _$W n t%k
r   d| _$Y nX t&|jk| _'t(|jk| _)|jt*}|rB|+||sBt,d| || _-t.|j/ | _0t#| j0krl| j0t#= t1| j0kr| j0t1= | j)rd| _2n|| _2| || _3| 4| | j)rt5d}n | j6|rt5d}nt5d}|| jj7 | _8| jj9j:| _;d S )	Nz,     z"The field %s cannot be referenced.r1   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_help_text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,   requestr:   r?   r@   rA   rE   rF   rG   rH   rI   r`   rJ   rK   rL   Z_search_formrQ   r[   rc   r1   r1   r2   r)   9   sj    


zChangeList.__init__c                 C   s   d| j j| jj| jj jf S )Nz<%s: model=%s model_admin=%s>)r0   r5   r:   rJ   r,   r1   r1   r2   __repr__   s
    zChangeList.__repr__Nc                 C   s.   |p| j }| }tD ]}||kr||= q|S )z:
        Return all params except IGNORED_PARAMS.
        )r^   copyIGNORED_PARAMS)r,   r^   lookup_paramsZignoredr1   r1   r2   get_filters_params   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|t| j|O }|
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 zF| D ](\}}t!||||< |t| j|O }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__dayr9   )days    )day)yearz%s__gtez%s__lt)$rm   r]   rJ   Zlookup_allowedr   rA   lencallabler:   
isinstancetuplelistr   creater   r   r   r<   Z
has_outputappendrE   popr   rU   rX   r   r   replacers   r   ZUSE_TZr   updater   boolr   )r,   rg   rl   Zmay_have_duplicatesrC   keyvaluefilter_specsrA   Zlookup_params_countspecro   fieldZfield_list_filter_classrs   monthrr   Z	from_dater$   Zto_dater1   r1   r2   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)r^   rj   rx   
startswithr]   r   sorted)r,   
new_paramsremover"   rkvr1   r1   r2   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,z|
| jj}W n tk
r   tY nX || _| j j| _| j pt|| _|| _|| _|| _|| _|| _d S N)rJ   Zget_paginatorra   rH   countZshow_full_result_countr>   rI   rZ   Z_clonepagerW   Zobject_listr   r   result_countr~   Zshow_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)r,   rg   r   r   r   r   r   r   r1   r1   r2   rb     s6      




zChangeList.get_resultsc                 C   s*   g }| j jr| j j}n| jjr&| jj}|S r   )rJ   orderingr<   )r,   r   r1   r1   r2   _get_default_ordering7  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)r<   	get_fieldnamer   ru   hasattrrJ   getattrr:   rv   propertyr   )r,   
field_namer   attrr1   r1   r2   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_expressionr9   N)r^   rx   rJ   get_orderingr   	ORDER_VARsplit
rpartitionr?   rU   r   rv   r   rj   Zreverse_orderingrz   r   descascr   
IndexErrorrX   extendrT   order_by_get_deterministic_ordering)r,   rg   ra   r^   r   Zorder_paramsr"   nonepfxidxr   Zorder_fieldr1   r1   r2   r   W  s<    	



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rq*|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.
        rd   c                 S   s   h | ]}|j r|js|jqS r1   )uniquenullre   .0r   r1   r1   r2   	<setcomp>  s    z9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nr   c                 s   s   | ]}|j V  qd S r   )r+   )r   
constraintr1   r1   r2   	<genexpr>  s   z9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                    s   g | ]} j |qS r1   )r<   r   )r   r   rh   r1   r2   
<listcomp>  s    z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c                 s   s   | ]}|j V  qd S r   )r   r   r1   r1   r2   r     s     c                 s   s   | ]}|j V  qd S r   )re   r   r1   r1   r2   r     s     z-pk)rx   setr<   r+   rv   strlstripr   r   r   
expressionr   r   remote_fieldre   addZunique_togetherZtotal_unique_constraintsany
issupersetrz   )
r,   r   ordering_fieldsZtotal_ordering_fieldspartr   r   Zconstraint_field_namesfield_namesr+   r1   rh   r2   r     sL    






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
}qqn |dr|dd }d}nd}t| jD ]"\}}| ||kr|||<  qqqnd| jt dD ]R}|d\}}	}
zt|
}
W n tk
r   Y qY 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   r9   Nr   )r   r   r^   rv   r   r   r   r   r   Z
descendingr   r   	enumerater?   r   r   r   rU   rX   )r,   r   r   r   Z
order_typeindexr   r"   r   r   r   r1   r1   r2   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\}}| j||  d| _||B r|jtdd}| jt|}| ||}	|j|	 }|jjs| |}|S )N)r   r   rd   )rd   )r   r   rB   rC   r>   ra   filterr   r   	Exceptionr   rJ   Zget_search_resultsrT   r   rm   rD   r   r   r   r   select_relatedapply_select_related)
r,   rg   Zremaining_lookup_paramsZfilters_may_have_duplicatesqsZfilter_specZnew_qsr$   Zsearch_may_have_duplicatesr   r1   r1   r2   r=     sF    



zChangeList.get_querysetc                 C   sB   | j dkr| S | j dkr,|  r,| S | j r>|j| j  S |S NTF)rG   r   !has_related_field_in_list_display)r,   r   r1   r1   r2   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?   r<   r   r   rv   r   r   Zget_attname)r,   r   r   r1   r1   r2   r   6  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   rf   r   r;   Z	app_labelZ
model_namer   rJ   Z
admin_siter   )r,   resultrd   r1   r1   r2   url_for_resultC  s    zChangeList.url_for_result)N)NN)r3   r4   r5   r%   rM   r)   ri   rm   r   r   rb   r   r   r   r   r   r=   r   r   r   r1   r1   r1   r2   r7   6   s    L
g
%/A(;r7   N)6r   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   rY   r   rV   r*   r_   rk   ZFormr%   r7   r1   r1   r1   r2   <module>   s.    	