o
    )ig1                    @   s  d dl Z d dlmZ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mZmZm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 Zdd Zdd Zdd Zeeeddd Z d dl!m"Z" eeedddd Z#eeeddd Z$eeeddd Z%eeedd d! Z&eeedd"d# Z'eeedd$d% Z(eeedd&d' Z)eeedd(d) Z*	 eeedd*d+ Z+dS ),    N)pre_save	post_savepost_delete
pre_delete)receiver)timezone)DjangoJSONEncoder   )Client	ClientLogUserCompany)serialize_instancebuild_changesserialize_company_with_related)JsonResponse)Value)Concat)get_current_user)modelsc                 C   sP   | dv rd S t | drt | dr| jjdkr| jS | jS t | dr&| jp%d S | S )N)N None_metapkusername)hasattrr   
model_nameusernamer   r   value r!   K/var/www/html/myvaluetrips/my_value_trip_new/my_value_trip/users/signals.pynormalize_value   s   

r#   c                 C   sZ  i }i }g d}ddg}| pi } |pi }t |  | }|D ]R}||v r(q!||v rZ| d| v rZ| d|v rZt| | d}t|| d}	||	krY||	d||< q!t| |}t||}	||	krs||	d||< q!|r|}d|v r~dnd|v rdnd}
|
r| |
rt| |
nd}||
rt||
nd}	||	d||
< |S )zaCompare two dicts and return changes, including updated_by/update_by only if other changes exist.)country_coderesidential_countryresidential_stateresidential_cityref_preferred_airlineref_airline%account_concerned_person_country_codecompany_countrycompany_statecompany_city$travel_concerned_person_country_code
updated_by	update_by_nameoldnewN)setkeysunionr#   getget_username_from_id)old_datanew_datachangestemp_changes	fk_fieldsupdated_by_fieldsall_keysfieldold_valnew_valselected_fieldr!   r!   r"   r   P   s:   $r   c              
   C   s   | sdS zt | ttfrt|  rtjjt| d}|jW S W n% tjy*   Y n t	yE } zt
d|  d|  W Y d}~nd}~ww ztjj| d}|jW S  tjyc   t
d|   Y dS  t	y } zt
d|  d|  W Y d}~dS d}~ww )z1Fetch username from User model by ID or username.N)idzError fetching user by ID : )r   z"No user found for ID or username: z Error fetching user by username )
isinstanceintstrisdigitr   objectsr8   r   DoesNotExist	Exceptionprint)user_idr   er!   r!   r"   r9   z   s0    r9   c                 C   s   | du rdS t |  S )z$Helper function to normalize values.N)rI   stripr   r!   r!   r"   r#      s   )senderc                 K   s   |j rC|ddsCz| jj|j d}t|dgd|_|j|_td|j   W d S  | jyB   td|j  d d |_d |_Y d S w t	|d	sMt	|d
ritd|j   t	|d	r_t
|d	 t	|d
rit
|d
 d |_d |_td|j  d d S )NrawFr   rE   exclude_fieldsz)Set _old_data and _old_status for client zClient z1 not found in pre_save, setting _old_data to None	_old_data_old_statuszEUnexpected _old_data or _old_status found during creation for client z5Cleared _old_data and _old_status for new client (pk=))r   r8   rK   r   rW   client_statusrX   rN   rL   r   delattrrR   instancekwargsold_instancer!   r!   r"   cache_old_client_data   s(   



