o
    h                     @   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   U/var/www/html/magazine_api/magazine_env/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   ZrankingZ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)argsr4   z%Could not reverse url from {instance})r+   z	?{params})params)typestrsplitlowerr   format	__class__r   _metar1   r2   
isinstancepkr   r#   loggerwarningr   r   )r+   r,   r-   r.   urlr1   r2   r   r   r   get_admin_url$   s>   
rC   specc                 C   s   t | dt | d| jS )NZ
field_pathZparameter_name)getattrtitle)rD   r   r   r   get_filter_idP   s   rG   rB   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 linkr/   /r3   zCouldnt reverse {url})rB   )r@   rA   r   r:   r   r;   )rB   r,   r   r   r   get_custom_urlT   s   

rI   	model_strc              	   C   s<   z|  d\}}t||}|jW S  ttfy   Y dS w )z
    Get model meta class
    r0   N)r9   r	   Zget_registered_modelr=   r#   LookupError)rJ   appmodelZmodel_klassr   r   r   get_model_metag   s   rN   rL   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)rL   T)r,   r-   r/   z{app}.{model})rL   rM   )rB   rM   name)r	   app_configsr@   rA   r;   Z
get_modelsrC   r$   r=   r1   r2   verbose_name_pluralrF   )rL   r,   modelsrM   rB   r   r   r   get_app_admin_urlss   s   

rS   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
    r0   z{app}.{perm_codename})rL   perm_codenamec                 S   s(   h | ]}d |v sd|v r| ddqS )viewZchangeZview_ )replace)r   r   r   r   r   	<setcomp>   s   ( z'get_view_permissions.<locals>.<setcomp>)Zget_all_permissionsr9   r$   r;   r:   )rT   ZpermsZlower_permspermrL   rU   r   r   r   get_view_permissions   s   r[   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
    ZpermissionsrB   rO   unspecified)r,   N
new_windowFiconZdefault_icon_children)rO   rB   childrenr`   ra   rM   ZiconsrL   c                    s4   g | ]}|d   v r| d|d |d ddqS )rM   verbose_namerO   rB   N)rO   rB   rb   )get)r   childZmodel_permissionsr   r   r      s
    zmake_menu.<locals>.<listcomp>r   rc   r/   )rO   rB   rb   ra   )r[   rd   r$   Zhas_permallrI   r:   rN   rQ   rF   rC   rS   r!   rE   r	   rP   )rT   r\   r]   r^   r,   ZmenulinkZperm_matchesrZ   r=   rO   rb   r   rf   r   	make_menu   s^   



	ri   	adminformc                 C   s.   | j }|rt|dkr|d d d u rdS dS )N   r   FT)	fieldsetsr!   )rj   rl   r   r   r   has_fieldsets_check   s    rm   c                     s   dt f fdd}|S )Nfuncc                    s"      D ]
\}}t| || q| S r   )itemssetattr)rn   r    valuer.   r   r   	decorator   s   zattr.<locals>.decorator)r   )r.   rs   r   rr   r   attr   s   rt   )r*   F)r*   )Tr*   )+loggingtypingr   r   r   r   r   r   urllib.parser   Zdjango.appsr	   Zdjango.contrib.adminr
   Zdjango.contrib.admin.helpersr   Zdjango.contrib.auth.modelsr   Zdjango.db.models.baser   r   Zdjango.db.models.optionsr   Zdjango.utils.translationr   Zjazzmin.compatr   r   	getLogger__name__r@   r)   r8   boolrC   rG   rI   rN   rS   r[   ri   rm   rt   r   r   r   r   <module>   sF     
" ,
I