
    htf#                     6   d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
mZmZ ddlmZmZ ddlmZmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ ddlmZ  ej<                  e      Z d Z!d Z"d Z#	 	 	 	 ddZ$ddl%m&Z' ddlm(Z( d Z)d Z*d Z+ddZ,ddZ-d Z.y)a
  
django-guardian helper functions.

Functions defined within this module should be considered as django-guardian's
internal functionality. They are **not** guaranteed to be stable - which means
they actual input parameters/output type may change in future releases.
    N)chain)settings)REDIRECT_FIELD_NAMEget_user_model)AnonymousUserGroup)ObjectDoesNotExistPermissionDenied)ModelQuerySet)HttpResponseForbiddenHttpResponseNotFound)render)get_content_type)NotUserNorGroupc                  t    t         j                  j                  t        j                  j                  |        S N)ospathabspathjoin)ps    X/var/www/html/software/conda/envs/higlass/lib/python3.12/site-packages/guardian/utils.py<lambda>r      s     RWW__RWW\\1%56     c                      t               } | j                  t        j                  i} | j                  j
                  di |S )zs
    Returns ``User`` instance (not ``AnonymousUser``) depending on
    ``ANONYMOUS_USER_NAME`` configuration.
     )r   USERNAME_FIELDguardian_settingsANONYMOUS_USER_NAMEobjectsget)Userlookups     r   get_anonymous_userr%      s=    
 D!!#4#H#HIF4<<%f%%r   c                    t        | t              r
t               } t        | t              r*| j                  }|t               k(  r| dfS |t        k(  rd| fS t        | t              rt        | d   t                     r| dfS t        | t              rt        | d   t              rd| fS t        | t                     r| dfS t        | t              rd| fS t        d| z        )a  
    Returns (user_obj, None) or (None, group_obj) tuple depending on what is
    given. Also accepts AnonymousUser instance but would return ``User``
    instead - it is convenient and needed for authorization backend to support
    anonymous users.

    :param identity: either ``User`` or ``Group`` instance

    :raises ``NotUserNorGroup``: if cannot return proper identity instance

    **Examples**::

       >>> from django.contrib.auth.models import User
       >>> user = User.objects.create(username='joe')
       >>> get_identity(user)
       (<User: joe>, None)

       >>> group = Group.objects.create(name='users')
       >>> get_identity(group)
       (None, <Group: users>)

       >>> anon = AnonymousUser()
       >>> get_identity(anon)
       (<User: AnonymousUser>, None)

       >>> get_identity("not instance")
       ...
       NotUserNorGroup: User/AnonymousUser or Group instance is required (got )

    Nr   z9User/AnonymousUser or Group instance is required (got %s))	
isinstancer   r%   r   modelr   r   listr   )identityidentity_model_types     r   get_identityr,   %   s    > (M*%' (H%&nn."22T>! E)>! (D!j!n>N&O~(D!j!e&DX~(N,-~(E"X~
 %'/0 1 1r   c	                 f    |xs t         j                  }|xs t        }d}	|rt         fd|D              }	|	s-|rt	         fd|D              }	nt         fd|D              }	|	s|rSt
        j                  r#t         t
        j                        }
d|
_	        |
S t
        j                  rt        t               S |rSt
        j                  r#t         t
        j                        }
d|
_	        |
S t
        j                  rt         t#               S ddlm}  | j)                         ||      S y )	NFc              3   T   K   | ]  }j                   j                  |       ! y wr   userhas_perm).0permrequests     r   	<genexpr>z"get_40x_or_None.<locals>.<genexpr>k   s      Ldgll33D9Ls   %(c              3   V   K   | ]   }j                   j                  |       " y wr   r/   r2   r3   objr4   s     r   r5   z"get_40x_or_None.<locals>.<genexpr>o   *      "5&* #*,,"7"7c"B "5   &)c              3   V   K   | ]   }j                   j                  |       " y wr   r/   r7   s     r   r5   z"get_40x_or_None.<locals>.<genexpr>r   r9   r:   i  i  r   )redirect_to_login)r   	LOGIN_URLr   allanyr   
RENDER_403r   TEMPLATE_403status_code	RAISE_403r
   r   
