a
    ¦Q•hõO  ã                   @   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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'ƒZ(dd„ Z)dHdd„Z*dd „ Z+d!d"„ Z,d#d$„ Z-d%d&„ Z.d'd(„ Z/G d)d*„ d*eƒZ0d+d,„ Z1dId-d.„Z2dJd/d0„Z3d1d2„ Z4dKd4d5„Z5d6d7„ Z6d8d9„ Z7dLd:d;„Z8G d<d=„ d=e'ƒZ9d>d?„ Z:d@dA„ Z;dBdC„ Z<dDdE„ Z=dFdG„ Z>dS )Mé    N)Údefaultdict)ÚFieldDoesNotExist)Ú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   úS/var/www/sistema_ama/venv/lib/python3.9/site-packages/django/contrib/admin/utils.pyÚ
<dictcomp>   ó    r   s   ":/_#?;@&=+$,"[]<>%
\c                 C   s   i | ]\}}|t |ƒ“qS r   )Úchr)r   ÚkÚvr   r   r   r      r   z_(?:%s)ú|c                 C   s   g | ]}|d d… ‘qS )é   Nr   )r   Úxr   r   r   Ú
<listcomp>   r   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 ]l}|dkr"| jj}z|  |¡}W n tyF   Y qY q0 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>2   r   z+lookup_spawns_duplicates.<locals>.<genexpr>TF)
Úsplitr   r%   ÚnameÚ	get_fieldr   Úhasattrr&   Úto_optsÚany)ÚoptsZlookup_pathÚlookup_fieldsÚ
field_nameÚfieldÚ	path_infor   r   r   Úlookup_spawns_duplicates   s    



r7   ú,c                 C   s0   |   d¡r| |¡}n|   d¡r,| ¡ dv}|S )zJ
    Return a lookup value prepared to be used in queryset filtering.
    Ú__inÚ__isnull)Ú ÚfalseÚ0)Úendswithr,   Úlower)ÚkeyÚvalueÚ	separatorr   r   r   Úprepare_lookup_value9   s
    

rC   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.
    )Ú
isinstanceÚstrÚ	translateÚ	QUOTE_MAP©Úsr   r   r   ÚquoteF   s    rJ   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>R   r   zunquote.<locals>.<lambda>)Ú
UNQUOTE_REÚsubrH   r   r   r   ÚunquoteP   s    rP   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.
    )rD   ÚlistÚtupleÚextendÚappend)ÚfieldsÚflatr5   r   r   r   ÚflattenU   s    rW   c                 C   s(   g }| D ]\}}|  t|d ƒ¡ q|S )z?Return a list of field names from an admin fieldsets structure.rU   )rS   rW   )Ú	fieldsetsÚfield_namesr-   r2   r   r   r   Úflatten_fieldsetsb   s    rZ   c           	         s¦   z| d }W n  t y,   g i tƒ g f Y S 0 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v }| j}dt|jƒ| f }|ržˆ j|  ˆ| ¡sJˆ |j¡ z(tdˆ j|j	|j
f d t| jƒfƒ}W n tyˆ   | Y S 0 tdt|jƒ|| ƒS |S d S )Nz%s: %sz%s:%s_%s_changez{}: <a href="{}">{}</a>)Ú	__class__Ú	_registryÚ_metar   Úverbose_nameÚhas_delete_permissionÚaddr
   r-   Ú	app_labelÚ
model_namerJ   r%   r	   r   )ÚobjÚmodelZ	has_adminr2   Zno_edit_linkZ	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   re   )rj   r   r   r   œ   r   z'get_deleted_objects.<locals>.<listcomp>c                 S   s   i | ]\}}|j jt|ƒ“qS r   )r_   Úverbose_name_pluralÚlen)r   rf   Úobjsr   r   r   r   �   s   ÿz'get_deleted_objects.<locals>.<dictcomp>)Ú
IndexErrorÚsetr   Údb_for_writer_   rf   ÚNestedObjectsÚcollectÚnestedÚ	protectedÚ
model_objsÚitems)	rm   ri   rg   re   r[   Ú	collectorZ	to_deletert   Úmodel_countr   )rg   rj   rh   ri   r   Úget_deleted_objectsj   s    

