o
    uvXjR  ã                   @   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ÚoÚotÚpÚqÚec                   @   s€   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d„ ZdS ) Ú
ChangeListc                 C   s¢  || _ |j| _| j| _| |¡| _|| _|| _|| _d | _	|| _
|| _|| _|	| _|
| _|| _| |¡| _|| _zt|j td¡ƒ| _W n tyP   d| _Y nw t|jv | _t|jv | _|j t¡}|rq| ||¡sqtd| ƒ‚|| _ t!|j "¡ ƒ| _#t| j#v r…| j#t= t$| j#v rŽ| j#t$= | jr•d| _%n|| _%|j t&d¡| _'|  |¡| _(|  )|¡ | jr³t*dƒ}n| j +|¡r¾t*dƒ}nt*dƒ}|| jj, | _-| jj.j/| _0d S )Nr   z"The field %s cannot be referenced.© Ú z	Select %szSelect %s to changezSelect %s to view)1ÚmodelÚ_metaÚoptsÚlookup_optsÚget_querysetÚroot_querysetÚlist_displayÚlist_display_linksÚlist_filterÚhas_filtersÚdate_hierarchyÚsearch_fieldsÚlist_select_relatedÚlist_per_pageÚlist_max_show_allÚmodel_adminÚget_preserved_filtersÚpreserved_filtersÚsortable_byÚintÚGETÚgetÚPAGE_VARÚpage_numÚ
ValueErrorÚALL_VARÚshow_allr	   Úis_popupr
   Úto_field_allowedr   Úto_fieldÚdictÚitemsÚparamsÚ
ERROR_FLAGÚlist_editableÚ
SEARCH_VARÚqueryÚquerysetÚget_resultsr   Úhas_change_permissionÚverbose_nameÚtitleÚpkÚattnameÚ
pk_attname)ÚselfÚrequestr%   r+   r,   r-   r/   r0   r1   r2   r3   rG   r4   r7   rB   rN   r#   r#   ú\/var/www/html/myproject/venv/lib/python3.10/site-packages/django/contrib/admin/views/main.pyÚ__init__'   sZ   
ÿ




zChangeList.__init__Nc                 C   s.   |p| j }| ¡ }tD ]	}||v r||= q|S )z:
        Return all params except IGNORED_PARAMS.
        )rE   ÚcopyÚIGNORED_PARAMS)rR   rE   Úlookup_paramsÚignoredr#   r#   rT   Úget_filters_params\   s   
€zChangeList.get_filters_paramsc              
   C   sx  |   ¡ }d}| ¡ D ]\}}| j ||¡std| ƒ‚q