RENDER_404TEMPLATE_404	RAISE_404r	   r   django.contrib.auth.viewsr<   get_full_path)r4   permsr8   	login_urlredirect_field_name
return_403
return_404accept_global_permsany_permhas_permissionsresponser<   s   ` `         r   get_40x_or_NonerR   ^   s$    /X//I-D1D
 OLeLL! "5.3"5 5O " "5.3"5 5O  ++!'+<+I+IJ'*$",,&&(** ++!'+<+I+IJ'*$",,(('))C$W%:%:%<%.%8: :' r   )apps)ImproperlyConfiguredc                     	 t        t        |       }t        j                  |d      S # t        $ r }t        dj                              |d}~wt        $ r!}t        dj                  |             |d}~ww xY w)z>
    Return the model that matches the guardian settings.
    F)require_readyz-{} must be of the form 'app_label.model_name'Nz3{} refers to model '{}' that has not been installed)getattrr   django_apps	get_model
ValueErrorrT   formatLookupError)setting_namesetting_valuees      r   get_obj_perm_model_by_confr`      s}     1<@$$]%HH q"#R#Y#YZg#hiopp "AHHWde
	s    &) 	A:AA:A55A:c                     t               } t               }d}t        | j                  j	                         j                         |j                  j	                         j                               D ]H  }|j                  t        j                  d||j                  fz         |j                          |dz  }J t        j                  d|z         |S )z
    Seeks and removes all object permissions entries pointing at non-existing
    targets.

    Returns number of removed objects.
    r   zRemoving %s (pk=%d)   z5Total removed orphan object permissions instances: %d)get_user_obj_perms_modelget_group_obj_perms_modelr   r!   r>   iteratorcontent_objectloggerdebugpkdeleteinfo)UserObjectPermissionGroupObjectPermissiondeletedr3   s       r   clean_orphan_obj_permsro      s     4557G*22668AAC+33779BBDF &LL.$@AKKMqLG KKG Nr   c                    | |S t        | t              r| j                  } d | j                  j	                         D        }|D ]  }t        |dd      }|st        ||      s ||us%t        |dd      s3|j                  j                         rN|j                  j                  d      }t        |       t        |j                  j                        k(  s|c S  |S )z
    Return the matching object permission model for the obj class
    Defaults to returning the generic object permission when
    no direct foreignkey is defined or obj is None
    Nc              3   h   K   | ]*  }|j                   s|j                  r|j                  r| , y wr   )one_to_many
one_to_oneauto_created)r2   fs     r   r5   z&get_obj_perms_model.<locals>.<genexpr>   s,      GAMMQ\\q~~  Gs   02related_modelenabledTrf   )r'   r   	__class___meta
get_fieldsrW   
issubclassr!   
is_generic	get_fieldr   remote_fieldr(   )r8   base_clsgeneric_clsfieldsattrr(   fks          r   get_obj_perms_modelr      s     {#ummG--/ GF  
!ot4j1[(WUIt-L==++- [[**+;<#C(,<R__=R=R,SS L
! r   c                 >    ddl m} t        d      }t        | ||      S )z
    Returns model class that connects given ``obj`` and User class.
    If obj is not specified, then user generic object permission model
    returned is determined by the guardian setting 'USER_OBJ_PERMS_MODEL'
    r   )UserObjectPermissionBaseUSER_OBJ_PERMS_MODEL)guardian.modelsr   r`   r   )r8   r   rl   s      r   rc   rc      s$     956LMs$<>RSSr   c                 >    ddl m} t        d      }t        | ||      S )z
    Returns model class that connects given ``obj`` and Group class.
    If obj is not specified, then group generic object permission model
    returned is determined byt the guardian setting 'GROUP_OBJ_PERMS_MODEL'.
    r   )GroupObjectPermissionBaseGROUP_OBJ_PERMS_MODEL)r   r   r`   r   )r8   r   rm   s      r   rd   rd      s$     :67NOs$=?TUUr   c                 6    t        | d      rt        | d       yy)N_guardian_perms_cacheTF)hasattrdelattr)r8   s    r   evict_obj_perms_cacher      s    s+,,-r   )NNNFFFFr   )/__doc__loggingr   	itertoolsr   django.confr   django.contrib.authr   r   django.contrib.auth.modelsr   r   django.core.exceptionsr	   r
   django.db.modelsr   r   django.httpr   r   django.shortcutsr   guardian.confr   guardian.ctypesr   guardian.exceptionsr   	getLogger__name__rg   r   r%   r,   rR   django.appsrS   rX   rT   r`   ro   r   rc   rd   r   r   r   r   <module>r      s     	    C ; G , C # 7 , /			8	$
6&61r 9=9>:?",:^ , 74>TVr   