þry   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 )rq   c                    s.   t ƒ j|i |¤Ž i | _tƒ | _ttƒ| _d S r(   )ÚsuperÚ__init__Úedgesro   rt   r   ru   ©ÚselfÚargsÚkwargs©r]   r   r   r{   ¦   s    zNestedObjects.__init__c                 C   s   | j  |g ¡ |¡ d S r(   )r|   Ú
setdefaultrT   )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y° } z| j |j¡ W Y d }~n<d }~0  tjyâ } z| j |j¡ W Y d }~n
d }~0 0 d S )Nú+)Úclassrc   Úsource_attr)r>   r_   rd   rc   r…   Úgetattrru   rf   rb   rz   rr   r   ÚProtectedErrorrt   ÚupdateÚprotected_objectsÚRestrictedErrorÚrestricted_objects)r~   rm   rƒ   rˆ   r€   re   Úrelated_nameÚer�   r   r   rr   ¯   s    þ"zNestedObjects.collectc                    s$   t ƒ  |||¡}|jdd„ |D ƒŽ S )Nc                 S   s   g | ]
}|j ‘qS r   )r-   )r   Úrelated_fieldr   r   r   r   Ä   r   z1NestedObjects.related_objects.<locals>.<listcomp>)rz   Úrelated_objectsÚselect_related)r~   Úrelated_modelÚrelated_fieldsrm   Úqsr�   r   r   r’   Á   s    ÿzNestedObjects.related_objectsc                 C   sj   ||v rg S |  |¡ g }| j |d¡D ]}| |  |||¡¡ q(|rR||ƒg}n|g}|rf| |¡ |S )Nr   )rb   r|   ÚgetrS   Ú_nestedrT   )r~   re   Úseenrj   Ú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   )ro   r|   r—   rS   r˜   )r~   rj   r™   ÚrootsÚrootr   r   r   rs   Ö   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)NN)N)r!   r"   r#   r{   r…   rr   r’   r˜   rs   rŸ   Ú__classcell__r   r   r�   r   rq   ¥   s   

rq   c                 C   sF   t | tjtjjfƒr| j}nt | tjjƒr4| 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.
    )r`   rk   )rD   r   ÚModelÚbaseÚ	ModelBaser_   ÚqueryÚQuerySetrf   r`   rk   )re   r2   r   r   r   Úmodel_format_dictè   s    
þr¦   c                 C   sN   t | tjjƒr$|du r|  ¡ }| j} t| ƒ}|d |d  }}t|||pJdƒ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.
    Nr`   rk   r   )rD   r   r¤   r¥   Úcountrf   r¦   r   )re   ÚnÚdÚsingularÚpluralr   r   r   Úmodel_ngettextû   s    	r¬   c              	   C   s¢   |j }zt|| ƒ}W nt ttfyˆ   t| ƒr<| }||ƒ}nDt|| ƒrb| dkrbt|| ƒ}||ƒ}nt|| ƒ}t|ƒr||ƒ }n|}d }Y n0 d }t|| ƒ}|||fS )NÚ__str__)r_   Ú_get_non_gfk_fieldr   r    Úcallabler/   r‰   )r-   re   Úmodel_adminr2   ÚfÚattrrA   r   r   r   Úlookup_field  s$    





r³   c                 C   sR   |   |¡}|jr(|jr|jr"|jr(tƒ ‚|jrN|jsNt|dƒrN|j|krNt	ƒ ‚|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)
r.   Úis_relationÚmany_to_oner”   Úone_to_manyr   Úmany_to_manyr/   r´   r    )r2   r-   r5   r   r   r   r®   '  s(    
ÿüüüÿþýür®   Fc           	      C   s¬  d}z:t |j| ƒ}z
|j}W n ty8   |jjj}Y n0 W �nV t�yv   | dkrjt|jjƒ}t}�nt| ƒrx| }n†t|| ƒrŽt	|| ƒ}npt|| ƒr¤t	|| ƒ}nZ|r¾| |j
v r¾|j
|  }n@d| |jjf }|râ|d|jj 7 }|rö|d|jj 7 }t|ƒ‚t|dƒ�r|j}n`t|tƒ�rBt|dƒ�rBt|jdƒ�rB|jj}n0t|ƒ�rj|jdk�r^d}n
t|jƒ}nt| ƒ}Y n  t�y”   t| ƒ}| }Y n0 |�r¤||fS |S dS )	ak  
    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. 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­   zUnable to lookup '%s' on %sz or %sÚshort_descriptionÚfgetz<lambda>z--)r®   r_   r`   ÚAttributeErrorr”   r   rE   r¯   r/   r‰   rU   Úobject_namer]   r!   r¹   rD   Úpropertyrº   r   r    )	r-   rf   r°   Zreturn_attrÚformr²   r5   ÚlabelÚmessager   r   r   Úlabel_for_fieldD  s`    


þÿþ
ý


