a
    Kcòf]  ã                   @   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|i |¤Ž ttjddd�i| _d S )NF)ÚrequiredÚstrip)ÚsuperÚ__init__Ú
SEARCH_VARr   Z	CharFieldÚfields)ÚselfÚargsÚkwargs©Ú	__class__© ú\/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/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 ¡pÆd| _!zt"|j t#d¡ƒ| _$W n t%yú   d| _$Y n0 t&|jv | _'t(|jv | _)|j t*¡}|�r@| +||¡�s@t,d| ƒ‚|| _-t.|j /¡ ƒ| _0t#| j0v �rj| j0t#= t1| j0v �r~| j0t1= | j)�rŽd| _2n|| _2|  |¡| _3|  4|¡ | j)�r¼t5dƒ}n | j 6|¡�rÔt5dƒ}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)<ÚmodelÚ_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@   rA   rB   rF   rG   rH   rI   rJ   ra   rK   rL   rM   Z_search_formrR   r\   rd   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:   rK   ©r,   r1   r1   r2   Ú__repr__…   s
    ýzChangeList.__repr__Nc                 C   s.   |p| j }| ¡ }tD ]}||v 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 u�r>| d| j d ¡}| d| j d ¡}z8tt|ƒt|d u�rr|nd	ƒt|d u�r†|nd	ƒƒ}W n0 t�yÀ } zt|ƒ|‚W Y d }~n
d }~0 0 |�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 }�qH|t"|ƒ|||fW S  t#�y´ } zt|ƒ|‚W Y d }~n
d }~0 0 d S )NFzFiltering by %s not allowedéÿÿÿÿ)Ú
field_pathTz%s__yearz	%s__monthz%s__dayr9   )Údaysé    )Úday)Úyearz%s__gtez%s__lt)$rn   r^   rK   Zlookup_allowedr   rB   ÚlenÚcallabler:   Ú
isinstanceÚtupleÚlistr   Úcreater   r   r   r=   Z
has_outputÚappendrF   Úpopr   rV   rY   r   r   Úreplacert   r   ZUSE_TZr   Úupdater   Úboolr   )r,   rh   rm   Zmay_have_duplicatesrD   ÚkeyÚvalueÚfilter_specsrB   Zlookup_params_countÚspecrp   ÚfieldZfield_list_filter_classrt   Úmonthrs   Z	from_dater$   Zto_dater1   r1   r2   Úget_filters™   s’    


úþ

ý 

þÿûzChangeList.get_filtersc                 C   s�   |d u ri }|d u rg }| j  ¡ }|D ]"}t|ƒD ]}| |¡r2||= q2q&| ¡ D ](\}}|d u rr||v rz||= qR|||< qRdtt| ¡ ƒƒ S )Nz?%s)r_   rk   ry   Ú
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yˆ   t‚Y n0 || _| j j| _| j p¨t|ƒ| _|| _|| _|| _|| _|| _d S ©N)rK   Zget_paginatorrb   rI   ÚcountZshow_full_result_countr?   rJ   r[   Z_cloneÚpagerX   Zobject_listr   r   Úresult_countr   Zshow_admin_actionsÚfull_result_countÚresult_listÚcan_show_allÚ
multi_pageÚ	paginator)r,   rh   r—   r’   r“   r•   r–   r”   r1   r1   r2   rc     s2    
ÿ




ÿzChangeList.get_resultsc                 C   s*   g }| j jr| j j}n| jjr&| jj}|S r�   )rK   Úorderingr=   )r,   r˜   r1   r1   r2   Ú_get_default_ordering7  s    
z ChangeList._get_default_orderingc                 C   s†   z| j  |¡}|jW S  ty€   t|ƒr0|}n&t| j|ƒrJt| j|ƒ}nt| j|ƒ}t	|t
ƒrpt|dƒrp|j}t|ddƒ Y S 0 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   rv   ÚhasattrrK   Úgetattrr:   rw   Úpropertyrš   )r,   Ú
field_namer„   Úattrr1   r1   r2   Úget_ordering_field?  s    zChangeList.get_ordering_fieldc              
   C   s:  | j }t| j |¡p|  ¡ ƒ}t|v �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�y   Y q>Y q>0 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_   ry   rK   Úget_orderingr™   Ú	ORDER_VARÚsplitÚ
