
    4i@E                        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 dl
Z
 G d de      Z G d d	ej                        Z G d
 dej                        Z G d dej                        Z G d dej                        Z G d dej                        Z G d dej                        Z G d dej                        Zy)    )models)AbstractUser)timezone)MinValueValidatorMaxValueValidatorValidationErrorNc                      e Zd Zg dZg dZ ej                  de      Z ej                  ded      Z ej                  dd      Z	 ej                  d	      Z ej                  d
dd      Z ej                  ed      Z ej"                  dd      Z ej&                  d      Z ej&                  d      Z ej,                  dd      Z ej0                  ej4                  dd      Zd Zed        Zd Z G d d      Zy)User))adminAdmin)coachCoachplayerPlayer)
journalist
Journalist)generalGeneral))enabledEnabled)disabledDisableddeletedDeleted   
max_lengthchoicesr   r   r    defaultTr   blankr$   zuser_logos/)	upload_tonullr$   r"   r$   r'   r$   auto_now_addauto_nowF)r"   editableuniquec                    | j                         }|rT|j                         }t        |      dk\  r |d   d    |d   d    j                         S |d   dd j                         S | j                  dd j                         S )z8Retorna las iniciales del usuario (ej: Juan Perez -> JP)   r      N)get_full_namesplitlenupperusername)self	full_namepartss      8/var/www/app.tikistats.com/public_html/clients/models.pyget_initialszUser.get_initials-   s    &&(	OO%E5zQ(1+uQx{m4::<<8BQ<%%''}}Ra &&((    c                 ,   ddl m} t        j                         }|j                  j                  | d||dd      }t               }|D ]@  }|j                  j                  dg       }t        |t              s0|j                  |       B t        |      S )z
        Retorna una lista plana de todos los IDs de equipos permitidos para este usuario.
        Busca en los permisos activos de nivel 'team'.
        r2   )ClientPermissionactiveteamT)clientstatestarts_at__lteexpires_at__gtepermission__levelpermission__is_activeteam_ids)r   r?   r   nowobjectsfiltersetrelation_idget
isinstancelistupdate)r8   r?   rI   permsidsp	team_lists          r;   rH   zUser.team_ids7   s     	-lln ((//$"& 0 
 e 	&A))*b9I)T*

9%		& Cyr=   c                 f    | j                         xs | j                   d| j                          dS )Nz ())r3   r7   get_user_type_displayr8   s    r;   __str__zUser.__str__S   s3    $$&7$--84;U;U;W:XXYZZr=   c                   d    e Zd ZdgZ ej
                  ddg       ej
                  dg      gZy)	User.Meta-created_at	user_typerC   fieldsuuidN__name__
__module____qualname__orderingr   Indexindexes r=   r;   Metar\   V   s3    !?FLLg 67FLL)
r=   rj   N)rc   rd   re   USER_TYPE_CHOICESUSER_STATE_CHOICESr   	CharFieldr^   rC   phone_number	TextFieldaddress
ImageFieldlogo	JSONFieldrP   rH   IntegerFieldinternal_player_idDateTimeField
created_at
updated_atGenericIPAddressFieldlast_login_ip	UUIDFieldra   uuid4r<   propertyrZ   rj   ri   r=   r;   r
   r
   	   s'    !  B8IJIF4FPYZE#6##r>LfT*G6}4tLD  vD9H,,,$dC &%%48J%%%t4J0F00d$GM 6DJJtLD)  6[
 
r=   r
   c                      e Zd ZdZddgZg dZddgZ ej                  dd	      Z	 ej                  d
      Z ej                  de      Z ej                  de      Z ej                  de      Z ej                  dd      Z ej"                  d
      Z ej&                  d
      Z ej&                  d
      Zd Z G d d      Zy)
