B
    £0H[gB  ã               @   sò   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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)Ú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)Ú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| _| |¡| _|| _|| _|| _|| _	|| _
|| _|	| _|
| _|| _| |¡| _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�r| j!t= t"| j!k�r| j!t"= | j�r&d| _#n|| _#|j t$d¡| _%|  |¡| _&|  '|¡ | j�rdt(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 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   Zverbose_nameÚtitleÚpkZattnameÚ
pk_attname)ÚselfÚrequestr    r%   r&   r'   r(   r)   r*   r+   r,   r;   r-   r6   r@   r   r   úcC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\contrib\admin\views\main.pyÚ__init__$   sP    

zChangeList.__init__Nc             C   s2   |s
| j }| ¡ }xtD ]}||kr||= qW |S )z:
        Return all params except IGNORED_PARAMS.
        )r9   ÚcopyÚIGNORED_PARAMS)rC   r9   Úlookup_paramsZignoredr   r   rE   Úget_filters_paramsU   s    

zChangeList.get_filters_paramsc          
   C   sŠ  |   ¡ }d}x.| ¡ D ]"\}}| j ||¡std| ƒ‚qW g }| j�rxÄ| jD ]º}t|ƒrp|||| j| jƒ}n„d }	t|t	t
fƒrŒ|\}
}n|tj }
}t|
tjƒs¸|
}	t| j|	ƒd }
t|ƒ}||
||| j| j|	d�}|t|ƒkrô|pòt| j|	ƒ}|rP| ¡ rP| |¡ qPW yHx6| ¡ D ]*\}}t||ƒ||< |�p@t| j|ƒ}�qW |t|ƒ||fS  tk
�r„ } zt|ƒ|‚W d d }~X Y nX d S )NFzFiltering by %s not allowedéÿÿÿÿ)Ú
field_path)rJ   r8   r-   Zlookup_allowedr   r'   Úcallabler    Ú
isinstanceÚtupleÚlistr   Úcreater   ZFieldr	   Úlenr
   r"   Z
has_outputÚappendr   Úboolr   r   )rC   rD   rI   Zuse_distinctÚkeyÚvalueÚfilter_specsr'   ÚspecrL   ÚfieldZfield_list_filter_classZlookup_params_countr   r   r   rE   Úget_filtersc   s@    
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)r9   rG   rP   Ú
startswithr8   r   Úsorted)rC   Ú
new_paramsÚremover   ÚrÚkÚvr   r   rE   Ú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 	¡ }n0y| 
| jd ¡j}W n tk
rŽ   t‚Y nX || _| j j| _| j p®t|ƒ| _|| _|| _|| _|| _|| _d S )Né   )r-   Zget_paginatorr>   r+   ÚcountZshow_full_result_countr$   r,   r5   Z_cloneÚpager2   Úobject_listr   r   Úresult_countrT   Zshow_admin_actionsÚfull_result_countÚresult_listÚcan_show_allÚ
multi_pageÚ	paginator)rC   rD   rl   rg   rh   rj   rk   ri   r   r   rE   r?   ¬   s*    



zChangeList.get_resultsc             C   s*   g }| j jr| j j}n| jjr&| jj}|S )N)r-   Úorderingr"   )rC   rm   r   r   rE   Ú_get_default_orderingÍ   s    
z ChangeList._get_default_orderingc             C   sh   y| 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   rM   Úhasattrr-   Úgetattrr    )rC   Ú
field_namerY   Úattrr   r   rE   Úget_ordering_fieldÕ   s    zChangeList.get_ordering_fieldc          
   C   s  | j }t| j |¡p|  ¡ ƒ}t|krÈg }|t  d¡}xŽ|D ]†}yf| d¡\}}}	| jt	|	ƒ }
|  
|
¡}|srw>| d¡r˜|dkr˜| |dd… ¡ n| || ¡ W q> ttfk
rÂ   w>Y q>X q>W | |jj¡ | jjj}dd|d| h |¡�r| 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.
        Ú.ú-rc   NrA   z-pk)r9   rP   r-   Úget_orderingrn   Ú	ORDER_VARÚsplitÚ
rpartitionr%   r.   ru   r[   rS   Ú
IndexErrorr3   Úextendr=   Úorder_byr"   rA   rp   Ú
isdisjoint)rC   rD   r>   r9   rm   Zorder_paramsr   ÚnoneÚpfxÚidxrs   Zorder_fieldZpk_namer   r   rE   rx   ë   s,    	



zChangeList.get_orderingc          	   C   s*  |   ¡ }tƒ }t| jkrÀx¤|D ]œ}t|ttfƒrjt|tƒsB| ¡ }t|jt	ƒr|j
rXd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 )zV
        Return an OrderedDict of ordering field column numbers and asc/desc.
        ÚdescÚascrw   rc   Nrv   )rn   r   ry   r9   rN   r   r   r„   Z
expressionr   Z
descendingrp   r[   Ú	enumerater%   ru   rz   r{   r.   r3   )rC   rm   Zordering_fieldsrY   Z
order_typeÚindexrt   r   r€   r�   r‚   r   r   rE   Ú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
rn   ‚ Y n* tk
r– } zt	|ƒ‚W d d }~X Y nX |j
jsª|  |¡}|  ||¡}|j|Ž }| j ||| j
¡\}}	||	B ræ| ¡ S |S d S )N)rZ   rW   Zhas_filtersr$   r>   Úfilterr   r   Ú	Exceptionr   r=   Úselect_relatedÚapply_select_relatedrx   r~   r-   Zget_search_resultsZdistinct)
rC   rD   Zremaining_lookup_paramsZfilters_use_distinctÚqsZfilter_specZnew_qsr   rm   Zsearch_use_distinctr   r   rE   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)r*   rŠ   Ú!has_related_field_in_list_display)rC   rŒ   r   r   rE   r‹   l  s    

zChangeList.apply_select_relatedc          	   C   sZ   xT| j D ]J}y| j |¡}W n tk
r0   Y qX t|jtjƒr|| ¡ krNqdS qW dS )NTF)	r%   r"   ro   r   rN   Zremote_fieldr   ZManyToOneRelZget_attname)rC   rs   rY   r   r   rE   r�   x  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)
rr   rB   r   r!   Z	app_labelZ
model_namer   r-   Z
admin_siterp   )rC   ÚresultrA   r   r   rE   Úurl_for_result†  s
    

zChangeList.url_for_result)N)NN)Ú__name__Ú
__module__Ú__qualname__rF   rJ   rZ   rb   r?   rn   ru   rx   r‡   r#   r‹   r�   r�   r   r   r   rE   r   #   s   1
7
!,(-r   N)*Ú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.db.models.expressionsr   r   r   Zdjango.urlsr   Zdjango.utils.httpr   Zdjango.utils.translationr   r4   ry   ZORDER_TYPE_VARr1   r<   r:   rH   r   r   r   r   rE   Ú<module>   s&   