rpartitionr@   rV   r¢   rw   r   rk   Zreverse_orderingr{   r�   ÚdescÚascr‡   Ú
IndexErrorrY   ÚextendrU   Úorder_byÚ_get_deterministic_ordering)r,   rh   rb   r_   r˜   Zorder_paramsr"   ÚnoneÚpfxÚidxr    Zorder_fieldr1   r1   r2   r¥   W  s<    	ÿ



ÿzChangeList.get_orderingc           
   	      sN  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y¢   Y q*Y n0 |jr¶||jkr¶q*|j|v rÆ �qJ| |j¡ q*g ˆ jj¢dd„ ˆ jjD ƒ¢R }|D ]F}‡ fdd	„|D ƒ}	td
d„ |	D ƒƒ�r$qø| dd„ |	D ƒ¡rø �qJqø| 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.
        re   c                 S   s   h | ]}|j r|js|j’qS r1   )ÚuniqueÚnullrf   ©Ú.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    ri   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¸   ½  ó    c                 s   s   | ]}|j V  qd S r�   )rf   r´   r1   r1   r2   r¸   ¿  rº   z-pk)ry   Úsetr=   r+   rw   ÚstrÚlstripr   rœ   r   Ú
expressionr›   r   Úremote_fieldrf   ÚaddZunique_togetherZtotal_unique_constraintsÚanyÚ
issupersetr{   )
r,   r˜   Úordering_fieldsZtotal_ordering_fieldsÚpartr    r„   Zconstraint_field_namesÚfield_namesr+   r1   ri   r2   r®   †  sP    
þ



ÿþþ
ÿ
z&ChangeList._get_deterministic_orderingc              	   C   s  |   ¡ }i }t| jvr¸|D ]š}t|ttfƒrft|tƒs>| ¡ }t|jtƒr|j	rTdnd}|jj
}q†qn | d¡r‚|dd… }d}nd}t| jƒD ]"\}}|  |¡|kr�|||<  qq�qn`| jt  d¡D ]N}| d¡\}}	}
zt|
ƒ}
W n tyþ   Y qÈY n0 |	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_   rw   r   r   rª   r¾   r   Z
descendingrœ   r‡   Ú	enumerater@   r¢   r§   r¨   rV   rY   )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 ur&|}q&z|jf i |¤Ž}W nB ttfyp   ‚ Y n, t	yš } zt
|ƒ‚W Y d }~n
d }~0 0 | j ||| j¡\}}| j||  ¡ d�| _||B rî|jtdƒd�}| j t|ƒ¡}|  ||¡}	|j|	Ž }|jj�s|  |¡}|S )N)r‰   rŠ   re   )re   )r†   r‚   rC   rD   r?   rb   Úfilterr   r   Ú	Exceptionr   rK   Zget_search_resultsrU   rŽ   rn   rE   r   r   r¥   r­   Úselect_relatedÚapply_select_related)
r,   rh   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u r| ¡ S | j du r,|  ¡ r,| ¡ S | j r>|j| j Ž S |S ©NTF)rH   rË   Ú!has_related_field_in_list_display)r,   rÍ   r1   r1   r2   rÌ   *  s    

zChangeList.apply_select_relatedc              	   C   sR   | j D ]F}z| j |¡}W n ty,   Y q0 t|jtƒr|| ¡ kr dS qdS rÎ   )r@   r=   r›   r   rw   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ž   rg   r   r<   Z	app_labelZ
model_namer   rK   Z
admin_siterœ   )r,   Úresultre   r1   r1   r2   Úurl_for_resultC  s    ýzChangeList.url_for_result)N)NN)r3   r4   r5   r%   rN   r)   rj   rn   r†   rŽ   rc   r™   r¢   r¥   r®   rÈ   r>   rÌ   rÏ   rÑ   r1   r1   r1   r2   r7   6   s    L
g
%/A(;r7   N)6r   r   Ú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   rZ   r¦   rW   r*   r`   rl   ZFormr%   r7   r1   r1   r1   r2   Ú<module>   s.    	