a
    xdY                     @   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  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Z.dZ/dZ0e+e,e-e/eefZ1G dd dej2Z3G dd dZ4d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)FFieldManyToOneRelOrderBy)
Combinable)reverse)	urlencode)
make_aware)gettextalloZ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   Z	CharFieldfields)selfargskwargs	__class__ W/var/www/html/Ranjet/env/lib/python3.9/site-packages/django/contrib/admin/views/main.pyr'   (   s    zChangeListSearchForm.__init__)__name__
__module____qualname__r'   __classcell__r/   r/   r-   r0   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}| s|j D ]}t|d| q|jtpd| _ zt!|jt"d| _#W n t$y   d| _#Y n0 t%|jv | _&t'|jv | _(|jt)}|r:|*||s:t+d| || _,t-|j. | _/t"| j/v rd| j/t"= t0| j/v rx| j/t0= | j(rd| _1n|| _1| || _2| 3| | j(rt4d}n | j5|rt4d}nt4d}|| jj6 | _7| jj8j9| _:d S )	Nz,  r   z"The field %s cannot be referenced.r/   z	Select %szSelect %s to changezSelect %s to view);modelZ_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_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_popupr   Zto_field_allowedr	   to_fielddictitemsparams
ERROR_FLAGlist_editablequerysetget_resultsr   Zhas_change_permissionZverbose_nametitlepkattname
pk_attname)r*   requestr7   r<   r=   r>   rB   rC   rD   rE   rF   r\   rG   rH   Z_search_formrM   rW   r_   r/   r/   r0   r'   3   sd    


zChangeList.__init__Nc                 C   s.   |p| j }| }tD ]}||v r||= q|S )z:
        Return all params except IGNORED_PARAMS.
        )rZ   copyIGNORED_PARAMS)r*   rZ   lookup_paramsZignoredr/   r/   r0   get_filters_paramsn   s    
zChangeList.get_filters_paramsc              
   C   s  |   }d}d}| D ]"\}}| j||std| qg }| jD ]}t|}	t|rn|||| j| j}
nzd }t	|t
tfr|\}}n|tj }}t	|ts|}t| j|d }||||| j| j|d}
|	t|kr|pt| j|}|
rF|
 rF||
 |	t|krFd}qF| jr>|d| j d }|d ur>|d| j d }|d| j d }z8tt|t|d urr|nd	t|d ur|nd	}W n0 ty } zt||W Y d }~n
d }~0 0 |r|td	d
 }n0|r|tdd
 jd	d}n|j|jd	 d}tjr t|}t|}| d| j |d| j |i zH| D ]*\}}t!||||< |pnt| j|}qH|t"||||fW S  t#y } zt||W Y d }~n
d }~0 0 d S )NFzFiltering by %s not allowed)
field_pathTz%s__yearz	%s__monthz%s__day   )days    )day)yearz%s__gtez%s__lt)$rg   rY   rG   Zlookup_allowedr   r>   lencallabler7   
isinstancetuplelistr   creater   r   r   r9   Z
has_outputappendrB   popr   rQ   rT   r   r   replacern   r   ZUSE_TZr   updater   boolr   )r*   rc   rf   Zuse_distinctr@   keyvaluefilter_specsr>   Zlookup_params_countspecri   fieldZfield_list_filter_classrn   monthrm   Z	from_dater"   Zto_dater/   r/   r0   get_filters{   s|    





 

