o
    µ„jmW  ã                   @   s$  d dl Z d dlZd dl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 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m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' d dl&m(Z) dd„ dD ƒZ*dd„ e* +¡ D ƒZ,e#dd -dd„ e,D ƒ¡ ƒZ.G dd„ de/ƒZ0dd„ Z1dd „ Z2dOd"d#„Z3d$d%„ Z4d&d'„ Z5d(d)„ Z6d*d+„ Z7d,d-„ Z8d.d/„ Z9G d0d1„ d1eƒZ:d2d3„ Z;dPd4d5„Z<dPd6d7„Z=d8d9„ Z>dQd;d<„Z?d=d>„ Z@dRd?d@„ZAdRdAdB„ZBG dCdD„ dDe/ƒZCdEdF„ ZDdGdH„ ZEdIdJ„ ZFdKdL„ ZGdMdN„ ZHdS )Sé    N)Údefaultdict)Úreduce)Úor_)ÚFieldDoesNotExistÚValidationError)ÚEMPTY_VALUESÚURLValidator)ÚmodelsÚrouter)Ú
LOOKUP_SEP)Ú	Collector)Úpretty_name)ÚNoReverseMatchÚreverse)ÚformatsÚtimezone)Úmake_hashable)Úformat_html)Ú_lazy_re_compile)Úcapfirst)Úngettext)Úoverridec                 C   s   i | ]}|d | “qS )z_%02X© )Ú.0Úir   r   úX/var/www/html/django_cbt/venv/lib/python3.10/site-packages/django/contrib/admin/utils.pyÚ
<dictcomp>   s    r   s   ":/_#?;@&=+$,"[]<>%
\c                 C   s   i | ]	\}}|t |ƒ“qS r   )Úchr)r   ÚkÚvr   r   r   r      ó    z_(?:%s)ú|c                 C   s   g | ]}|d d… ‘qS )é   Nr   )r   Úxr   r   r   Ú
<listcomp>   s    r$   c                   @   s   e Zd ZdZdS )ÚFieldIsAForeignKeyColumnNamez/A field is a foreign key attname, i.e. <FK>_id.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r%      s    r%   c              	   C   s|   |  t¡}|D ]4}|dkr| jj}z|  |¡}W n	 ty!   Y qw t|dƒr;|j}|d j} t	dd„ |D ƒƒr; dS qdS )zA
    Return True if the given lookup path spawns duplicates.
    ÚpkÚ
path_infoséÿÿÿÿc                 s   s   � | ]}|j V  qd S ©N)Úm2m)r   Úpathr   r   r   Ú	<genexpr>5   s   € z+lookup_spawns_duplicates.<locals>.<genexpr>TF)
Úsplitr   r*   ÚnameÚ	get_fieldr   Úhasattrr+   Úto_optsÚany)ÚoptsÚlookup_pathÚlookup_fieldsÚ
field_nameÚfieldÚ	path_infor   r   r   Úlookup_spawns_duplicates"   s    
þ

€r=   c                 C   s    |   |¡}t|tƒr|d S |S )Nr,   )ÚgetÚ
isinstanceÚlist)Ú
parametersÚkeyÚvaluer   r   r   Úget_last_value_from_parameters<   s   
rD   ú,c                    sP   t |tƒr‡ ‡fdd„|D ƒS ˆ  d¡r| ˆ¡}|S ˆ  d¡r&| ¡ dv}|S )zJ
    Return a lookup value prepared to be used in queryset filtering.
    c                    s   g | ]	}t ˆ |ˆd �‘qS ))Ú	separator)Úprepare_lookup_value©r   r   ©rB   rF   r   r   r$   F   r    z(prepare_lookup_value.<locals>.<listcomp>Ú__inÚ__isnull)Ú ÚfalseÚ0)r?   r@   Úendswithr1   Úlower)rB   rC   rF   r   rI   r   rG   A   s   



