o
    i                     @   sx   d dl mZ d dlmZ d dlmZ d dlZd dlZd dlZddl	m
Z
 d dlmZ eeZdd	 ZG d
d dZdS )    )ContentType)DjangoJSONEncoder)timezoneN   )AuditLog)Usuarioc              
   C   s   zJt | dr	| jsW dS t | jdr| jjsW dS d}t | jdr&| jj}n
t | jdr0| jj}|rHz	tjj|dW W S  tjyG   Y W dS w W dS  t	ye } zt
d|  W Y d}~dS d}~ww )z
    Obtiene el usuario real a partir del request.
    
    Args:
        request: Objeto request de Django
        
    Returns:
        Instancia de Usuario o None
    userNis_authenticatedpkid)r
   zError al obtener usuario real: )hasattrr   r	   r
   r   r   objectsgetDoesNotExist	Exceptionloggererror)requestuser_ide r   */var/www/html/crm_dreinet/audit/helpers.pyget_real_user   s,   

r   c                   @   s&   e Zd ZedddZedd ZdS )AuditHelperN c              
   C   s  z|du rt d W dS d}|r)|jd}|r#|dd  }n|jd}| du r5|dur5t|} d}	|durgzt|}
t	
t	j|
td}	W n tyf } zt d|  W Y d}~nd}~ww d}|durzt|}t	
t	j|td}W n ty } zt d	|  W Y d}~nd}~ww t|||	||d
}| durt| tr| |_|rztj|j}||_|j|_W n ty } zt d|  W Y d}~nd}~ww |  |W S  ty } zt d|  ddl}t |  W Y d}~dS d}~ww )u  
        Registra una acción en el sistema de auditoría.
        
        Args:
            user: Usuario que realizó la acción (puede ser None para acciones anónimas)
            action: Tipo de acción (CREATE, UPDATE, DELETE, etc.)
            instance: Instancia del modelo afectado
            data_before: Datos antes del cambio (para UPDATE)
            data_after: Datos después del cambio (para UPDATE)
            description: Descripción adicional de la acción
            request: Objeto request para obtener la IP (opcional)
        
        Returns:
            Instancia del registro de auditoría creado o None en caso de error
        Nu6   No se especificó la acción para el log de auditoríaHTTP_X_FORWARDED_FOR,r   REMOTE_ADDR)clsz'Error al convertir data_before a JSON: z&Error al convertir data_after a JSON: )action
ip_addressdata_before
data_afterdescriptionzError al obtener ContentType: u   Error al registrar auditoría: )r   r   METAr   splitstripr   r   _preprocess_datesjsonloadsdumpsr   r   r   
isinstancer   r   r   r   get_for_model	__class__content_typer
   	object_idsave	traceback
format_exc)r   r   instancer!   r"   r#   r   r    x_forwarded_forsafe_data_beforeprocessed_data_beforer   safe_data_afterprocessed_data_after	audit_logr.   r1   r   r   r   
log_action0   sr   


	zAuditHelper.log_actionc                 C   s   t | tri }|  D ]\}}t|||< q|S t | tr%dd | D S t | trzzHd| v r:d| v s7d| v r:| W S t| dkrj| d dkrm| d	 dkrpztj	| d
d d}|
 W W S  tyi   |  Y W S w W | S W | S W | S    |  Y S | S )uc  
        Convierte las fechas en strings a objetos datetime y los strings de fecha en formato ISO
        a un formato que pueda ser serializado correctamente.
        
        Args:
            data: Diccionario de datos o valor individual a procesar
            
        Returns:
            Datos preprocesados seguros para serialización JSON
        c                 S   s   g | ]}t |qS r   )r   r'   ).0itemr   r   r   
<listcomp>   s    z1AuditHelper._preprocess_dates.<locals>.<listcomp>T+Z
      -   Nz%Y-%m-%d)r+   dictitemsr   r'   liststrlendatetimestrptime	isoformat
ValueError)dataresultkeyvaluedate_objr   r   r   r'      s6   


$
zAuditHelper._preprocess_dates)NNNNNr   N)__name__
__module____qualname__staticmethodr:   r'   r   r   r   r   r   /   s
    Vr   )"django.contrib.contenttypes.modelsr   django.core.serializers.jsonr   django.utilsr   rJ   r(   loggingmodelsr   api_login.modelsr   	getLoggerrS   r   r   r   r   r   r   r   <module>   s    
#