o
    ÔèFhd  ã                   @   sd  d dl Z 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mZmZ d d	lmZ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$ 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/m0Z0 d dl1m2Z2 dZ3dZ4dZ5dZ6dZ7e3e4e6eeefZ8G dd„ dej9ƒZ:G dd„ dƒZ;dS )é    N)ÚdatetimeÚ	timedelta)Úforms)Úsettings)Úmessages)ÚFieldListFilter)ÚDisallowedModelAdminLookupÚDisallowedModelAdminToField)ÚIS_FACETS_VARÚIS_POPUP_VARÚTO_FIELD_VARÚIncorrectLookupParametersÚ
ShowFacets)Ú%build_q_object_from_lookup_parametersÚget_fields_from_pathÚlookup_spawns_duplicatesÚprepare_lookup_valueÚquote)ÚFieldDoesNotExistÚImproperlyConfiguredÚSuspiciousOperation)ÚInvalidPage)ÚFÚFieldÚManyToOneRelÚOrderBy)Ú
Combinable)Úreverse)ÚRemovedInDjango60Warning)Ú	urlencode)Úfunc_supports_parameter)Ú
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__© úX/var/www/html/loop/nvenv/lib/python3.10/site-packages/django/contrib/admin/views/main.pyr,   ;   s   
ÿzChangeListSearchForm.__init__)Ú__name__Ú
__module__Ú__qualname__r,   Ú__classcell__r5   r5   r3   r6   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d„Zdd„ Zdd„ Zdd„ ZdS )"Ú
ChangeListc                 C   sb  || _ |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+j,u pš|j*t+j-u ošt.|jv | _/|j*t+j-u | _0|j t1¡}|r·| 2||¡s·t3d| ƒ‚|| _4t5|j 6¡ ƒ| _7t5|j 8¡ ƒ| _9t#| j7v r×| j7t#= | j9t#= t:| j7v rä| j7t:= | j9t:= | j;t.gd�| _<|  ;t.di¡| _=| j)rûd| _>n|| _>|  |¡| _?|  @|¡ | j)�rtAdƒ}n| j B|¡�rtAd	ƒ}ntAd
ƒ}|| jjC | _D| jjEjF| _Gd S )Nz, Ú é   z"The field %s cannot be referenced.)ÚremoveTr5   z	Select %szSelect %s to changezSelect %s to view)HÚ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_popupÚshow_facetsr   ÚALWAYSÚALLOWr
   Ú
add_facetsÚis_facets_optionalr   Úto_field_allowedr	   Úto_fieldÚdictÚitemsÚparamsÚlistsÚfilter_paramsÚ
ERROR_FLAGÚget_query_stringÚremove_facet_linkÚadd_facet_linkÚlist_editableÚquerysetÚget_resultsr"   Úhas_change_permissionÚverbose_nameÚtitleÚpkÚattnameÚ
pk_attname)r0   Úrequestr?   rE   rF   rG   rK   rL   rM   rN   rO   rv   rP   rS   rT   Ú_search_formrZ   rl   r{   r5   r5   r6   r,   F   s~   
ÿÿÿ




zChangeList.__init__c                 C   s   d| j j| jj| jj jf S )Nz<%s: model=%s model_admin=%s>)r4   r9   r?   rP   ©r0   r5   r5   r6   Ú__repr__›   s
   ýzChangeList.__repr__Nc                 C   s.   |p| j }| ¡ }tD ]	}||v r||= q|S )z:
        Return all params except IGNORED_PARAMS.
        )rq   ÚcopyÚIGNORED_PARAMS)r0   ro   Úlookup_paramsÚignoredr5   r5   r6   Úget_filters_params¢   s   
€zChangeList.get_filters_paramsc              
   C   sø  |   ¡ }d}d}t| jjdƒ}|st d| jjj› d�t¡ | 	¡ D ]"\}}|D ]}|r1|||fn||f}	| jj|	Ž sCt
d|› d�ƒ‚q(q"g }
| jD ]d}t|ƒ}t|ƒr^|||| j| jƒ}n=d }t|ttfƒrl|\}}n|tj}}t|tƒs�|}t| j|ƒd }||||| j| j|d�}|t|ƒkr›|t| j|ƒO }|r®| ¡ r®|
 |¡ |t|ƒkr®d	}qJ| j�rF| d
