B
    @Db&                 @   sd   d dl mZ d dlmZ d dlmZ d dlmZ G dd deZ	G dd de	Z
G d	d
 d
e	ZdS )    )unicode_literals)get_user_model)
Permission)settingsc               @   sz   e Zd ZdZdddZ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d ZdS ) ModelBackendz9
    Authenticates against settings.AUTH_USER_MODEL.
    Nc          
   K   sz  | dd}|dkrt }|d kr.| |j}yb|j|}||r| |r|jrd|_|j	d k	rv| j	d7  _	nd|_	|j
dgd |S W n" |jk
r   | | d S X n|dkrrddlm} dd	lm}	 dd
lm}
 yf|jr|j d}|
jj |d}|	jj ||jd}n
| |}||rH| |rHd|_|S W n$ tk
rn } zd S d }~X Y nX nd S d S )NUserTypeuserr      login_count)Zupdate_fieldsZemployee)r   )Employee)Companycompany_name)Zname__iexact)emp_code
company_id)getr   USERNAME_FIELD_default_managerget_by_natural_keyZcheck_passworduser_can_authenticateZis_staffZ
login_typer
   ZsaveDoesNotExistZset_passworddjango.confr   mysite.personnel.modelsr   Zmysite.cloud.modelsr   ZCLOUD_VERSIONZPOSTobjectsid_get_emp_for_enterprise	Exception)selfZrequestusernameZpasswordkwargsr   	UserModelr   r   r   r   r   Zmatched_companyempe r"   1G:\easytimepro\master/mysite/accounts\backends.pyauthenticate   sB    


zModelBackend.authenticatec             C   s`   ddl m} d|kr$|jj|d}n4|jj|d}ttdddkrX|sX|jj|tjd}| S )	Nr   )r   @)Zemail)mobileZSUPPORT_MUL_COMPANYr	   )r   r   )r   r   r   filtergetattrr   ZDEFAULT_COMPANY_IDfirst)r   r   r   r    r"   r"   r#   r   7   s    z$ModelBackend._get_emp_for_enterprisec             C   s
   |j  S )N)Zuser_permissionsall)r   user_objr"   r"   r#   _get_user_permissionsE   s    z"ModelBackend._get_user_permissionsc             C   s4   |j  j|jd}dd |D }tjj|d}|S )z
        get current user's all permissions by groupprofile
        :param user_obj: current user
        :return:  all permission for current user
        )Zcompany__idc             S   s   g | ]
}|j qS r"   )Zgroup_ptr_id).0Zprofiler"   r"   r#   
<listcomp>U   s    z7ModelBackend._get_group_permissions.<locals>.<listcomp>)Zgroup__id__in)Zgroupprofile_setr*   r'   Zcurrent_companyr   r   )r   r+   Zgroup_profilesZ	group_idsZall_permissionsr"   r"   r#   _get_group_permissionsM   s    z#ModelBackend._get_group_permissionsc             C   s   |j r|js|dk	rt S d| }t||sz|jr>tj }nt| d| |}|	dd
 }t||tdd |D  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"   )r-   Zctnamer"   r"   r#   	<genexpr>i   s    z0ModelBackend._get_permissions.<locals>.<genexpr>)	is_activeis_anonymoussethasattrZis_superuserr   r   r*   r(   Zvalues_listZorder_bysetattr)r   r+   obj	from_nameZperm_cache_nameZpermsr"   r"   r#   _get_permissionsY   s    
zModelBackend._get_permissionsc             C   s   |  ||dS )zt
        Returns a set of permission strings the user `user_obj` has from their
        `user_permissions`.
        r   )r9   )r   r+   r7   r"   r"   r#   get_user_permissionsl   s    z!ModelBackend.get_user_permissionsc             C   s   |  ||dS )zr
        Returns a set of permission strings the user `user_obj` has from the
        groups they belong.
        group)r9   )r   r+   r7   r"   r"   r#   get_group_permissionss   s    z"ModelBackend.get_group_permissionsc             C   sH   |j r|js|d k	rt S t|dsB| ||_|j| | |jS )N_perm_cache)r2   r3   r4   r5   r:   r=   updater<   )r   r+   r7   r"   r"   r#   get_all_permissionsz   s    
z ModelBackend.get_all_permissionsc             C   s   |j s
dS || ||kS )NF)r2   r?   )r   r+   permr7   r"   r"   r#   has_perm   s    zModelBackend.has_permc             C   sp   |j s
dS x`| |D ]R}d|ks*td|d\}}||krJ||sd|dkr|dr|dkrdS qW dS )z`
        Returns True if user_obj has any operation permissions in the given app_label.
        F.z"The format of permissions is wrongZtransactionZiclockT)r2   r?   AssertionErrorsplitendswith)r   r+   Z	app_labelZ
model_namer@   Z
_app_labelZop_and_modelr"   r"   r#   has_model_op_perms   s    zModelBackend.has_model_op_permsc             C   s0   t  }y|jj|dS  |jk
r*   d S X d S )N)pk)r   r   r   r   )r   user_idr   r"   r"   r#   get_user   s
    zModelBackend.get_userc             C   s   t |dd}|p|dkS )z{
        Reject users with is_active=False. Custom user models that don't have
        that attribute are allowed.
        r2   N)r(   )r   r   r2   r"   r"   r#   r      s    z"ModelBackend.user_can_authenticate)NN)N)N)N)N)__name__
__module____qualname____doc__r$   r   r,   r/   r9   r:   r<   r?   rA   rF   rI   r   r"   r"   r"   r#   r      s   
*



r   c               @   s   e Zd Zdd ZdS )EmployeeBackendc             C   s6   ddl m} y|jj|dS  |jk
r0   d S X d S )Nr   )r   )rG   )r   r   r   r   r   )r   rH   r   r"   r"   r#   rI      s
    zEmployeeBackend.get_userN)rJ   rK   rL   rI   r"   r"   r"   r#   rN      s   rN   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   sv   |sdS d}|  |}t }| jrJ|jjf |j|i\}}|rr| |}n(y|j|}W n |jk
rp   Y n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   Zcreatedr"   r"   r#   r$      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#   rP      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#   rR      s    z RemoteUserBackend.configure_userN)rJ   rK   rL   rM   rQ   r$   rP   rR   r"   r"   r"   r#   rO      s
   
 	rO   N)Z
__future__r   Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   r   r   objectr   rN   rO   r"   r"   r"   r#   <module>   s    