g }| jD ]]}t|ƒr1|||| j| jƒ}nBd }	t|t	t
fƒr?|\}
}n|tj}
}t|
tjƒsU|
}	t| j|	ƒd }
t|ƒ}||
||| j| j|	d�}|t|ƒkrs|prt| j|	ƒ}|r~| ¡ r~| |¡ q!| j�r| d| j d ¡}|d u�r| d| j d ¡}| d| j d ¡}ztt|ƒt|d ur¯|ndƒt|d ur¸|ndƒƒ}W n tyÎ } zt|ƒ|‚d }~ww tjrÖt|ƒ}|rà|tdd	� }n|rî|td
d	� jdd�}n	|j|j d d�}| !d| j |d| j |i¡ z#| ¡ D ]\}}t"||ƒ||< |�pt| j|ƒ}�q|t#|ƒ||fW S  t$�y; } zt|ƒ|‚d }~ww )NFzFiltering by %s not allowedéÿÿÿÿ)Ú
field_pathz%s__yearz	%s__monthz%s__dayé   )Údaysé    )Úday)Úyearz%s__gtez%s__lt)%rZ   rD   r4   Úlookup_allowedr   r-   Úcallabler%   Ú
isinstanceÚtupleÚlistr   Úcreater   ÚFieldr   Úlenr   r(   Ú
has_outputÚappendr/   Úpopr   r8   r=   r   r   ÚUSE_TZr   r   Úreplacera   Úupdater   Úboolr   )rR   rS   rX   Úuse_distinctÚkeyÚvalueÚfilter_specsr-   Úspecr\   ÚfieldÚfield_list_filter_classÚlookup_params_countra   Úmonthr`   Ú	from_dater!   Úto_dater#   r#   rT   Úget_filtersi   s|   ÿ


þ
€
ý
€ÿ

þ
€ÿzChangeList.get_filtersc                 C   s�   |d u ri }|d u rg }| j  ¡ }|D ]}t|ƒD ]
}| |¡r#||= qq| ¡ D ]\}}|d u r9||v r8||= q)|||< q)dtt| ¡ ƒƒ S )Nz?%s)rE   rV   rf   Ú
startswithrD   r   Úsorted)rR   Ú
new_paramsÚremover   ÚrÚkÚvr#   r#   rT   Ú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r(|s*|s0| j 	¡ }nz| 
| jd ¡j}W n	 tyD   t‚w || _| j j| _| j pTt|ƒ| _|| _|| _|| _|| _|| _d S )Nr]   )r4   Úget_paginatorrJ   r2   ÚcountÚshow_full_result_countr*   r3   r?   Ú_cloneÚpager<   Úobject_listr   r   Úresult_countrp   Úshow_admin_actionsÚfull_result_countÚresult_listÚcan_show_allÚ
multi_pageÚ	paginator)rR   rS   r‘   r‹   r�   r�   r�   rŽ   r#   r#   rT   rK   Ï   s,   

ÿ

zChangeList.get_resultsc                 C   s,   g }| j jr| j j}|S | jjr| jj}|S ©N)r4   Úorderingr(   )rR   r“   r#   r#   rT   Ú_get_default_orderingð   s   þz ChangeList._get_default_orderingc                 C   sh   z
| j  |¡}|jW S  ty3   t|ƒr|}nt| j|ƒr%t| j|ƒ}nt| j|ƒ}t|ddƒ Y S w )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.
        Úadmin_order_fieldN)	r(   Ú	get_fieldÚnamer   rc   Úhasattrr4   Úgetattrr%   )rR   Ú
field_namerv   Úattrr#   r#   rT   Úget_ordering_fieldø   s   ÷zChangeList.get_ordering_fieldc              
   C   s  | j }t| j |¡p|  ¡ ƒ}t|v rug }|t  d¡}|D ]V}zI| d¡\}}}	| jt	|	ƒ }
|  
|
¡}|s9W qt|dƒrN| |dkrH| ¡ n| ¡ ¡ n| d¡ra|dkra| |dd… ¡ n| || ¡ W q ttfyt   Y qw | |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.
        Ú.ú-Úas_sqlr]   N)rE   rf   r4   Úget_orderingr”   Ú	ORDER_VARÚsplitÚ
rpartitionr+   r8   rœ   r˜   rk   ÚdescÚascr}   Ú
IndexErrorr=   ÚextendrI   Úorder_byÚ_get_deterministic_ordering)rR   rS   rJ   rE   r“   Úorder_paramsr   ÚnoneÚpfxÚidxrš   Úorder_fieldr#   r#   rT   r      s.   	

 €ÿ
zChangeList.get_orderingc           	   	      s,  t |ƒ}tƒ }dhdd„ ˆ jjD ƒB }|D ]R}d}t|tƒr$| d¡}nt|tƒr-|j}nt|t	ƒr<t|j
tƒr<|j
j}|rgzˆ j |¡}W n	 tyO   Y qw |jrY||jkrYq|j|v ra |S | |j¡ qˆ jjD ]"}‡ fdd„|D ƒ}tdd	„ |D ƒƒr�ql| d
d	„ |D ƒ¡rŽ |S ql| 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.
        rO   c                 S   s   h | ]}|j r|js|j’qS r#   )ÚuniqueÚnullrP   ©Ú.0rv   r#   r#   rT   Ú	<setcomp>=  s    þþÿz9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nrž   c                    s   g | ]}ˆ j  |¡‘qS r#   )r(   r–   )r²   rš   ©rR   r#   rT   Ú
<listcomp>]  s    z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c                 s   ó   � | ]}|j V  qd S r’   )r°   r±   r#   r#   rT   Ú	<genexpr>`  ó   € z9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                 s   r¶   r’   )rP   r±   r#   r#   rT   r·   b  r¸   z-pk)rf   Úsetr(   Úfieldsrd   ÚstrÚlstripr   r—   r   Ú
expressionr–   r   Úremote_fieldrP   ÚaddÚunique_togetherÚanyÚ
issupersetrk   )	rR   r“   Úordering_fieldsÚtotal_ordering_fieldsÚpartrš   rv   Úfield_namesrº   r#   r´   rT   r©   4  sH   
ÿ

