Ë
    ¸2Úiœ)  ã                   ó†   — 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mZmZ d	„ Z G d
„ d«      Zy)é    )Úchain)Úget_user_model)Ú
Permission)ÚQuerySet)Ú	force_str)Úsettings)Úget_content_type)Úget_group_obj_perms_modelÚget_identityÚget_user_obj_perms_modelc                 óZ  — t        | t        «      rA| j                  }| j                  dd¬«      D �cg c]  }t	        |«      ‘Œ }}t        |«      }nQg }t        | «      D ]A  \  }}|st        |«      }t        |«      }|j                  t	        |j                  «      «       ŒC |fS c c}w )z�
    Returns the primary keys, model and content type of an iterable of Django model objects.
    Assumes that all objects are of the same content type.
    ÚpkT©Úflat)
Ú
isinstancer   ÚmodelÚvalues_listr   r	   Ú	enumerateÚtypeÚappendr   )Úobjectsr   r   ÚpksÚctypeÚidxÚobjs          úD/var/www/html/acx/venv/lib/python3.12/site-packages/guardian/core.pyÚ_get_pks_model_and_ctyper      s¥   € ô �'œ8Ô$Ø—‘ˆØ'.×':Ñ':¸4ÀdÐ':Ó'KÖL Œy˜�}ÐLˆÐLÜ  Ó'‰àˆÜ! 'Ó*ò 	*‰HˆC�ÙÜ˜S›	�Ü(¨Ó/�Ø�J‰J”y §¡Ó(Õ)ð		*ð ��uÐÐùò Ms   ²B(c                   ó^   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zed„ «       Zd„ Zy)ÚObjectPermissionCheckera
  
    Generic object permissions checker class being the heart of
    ``django-guardian``.

    .. note::
       Once checked for single object, permissions are stored and we don't hit
       database again if another check is called for this object. This is great
       for templates, views or other request based checks (assuming we don't
       have hundreds of permissions on a single object as we fetch all
       permissions for checked object).

       On the other hand, if we call ``has_perm`` for perm1/object1, then we
       change permission state and call ``has_perm`` again for same
       perm1/object1 on same instance of ObjectPermissionChecker we won't see a
       difference as permissions are already fetched and stored within cache
       dictionary.
    Nc                 óB   — t        |«      \  | _        | _        i | _        y)z¢
        Constructor for ObjectPermissionChecker.

        :param user_or_group: should be an ``User``, ``AnonymousUser`` or
          ``Group`` instance
        N)r   ÚuserÚgroupÚ_obj_perms_cache)ÚselfÚuser_or_groups     r   Ú__init__z ObjectPermissionChecker.__init__5   s   € ô !-¨]Ó ;ÑˆŒ	�4”:Ø "ˆÕó    c                 óæ   — | j                   r| j                   j                  sy| j                   r| j                   j                  ryd|v r|j                  dd«      \  }}|| j	                  |«      v S )a)  
        Checks if user/group has given permission for object.

        :param perm: permission as string, may or may not contain app_label
          prefix (if not prefixed, we grab app_label from ``obj``)
        :param obj: Django model instance for which permission should be checked

        FTú.é   )r!   Ú	is_activeÚis_superuserÚsplitÚ	get_perms)r$   Úpermr   Ú_s       r   Úhas_permz ObjectPermissionChecker.has_perm?   s_   € ð �9Š9˜TŸY™Y×0Ò0ØØ�YŠY˜4Ÿ9™9×1Ò1ØØ�$‰;Ø—j‘j  aÓ(‰GˆAˆtØ�t—~‘~ cÓ*Ð*Ð*r'   c                 óà  — t        «       }t        |«      }t        |«      }|j                  j                  j                  «       }| j                  rCdj                  ||j                  j                  j                  «       «      }|| j                  i}nd|z  | j                  i}|j                  j                  «       r'|j                  d|z  |d|z  |j                  i«       |S ||d|z  <   |S )Nz{}__group__{}z	%s__groupú%s__content_typeú%s__object_pkú%s__content_object)r   r	   r
   Ú
