o
    <g
e                     @   sp  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 dl3m4Z4 dZ5dZ6dZ7dZ8dZ9e5e6e8eeefZ:G dd dej;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)
LOOKUP_SEP)
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__ R/var/www/html/venv/lib/python3.10/site-packages/django/contrib/admin/views/main.pyr-   <   s   
zChangeListSearchForm.__init__)__name__
__module____qualname__r-   __classcell__r6   r6   r4   r7   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.)removeTr6   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)r1   requestr@   rF   rG   rH   rL   rM   rN   rO   rP   rw   rQ   rT   rU   _search_formr[   rm   r|   r6   r6   r7   r-   G   s~   





zChangeList.__init__c                 C   s   d| j j| jj| jj jf S )Nz<%s: model=%s model_admin=%s>)r5   r:   r@   rQ   r1   r6   r6   r7   __repr__   s
   zChangeList.__repr__Nc                 C   s.   |p| j }| }tD ]	}||v r||= q|S )z:
        Return all params except IGNORED_PARAMS.
        )rr   copyIGNORED_PARAMS)r1   rp   lookup_paramsignoredr6   r6   r7   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 )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!   rQ   lookup_allowedwarningswarnr5   r:   r   ro   r   rH   lencallabler@   
isinstancetuplelistr   creater   r   r   rC   
has_outputappendrL   popr   r`   rc   r   r   replacer   r   USE_TZr"   updater   boolr   )r1   r   r   may_have_duplicatesrJ   supports_requestkey
value_listvaluerp   filter_specsrH   lookup_params_countspecr   fieldfield_list_filter_classr   monthr   	from_dater(   to_dater6   r6   r7   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)rr   r   r   
startswithro   r    sorted)r1   
new_paramsr?   r&   rkvr6   r6   r7   rt   "  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)rQ   get_paginatorrx   rO   countshow_full_result_countrE   rP   re   _clonepagerb   object_listr   r   result_countr   show_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)r1   r   r   r   r   r   r   r   r6   r6   r7   ry   4  s4   





zChangeList.get_resultsc                 C   s,   g }| j jr| j j}|S | jjr| jj}|S r   )rQ   orderingrC   )r1   r   r6   r6   r7   _get_default_ordering\  s   z ChangeList._get_default_orderingc                 C   s   z
| j |}|jW S  tyU   t|r|}n(t| j|r%t| j|}nzt| j|}W n t	y?   t
|v r>| Y  Y S  w t|trMt|drM|j}t|dd Y S w )a  
        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, possibly across relations, 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)rC   	get_fieldnamer   r   hasattrrQ   getattrr@   AttributeErrorr   r   propertyr   )r1   
field_namer   attrr6   r6   r7   get_ordering_fieldd  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.
        .-resolve_expression)rp   r   rQ   get_orderingr   	ORDER_VARsplit
rpartitionrF   r`   r   r   r   r   reverse_orderingr   r   descascr   removeprefix
IndexErrorrc   extendr_   order_by_get_deterministic_ordering)r1   r   rx   rp   r   order_paramsr&   nonepfxidxr   order_fieldr6   r6   r7   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.
        r}   c                 S   s   h | ]}|j r|js|jqS r6   )uniquenullr~   .0r   r6   r6   r7   	<setcomp>  s    z9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nr   c                 s       | ]}|j V  qd S r   )r0   )r   
constraintr6   r6   r7   	<genexpr>  s
    
z9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                    s   g | ]} j |qS r6   )rC   r   )r   r   r   r6   r7   
<listcomp>  s    z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c                 s   r   r   )r   r   r6   r6   r7   r         c                 s   r   r   )r~   r   r6   r6   r7   r     r   z-pk)r   setrC   r0   r   strlstripr   r   r   
expressionr   r   remote_fieldr~   addunique_togethertotal_unique_constraintsany
issupersetr   )
r1   r   ordering_fieldstotal_ordering_fieldspartr   r   constraint_field_namesfield_namesr0   r6   r   r7   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   rp   r   r   r   r   r   r   
descendingr   r   r   	enumeraterF   r   r   r   r`   rc   )r1   r   r   r   
order_typeindexr   r&   r   r   r   r6   r6   r7   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   rI   rJ   rE   expected_parametersrx   r   filterr   r   	Exceptionr   r_   select_relatedapply_select_relatedr   r   rQ   get_search_resultsrt   r   rK   distinct)r1   r   exclude_parametersremaining_lookup_paramsfilters_may_have_duplicatesqsfilter_specnew_qsq_objectr(   r   search_may_have_duplicatesr6   r6   r7   rD     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)rN   r  !has_related_field_in_list_display)r1   r  r6   r6   r7   r  X  s   

zChangeList.apply_select_relatedc              	   C   sP   | j D ]"}z| j|}W n	 ty   Y qw t|jtr%||jkr% dS qdS r  )rF   rC   r   r   r   r   r   r~   )r1   r   r   r6   r6   r7   r  d  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)r2   current_app)
r   r   r   rB   	app_label
model_namer   rQ   
admin_siter   )r1   resultr}   r6   r6   r7   url_for_resultq  s   zChangeList.url_for_resultr   )NN)r8   r9   r:   r)   rV   r-   r   r   r   rt   ry   r   r   r   r   r   rD   r  r  r  r6   r6   r6   r7   r<   D   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.constantsr   django.db.models.expressionsr   django.urlsr   django.utils.deprecationr   django.utils.httpr    django.utils.inspectr!   django.utils.timezoner"   django.utils.translationr#   rd   r   ra   r.   rs   r   Formr)   r<   r6   r6   r6   r7   <module>   sD    
	