o
    —¨Êh]  ã                   @   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   Ú	CharFieldÚfields)ÚselfÚargsÚkwargs©Ú	__class__© úQ/var/www/html/env/lib/python3.10/site-packages/django/contrib/admin/views/main.pyr)   .   s   
ÿzChangeListSearchForm.__init__)Ú__name__Ú
__module__Ú__qualname__r)   Ú__classcell__r2   r2   r0   r3   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 |¡¡ qP|j t ¡pcd| _!zt"|j t#d¡ƒ| _$W n t%y}   d| _$Y nw t&|jv | _'t(|jv | _)|j t*¡}|rž| +||¡sžt,d| ƒ‚|| _-t.|j /¡ ƒ| _0t#| j0v r²| 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.r2   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_adminÚget_preserved_filtersÚpreserved_filtersÚsortable_byÚsearch_help_textÚsearch_form_classÚGETÚis_validÚerrorsÚvaluesr   ÚerrorÚjoinÚcleaned_dataÚgetr*   ÚqueryÚintÚPAGE_VARÚpage_numÚ
ValueErrorÚALL_VARÚshow_allr
   Úis_popupr   Úto_field_allowedr	   Úto_fieldÚdictÚitemsÚparamsÚ
ERROR_FLAGÚlist_editableÚquerysetÚget_resultsr   Úhas_change_permissionÚverbose_nameÚtitleÚpkÚattnameÚ
pk_attname)r-   Úrequestr;   rA   rB   rC   rG   rH   rI   rJ   rK   rh   rL   rO   rP   Ú_search_formrV   rc   rm   r2   r2   r3   r)   9   sl   
ÿÿ




zChangeList.__init__c                 C   s   d| j j| jj| jj jf S )Nz<%s: model=%s model_admin=%s>)r1   r6   r;   rL   ©r-   r2   r2   r3   Ú__repr__…   s
   ýzChangeList.__repr__Nc                 C   s.   |p| j }| ¡ }tD ]	}||v r||= q|S )z:
        Return all params except IGNORED_PARAMS.
        )rf   ÚcopyÚIGNORED_PARAMS)r-   rf   Úlookup_paramsÚignoredr2   r2   r3   Úget_filters_paramsŒ   s   
€zChangeList.get_filters_paramsc              
   C   s”  |   ¡ }d}d}| ¡ D ]\}}| j ||¡std| ƒ‚qg }| jD ]d}t|ƒ}	t|ƒr7|||| j| jƒ}
n=d }t	|t
tfƒrE|\}}n|tj}}t	|tƒsZ|}t| j|ƒd }||||| j| j|d�}
|	t|ƒkrt|t| j|ƒO }|
r‡|
 ¡ r‡| |
¡ |	t|ƒkr‡d}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 |râ|td	d
� }n|rð|tdd
� jd	d�}n	|j|jd	 d�}tj�rt|ƒ}t|ƒ}|  d| j |d| j |i¡ z#| ¡ D ]\}}t!||ƒ||< |t| j|ƒO }�q|t"|ƒ|||fW S  t#�yI } zt|ƒ|‚d }~ww )NFzFiltering by %s not allowedéÿÿÿÿ)Ú
field_pathTz%s__yearz	%s__monthz%s__dayr:   )Údaysé    )Úday)Úyearz%s__gtez%s__lt)$ry   re   rL   Úlookup_allowedr   rC   ÚlenÚcallabler;   Ú
isinstanceÚtupleÚlistr   Úcreater   r   r   r>   Ú
has_outputÚappendrG   Úpopr   r[   r^   r   r   Úreplacer   r   ÚUSE_TZr   Úupdater   Úboolr   )r-   rq   rw   Úmay_have_duplicatesrE   ÚkeyÚvalueÚfilter_specsrC   Úlookup_params_countÚspecr{   ÚfieldÚfield_list_filter_classr   Úmonthr~   Ú	from_dater$   Úto_dater2   r2   r3   Úget_filters™   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)rf   ru   r…   Ú
startswithre   r   Úsorted)r-   Ú
new_paramsÚremover"   ÚrÚkÚvr2   r2   r3   Ú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¡j}W n	 tyB   t‚w || _| j j| _| j pRt|ƒ| _|| _|| _|| _|| _|| _d S ©N)rL   Úget_paginatorri   rJ   ÚcountÚshow_full_result_countr@   rK   r`   Ú_cloneÚpager]   Úobject_listr   r   Úresult_countr�   Úshow_admin_actionsÚfull_result_countÚresult_listÚcan_show_allÚ
multi_pageÚ	paginator)r-   rq   r¯   r©   r«   r­   r®   r¬   r2   r2   r3   rj     s4   
ÿ