rÁ   c              	   C   s@   d}zt |j| ƒ}W n ttfy*   Y n0 t|dƒr<|j}|S )Nr;   Ú	help_text)r®   r_   r   r    r/   rÂ   )r-   rf   rÂ   r5   r   r   r   Úhelp_text_for_field…  s    
rÃ   c                 C   sp  ddl m} t|dd ƒrfzt|jƒ | |¡W S  ty`   t|jƒ}t| ƒ} t|ƒ | |¡ Y S 0 �nt|t	j
ƒrz|| ƒS | d u r†|S t|t	jƒr¢t t | ¡¡S t|t	jt	jfƒr¾t | ¡S t|t	jƒrØt | |j¡S t|t	jt	jfƒ� röt | ¡S t|t	jƒ�r| �rtd| j| ƒS t|t	jƒ�rb| �rbztj| d|jd�W S  t�y^   t| |ƒ Y S 0 n
t| |ƒS d S )Nr   ©Ú_boolean_iconÚflatchoicesz<a href="{}">{}</a>F)Úensure_asciiÚcls)Ú,django.contrib.admin.templatetags.admin_listrÅ   r‰   ÚdictrÆ   r—   Ú	TypeErrorr   rD   r   ÚBooleanFieldÚDateTimeFieldr   Úlocalizer   Útemplate_localtimeÚ	DateFieldÚ	TimeFieldÚDecimalFieldÚnumber_formatÚdecimal_placesÚIntegerFieldÚ
FloatFieldÚ	FileFieldr   ÚurlÚ	JSONFieldÚjsonÚdumpsÚencoderÚdisplay_for_value)rA   r5   Úempty_value_displayrÅ   rÆ   r   r   r   Údisplay_for_field‘  s8    


rß   c                 C   s¸   ddl m} |r|| ƒS | d u r$|S t| tƒr6t| ƒS t| tjƒrRt t 	| ¡¡S t| tj
tjfƒrnt | ¡S t| ttjtfƒrŠt | ¡S t| ttfƒr¬d dd„ | D ƒ¡S t| ƒS d S )Nr   rÄ   z, c                 s   s   | ]}t |ƒV  qd S r(   )rE   )r   r   r   r   r   r+   Æ  r   z$display_for_value.<locals>.<genexpr>)rÉ   rÅ   rD   ÚboolrE   Údatetimer   rÎ   r   rÏ   ÚdateÚtimeÚintÚdecimalÚDecimalÚfloatrÓ   rQ   rR   Újoin)rA   rÞ   ÚbooleanrÅ   r   r   r   rÝ   ¶  s     


rÝ   c                   @   s   e Zd ZdS )ÚNotRelationFieldN)r!   r"   r#   r   r   r   r   rê   Ë  s   rê   c                 C   s    t | dƒr| jd jjS t‚d S )Nr&   r'   )r/   r&   r0   rf   rê   )r5   r   r   r   Úget_model_from_relationÏ  s    
rë   c              	   C   s®   g }| }|  t¡}|D ]ˆ}|j |¡}t|ƒt|ƒd kr`zt|ƒ W n ty^   Y  q Y n0 |jr„|jrr|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   )r,   r   r_   r.   rl   rë   rê   rµ   Úauto_createdÚconcreteÚrelated_query_nameÚremote_fieldrf   r5   r-   r”   Úinsertrè   )rf   r*   Zreversed_pathÚparentÚpiecesÚpiecer5   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'   )r,   r   rë   rT   r_   r.   )rf   r*   rò   rU   ró   rñ   r   r   r   Úget_fields_from_pathõ  s    	
rõ   c                 C   s<  | j }tdƒ� t| |ƒ}W d  ƒ n1 s.0    Y  g }|rP| di i¡ n| j rh| dd|ii¡ |�r8tdƒ�° |D ]š}|jD ]$}| dt|jjƒt|ƒdœi¡ q†|jD ]6\}}	| dt|jjƒt|ƒt|j	d |	ƒdœi¡ q²|j
D ]$}
| dt|
jjƒt|
ƒdœi¡ qðq|W d  ƒ n1 �s.0    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.
    NZaddedÚchangedrU   )r-   Úobjectr   )r-   r÷   rU   Údeleted)Úchanged_dataÚtranslation_overrideÚ#_get_changed_field_labels_from_formrT   Únew_objectsrE   r_   r`   Úchanged_objectsÚformsÚdeleted_objects)r¾   Úformsetsrb   rù   Úchanged_field_labelsÚchange_messageÚformsetZadded_objectZchanged_objectZchanged_fieldsZdeleted_objectr   r   r   Úconstruct_change_message	  sN    	
(


þÿÿ

ÿýÿÿ

þÿÿ(r  c              	   C   sL   g }|D ]>}z| j | jp|}W n ty6   |}Y n0 | t|ƒ¡ q|S r(   )rU   r¿   ÚKeyErrorrT   rE   )r¾   rù   r  r4   Zverbose_field_namer   r   r   rû   B  s    
rû   )r8   )N)N)NFN)F)?rá   rå   rÚ   Úcollectionsr   Údjango.core.exceptionsr   Ú	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ú   rG   rv   rK   rè   rN   Ú	Exceptionr    r7   rC   rJ   rP   rW   rZ   ry   rq   r¦   r¬   r³   r®   rÁ   rÃ   rß   rÝ   rê   rë   rô   rõ   r  rû   r   r   r   r   Ú<module>   sT   

;C


A%
9