3
[FI                 @   s  d dl mZ d dlmZ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 d dl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Z(dZ)dZ*dZ+dZ,dZ-e(e)e*e,eefZ.G dd dZ/dS )    )OrderedDict)datetime	timedelta)settings)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)models)
CombinableFOrderBy)reverse)	urlencode)
make_aware)gettextalloZotpqec               @   sx   e Z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S )
ChangeListc             C   s  || _ |j| _| j| _|j|| _|| _|| _|| _|| _	|| _
|| _|	| _|
| _|| _|j|| _|| _yt|jjtd| _W n tk
r   d| _Y nX t|jk| _t|jk| _|jjt}|r|j|| rtd| || _t |jj! | _"t| j"kr
| j"t= t#| j"kr| j"t#= | jr.f | _$n|| _$|jjt%d| _&| j|| _'| j(| | jrlt)d}n | jj*|rt)d}nt)d}|| jj+ | _,| jj-j.| _/d S )Nr   z"The field %s cannot be referenced. z	Select %szSelect %s to changezSelect %s to view)0modelZ_metaoptslookup_optsget_querysetroot_querysetlist_displaylist_display_linkslist_filterdate_hierarchysearch_fieldslist_select_relatedlist_per_pagelist_max_show_allmodel_adminZget_preserved_filtersZpreserved_filterssortable_byintGETget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
SEARCH_VARqueryquerysetget_resultsr   Zhas_change_permissionZverbose_nametitlepkZattname
pk_attname)selfrequestr#   r(   r)   r*   r+   r,   r-   r.   r/   r?   r0   r1   r:   rD    rI   C/tmp/pip-install-j7i95hgp/django/django/contrib/admin/views/main.py__init__'   sV    


zChangeList.__init__Nc             C   s2   |p| j }|j }xtD ]}||kr||= qW |S )z:
        Return all params except IGNORED_PARAMS.
        )r=   copyIGNORED_PARAMS)rG   r=   lookup_paramsZignoredrI   rI   rJ   get_filters_params[   s    


zChangeList.get_filters_paramsc             C   s  | j  }d}x.|j D ]"\}}| jj||std| qW g }x| jD ]}t|rh|||| j| j}nd }	t|t	t
fr|\}
}n|tj }
}t|
tjs|
}	t| j|	d }
t|}||
||| j| j|	d}|t|kr|pt| j|	}|o|j rH|j| qHW | jr*|jd| j d }|d k	r*|jd| j d }|jd| j d }y8tt|t|d k	rh|ndt|d k	r||nd}W n. tk
r } zt||W Y d d }~X nX tjrt|}|r|tdd }n0|r|td	d jdd
}n|j|j d d}|j!d| j |d| j |i yHx6|j D ]*\}}t"||||< |p\t| j|}q6W |t#|||fS  t$k
r } zt||W Y d d }~X nX d S )NFzFiltering by %s not allowed   )
field_pathz%s__yearz	%s__monthz%s__day)days    )day)yearz%s__gtez%s__lt)%rO   r<   r0   Zlookup_allowedr   r*   callabler#   
isinstancetuplelistr   creater   ZFieldr   lenr   r%   Z
has_outputappendr+   popr   r2   r7   r   r   ZUSE_TZr   r   replacerU   updater   boolr   )rG   rH   rN   Zuse_distinctkeyvaluefilter_specsr*   specrQ   fieldZfield_list_filter_classZlookup_params_countrU   monthrT   Z	from_dater    Zto_daterI   rI   rJ   get_filtersh   sj    


	zChangeList.get_filtersc             C   s   |d kri }|d krg }| j j }x.|D ]&}x t|D ]}|j|r6||= q6W q(W x4|j D ](\}}|d kr|||kr||= q\|||< q\W dtt|j  S )Nz?%s)r=   rL   rZ   
startswithr<   r   sorted)rG   
new_paramsremover   rkvrI   rI   rJ   get_query_string   s    


zChangeList.get_query_stringc             C   s   | j j|| j| j}|j}| j jr.| jj }nd }|| jk}|| jk}| jrP|sV| rb| jj	 }n0y|j
| jd j}W n tk
r   tY nX || _| j j| _| j pt|| _|| _|| _|| _|| _|| _d S )NrP   )r0   Zget_paginatorrB   r.   countZshow_full_result_countr'   r/   r9   Z_clonepager6   object_listr   r   result_countra   Zshow_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)rG   rH   ry   rt   ru   rw   rx   rv   rI   rI   rJ   rC      s*    



