
    sgh2                         d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	  e       Z
 G d d      Z G d de      Z G d	 d
e      Z G d de      Z G d de      Zy)    )sync_to_async)get_user_model)
Permission)ExistsOuterRefQc                   d    e Zd Zd Zd Zd Zd ZddZddZddZ	dd	Z
dd
ZddZddZddZy)BaseBackendc                      y N selfrequestkwargss      `/var/www/enzed_healthcare/enzed_env/lib/python3.12/site-packages/django/contrib/auth/backends.pyauthenticatezBaseBackend.authenticate           c                 V   K    t        | j                        |fi | d {   S 7 wr   )r   r   r   s      r   aauthenticatezBaseBackend.aauthenticate   s)     5]4#4#45gHHHHH    )')c                      y r   r   r   user_ids     r   get_userzBaseBackend.get_user   r   r   c                 T   K    t        | j                        |       d {   S 7 wr   )r   r   r   s     r   	aget_userzBaseBackend.aget_user   s"     1]4==1'::::s   (&(Nc                     t               S r   setr   user_objobjs      r   get_user_permissionsz BaseBackend.get_user_permissions   	    ur   c                 V   K    t        | j                        ||       d {   S 7 wr   )r   r%   r"   s      r   aget_user_permissionsz!BaseBackend.aget_user_permissions   s&     =]4#<#<=hLLLLr   c                     t               S r   r    r"   s      r   get_group_permissionsz!BaseBackend.get_group_permissions   r&   r   c                 V   K    t        | j                        ||       d {   S 7 wr   )r   r*   r"   s      r   aget_group_permissionsz"BaseBackend.aget_group_permissions    s&     >]4#=#=>xMMMMr   c                 R    h | j                  ||      | j                  ||      S N)r$   )r%   r*   r"   s      r   get_all_permissionszBaseBackend.get_all_permissions#   s<    
&&xS&9
''c':
 	
r   c                    K   h | j                  ||       d {   | j                  ||       d {   S 7  7 wr.   )r(   r,   r"   s      r   aget_all_permissionsz BaseBackend.aget_all_permissions)   sM     
--hC-@@
..xS.AA
 	
@As   ?;?=??c                 ,    || j                  ||      v S r.   )r/   r   r#   permr$   s       r   has_permzBaseBackend.has_perm/   s    t//c/BBBr   c                 F   K   || j                  ||       d {   v S 7 wr   )r1   r3   s       r   	ahas_permzBaseBackend.ahas_perm2   s$     T66xEEEEEs   !!r   )__name__
__module____qualname__r   r   r   r   r%   r(   r*   r,   r/   r1   r5   r7   r   r   r   r
   r
   
   sC    I;MN

CFr   r
   c                        e Zd ZdZddZddZd Zd Zd Zd Z	d Z
dd	Zdd
ZddZddZd fd	Zd fd	Zd fd	Zd Zd ZddZd Zd Z xZS )ModelBackendz9
    Authenticates against settings.AUTH_USER_MODEL.
    c                 >   ||j                  t        j                        }||y 	 t        j                  j	                  |      }|j                  |      r| j                  |      r|S y y # t        j                  $ r t               j                  |       Y y w xY wr   )	get	UserModelUSERNAME_FIELD_default_managerget_by_natural_keycheck_passworduser_can_authenticateDoesNotExistset_passwordr   r   usernamepasswordr   users         r   r   zModelBackend.authenticate;   s    zz)":":;Hx/	--@@JD ""8,1K1KD1Q 2R, %% 	/ K$$X.	/s   A- -,BBc                 n  K   ||j                  t        j                        }||y 	 t        j                  j	                  |       d {   }|j                  |       d {   r| j                  |      r|S y y 7 27 # t        j                  $ r t               j                  |       Y y w xY wwr   )	r>   r?   r@   rA   aget_by_natural_keyacheck_passwordrD   rE   rF   rG   s         r   r   zModelBackend.aauthenticateJ   s     zz)":":;Hx/
	"33GGQQD ))(3338R8R9 93 R 4 %% 	/ K$$X.	/sL   'B5"B A?B B5%B&B5?B B5,B2/B51B22B5c                     t        |dd      S )z{
        Reject users with is_active=False. Custom user models that don't have
        that attribute are allowed.
        	is_activeT)getattrr   rJ   s     r   rD   z"ModelBackend.user_can_authenticate[   s    
 t[$//r   c                 6    |j                   j                         S r   )user_permissionsallr   r#   s     r   _get_user_permissionsz"ModelBackend._get_user_permissionsb   s    ((,,..r   c                 r    t         j                  j                  |j                  j	                               S )N)	group__in)r   objectsfiltergroupsrT   rU   s     r   _get_group_permissionsz#ModelBackend._get_group_permissionse   s)    !!((8??3F3F3H(IIr   c                    |j                   r|j                  s|
t               S d|z  }t        ||      s|j                  rt
        j                  j                         }n t        | d|z        |      }|j                  dd      j                         }t        |||D ch c]  \  }}|d| c}}       t        ||      S c c}}w )z
        Return 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.
        _%s_perm_cache_get_%s_permissionscontent_type__app_labelcodename.rO   is_anonymousr!   hasattris_superuserr   rY   rT   rP   values_listorder_bysetattrr   r#   r$   	from_nameperm_cache_namepermsctnames           r   _get_permissionszModelBackend._get_permissionsh   s     !!X%:%:co5L*Y6x1$$"**..0H&;i&GHR%%&?LUUWE/QV+WXRr4,@+W x11 ,Xs   "Cc                   K   |j                   r|j                  s|
t               S d|z  }t        ||      s|j                  rt
        j                  j                         }n t        | d|z        |      }|j                  dd      j                         }t        |||2 ch c3 d{   \  }}|d|t        ||      S 7 6 nc c}}w c}}       w)zSee _get_permissions().Nr^   r_   r`   ra   rb   rc   rj   s           r   _aget_permissionszModelBackend._aget_permissions}   s     !!X%:%:co5L*Y6x1$$"**..0H&;i&GHR%%&?LUUWE<ABBDB%x11 CBBs<   B"C$C
