o
    9ZcsK                     @   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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&dd Z'dd Z(dd Z)dd  Z*d!d" Z+d#d$ Z,G d%d& d&eZ-d'd( Z.dDd)d*Z/dDd+d,Z0d-d. Z1dEd0d1Z2d2d3 Z3d4d5 Z4dFd6d7Z5G d8d9 d9e$Z6d:d; Z7d<d= Z8d>d? Z9d@dA Z:dBdC Z;dS )G    N)defaultdict)FieldDoesNotExist)modelsrouter)
LOOKUP_SEP)	Collector)pretty_name)NoReverseMatchreverse)formatstimezone)format_html)capfirst)ngettextoverridec                 C   s   i | ]}|d | qS )z_%02X ).0ir   r   P/var/www/chikooza/env/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      s    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 ]5}|dkr| jj}z| |}W n	 ty!   Y qw t|dr<| }|d j} t	dd |D r< dS qdS )zT
    Return True if 'distinct()' should be used to query the given lookup path.
    pkget_path_infoc                 s   s    | ]}|j V  qd S N)m2m)r   pathr   r   r   	<genexpr>.   s    z(lookup_needs_distinct.<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_needs_distinct   s    


r5   c                 C   s2   |  dr|d}|S |  dr| dv}|S )zJ
    Return a lookup value prepared to be used in queryset filtering.
    __in,__isnull) false0)endswithr)   lower)keyvaluer   r   r   prepare_lookup_value4   s   


r@   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   quoteA   s   rG   c                 C   s   t dd | S )zUndo the effects of quote().c                 S   s   t | d S )Nr   )UNQUOTE_MAPgroup)mr   r   r   <lambda>M   s    zunquote.<locals>.<lambda>)
UNQUOTE_REsubrE   r   r   r   unquoteK   s   rN   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.
    )rA   listtupleextendappend)fieldsflatr3   r   r   r   flattenP   s   rU   c                 C   s(   g }| D ]\}}| t|d  q|S )z?Return a list of field names from an admin fieldsets structure.rS   )rQ   rU   )	fieldsetsfield_namesr*   r/   r   r   r   flatten_fieldsets]   s   
rX   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   )usingc                    s   | j }| jv }| j}dt|j| f }|rO j| | s%|j ztd j|j	|j
f d t| jf}W n tyD   | Y S w tdt|j|| S |S )Nz%s: %sz%s:%s_%s_changez{}: <a href="{}">{}</a>)	__class__	_registry_metar   verbose_namehas_delete_permissionaddr
   r*   	app_label
model_namerG   r"   r	   r   )objmodel	has_adminr/   no_edit_link	admin_url)
admin_siteperms_neededrequestr   r   format_callbacky   s2   
z,get_deleted_objects.<locals>.format_callbackc                    s   g | ]} |qS r   r   )r   rb   )rj   r   r   r      s    z'get_deleted_objects.<locals>.<listcomp>c                 S   s   i | ]\}}|j jt|qS r   )r\   verbose_name_plurallen)r   rc   objsr   r   r   r      s    z'get_deleted_objects.<locals>.<dictcomp>)
IndexErrorsetr   db_for_writer\   rc   NestedObjectscollectnested	protected
model_objsitems)	rm   ri   rg   rb   rY   	collector	to_deletert   model_countr   )rg   rj   rh   ri   r   get_deleted_objectsg   s   