zChangeList.get_filtersc                 C   s   |d u ri }|d u rg }| j  }|D ]"}t|D ]}||r2||= q2q&| D ](\}}|d u rr||v rz||= qR|||< qRdtt|  S )Nz?%s)rZ   rd   rs   
startswithrY   r   sorted)r*   
new_paramsremover    rkvr/   r/   r0   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rP|sT|s`| j	 }n.z|
| jd j}W n ty   tY n0 || _| j j| _| j pt|| _|| _|| _|| _|| _|| _d S )Nrj   )rG   Zget_paginatorr]   rE   countZshow_full_result_countr;   rF   rV   Z_clonepagerS   Zobject_listr   r   result_country   Zshow_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)r*   rc   r   r   r   r   r   r   r/   r/   r0   r^      s*    



zChangeList.get_resultsc                 C   s*   g }| j jr| j j}n| jjr&| jj}|S N)rG   orderingr9   )r*   r   r/   r/   r0   _get_default_ordering	  s    
z ChangeList._get_default_orderingc                 C   s   z| j |}|jW S  ty   t|r0|}n&t| j|rJt| j|}nt| j|}t	|t
rpt|drp|j}t|dd Y S 0 dS )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)r9   	get_fieldnamer   rp   hasattrrG   getattrr7   rq   propertyr   )r*   
field_namer~   attrr/   r/   r0   get_ordering_field  s    zChangeList.get_ordering_fieldc              
   C   s:  | j }t| j|p|  }t|v r"g }|t d}|D ]}z|d\}}}	| jt	|	 }
| 
|
}|stW q>t|tr|dkr| }|  || n^t|dr||dkr| n|  n4|dr|dkr||dd  n|||  W q> ttfy   Y q>Y q>0 q>||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_expressionrj   N)rZ   rs   rG   get_orderingr   	ORDER_VARsplit
rpartitionr<   rQ   r   rq   r   rd   Zreverse_orderingru   r   descascr   
IndexErrorrT   extendrP   order_by_get_deterministic_ordering)r*   rc   r]   rZ   r   Zorder_paramsr    nonepfxidxr   Zorder_fieldr/   r/   r0   r   )  s4    	



 zChangeList.get_orderingc           
   	      sN  t |}t }dhdd  jjD B }|D ]}d}t|trH|d}n0t|trZ|j}nt|t	rxt|j
trx|j
j}|r*z j|}W n ty   Y q*Y n0 |jr||jkrq*|j|v r qJ||j q*g  jjdd  jjD R }|D ]F} fdd	|D }	td
d |	D r$q|dd |	D r qJq|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 r/   )uniquenullra   .0r~   r/   r/   r0   	<setcomp>]  s   z9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nr   c                 s   s   | ]}|j V  qd S r   )r)   )r   
constraintr/   r/   r0   	<genexpr>~  s   z9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                    s   g | ]} j |qS r/   )r9   r   )r   r   r*   r/   r0   
<listcomp>      z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c                 s   s   | ]}|j V  qd S r   )r   r   r/   r/   r0   r     r   c                 s   s   | ]}|j V  qd S r   )ra   r   r/   r/   r0   r     r   z-pk)rs   setr9   r)   rq   strlstripr   r   r   
expressionr   r   remote_fieldra   addZunique_togetherZtotal_unique_constraintsany
issupersetru   )
r*   r   ordering_fieldsZtotal_ordering_fieldspartr   r~   Zconstraint_field_namesfield_namesr)   r/   r   r0   r   T  sL    





z&ChangeList._get_deterministic_orderingc              	   C   s  |   }i }t| jvr|D ]}t|ttfrft|ts>| }t|jtr|j	rTdnd}|jj
}qqn |dr|dd }d}nd}t| jD ]"\}}| ||kr|||<  qqqn`| jt dD ]N}|d\}}	}
zt|
}
W n ty   Y qY n0 |	dkrdnd||
< q|S )zT
        Return a dictionary of ordering field column numbers and asc/desc.
        r   r   r   rj   Nr   )r   r   rZ   rq   r   r   r   r   r   Z
descendingr   r   	enumerater<   r   r   r   rQ   rT   )r*   r   r   r~   Z
order_typeindexr   r    r   r   r   r/   r/   r0   get_ordering_field_columns  s6    





z%ChangeList.get_ordering_field_columnsc           
   
   C   s  |  |\| _| _}}| _| j}| jD ]}|||}|d ur&|}q&z|jf i |}W nB ttfyp    Y n, t	y } zt
|W Y d }~n
d }~0 0 |jjs| |}| ||}|j| }| j||| j\}}	| j||  d| _||	B r | S |S d S )N)r   r   )r   r|   r?   r@   r;   r]   filterr   r   	Exceptionr   rP   select_relatedapply_select_relatedr   r   rG   Zget_search_resultsr   rg   rA   Zdistinct)
r*   rc   Zremaining_lookup_paramsZfilters_use_distinctqsZfilter_specZnew_qsr"   r   Zsearch_use_distinctr/   r/   r0   r:     s<    



zChangeList.get_querysetc                 C   sB   | j du r| S | j du r,|  r,| S | j r>|j| j  S |S NTF)rD   r   !has_related_field_in_list_display)r*   r   r/   r/   r0   r     s    

zChangeList.apply_select_relatedc              	   C   sR   | j D ]F}z| j|}W n ty,   Y q0 t|jtr|| kr dS qdS r   )r<   r9   r   r   rq   r   r   Zget_attname)r*   r   r~   r/   r/   r0   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+   Zcurrent_app)
r   rb   r   r8   Z	app_labelZ
model_namer   rG   Z
admin_siter   )r*   resultr`   r/   r/   r0   url_for_result	  s    
zChangeList.url_for_result)N)NN)r1   r2   r3   r#   rI   r'   rg   r   r   r^   r   r   r   r   r   r:   r   r   r   r/   r/   r/   r0   r5   0   s   ;
[
!+>(6r5   N)5r   r   Zdjangor   Zdjango.confr   Zdjango.contribr   Zdjango.contrib.adminr   Zdjango.contrib.admin.exceptionsr   r	   Zdjango.contrib.admin.optionsr
   r   r   Zdjango.contrib.admin.utilsr   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.httpr   Zdjango.utils.timezoner   Zdjango.utils.translationr   rU   r   ZORDER_TYPE_VARrR   r(   r[   re   ZFormr#   r5   r/   r/   r/   r0   <module>   s2   	