þrG   c                    s:   t  ¡ }|  ¡ D ]\‰ }|tt‡ fdd„|D ƒƒM }q|S )Nc                 3   s   � | ]
}t  ˆ |f¡V  qd S r-   )r	   ÚQ)r   Úitem©Úparamr   r   r0   S   s   € z8build_q_object_from_lookup_parameters.<locals>.<genexpr>)r	   rQ   Úitemsr   r   )rA   Úq_objectÚparam_item_listr   rS   r   Ú%build_q_object_from_lookup_parametersP   s   rX   c                 C   s   t | tƒr
|  t¡S | S )a*  
    Ensure that primary key values do not confuse the admin URLs by escaping
    any '/', '_' and ':' and similarly problematic characters.
    Similar to urllib.parse.quote(), except that the quoting is slightly
    different so that it doesn't get automatically unquoted by the web browser.
    )r?   ÚstrÚ	translateÚ	QUOTE_MAP©Úsr   r   r   ÚquoteW   s   r^   c                 C   s   t  dd„ | ¡S )zUndo the effects of quote().c                 S   s   t | d  S )Nr   )ÚUNQUOTE_MAP)Úmr   r   r   Ú<lambda>c   s    zunquote.<locals>.<lambda>)Ú
UNQUOTE_REÚsubr\   r   r   r   Úunquotea   s   rd   c                 C   s6   g }| D ]}t |ttfƒr| |¡ q| |¡ q|S )zS
    Return a list which is a single level of flattening of the original list.
    )r?   r@   ÚtupleÚextendÚappend)ÚfieldsÚflatr;   r   r   r   Úflattenf   s   rj   c                 C   s(   g }| D ]\}}|  t|d ƒ¡ q|S )z?Return a list of field names from an admin fieldsets structure.rh   )rf   rj   )Ú	fieldsetsÚfield_namesr2   r7   r   r   r   Úflatten_fieldsetss   s   rm   c           	         s¦   z| d }W n t y   g i tƒ g f Y S w t |jj¡}t|| d�}| | ¡ tƒ ‰‡ ‡‡fdd„‰| ˆ¡}‡fdd„|j	D ƒ}dd„ |j
 ¡ D ƒ}||ˆ|fS )	a  
    Find all objects related to ``objs`` that should also be deleted. ``objs``
    must be a homogeneous iterable of objects (e.g. a QuerySet).

    Return a nested list of strings suitable for display in the
    template with the ``unordered_list`` filter.
    r   )ÚusingÚoriginc                    sž   | j }| j}dt|jƒ| f }ˆ  |¡rMˆ  |¡ ˆ| ¡s#ˆ |j¡ ztdˆ j	|j
|jf d t| jƒfƒ}W n tyB   | Y S w tdt|jƒ|| ƒS |S )Nz%s: %sz%s:%s_%s_changez{}: <a href="{}">{}</a>)Ú	__class__Ú_metar   Úverbose_nameÚis_registeredÚget_model_adminÚhas_delete_permissionÚaddr   r2   Ú	app_labelÚ
model_namer^   r*   r   r   )ÚobjÚmodelr7   Úno_edit_linkÚ	admin_url)Ú
admin_siteÚperms_neededÚrequestr   r   Úformat_callback�   s.   

ÿÿ
üþÿz,get_deleted_objects.<locals>.format_callbackc                    s   g | ]}ˆ |ƒ‘qS r   r   )r   ry   )r€   r   r   r$   ®   s    z'get_deleted_objects.<locals>.<listcomp>c                 S   s   i | ]\}}|j jt|ƒ“qS r   )rq   Úverbose_name_pluralÚlen)r   rz   Úobjsr   r   r   r   ¯   s    ÿÿz'get_deleted_objects.<locals>.<dictcomp>)Ú
IndexErrorÚsetr
   Údb_for_writerq   rz   ÚNestedObjectsÚcollectÚnestedÚ	protectedÚ
model_objsrU   )	rƒ   r   r}   ry   rn   Ú	collectorÚ	to_deleterŠ   Úmodel_countr   )r}   r€   r~   r   r   Úget_deleted_objects{   s    ÿ

þr�   c                       sX   e Zd Z‡ fdd„Zdd„ Zd‡ fdd„	Z‡ fdd	„Zd
d„ Zddd„Zdd„ Z	‡  Z
S )r‡   c                    s.   t ƒ j|i |¤Ž i | _tƒ | _ttƒ| _d S r-   )ÚsuperÚ__init__Úedgesr…   rŠ   r   r‹   ©ÚselfÚargsÚkwargs©rp   r   r   r‘   ¸   s   zNestedObjects.__init__c                 C   s   | j  |g ¡ |¡ d S r-   )r’   Ú
setdefaultrg   )r”   ÚsourceÚtargetr   r   r   Úadd_edge¾   s   zNestedObjects.add_edgeNc              
      sè   |D ].}|r |  d¡s ||jj|jjdœ }|  t||ƒ|¡ n|  d |¡ | j|jj  |¡ qzt	ƒ j
