
#dV                 @   s   d  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 d d	   Z d
 d   Z d d d d  Z d d   Z d d   Z d d   Z Gd d   d e  Z d S)z
Admin ui common utilities.
    )unicode_literals)fnmatch)import_module)settings)admin)reversec       
      C   s  t  |  t  r | j d  j } x |  D] } | j d d  \ } } t |  } t | |  } t d | j  } | j	 |  r( |  | j d d  \ } }	 t |  } t | |	  Sq( Wn1 |  j d d  \ } }	 t |  } t | |	  St
 d |    d  S)Nrequest.   z%s:indexz!Dashboard matching "%s" not found)
isinstancedictgetpathrsplitr   getattrr   name
startswith
ValueError)
dashboard_clscontextcurr_urlkeyZadmin_site_modZadmin_site_inst
admin_site	admin_urlmodinst r   E/tmp/pip-build-0jahl3lb/django-grappelli/grappelli/dashboard/utils.py_get_dashboard_cls   s    r   c             C   s   t  t t d d  |     S)zO
    Returns the admin dashboard defined in settings (or the default one).
    GRAPPELLI_INDEX_DASHBOARDz4grappelli.dashboard.dashboards.DefaultIndexDashboard)r   r   r   )r   r   r   r   get_index_dashboard%   s
    r    Nc       	      C   s   t  t d d  } t | t  r |  j d  j } xq | D]_ } | j d d  \ } } t |  } t  | |  } t d | j	  } | j
 |  r: | Sq: Wn t j St d |   d  S)Nr   z4grappelli.dashboard.dashboards.DefaultIndexDashboardr   r	   r
   z%s:indexz"Admin site matching "%s" not found)r   r   r   r   r   r   r   r   r   r   r   r   siter   )	r   r   r   r   r   r   r   r   r   r   r   r   get_admin_site1   s    	r"   c             C   s   t  |   j S)N)r"   r   )r   r   r   r   get_admin_site_nameF   s    r#   c             C   ss   g  } t  d |   } xW | j j   D]F \ } } | j |   } d | j   k rX q% n  | j | | f  q% W| S)z= Returns (model, perm,) for all models user can possibly see r   T)r"   	_registryitemsZget_model_permsvaluesappend)r   r%   r   modelZmodel_adminpermsr   r   r   get_avail_modelsJ   s    r*   c             C   sA  t  |   } g  } d d   } t |  d k r9 | } n x | D]} } g  } xK | D]C } | \ }	 }
 t | |	  |  rS | | k rS | j |  qS qS W| j d d d    | j |  q@ W| d d  } xi | D]a } xX | D]P } | \ }	 }
 t | |	  |  r y | j |  Wq5t k
 r1Yq5Xq q Wq W| S)zw
    Returns (model, perm,) for all models that match models/exclude patterns
    and are visible by current user.
    c             S   s   d |  j  |  j f S)Nz%s.%s)
__module____name__)r(   r   r   r   <lambda>^   s    zfilter_models.<locals>.<lambda>r   r   c             S   s   t  |  d j j j d   S)Nr   zutf-8)str_metaZverbose_name_pluralencode)xr   r   r   r-   o   s    N)r*   lenr   r'   sortextendremover   )r   modelsexcluder%   included	full_namepatternZpattern_itemsitemr(   r)   resultr   r   r   filter_modelsW   s.    	!r=   c               @   sF   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 S)AppListElementMixinzu
    Mixin class used by both the AppListDashboardModule and the
    AppListMenuItem (to honor the DRY concept).
    c             C   sV   |  j  d  d   } |  j d  d   } |  j  rF |  j rF d g } n  t | | |  S)N*)r6   r7   r=   )selfr   r8   Zexcludedr   r   r   _visible_models   s
    z#AppListElementMixin._visible_modelsc             C   s)   | j  j } t d t |  d | f S)z/
        Returns the admin change url.
        z%s:app_listargs)r/   	app_labelr   r#   )r@   r(   r   rC   r   r   r   _get_admin_app_list_url   s    z+AppListElementMixin._get_admin_app_list_urlc             C   s2   | j  j } t d t |  | | j j   f  S)z/
        Returns the admin change url.
        z%s:%s_%s_changelist)r/   rC   r   r#   r,   lower)r@   r(   r   rC   r   r   r   _get_admin_change_url   s    z)AppListElementMixin._get_admin_change_urlc             C   s2   | j  j } t d t |  | | j j   f  S)z,
        Returns the admin add url.
        z%s:%s_%s_add)r/   rC   r   r#   r,   rE   )r@   r(   r   rC   r   r   r   _get_admin_add_url   s    z&AppListElementMixin._get_admin_add_urlN)r,   r+   __qualname____doc__rA   rD   rF   rG   r   r   r   r   r>   ~   s
   	r>   )rI   
__future__r   r   	importlibr   Zdjango.confr   Zdjango.contribr   Zdjango.core.urlresolversr   r   r    r"   r#   r*   r=   objectr>   r   r   r   r   <module>   s   '