o
    =g                     @   s  d dl Z d dlmZmZ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mZmZ d d	lmZ d d
lmZ d dlmZmZ e eZdd fdedededefddZd6dede de!de de f
ddZ"dede fddZ#d7de de de fd d!Z$d"e dedef fd#d$Z%d7d%e de dee fd&d'Z&d(edee  fd)d*Z'	d8d(ed,ee d-ed.e!de dee fd/d0Z(d1ede!fd2d3Z)defd4d5Z*dS )9    N)AnyCallableDictListSetUnion)	urlencode)apps)
ListFilter)	AdminForm)AbstractUser)Model	ModelBase)Options)gettext)NoReverseMatchreversec                 C   s   | S N xr   r   @/var/www/html/venv/lib/python3.10/site-packages/jazzmin/utils.py<lambda>   s    r   original	referencegetterreturnc              	   C   sj   g }t | }| D ]}z	|||}W n ty   |}Y nw || qdd tt|| dd dD S )z
    Order a list based on the location of items in the reference list, optionally, use a getter to pull values out of
    the first list
    c                 S   s   g | ]\}}|qS r   r   ).0r   yr   r   r   
<listcomp>!   s    z)order_with_respect_to.<locals>.<listcomp>c                 S   s   | d S )Nr   r   r   r   r   r   r   !   s    z'order_with_respect_to.<locals>.<lambda>)key)lenindex
ValueErrorappendsortedzip)r   r   r   rankingmax_numitemposr   r   r   order_with_respect_to   s    r+   adminFinstance
admin_sitefrom_appkwargsc              	   K   s  d}z[t | tr| d\}}| }tdj||d|d}n=| jtkr9| jj	| jj
}}tdj||d|d}n#| jjtkr\t | | jr\| jj	| jj
}}tdj||d| jf|d}W n ttfyu   |ssttdj| d	 Y nw |r|d
jt|d7 }|S )zZ
    Return the admin URL for the given instance, model class or <app>.<model> string
    #.z)admin:{app_label}_{model_name}_changelist)	app_label
model_namecurrent_appz%admin:{app_label}_{model_name}_change)argsr6   z%Could not reverse url from {instance})r-   z	?{params})params)
isinstancestrsplitlowerr   format	__class__r   _metar3   r4   pkr   r#   loggerwarningr   r   )r-   r.   r/   r0   urlr3   r4   r   r   r   get_admin_url$   s>   

rD   specc                 C   s   t | dt | d| jS )N
field_pathparameter_name)getattrtitle)rE   r   r   r   get_filter_idO   s   rJ   rC   c                 C   sd   | s	t d dS d| v r| S zt|  |d} W | S  ty1   t dj| d d|  } Y | S w )z5
    Take in a custom url, and try to reverse it
    zNo url supplied in custom linkr1   /r5   zCouldnt reverse {url})rC   )rA   rB   r   r<   r   r=   )rC   r.   r   r   r   get_custom_urlS   s   

rL   	model_strc              	   C   s<   z|  d\}}t||}|jW S  ttfy   Y dS w )z
    Get model meta class
    r2   N)r;   r	   get_registered_modelr?   r#   LookupError)rM   appmodelmodel_klassr   r   r   get_model_metaf   s   rS   rP   c                 C   s   | t jvrtdj| d g S g }t j|   D ]$}t||dd}|dkr'q||dj|jj	|jj
d|jj d q|S )	zO
    For the given app string, get links to all the app models admin views
    z%{app} not found when generating links)rP   T)r.   r/   r1   z{app}.{model})rP   rQ   )rC   rQ   name)r	   app_configsrA   rB   r=   
get_modelsrD   r$   r?   r3   r4   verbose_name_pluralrI   )rP   r.   modelsrQ   rC   r   r   r   get_app_admin_urlsr   s   

rY   userc                 C   sJ   |   }g }|D ]}|d\}}|dj|| d qdd |D S )zB
    Get model names based on a users view/change permissions
    r2   z{app}.{perm_codename})rP   perm_codenamec                 S   s(   h | ]}d |v sd|v r| ddqS )viewchangeview_ )replace)r   r   r   r   r   	<setcomp>   s   ( z'get_view_permissions.<locals>.<setcomp>)get_all_permissionsr;   r$   r=   r<   )rZ   permslower_permspermrP   r[   r   r   r   get_view_permissions   s   rf   Tlinksoptionsallow_appmenusc                    s  | sg S t |  g }|D ]}g }|dg D ]
}|| | qt|s&qd|v rJ||ddt|d |dd|dd|d	|d
 d qd|v r|d   vrWqt|d }	|	rd|	j	 n|d }
||
t
|d |dg |dd|d |d |d
 d qd|v r|rŇ fddt|d |dD }t|dkrq|ttj|d  d|d 	 d||d |d |d
 d q|S )z8
    Make a menu from a list of user supplied links
    permissionsrC   rT   unspecified)r.   N
new_windowFicondefault_icon_children)rT   rC   childrenrl   rm   rQ   iconsrP   c                    s4   g | ]}|d   v r| d|d |d ddqS )rQ   verbose_namerT   rC   N)rT   rC   ro   )get)r   childmodel_permissionsr   r   r      s
    zmake_menu.<locals>.<listcomp>r   rq   r1   )rT   rC   ro   rm   )rf   rr   r$   has_permallrL   r<   rS   rW   rI   rD   rY   r!   rH   r	   rU   )rZ   rg   rh   ri   r.   menulinkperm_matchesre   r?   rT   ro   r   rt   r   	make_menu   s^   



	r{   	adminformc                 C   s.   | j }|rt|dkr|d d d u rdS dS )N   r   FT)	fieldsetsr!   )r|   r~   r   r   r   has_fieldsets_check   s    r   c                     s   dt f fdd}|S )Nfuncc                    s"      D ]
\}}t| || q| S r   )itemssetattr)r   r    valuer0   r   r   	decorator   s   zattr.<locals>.decorator)r   )r0   r   r   r   r   attr   s   r   )r,   F)r,   )Tr,   )+loggingtypingr   r   r   r   r   r   urllib.parser   django.appsr	   django.contrib.adminr
   django.contrib.admin.helpersr   django.contrib.auth.modelsr   django.db.models.baser   r   django.db.models.optionsr   django.utils.translationr   jazzmin.compatr   r   	getLogger__name__rA   r+   r:   boolrD   rJ   rL   rS   rY   rf   r{   r   r   r   r   r   r   <module>   sF     
" +
H