
    .iB@                        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 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                 f    | j                         xs | j                   d| j                          dS )Nz ())get_full_nameusernameget_user_type_displayselfs    8/var/www/app.tikistats.com/public_html/clients/models.py__str__zUser.__str__-   s3    $$&7$--84;U;U;W:XXYZZ    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_typestatefieldsuuidN__name__
__module____qualname__orderingr   Indexindexes r9   r7   Metar;   0   s3    !?FLLg 67FLL)
r9   rJ   N)rC   rD   rE   USER_TYPE_CHOICESUSER_STATE_CHOICESr   	CharFieldr=   r>   phone_number	TextFieldaddress
ImageFieldlogo	JSONFieldlistteam_idsIntegerFieldinternal_player_idDateTimeField
created_at
updated_atGenericIPAddressFieldlast_login_ip	UUIDFieldrA   uuid4r8   rJ   rI   r9   r7   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[
 
r9   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)team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"   rt   r"   r*   r,   c                 ^    d| j                          d| j                   d| j                   dS )N[z] z (P:r1   )get_type_displaynamepriorityr5   s    r7   r8   zPermission.__str__o   s/    4((*+2dii[T]]O1MMr9   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   r9   r7   rJ   r~   r   sV    '19(FLL 12FLL-FLL.
r9   rJ   N)rC   rD   rE   __doc__TYPE_CHOICESLEVEL_CHOICESDEPTH_CHOICESr   rM   r{   rO   descriptionr   r   depthrV   r|   BooleanFieldr   rX   rY   rZ   r8   rJ   rI   r9   r7   r`   r`   7   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	
 	
r9   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 )ClientPermissionu  
    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}
    ))activeActive)inactiveInactive)expiredExpiredr   data_permissions	on_deleterelated_nameassignmentsz6Ejemplo: {"team_ids": [10, 14]} o {"match_ids": [123]}rv   z Puede ver datos desde esta fecha)rt   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$   rt   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 )NrU   competition_idsdivision_ids	match_ids
