
    >Tf
                     r    d dl mZmZ d dlmZ d dlmZmZmZ dZ	 G d de          Z
 G d de          Zd	S )
    )PrefetchQuerySet)CONSTRAINT_TOKEN_USER)get_permission_for_modelpermission_is_exemptqs_filter_from_constraints)RestrictedPrefetchRestrictedQuerySetc                   .     e Zd ZdZd fd	Z fdZ xZS )r	   z
    Extend Django's Prefetch to accept a user and action to be passed to the
    `restrict()` method of the related object's queryset.
    viewNc                 l    || _         || _        t                                          |||           d S )N)querysetto_attr)restrict_userrestrict_actionsuper__init__)selflookupuseractionr   r   	__class__s         8/var/www/html/netbox-4.1.3/netbox/utilities/querysets.pyr   zRestrictedPrefetch.__init__   s8    !%(GDDDDD    c                     | j         | j        dt                                          |          x}rfd|D             S S )N)r   r   c                 *    g | ]} |j         d i S ) )restrict).0qsparamss     r   
<listcomp>z<RestrictedPrefetch.get_current_querysets.<locals>.<listcomp>   s+    >>>bKBK))&))>>>r   )r   r   r   get_current_querysets)r   level	querysetsr!   r   s      @r   r#   z(RestrictedPrefetch.get_current_querysets   s^    &*
 

 55e<<<9 	?>>>>I>>>>
 r   )r   NN)__name__
__module____qualname____doc__r   r#   __classcell__)r   s   @r   r	   r	      sf         E E E E E E        r   r	   c                       e Zd ZddZdS )r
   r   c                    t          | j        |          }|r|j        st          |          r| }n||j        r||                                vr|                                 }nYt          |i}t          |j	        |         |          }| j        j
                            |          }|                     |          }|S )a  
        Filter the QuerySet to return only objects on which the specified user has been granted the specified
        permission.

        :param user: User instance
        :param action: The action which must be permitted (e.g. "view" for "dcim.view_site"); default is 'view'
        N)pk__in)r   modelis_superuserr   is_authenticatedget_all_permissionsnoner   r   _object_perm_cacheobjectsfilter)r   r   r   permission_requiredr    tokensattrsallowed_objectss           r   r   zRestrictedQuerySet.restrict(   s     7tz6JJ  	5D% 	5)=>Q)R)R 	5BB \!6\:MUYUmUmUoUo:o:oBB
 &tF /t/FGZ/[]cddE #j077>>OO44B	r   N)r   )r&   r'   r(   r   r   r   r   r
   r
   &   s(             r   r
   N)django.db.modelsr   r   users.constantsr   utilities.permissionsr   r   r   __all__r	   r
   r   r   r   <module>r>      s    / / / / / / / / 1 1 1 1 1 1 l l l l l l l l l l       4                   r   