ÿ

ÿ
zChangeList.get_resultsc                 C   s,   g }| j jr| j j}|S | jjr| jj}|S r¢   )rL   Úorderingr>   )r-   r°   r2   r2   r3   Ú_get_default_ordering7  s   þz ChangeList._get_default_orderingc                 C   s‚   z
| j  |¡}|jW S  ty@   t|ƒr|}nt| j|ƒr%t| j|ƒ}nt| j|ƒ}t	|t
ƒr8t|dƒr8|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.
        ÚfgetÚadmin_order_fieldN)r>   Ú	get_fieldÚnamer   r‚   ÚhasattrrL   Úgetattrr;   rƒ   Úpropertyr²   )r-   Ú
field_namer”   Úattrr2   r2   r3   Úget_ordering_field?  s   õzChangeList.get_ordering_fieldc              
   C   s0  | j }t| j |¡p|  ¡ ƒ}t|v rŒg }|t  d¡}|D ]m}z`| d¡\}}}	| jt	|	ƒ }
|  
|
¡}|s9W qt|tƒrP|dkrJ| ¡ }| ¡  | |¡ n/t|dƒre| |dkr_| ¡ n| ¡ ¡ n| d¡rx|dkrx| |dd… ¡ n| || ¡ W q ttfy‹   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.
        Ú.ú-Úresolve_expressionr:   N)rf   r…   rL   Úget_orderingr±   Ú	ORDER_VARÚsplitÚ
rpartitionrA   r[   r»   rƒ   r   ru   Úreverse_orderingrˆ   r¶   ÚdescÚascrš   Ú
IndexErrorr^   ÚextendrZ   Úorder_byÚ_get_deterministic_ordering)r-   rq   ri   rf   r°   Úorder_paramsr"   ÚnoneÚpfxÚidxr¹   Úorder_fieldr2   r2   r3   r¿   W  s@   	ÿ


ÿ€ÿ
zChangeList.get_orderingc           
   	      sH  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g ˆ jj¢dd„ ˆ jjD ƒ¢R }|D ]"}‡ fdd	„|D ƒ}	td
d„ |	D ƒƒr�qz| dd„ |	D ƒ¡rœ |S qz| 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.
        rn   c                 S   s   h | ]}|j r|js|j’qS r2   )ÚuniqueÚnullro   ©Ú.0r”   r2   r2   r3   Ú	<setcomp>�  s    ýýÿz9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nr½   c                 s   ó   � | ]}|j V  qd S r¢   )r,   )rÒ   Ú
constraintr2   r2   r3   Ú	<genexpr>±  s
   € ÿ
ÿz9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                    s   g | ]}ˆ j  |¡‘qS r2   )r>   r´   )rÒ   r¹   rs   r2   r3   Ú
<listcomp>¸  s    ÿz:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c                 s   rÔ   r¢   )rÐ   rÑ   r2   r2   r3   rÖ   ½  ó   € c                 s   rÔ   r¢   )ro   rÑ   r2   r2   r3   rÖ   ¿  rØ   z-pk)r…   Úsetr>   r,   rƒ   ÚstrÚlstripr   rµ   r   Ú
expressionr´   r   Úremote_fieldro   ÚaddÚunique_togetherÚtotal_unique_constraintsÚanyÚ
issupersetrˆ   )
r-   r°   Úordering_fieldsÚtotal_ordering_fieldsÚpartr¹   r”   Úconstraint_field_namesÚfield_namesr,   r2   rs   r3   rÉ   †  sZ   
þ

ý
æ€ÿþþ
ÿú
z&ChangeList._get_deterministic_orderingc              	   C   s  |   ¡ }i }t| jvr\|D ]L}t|ttfƒr2t|tƒs| ¡ }t|jtƒr1|j	r*dnd}|jj
}nq| d¡r@|dd… }d}nd}t| jƒD ]\}}|  |¡|krX|||<  nqGq|S | jt  d¡D ]$}| d¡\}}	}
zt|
ƒ}
W n	 ty}   Y qdw |	dkr„dnd||
< qd|S )zT
        Return a dictionary of ordering field column numbers and asc/desc.
        rÄ   rÅ   r½   r:   Nr¼   )r±   rÀ   rf   rƒ   r   r   rÅ   rÜ   r   Ú
descendingrµ   rš   Ú	enumeraterA   r»   rÁ   rÂ   r[   r^   )r-   r°   rã   r”   Ú
order_typeÚindexrº   r"   rË   rÌ   rÍ   r2   r2   r3   Úget_ordering_field_columnsÇ  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y6   ‚  t	yE } zt
|ƒ‚d }~ww | j ||| j¡\}}| j||  ¡ d�| _||B ro|jtdƒd�}| j t|ƒ¡}|  ||¡}	|j|	Ž }|jjsƒ|  |¡}|S )N)rœ   r�   rn   )rn   r2   )r™   r‘   rD   rE   r@   ri   Úfilterr   r   Ú	Exceptionr   rL   Úget_search_resultsrZ   r¡   ry   rF   r   r   r¿   rÈ   Úselect_relatedÚapply_select_related)
r-   rq   Úremaining_lookup_paramsÚfilters_may_have_duplicatesÚqsÚfilter_specÚnew_qsr$   Úsearch_may_have_duplicatesr°   r2   r2   r3   r?   ï  sL   ú
€€ú	ýþ

zChangeList.get_querysetc                 C   sB   | j du r	| ¡ S | j du r|  ¡ r| ¡ S | j r|j| j Ž S |S ©NTF)rI   rð   Ú!has_related_field_in_list_display)r-   rô   r2   r2   r3   rñ   *  s   

zChangeList.apply_select_relatedc              	   C   sR   | j D ]#}z| j |¡}W n	 ty   Y qw t|jtƒr&|| ¡ kr& dS qdS rø   )rA   r>   r´   r   rƒ   rÝ   r   Úget_attname)r-   r¹   r”   r2   r2   r3   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.   Úcurrent_app)
r·   rp   r   r=   Ú	app_labelÚ
model_namer   rL   Ú
admin_siterµ   )r-   Úresultrn   r2   r2   r3   Úurl_for_resultC  s   ýzChangeList.url_for_resultr¢   )NN)r4   r5   r6   r%   rQ   r)   rt   ry   r™   r¡   rj   r±   r»   r¿   rÉ   rì   r?   rñ   rù   r   r2   r2   r2   r3   r8   6   s"    L

g%/A(;r8   N)6r   r   Údjangor   Údjango.confr   Údjango.contribr   Ú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.db.modelsr   r   r   r   r   r   Údjango.db.models.expressionsr   Údjango.urlsr   Údjango.utils.httpr   Údjango.utils.timezoner   Údjango.utils.translationr   r_   rÀ   r\   r*   rg   rv   ÚFormr%   r8   r2   r2   r2   r3   Ú<module>   s0     	