
    .ix                      F    d dl mZ ddlmZ  G d d      Zd
dZd
dZd Zy	)    )timezone   )ClientPermissionc                   p    e Zd ZdZd ZddZddZddZddZddZ	ddZ
d	 Zd
 Zd Zd Zd Zd Zd Zy)PermissionCheckerul  
    Verifica permisos de visualización para un usuario.
    
    Uso en views.py:
    ----------------
    from clients.permissions import PermissionChecker
    
    def dashboard_view(request):
        checker = PermissionChecker(request.user)
        
        # Filtrar equipos que puede ver
        allowed_teams = checker.get_allowed_teams()
        
        # Verificar permiso específico
        if checker.can_view_team(10, depth='historic'):
            # Mostrar métricas del team 10
        
        # Verificar partido
        if checker.can_view_match(123):
            # Mostrar datos del match 123
    c                      || _         i | _        y )N)user_cache)selfr	   s     =/var/www/app.tikistats.com/public_html/clients/permissions.py__init__zPermissionChecker.__init__   s    	    c                 (    | j                  d||      S )u"  
        ¿Puede ver datos de este equipo?
        
        Args:
            team_id: ID del equipo (de internal DB)
            depth: 'instant' = solo partidos, 'historic' = incluye métricas históricas
        
        Returns:
            bool: True si puede ver, False si no
        team_check)r   team_iddepths      r   can_view_teamzPermissionChecker.can_view_team#   s     {{67E22r   c                 (    | j                  d||      S )u"   ¿Puede ver datos de este partido?matchr   )r   match_idr   s      r   can_view_matchz PermissionChecker.can_view_match0   s    {{7He44r   c                 (    | j                  d||      S )u"   ¿Puede ver datos de este jugador?playerr   )r   	player_idr   s      r   can_view_playerz!PermissionChecker.can_view_player4       {{8Y66r   c                 (    | j                  d||      S )u'   ¿Puede ver datos de esta competición?competitionr   )r   competition_idr   s      r   can_view_competitionz&PermissionChecker.can_view_competition8   s    {{=.%@@r   c                 (    | j                  d||      S )u$   ¿Puede ver datos de esta división?divisionr   )r   division_idr   s      r   can_view_divisionz#PermissionChecker.can_view_division<   s    {{:{E::r   c                 (    | j                  d||      S )u"   ¿Puede ver datos de esta región?regionr   )r   	region_idr   s      r   can_view_regionz!PermissionChecker.can_view_region@   r   r   c                 $    | j                  d      S )u  
        Retorna lista de IDs de equipos que el usuario puede ver.
        
        Returns:
            None: Si tiene acceso a todos los equipos (superuser)
            []: Si no tiene acceso a ningún equipo
            [10, 15, 20]: IDs de equipos permitidos
        r   _get_allowed_resourcesr   s    r   get_allowed_teamsz#PermissionChecker.get_allowed_teamsD   s     **622r   c                 $    | j                  d      S )z#Lista de IDs de partidos permitidosr   r,   r.   s    r   get_allowed_matchesz%PermissionChecker.get_allowed_matchesO   s    **733r   c                 $    | j                  d      S )z$Lista de IDs de jugadores permitidosr   r,   r.   s    r   get_allowed_playersz%PermissionChecker.get_allowed_playersS   s    **844r   c                 $    | j                  d      S )z(Lista de IDs de competiciones permitidasr    r,   r.   s    r   get_allowed_competitionsz*PermissionChecker.get_allowed_competitionsW   s    **=99r   c                     | j                   j                  ry| d| d| }|| j                  v r| j                  |   S | j                  |||      }|| j                  |<   |S )u?  
        Verifica permiso con caché en memoria.
        
        Reglas:
        1. Superusuarios tienen acceso total
        2. Por defecto: BLOQUEADO (deny by default)
        3. Buscar permisos 'allow' activos
        4. Buscar permisos 'block' activos
        5. Block gana sobre allow (a igual prioridad)
        T:)r	   is_superuserr
   	_evaluate)r   levelresource_idr   	cache_keyresults         r   r   zPermissionChecker._check_   sp     99!! gQ{m1UG4	#;;y)) {E: "(Ir   c                    t        j                         }| d}t        j                  j	                  | j
                  d||d|      j                  d      j                  d      }g }|D ]E  }|j                  j                  |g       }	t        |	t              s0||	v s5|j                  |       G |syd}
d}|d   j                  j                  }|D ]u  }|j                  j                  |k  r nZ|d	k(  r|j                  j                  d
k(  r=|j                  j                   dk(  rd}
Y|j                  j                   dk(  ssd} n |
xr | S )u8   Evalúa permisos del usuario para un recurso específico_idsactiveT)clientstatestarts_at__lteexpires_at__gtepermission__is_activepermission__level
permissionz-permission__priorityFr   historicinstantallowblock)r   nowr   objectsfilterr	   select_relatedorder_byrelation_idget
isinstancelistappendrG   priorityr   type)r   r:   r;   r   rL   keypermsrelevantpids_list	has_allow	has_blockhighest_priorityperms                 r   r9   zPermissionChecker._evaluate|   sZ    llntn !((//99"&# 0 
 .
&xx0G'H 	  	#A}}((b1H(D)kX.E"	#
 
 		#A;11:: 	D''*::
"t'<'<	'I##w. 	%%0 		 *]*r   c           	         | j                   j                  ryt        j                         }| d}t        j
                  j                  | j                   d||d|d      }t               }|D ]@  }|j                  j                  |g       }t        |t              s0|j                  |       B t        j
                  j                  | j                   d||d|d      }t               }	|D ]@  }|j                  j                  |g       }t        |t              s0|	j                  |       B ||	z
  }
|
rt        |
      S g S )z@
        Retorna lista de IDs permitidos para un nivel.
        Nr?   r@   rJ   T)rA   rB   rC   rD   permission__typerF   rE   rK   )r	   r8   r   rL   r   rM   rN   setrQ   rR   rS   rT   update)r   r:   rL   rX   allowsallowed_idsr[   r\   blocksblocked_idsfinals              r   r-   z(PermissionChecker._get_allowed_resources   s?   
 99!!llntn "))0099$#"& 1 
 e 	-A}}((b1H(D)""8,	- "))0099$#"& 1 
 e 	-A}}((b1H(D)""8,	- k)#tE{++r   NrI   )__name__
__module____qualname____doc__r   r   r   r   r"   r&   r*   r/   r1   r3   r5   r   r9   r-    r   r   r   r      sO    ,357A;7	345::0+d0,r   r   c                 8    t        |       j                  ||      S )u+   Helper rápido para usar en cualquier parte)r   r   )r	   r   r   s      r   user_can_view_teamrq      s    T"00%@@r   c                 8    t        |       j                  ||      S )u#   Helper rápido para verificar match)r   r   )r	   r   r   s      r   user_can_view_matchrs      s    T"11(EBBr   c                 4    t        |       j                         S )z&Helper para obtener equipos permitidos)r   r/   )r	   s    r   get_user_teamsru      s    T"4466r   Nrj   )django.utilsr   modelsr   r   rq   rs   ru   ro   r   r   <module>rx      s)    ! $Z, Z,DA
C
7r   