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   Ú	CharFieldÚfields)ÚselfÚargsÚkwargs©Ú	__class__© ú_/var/www/html/premium_crap/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 ošt.|jv | _/|j*t+j-u | _0|j t1¡}|r·| 2||¡s·t3d| ƒ‚|| _4t5|j 6¡ ƒ| _7t5|j 8¡ ƒ| _9t#| j7v r×| j7t#= | j9t#= t:| j7v rä| j7t:= | j9t:= | j;t.gd�| _<|  ;t.di¡| _=| j)rûd| _>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r®d	}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   s0  | j }t| j |¡p|  ¡ ƒ}| t¡rŒg }|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.
        Ú.ú-Úresolve_expression)rp   r–   rQ   Úget_orderingrÃ   r^   Ú	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 ƒƒr�qz| 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rƒd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    ú
	