o
    mhoP                     @   sd  d dl mZ d dlmZ d dlmZ ddlmZmZm	Z	 ddl
mZ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 d dlmZ d dlZd dlZd dlmZ d dlmZm Z m!Z! G dd deZ"G dd deZ#G dd deZ$G dd deZ%G dd deZ&G dd deZ'G dd deZ(G dd deZ)G dd  d eZ*G d!d" d"eZ+dS )#    )APIView)Responsestatus   )
CustomUserOTPDevice)OTPSendSerializerOTPVerifySerializerSetPasswordSerializerLoginSerializerUserDetailSerializer)	send_mail)settings)timezone)authenticate)IntegrityErrorN)IsAdminUser)CountryCategoryQuestionAnswerc                   @      e Zd Zdd ZdS )OTPSendViewc                 C   s   t |jd}| rx|jd }tjj|ddid\}}|jr'tddit	j
dS d	tjtjd
d}tjj|d }|rT||_t |_|jtjdd |_|  ntjj||d d}d| d}	tj}
t||	|
|g tddit	jdS t|jt	j
dS )Ndataemailis_verifiedF)r   defaultserrorUser already verifiedr       )kuser
   )minutesr%   otpz,Your OTP for Smart Prep MCQ App VerificationzYour OTP is z. It is valid for 10 minutes.messagezOTP sent to email) r
   r   is_validvalidated_datar   objectsget_or_creater   r   r   HTTP_400_BAD_REQUESTjoinrandomchoicesstringdigitsr   filterfirstr)   r   now
created_at	timedelta
expires_atsavecreater   EMAIL_HOST_USERr   HTTP_200_OKerrors)selfrequest
serializerr   r%   createdr)   otp_objsubjectr*   
from_email rG   %/var/www/spmcq_backend/users/views.pypost   s.   



zOTPSendView.postN__name__
__module____qualname__rI   rG   rG   rG   rH   r          r   c                   @   r   )OTPVerifyViewc                 C   s  t |jd}| r|jd }|jd }z	tjj|d}W n tjy0   tddit	j
d Y S w |jr=tddit	jdS z2tjj||d	}|jt k r[|  tdd
it	jdW S d|_|  |  tddit	jdW S  tjy   tddit	jd Y S w t|jt	jdS )Nr   r   r)   r   r   User not foundr   r    r(   zOTP expiredTr*   zOTP verified successfullyzInvalid OTP)r   r   r+   r,   r   r-   getDoesNotExistr   r   HTTP_404_NOT_FOUNDr   r>   r   r:   r   r7   deleter/   r;   r?   )r@   rA   rB   r   r)   r%   rD   rG   rG   rH   rI   7   s0   

zOTPVerifyView.postNrJ   rG   rG   rG   rH   rO   6   rN   rO   c                   @   r   )SetPasswordViewc           
      C   s  t |jd}| r{|jd }|jd }|jd }|jd }|jdd}|jdd}z	tjj|d	}	W n tjyH   td
