o
    [h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   Z	CharFieldfields)selfargskwargs	__class__ /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/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 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.)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_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)r0   requestr?   rE   rF   rG   rK   rL   rM   rN   rO   ri   rP   rQ   rR   Z_search_formrW   ra   rl   r5   r5   r6   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>)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.
        )rf   copyIGNORED_PARAMS)r0   rd   lookup_paramsZ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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 )NFrp   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)*rv   r!   rP   Zlookup_allowedwarningswarnr4   r9   r   rc   r   rG   lencallabler?   
isinstancetuplelistr   creater   r   r   rB   Z
has_outputappendrK   popr   r[   r^   r   r   replacer|   r   ZUSE_TZr"   updater   boolr   )r0   rp   ru   Zmay_have_duplicatesrI   Zsupports_requestkeyZ
value_listvaluerd   filter_specsrG   Zlookup_params_countspecrx   fieldZfield_list_filter_classr|   monthr{   Z	from_dater(   Z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)rf   rs   r   
startswithrc   r    sorted)r0   
new_paramsr>   r&   rkvr5   r5   r6   rh   "  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   Zget_paginatorrj   rN   countZshow_full_result_countrD   rO   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)r0   rp   r   r   r   r   r   r   r5   r5   r6   rk   4  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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.
        fgetZadmin_order_fieldN)rB   	get_fieldnamer   r   hasattrrP   getattrr?   AttributeErrorr   r   propertyr   )r0   
field_namer   attrr5   r5   r6   get_ordering_fieldd  s&   zChangeList.get_ordering_fieldc              
   C   s0  | j }t| j|p|  }|trg }|t d}|D ]l}z_|d\}}}	| j	t
|	 }
| |
}|s:W qt|trQ|dkrK| }|  || n.t|drf||dkr`| n|  n|dkrx||rx||| 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)rd   r   rP   get_orderingr   rY   	ORDER_VARsplit
rpartitionrE   r[   r   r   r   rs   Zreverse_orderingr   r   descascr   removeprefix
IndexErrorr^   extendrZ   order_by_get_deterministic_ordering)r0   rp   rj   rd   r   Zorder_paramsr&   nonepfxidxr   Z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 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.
        rm   c                 S   s   h | ]}|j r|js|jqS r5   )uniquenullrn   .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   rq   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   )rn   r   r5   r5   r6   r     r   z-pk)r   setrB   r/   r   strlstripr   r   r   
expressionr   r   remote_fieldrn   addZunique_togetherZtotal_unique_constraintsany
issupersetr   )
r0   r   ordering_fieldsZtotal_ordering_fieldspartr   r   Zconstraint_field_namesfield_namesr/   r5   rq   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rdnd||
< qc|S )zT
        Return a dictionary of ordering field column numbers and asc/desc.
        r   r   r   r   )r   r   rd   r   r   r   r   r   r   Z
descendingr   r   r   	enumeraterE   r   r   r   r[   r^   )r0   r   r   r   Z
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   Zexpected_parametersrj   r   filterr   r   	Exceptionr   rZ   select_relatedapply_select_relatedr   r   rP   Zget_search_resultsrh   rv   rJ   Zdistinct)r0   rp   Zexclude_parametersZremaining_lookup_paramsZfilters_may_have_duplicatesqsZfilter_specZnew_qsZq_objectr(   r   Z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   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   )rE   rB   r   r   r   r   r   rn   )r0   r   r   r5   r5   r6   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)r1   Zcurrent_app)
r   ro   r   rA   Z	app_labelZ
model_namer   rP   Z
admin_siter   )r0   resultrm   r5   r5   r6   url_for_resultq  s   zChangeList.url_for_resultr   )NN)r7   r8   r9   r)   rS   r-   rr   rv   r   rh   rk   r   r   r   r   r   rC   r   r   r   r5   r5   r5   r6   r;   D   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.constantsr   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.   rg   rt   ZFormr)   r;   r5   r5   r5   r6   <module>   sD    
	