|fd|i|¤ŽW S  tjyY } z| j |j¡ W Y d }~d S d }~w tjys } z| j |j¡ W Y d }~d S d }~ww )Nú+)Úclassrw   Úsource_attr)rO   rq   rx   rw   r›   Úgetattrr‹   rz   rv   r�   rˆ   r	   ÚProtectedErrorrŠ   ÚupdateÚprotected_objectsÚRestrictedErrorÚrestricted_objects)r”   rƒ   r™   rž   r–   ry   Úrelated_nameÚer—   r   r   rˆ   Á   s$   þ€€ÿzNestedObjects.collectc                    s$   t ƒ  |||¡}|jdd„ |D ƒŽ S )Nc                 S   s   g | ]}|j ‘qS r   )r2   )r   Úrelated_fieldr   r   r   r$   Ö   s    z1NestedObjects.related_objects.<locals>.<listcomp>)r�   Úrelated_objectsÚselect_related)r”   Úrelated_modelÚrelated_fieldsrƒ   Úqsr—   r   r   r¨   Ó   s   ÿzNestedObjects.related_objectsc                 C   sj   ||v rg S |  |¡ g }| j |d¡D ]}| |  |||¡¡ q|r)||ƒg}n|g}|r3| |¡ |S )Nr   )rv   r’   r>   rf   Ú_nestedrg   )r”   ry   Úseenr€   ÚchildrenÚchildÚretr   r   r   r­   Ù   s   

zNestedObjects._nestedc                 C   s6   t ƒ }g }| j dd¡D ]}| |  |||¡¡ q|S )z4
        Return the graph as a nested list.
        Nr   )r…   r’   r>   rf   r­   )r”   r€   r®   ÚrootsÚrootr   r   r   r‰   è   s
   zNestedObjects.nestedc                 O   s   dS )z�
        We always want to load the objects into memory so that we can display
        them to the user in confirm page.
        Fr   r“   r   r   r   Úcan_fast_deleteò   s   zNestedObjects.can_fast_delete)NNr-   )r&   r'   r(   r‘   r›   rˆ   r¨   r­   r‰   r´   Ú__classcell__r   r   r—   r   r‡   ·   s    

r‡   c                 C   sF   t | tjtjjfƒr| j}nt | tjjƒr| jj}n| }|j	|j
dœS )zË
    Return a `dict` with keys 'verbose_name' and 'verbose_name_plural',
    typically for use with string formatting.

    `obj` may be a `Model` instance, `Model` subclass, or `QuerySet` instance.
    )rr   r�   )r?   r	   ÚModelÚbaseÚ	ModelBaserq   ÚqueryÚQuerySetrz   rr   r�   )ry   r7   r   r   r   Úmodel_format_dictú   s   
þr»   c                 C   sN   t | tjjƒr|du r|  ¡ }| j} t| ƒ}|d |d }}t|||p%dƒS )a-  
    Return the appropriate `verbose_name` or `verbose_name_plural` value for
    `obj` depending on the count `n`.

    `obj` may be a `Model` instance, `Model` subclass, or `QuerySet` instance.
    If `obj` is a `QuerySet` instance, `n` is optional and the length of the
    `QuerySet` is used.
    Nrr   r�   r   )r?   r	   r¹   rº   Úcountrz   r»   r   )ry   ÚnÚdÚsingularÚpluralr   r   r   Úmodel_ngettext  s   	rÁ   c           	   	   C   s  |j }zt|| ƒ}W nk ttfyu   t| ƒr| }||ƒ}nSt|| ƒr1| dkr1t|| ƒ}||ƒ}n@tƒ }t|| |ƒ}t|ƒrB|ƒ }n||u r^|}|  t	¡D ]}t|||ƒ}||u r] Y dS qM|}t|dƒrqt|j
| ƒrqt|j
| ƒ}d }Y nw d }t|| ƒ}|||fS )NÚ__str__)NNNrz   )rq   Ú_get_non_gfk_fieldr   r%   Úcallabler4   rŸ   Úobjectr1   r   rz   )	r2   ry   Úmodel_adminr7   ÚfÚattrrC   ÚsentinelÚpartr   r   r   Úlookup_field  s:   


ÿè

rË   c                 C   sR   |   |¡}|jr|jr|jr|jrtƒ ‚|jr'|js't|dƒr'|j|kr't	ƒ ‚|S )a  
    For historical reasons, the admin app relies on GenericForeignKeys as being
    "not found" by get_field(). This could likely be cleaned up.

    Reverse relations should also be excluded as these aren't attributes of the
    model (rather something like `foo_set`).
    Úattname)