dit	j
d Y S w |	jsUtd
dit	jdS ||	_||	_|r_|nd |	_|rf|nd |	_|	| |	  tddit	jdS t|jt	jdS )Nr   r   password
first_name	last_namephone_numberr!   country_namerP   r   rQ   r   User not verifiedr*   z.Password and user information set successfully)r   r   r+   r,   rR   r   r-   rS   r   r   rT   r   r/   rX   rY   rZ   r[   set_passwordr;   r>   r?   )
r@   rA   rB   r   rW   rX   rY   rZ   r[   r%   rG   rG   rH   rI   T   s.   




zSetPasswordView.postNrJ   rG   rG   rG   rH   rV   S   rN   rV   c                   @   r   )	LoginViewc           
      C   s&  t |jd}| r|jd }|jd }|jd}z]tjj|d}||rn|jrn|j	dd}|j	dd	}||d
}	|rC||	d< z
t
jj||	d W n ty`   tdditjd Y W S w td|j|dtjdW S tdditjdW S  tjy   tdditjd Y S w t|jtjdS )Nr   r   rW   	device_idrP   HTTP_USER_AGENTUnknownREMOTE_ADDR0.0.0.0)
user_agent
ip_address)r%   r   r   z'Device already registered for this userr   zLogin successful)r*   is_adminr   z&Invalid credentials or unverified userrQ   )r   r   r+   r,   rR   r   r-   check_passwordr   METAr	   update_or_creater   r   r   r/   is_superuserr>   HTTP_401_UNAUTHORIZEDrS   rT   r?   )
r@   rA   rB   r   rW   r_   r%   rd   re   device_datarG   rG   rH   rI   s   s:   


zLoginView.postNrJ   rG   rG   rG   rH   r^   r   rN   r^   c                   @   r   )AutoLoginViewc           	      C   s   |j d}|r'tjj|d }|r&|j}|jr&td|j	|j
dtjdS n3|jdd}|jdd	}tjj|d
}| rZ|d }|j}|jrZtd|j	|j
dtjdS tdditjdS )Nr_   )r_   zAuto-login successfulr*   r   rf   r   r`   ra   rb   rc   )re   z-last_loginr   z%No matching device or unverified user)r   rR   r	   r-   r5   r6   r%   r   r   r   rj   r   r>   rh   existsorder_byrk   )	r@   rA   r_   devicer%   rd   re   matching_devicesmost_recent_devicerG   rG   rH   rI      s"   zAutoLoginView.postNrJ   rG   rG   rG   rH   rm      rN   rm   c                   @   r   )CreateSuperUserViewc                 C   s   |j d}|dkrtdditjdS |j d}|j d}|r#|s,tdditjdS tjj|d		 r>tdd
itjdS tjj
||d tdditjdS )Nconsent_userzkalash@2025r   z/You do not have permission to create superuser.r   r   rW   z Email and password are required.rP   z$User with this email already exists.)r   rW   r*   zSuperuser created successfully.)r   rR   r   r   HTTP_403_FORBIDDENr/   r   r-   r5   ro   create_superuserHTTP_201_CREATED)r@   rA   ru   r   rW   rG   rG   rH   rI      s   zCreateSuperUserView.postNrJ   rG   rG   rG   rH   rt      rN   rt   c                   @   r   )
LogoutViewc                 C   s   |j d}|j d}z	tjj|d}W n tjy(   tdditjd Y S w |r6tjj	||d
  n|jdd	}|jd
d}tjj	|||d
  tdditjdS )Nr   r_   rP   r   zUser not found.r   )r%   r_   r`   ra   rb   rc   )r%   rd   re   r*   zLogged out successfully.)r   rR   r   r-   rS   r   r   rT   r	   r5   rU   rh   r>   )r@   rA   r   r_   r%   rd   re   rG   rG   rH   rI      s   zLogoutView.postNrJ   rG   rG   rG   rH   ry      rN   ry   c                   @   r   )UserAnalyticsViewc              	   C   s  t tj }dd |D }t|}tdd |D }dd |D }t|}g }|D ]8}	tjj|	d }
|	j|	j	|	j
|	j|
rY|
rD|
jnd |
rJ|
jnd |
rU|
jrU|
j nd dnd d}|| q*tj }tj }tj }t|||||||dtjd	S )
Nc                 S   s   g | ]
}t |d ds|qS )rj   F)getattr.0urG   rG   rH   
<listcomp>       z)UserAnalyticsView.get.<locals>.<listcomp>c                 S   s   g | ]}|j r|qS rG   )	is_activer|   rG   rG   rH   r      s    c                 S   s   g | ]
}|j r|jr|qS rG   )r   r   r|   rG   rG   rH   r      r   r$   )rd   re   
last_login)idr   r   r   last_login_device)total_userscurrent_active_userstotal_active_verified_usersactive_users_listtotal_categoriestotal_countriestotal_questionsr   )listr   r-   alllenr	   r5   r6   r   r   r   r   rd   re   r   	isoformatappendr   countr   r   r   r   r>   )r@   rA   	all_usersnon_superusersr   r   active_verified_usersr   r   r~   rq   active_user_datar   r   r   rG   rG   rH   rR      sH   


zUserAnalyticsView.getN)rK   rL   rM   rR   rG   rG   rG   rH   rz      rN   rz   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
UserDetailViewc              
   C   s   z@|j d}|stdditjdW S z	tjj|d}W n tjy0   tdditjd Y W S w t	|}td|j
dtjdW S  ty` } ztdd	t| itjdW  Y d
}~S d
}~ww )zGet user details by emailr   r   zemail parameter is requiredr   rP   rQ   z#User details retrieved successfullyr*   r%   z!Failed to retrieve user details: N)query_paramsrR   r   r   r/   r   r-   rS   rT   r   r   r>   	Exceptionstr)r@   rA   r   r%   rB   erG   rG   rH   rR     s0   zUserDetailView.getc              
   C   sd  zt |j |jd}|stdditjdW S z	tjj|d}W n tjy5   tdditj	d Y W S w |j