player_ids
region_ids)ri   rg   rk   rm   r   re   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)
isinstanceint).0xs     r7   	<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   relation_idgetr   r   rT   all)r6   r   datakey_mapexpected_keyvalues	__class__s         r7   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 ;! r9   c                     | j                   r&t        | j                   j                               d   nd}| j                  j                   d| j
                  j                   d| j
                  j                   d| S )Nr   zN/Az | :)r   rT   r   clientr3   r   r{   r   )r6   resources     r7   r8   zClientPermission.__str__   sk    9=9I9I4((//1215u++&&'s4??+?+?*@DOODYDYCZZ[\d[effr9   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   nowr>   	starts_at
expires_at)r6   r   s     r7   is_valid_nowzClientPermission.is_valid_now   s@    llnJJ(" 5NNc4T__4	
4	
r9   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<   r   r>   r?   r   r   r   )r   r>   r   r   Nr   rI   r9   r7   rJ   r      sh    -/7!?FLL7 34FLLw 78FLLl ;<FLL NO	
r9   rJ   )"rC   rD   rE   r   STATE_CHOICESr   
ForeignKeyr
   CASCADEr   r`   r   rS   dictr   	DateFieldtimeline_starttimeline_endrX   r   r   rM   r>   rO   notesrY   rZ   SET_NULL
created_byr   r8   r   rJ   __classcell__r   s   @r7   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


 

r9   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   r   strftimejoinr    digitsr   save)r6   argskwargsr   r   r   s        r7   r   zSupportTicket.save;  sm    !!#'(?(?(I'J!BGGTZTbTbcicpcptuTbTvLwKx!yDd%f%r9   c                 8    | j                    d| j                   S )N - )r   subjectr5   s    r7   r8   zSupportTicket.__str__C  s    $$%S77r9   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   r9   r7   rJ   r   F  s4    !?FLL: 67FLL 12
r9   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_torX   rY   rZ   resolved_at	closed_atresponse_deadlineresolution_deadliner   r8   rJ   r   r   s   @r7   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
 
r9   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(   Frw   r*   c                     d| j                   j                   d| j                  r| j                  j                   S d S )NzMessage on z by System)ticketr   senderr3   r5   s    r7   r8   zTicketMessage.__str__]  s@    T[[667tTXT_T_DKK<P<P;nooem;noor9   c                       e Zd ZdgZy)TicketMessage.MetarY   N)rC   rD   rE   rF   rI   r9   r7   rJ   r  `  s	     >r9   rJ   N)rC   rD   rE   r   r   r   r   r  r
   r   r  rO   messagerS   rT   attachmentsr   is_internal_noterX   rY   r8   rJ   rI   r9   r7   r
  r
  O  s     V}U_`FVtvTJF f G"&""4t<K +v**59%%%48Jp" "r9   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(   rs   r*   c                 n    | j                   j                   d| j                          d| j                   S )Nr   z at )r  r3   get_activity_type_displayrY   r5   s    r7   r8   zUserActivity.__str__  s3    ))$$%S)G)G)I(J$tN_``r9   c                   d    e Zd ZdgZ ej
                  g d       ej
                  dg      gZy)UserActivity.Metar<   )r  activity_typerY   r?   
session_idNrB   rI   r9   r7   rJ   r&    s/    !?FLL GHFLL/
r9   rJ   N)rC   rD   rE   ACTIVITY_TYPE_CHOICESr   r   r
   r   r  rM   r'  page_urlr[   
ip_addressrO   
user_agentrS   r   metadatar(  rX   rY   r8   rJ   rI   r9   r7   r  r  e  s    	 6TV^^,WD$F$$<QRM  v3d;H---4tDJ!!!-J  vD9H "!!S=J%%%48Ja
 
r9   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   ru   en)r   r"   2   UTCr   z
YYYY-MM-DDTrw   Fr(   overviewlast_30_daysliner*   r,   c                 4    d| j                   j                   S )NzPreferences for )r  r3   r5   s    r7   r8   zUserPreference.__str__  s    !$))"4"4!566r9   c                       e Zd ZdZy)UserPreference.MetazUser preferencesN)rC   rD   rE   r   rI   r9   r7   rJ   r9    s    0r9   rJ   N)rC   rD   rE   r   OneToOneFieldr
   r   r  rM   languager   date_formatr   email_notificationssms_notificationsrS   r   notification_typesdefault_dashboard_viewrT   favorite_teamsfavorite_playersdefault_date_rangedefault_chart_typerX   rY   rZ   r8   rJ   rI   r9   r7   r/  r/    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 1r9   r/  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   r2  r   Trw   r   r#   r)   r*   c                     | j                   j                   d| j                   d| j                   d| j                   S )Nr    r   )r  r3   actionresource_typeresource_idr5   s    r7   r8   zDataAccessLog.__str__  s<    ))$$%SQt7I7I6J!DL\L\K]^^r9   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  rY   r?   rK  rL  NrB   rI   r9   r7   rJ   rN    s6    !?FLL 67FLL- @A
r9   rJ   N)rC   rD   rE   r   r   r
   r   r  rM   rK  rV   rL  rJ  r[   r+  r   access_granteddenial_reasonresponse_time_msrX   rY   r8   rJ   rI   r9   r7   rF  rF    s     6TV^^J\]D %F$$3M%&%%'KV,F .--/J(V((6N$F$$4@M +v**DA%%%48J_
 
r9   rF  )	django.dbr   django.contrib.auth.modelsr   django.utilsr   django.core.validatorsr   r   r   rA   r
   Modelr`   r   r   r
  r  r/  rF  rI   r9   r7   <module>rW     s     3 ! X X ,
< ,
\D
 D
NG
v|| G
RD
FLL D
P"FLL ",0
6<< 0
h%1V\\ %1R
FLL 
r9   