r3   Úis_relationÚmany_to_onerª   Úone_to_manyr   Úmany_to_manyr4   rÌ   r%   )r7   r2   r;   r   r   r   rÃ   B  s&   
ÿüüüÿþý
rÃ   Fc           	      C   sÀ  d}zt |j| ƒ}z|j}W n ty   |jjj}Y nw W n¹ tyÉ   | dkr2t|jjƒ}t}n•t| ƒr9| }nZt|| ƒrDt	|| ƒ}nOt|| ƒrOt	|| ƒ}nD|r\| |j
v r\|j
|  }n7z	t|| ƒd }W n- ttfy’   d| › d|jj› �}|rƒ|d|jj› �7 }|rŽ|d|jj› �7 }t|ƒ‚w t|dƒrœ|j}n+t|tƒr±t|dƒr±t|jdƒr±|jj}nt|ƒrÃ|jd	kr½d
}n
t|jƒ}nt| ƒ}Y n ty×   t| ƒ}| }Y nw |rÞ||fS |S )a‘  
    Return a sensible label for a field name. The name can be a callable,
    property (but not created with @property decorator), or the name of an
    object's attribute, as well as a model field, including across related
    objects. If return_attr is True, also return the resolved attribute
    (which could be a callable). This will be None if (and only if) the name
    refers to a field.
    NrÂ   r,   zUnable to lookup 'z' on z or Úshort_descriptionÚfgetz<lambda>z--)rÃ   rq   rr   ÚAttributeErrorrª   r   rY   rÄ   r4   rŸ   rh   Úget_fields_from_pathÚNotRelationFieldÚobject_namerp   r&   rÑ   r?   ÚpropertyrÒ   r   r%   )	r2   rz   rÆ   Úreturn_attrÚformrÈ   r;   ÚlabelÚmessager   r   r   Úlabel_for_field_  sj   	
þ€

ú
ÿþ
ý

€þrÜ   c              	   C   sB   d}zt |j| ƒ}W n ttfy   Y |S w t|dƒr|j}|S )NrL   Ú	help_text)rÃ   rq   r   r%   r4   rÝ   )r2   rz   rÝ   r;   r   r   r   Úhelp_text_for_field¡  s   û
rÞ   c                 C   s¬  ddl m} t|dd ƒr1z
t|jƒ | |¡W S  ty0   t|jƒ}t| ƒ} t|ƒ | |¡ Y S w t|t	j
ƒr;|| ƒS | |jv rB|S t|t	jƒrPt t | ¡¡S t|t	jt	jfƒr^t | ¡S t|t	jƒrkt | |j¡S t|t	jt	jfƒryt | ¡S t|t	jƒrŠ| rŠ|sŠtd| j| ƒS t|t	jƒr°| r°|s°ztƒ | ƒ W n ty©   t| |ƒ Y S w td| | ƒS t|t	jƒrÑ| rÑz
t j!| d|j"d�W S  tyÐ   t| |ƒ Y S w t| |ƒS )Nr   ©Ú_boolean_iconÚflatchoicesz<a href="{}">{}</a>F)Úensure_asciiÚcls)#Ú,django.contrib.admin.templatetags.admin_listrà   rŸ   Údictrá   r>   Ú	TypeErrorr   r?   r	   ÚBooleanFieldÚempty_valuesÚDateTimeFieldr   Úlocalizer   Útemplate_localtimeÚ	DateFieldÚ	TimeFieldÚDecimalFieldÚnumber_formatÚdecimal_placesÚIntegerFieldÚ
FloatFieldÚ	FileFieldr   ÚurlÚURLFieldr   r   Údisplay_for_valueÚ	JSONFieldÚjsonÚdumpsÚencoder)rC   r;   Úempty_value_displayÚ
avoid_linkrà   rá   r   r   r   Údisplay_for_field­  sJ   
ü


ÿÿ
rý   c                 C   s´   ddl m} |r|| ƒS | tv r|S t| tƒrt| ƒS t| tjƒr)t t	 
| ¡¡S t| tjtjfƒr7t | ¡S t| ttjtfƒrEt | ¡S t| ttfƒrVd dd„ | D ƒ¡S t| ƒS )Nr   rß   z, c                 s   s   � | ]}t |ƒV  qd S r-   )rY   rH   r   r   r   r0   ì  s   € z$display_for_value.<locals>.<genexpr>)rä   rà   r   r?   ÚboolrY   Údatetimer   rê   r   rë   ÚdateÚtimeÚintÚdecimalÚDecimalÚfloatrï   r@   re   Újoin)rC   rû   Úbooleanrà   r   r   r   rö   Ü  s    