Permissionu'  
    Plantilla de permisos para controlar QUÉ DATOS puede ver un usuario.
    Independiente del sistema de permisos de Django.
    
    Ejemplos:
    - "Ver estadísticas de un equipo"
    - "Bloquear visualización de equipo rival"
    - "Acceso solo a datos de partidos (no históricos)"
    )allowAllow)blockBlock))regionRegion)competitionCompetition)rA   Team)divisionDivision)matchMatchr   )instantInstant)historicHistoricd   z2Nombre descriptivo: 'Ver Equipo', 'Bloquear Rival')r   	help_textTr%   
   r   r   r   u-   Mayor número = mayor prioridad en conflictosr"   r   r"   r*   r,   c                 ^    d| j                          d| j                   d| j                   dS )N[z] z (P:rW   )get_type_displaynamepriorityrY   s    r;   rZ   zPermission.__str__   s/    4((*+2dii[T]]O1MMr=   c                       e Zd ZdZdZdZddgZ ej                  ddg       ej                  d	g       ej                  d
g      gZ	y)Permission.Metaclients_permissionzData Permission TemplatezData Permission Templatesz	-priorityr   typelevelr_   r   	is_activeN
rc   rd   re   db_tableverbose_nameverbose_name_pluralrf   r   rg   rh   ri   r=   r;   rj   r      sV    '19(FLL 12FLL-FLL.
r=   rj   N)rc   rd   re   __doc__TYPE_CHOICESLEVEL_CHOICESDEPTH_CHOICESr   rm   r   ro   descriptionr   r   depthrt   r   BooleanFieldr   rv   rw   rx   rZ   rj   ri   r=   r;   r   r   ]   s     	L
M 	 M 6FD #&"".K 6r<@DFMBEFMBE #v""AH $##D1I &%%48J%%%t4JN	
 	
r=   r   c                   f    e Zd ZdZg dZ ej                  eej                  d      Z	 ej                  e
ej                  d      Z ej                  ed      Z ej                  d	      Z ej                  d
	      Z ej$                  d	      Z ej$                  d	      Z ej*                  ded      Z ej.                  dd      Z ej$                  d      Z ej$                  d      Z ej                  eej6                  ddd      Z fdZd Zd Z G d d      Z  xZ!S )r?   u  
    Asigna un permiso de visualización a un usuario para un recurso específico.
    
    Ejemplo:
    - Usuario "juan_perez" puede ver (allow) datos del team_id=10
    - Usuario "maria_lopez" NO puede ver (block) datos del team_id=5
    
    El campo relation_id define QUÉ recurso específico:
    - Si level='team' → relation_id = {"team_id": 10}
    - Si level='match' → relation_id = {"match_id": 123}
    - Si level='player' → relation_id = {"player_id": 456}
    ))r@   Active)inactiveInactive)expiredExpiredr   data_permissions	on_deleterelated_nameassignmentsz6Ejemplo: {"team_ids": [10, 14]} o {"match_ids": [123]}r   z Puede ver datos desde esta fecha)r   z Puede ver datos hasta esta fechau(   El permiso empieza a aplicar desde aquíu   El permiso expira aquír   r@   r!   Tz(Notas administrativas sobre este permiso)r$   r   r*   r,   data_permissions_createdr   r'   r$   r   c                    t         |           | j                  sy | j                  j                  }| j
                  xs i }ddddddd}|j                  |      }|rm||vrt        d| d	| d
      ||   }t        |t              st        d| d      |st        d| d      t        d |D              st        d| d      y y )NrH   competition_idsdivision_ids	match_ids
player_ids
region_ids)rA   r   r   r   r   r   zPara nivel 'z ', el JSON debe tener la clave 'z'.zEl valor de 'z)' debe ser una lista de IDs (ej: [1, 2]).z
La lista 'u   ' no puede estar vacía.c              3   <   K   | ]  }t        |t                y w)N)rO   int).0xs     r;   	<genexpr>z)ClientPermission.clean.<locals>.<genexpr>  s     :az!S):s   zTodos los elementos en 'u   ' deben ser números enteros.)supercleanpermission_id
permissionr   rM   rN   r   rO   rP   all)r8   r   datakey_mapexpected_keyvalues	__class__s         r;   r   zClientPermission.clean   s    !!%%%2 ,& ""
 {{5)4'%UG;[\h[iik&lmm,'F fd+%l^Cl&mnn %
<.@X&YZZ :6::%(@Nk&lmm ;! r=   c                     | j                   r&t        | j                   j                               d   nd}| j                  j                   d| j
                  j                   d| j
                  j                   d| S )Nr   zN/Az | :)rM   rP   r   rB   r7   r   r   r   )r8   resources     r;   rZ   zClientPermission.__str__  sk    9=9I9I4((//1215u++&&'s4??+?+?*@DOODYDYCZZ[\d[effr=   c                     t        j                         }| j                  dk(  xr$ | j                  |cxk  xr | j                  k  S c S )u4   Verifica si el permiso está vigente en este momentor@   )r   rI   rC   	starts_at
expires_at)r8   rI   s     r;   is_valid_nowzClientPermission.is_valid_now  s@    llnJJ(" 5NNc4T__4	
4	
r=   c                       e Zd ZdZdZdZdgZ ej                  ddg       ej                  ddg       ej                  d	d
g       ej                  g d      gZ	y)ClientPermission.Metaclients_clientpermissionzClient Data PermissionzClient Data Permissionsr]   rB   rC   r_   r   r   r   )rB   rC   r   r   Nr   ri   r=   r;   rj   r   !  sh    -/7!?FLL7 34FLLw 78FLLl ;<FLL NO	
r=   rj   )"rc   rd   re   r   STATE_CHOICESr   
ForeignKeyr
   CASCADErB   r   r   rs   dictrM   	DateFieldtimeline_starttimeline_endrv   r   r   rm   rC   ro   notesrw   rx   SET_NULL