&C*C+C.C
:CCC
	Cc                 (    | j                  ||d      S )zs
        Return a set of permission strings the user `user_obj` has from their
        `user_permissions`.
        rJ   rp   r"   s      r   r%   z!ModelBackend.get_user_permissions   s    
 $$XsF;;r   c                 D   K   | j                  ||d       d{   S 7 w)zSee get_user_permissions().rJ   Nrr   r"   s      r   r(   z"ModelBackend.aget_user_permissions   s!     ++Hc6BBBB     c                 (    | j                  ||d      S )zq
        Return a set of permission strings the user `user_obj` has from the
        groups they belong.
        grouprt   r"   s      r   r*   z"ModelBackend.get_group_permissions   s    
 $$XsG<<r   c                 D   K   | j                  ||d       d{   S 7 w)zSee get_group_permissions().ry   Nrv   r"   s      r   r,   z#ModelBackend.aget_group_permissions   s!     ++Hc7CCCCrw   c                     |j                   r|j                  s|
t               S t        |d      st        |   |      |_        |j                  S )N_perm_cache)rO   rd   r!   re   superr/   r|   )r   r#   r$   	__class__s      r   r/   z ModelBackend.get_all_permissions   sG    !!X%:%:co5Lx/#(7#>x#HH ###r   c                 D    |j                   xr t        | 	  |||      S r.   )rO   r}   r5   r   r#   r4   r$   r~   s       r   r5   zModelBackend.has_perm   s%    !!Oeg&6x3&6&OOr   c                 `   K   |j                   xr t        | 	  |||       d {   S 7 wr.   )rO   r}   r7   r   s       r   r7   zModelBackend.ahas_perm   s0     !!VEG,=hRU,=,V&VV&Vs   $.,.c                 f    |j                   xr# t        fd| j                  |      D              S )zU
        Return True if user_obj has any permissions in the given app_label.
        c              3   L   K   | ]  }|d |j                  d       k(    y wNrb   index.0r4   	app_labels     r   	<genexpr>z0ModelBackend.has_module_perms.<locals>.<genexpr>   .      *
 "4::c?#y0*
   !$)rO   anyr/   r   r#   r   s     `r   has_module_permszModelBackend.has_module_perms   s7     !! 
c *
00:*
 '
 	
r   c                    K   |j                   xr+ t        fd| j                  |       d{   D              S 7 w)zSee has_module_perms()c              3   L   K   | ]  }|d |j                  d       k(    y wr   r   r   s     r   r   z1ModelBackend.ahas_module_perms.<locals>.<genexpr>   r   r   N)rO   r   r1   r   s     `r   ahas_module_permszModelBackend.ahas_module_perms   s?     !! 
c *
"77AA*
 '
 	
As   ,?=
?c                    t        |t              r	 |j                  d      \  }}nt        |t              st        d      |t        j                  j                         S t        t        d            t        t        d            z  }t        |t              r|t        |j                        z  }n|t              z  }t        t        j                  j                  |            }|r|t        d	
      z  }||t        |      z  }t        j                  j                  |      S # t        $ r t        d      w xY w)z
        Return users that have permission "perm". By default, filter out
        inactive users and include superusers.
        rb   zDPermission name should be in the form app_label.permission_codename.z>The `perm` argument must be a string or a permission instance.pk)group__user)rJ   r   )ra   r`   T)rf   )rO   )
