o
    Ch                     @   s   d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZ i ZG dd	 d	eZG d
d deZG dd dedZefddZdd Zdd Zdd Zdd Zdd Zdd ZdS )    )unicode_literalsN)Group
Permission)get_user_model)ContentType)camelToSnakecamel_or_snake_to_title)RoleDoesNotExistc                   @   s8   e Zd Zdd Zedd Zedd Zedd Zd	S )
RolesManagerc                 C   s   t tS N)iterregistered_rolescls r   g/var/www/html/myvaluetrips/my_value_trip_new/venv/lib/python3.10/site-packages/rolepermissions/roles.py__iter__   s   zRolesManager.__iter__c                 C   s   |t v rt | S d S r   )r   )r   	role_namer   r   r   retrieve_role   s   zRolesManager.retrieve_rolec                 C      t  S r   )r   keysr   r   r   r   get_roles_names      zRolesManager.get_roles_namesc                 C   r   r   )r   valuesr   r   r   r   	get_roles   r   zRolesManager.get_rolesN)__name__
__module____qualname__r   classmethodr   r   r   r   r   r   r   r
      s    

r
   c                       s(   e Zd Zedd Z fddZ  ZS )RolesClassRegisterc                 C   s   | d ur
t | ddS dS )NabstractF)getattr)metar   r   r   is_abstract%   s   zRolesClassRegister.is_abstractc                    s<   | dd }tt| | |||}| |s|t| < |S )NMeta)getsuperr   __new__r#   r   get_name)r   nameparentsdctr"   
role_class	__class__r   r   r'   ,   s
   
zRolesClassRegister.__new__)r   r   r   staticmethodr#   r'   __classcell__r   r   r-   r   r   #   s    
r   c                   @   s   e Zd ZG dd dZedd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Zedd ZdS )AbstractUserRolec                   @   s   e Zd ZdZdS )zAbstractUserRole.MetaTN)r   r   r   r    r   r   r   r   r$   6   s    r$   c                 C   s   t | dr| jS t| jS )Nr   )hasattrr   r   r   r   r   r   r   r(   9   s   

zAbstractUserRole.get_namec                 C   s:   t jj|  d\}}|j| |  }|jj|  |S )z
        Assign this role to a user.

        :returns: :py:class:`django.contrib.auth.models.Group` The group for the
            new role.
        r)   )r   objectsget_or_creater(   groupsaddget_default_true_permissionsuser_permissions)r   usergroup_createdpermissions_to_addr   r   r   assign_role_to_user@   s
   z$AbstractUserRole.assign_role_to_userc                 C   s^   ddl m} t }||}t }t|D ]	}||  q|D ]}||j r,|| q |S )zo
        Get all true permissions for a user excluding ones that
        have been explicitly revoked.
        r   )available_perm_status)rolepermissions.permissionsr?   setget_user_rolesupdater8   codenamer7   )r   r:   r?   default_true_permissionsuser_permission_statesadjusted_true_permissionsrole
permissionr   r   r   _get_adjusted_true_permissionsO   s   

z/AbstractUserRole._get_adjusted_true_permissionsc                 C   sF   |  |}|  \}}|j| |  |}||}|jj|  |S )a  
        Remove this role from a user.

        WARNING: Any permissions that were explicitly granted to the user
        that are also defined to be granted by this role will be revoked
        when this role is revoked.

        Example:
            >>> class Doctor(AbstractUserRole):
            ...     available_permissions = {
            ...         "operate": False,
            ...     }
            >>>
            >>> class Surgeon(AbstractUserRole):
            ...     available_permissions = {
            ...         "operate": True,
            ...     }
            >>>
            >>> grant_permission(user, "operate")
            >>> remove_role(user, Surgeon)
            >>>
            >>> has_permission(user, "operate")
            False
            >>>

        In the example, the user no longer has the ``"operate"`` permission,
        even though it was set explicitly before the ``Surgeon`` role was removed.
        )rJ   get_or_create_groupr6   remove
