U
    ȍb                     @   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eeeedddZd/ee e!e e dddZ"ee dddZ#d0e e e dddZ$e edef dddZ%d1e e ee dd d!Z&eee  d"d#d$Z'd2eee ee!e ee d&d'd(Z(ee!d)d*d+Z)ed,d-d.Z*dS )3    N)ListUnionDictSetCallableAny)	urlencode)apps)
ListFilter)	AdminForm)AbstractUser)	ModelBaseModel)Options)gettext)NoReverseMatchreversec                 C   s   | S N xr   r   1/tmp/pip-unpacked-wheel-o69wxf3u/jazzmin/utils.py<lambda>       r   )original	referencegetterreturnc              	   C   sl   g }t | }| D ]:}z|||}W n tk
r>   |}Y nX || 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   !   r   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kwargsr   c              	   K   s  d}zt | tkr@| d\}}| }tdj||d|d}nz| jtkrt| jj	| jj
 }}tdj||d|d}nF| jjtkrt| | jr| jj	| jj
 }}tdj||d| jf|d}W n2 ttfk
r   |sttdj| d	 Y nX |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)argsr5   z%Could not reverse url from {instance})r,   z	?{params})params)typestrsplitlowerr   format	__class__r   _metar2   r3   
isinstancepkr   r$   loggerwarningr   r   )r,   r-   r.   r/   urlr2   r3   r   r   r   get_admin_url$   s8    

rD   )specr   c                 C   s   t | dt | d| jS )NZ
field_pathZparameter_name)getattrtitle)rE   r   r   r   get_filter_idP   s    rH   )rC   r-   r   c                 C   sf   | st d dS d| kr| S zt|  |d} W n. tk
r`   t dj| d d|  } Y nX | S )z5
    Take in a custom url, and try to reverse it
    zNo url supplied in custom linkr0   /r4   zCouldnt reverse {url})rC   )rA   rB   r   r;   r   r<   )rC   r-   r   r   r   get_custom_urlT   s    
rJ   )	model_strr   c              	   C   sB   z"|  d\}}t||}|jW S  ttfk
r<   Y dS X dS )z
    Get model meta class
    r1   N)r:   r	   Zget_registered_modelr>   r$   LookupError)rK   appmodelZmodel_klassr   r   r   get_model_metag   s    rO   )rM   r-   r   c                 C   s   | t jkr tdj| d g S g }t j|   D ]H}t||dd}|dkrNq2||dj|jj	|jj
d|jj d q2|S )	zO
    For the given app string, get links to all the app models admin views
    z%{app} not found when generating links)rM   T)r-   r.   r0   z{app}.{model})rM   rN   )rC   rN   name)r	   app_configsrA   rB   r<   Z
get_modelsrD   r%   r>   r2   r3   verbose_name_pluralrG   )rM   r-   modelsrN   rC   r   r   r   get_app_admin_urlss   s    

rT   )userr   c                 C   sJ   |   }g }|D ]*}|d\}}|dj|| d qdd |D S )zB
    Get model names based on a users view/change permissions
    r1   z{app}.{perm_codename})rM   perm_codenamec                 S   s(   h | ] }d |ksd|k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_permissionsr:   r%   r<   r;   )rU   ZpermsZlower_permspermrM   rV   r   r   r   get_view_permissions   s    r\   T)rU   linksoptionsallow_appmenusr-   r   c                    s  | sg S t |  g }|D ]v}g }|dg D ]}|| | q.t|sNqd|kr||ddt|d |dd|dd|d	|d
 d qd|kr|d   krqt|d }	|	r|	j	 n|d }
||
t
|d |dg |dd|d |d |d
 d qd|kr|r fddt|d |dD }t|dkrNq|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   rP   unspecified)r-   N
new_windowFiconZdefault_icon_children)rP   rC   childrenrb   rc   rN   ZiconsrM   c                    s4   g | ],}|d   kr| d|d |d ddqS )rN   verbose_namerP   rC   N)rP   rC   rd   )get)r   childZmodel_permissionsr   r   r       s   zmake_menu.<locals>.<listcomp>r   re   r0   )rP   rC   rd   rc   )r\   rf   r%   Zhas_permallrJ   r;   rO   rR   rG   rD   rT   r"   rF   r	   rQ   )rU   r]   r^   r_   r-   menulinkZperm_matchesr[   r>   rP   rd   r   rh   r   	make_menu   s\    





	rl   )	adminformr   c                 C   s.   | j }|r&t|dkr*|d d d kr*dS dS )N   r   FT)	fieldsetsr"   )rm   ro   r   r   r   has_fieldsets_check   s     rp   )r   c                     s   t d fdd}|S )N)funcc                    s"      D ]\}}t| || q| S r   )itemssetattr)rq   r!   valuer/   r   r   	decorator   s    zattr.<locals>.decorator)r   )r/   rv   r   ru   r   attr   s    rw   )r+   F)r+   )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__rA   r*   r9   boolrD   rH   rJ   rO   rT   r\   rl   rp   rw   r   r   r   r   <module>   s<    
,       I