a
    QhO                     @   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_infosc                 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| }nt|| rt	|| }npt|| rt	|| }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rtt| S t|t	jt	jfrt| S t|t	jrt| |jS t|t	jt	jf rt| 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rt| S t| ttfrd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  qY n0 |jr|jrr|j	r|
 }|jj}n|jj}|j}|d| q|t|fS )zCreate 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 qq|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