o
    ^"<fY                     @   sD  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Z1dZ2e-e.e/e1eefZ3G dd dej4Z5G dd dZ6dS )    )datetime	timedelta)forms)settings)messages)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)ExistsFFieldManyToOneRelOrderByOuterRef)
Combinable)reverse)	urlencode)
make_aware)gettextalloot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__ V/var/www/html/kck/venv/lib/python3.10/site-packages/django/contrib/admin/views/main.pyr*   (   s   
zChangeListSearchForm.__init__)__name__
__module____qualname__r*   __classcell__r3   r3   r1   r4   r&   '   s    r&   c                   @   s   e Zd Ze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}| sY|j D ]}t|d| qM|jtp`d| _ zt!|jt"d| _#W n t$yz   d| _#Y nw t%|jv | _&t'|jv | _(|jt)}|r|*||st+d| || _,t-|j. | _/t"| j/v r| j/t"= t0| j/v r| j/t0= | j(rd| _1n|| _1| || _2| 3| | j(rt4d}n| j5|rt4d}nt4d}|| jj6 | _7| jj8j9| _:d S )	Nz,     z"The field %s cannot be referenced.r3   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_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<   rB   rC   rD   rH   rI   rJ   rK   rL   rh   rM   rP   _search_formrV   rc   rm   r3   r3   r4   r*   3   sf   





zChangeList.__init__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ignoredr3   r3   r4   get_filters_paramsn   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rd}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)$rw   re   rM   lookup_allowedr   rD   lencallabler<   
isinstancetuplelistr   creater   r   r   r?   
has_outputappendrH   popr   r[   r^   r   r   replacer}   r   USE_TZr   updater   boolr   )r.   rq   ru   may_have_duplicatesrF   keyvaluefilter_specsrD   lookup_params_countspecry   fieldfield_list_filter_classr}   monthr|   	from_dater%   to_dater3   r3   r4   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   rs   r   
startswithre   r   sorted)r.   
new_paramsremover#   rkvr3   r3   r4   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)rM   get_paginatorri   rK   countshow_full_result_countrA   rL   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   r3   r3   r4   rj      s,   



zChangeList.get_resultsc                 C   s,   g }| j jr| j j}|S | jjr| jj}|S r   )rM   orderingr?   )r.   r   r3   r3   r4   _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)r?   	get_fieldnamer   r   hasattrrM   getattrr<   r   propertyr   )r.   
field_namer   attrr3   r3   r4   get_ordering_field  s   zChangeList.get_ordering_fieldc              
   C   s0  | j }t| j|p|  }t|v rg }|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   rM   get_orderingr   	ORDER_VARsplit
rpartitionrB   r[   r   r   r   rs   reverse_orderingr   r   descascr   
IndexErrorr^   extendrZ   order_by_get_deterministic_ordering)r.   rq   ri   rf   r   order_paramsr#   nonepfxidxr   order_fieldr3   r3   r4   r   )  s8   	


 
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.
        rn   c                 S   s   h | ]}|j r|js|jqS r3   )uniquenullro   .0r   r3   r3   r4   	<setcomp>]  s    z9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nr   c                 s       | ]}|j V  qd S r   )r-   )r   
constraintr3   r3   r4   	<genexpr>~  s
    
z9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                    s   g | ]} j |qS r3   )r?   r   )r   r   r.   r3   r4   
<listcomp>  s    z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c                 s   r   r   )r   r   r3   r3   r4   r         c                 s   r   r   )ro   r   r3   r3   r4   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-   r3   r   r4   r   T  sV   




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rd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   	enumeraterB   r   r   r   r[   r^   )r.   r   r   r   
order_typeindexr   r#   r   r   r   r3   r3   r4   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   r3   )r   r   rE   rF   rA   ri   filterr   r   	Exceptionr   rM   get_search_resultsrZ   r   rw   rG   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   r3   r3   r4   r@     sH   
	

zChangeList.get_querysetc                 C   sB   | j du r	| S | j du r|  r| S | j r|j| j  S |S NTF)rJ   r   !has_related_field_in_list_display)r.   r   r3   r3   r4   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   )rB   r?   r   r   r   r   r   get_attname)r.   r   r   r3   r3   r4   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)r/   current_app)
r   rp   r   r>   	app_label
model_namer   rM   
admin_siter   )r.   resultrn   r3   r3   r4   url_for_result  s   
zChangeList.url_for_resultr   )NN)r5   r6   r7   r&   rQ   r*   rw   r   r   rj   r   r   r   r   r   r@   r   r   r   r3   r3   r3   r4   r9   0   s     
;
[!+>(9r9   N)7r   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   ORDER_TYPE_VARr\   r+   rg   rt   Formr&   r9   r3   r3   r3   r4   <module>   s4     	