U
    2uh                      @   s0  d Z ddl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mZmZmZ dd
lmZ e Ze
eeddd Ze
eeddd Ze
eeddd Ze
edd Ze
edd Ze
edd Ze
eeddd Ze
eeddd Zdd Z d"dd Z!d!S )#au  
Adtlas Accounts Signals

This module contains Django signals for the accounts app to handle
automatic actions when user-related events occur.

Features:
    - Auto-create user profiles
    - Log user activities
    - Manage user sessions
    - Handle role assignments
    - Password change tracking

Author: Adtlas Development Team
Version: 2.0.0
Last Updated: 2025-07-08
    )	post_savepre_savepost_delete)user_logged_inuser_logged_outuser_login_failed)receiver)timezone)Session)get_user_model   )UserProfileUserSessionUserRole)Activity)senderc                 K   s   |rt jj|d dS )z6
    Create a Profile when a new user is created.
    )userN)r   objectsZget_or_creater   instanceZcreatedkwargs r   1/var/www/html/Adtlas/src/apps/accounts/signals.pycreate_user_profile!   s    r   c                 K   s   t |dr|j  dS )z2
    Save the Profile when the user is saved.
    profileN)hasattrr   saver   r   r   r   r   r   save_user_profile*   s    
r   c                 K   sX   |j rTz6tjj|j d}|j|jkr:t |_d|_d|_	W n tj
k
rR   Y nX dS )z2
    Track when a user's password is changed.
    )pkr   N)r    r   r   getZpasswordr	   nowZpassword_changed_atfailed_login_attemptsaccount_locked_untilDoesNotExist)r   r   r   Zold_instancer   r   r   track_password_change3   s    

r&   c           
   	   K   s   |j d}|r |dd }n|j d}|j dd}t |_d|_|jddgd	 tj	|d
d|rn|j
nd d||dd t|dr|jj}|rtjj|d }|r|jnt tjdd }	tjj||||dt |	dd dS )zE
    Log user login activity and create/update session tracking.
    HTTP_X_FORWARDED_FOR,r   REMOTE_ADDRHTTP_USER_AGENT last_activityr#   Zupdate_fieldsZloginUser Systemz
 logged in
ip_address
user_agentr   actionZdescriptionZmetadatasessionsession_keyr   daysT)r   r1   r2   	is_activer,   
expires_at)r7   defaultsN)METAr!   splitr	   r"   r,   r#   r   r   log_activityemailr   r5   r7   r
   r   filterfirstZexpire_date	timedeltar   Zupdate_or_create)
r   requestr   r   x_forwarded_forr1   r2   r7   r5   r;   r   r   r   log_user_loginD   s>    

rF   c                 K   s   |r|j d}|r$|dd }n|j d}|j dd}tj|dd|rR|jnd	 d
||dd t|dr|jjrt	j
j|jjdjdd dS )z?
    Log user logout activity and update session tracking.
    r'   r(   r   r)   r*   r+   Zlogoutr.   r/   z logged outr0   r3   r5   r6   Fr:   N)r=   r!   r>   r   r?   r@   r   r5   r7   r   r   rA   update)r   rD   r   r   rE   r1   r2   r   r   r   log_user_logoutw   s(    rI   c           	      K   s   |j d}|r |dd }n|j d}|j dd}|dpL|d}|rzttjj|d	}| jd
7  _|jdkrt tjdd |_	|j
ddgd tj|dd|j |||jdd W n tjk
r   Y nX dS )zB
    Log failed login attempts and implement account lockout.
    r'   r(   r   r)   r*   r+   r@   Zusername)r@   r         )Zminutesr#   r$   r-   Zlogin_failedzFailed login attempt for user )r1   r2   Zattempt_countr3   N)r=   r!   r>   r   r   r#   r	   r"   rC   r$   r   r   r?   r@   r%   )	r   ZcredentialsrD   r   rE   r1   r2   r@   r   r   r   r   log_failed_login   s0    



rL   c                 K   sN   |rJt j|jdd|jj d|jj |jj|jj|jr>|jjnddd dS )z/
    Log when roles are assigned to users.
    Zrole_assignedRole z assigned to user N)role	role_codeassigned_byr3   )r   r?   r   rN   namer@   coderP   r   r   r   r   log_role_assignment   s    rS   c                 K   s:   t j|jdd|jj d|jj |jj|jjdd dS )z0
    Log when roles are removed from users.
    Zrole_removedrM   z removed from user )rN   rO   r3   N)r   r?   r   rN   rQ   r@   rR   r   r   r   r   log_role_removal   s    rT   c                  C   s,   t jjt dd} |  }| jdd |S )zw
    Utility function to clean up expired sessions.
    This can be called by a management command or celery task.
    T)Zexpires_at__ltr:   FrG   )r   r   rA   r	   r"   countrH   )Zexpired_sessionsrU   r   r   r   cleanup_expired_sessions   s    rV   Z   c                 C   s.   t  t j| d }tjj|d \}}|S )zh
    Utility function to clean up old activity logs.
    Keep only activities from the last X days.
    r8   )Zcreated_at__lt)r	   r"   rC   r   r   rA   delete)r9   Zcutoff_dateZdeleted_count_r   r   r   cleanup_old_activities   s
    rZ   N)rW   )"__doc__Zdjango.db.models.signalsr   r   r   Zdjango.contrib.auth.signalsr   r   r   Zdjango.dispatchr   Zdjango.utilsr	   Zdjango.contrib.sessions.modelsr
   Zdjango.contrib.authr   Zmodelsr   r   r   r   Zapps.activities.modelsr   r   r   r&   rF   rI   rL   rS   rT   rV   rZ   r   r   r   r   <module>   s6   






2
!
0



