

_V                 @   s`   d  d l  m Z d  d l m Z d  d l m Z Gd d   d e  Z Gd d   d e  Z d S)	    )unicode_literals)get_user_model)
Permissionc               @   s   e  Z d  Z d Z d d d d  Z d d   Z d d   Z d	 d
   Z d d d  Z d d d  Z	 d d d  Z
 d d d  Z d d   Z d d   Z d S)ModelBackendz9
    Authenticates against settings.AUTH_USER_MODEL.
    Nc             K   s   t    } | d  k r* | j | j  } n  y) | j j |  } | j |  rR | SWn% | j k
 rz |   j |  Yn Xd  S)N)r   getUSERNAME_FIELD_default_managerget_by_natural_keyZcheck_passwordDoesNotExistZset_password)selfusernamepasswordkwargs	UserModeluser r   >/tmp/pip-build-ghmbqnp_/Django/django/contrib/auth/backends.pyauthenticate   s    	zModelBackend.authenticatec             C   s   | j  j   S)N)Zuser_permissionsall)r   user_objr   r   r   _get_user_permissions   s    z"ModelBackend._get_user_permissionsc             C   s<   t    j j d  } d | j   } t j j i | | 6  S)Ngroupsz	group__%s)r   Z_meta	get_fieldZrelated_query_namer   objectsfilter)r   r   Zuser_groups_fieldZuser_groups_queryr   r   r   _get_group_permissions   s    z#ModelBackend._get_group_permissionsc             C   s   | j  s" | j   s" | d k	 r) t   Sd | } t | |  s | j r] t j j   } n t |  d |  |  } | j	 d d  j
   } t | | t d d   | D   n  t | |  S)z
        Returns the permissions of `user_obj` from `from_name`. `from_name` can
        be either "group" or "user" to return permissions from
        `_get_group_permissions` or `_get_user_permissions` respectively.
        Nz_%s_perm_cachez_get_%s_permissionsZcontent_type__app_labelZcodenamec             s   s%   |  ] \ } } d  | | f Vq d S)z%s.%sNr   ).0ctnamer   r   r   	<genexpr>1   s    z0ModelBackend._get_permissions.<locals>.<genexpr>)	is_activeis_anonymoussethasattrZis_superuserr   r   r   getattrZvalues_listZorder_bysetattr)r   r   obj	from_nameZperm_cache_nameZpermsr   r   r   _get_permissions!   s    "
	&zModelBackend._get_permissionsc             C   s   |  j  | | d  S)zt
        Returns a set of permission strings the user `user_obj` has from their
        `user_permissions`.
        r   )r(   )r   r   r&   r   r   r   get_user_permissions4   s    z!ModelBackend.get_user_permissionsc             C   s   |  j  | | d  S)zr
        Returns a set of permission strings the user `user_obj` has from the
        groups they belong.
        group)r(   )r   r   r&   r   r   r   get_group_permissions;   s    z"ModelBackend.get_group_permissionsc             C   sm   | j  s" | j   s" | d  k	 r) t   St | d  sf |  j |  | _ | j j |  j |   n  | j S)N_perm_cache)r    r!   r"   r#   r)   r,   updater+   )r   r   r&   r   r   r   get_all_permissionsB   s    "z ModelBackend.get_all_permissionsc             C   s#   | j  s d S| |  j | |  k S)NF)r    r.   )r   r   permr&   r   r   r   has_permJ   s    	zModelBackend.has_permc             C   sN   | j  s d Sx: |  j |  D]) } | d | j d   | k r d Sq Wd S)zV
        Returns True if user_obj has any permissions in the given app_label.
        FN.T)r    r.   index)r   r   Z	app_labelr/   r   r   r   has_module_permsO   s    	zModelBackend.has_module_permsc             C   s@   t    } y | j j d |  SWn | j k
 r; d  SYn Xd  S)Npk)r   r   r   r
   )r   Zuser_idr   r   r   r   get_userZ   s
    	zModelBackend.get_user)__name__
__module____qualname____doc__r   r   r   r(   r)   r+   r.   r0   r3   r5   r   r   r   r   r      s   r   c               @   s@   e  Z d  Z d Z d Z d d   Z d d   Z d d   Z d	 S)
RemoteUserBackenda  
    This backend is to be used in conjunction with the ``RemoteUserMiddleware``
    found in the middleware module of this package, and is used when the server
    is handling authentication outside of Django.

    By default, the ``authenticate`` method creates ``User`` objects for
    usernames that don't already exist in the database.  Subclasses can disable
    this behavior by setting the ``create_unknown_user`` attribute to
    ``False``.
    Tc             C   s   | s
 d Sd } |  j  |  } t   } |  j rn | j j i | | j 6  \ } } | r |  j |  } q n. y | j j |  } Wn | j k
 r Yn X| S)a  
        The username passed as ``remote_user`` is considered trusted.  This
        method simply returns the ``User`` object with the given username,
        creating a new ``User`` object if ``create_unknown_user`` is ``True``.

        Returns None if ``create_unknown_user`` is ``False`` and a ``User``
        object with the given username is not found in the database.
        N)	clean_usernamer   create_unknown_userr   Zget_or_creater   configure_userr	   r
   )r   Zremote_userr   r   r   createdr   r   r   r   q   s    			zRemoteUserBackend.authenticatec             C   s   | S)z
        Performs any cleaning on the "username" prior to using it to get or
        create the user object.  Returns the cleaned username.

        By default, returns the username unchanged.
        r   )r   r   r   r   r   r;      s    z RemoteUserBackend.clean_usernamec             C   s   | S)z
        Configures a user after creation and returns the updated user.

        By default, returns the user unmodified.
        r   )r   r   r   r   r   r=      s    z RemoteUserBackend.configure_userN)r6   r7   r8   r9   r<   r   r;   r=   r   r   r   r   r:   b   s
   
 	r:   N)	
__future__r   Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   objectr   r:   r   r   r   r   <module>   s   [