permissionÚfieldÚrelated_query_namer!   ÚformatÚgroupsr"   r   Ú
is_genericÚupdater   )r$   r   ÚUserr   Úgroup_modelÚgroup_rel_nameÚ	fieldnameÚgroup_filterss           r   Úget_group_filtersz)ObjectPermissionChecker.get_group_filtersP   sê   € ÜÓˆÜ  Ó%ˆä/°Ó4ˆØ$×/Ñ/×5Ñ5×HÑHÓJˆØ�9Š9Ø'×.Ñ.ØØ—‘×!Ñ!×4Ñ4Ó6óˆIð '¨¯	©	Ð2‰Mà(¨>Ñ9¸4¿:¹:ÐFˆMØ×Ñ×)Ñ)Ô+Ø× Ñ Ø" ^Ñ3°UØ .Ñ0°#·&±&ð"ô ð Ðð DGˆMÐ.°Ñ?Ñ@àÐr'   c                 ó.  — t        |«      }t        |«      }|j                  j                  j	                  «       }d|z  | j
                  i}|j                  j                  «       r'|j                  d|z  |d|z  |j                  i«       |S ||d|z  <   |S )Nz%s__userr3   r4   r5   )
r	   r   r6   r7   r8   r!   r   r;   r<   r   )r$   r   r   r   Úrelated_nameÚuser_filterss         r   Úget_user_filtersz(ObjectPermissionChecker.get_user_filtersh   s    € Ü  Ó%ˆÜ(¨Ó-ˆØ×'Ñ'×-Ñ-×@Ñ@ÓBˆà" \Ñ1°4·9±9Ð=ˆØ�=‰=×#Ñ#Ô%Ø×ÑØ" \Ñ1°5Ø ,Ñ.°·±ð!ô ð Ðð ADˆLÐ-°Ñ<Ñ=àÐr'   c                 óÈ   — t        |«      }t        j                  j                  |¬«      }| j	                  |«      } |j                  di |¤Ž}|j                  dd¬«      }|S ©N©Úcontent_typeÚcodenameTr   © )r	   r   r   ÚfilterrF   r   )r$   r   r   Úperms_qsrE   Úuser_perms_qsÚ
user_permss          r   Úget_user_permsz&ObjectPermissionChecker.get_user_permsx   sc   € Ü  Ó%ˆä×%Ñ%×,Ñ,¸%Ð,Ó@ˆØ×,Ñ,¨SÓ1ˆØ'˜Ÿ™Ñ7¨,Ñ7ˆØ"×.Ñ.¨zÀÐ.ÓEˆ
àÐr'   c                 óÈ   — t        |«      }t        j                  j                  |¬«      }| j	                  |«      } |j                  di |¤Ž}|j                  dd¬«      }|S rH   )r	   r   r   rM   rB   r   )r$   r   r   rN   rA   Úgroup_perms_qsÚgroup_permss          r   Úget_group_permsz'ObjectPermissionChecker.get_group_perms‚   sc   € Ü  Ó%ˆä×%Ñ%×,Ñ,¸%Ð,Ó@ˆØ×.Ñ.¨sÓ3ˆØ(˜Ÿ™Ñ9¨=Ñ9ˆØ$×0Ñ0°À$Ð0ÓGˆàÐr'   c                 óØ  — | j                   r| j                   j                  sg S t        j                  r| j	                  «        t        |«      }| j                  |«      }|| j                  vrît        j                  rg S | j                   rQ| j                   j                  r;t        t        j                  j                  |¬«      j                  dd¬«      «      }np| j                   rA| j                  |«      }| j                  |«      }t        t!        t#        ||«      «      «      }n#t        t!        | j                  |«      «      «      }|| j                  |<   | j                  |   S )z©
        Returns list of ``codename``'s of all permissions for given ``obj``.

        :param obj: Django model instance for which permission should be checked

        rI   rK   Tr   )r!   r+   Úguardian_settingsÚAUTO_PREFETCHÚ_prefetch_cacher	   Úget_local_cache_keyr#   r,   Úlistr   r   rM   r   rQ   rU   Úsetr   )r$   r   r   ÚkeyÚpermsrP   rT   s          r   r.   z!ObjectPermissionChecker.get_permsŒ   s(  € ð �9Š9˜TŸY™Y×0Ò0ØˆIä×*Ò*Ø× Ñ Ô"ä  Ó%ˆØ×&Ñ& sÓ+ˆØ�d×+Ñ+Ñ+ä ×.Ò.Ø�	Ø�yŠy˜TŸY™Y×3Ò3ÜÜ×&Ñ&×-Ñ-¸5Ð-ÓA×MÑMÈjÐ_cÐMÓdó‘ð —’ð "×0Ñ0°Ó5�
Ø"×2Ñ2°3Ó7�ÜœS¤ z°;Ó!?Ó@ÓA‘äœS ×!5Ñ!5°cÓ!:Ó;Ó<�Ø).ˆD×!Ñ! #Ñ&Ø×$Ñ$ SÑ)Ð)r'   c                 óZ   — t        |«      }|j                  t        |j                  «      fS )zB
        Returns cache key for ``_obj_perms_cache`` dict.
        )r	   Úidr   r   )r$   r   r   s      r   rZ   z+ObjectPermissionChecker.get_local_cache_key®   s&   € ô ! Ó%ˆØ—‘œ) C§F¡FÓ+Ð,Ð,r'   c                 óf  — | j                   r| j                   j                  sg S t        «       }t        |«      \  }}}| j                   r~| j                   j                  rht        t        j                  j                  |¬«      j                  dd¬«      «      }|D ](  }|j                  t        |«      f}|| j                  |<   Œ* yt        |«      }	| j                   rBdj                  |j                  j                   j#                  «       «      }
