Ë
    ¸2ÚiY  ã                   ó�   — d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ dd„Zd„ Zd„ Zy)é    )Úapps)Úsettings)ÚREDIRECT_FIELD_NAME)ÚModel)Ú	ModelBase)ÚQuerySet)Úget_object_or_404©Úwraps)ÚGuardianError)Úget_40x_or_NoneNc                 ó8  ‡ ‡‡‡‡‡‡— |j                  dt        j                  «      Š|j                  dt        «      Š|j                  dd«      Š|j                  dd«      Š|j                  dd«      Št	        ‰ t
        «      st        d«      ‚ˆˆˆˆ ˆˆˆfd„}|S )	aª  
    Decorator for views that checks whether a user has a particular permission
    enabled.

    Optionally, instances for which check should be made may be passed as an
    second argument or as a tuple parameters same as those passed to
    ``get_object_or_404`` but must be provided as pairs of strings. This way
    decorator can fetch i.e. ``User`` instance based on performed request and
    check permissions on it (without this, one would need to fetch user instance
    at view's logic and check permission inside a view).

    :param login_url: if denied, user would be redirected to location set by
      this parameter. Defaults to ``django.conf.settings.LOGIN_URL``.
    :param redirect_field_name: name of the parameter passed if redirected.
      Defaults to ``django.contrib.auth.REDIRECT_FIELD_NAME``.
    :param return_403: if set to ``True`` then instead of redirecting to the
      login page, response with status code 403 is returned (
      ``django.http.HttpResponseForbidden`` instance or rendered template -
      see :setting:`GUARDIAN_RENDER_403`). Defaults to ``False``.
    :param return_404: if set to ``True`` then instead of redirecting to the
      login page, response with status code 404 is returned (
      ``django.http.HttpResponseNotFound`` instance or rendered template -
      see :setting:`GUARDIAN_RENDER_404`). Defaults to ``False``.
    :param accept_global_perms: if set to ``True``, then *object level
      permission* would be required **only if user does NOT have global
      permission** for target *model*. If turned on, makes this decorator
      like an extension over standard
      ``django.contrib.admin.decorators.permission_required`` as it would
      check for global permissions first. Defaults to ``False``.

    Examples::

        @permission_required('auth.change_user', return_403=True)
        def my_view(request):
            return HttpResponse('Hello')

        @permission_required('auth.change_user', (User, 'username', 'username'))
        def my_view(request, username):
            '''
            auth.change_user permission would be checked based on given
            'username'. If view's parameter would be named ``name``, we would
            rather use following decorator::

                @permission_required('auth.change_user', (User, 'username', 'name'))
            '''
            user = get_object_or_404(User, username=username)
            return user.get_absolute_url()

        @permission_required('auth.change_user',
            (User, 'username', 'username', 'groups__name', 'group_name'))
        def my_view(request, username, group_name):
            '''
            Similar to the above example, here however we also make sure that
            one of user's group is named same as request's ``group_name`` param.
            '''
            user = get_object_or_404(User, username=username,
                group__name=group_name)
            return user.get_absolute_url()

    Ú	login_urlÚredirect_field_nameÚ
return_403FÚ
return_404Úaccept_global_permsz`First argument must be in format: 'app_label.codename or a callable which return similar string'c                 ó@   •‡ — ˆˆˆˆˆˆˆˆ fd„} t        ‰ «      |«      S )Nc           
      óL  •— d }‰rü‰d   ‰dd  }}t        |t        «      r=|j                  d«      }t        |«      dk7  rt	        d«      ‚t        j                  |Ž }nAt        |j                  t        t        t        f«      rnt	        d|›dt        |«      ›d�«      ‚t        |«      dz  dk7  rt	        d	«      ‚i }t        |d d d…   |dd d…   «      D ]  \  }}	|	|vrt	        d
|	z  «      ‚||	   ||<   Œ! t        |fi |¤Ž}t        | ‰g|‰‰‰‰‰¬«      }
|
r|
S  ‰| g|¢­i |¤ŽS )Nr   é   ú.é   zPIf model should be looked up from string it needs format: 'app_label.ModelClass'z_First lookup argument must always be a model, string pointing at app/model or queryset. Given: z (type: ú)zHLookup variables must be provided as pairs of lookup_string and view_argz-Argument %s was not passed into view function)ÚpermsÚobjr   r   r   r   r   )Ú
isinstanceÚstrÚsplitÚlenr   r   Ú	get_modelÚ
issubclassÚ	__class__r   r   r   ÚtypeÚzipr	   r   )ÚrequestÚargsÚkwargsr   ÚmodelÚlookupsÚsplittedÚlookup_dictÚlookupÚview_argÚresponser   r   Úlookup_variablesÚpermr   r   r   Ú	view_funcs              €€€€€€€€úJ/var/www/html/acx/venv/lib/python3.12/site-packages/guardian/decorators.pyÚ_wrapped_viewz=permission_required.<locals>.decorator.<locals>._wrapped_viewX   s€  ø€ ð ˆCÙØ!1°!Ñ!4Ð6FÀqÀrÐ6J�w�ä˜e¤SÔ)Ø$Ÿ{™{¨3Ó/�HÜ˜8“}¨Ò)Ü+ð -]ó ^ð ^ä ŸN™N¨HÐ5‘EÜ §¡´%¼ÄHÐ1MÔNØå'âBGÌÈeÍð)Vó Wð Wô �w“< !Ñ# qÒ(Ü'ð )Qó Rð Rà �Ü(+¨G±C°a°C©L¸'À!À$ÀQÀ$¹-Ó(Hò ;Ñ$�F˜HØ vÑ-Ü+ð -AØCKñ-Ló Mð Mà*0°Ñ*:�K Ò'ð	;ô
 (¨Ñ=°Ñ=�ä& w°t°fÀ#Ø1:ÐPcØ2<ÈÐi|ô~ˆHñ Ø�Ù˜WÐ6 tÒ6¨vÑ6Ð6ó    r
   )	r1   r3   r   r   r/   r0   r   r   r   s	   ` €€€€€€€r2   Ú	decoratorz&permission_required.<locals>.decoratorW   s"   ù€ ÷$	7ó $	7ðJ  Œu�YÓ Ó.Ð.r4   )Úpopr   Ú	LOGIN_URLr   r   r   r   )	r0   r/   r'   r5   r   r   r   r   r   s	   ``  @@@@@r2   Úpermission_requiredr8      s—   þ€ ðz —
‘
˜;¬×(:Ñ(:Ó;€IØ Ÿ*™*ØÔ2ó4Ðà—‘˜L¨%Ó0€JØ—‘˜L¨%Ó0€JØ Ÿ*™*Ð%:¸EÓBÐô �dœCÔ Üð ]ó ^ð 	^÷&/ò &/ðN Ðr4   c                 ó*   — d|d<   t        | g|¢­i |¤ŽS )aŸ  
    Simple wrapper for permission_required decorator.

    Standard Django's permission_required decorator redirects user to login page
    in case permission check failed. This decorator may be used to return
    HttpResponseForbidden (status 403) instead of redirection.

    The only difference between ``permission_required`` decorator is that this
    one always set ``return_403`` parameter to ``True``.
    Tr   ©r8   ©r0   r&   r'   s      r2   Úpermission_required_or_403r<   �   ó#   € ð  €Fˆ<ÑÜ˜tÐ5 dÒ5¨fÑ5Ð5r4   c                 ó*   — d|d<   t        | g|¢­i |¤ŽS )až  
    Simple wrapper for permission_required decorator.

    Standard Django's permission_required decorator redirects user to login page
    in case permission check failed. This decorator may be used to return
    HttpResponseNotFound (status 404) instead of redirection.

    The only difference between ``permission_required`` decorator is that this
    one always set ``return_404`` parameter to ``True``.
    Tr   r:   r;   s      r2   Úpermission_required_or_404r?   �   r=   r4   )N)Údjango.appsr   Údjango.confr   Údjango.contrib.authr   Údjango.db.modelsr   Údjango.db.models.baser   Údjango.db.models.queryr   Údjango.shortcutsr	   Údjango.utils.functionalr   Úguardian.exceptionsr   Úguardian.utilsr   r8   r<   r?   © r4   r2   ú<module>rK      s4   ðÝ Ý  Ý 3Ý "Ý +Ý +Ý .Ý )Ý -Ý *óqòh6ó6r4   