differencer9   )r   r:   !current_adjusted_true_permissionsr;   r<   new_adjusted_true_permissionspermissions_to_remover   r   r   remove_role_from_userg   s   
 
z&AbstractUserRole.remove_role_from_userc                 C   s   t | di }| S )Navailable_permissions)r!   r   )r   rR   r   r   r   permission_names_list   s   z&AbstractUserRole.permission_names_listc                 C   s   t |  }|r| |S g S r   )listrS   get_or_create_permissionsr   permission_namesr   r   r   get_all_permissions   s   
z$AbstractUserRole.get_all_permissionsc                 C   s,   t | drdd | j D }| |S g S )NrR   c                 S   s   g | ]\}}|r|qS r   r   ).0keydefaultr   r   r   
<listcomp>   s    zAAbstractUserRole.get_default_true_permissions.<locals>.<listcomp>)r2   rR   itemsrU   rV   r   r   r   r8      s   

z-AbstractUserRole.get_default_true_permissionsc                 C   st   t jt }ttjj||d }t|tdd |D  }t	|dkr8|D ]}t
|\}}|r7|| q(|S )N)content_typecodename__inc                 s   s    | ]}|j V  qd S r   )rD   )rY   pr   r   r   	<genexpr>   s    z=AbstractUserRole.get_or_create_permissions.<locals>.<genexpr>r   )r   r4   get_for_modelr   rT   r   filterallrA   lenget_or_create_permissionappend)r   rW   user_ctpermissionsmissing_permissionspermission_namerI   createdr   r   r   rU      s   
z*AbstractUserRole.get_or_create_permissionsc                 C   s
   | j | S r   )rR   )r   rk   r   r   r   get_default      
zAbstractUserRole.get_defaultc                 C   s   t jj|  dS )Nr3   )r   r4   r5   r(   r   r   r   r   rK      s   z$AbstractUserRole.get_or_create_groupN)r   r   r   r$   r   r(   r>   rJ   rQ   rS   rX   r8   rU   rm   rK   r   r   r   r   r1   4   s,    



.





r1   )	metaclassc                 C   s:   t jt }tjj|| dt|r|| idS |idS )z
    Get a Permission object from a permission name.
    @:param codename: permission code name
    @:param name: human-readable permissions name (str) or callable that takes codename as
                  argument and returns str
    r)   )r^   rD   defaults)r   r4   rb   r   r   r5   callable)rD   r)   rh   r   r   r   rf      s   
rf   c                 C   s
   t | S )z#Get a Role object from a role name.)r
   r   )r   r   r   r   r      rn   r   c                 C   s0   | r| j  }dd |D }t|dd dS g S )zGet a list of a users's roles.c                 s   s*    | ]}|j t v rt|j V  qd S r   )r)   r
   r   r   )rY   r;   r   r   r   ra      s   ( z!get_user_roles.<locals>.<genexpr>c                 S   s   |   S r   )r(   )rr   r   r   <lambda>   s    z get_user_roles.<locals>.<lambda>)rZ   )r6   rd   sorted)r:   r6   rolesr   r   r   rB      s
   
rB   c                 C   s0   |}t |st|}|stt|||  |S r   )inspectisclassr   r	   r!   )r:   rH   method_namerole_clsr   r   r   _assign_or_remove_role   s   
rz   c                 C      t | |dS )zAssign a role to a user.r>   rz   r:   rH   r   r   r   assign_role      r~   c                 C   r{   )zRemove a role from a user.rQ   r|   r}   r   r   r   remove_role   r   r   c                 C   s    t | }|D ]}||  q|S )zRemove all roles from a user.)rB   rQ   )r:   ru   rH   r   r   r   clear_roles   s   r   )
__future__r   rv   django.contrib.auth.modelsr   r   django.contrib.authr   "django.contrib.contenttypes.modelsr   rolepermissions.utilsr   r   rolepermissions.exceptionsr	   r   objectr
   typer   r1   rf   r   rB   rz   r~   r   r   r   r   r   r   <module>   s&     