sCtdditjdW S t||jdd	}| r|j}|d
|j|_|d|j|_|d|j|_|d|j|_|  t|}td|jdtjdW S td|jdtjdW S  ty } ztddt| itjdW  Y d}~S d}~ww )zUpdate user detailsr   r   email is requiredr   rP   rQ   r\   T)r   partialrX   rY   rZ   r[   z!User details updated successfullyr   zInvalid data provided)r   detailszFailed to update user details: N)printr   rR   r   r   r/   r   r-   rS   rT   r   r   r+   r,   rX   rY   rZ   r[   r;   r>   r?   r   r   )r@   rA   r   r%   rB   r,   updated_serializerr   rG   rG   rH   put  sR   
zUserDetailView.putc              
   C   s   z\|j d}|j d}|r|stdditjdW S z	tjj|d}W n tjy8   tdditjd Y W S w |j	sFtdditjdW S ||_
|  t|}td	|j d
tjdW S  ty| } ztddt| itjdW  Y d}~S d}~ww )z(Add or update gender for a user by emailr   genderr   zemail and gender are requiredr   rP   rQ   r\   zGender updated successfullyr   zFailed to update gender: N)r   rR   r   r   r/   r   r-   rS   rT   r   r   r;   r   r>   r   r   )r@   rA   r   r   r%   rB   r   rG   rG   rH   rI   I  s(   (zUserDetailView.postc              
   C   s0  zw|j d}|j d}|stdditjdW S |du r'tdditjdW S t|ts6tdditjdW S z	tjj|d	}W n tj	yS   tdd
itj
d Y W S w |jsatdditjdW S ||_|  t|}td|j dtjdW S  ty } ztddt| itjdW  Y d}~S d}~ww )z,Update music_sound field for a user by emailr   music_soundr   r   r   Nzmusic_sound is requiredz!music_sound must be true or falserP   rQ   r\   z(Music sound setting updated successfullyr   z&Failed to update music sound setting: )r   rR   r   r   r/   
isinstanceboolr   r-   rS   rT   r   r   r;   r   r>   r   r   )r@   rA   r   r   r%   rB   r   rG   rG   rH   patch]  sB   
zUserDetailView.patchN)rK   rL   rM   rR   r   rI   r   rG   rG   rG   rH   r     s
    ,r   c                   @   r   )SkipLoginViewc              
   C   sL  z|j d}|j d}|stdditjdW S tjj|d }|r*|}|j	}n|
  d}tjj|d|d	d
}|  |jdd}|jdd}|j||d}	|rZ||	d< ztjjdi |	 W n tyx   tdditjd Y W S w td||jdtjdW S  ty }
 ztddt|
 itjdW  Y d }
~
S d }
~
ww )Nusernamer_   r   zusername is requiredr   )rY   z
@guest.comr!   T)r   rX   rY   r   r`   ra   rb   rc   )user_idrd   re   zDevice already registeredzlogged in successfullyrn   zFailed to create user: rG   )r   rR   r   r   r/   r   r-   r5   r6   r   lowerr<   r;   rh   r   r	   r   rj   r>   r   r   )r@   rA   r   r_   existing_userr%   r   rd   re   rl   r   rG   rG   rH   rI     sN   zSkipLoginView.postNrJ   rG   rG   rG   rH   r     rN   r   ),rest_framework.viewsr   rest_framework.responser   rest_frameworkr   modelsr   r   r	   serializersr
   r   r   r   r   django.core.mailr   django.confr   django.utilsr   django.contrib.authr   	django.dbr   r1   r3   rest_framework.permissionsr   
app.modelsr   r   r   r   rO   rV   r^   rm   rt   ry   rz   r   r   rG   rG   rG   rH   <module>   s2   %'/ 