zChangeList.get_resultsc             C   s*   g }| j jr| j j}n| jjr&| jj}|S )N)r0   orderingr%   )rG   rz   rI   rI   rJ   _get_default_ordering   s    
z ChangeList._get_default_orderingc             C   sh   y| j j|}|jS  tk
rb   t|r0|}n&t| j|rJt| j|}nt| 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.
        Zadmin_order_fieldN)	r%   	get_fieldnamer   rW   hasattrr0   getattrr#   )rG   
field_namerf   attrrI   rI   rJ   get_ordering_field   s    zChangeList.get_ordering_fieldc             C   s0  | j }t| jj|p| j }t|krg }|t jd}x|D ]}y|jd\}}}	| jt	|	 }
| j
|
}|srw>t|dr|j|dkr|j n|j  n4|jdr|dkr|j|dd  n|j||  W q> ttfk
r   w>Y q>X q>W |j|jj | jjj}dd|d| hj|r,|jd |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 ensuring the primary key is used as the last
        ordering field.
        .-Zas_sqlrP   NrE   z-pk)r=   rZ   r0   get_orderingr{   	ORDER_VARsplit
rpartitionr(   r2   r   r~   r]   descascri   
IndexErrorr7   extendrA   order_byr%   rE   r}   
isdisjoint)rG   rH   rB   r=   rz   Zorder_paramsr   nonepfxidxr   Zorder_fieldZpk_namerI   rI   rJ   r     s0    	


 

zChangeList.get_orderingc             C   s*  | j  }t }t| jkrx|D ]}t|ttfrjt|tsB|j }t|jt	r|j
rXdnd}|jj}qqn |jdr|dd }d}nd}x.t| jD ] \}}| j||kr|||< P qW qW nfxd| jt jdD ]P}|jd\}}	}
yt|
}
W n tk
r
   wY nX |	dkrdnd||
< qW |S )zV
        Return an OrderedDict of ordering field column numbers and asc/desc.
        r   r   r   rP   Nr   )r{   r   r   r=   rX   r   r   r   Z
expressionr   Z
descendingr}   ri   	enumerater(   r   r   r   r2   r7   )rG   rz   Zordering_fieldsrf   Z
order_typeindexr   r   r   r   r   rI   rI   rJ   get_ordering_field_columns<  s6    




z%ChangeList.get_ordering_field_columnsc       
      C   s   | j |\| _| _}}| j}x&| jD ]}|j||}|d k	r$|}q$W y|jf |}W nB ttfk
rn    Y n* tk
r } zt	|W Y d d }~X nX |j
js| j|}| j||}|j| }| jj||| j
\}}	||	B r|j S |S d S )N)rh   rd   Zhas_filtersr'   rB   filterr   r   	Exceptionr   rA   select_relatedapply_select_relatedr   r   r0   Zget_search_resultsZdistinct)
rG   rH   Zremaining_lookup_paramsZfilters_use_distinctqsZfilter_specZnew_qsr    rz   Zsearch_use_distinctrI   rI   rJ   r&   d  s(    

zChangeList.get_querysetc             C   sB   | j dkr|j S | j dkr,| j r,|j S | j r>|j| j  S |S )NTF)r-   r   !has_related_field_in_list_display)rG   r   rI   rI   rJ   r     s    

zChangeList.apply_select_relatedc             C   sX   xR| j D ]H}y| jj|}W n tk
r0   Y qX t|jtjr||j krdS qW dS )NTF)	r(   r%   r|   r   rX   Zremote_fieldr   ZManyToOneRelZget_attname)rG   r   rf   rI   rI   rJ   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)argsZcurrent_app)
r   rF   r   r$   Z	app_labelZ
model_namer   r0   Z
admin_siter}   )rG   resultrE   rI   rI   rJ   url_for_result  s
    

zChangeList.url_for_result)N)NN)__name__
__module____qualname__rK   rO   rh   rp   rC   r{   r   r   r   r&   r   r   r   rI   rI   rI   rJ   r!   &   s   4
T
!/(-r!   N)0collectionsr   r   r   Zdjango.confr   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.dbr   Zdjango.db.models.expressionsr   r   r   Zdjango.urlsr   Zdjango.utils.httpr   Zdjango.utils.timezoner   Zdjango.utils.translationr   r8   r   ZORDER_TYPE_VARr5   r@   r>   rM   r!   rI   rI   rI   rJ   <module>   s,   