isinstancestrsplit
ValueErrorr   	TypeErrorr?   rA   noner   r   r   r   rY   rZ   )	r   r4   rO   include_superusersr$   r   ra   permission_quser_qs	            r   	with_permzModelBackend.with_perm   s"   
 dC &*jjo#	8 D*-P  ?--2244Xd^4qhtn7MMdJ'AM)LAxSSL
**11,?@aT**F a),,F))00883   5 s   D0 0Ec                     	 t         j                  j                  |      }| j	                  |      r|S d S # t         j                  $ r Y y w xY wNr   )r?   rA   r>   rE   rD   r   r   rJ   s      r   r   zModelBackend.get_user   sT    	--11W1=D 11$7tATA %% 		s    7 AAc                    K   	 t         j                  j                  |       d {   }| j	                  |      r|S d S 7 # t         j                  $ r Y y w xY wwr   )r?   rA   agetrE   rD   r   s      r   r   zModelBackend.aget_user   s^     	"3388G8DDD 11$7tATA E%% 		s7   A#A AA AA AAAA)NNr   )TTN)r8   r9   r:   __doc__r   r   rD   rV   r\   rp   rr   r%   r(   r*   r,   r/   r5   r7   r   r   r   r   r   __classcell__)r~   s   @r   r<   r<   6   so    "0/J2*2&<C=D$PW

!9FBBr   r<   c                       e Zd Zd Zy)AllowAllUsersModelBackendc                      yNTr   rQ   s     r   rD   z/AllowAllUsersModelBackend.user_can_authenticate   r   r   Nr8   r9   r:   rD   r   r   r   r   r          r   r   c                   6    e Zd ZdZdZd Zd Zd Zd	dZd	dZ	y)
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                 t   |syd}d}| j                  |      }| j                  r3t        j                  j                  di t        j
                  |i\  }}n 	 t        j                  j                  |      }| j                  |||      }| j                  |      r|S dS # t        j                  $ r Y >w xY w)ai  
        The username passed as ``remote_user`` is considered trusted. Return
        the ``User`` object with the given username. Create a new ``User``
        object if ``create_unknown_user`` is ``True``.

        Return None if ``create_unknown_user`` is ``False`` and a ``User``
        object with the given username is not found in the database.
        NFcreatedr   )
clean_usernamecreate_unknown_userr?   rA   get_or_creater@   rB   rE   configure_userrD   r   r   remote_userr   rJ   rH   s         r   r   zRemoteUserBackend.authenticate	  s     &&{3
 ##%66DD ++X6MD' 11DDXN ""7D'"B11$7tATA )) s   B! !B76B7c                   K   |syd}d}| j                  |      }| j                  r;t        j                  j                  di t        j
                  |i d{   \  }}n(	 t        j                  j                  |       d{   }| j                  |||       d{   }| j                  |      r|S dS 7 a7 7# t        j                  $ r Y Jw xY w7 6w)zSee authenticate().NFr   r   )
r   r   r?   rA   aget_or_creater@   rL   rE   aconfigure_userrD   r   s         r   r   zRemoteUserBackend.aauthenticate'  s     &&{3
 ##"+"<"<"K"K #++X6# MD'&77KKHUU ))'4)II11$7tATA
 V)) IsT   ACB;C#"B? B=B? 
C!C"C=B? ?CCCCc                     |S )z
        Perform any cleaning on the "username" prior to using it to get or
        create the user object.  Return the cleaned username.

        By default, return the username unchanged.
        r   )r   rH   s     r   r   z RemoteUserBackend.clean_username>  s	     r   c                     |S )zp
        Configure a user and return the updated user.

        By default, return the user unmodified.
        r   r   r   rJ   r   s       r   r   z RemoteUserBackend.configure_userG  s	     r   c                 X   K    t        | j                        |||       d{   S 7 w)zSee configure_user()N)r   r   r   s       r   r   z!RemoteUserBackend.aconfigure_userO  s(     7]4#6#67wOOOOs   !*(*N)T)
r8   r9   r:   r   r   r   r   r   r   r   r   r   r   r   r      s+    	 B<B.Pr   r   c                       e Zd Zd Zy)AllowAllUsersRemoteUserBackendc                      yr   r   rQ   s     r   rD   z4AllowAllUsersRemoteUserBackend.user_can_authenticateU  r   r   Nr   r   r   r   r   r   T  r   r   r   N)asgiref.syncr   django.contrib.authr   django.contrib.auth.modelsr   django.db.modelsr   r   r   r?   r
   r<   r   r   r   r   r   r   <module>r      sd    & . 1 0 0	)F )FX|B; |B~ 
WP WPt%6 r   