rz   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rZ   r   r   r|      s   zNestedObjects.__init__c                 C   s   | j |g | d S r%   )r}   
setdefaultrR   )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w )N+)classr`   source_attr)r<   r\   ra   r`   r   getattrru   rc   r_   r{   rr   r   ProtectedErrorrt   updateprotected_objects)r   rm   r   r   r   rb   related_nameer   r   r   rr      s   zNestedObjects.collectc                    s   t  ||}||jjS r%   )r{   related_objectsselect_relatedr3   r*   )r   relatedrm   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   )r_   r}   getrQ   _nestedrR   )r   rb   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   rQ   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)NNr%   )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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.
    )r]   rk   )rA   r   Modelbase	ModelBaser\   queryQuerySetrc   r]   rk   )rb   r/   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.
    Nr]   rk   r   )rA   r   r   r   countrc   r   r   )rb   ndsingularpluralr   r   r   model_ngettext   s   	r   c              	   C   s   |j }zt|| }W n: ttfyD   t| r| }||}n"t|| r1| dkr1t|| }||}nt|| }t|r>| }n|}d }Y nw d }t|| }|||fS )N__str__)r\   _get_non_gfk_fieldr   r   callabler,   r   )r*   rb   model_adminr/   fattrr?   r   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)
r+   is_relationmany_to_onerelated_modelone_to_manyr   many_to_manyr,   r   r   )r/   r*   r3   r   r   r   r     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| }nDt|| rDt	|| }n9t|| rOt	|| }n.|r\| |j
v r\|j
|  }n!d| |jjf }|ro|d|jjf 7 }|ry|d|jj 7 }t|t|dr|j}n+t|trt|drt|jdr|jj}nt|r|jdkrd}n
t|j}nt| }Y n ty   t| }| }Y nw |r||fS |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   rB   r   r,   r   rS   object_namerZ   r   r   rA   propertyr   r   r   )	r*   rc   r   return_attrformr   r3   labelmessager   r   r   label_for_field2  s`   







r   c              	   C   sB   d}zt |j| }W n ttfy   Y |S w t|dr|j}|S )Nr9   	help_text)r   r\   r   r   r,   r   )r*   rc   r   r3   r   r   r   help_text_for_fieldn  s   
r   c                 C   s   ddl m} t|dd rt|j| |S t|tjr|| S | d u r%|S t|tj	r3t
t| S t|tjtjfrAt
| S t|tjrNt
| |jS t|tjtjfr\t
| S t|tjrk| rktd| j| S t| |S )Nr   _boolean_iconflatchoicesz<a href="{}">{}</a>),django.contrib.admin.templatetags.admin_listr   r   dictr   r   rA   r   BooleanFieldDateTimeFieldr   localizer   template_localtime	DateField	TimeFieldDecimalFieldnumber_formatdecimal_placesIntegerField
FloatField	FileFieldr   urldisplay_for_value)r?   r3   empty_value_displayr   r   r   r   display_for_fieldz  s$   


r   c                 C   s   ddl m} |r|| S | d u 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%   )rB   )r   r   r   r   r   r(     s    z$display_for_value.<locals>.<genexpr>)r   r   rA   boolrB   datetimer   r   r   r   datetimeintdecimalDecimalfloatr   rO   rP   join)r?   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|  d jjS t)Nr#   r$   )r,   r#   r-   rc   r   )r3   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   )r)   r   r\   r+   rl   r   r   r   auto_createdconcreterelated_query_nameremote_fieldrc   r3   r*   r   insertr   )rc   r'   reversed_pathparentpiecespiecer3   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   rR   r\   r+   )rc   r'   r   rS   r   r   r   r   r   get_fields_from_path  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 |rt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 sw   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changedrS   )r*   objectr   )r*   r   rS   deleted)changed_datatranslation_override#_get_changed_field_labels_from_formrR   new_objectsrB   r\   r]   changed_objectsformsdeleted_objects)r   formsetsr_   r   changed_field_labelschange_messageformsetadded_objectchanged_objectchanged_fieldsdeleted_objectr   r   r   construct_change_message  sP   	







r  c              	   C   sL   g }|D ]}z
| j | jp|}W n ty   |}Y nw |t| q|S r%   )rS   r   KeyErrorrR   rB   )r   r   r   r2   verbose_field_namer   r   r   r     s   r   r%   )NFN)F)<r   r   re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.htmlr   django.utils.textr   django.utils.translationr   r   r   rD   rv   rH   compiler   rL   	Exceptionr   r5   r@   rG   rN   rU   rX   rz   rq   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   <module>   sP    

8?


<
1