rö   c                   @   s   e Zd ZdS )rÕ   N)r&   r'   r(   r   r   r   r   rÕ   ñ  s    rÕ   c                 C   s   t | dƒr| jd jjS t‚)Nr+   r,   )r4   r+   r5   rz   rÕ   )r;   r   r   r   Úget_model_from_relationõ  s   
r  c              	   C   sª   g }| }|  t¡}|D ]B}|j |¡}t|ƒt|ƒd kr.zt|ƒ W n
 ty-   Y  n!w |jr@|jr7|j	r@| 
¡ }|jj}n|jj}|j}| d|¡ q|t |¡fS )zªCreate a reversed field path.

    E.g. Given (Order, "user__groups"),
    return (Group, "user__order").

    Final field must be a related model, not a data field.
    r"   r   )r1   r   rq   r3   r‚   r  rÕ   rÍ   Úauto_createdÚconcreteÚrelated_query_nameÚremote_fieldrz   r;   r2   rª   Úinsertr  )rz   r/   Úreversed_pathÚparentÚpiecesÚpiecer;   r¥   r   r   r   Úreverse_field_pathü  s$   
ÿ
r  c                 C   sD   |  t¡}g }|D ]}|rt|d ƒ}n| }| |j |¡¡ q	|S )a:  Return list of Fields given path relative to model.

    e.g. (ModelX, "user__groups__name") -> [
        <django.db.models.fields.related.ForeignKey object at 0x...>,
        <django.db.models.fields.related.ManyToManyField object at 0x...>,
        <django.db.models.fields.CharField object at 0x...>,
    ]
    r,   )r1   r   r  rg   rq   r3   )rz   r/   r  rh   r  r  r   r   r   rÔ     s   
	rÔ   c                 C   s:  | j }tdƒ� t| |ƒ}W d  ƒ n1 sw   Y  g }|r(| di i¡ n| j r4| dd|ii¡ |r›tdƒ�Y |D ]M}|jD ]}| dt|jjƒt|ƒdœi¡ qB|jD ]\}}	| dt|jjƒt|ƒt|j	d |	ƒdœi¡ qX|j
D ]}
| dt|
jjƒt|
ƒdœi¡ qwq=W d  ƒ |S 1 s–w   Y  |S )	zÊ
    Construct a JSON structure describing changes from a changed object.
    Translations are deactivated so that strings are stored untranslated.
    Translation happens later on LogEntry access.
    NÚaddedÚchangedrh   )r2   rÅ   r   )r2   rÅ   rh   Údeleted)Úchanged_dataÚtranslation_overrideÚ#_get_changed_field_labels_from_formrg   Únew_objectsrY   rq   rr   Úchanged_objectsÚformsÚdeleted_objects)rÙ   Úformsetsrv   r  Úchanged_field_labelsÚchange_messageÚformsetÚadded_objectÚchanged_objectÚchanged_fieldsÚdeleted_objectr   r   r   Úconstruct_change_message/  sZ   	
ü


þÿÿ

ÿýÿÿ

þÿÿÿê
ÿ à r%  c              	   C   sL   g }|D ]}z
| j | jp|}W n ty   |}Y nw | t|ƒ¡ q|S r-   )rh   rÚ   ÚKeyErrorrg   rY   )rÙ   r  r  r:   Úverbose_field_namer   r   r   r  h  s   ÿr  )rE   r-   )NFN)F)Irÿ   r  rø   Úcollectionsr   Ú	functoolsr   Úoperatorr   Údjango.core.exceptionsr   r   Údjango.core.validatorsr   r   Ú	django.dbr	   r
   Údjango.db.models.constantsr   Údjango.db.models.deletionr   Údjango.forms.utilsr   Údjango.urlsr   r   Údjango.utilsr   r   Údjango.utils.hashabler   Údjango.utils.htmlr   Údjango.utils.regex_helperr   Údjango.utils.textr   Údjango.utils.translationr   r   r  r[   rU   r_   r  rb   Ú	Exceptionr%   r=   rD   rG   rX   r^   rd   rj   rm   r�   r‡   r»   rÁ   rË   rÃ   rÜ   rÞ   rý   rö   rÕ   r  r  rÔ   r%  r  r   r   r   r   Ú<module>   s`    

<C

#
B

/9