o
    i#                     @   s   d dl Z d dlmZmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ ddlmZ dd	lmZmZ g d
Zdd Zdd Zdd Zeedddd Zeedddd Zeedddd ZdS )    N)	post_savepost_deletepre_save)receiver)ContentType)DjangoJSONEncoder)model_to_dict   )AuditLog)get_current_userget_current_request)r
   SessionLogEntry
PermissionGroupr   	Migrationc                 C   s2   | j d}|r|dd }|S | j d}|S )NHTTP_X_FORWARDED_FOR,r   REMOTE_ADDR)METAgetsplit)requestx_forwarded_forip r   */var/www/html/crm_dreinet/audit/signals.pyget_client_ip   s   r   c              	   C   s   zFt | }| jjD ]0}|jr9|jr9|j}||v r9zt| |}|r.t|}|j d| ||< W q	 t	y8   Y q	w q	t
j|td}t
|W S  t	yQ   i  Y S w )z=Serialize instance to JSON-compatible dict with resolved FKs.z - )cls)r   _metafieldsis_relationmany_to_onenamegetattrstrpk	Exceptionjsondumpsr   loads)instancedatafield
field_namerelated_objval_strserialized_datar   r   r   serialize_instance   s*   
r2   c              	   C   sz  |j j}| dkrt|}d| d| S | dkr$t|}d| d| S | dv rg }| D ]L\}}||}	|	|kr<q.|	durDt|	nd}
|durNt|nd}t|
d	kr^|
dd
 d }
t|d	krl|dd
 d }|| d|
 d| d q.|rt|}d|dd }t|dkr|dt|d  d7 }d| d| d| S d| dt| S |  d| dt| S )z0Generate a detailed description of what changed.CREATEzCreated : DELETEzDeleted )UPDATECLOSENNone2   /   z...z: 'u   ' → ''z;    z (and z more)zUpdated z 'z':  )	__class____name__r%   itemsr   lenappendjoin)actionr+   old_datanew_data
model_name
identifierchangesr-   	new_value	old_valueold_strnew_strchange_summaryr   r   r   get_change_description8   s8   
rO   audit_pre_save_handler)dispatch_uidc                 K   s   | j tv rd S t|ddrd S z*|jr4z| jj|jd}t||_W W d S  | jy3   i |_Y W d S w i |_W d S  t	yC   Y d S w )N_audit_in_progressFr&   )
r?   EXCLUDED_MODELSr$   r&   objectsr   r2   _audit_old_dataDoesNotExistr'   )senderr+   kwargsold_instancer   r   r   audit_pre_saveh   s    
r[   audit_post_save_handlerc              
   K   s  | j tv rd S t|ddrd S t }t }|rt|dr|j}|r%t|nd }|r+dnd}t|}t|di }	|dkrA||	krAd S t	|||	|}
| j dkr|dkrz+|	
d}|
d}||kr{d	d
lm} |jj
|d}|jr{d}d|j d|
 }
W n ty } ztd|  W Y d }~nd }~ww z1tj| }t|rt|ddr|nd ||||j|dks|dkr|	nd ||
d}d|_|  W d S  ty } ztd| j  d|  W Y d }~d S d }~ww )NrR   F_userr3   r6   rV   OportunidadDeVentaestado_oportunidadr   )EstadoOportunidadVentarS   r7   zOpportunity Closed (Status: z) - z$Error checking opportunity closure: is_authenticatedTuserrD   
ip_addresscontent_type	object_iddata_before
data_afterdescriptionzError auditing r4   )r?   rT   r$   r   r   hasattrr]   r   r2   rO   r   Models.estado_oportunidad_ventar`   rU   es_finalnombre_estador'   printr   get_for_modelr
   r&   rR   save)rX   r+   createdrY   r   rc   r   rD   rF   rE   ri   old_status_idnew_status_idr`   
new_statusere   	audit_logr   r   r   audit_post_save}   s`   



$rw   audit_post_delete_handlerc              
   K   s   | j tv rd S t|ddrd S t }t }|rt|dr|j}|r%t|nd }t|}t	d||i }z't
j| }t|rDt|ddrD|nd d|||j|d |d}	d|	_|	  W d S  tyw }
 ztd| j  d	|
  W Y d }
~
d S d }
~
ww )
NrR   Fr]   r5   ra   Trb   zError auditing delete r4   )r?   rT   r$   r   r   rj   r]   r   r2   rO   r   rU   ro   r
   r&   rR   rp   r'   rn   )rX   r+   rY   r   rc   r   rE   ri   re   rv   ru   r   r   r   audit_post_delete   s:   

$ry   )r(   django.db.models.signalsr   r   r   django.dispatchr   "django.contrib.contenttypes.modelsr   django.core.serializers.jsonr   django.forms.modelsr   modelsr
   
middlewarer   r   rT   r   r2   rO   r[   rw   ry   r   r   r   r   <module>   s$    

0



L