Ë
    ¸2Úi#  ã                   ó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    úE/var/www/html/acx/venv/lib/python3.12/site-packages/guardian/utils.pyú<lambda>r      s    € ”R—W‘W—_‘_¤R§W¡W§\¡\°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ÐI€FØˆ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Ô%Ø&Ÿn™nÐØ¤.Ó"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    øè ø€ ÒL¸d˜gŸl™l×3Ñ3°D×9ÑLùs   ƒ%(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Ø-ÒDÔ1DÐð
 €OáÜÓLÀeÔLÓLˆáÙÜ!ô "5Ø.3ô"5ó 5‰Oô "ô "5Ø.3ô"5ó 5ˆOñ ÙÜ ×+Ò+Ü! 'Ô+<×+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Ñ#YÐZgÓ#hÓiÐopÐ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ò ˆà×ÑÑ&Ü�L‰LÐ.°$¸¿¹°Ñ@ÔAØ�K‰KŒMØ�q‰L‰Gðô ‡K�KÐ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Ø—M’M Q§\¢\°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ÔØ�m‰mˆñG˜Ÿ™×-Ñ-Ó/ô G€Fð ò 
!ˆÜ˜˜o¨tÓ4ˆÚ”j ¨Õ1Ø˜[Ò(¬W°U¸IÀtÕ-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Ü5Ð6LÓ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$   € õ :Ü6Ð7NÓ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1ðr 9=Ø9>Ø:?Ø"ó,:õ^ ,Ý 7òòò4ó>TóVór   