created_byr   rZ   r   rj   __classcell__r   s   @r;   r?   r?      s`   M V..'F
 #"".."J #&""JK &V%%4N $6##4L
 %$$<I &%%+J
 FM8TE F<E &%%48J%%%t4J"""///J&nPg


 

r=   r?   c                       e Zd Zg dZg dZg dZ ej                  dd      Z ej                  e
ej                  d      Z ej                  de	      Z ej                  d
      Z ej                         Z ej                  ded      Z ej                  ded      Z ej                  e
ej&                  ddd      Z ej*                  d      Z ej*                  d      Z ej*                  dd      Z ej*                  dd      Z ej*                  dd      Z ej*                  dd      Z fdZd Z G d d      Z xZS )SupportTicket))petitionPetition)	complaint	Complaint)claimClaim)
suggestion
Suggestion))lowLow)mediumMedium)highHigh)urgentUrgent))openOpen)in_progresszIn Progress)waiting_userzWaiting for User)resolvedResolved)closedClosedr   T)r   r/   ticketsr   r      r   r   r!   r   assigned_ticketsr   r*   r,   r)   c           	          | j                   s`dd l}dd l}dt        j                         j                  d       ddj                  |j                  |j                  d             | _         t        | (  |i | y )Nr   zTKT-z%Y%m%d-    )k)ticket_numberrandomstringr   rI   strftimejoinr    digitsr   save)r8   argskwargsr  r	  r   s        r;   r  zSupportTicket.savea  sm    !!#'(?(?(I'J!BGGTZTbTbcicpcptuTbTvLwKx!yDd%f%r=   c                 8    | j                    d| j                   S )N - )r  subjectrY   s    r;   rZ   zSupportTicket.__str__i  s    $$%S77r=   c                   d    e Zd ZdgZ ej
                  ddg       ej
                  dg      gZy)SupportTicket.Metar]   statusr   r_   r  Nrb   ri   r=   r;   rj   r  l  s4    !?FLL: 67FLL 12
r=   rj   ) rc   rd   re   TICKET_TYPE_CHOICESPRIORITY_CHOICESSTATUS_CHOICESr   rm   r  r   r
   r   userticket_typer  ro   r   r  r   r   assigned_torv   rw   rx   resolved_at	closed_atresponse_deadlineresolution_deadliner  rZ   rj   r   r   s   @r;   r   r   -  sf   N %F$$4@M6TV^^)TD"&""b:MNK f#.G"&""$K V^VTFv27GQYZH $&##DFOO$VZ0BDK &%%48J%%%t4J&&&&D=K$$$$d;I -,,$dC.&..DE&8
 
