3
(h?                 @   s   d dl 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 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e*Z+dS )    N)OrderedDict)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)reverse)six)
force_text)	urlencode)ugettext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rft(d}nt(d}|t)| jj* | _+| jj,j-| _.d S )Nr   z"The field %s cannot be referenced. z	Select %szSelect %s to change)/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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   r   Zverbose_nametitlepkZattname
pk_attname)selfrequestr   r#   r$   r%   r&   r'   r(   r)   r*   r9   r+   r4   r>    rC   C/tmp/pip-install-q3hcpn_q/Django/django/contrib/admin/views/main.py__init__&   sP    

zChangeList.__init__Nc             C   s2   |s
| j }|j }xtD ]}||kr||= qW |S )z:
        Returns all params except IGNORED_PARAMS
        )r7   copyIGNORED_PARAMS)rA   r7   lookup_paramsZignoredrC   rC   rD   get_filters_paramsW   s    

zChangeList.get_filters_paramsc             C   s  | j  }d}x.|j D ]"\}}| jj||std| qW g }| j rx| jD ]}t|rp|||| j| j}npd }	t|t	t
fr|\}
}n|tj }
}t|
tjs|
}	t| j|	d }
||
||| j| j|	d}|pt| j|	}|rP|j rP|j| qPW yHx6|j D ]*\}}t||||< |p,t| j|}qW |t|||fS  tk
r } z tjtt|tj d  W Y d d }~X nX d S )NFzFiltering by %s not allowed   )
field_path   )rI   r6   r+   Zlookup_allowedr   r%   callabler   
isinstancetuplelistr   creater   ZFieldr	   r
   r    Z
has_outputappendr   boolr   r   reraiser   sysexc_info)rA   rB   rH   Zuse_distinctkeyvaluefilter_specsr%   specrK   fieldZfield_list_filter_classr   rC   rC   rD   get_filterse   s<    
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)r7   rF   rQ   
startswithr6   r   sorted)rA   
new_paramsremover   rkvrC   rC   rD   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 )NrJ   )r+   Zget_paginatorr<   r)   countZshow_full_result_countr"   r*   r3   Z_clonepager0   Zobject_listr   r   result_countrT   Zshow_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)rA   rB   rm   rh   ri   rk   rl   rj   rC   rC   rD   r=      s*    



zChangeList.get_resultsc             C   s*   g }| j jr| j j}n| jjr&| jj}|S )N)r+   orderingr    )rA   rn   rC   rC   rD   _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 )ak  
        Returns 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. Returns None if no
        proper model field name can be matched.
        Zadmin_order_fieldN)	r    	get_fieldnamer   rN   hasattrr+   getattrr   )rA   
field_namer\   attrrC   rC   rD   get_ordering_field   s    zChangeList.get_ordering_fieldc             C   s  | j }t| jj|p| j }t|krg }|t jd}x|D ]}yf|jd\}}}	| jt	|	 }
| j
|
}|srw>|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}t|dd|d| h@ s|jd |S )a  
        Returns the list of ordering fields for the change list.
        First we check the get_ordering() method in model admin, then we 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.
        .-rJ   Nr?   z-pk)r7   rQ   r+   get_orderingro   	ORDER_VARsplit
rpartitionr#   r,   rv   r^   rS   
IndexErrorr1   extendr;   order_byr    r?   rq   set)rA   rB   r<   r7   rn   Zorder_paramsr   nonepfxidxrt   Zorder_fieldZpk_namerC   rC   rD   ry      s,    	



zChangeList.get_orderingc             C   s   | j  }t }t| jkrxx|D ]T}|jdr>|dd }d}nd}x.t| jD ] \}}| j||krN|||< P qNW qW nbx`| jt jdD ]L}|j	d\}}	}
yt
|
}
W n tk
r   wY nX |	dkrdnd||
< qW |S )zV
        Returns an OrderedDict of ordering field column numbers and asc/desc
        rx   rJ   NdescZascrw   )ro   r   rz   r7   r^   	enumerater#   rv   r{   r|   r,   r1   )rA   rn   Zordering_fieldsr\   Z
order_typeindexru   r   r   r   r   rC   rC   rD   get_ordering_field_columns  s(    


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)r]   rZ   Zhas_filtersr"   r<   filterr   r   	Exceptionr   r;   select_relatedapply_select_relatedry   r   r+   Zget_search_resultsZdistinct)
rA   rB   Zremaining_lookup_paramsZfilters_use_distinctqsZfilter_specZnew_qsr   rn   Zsearch_use_distinctrC   rC   rD   r!   5  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)rA   r   rC   rC   rD   r   b  s    

zChangeList.apply_select_relatedc             C   sL   xF| j D ]<}y| jj|}W n tk
r0   Y qX t|jtjrdS qW dS )NTF)r#   r    rp   r   rO   Zremote_fieldr   ZManyToOneRel)rA   rt   r\   rC   rC   rD   r   n  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)
rs   r@   r   r   Z	app_labelZ
model_namer   r+   Z
admin_siterq   )rA   resultr?   rC   rC   rD   url_for_resulty  s
    

zChangeList.url_for_result)N)NN)__name__
__module____qualname__rE   rI   r]   re   r=   ro   rv   ry   r   r!   r   r   r   rC   rC   rC   rD   r   %   s   1
2
!,!-r   ),rV   collectionsr   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.urlsr   Zdjango.utilsr   Zdjango.utils.encodingr   Zdjango.utils.httpr   Zdjango.utils.translationr   r2   rz   ZORDER_TYPE_VARr/   r:   r8   rG   objectr   rC   rC   rC   rD   <module>   s*   