o
    `Zh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   Z	CharFieldfields)selfargskwargs	__class__ V/var/www/html/lang_env/lib/python3.10/site-packages/django/contrib/admin/views/main.pyr,   ;   s   
zChangeListSearchForm.__init__)__name__
__module____qualname__r,   __classcell__r4   r4   r2   r5   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 ot.|jv | _/|j*t+j-u | _0|jt1}|r|2||st3d| || _4t5|j6 | _7t5|j8 | _9t#| j7v r| j7t#= | j9t#= t:| j7v r| j7t:= | j9t:= | j;t.gd| _<| ;t.di| _=| j)rd| _>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.)removeTr4   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_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_popupZshow_facetsr   ZALWAYSZALLOWr
   Z
add_facetsZis_facets_optionalr   Zto_field_allowedr	   to_fielddictitemsparamslistsfilter_params
ERROR_FLAGget_query_stringZremove_facet_linkZadd_facet_linklist_editablequerysetget_resultsr"   Zhas_change_permissionZverbose_nametitlepkattname
pk_attname)r/   requestr>   rD   rE   rF   rJ   rK   rL   rM   rN   rh   rO   rP   rQ   Z_search_formrV   r`   rk   r4   r4   r5   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>)r3   r8   r>   rO   r/   r4   r4   r5   __repr__   s
   zChangeList.__repr__Nc                 C   s.   |p| j }| }tD ]	}||v r||= q|S )z:
        Return all params except IGNORED_PARAMS.
        )re   copyIGNORED_PARAMS)r/   rc   lookup_paramsZignoredr4   r4   r5   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rd	}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 )NFro   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)*ru   r    rO   Zlookup_allowedwarningswarnr3   r8   r   rb   r   rF   lencallabler>   
isinstancetuplelistr   creater   r   r   rA   Z
has_outputappendrJ   popr   rZ   r]   r   r   replacer{   r   ZUSE_TZr!   updater   boolr   )r/   ro   rt   Zmay_have_duplicatesrH   Zsupports_requestkeyZ
value_listvaluerc   filter_specsrF   Zlookup_params_countspecrw   fieldZfield_list_filter_classr{   monthrz   Z	from_dater'   Zto_dater4   r4   r5   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)re   rr   r   
startswithrb   r   sorted)r/   
new_paramsr=   r%   rkvr4   r4   r5   rg   !  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)rO   Zget_paginatorri   rM   countZshow_full_result_countrC   rN   r_   Z_clonepager\   Zobject_listr   r   result_countr   Zshow_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)r/   ro   r   r   r   r   r   r   r4   r4   r5   rj   3  s4   





zChangeList.get_resultsc                 C   s,   g }| j jr| j j}|S | jjr| jj}|S r   )rO   orderingrA   )r/   r   r4   r4   r5   _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.
        fgetZadmin_order_fieldN)rA   	get_fieldnamer   r   hasattrrO   getattrr>   r   propertyr   )r/   
field_namer   attrr4   r4   r5   get_ordering_fieldc  s   zChangeList.get_ordering_fieldc              
   C   s.  | j }t| j|p|  }t|v rg }|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.
        .-Zresolve_expression)rc   r   rO   get_orderingr   	ORDER_VARsplit
rpartitionrD   rZ   r   r   r   rr   Zreverse_orderingr   r   descascr   removeprefix
IndexErrorr]   extendrY   order_by_get_deterministic_ordering)r/   ro   ri   rc   r   Zorder_paramsr%   nonepfxidxr   Zorder_fieldr4   r4   r5   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 rqz|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.
        rl   c                 S   s   h | ]}|j r|js|jqS r4   )uniquenullrm   .0r   r4   r4   r5   	<setcomp>  s    z9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nr   c                 s       | ]}|j V  qd S r   )r.   )r   
constraintr4   r4   r5   	<genexpr>  s
    
z9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                    s   g | ]} j |qS r4   )rA   r   )r   r   rp   r4   r5   
<listcomp>  s    z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c                 s   r   r   )r   r   r4   r4   r5   r         c                 s   r   r   )rm   r   r4   r4   r5   r     r   z-pk)r   setrA   r.   r   strlstripr   r   r   
expressionr   r   remote_fieldrm   addZunique_togetherZtotal_unique_constraintsany
issupersetr   )
r/   r   ordering_fieldsZtotal_ordering_fieldspartr   r   Zconstraint_field_namesfield_namesr.   r4   rp   r5   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rdnd||
< qc|S )zT
        Return a dictionary of ordering field column numbers and asc/desc.
        r   r   r   r   )r   r   rc   r   r   r   r   r   r   Z
descendingr   r   r   	enumeraterD   r   r   r   rZ   r]   )r/   r   r   r   Z
order_typeindexr   r%   r   r   r   r4   r4   r5   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   rG   rH   rC   Zexpected_parametersri   r   filterr   r   	Exceptionr   rY   select_relatedapply_select_relatedr   r   rO   Zget_search_resultsrg   ru   rI   Zdistinct)r/   ro   Zexclude_parametersZremaining_lookup_paramsZfilters_may_have_duplicatesqsZfilter_specZnew_qsZq_objectr'   r   Zsearch_may_have_duplicatesr4   r4   r5   rB     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)rL   r   !has_related_field_in_list_display)r/   r   r4   r4   r5   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   )rD   rA   r   r   r   r   r   Zget_attname)r/   r   r   r4   r4   r5   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)r0   Zcurrent_app)
r   rn   r   r@   Z	app_labelZ
model_namer   rO   Z
admin_siter   )r/   resultrl   r4   r4   r5   url_for_resultk  s   zChangeList.url_for_resultr   )NN)r6   r7   r8   r(   rR   r,   rq   ru   r   rg   rj   r   r   r   r   r   rB   r   r   r   r4   r4   r4   r5   r:   C   s"    U

r(/A
(?r:   )<r|   r   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   r   r   Zdjango.contrib.admin.utilsr   r   r   r   r   Zdjango.core.exceptionsr   r   r   Zdjango.core.paginatorr   Zdjango.db.modelsr   r   r   r   Zdjango.db.models.expressionsr   Zdjango.urlsr   Zdjango.utils.deprecationr   Zdjango.utils.httpr   Zdjango.utils.inspectr    Zdjango.utils.timezoner!   Zdjango.utils.translationr"   r^   r   r[   r-   rf   rs   ZFormr(   r:   r4   r4   r4   r5   <module>   sB    
	