| j d ¡}|d u�rF| d| j d ¡}| d| j d ¡}z tt|d ƒt|d urã|d ndƒt|d urî|d 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$�r5t%|ƒ}t%|ƒ}| &d| j |gd| j |gi¡ z#| 	¡ D ]\}}t'||ƒ||< |t| j|ƒO }�qK|
t(|
ƒ|||fW S  t)�y{ } zt|ƒ|‚d }~ww )NFr   z,`request` must be added to the signature of z.lookup_allowed().zFiltering by z not allowedéÿÿÿÿ)Ú
field_pathTz%s__yearz	%s__monthz%s__dayr=   )Údaysé    )Úday)Úyearz%s__gtez%s__lt)*r‡   r    rP   Úlookup_allowedÚwarningsÚwarnr4   r9   r   rn   r   rG   ÚlenÚcallabler?   Ú
isinstanceÚtupleÚlistr   Úcreater   r   r   rB   Ú
has_outputÚappendrK   Úpopr   r_   rb   r   r   Úreplacer�   r   ÚUSE_TZr!   Úupdater   Úboolr   )r0   r   r…   Úmay_have_duplicatesrI   Úsupports_requestÚkeyÚ
value_listÚvaluero   Úfilter_specsrG   Úlookup_params_countÚspecr‰   ÚfieldÚfield_list_filter_classr�   ÚmonthrŒ   Ú	from_dater'   Úto_dater5   r5   r6   Ú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| ¡ ƒdd� S )Nz?%sT)Údoseq)rq   rƒ   r•   Ú
startswithrn   r   Úsorted)r0   Ú
new_paramsr>   r%   ÚrÚkÚvr5   r5   r6   rs   !  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)rP   Úget_paginatorrw   rN   ÚcountÚshow_full_result_countrD   rO   rd   Ú_cloneÚpagera   Úobject_listr   r   Úresult_countr�   Úshow_admin_actionsÚfull_result_countÚresult_listÚcan_show_allÚ
multi_pageÚ	paginator)r0   r   rÀ   rº   r¼   r¾   r¿   r½   r5   r5   r6   rx   3  s4   
ÿ

ÿ

ÿ
zChangeList.get_resultsc                 C   s,   g }| j jr| j j}|S | jjr| jj}|S r³   )rP   ÚorderingrB   )r0   rÁ   r5   r5   r6   Ú_get_default_ordering[  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)rB   Ú	get_fieldÚnamer   r’   ÚhasattrrP   Úgetattrr?   r“   ÚpropertyrÃ   )r0   Ú
field_namer¦   Úattrr5   r5   r6   Úget_ordering_fieldc  s   õzChangeList.get_ordering_fieldc              
   C   s.  | j }t| j |¡p|  ¡ ƒ}t|v r‹g }|t  d¡}|D ]l}z_| d¡\}}}	| jt	|	ƒ }
|  
|
¡}|s9W qt|tƒrP|dkrJ| ¡ }| ¡  | |¡ n.t|dƒre| |dkr_| ¡ n| ¡ ¡ n|dkrw| |¡rw| | |¡¡ 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_expression)ro   r•   rP   Úget_orderingrÂ   Ú	ORDER_VARÚsplitÚ
rpartitionrE   r_   rÌ   r“   r   rƒ   Úreverse_orderingr˜   rÇ   ÚdescÚascr­   ÚremoveprefixÚ
IndexErrorrb   Úextendr^   Úorder_byÚ_get_deterministic_ordering)r0   r   rw   ro   rÁ   Úorder_paramsr%   ÚnoneÚpfxÚidxrÊ   Úorder_fieldr5   r5   r6   rÐ   {  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.
        r|   c                 S   s   h | ]}|j r|js|j’qS r5   )ÚuniqueÚnullr}   ©Ú.0r¦   r5   r5   r6   Ú	<setcomp>³  s    ýýÿz9ChangeList._get_deterministic_ordering.<locals>.<setcomp>NrÎ   c                 s   ó   � | ]}|j V  qd S r³   )r/   )rä   Ú
constraintr5   r5   r6   Ú	<genexpr>Õ  s
   € ÿ
