3

<^5                 @   s  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
Z
d dlmZmZ d dlmZ d dlmZmZ d dlZd d	lmZmZ d dlZejZej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$m%Z%m&Z&m'Z' d dl(T d dl)T d dl*m+Z+ G dd deZ,dS )    )status)Response)api_settings)render_to_stringN)	send_mailEmailMultiAlternatives)ValidationError)authenticatelogin)datetime	timedelta)ContentFile   )UserBaseService)UserUserSession)UserLoginDetailSerializerUserSignupSerializerUserPasswordSerializerUserSerializerUserDetailsSerailizer)*)settingsc               @   s   e Zd ZdZdd Zd)ddZdd Zd	d
 Zd*ddZd+ddZ	dd Z
d,ddZd-ddZd.ddZd/ddZdd Zdd Zdd Zd0dd Zd!d" Zd1d#d$Zd%d& Zd2d'd(ZdS )3UserServicezC
    Allow any user (authenticated or not) to access this url 
    c             C   s   d S )N )selfr   r   5/var/www/html/itrack/api/services/user/userService.py__init__&   s    zUserService.__init__Nc          
   C   s   | j |}|jd }|j }|jd }yt||d}W n   d }Y nX |d k	rt|| t|}t|}tj|t	j
}	|j}
|	|
d< | j||	|}|
tjddS d tjddS )Nemailpassword)usernamer   tokenZLOGIN_SUCCESSFULLY)datacodemessageZINVALID_CREDENTIALS)validate_auth_datar"   lowerr	   r
   r   jwt_payload_handlerjwtencoder   
SECRET_KEYcreate_update_user_sessionr   HTTP_200_OKHTTP_400_BAD_REQUEST)r   requestformatvalidated_datar    r   user
serializerpayloadr!   Zuser_detailsuser_sessionr   r   r   r
   )   s$    




zUserService.loginc             C   s   i }|j jds|jddi |j jds8|jddi |jjddksX|jjddkrr|j jdsr|jddi |r~t|d S )Nr   FIELD_REQUIREDr   zdevice-typeZandroidZios	device_id)r"   getupdateheadersr   )r   r.   errorr   r   r   r%   I   s     zUserService.validate_auth_datac             C   s   t |jjd t |jjd | j|j|jjd|jjd}|dkrxtjj|||jjd|jjd|jjdd n||_	|jjd|_
|j  |S )z%
        Create User Session
        zdevice-typer6   Nzapp-version)r1   r!   r6   device_typeapp_version)printr9   r7   r"   get_user_session_objectpkr   objectscreater!   r<   save)r   r1   r!   r.   r4   r   r   r   r+   X   s     

z&UserService.create_update_user_sessionc             C   s\   y@|r0yt jj|||dS  t jk
r.   d S X t jj|||dS  t jk
rV   d S X d S )N)r1   r;   r6   )r   r@   r7   DoesNotExist)r   user_idr;   r6   r   r   r   r>   r   s    z#UserService.get_user_session_objectc             C   sF   | j |j t|jd}|j r8|j  |jtjddS d tjddS )N)r"   zUser Created Successfully)r"   r#   r$   zOops! Something went wrong.)validate_signup_datar"   r   is_validrB   r   HTTP_201_CREATEDr-   )r   r.   r/   r2   r   r   r   sign_up   s    zUserService.sign_upc             C   sL   |j d}d}ytj||}t| W n  tk
rF   tddiY nX d S )Ndobz%m/%d/%Yz+Incorrect data format, should be MM/DD/YYYY)r7   r   strptimer=   
ValueError	Exception)r   r"   Zdate_stringdate_formatZdate_objr   r   r   rE      s    
z UserService.validate_signup_datac       
      C   s   | j |}y|jd }|jdd}tj|d d }tjj|d d}| j|j	|j
jd|jjd}|r| j|d |}	d tjdd	S d tjd
d	S W n  tjk
r   d tjd
d	S X d S )NHTTP_AUTHORIZATIONBearer rD   )r?   zdevice-typer6   ZLOGOUT_SUCCESSFULLY)r"   r#   r$   RECORD_NOT_FOUND)Zvalidate_logout_dataMETAreplacer(   decoder   r@   r7   r>   r?   r9   r"   r+   r   r,   r-   rC   )
r   r.   r/   r0   Zjwt_token_strZ	jwt_tokenZuser_detailr1   Zuser_session_instancer4   r   r   r   logout   s    

 zUserService.logoutc             C   s   yzt jd}tj|}| j|}td| tjdd}||_||_	|j
  dj|}td|tj|g}	|	j  d tjtdS  tk
r }
 zt|
 d tjtdS d }
~
X nX d S )NzAsia/Kolkatazuser: i i?B zXYour OTP is {} to reset your password. OTP is valid for 1 hour or 1 successfull attempt.ziTrack : Password reset OTP)r"   r#   r$   )pytztimezoner   nowget_object_by_emailr=   randomrandintotpotp_send_timerB   r/   r   r   DEFAULT_FROM_EMAILsendr   r,   ZOTP_SENTrL   r-   ZUSER_NOT_EXIST)r   r.   r   r/   tzcurrent_timer1   r\   body_msgmsger   r   r   generate_otp   s"    



zUserService.generate_otpc             C   s   | j |j tjd}tj|}|jd}|jd}|jd }|jd }tjj	|j
 |dj }	|	r|	j}
