o
    Yhԑ                     @   sB  d dl mZmZmZ d dlmZmZmZmZ d dl	m
Z
mZ d dl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 d d	lmZmZ d d
lmZ d dl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* d dl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8Z8d dl9m:Z:m;Z; d dl<m=Z= d dl>m?Z? d dl@Z@d dl#m-Z- e  ZAe8BdZCdd ZDd d! ZEd"d# ZFd d$lGmHZHmIZI d d%lJmKZK eIeHeKd&d' ZLd d
lmZ d dl mZmZmZ d d(l	m
Z
 d d)lMmNZNmOZO d d*l#mPZP d d+l4mQZQ dd,l-mRZRmSZS dd-l0mTZTmUZU dd.lVmWZW dd/lVmXZX e
eXd0d1d2 ZYe
eXd0d3d4 ZZe
eXd0d5d6 Z[e
eXd0d7d8 Z\d9d: Z]d;d< Z^d=d> Z_d?d@ Z`dVdBdCZae
dDdE Zbe
dFdG ZcdHdI ZddJdK ZedLdM Zfe
dNdO ZgdPdQ ZhdRdS Zie
eeidTdU ZjdS )W    )renderredirectget_object_or_404)authenticateloginlogoutupdate_session_auth_hash)login_requireduser_passes_test)AuthenticationFormSetPasswordForm)default_token_generator)get_current_site)render_to_string)urlsafe_base64_encodeurlsafe_base64_decode)force_bytes	force_str)messages)JsonResponseHttpResponse)get_user_model)ValidationError)IntegrityError)settings)make_password)get_random_string)	get_token   )
CustomUserUserActivityLog)CustomPasswordResetFormCustomSetPasswordFormProfileUpdateForm)Employee)CustomerN)PasswordResetViewPasswordResetConfirmView)reverse_lazy)send_password_reset_email)modelszaccounts.loginc              	   C   s   | j dkrm| jd }| jd }td| d| jd  t| ||d}|d urX|jrXt| | td|  t	j
j|d	d
| jd | jd| jddd tdS td| d| jd  t| d t| dS )NPOSTusernamepasswordz&Superuser login attempt for username: 
 from IP: REMOTE_ADDRr,   r-    Successful superuser login for: r   Superuser login from HTTP_USER_AGENT useractivity_typedescription
ip_address
user_agentcustomers:dashboardz$Failed superuser login attempt for: zInvalid superuser credentials.zaccounts/superuser_login.html)methodr+   loggerinfoMETAgetr   is_superuserr   r    objectscreater   warningr   errorr   )requestr,   r-   r6    rG   ./var/www/html/optinet_system/accounts/views.pysuperuser_login#   s&   





rI   c              
   C   s  | j dkr| jdd }| jdd }td| d| jd  |r+|s6t| d t	| d	S zt
jj|d
}t|dsWtd|  t| d t	| d	W S t| ||d}|dur|j}|jdkr~td|  t| d t	| d	W S t| | td|  tjj|dd| jd | jd| jddd |jst| d tdW S tdW S td|  t| d W n= t
jy   td|  t| d Y n& ty } ztd| dt|  t| d  W Y d}~nd}~ww t	| d	S )!zEmployee login viewr+   r,   r4   r-   z%Employee login attempt for username: r.   r/   *Please provide both username and password.zaccounts/employee_login.htmlr,   employee_profilez%Login attempt for non-employee user: zInvalid employee credentials.r0   Nactive%Login attempt for inactive employee: 7Your employee account is not active. Please contact HR.Successful employee login for: r   Employee login from r3   r5   z>Welcome! This is your first login. Please update your profile.accounts:profiler;   z#Failed employee login attempt for: Invalid username or password.z%Login attempt for non-existent user: z Error during employee login for : 1An error occurred during login. Please try again.)r<   r+   r@   stripr=   r>   r?   r   rE   r   UserrB   hasattrrD   r   rL   statusr   r    rC   
last_loginsuccessr   DoesNotExist	Exceptionstr)rF   r,   r-   r6   authenticated_useremployeeerG   rG   rH   employee_login@   sX   




	


rb   c              
   C   s  | j dkr| jdd }| jdd }td| d| jd  |r+|s6t| d t	| d	S zt
jj|d
}t|dsWtd|  t| d t	| d	W S t| ||d}|dur|j}|jdkrtd|  |jdkr~t| d nt| d t	| d	W S t| | td|  tjj|dd| jd | jd| jddd tdW S td|  t| d W n= t
jy   td|  t| d Y n& ty } ztd| dt|  t| d  W Y d}~nd}~ww t	| d	S )!zCustomer login viewr+   r,   r4   r-   z%Customer login attempt for username: r.   r/   rJ   zcustomers/customer_login.htmlrK   customer_profilez%Login attempt for non-customer user: zInvalid customer credentials.r0   NrM   %Login attempt for inactive customer: 	suspended8Your account has been suspended. Please contact support.3Your account is not active. Please contact support.Successful customer login for: r   Customer login from r3   r5   customers:customer_dashboardz#Failed customer login attempt for: rS   z.Login attempt for non-existent customer user: z Error during customer login for rT   rU   )r<   r+   r@   rV   r=   r>   r?   r   rE   r   rW   rB   rX   rD   r   rc   rY   r   r    rC   r   r\   r]   r^   )rF   r,   r-   r6   r_   customerra   rG   rG   rH   customer_login   sV   







rl   )csrf_protectensure_csrf_cookie)never_cachec              
   C   s  | j dkr| jdd }| jdd }|r|s't| d t| dS td| d| j	d	  zrt
| ||d
}|dur|jdu r`t|ddr`|j| jd< t| d tdW S |jrt| | td|  tjj|dd| j	d	 | j	d	| j	ddd tdW S t|dr|jr|j}t|dr|jdkrtd|  t| d t| dW S t| | td|  tjj|dd| j	d	 | j	d	| j	ddd tdW S t|drM|jrM|j}t|dr |jdkr td|  |jd krt| d! nt| d" t| dW S t| | td#|  tjj|dd$| j	d	 | j	d	| j	ddd td%W S |jsU|jrt| | td&|  tjj|dd'| j	d	 | j	d	| j	ddd tdW S td(|  t| d) t| dW S td*|  t| d+ t| dW S  ty } ztd,| d-t|  t| d. t| dW  Y d}~S d}~ww d/t| i}t| d0|S )1zNUnified login view that handles all user types with first-time password changer+   r,   r4   r-   rJ   zaccounts/unified_login.htmlzLogin attempt for username: r.   r/   r0   Nfirst_login_requiredFfirst_login_user_idz6This is your first login. Please change your password.z#accounts:first_time_password_changer1   r   r2   r3   r5   r;   rL   rY   rM   rN   rO   rP   rQ   rc   rd   re   rf   rg   rh   ri   rj   z&Successful staff/superuser login for: zStaff login from z(Login attempt for user without profile: z4Account setup is incomplete. Please contact support.zFailed login attempt for: rS   zError during login for rT   rU   
csrf_tokenzaccounts/login.html)r<   r+   r@   rV   r   rE   r   r=   r>   r?   r   rZ   getattridsessionr   rA   r   r    rB   rC   rX   rL   rY   rD   rc   is_staffr]   r^   r   )rF   r,   r-   r6   r`   rk   ra   contextrG   rG   rH   unified_login   s   














