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}z¸t | ƒ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rºt| | jƒrº| jj	| jj
 }}tdj||d�| jf|d�}W n2 ttfk
rî   |sêt 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r²q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