|
| j                   i}nd| j$                  i}|	j                  j'                  «       r|j)                  ||dœ«       n|j)                  d|i«       | j                   r¾t+        |«      }d	| j                   i}|j                  j'                  «       r|j)                  ||dœ«       n|j)                  d|i«        |j                  j                  di |¤Žj-                  d
«      } |	j                  j                  di |¤Žj-                  d
«      }t/        ||«      }n+ |	j                  j                  di |¤Žj-                  d
«      }|D ]1  }| j1                  |«      }|| j                  vsŒ#g | j                  |<   Œ3 |D ]‘  }t3        |«      j                  j'                  «       r|j                  |j4                  f}n!|j                  t        |j6                  «      f}| j                  |   j9                  |j:                  j<                  «       Œ“ y)zž
        Prefetches the permissions for objects in ``objects`` and puts them in the cache.

        :param objects: Iterable of Django model objects

        rI   rK   Tr   z	group__{}r"   )rJ   Úobject_pk__inÚcontent_object_id__inr!   r6   rL   )r!   r+   r   r   r,   r[   r   r   rM   r   r`   r   r#   r
   r9   r:   r7   r8   r"   r;   r<   r   Úselect_relatedr   rZ   r   Ú	object_pkÚcontent_object_idr   r6   rK   )r$   r   r=   r   r   r   r^   r   r]   r>   r@   rA   rE   rO   rS   r   r/   s                    r   Úprefetch_permsz&ObjectPermissionChecker.prefetch_permsµ   sï  € ð �9Š9˜TŸY™Y×0Ò0ØˆIäÓˆÜ4°WÓ=ÑˆˆU�Eà�9Š9˜Ÿ™×/Ò/ÜÜ×"Ñ"×)Ñ)°uÐ)Ó=×IÑIÈ*Ð[_ÐIÓ`óˆEð ò 3�Ø—x‘x¤¨2£Ð/�Ø-2�×%Ñ% cÒ*ð3ð ä/°Ó6ˆà�9Š9Ø#×*Ñ*Ø—‘×!Ñ!×4Ñ4Ó6óˆIð '¨¯	©	Ð2‰Mà$ d§j¡jÐ1ˆMà×Ñ×)Ñ)Ô+Ø× Ñ Ø %Ø!$ñ"õ ð
 × Ñ Ø'¨ð"ô ð �9Š9Ü,¨UÓ3ˆEà˜Ÿ	™	ðˆLð �}‰}×'Ñ'Ô)Ø×#Ñ#Ø$)Ø%(ñ%õ ð
 ×#Ñ#Ø+¨Sð%ô ð 1˜EŸM™M×0Ñ0Ñ@°<Ñ@×OÑOÐP\Ó]ˆMØ7˜[×0Ñ0×7Ñ7ÑH¸-ÑH×WÑWÐXdÓeˆNÜ˜-¨Ó8‰Eà.�K×'Ñ'×.Ñ.Ñ?°Ñ?×NÑNÈ|Ó\ˆEð ò 	0ˆCØ×*Ñ*¨3Ó/ˆCØ˜$×/Ñ/Ò/Ø-/�×%Ñ% cÒ*ð	0ð
 ò 	HˆDÜ�D‹z×!Ñ!×,Ñ,Ô.Ø—x‘x §¡Ð0‘à—x‘x¤¨4×+AÑ+AÓ!BÐC�à×!Ñ! #Ñ&×-Ñ-¨d¯o©o×.FÑ.FÕGð	Hð r'   c                 óÂ   — i }|D ]N  }|j                  d«      j                  ddd«      }|D ]%  }|d d |vrg ||d d <   ||d d xx   |d   gz  cc<   Œ' ŒP || _        | |fS )NÚpermission__codenameÚcontent_type_idre   é   )rd   r   Ú_guardian_perms_cache)r   Ú	querysetsÚcacheÚqsr^   Úps         r   Ú_init_obj_prefetch_cachez0ObjectPermissionChecker._init_obj_prefetch_cache	  s–   € àˆØò 	)ˆBØ×%Ñ%Ð&<Ó=×IÑIÐJ[Ð]hØJ`óbˆEàò )�Ø�R�a�5 Ñ%Ø#%�E˜!˜B˜Q˜%‘LØ�a˜˜�e“  1¡ Ñ(”ñ)ð	)ð %*ˆÔ!Ø�EˆzÐr'   c                 óž  — ddl m}m}  |«       } |«       }| j                  rE| j                  }|j                  j                  |¬«      |j                  j                  |¬«      g}n)| j                  }|j                  j                  |¬«      g}t        |d«      s | j                  |g|¢­Ž \  }}|| _
        y |j                  }|| _
        y )Nr   )r   r
   )r!   )Úgroup__user)r"   rl   )Úguardian.utilsr   r
   r!   r   rM   r"   Úhasattrrq   rl   r#   )r$   r   r
   ÚUserObjectPermissionÚGroupObjectPermissionr   rm   rn   s           r   rY   z'ObjectPermissionChecker._prefetch_cache  sÌ   € ßVÙ7Ó9ÐÙ 9Ó ;ÐØ�9Š9Ø—)‘)ˆCà$×,Ñ,×3Ñ3¸Ð3Ó=Ø%×-Ñ-×4Ñ4ÀÐ4ÓEð‰Ið
 —*‘*ˆCà%×-Ñ-×4Ñ4¸3Ð4Ó?ðˆIô �sÐ3Ô4Ø6˜×6Ñ6°sÐG¸YÒG‰JˆC�ð !&ˆÕð ×-Ñ-ˆEØ %ˆÕr'   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r1   rB   rF   rQ   rU   r.   rZ   rg   Ústaticmethodrq   rY   rL   r'   r   r   r   "   sP   „ ñó$#ò+ò"ò0ò òò *òD-òRðh ñ
ó ð
ó&r'   r   N)Ú	itertoolsr   Údjango.contrib.authr   Údjango.contrib.auth.modelsr   Údjango.db.models.queryr   Údjango.utils.encodingr   Úguardian.confr   rW   Úguardian.ctypesr	   rt   r
   r   r   r   r   rL   r'   r   ú<module>r„      s1   ðÝ å .Ý 1Ý +Ý +å 7Ý ,ß \Ñ \ò÷*H&ò H&r'   