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)ListUnionDictSetCallableAny)	urlencode)apps)
ListFilter)	AdminForm)AbstractUser)	ModelBaseModel)Options)gettext)NoReverseMatchreversec                 C   s   | S N xr   r   M/var/www/html/bloggers_ems/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kr | d\}}| }tdj||d|d}n=| jtkr:| 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yv   |stt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)typestrsplitlowerr   format	__class__r   _metar3   r4   
isinstancepkr   r#   loggerwarningr   r   )r-   r.   r/   r0   urlr3   r4   r   r   r   get_admin_url$   s>   
rE   specc                 C   s   t | dt | d| jS )N
field_pathparameter_name)getattrtitle)rF   r   r   r   get_filter_idP   s   rK   rD   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})rD   )rB   rC   r   r<   r   r=   )rD   r.   r   r   r   get_custom_urlT   s   

rM   	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)rN   appmodelmodel_klassr   r   r   get_model_metag   s   rT   rQ   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)rQ   T)r.   r/   r1   z{app}.{model})rQ   rR   )rD   rR   name)r	   app_configsrB   rC   r=   
get_modelsrE   r$   r?   r3   r4   verbose_name_pluralrJ   )rQ   r.   modelsrR   rD   r   r   r   get_app_admin_urlss   s   

rZ   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})rQ   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<   )r[   permslower_permspermrQ   r\   r   r   r   get_view_permissions   s   rg   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
    permissionsrD   rU   unspecified)r.   N
new_windowFicondefault_icon_children)rU   rD   childrenrm   rn   rR   iconsrQ   c                    s4   g | ]}|d   v r| d|d |d ddqS )rR   verbose_namerU   rD   N)rU   rD   rp   )get)r   childmodel_permissionsr   r   r      s
    zmake_menu.<locals>.<listcomp>r   rr   r1   )rU   rD   rp   rn   )rg   rs   r$   has_permallrM   r<   rT   rX   rJ   rE   rZ   r!   rI   r	   rV   )r[   rh   ri   rj   r.   menulinkperm_matchesrf   r?   rU   rp   r   ru   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__rB   r+   r:   boolrE   rK   rM   rT   rZ   rg   r|   r   r   r   r   r   r   <module>   sF     
" ,
I