rx   )r	   )Group
Permission)transaction)
Department)GroupPermissionManagerDepartmentPermissionAssignment)DepartmentPermissionFormAddPermissionForm)has_permission)permission_requiredmanage_settingsc                 C   s`   t jjdd}i }tjD ]\}}tjj|dd ||< q||tjjdd d}t| d|S )z-Dashboard for managing department permissionsT)	is_active)categoryr   )departmentspermissions_by_categorytotal_permissionsz-accounts/permission_management_dashboard.html)r|   rB   filterr}   PERMISSION_CATEGORIEScountr   )rF   r   r   category_keycategory_namerw   rG   rG   rH   permission_management_dashboardQ  s   r   c                 C   s   t t|dd}| jdkrht| j|d}| rgt D tj	j
|d  |j D ]\}}|drD|rD|D ]}tj	j||| jd q7q*t| t| d|j d td	W  d
   S 1 sbw   Y  nt|d}||d}t| d|S )z,Manage permissions for a specific departmentT)rt   r   r+   
departmentpermissions_)r   
permissionassigned_byzPermissions updated for z department.(accounts:permission_management_dashboardN)r   formz+accounts/manage_department_permissions.html)r   r|   r<   r   r+   is_validr{   atomicr~   rB   r   deletecleaned_dataitems
startswithrC   r6    _update_django_group_permissionsr   r[   namer   r   )rF   department_idr   r   
field_namepermissionsr   rw   rG   rG   rH   manage_department_permissionse  s2   

 
r   c                 C   s^   | j dkr"t| j}| r!| }t| d|j d tdS nt }d|i}t	| d|S )zAdd a new system permissionr+   Permission "z" added successfully.r   r   zaccounts/add_permission.html)
r<   r   r+   r   saver   r[   display_namer   r   )rF   r   r   rw   rG   rG   rH   add_permission  s   

r   c                 C   sT   t t|d}| jdkr |j}|  t| d| d tdS d|i}t| d|S )zDelete a system permissionrt   r+   r   z" deleted successfully.r   r   zaccounts/delete_permission.html)	r   r}   r<   r   r   r   r[   r   r   )rF   permission_idr   permission_namerw   rG   rG   rH   delete_permission  s   
r   c                 C   s   t jj| jd\}}|j  tjj| dd}g }|D ]?}|j	j}t
jj|d}|| |ddddddd	dd
d}dD ]}	|	 | }
t
jj|
d}|| qGqt|D ]}|j| qa|| _|   dS )z?Update Django group permissions based on department assignments)r   r   r   )codenamemanage_r4   view_add_change_delete_)r   r   r   r   N)ry   rB   get_or_creater   r   clearr~   r   select_relatedr   rz   extendreplacesetadd
user_groupr   )r   groupcreatedassigned_permissionsdjango_permissions
assignmentr   matching_perms	base_nameprefixperm_variationpermrG   rG   rH   r     s,   

,r   c                 C   sf  | j d}|stdS z	tjj|d}W n tjy#   td Y S w | jdkr| jd}| jd}||krGt	| d t
| dd	|iS t|d
k r[t	| d t
| dd	|iS || d|_|  | j d= d}|jrsd}nt|dr~|jr~d}nt|dr|jrd}nd}t| ||d t| d |jst|dr|jrtdS tdS t
| dd	|iS )z!Handle first-time password changerq   accounts:loginr   r+   new_passwordconfirm_passwordPasswords do not match.z(accounts/first_time_password_change.htmlr6      ,Password must be at least 8 characters long.FNz&accounts.backends.SuperuserAuthBackendrL   z%accounts.backends.EmployeeAuthBackendrc   z%accounts.backends.CustomerAuthBackendz)django.contrib.auth.backends.ModelBackend)backendz5Password changed successfully! Welcome to the system.r;   )ru   r@   r   rW   rB   r\   r<   r+   r   rE   r   lenset_passwordrp   r   rA   rX   rL   rc   r   r[   )rF   user_idr6   r   r   r   rG   rG   rH   first_time_password_change  sF   

r   c                 C   sp  | j dkr3| jdkr/zt| j}|dd }W n tjtfy.   t	ddd Y S w | j
dd }|sQ| jdkrFt	dddS t| d t| d	S ztjj|d
d}d}|D ]}}t|}tt|j}t| }| d| d| d}	z@ddlm}
 |
 }|j|dd| p|j d|	 dd| p|jd\}}|rtd|  d
}ntd| d|  W q^ ty } ztd| dt |  W Y d}~q^d}~ww | jdkrt	d
ddW S t!| d t| d	W S  ty2 } z1td| dt |  | jdkrt	dddW  Y d}~S t| d t| d	W  Y d}~S d}~ww t| d	S )zEnhanced password reset requestr+   zapplication/jsonemailr4   FzInvalid JSON data.r[   rE   z Please provide an email address.z!accounts/password_reset_form.htmlT)r   r   z!/accounts/password-reset-confirm//r   EmailServicez Password Reset Request - OptiNetz
                        Dear z,

                        You have requested to reset your password for your OptiNet account.

                        Click the link below to reset your password:
                        a  

                        This link will expire in 24 hours.

                        If you did not request this password reset, please ignore this email.

                        Best regards,
                        OptiNet Support Team
                        password_reset)recipient_emailsubjectcontent
email_typerecipient_namezPassword reset email sent to z'Failed to send password reset email to rT   z&Error sending password reset email to NzQIf an account with that email exists, password reset instructions have been sent.r[   messagezError in password reset for zHAn error occurred while processing your request. Please try again later.)"r<   content_typejsonloadsbodyr@   rV   JSONDecodeError
ValueErrorr   r+   r   rE   r   rW   rB   r   r   
make_tokenr   r   pkr   build_absolute_urinotifications.email_servicer   
send_emailget_full_namer,   r=   r>   r]   r^   r[   )rF   datar   users
email_sentr6   tokenuidcurrent_site	reset_urlr   email_servicer[   	error_msgemail_errorra   rG   rG   rH   password_reset_request  s   




&


r   c                 C   s  zt t|}tjj|d}W n ttttjfy   d}Y nw |durt	
||r| jdkry| jd}| jd}||krMt| d t| ddd	iS t|d
k rat| d t| ddd	iS || |  t| | t| d tdS t| ddd	iS t| dddiS )zPassword reset confirmation)r   Nr+   r   r   r   z$accounts/password_reset_confirm.html
valid_linkTr   r   z9Your password has been reset successfully! Please log in.r   F)r   r   rW   rB   r@   	TypeErrorr   OverflowErrorr\   r   check_tokenr<   r+   r   rE   r   r   r   r   r   r[   r   )rF   uidb64r   r   r6   r   r   rG   rG   rH   password_reset_confirmd  s.   


r   rk   c                 C   s6   t d}tjj| |t|dd}d|_|  ||fS )z2Helper function for admins to create user accounts   T)r,   r   r-   r   )r   rW   rB   rC   r   rp   r   )r,   r   	user_typerL   rc   temp_passwordr6   rG   rG   rH   create_user_account  s   r   c              	   C   s  | j dkr| jd}| jd}| jd}| j|s(t| d t| dS ||kr7t| d t| dS t|dk rHt| d	 t| dS | j	| | j
  t| | j tjj| jd
d| jd | jd| jddd t| d tdS t| dS )zChange password viewr+   old_passwordr   r   zCurrent password is incorrect.zaccounts/change_password.htmlzNew passwords do not match.r   r   password_changezPassword changed from r/   r3   r4   r5   zPassword changed successfully!rR   )r<   r+   r@   r6   check_passwordr   rE   r   r   r   r   r   r    rB   rC   r?   r[   r   )rF   r   r   r   rG   rG   rH   change_password  s4   






r   c                 C   sZ  | j dkr t| j| jd}| r|  t| d tdS nt| jd}ddi d}| jj	r5d|d	< n]t
| jd
rdd|d	< | jj|d< | jjj| jjjrT| jjjjnd| jjj| jj d|d< n.t
| jdrd|d	< | jj|d< | jjj| jjjr| jjjjnd| jj | jjjd|d< tjj| jdddd }|||d}t| d|S )zUser profile view and updater+   )instancezProfile updated successfully!rR   UnknownN)r   profileadditional_info	Superuserr   rL   r$   r  zNot assigned)employee_idr   positionrY   r  rc   r%   z
No service)customer_idservicerY   account_balancer6   
-timestamp
   )r   	user_inforecent_activityzaccounts/profile.html)r<   r#   r+   r6   r   r   r   r[   r   rA   rX   rL   r  r   r   r  get_status_displayrc   r  r  r  r    rB   r   order_byr   )rF   r   r  r  rw   rG   rG   rH   profile_view  sH   




r  c              	   C   sp   | j jr4tjj| j dd| jd | jd| jddd td| j j	  t
|  t| d td	S )
z(Custom logout view with activity loggingr   zUser logout from r/   r3   r4   r5   zUser logout: z&You have been successfully logged out.r   )r6   is_authenticatedr    rB   rC   r?   r@   r=   r>   r,   r   r   r[   r   rF   rG   rG   rH   custom_logout  s   
r  c                 C   s   t dS )z#Redirect admin logout to main loginr   )r   r  rG   rG   rH   admin_logout_redirect     r  c                 C   s   t | S )z1Admin logout view - same as admin_logout_redirect)r  r  rG   rG   rH   admin_logout_view  r  r  c              
   C   s   | j jstdddS z$ddlm} | }|j| j j| j d\}}t||r'dnd| d	W S  tyW } zt	d
t
|  tddt
| dW  Y d}~S d}~ww )z&Test email functionality for debuggingFzPermission deniedr   r   r   )r   sent_byzTest email sent successfully!zFailed to send test email: r   zError in test email view: zError sending test email: N)r6   rA   r   r   r   send_test_emailr   r]   r=   rE   r^   )rF   r   r   r[   r   ra   rG   rG   rH   test_email_view  s*   

r  c                 C   s   | j o| jS )zCheck if user is superuser)r  rA   r	  rG   rG   rH   rA   '  s   rA   c                 C   s6   | j sdS | jp| jpt| do| jjo| jjjdkS )z$Check if user is admin or managementFrL   
Management)r  rA   rv   rX   rL   r   r   r	  rG   rG   rH   is_admin_or_management+  s   
r  c              	   C   s  t j d}| jd}|r$z|j|d}W n ttfy#   Y nw | jd}|r2|j|d}| jd}|rO|t	j
|dt	j
|dB t	j
|d	B }d
dlm} ||d}| jd}||}tjjdd d}	||	t j|||pzdd}
t| d|
S )zView user activity logsr
  r6   )r   r7   )r7   search)user__username__icontains)description__icontains)ip_address__icontainsr   )	Paginator2   pageF)useractivitylog__isnullr,   r4   )logsr   activity_typesselected_userselected_activity_typesearch_queryzaccounts/activity_logs.html)r    rB   allr  GETr@   r   r   r   r*   Qdjango.core.paginatorr   get_pagerW   distinctACTIVITY_TYPESr   )rF   r$  r   r7   r  r   	paginatorpage_number	page_logsr   rw   rG   rG   rH   user_activity_logs5  sJ   





	r3  )rk   NN)kdjango.shortcutsr   r   r   django.contrib.authr   r   r   r   django.contrib.auth.decoratorsr	   r
   django.contrib.auth.formsr   r   django.contrib.auth.tokensr   django.contrib.sites.shortcutsr   django.template.loaderr   django.utils.httpr   r   django.utils.encodingr   r   django.contribr   django.httpr   r   r   django.core.exceptionsr   	django.dbr   django.confr   django.contrib.auth.hashersr   django.utils.cryptor   django.middleware.csrfr   r*   r   r    formsr!   r"   r#   	hr.modelsr$   customers.modelsr%   loggingdjango.contrib.auth.viewsr&   r'   django.urlsr(   settings.utilsr)   r   rW   	getLoggerr=   rI   rb   rl   django.views.decorators.csrfrm   rn   django.views.decorators.cachero   rx   django.contrib.auth.modelsry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  rA   r  r3  rG   rG   rG   rH   <module>   s    
A? #%6`
 
&
2