r`   )serialize_client_with_relatedlog_client_activity)rR   dispatch_uidc                 K   s  t d|j d| dt|d dt|d  t|ddr(t d	|j d
 d S |jp,d d|jp2d  }t|dd }t|dd }|j}||k}|rR|ddnd}	|r\|ddnd}
|	 d|
  }|s|rt	|d}t	|j
}||d||dd}ztjj||jj|jdttj|td|j
t d W d S  ty } zt d|j d|  W Y d }~d S d }~ww d S d S )NzSignal triggered: client_id=z
, created=z, _old_data=rW   z, _old_status=rX   _is_creatingFzSkipping logging for client  during creation.r    client_first_nameclient_last_namer/   r2   )rZ   r/   zCLIENT - STATUS UPDATEDclsref_client_idref_table_nameref_idaction_typechanged_dataperformed_byperformed_atz6Error creating CLIENT - STATUS UPDATED log for client rF   )rN   r   r   getattrrg   rh   rQ   rZ   r8   r9   r/   r   rK   creater   db_tablejsonloadsdumpsr   r   nowrM   )rR   r]   createdr^   new_namer:   
old_status
new_statusstatus_changed	old_firstold_lastold_nameold_updated_by_usernamenew_updated_by_usernamelog_datarP   r!   r!   r"   rb   Q  sJ   ..
	$c                 K   s   t  }t|ts
d }t|}t|j dt|j  |d< t|j|d< t|j	|d< dd |
 D }|j	p=|p=|j}tjjd |jj|jdttjt|d td|t d	 d S )
Nrf   client_name
created_byr/   c                 S      i | ]\}}|d vr||qS ))rZ   
created_at
updated_atr!   .0kvr!   r!   r"   
<dictcomp>  
    z%log_client_delete.<locals>.<dictcomp>zCLIENT DELETEDri   rk   )r   rG   r   ra   r#   rg   rh   rQ   r   r/   itemsr   rK   rt   r   ru   r   rv   rw   rx   r   r   r   ry   )rR   r]   r^   r   r:   old_data_filteredrq   r!   r!   r"   log_client_delete  s(   
"
r   c                 K   sb   |j r)ztjj|j d}t||_|j|_W d S  tjy(   i |_d |_Y d S w i |_d |_d S NrT   )	r   r   rK   r8   r   rW   company_statusrX   rL   r\   r!   r!   r"   cache_old_company  s   

r   c                 K   sh   |j r)z| jj|j d}t||_|j|_W d S  | jy(   i |_d |_Y d S w i |_d |_d|_d S )NrT   T)	r   rK   r8   r   rW   r   rX   rL   rd   r\   r!   r!   r"   capture_old_data  s   

r   c                 K   sl  t |ddrtd|j d d S |j}|jj}|jj}|jj}t |dd }|j}	||	k}
t |di p4i }t	|}dd |
 D }d	d |
 D }t||}|s|sV|
rd
|d
|j|di}|rh||d< |
rt|d}t|d}||	d|d< ||d|d< d}|
r|sd}n|
r|rd}tjj||jj|j|ttj|td|jt d d S d S d S )Nrd   Fz'Skipping post_save logging for company re   rX   rW   c                 S   r   )rE   r   r   r   	is_activer!   r   r!   r!   r"   r         z(log_company_activity.<locals>.<dictcomp>c                 S   r   r   r!   r   r!   r!   r"   r     r   company_namer2   descriptionr/   r   zCOMPANY UPDATEDzCOMPANY - STATUS UPDATEDz"COMPANY UPDATED AND STATUS CHANGEDri   ref_company_idrm   rn   ro   rp   rq   rr   )rs   rN   r   r   r+   r   r,   r-   r   r   r   r   r8   r9   r   rK   rt   r   ru   rv   rw   rx   r   r/   r   ry   )rR   r]   rz   r^   r   company_country_namer,   r-   r|   r}   r~   r:   r;   r   new_data_filteredr<   r   r   r   ro   r!   r!   r"   log_company_activity  s^   



r   c                 K   s   t  }t|ts
d }t|}t|j|d< t|j|d< t|j|d< |jp*|p*|j}tj	j
d |jj|jdttjt|d td|t d d S )Nr   r   r/   zCOMPANY DELETEDri   r   )r   rG   r   r   r#   r   r   r/   r   rK   rt   r   ru   r   rv   rw   rx   r   r   r   ry   )rR   r]   r^   r   r:   rq   r!   r!   r"   log_company_delete  s"   

r   c                 K   sl   |j r4ztjj|j d}t||_|j|_|j|_	|j
|_W d S  tjy3   i |_d |_d |_	Y d S w d S r   )r   r   rK   r8   r   rW   statusrX   
last_login_old_last_loginpassword_old_passwordrL   r\   r!   r!   r"   store_old_data  s   
r   c                 K   sr  |j }|r1t|g dd}||d< tjj||jj|jdt	tj
td |td|jt d d S t|dd }|j}||k}|st|g dd}	t|dd pOi }	d	d
 |	 D }
t|g dd}t|
|}|	d|j d|d< |rtjj||jj|jdt	tj
|td|jt d |rtjj||jj|jdt	tj
|j |d||ddtd|jt d d S d S )NrE   r   is_stafffirst_loginr   rU   r   zUSER CREATEDri   ref_user_idrm   rn   ro   rp   rq   rr   rX   rW   c                 S   r   )rE   r   r   r   r   r   r   r!   r   r!   r!   r"   r   2  r   z%log_user_activity.<locals>.<dictcomp>r   r2   zUSER UPDATEDzUSER - STATUS UPDATED)r   r   )r   r   r   rK   rt   r   ru   r   rv   rw   rx   r   r   r   r   ry   rs   r   r   r8   r/   )rR   r]   rz   r^   r   r;   r|   r}   r~   r:   r   r   r<   r!   r!   r"   log_user_activity  st   	


r   c                 K   s~   t |g dd}t|j|d< t|j|d< t|j|d< |j}tjjd |jj	|j
dttjt|d td|t d d S )	Nr   rU   r   r   r/   zUSER DELETEDri   r   )r   r#   r   r   r/   r   rK   rt   r   ru   r   rv   rw   rx   r   r   r   ry   )rR   r]   r^   r:   rq   r!   r!   r"   log_user_delete  s   
r   ),rv   django.db.models.signalsr   r   r   r   django.dispatchr   django.utilsr   django.core.serializers.jsonr   r   r
   r   r   r   utilsr   r   r   django.httpr   django.db.modelsr   django.db.models.functionsr   users.middlewarer   	django.dbr#   r9   r`   users.utilsra   rb   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   sZ    @*

   l >
  
O

"
 
P



H




J
F