ý
ð€ú
z&ChangeList._get_deterministic_orderingc              	   C   s  |   ¡ }tƒ }t| jvr]|D ]L}t|ttfƒr3t|tƒs | ¡ }t|jt	ƒr2|j
r+dnd}|jj}nq| d¡rA|dd… }d}nd}t| jƒD ]\}}|  |¡|krY|||<  nqHq|S | jt  d¡D ]$}| d¡\}}	}
zt|
ƒ}
W n	 ty~   Y qew |	dkr…dnd||
< qe|S )zV
        Return an OrderedDict of ordering field column numbers and asc/desc.
        r¤   r¥   rž   r]   Nr�   )r”   r   r¡   rE   rd   r   r   r¥   r½   r   Ú
descendingr—   r}   Ú	enumerater+   rœ   r¢   r£   r8   r=   )rR   r“   rÃ   rv   Ú
order_typeÚindexr›   r   r«   r¬   r­   r#   r#   rT   Úget_ordering_field_columnsj  s>   



þ€ùÿz%ChangeList.get_ordering_field_columnsc           
   
   C   sÚ   |   |¡\| _| _}}| j}| jD ]}| ||¡}|d ur|}qz
|jdi |¤Ž}W n ttfy4   ‚  tyC } zt	|ƒ‚d }~ww |j
jsM|  |¡}|  ||¡}|j|Ž }| j ||| j
¡\}}	||	B rk| ¡ S |S )Nr#   )r|   rt   r.   r*   rJ   Úfilterr   r   Ú	Exceptionr   rI   Úselect_relatedÚapply_select_relatedr    r¨   r4   Úget_search_resultsÚdistinct)
rR   rS   Úremaining_lookup_paramsÚfilters_use_distinctÚqsÚfilter_specÚnew_qsr!   r“   Úsearch_use_distinctr#   r#   rT   r)   ’  s2   ÿ
€€ú

zChangeList.get_querysetc                 C   sB   | j du r	| ¡ S | j du r|  ¡ r| ¡ S | j r|j| j Ž S |S ©NTF)r1   rÎ   Ú!has_related_field_in_list_display)rR   rÔ   r#   r#   rT   rÏ   ¿  s   

zChangeList.apply_select_relatedc              	   C   sT   | j D ]$}z| j |¡}W n	 ty   Y qw t|jtjƒr'|| ¡ kr' dS qdS rØ   )	r+   r(   r–   r   rd   r¾   r   ÚManyToOneRelÚget_attname)rR   rš   rv   r#   r#   rT   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)ÚargsÚcurrent_app)
r™   rQ   r   r'   Ú	app_labelÚ
model_namer   r4   Ú
admin_siter—   )rR   ÚresultrO   r#   r#   rT   Úurl_for_resultØ  s   
ÿýzChangeList.url_for_resultr’   )NN)Ú__name__Ú
__module__Ú__qualname__rU   rZ   r|   r„   rK   r”   rœ   r    r©   rË   r)   rÏ   rÙ   râ   r#   r#   r#   rT   r"   &   s    
5
T!&6(-r"   N)0Úcollectionsr   r   r   Údjango.confr   Údjango.contrib.adminr   Údjango.contrib.admin.exceptionsr   r   Údjango.contrib.admin.optionsr	   r
   r   Údjango.contrib.admin.utilsr   r   r   r   Údjango.core.exceptionsr   r   r   Údjango.core.paginatorr   Ú	django.dbr   Údjango.db.models.expressionsr   r   r   Údjango.urlsr   Údjango.utils.httpr   Údjango.utils.timezoner   Údjango.utils.translationr   r>   r¡   ÚORDER_TYPE_VARr;   rH   rF   rW   r"   r#   r#   r#   rT   Ú<module>   s0    ÿ