|
j|tdd }
tj|
d}tj|
d}||kr||krd tjtd	S d tjtd	S nd tjtd	S d S )
NzAsia/Kolkataz%m/%d/%yz%H:%Mr   r\   )r   r\   r   )hours)r"   r#   r$   )validate_otp_datar"   rV   rW   r   rX   strftimer   r@   filterr&   firstr]   
astimezoner   r   r,   ZOTP_VERIFIDr-   ZOTP_EXPIREDZDETAILS_INCORRECT)r   r.   r/   r`   ra   Znow_dateZnow_time
user_emailr\   r1   r]   Zotp_dateZotp_timer   r   r   
verify_otp   s"    





zUserService.verify_otpc             C   s~   | j |j y| j|jd }W n tk
r>   d tjtdS X t||jd}|j rl|j	  d tj
tdS d tjtdS d S )Nr   )r"   r#   r$   )r"   )validate_reset_password_datar"   rY   rL   r   r-   EMAIL_NOT_EXISTr   rF   rB   r,   ZPASSWORD_RESET_SUCCESSFULLYZPASSWORD_RESET_FAILED)r   r.   r/   r1   r2   r   r   r   reset_password   s    zUserService.reset_passwordc             C   s<   yt jj|j ddS  t jk
r6   tdtiY nX d S )Nr   )r   	is_activer   )r   r@   r7   r&   rC   rL   ro   )r   r   r   r   r   rY      s
    zUserService.get_object_by_emailc             C   sD   i }|j ds|jdti |j ds4|jdti |r@t|d S )Nr   r\   )r7   r8   r5   r   )r   r"   r:   r   r   r   rg      s    

zUserService.validate_otp_datac             C   sD   i }|j ds|jdti |j ds4|jdti |r@t|d S )Nr   r   )r7   r8   r5   r   )r   r"   r:   r   r   r   rn      s    

z(UserService.validate_reset_password_datac             C   s   d}d}dj tj||}d|j_| j|jjd|jd< ||jd< t|jd}|j	 r|j
  dj|jd	 |jd
 |jd |d}td|}dtj }	}
t|	||
|jd g}d|_|j  |jtjtdS |jtjtdS )NzJabcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()?   rP   Timager   )r"   z{} {}
first_name	last_namer   )namer   r   z$api/email/welcome-user-by-admin.htmlzWelcome in ITrackhtml)r"   r#   r$   )joinrZ   samplePOST_mutabledecode_base64_imager"   r7   r   rF   rB   r/   r   r   r^   r   content_subtyper_   r   r,   ZUSER_CREATEDerrorsr-   BAD_REQUEST)r   r.   r/   sZpasslenr   r2   contextrb   subject
from_emailrc   r   r   r   rA     s&    

zUserService.createc       	      C   sn   t jd}tj|}|jd}|jd}|jd\}}|jdd }ttj|d| d | d	 | d
}|S )NzAsia/Kolkataz%Y-%m-%dz%H:%Mz;base64,/r   Ztemp__.)rv   )	rV   rW   r   rX   rh   splitr   base64	b64decode)	r   r"   r`   Zcurrent_dateZformated_dateZformated_timer/   Zimgstrextr   r   r   r|   +  s    



&zUserService.decode_base64_imagec             C   s  | j |}|ry"tjj|jjd|jd d}W n tjk
rL   d }Y nX |d k	rp|j|jkrpd tjt	dS d|j
_d|jkr|jjdd k	r|jjdjdr| j|jjd|jd< n
d |jd< t||jd}|j r|j  |jtjtdS |jtjtdS d tjtdS d S )	Nr   role)r   r   )r"   r#   r$   Trs   z
data:image)r"   )
get_objectr   r@   r7   r"   rC   r?   r   r-   ZEMAIL_ALREADY_EXISTrz   r{   
startswithr|   r   rF   rB   r,   ZUSER_UPDATEDr~   r   rQ   )r   r.   r?   r/   r1   rl   r2   r   r   r   update_user7  s&    
"

zUserService.update_userc             C   s,   yt jj|ddS  t jk
r&   d S X d S )NF)r?   
is_deleted)r   r@   r7   rC   )r   r?   r   r   r   r   S  s    zUserService.get_objectc             C   s8   | j |}|r&t|}|jtjtdS d tjtdS d S )N)r"   r#   r$   )r   r   r"   r   r,   OKr-   rQ   )r   r.   r?   r/   r1   r2   r   r   r   get_user_by_idY  s
    
zUserService.get_user_by_id)N)N)N)N)N)N)N)N)N)N)__name__
__module____qualname____doc__r   r
   r%   r+   r>   rH   rE   rU   re   rm   rp   rY   rg   rn   rA   r|   r   r   r   r   r   r   r   r   !   s(   
 

	



	
#
r   )-rest_frameworkr   rest_framework.responser   rest_framework_jwt.settingsr   django.template.loaderr   jsonr   rZ   django.core.mailr   r   django.core.exceptionsr   django.contrib.authr	   r
   rV   r   r   r(   JWT_PAYLOAD_HANDLERr'   JWT_ENCODE_HANDLERjwt_encode_handlerdjango.core.files.baser   ZuserBaseServicer   Z
api.modelsr   r   Zapi.serializers.userr   r   r   r   r   Zapi.utils.messages.userMessagesZ!api.utils.messages.commonMessagesitrackr   r   r   r   r   r   <module>   s,   