ÿz9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                    s   g | ]}ˆ j  |¡‘qS r5   )rB   rÅ   )rä   rÊ   r�   r5   r6   Ú
<listcomp>Ü  s    ÿz:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c                 s   ræ   r³   )râ   rã   r5   r5   r6   rè   á  ó   € c                 s   ræ   r³   )r}   rã   r5   r5   r6   rè   ã  rê   z-pk)r•   ÚsetrB   r/   r“   ÚstrÚlstripr   rÆ   r   Ú
expressionrÅ   r   Úremote_fieldr}   ÚaddÚunique_togetherÚtotal_unique_constraintsÚanyÚ
issupersetr˜   )
r0   rÁ   Úordering_fieldsÚtotal_ordering_fieldsÚpartrÊ   r¦   Úconstraint_field_namesÚfield_namesr/   r5   r�   r6   rÛ   ª  sZ   
þ

ý
æ€ÿþþ
ÿú
z&ChangeList._get_deterministic_orderingc              	   C   s  |   ¡ }i }t| jvr[|D ]K}t|ttfƒr2t|tƒs| ¡ }t|jtƒr1|j	r*dnd}|jj
}nq| d¡r?| d¡}d}nd}t| jƒD ]\}}|  |¡|krW|||<  nqFq|S | jt  d¡D ]$}| d¡\}}	}
zt|
ƒ}
W n	 ty|   Y qcw |	dkrƒdnd||
< qc|S )zT
        Return a dictionary of ordering field column numbers and asc/desc.
        rÕ   rÖ   rÎ   rÍ   )rÂ   rÑ   ro   r“   r   r   rÖ   rî   r   Ú
descendingrÆ   r­   r×   Ú	enumeraterE   rÌ   rÒ   rÓ   r_   rb   )r0   rÁ   rõ   r¦   Ú
order_typeÚindexrË   r%   rÝ   rÞ   rß   r5   r5   r6   Úget_ordering_field_columnsë  s>   




þ€ùÿz%ChangeList.get_ordering_field_columnsc              
   C   s  |   |¡\| _| _}}| _| j}| jD ]}|d u s| ¡ |kr+| ||¡}|d ur+|}qzt|ƒ}| |¡}W n t	t
fyA   ‚  tyP }	 zt|	ƒ‚d }	~	ww |jjsZ|  |¡}|  ||¡}
|j|
Ž }| j ||| j¡\}}| j||  ¡ d�| _||B r‚| ¡ S |S )N)r¯   r>   )r«   r£   rH   rI   rD   Úexpected_parametersrw   r   Úfilterr   r   Ú	Exceptionr   r^   Úselect_relatedÚapply_select_relatedrÐ   rÚ   rP   Úget_search_resultsrs   r‡   rJ   Údistinct)r0   r   Úexclude_parametersÚremaining_lookup_paramsÚfilters_may_have_duplicatesÚqsÚfilter_specÚnew_qsÚq_objectr'   rÁ   Úsearch_may_have_duplicatesr5   r5   r6   rC     sP   ú
€€ú

ýþzChangeList.get_querysetc                 C   sB   | j du r	| ¡ S | j du r|  ¡ r| ¡ S | j r|j| j Ž S |S ©NTF)rM   r  Ú!has_related_field_in_list_display)r0   r	  r5   r5   r6   r  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  )rE   rB   rÅ   r   r“   rï   r   Úget_attname)r0   rÊ   r¦   r5   r5   r6   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)r1   Úcurrent_app)
rÈ   r~   r   rA   Ú	app_labelÚ
model_namer   rP   Ú
admin_siterÆ   )r0   Úresultr|   r5   r5   r6   Úurl_for_resultk  s   ýzChangeList.url_for_resultr³   )NN)r7   r8   r9   r(   rU   r,   r‚   r‡   r«   rs   rx   rÂ   rÌ   rÐ   rÛ   rþ   rC   r  r  r  r5   r5   r5   r6   r;   C   s"    U

r(/A
(?r;   )<r�   r   r   Údjangor   Údjango.confr   Údjango.contribr   Údjango.contrib.adminr   Údjango.contrib.admin.exceptionsr   r	   Údjango.contrib.admin.optionsr
   r   r   r   r   Údjango.contrib.admin.utilsr   r   r   r   r   Údjango.core.exceptionsr   r   r   Údjango.core.paginatorr   Údjango.db.modelsr   r   r   r   Údjango.db.models.expressionsr   Údjango.urlsr   Údjango.utils.deprecationr   Údjango.utils.httpr   Údjango.utils.inspectr    Údjango.utils.timezoner!   Údjango.utils.translationr"   rc   rÑ   r`   r-   rr   r„   ÚFormr(   r;   r5   r5   r5   r6   Ú<module>   sB    ú
	