r=   r   c                   8   e Zd Z ej                  eej                  d      Z ej                  eej                  d      Z
 ej                         Z ej                  ed      Z ej                   d      Z ej$                  d      Zd	 Z G d
 d      Zy)TicketMessagemessagesr   T)r   r'   r(   Fr   r*   c                     d| j                   j                   d| j                  r| j                  j                   S d S )NzMessage on z by System)ticketr  senderr7   rY   s    r;   rZ   zTicketMessage.__str__  s@    T[[667tTXT_T_DKK<P<P;nooem;noor=   c                       e Zd ZdgZy)TicketMessage.Metarw   N)rc   rd   re   rf   ri   r=   r;   rj   r(    s	     >r=   rj   N)rc   rd   re   r   r   r   r   r%  r
   r   r&  ro   messagers   rP   attachmentsr   is_internal_noterv   rw   rZ   rj   ri   r=   r;   r!  r!  u  s     V}U_`FVtvTJF f G"&""4t<K +v**59%%%48Jp" "r=   r!  c                      e Zd Zg dZ ej
                  eej                  d      Z ej                  de      Z
 ej                  dd      Z ej                  dd	      Z ej                  d
      Z ej                   ed      Z ej                  dd      Z ej(                  d      Zd Z G d d      Zy)UserActivity))loginLogin)logoutLogout)	page_viewz	Page View)report_generatedzReport Generated)report_downloadedzReport Downloaded)data_exportzData Export)settings_changedzSettings Changed)api_callzAPI Call
activitiesr      r   i  Tr#   r)   r%   r(   r   r*   c                 n    | j                   j                   d| j                          d| j                   S )Nr  z at )r  r7   get_activity_type_displayrw   rY   s    r;   rZ   zUserActivity.__str__  s3    ))$$%S)G)G)I(J$tN_``r=   c                   d    e Zd ZdgZ ej
                  g d       ej
                  dg      gZy)UserActivity.Metar]   )r  activity_typerw   r_   
session_idNrb   ri   r=   r;   rj   r=    s/    !?FLL GHFLL/
r=   rj   N)rc   rd   re   ACTIVITY_TYPE_CHOICESr   r   r
   r   r  rm   r>  page_urlry   
ip_addressro   
user_agentrs   r   metadatar?  rv   rw   rZ   rj   ri   r=   r;   r-  r-    s    	 6TV^^,WD$F$$<QRM  v3d;H---4tDJ!!!-J  vD9H "!!S=J%%%48Ja
 
r=   r-  c                   d   e Zd Z ej                  eej                  d      Z ej                  dd      Z	 ej                  dd      Z
 ej                  dd	      Z ej                  d
      Z ej                  d      Z ej                  ed
      Z ej                  dd      Z ej                  ed
      Z ej                  ed
      Z ej                  dd      Z ej                  dd      Z ej0                  d
      Z ej0                  d
      Zd Z G d d      Zy)UserPreferencepreferencesr   r   en)r   r"   2   UTCr   z
YYYY-MM-DDTr   Fr(   overviewlast_30_daysliner*   r,   c                 4    d| j                   j                   S )NzPreferences for )r  r7   rY   s    r;   rZ   zUserPreference.__str__  s    !$))"4"4!566r=   c                       e Zd ZdZy)UserPreference.MetazUser preferencesN)rc   rd   re   r   ri   r=   r;   rj   rP    s    0r=   rj   N)rc   rd   re   r   OneToOneFieldr
   r   r  rm   languager   date_formatr   email_notificationssms_notificationsrs   r   notification_typesdefault_dashboard_viewrP   favorite_teamsfavorite_playersdefault_date_rangedefault_chart_typerv   rw   rx   rZ   rj   ri   r=   r;   rF  rF    s8     6][D  v2t<Hv2u=H"&""b,GK .&--d;+++E:)))$dC .V--ZP%V%%d$?N'v''DA *))RP)))RH%%%48J%%%t4J71 1r=   rF  c                      e Zd Z ej                  eej                  d      Z ej                  d      Z	 ej                         Z ej                  d      Z ej                         Z ej                  d      Z ej                  dd      Z ej                  dd	      Z ej&                  d
      Zd Z G d d      Zy)DataAccessLogdata_access_logsr   rI  r   Tr   r   r#   r)   r*   c                     | j                   j                   d| j                   d| j                   d| j                   S )Nr   r   )r  r7   actionresource_typeresource_idrY   s    r;   rZ   zDataAccessLog.__str__  s<    ))$$%SQt7I7I6J!DL\L\K]^^r=   c                   f    e Zd ZdgZ ej
                  ddg       ej
                  ddg      gZy)DataAccessLog.Metar]   r  rw   r_   rb  rc  Nrb   ri   r=   r;   rj   re    s6    !?FLL 67FLL- @A
r=   rj   N)rc   rd   re   r   r   r
   r   r  rm   rb  rt   rc  ra  ry   rB  r   access_granteddenial_reasonresponse_time_msrv   rw   rZ   rj   ri   r=   r;   r]  r]    s     6TV^^J\]D %F$$3M%&%%'KV,F .--/J(V((6N$F$$4@M +v**DA%%%48J_
 
r=   r]  )	django.dbr   django.contrib.auth.modelsr   django.utilsr   django.core.validatorsr   r   r   ra   r
   Modelr   r?   r   r!  r-  rF  r]  ri   r=   r;   <module>rn     s     3 ! X X R
< R
hD
 D
NG
v|| G
RD
FLL D
P"FLL ",0
6<< 0
h%1V\\ %1R
FLL 
r=   