a
    jeb(                    @   s  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
T ddlT d dl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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#Z#d dl$m%Z% ddl&m'Z' d dl(T d dl)Z)d dl*m+Z+ d dl,Z,ddl-m.Z. d dl/m0Z0 d dl1Z1d dl2T ddl3T d dl4m5Z5m6Z6 d dl7T d dl8m9Z9 d dl:Z:d dl;m<Z< d dl=Z=d dl>m?Z? d dl@mAZA d dlmBZB ejCZDejEZFeAeDeFZGejHZIdd ZJdd  ZKd!d" ZLd#d$ ZMG d%d& d&eZNG d'd( d(eZOG d)d* d*eZPG d+d, d,eZQG d-d. d.eZRG d/d0 d0eZSG d1d2 d2eZTG d3d4 d4eZUG d5d6 d6eZVG d7d8 d8eZWG d9d: d:eZXG d;d< d<eZYG d=d> d>eZZG d?d@ d@eZ[dAdB Z\G dCdD dDeZ]G dEdF dFeZ^G dGdH dHeZ_G dIdJ dJeZ`G dKdL dLeZaG dMdN dNeZbG dOdP dPeZcG dQdR dReZdG dSdT dTeZeG dUdV dVeZfG dWdX dXeZgG dYdZ dZeZhG d[d\ d\eZiG d]d^ d^eZjG d_d` d`eZkG dadb dbeZlG dcdd ddeZmG dedf dfeZnG dgdh dheZoG didj djeZpG dkdl dleZqG dmdn dneZrG dodp dpeZsG dqdr dreZtd dslumvZv G dtdu dueZwG dvdw dweZxG dxdy dyeZyG dzd{ d{eZzG d|d} d}eZ{G d~d deZ|dd Z}G dd deZ~G dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deBjZdS )    )message)render)APIView)Responsestatus   )*N)datetime	timedeltadate)settings)authenticate)User)RefreshToken)django_pbkdf2_sha256)render_to_string)mail)EmailMultiAlternatives)messages)forms)get_authorization_header)authenticated)FileSystemStorage)ContentSerializerFAQSerializer)FortuneTellerSerializer)Q)FCMNotification)Client)genericsc                 C   sV   d}t |d}d}tj| jd }t }t|t| }||| }t|d | S )Nzmedia/user_profile)locationz/media/user_profiler   /)r   ospathsplitextnamerandomStringFunctionForImagestrsave)imagefullPathfs	fullPath2filetypetheNametheImageNamefilename r2   //var/www/html/Ryun_Seer/seer/seer_user/views.pyuploadTheProfile1   s    
r4   c                  C   s`   t j  } | rX| jsdS | j}|dd  }t|d }t|}|d}dt| S dS d S )NZ
APOIN00001   r   ZAPOIN)FortuneAppointmentBookobjectsalllastappointment_idintr(   zfilllastObjtheIdr2   r2   r3   generateAppointment=   s    
r@   c                  C   s`   t j  } | rX| jsdS | j}|dd  }t|d }t|}|d}dt| S dS d S NTRANS000001r5   r   TRANS)FortuneTellerTranscationsr7   r8   r9   transcation_idr;   r(   r<   r=   r2   r2   r3   generateTranscationsIdFortuneM   s    
rF   c                  C   s`   t j  } | rX| jsdS | j}|dd  }t|d }t|}|d}dt| S dS d S rA   )SeerUserTranscationr7   r8   r9   rE   r;   r(   r<   r=   r2   r2   r3   generateTranscationsId]   s    
rH   c                   @   s   e Zd Zdd ZdS )Registerc              
   C   s  zl|j }|d}|d}|d}|d}|d}|d}|s^tdditjd	W S |svtdd
itjd	W S |stdditjd	W S |stdditjd	W S |stdditjd	W S t|}	tjj	|d
 }
|
rtdditjd	W S |r$tjj	|d
 }|s$tdditjd	W S tjj|||||	t d}
|rtjj	|d
 }|rtj 
 }tjj|
|jd tjj	|d
 }|rt|jt|j }||_|  ntjj||jd tjjdd|
d t|
}|j}dt| }tj| }||
_|
  d}tdd|i}|}tj}|}tj ||||g|d t!jj|d | d dd  tdd!iW S  t"y } z"tdt|itj#d	W  Y d }~S d }~0 0 d S )"N
first_name	last_nameemailpassworddate_of_birthget_referal_coder   email is requiredr   first_name is requiredlast_name is requiredpassword is requireddate_of_birth is requiredrL   The email is already registered)referal_codezInvalid referal code)rJ   rK   rL   rN   rM   rW   	seer_useramountrY   z1You have received your referal bonus successfullyreferal_bonusr   notification_typerY   z/seer_user/email-verify?token=Verify Accountzemail_verifcation.htmllinkhtml_message z3 seer user has been succesfully registered with us.Zseer_user_registerr   typezGYou have been successfully registered with us.Please verify your email.)$datagetr   r   HTTP_400_BAD_REQUESThandlerhashSeerUserr7   filterfirstHTTP_409_CONFLICTcreategenerate_referral_codeGeneralSettingsr8   SeerUserWalletrefer_friend_offr;   rZ   r)   SeerUserNotificationsr   for_useraccess_tokenr(   r   BASE_URLemail_verification_linkr   EMAIL_HOST_USERr   	send_mailAdminNotifications	ExceptionHTTP_500_INTERNAL_SERVER_ERROR)selfrequestrf   rJ   rK   rL   rM   rN   rO   new_passwordseer_user_objZ
check_coder\   Zcheck_wallet
new_amountZverify_tokentokenZverify_linkZcomplete_linksubjectrb   plain_message
from_emailtoer2   r2   r3   postn   sn    









zRegister.postN__name__
__module____qualname__r   r2   r2   r2   r3   rI   m   s   rI   c                   @   s   e Zd Zdd ZdS )SocialLoginc              
   C   s  z|j }|d}|d}|d}|d}|d}|d}|d}	|rX|sltdd	itjd
W S |stdditjd
W S |stdditjd
W S |stdditjd
W S |stdditjd
W S |stdditjd
W S |	stdditjd
W S tjj|d }
|
j	dkr.tdditjd
W S |
sRtjj
|||||||	t d}
t|
}|
j|
j|
j|
j|
j|
jt|t|jd}td|dW S  ty } z"tdt|itjd
W  Y d }~S d }~0 0 d S )Nprovider_idrL   rJ   rK   	social_iddevice_type	fcm_tokenr   z$Provider and social_id are required.r   rQ   rR   rP   zdevice_type is requiredzfcm_token is required)r   r   AThis account has been deleted.For more information contact admin.)rJ   rK   r   r   rL   r   r   rW   idrJ   rK   rL   rN   is_profile_completedrefreshaccessSuccessr   rf   )rf   rg   r   r   rh   rk   r7   rl   rm   account_deletedro   rp   r   ru   r   rJ   rK   rL   rN   r   r(   rv   r|   r}   )r~   r   rf   r   rL   rJ   rK   r   r   r   r   refresh_tokenallDatar   r2   r2   r3   r      sV    








zSocialLogin.postNr   r2   r2   r2   r3   r      s   r   c                   @   s   e Zd Zdd ZdS )LoginMobilec              
   C   s4  z|j }|d}|d}|d}|d}tddd}|sVtdd	itjd
W S |sntdditjd
W S || }tjj	|d
 }	|	r|	jdkrtdditjd
W S |	stjj|t d}	||	_||	_||	_|	  d|	ji}
td|
dW S  ty. } z"tdt|itjd
W  Y d }~S d }~0 0 d S )Ncountry_codephone_numberr   r   i  i'  r5   r   country_code is requiredr   phone_number is required)r   r   r   )r   rW   otpr   r   )rf   rg   random	randranger   r   rh   rk   r7   rl   rm   r   ro   rp   r   r   r   r)   r|   r(   r}   )r~   r   rf   r   r   r   r   Zthe_otpmobile_numberr   ZuserDatar   r2   r2   r3   r      s6    




zLoginMobile.postNr   r2   r2   r2   r3   r      s   r   c                   @   s   e Zd Zdd ZdS )emailVerificationc              
   C   sl   z8|j d}tjj|d }d|_|  t|dW S  t	yf } zt|dW  Y d }~S d }~0 0 d S )Nr   )rx   Tzemail_verification_success.htmlzemail_verfication_failed.html)
GETrg   rk   r7   rl   rm   email_verifiedr)   r   r|   )r~   r   r   Zcustomer_Objr   r2   r2   r3   rg     s    zemailVerification.getNr   r   r   rg   r2   r2   r2   r3   r     s   r   c                   @   s   e Zd Zdd ZdS )OtpVerificationc              
   C   sN  z
|j }|d}|d}|d}|s@tdditjdW S |sXtdditjdW S |sptdditjdW S || }ztjj||d	}W n: ty } z"td
i dtjdW  Y d }~W S d }~0 0 t	|}	|j
|j|j|j|j|jt|	t|	jd}
td|
dW S  tyH } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r   r   r   zotp is required)r   r   zInvalid otpr   r   r   )rf   rg   r   r   rh   rk   r7   r|   r   ru   r   rJ   rK   rL   rN   r   r(   rv   r}   )r~   r   rf   r   r   r   r   r   r   r   r   r2   r2   r3   r   $  s:    


,
	zOtpVerification.postNr   r2   r2   r2   r3   r   #  s   r   c                   @   s   e Zd Zdd ZdS )	LoginUserc              
   C   s  z|j }|d}|d}|d}|d}|sJtdditjdW S |sbtdditjdW S tjj|d	 }|d
krtdditj	dW S tjj|ddd
 }|stdditjdW S |jdkrtdditjdW S |j}	t||	}
|jdkrtdditjdW S |
rn||_||_|  t|}|j|j|j|j|j|jt|t|jd}td|dW S tdditjdW S W n< ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )NrL   rM   r   r   r   rP   r   rS   rU   r   z:This email does not exist in our database, please registerT)rL   r   end_date__isnullz=Your account has not been activated, Please contact to admin.r   r   FzPlease verify your email firstr   zLogin Successfullyr   zInvalid password) rf   rg   r   r   rh   rk   r7   rl   countHTTP_404_NOT_FOUNDrm   HTTP_401_UNAUTHORIZEDr   rM   ri   verifyr   r   r   r)   r   ru   r   rJ   rK   rL   rN   r   r(   rv   r|   r}   )r~   r   rf   rL   rM   r   r   useruserObjcheck_passwordcheckr   r   r   r2   r2   r3   r   E  sP    





	zLoginUser.postNr   r2   r2   r2   r3   r   D  s   r   c                   @   s   e Zd Zdd ZdS )SeerUserForgetPasswordc              
   C   sR  z|j }|d}|s&tddiW S tjj|d }|dkrTtdditjdW S tjj|d	 }|rd
d	d
 tdD }dt|j d | }ttj| }||_|  d}	tdd|i}
|
}tj}|}tj|	|||g|
d tddiW S tddiW S W nD tyL } z*t| tdt|itjdW  Y d }~S d }~0 0 d S )NrL   r   Email is requiredrU   r   zPThis email does not exist in our database, please enter the valid email address.r    c                 S   s   g | ]}t tjtj qS r2   )r   choicestringascii_lettersdigits).0nr2   r2   r3   
<listcomp>}      z/SeerUserForgetPassword.post.<locals>.<listcomp>   z/seer_user/forgot/r"   zForgot Passwordzforget_password_email.htmlr`   ra   z8Reset password link has been sent to this email address.zEmail not exists)rf   rg   r   rk   r7   rl   r   r   r   rm   joinranger(   rL   r   rw   forgot_password_linkr)   r   ry   r   rz   r|   printr}   )r~   r   rf   rL   r   r   ran_numbaselinkcompletelinkr   rb   r   r   r   r   r2   r2   r3   r   r  s4    
zSeerUserForgetPassword.postNr   r2   r2   r2   r3   r   q  s   r   c                   @   s   e Zd Zdd Zdd ZdS )forgetPasswordVerificationc                 C   sr   t | jj}|dd }tjj|d }|jdkr@t	|dS tjj||d }|r^d}nd}t	|d	d
|iS )Nr"   rU   
LinkExpiryzlink-expire.html)rL   r   TFforgot.htmlvalid)
r(   r   r$   splitrk   r7   rl   rm   r   r   )r~   r   r`   
user_emaillink_expiryuser_objr   r2   r2   r3   rg     s    

zforgetPasswordVerification.getc           	      C   s   t |j}| r|jd}|jd}t| jj}|	dd }t
|}tjj|d }|r||_d|_|  t|d t|dS nt|d	d
|iS d S )Nr   confirm_new_passwordr"   rU   r   zChanged successfullyzpassword_success.htmlr   form)r   forgetverificationPOSTis_validcleaned_datarg   r(   r   r$   r   ri   rj   rk   r7   rl   rm   rM   r   r)   r   successr   )	r~   r   r   r   r   r`   r   encrypt_passwordr   r2   r2   r3   r     s    
zforgetPasswordVerification.postNr   r   r   rg   r   r2   r2   r2   r3   r     s   r   c                   @   s   e Zd Zdd ZdS )
GetHobbiesc              
   C   s   zFt jjddd}g }|D ]}|j|jd}|| qtd|dW S  ty } z"tdt|it	j
dW  Y d }~S d }~0 0 d S )NTr   r   )r   hobbyr   r   r   r   )Hobbiesr7   rl   r   r   appendr   r|   r(   r   r}   )r~   r   Zhob_objr   Zhoball_datar   r2   r2   r3   rg     s    zGetHobbies.getNr   r2   r2   r2   r3   r     s   r   c                   @   s   e Zd Zdd ZdS )SeerUserHelpSupportc              
   C   s(  zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|j
}|d}|d}|stdditjdW S |stdditjdW S tjj|||d tjj|jd |j d	 d
d tddiW S  ty" } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   titleztitle is requiredzmessage is required)r   r   rY   rc   z seer user has a help & supportseer_user_help_supportrd   zMYour request has been submitted successfully. We will revert you back sortly.)r   r|   r   r(   r   r   rk   r7   rl   rm   rf   rg   rh   HelpSupportro   r{   rJ   rK   r}   )r~   r   uidr   r   rf   r   r   r2   r2   r3   r     s$    .

 zSeerUserHelpSupport.postNr   r2   r2   r2   r3   r     s   r   c                   @   s   e Zd Zdd ZdS )getLifestyleQuestionc              
   C   s   zt jjdd}i }|D ]F}|jj}||vr:|g d||< |j}|j}|| d ||d qdt|	 i}t
j|dd}	t
|	}td	|d
W S  ty }
 z"tdt|
itjdW  Y d }
~
S d }
~
0 0 d S )NTr   )questionoptionsr   )	option_idoption_valuequestion_dict),:)
separatorsr   r   r   r   )LifestyleOptionsr7   rl   lifestyle_questionquestion_titler   optionr   listvaluesjsondumpsloadsr   r|   r(   r   r}   )r~   r   question_objr   r   Zquestion_namer   option_dataZnew_feature_dictZjson_feature_dictr   r2   r2   r3   rg     s*    


zgetLifestyleQuestion.getNr   r2   r2   r2   r3   r     s   r   c                   @   s   e Zd Zdd ZdS )
getProfilec              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S t|j}td|dW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   user not foundr   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   SeerUserSerializerrf   r}   )r~   r   r   r   r   r   r2   r2   r3   rg     s    .
zgetProfile.getNr   r2   r2   r2   r3   r     s   r   c                   @   s   e Zd Zdd ZdS )SeerUserCompleteProfilec           "   
   C   s  zbzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}|d}|d}|d}|d}	|d	}
|d
}|d}|d}|d}|d}|d}|d}|d}|d}|d}|d}|d}tjj|dj|jd	 }|r^tdditjdW S |sxtdditjdW S |stdditjdW S |stdditjdW S |	stdditjdW S |
stdditjdW S |stdditjdW S |stdditjdW S |s.tdditjdW S |sHtdd itjdW S |sbtdd!itjdW S tt|
d"\}}}t||}t|}t|}tjj|d#	 }tjj|d$	 }tjj|d%	 } tjj|||| d&}!||_||_|
|_||_|	|_ ||_!||_"||_#||_$||_%||_&||_'||_(||_)||_*||_+d'|_,t- |_.||_/|0  tdd(iW S  ty } z"tdt|itj1dW  Y d }~S d }~0 0 d S ))Nr   r   r   r   rJ   rK   rL   genderrN   religion
professionheightcountry_originstatecity	languageshobbiesbio	educationincometimezonerU   rV   rP   rQ   rR   gender is requiredrT   timezone is requiredcountry_origin is requiredstate is requiredcity is requiredlanguages is required-)	horoscope)chinese_zodiac)element_name)rY   r  r  five_elementTr   )2r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   excluder   rn   rh   mapr;   r   Zget_astrological_signZget_chinese_zodiacZget_five_element	HoroscopeChineseZodiacFiveElementsSeerUserSignDetailro   rJ   rK   rN   rL   r  r  r  r  r  r  r  r  r	  r
  r  r  r   generate_strip_iduser_stripe_idr  r)   r}   )"r~   r   r   r   r   rf   rJ   rK   rL   r  rN   r  r  r  r  r  r  r  r	  r
  r  r  r  Zcheck_emailyearmonthdayr  Zzodiacelementhoroscope_objZchinese_objelements_objZsign_detailr2   r2   r3   r     s    .
















	

zSeerUserCompleteProfile.postNr   r2   r2   r2   r3   r     s   r   c                   @   s   e Zd Zdd ZdS )SeerUserEditProfilec              
   C   s  zPzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}|d}|d}|d}|d}	|d	}
|d
}|d}|d}|d}|d}|d}|d}|d}|d}|d}|s.tdditjdW S |sHtdditjdW S |sbtdditjdW S |s|tdditjdW S |stdditjdW S |stdditjdW S |stdditjdW S |stdditjdW S ||_||_||_|	|_|
|_||_||_||_||_||_||_||_||_||_||_|  tddiW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   rJ   rK   r  r  r  r  r  r  r  r  r	  r
  r  r  r  rQ   rR   r  r  r  r  r  r  r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   rJ   rK   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r)   r}   )r~   r   r   r   r   rf   rJ   rK   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r2   r2   r3   r   y  sv    .














	zSeerUserEditProfile.postNr   r2   r2   r2   r3   r'  x  s   r'  c                 C   s   t t| | jdS )N)key)maxsetr   )lstr2   r2   r3   most_common  s    r,  c                   @   s   e Zd Zdd ZdS )AddMbtic              
   C   s  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S t|jd}td| |stdditjdW S tt|}t|jd}td| |stdditjdW S tt|}t|jd	}	td	|	 |	s(tdd
itjdW S tt|	}
t|jd}td| |shtdditjdW S tt|}|| |
 | }tjj|dd	 }tjj|dj|d tdd|j d| ddW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   extraversion_introversionz%extraversion_introversion is requiredsensing_intuitionzsensing_intuition is requiredthinking_feelingzthinking_feeling is requiredjudging_perceivingzfourth array is requiredT)	mbti_namer   r[   )mbtir   zYou are (z) type!r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   r   rh   r,  evalMBTIr  updatetagliner}   )r~   r   r   r   r   r.  Zfirst_pair_mbtir/  Zsecond_pair_mbtir0  Zthird_pair_mbtir1  Zfourth_pair_mbtiZcreated_mbtiZ
fetch_mbtir2   r2   r3   r     sD    .



 zAddMbti.postNr   r2   r2   r2   r3   r-    s   r-  c                   @   s   e Zd Zdd ZdS )UploadImagesc           
   
   C   s  zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S |j}|d}g }|D ]}t|}	||	 q|js||_|d |_|  td|dW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )	Nr   r   r   r   imagesr   r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   getlistr4   r   r:  primary_imager)   r}   )
r~   r   r   r   r   rf   r:  
image_urlsr*   
image_pathr2   r2   r3   r   ,  s*    .

zUploadImages.postNr   r2   r2   r2   r3   r9  +  s   r9  c                   @   s   e Zd Zdd ZdS )
EditImagesc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S |j}|d}||_|d |_|  td|dW S  t y } z"tdt|itjdW  Y d }~S d }~0 0 d S )	Nr   r   r   r   r=  r   r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   r:  r<  r)   r}   )r~   r   r   r   r   rf   r=  r2   r2   r3   r   J  s     .

zEditImages.postNr   r2   r2   r2   r3   r?  I  s   r?  c                   @   s   e Zd Zdd ZdS )RemoveImagec              
   C   s  zbzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}|d}|stdditjdW S tjtj|}tj|rNt| tjj|d	 }t|j}	g }
|dd}t| |	D ]&}t||krt| |
| qtjj|dj|
d	 tdd
iW S tdditj
dW S W n< ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r*   zimage is required'r   )r:  zImage deleted successfully.zImage not found.)r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   r#   r$   r   r   
MEDIA_ROOTexistsremoveastliteral_evalr:  replacer   r   r7  r}   )r~   r   r   r   r   rf   Z
image_namer>  Zuser_obj_imageuser_imagesZ	form_datayimgr2   r2   r3   r     s:    .

zRemoveImage.postNr   r2   r2   r2   r3   r@    s   r@  c                   @   s   e Zd Zdd ZdS )SeerUserDeleteAccountc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S |  tjj|jd |j d dd tdd	iW S  t y } z"tdt|itjdW  Y d }~S d }~0 0 d S )
Nr   r   r   r   rc   z$ seer user has deleted their accountr   rd   zAccount deleted successfully)r   r|   r   r(   r   r   rk   r7   rl   rm   r   deleter{   ro   rJ   rK   r}   )r~   r   r   r   r   r2   r2   r3   rg     s    . zSeerUserDeleteAccount.getNr   r2   r2   r2   r3   rK    s   rK  c                   @   s   e Zd Zdd ZdS )
GetUserFaqc              
   C   s|   z4t jjdddd}t|ddj}td|dW S  tyv } z*t| tdt	|it
jd	W  Y d }~S d }~0 0 d S )
NTr   )r   re   -idmanyr   r   r   r   )Faqr7   rl   order_byr   rf   r   r|   r   r(   r   r}   )r~   r   faq_objr   r   r2   r2   r3   rg     s    zGetUserFaq.getNr   r2   r2   r2   r3   rM    s   rM  c                   @   s   e Zd Zdd ZdS )GetUserBlogc              
   C   sl   z,t jjdd }t|j}td|dW S  tyf } z"tdt|it	j
dW  Y d }~S d }~0 0 d S )NZBlog)	page_typer   r   r   r   ContentManagementr7   rl   rm   r   rf   r   r|   r(   r   r}   r~   r   content_objr   r   r2   r2   r3   rg     s    
zGetUserBlog.getNr   r2   r2   r2   r3   rT    s   rT  c                   @   s   e Zd Zdd ZdS )GetUserPrivacyPolicyc              
   C   sn   z.t jjddd }t|j}td|dW S  tyh } z"tdt|it	j
dW  Y d }~S d }~0 0 d S )NzPrivacy Policyr   rU  	user_typer   r   r   r   rV  rX  r2   r2   r3   rg     s    
zGetUserPrivacyPolicy.getNr   r2   r2   r2   r3   rZ    s   rZ  c                   @   s   e Zd Zdd ZdS )GetUserTermsc              
   C   sn   z.t jjddd }t|j}td|dW S  tyh } z"tdt|it	j
dW  Y d }~S d }~0 0 d S )NzTerms & conditionsr   r[  r   r   r   r   rV  rX  r2   r2   r3   rg     s    
zGetUserTerms.getNr   r2   r2   r2   r3   r]    s   r]  c                   @   s   e Zd Zdd ZdS )FortuneTellerListc              
   C   s  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}|d}|d}|d}|d}	|d	}
t }|r|t|d
tj |r|t|dtj |r |t|dtj |	r"|
r"|t|	|
dtj tjj|ddd}t|dd|idj}tjjdddd}t|ddj}tjjddd}t|ddj}|||t|jd}td|dW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   servicelanguageskills
min_rating
max_rating)Zservices__contains)Zlanguages__contains)Zskills__contains)Zrating__gteZrating__lteT)r   r   rY   rP  context)	is_onliner   r   rO  r   )Zfortune_tellersonline_fortune_tellersservicesr  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   query_paramsrg   r   addANDFortuneTellerr   rf   ServiceZServiceSerializerrE  rF  r  r}   )r~   r   r   r   r   rf   r_  r`  ra  rb  rc  lookupsfortune_teller_objZfortuner_dataZonline_fortunerg  rh  Zserialized_servicesr   r2   r2   r3   rg      sJ    .





zFortuneTellerList.getNr   r2   r2   r2   r3   r^    s   r^  c                   @   s   e Zd Zdd ZdS )FortuneTellerDetailc              
   C   s0  zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S |j}|d}|stdditjdW S tjj|d	 }t|d|idj}tjj|d	}	t|	d
dj}
td||
dW S  ty* } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r   id is requiredrY   re  fortune_tellerTrO  r   )r   rf   Zreviews)r   r|   r   r(   r   r   rk   r7   rl   rm   r   ri  rg   rh   rl  r   rf   FortunetellerRatingReviewsZFortunerTellerReviewSerializerr}   )r~   r   r   r   r   rf   
fortune_idro  r   Z
review_objreview_datar2   r2   r3   rg   ,  s&    .
zFortuneTellerDetail.getNr   r2   r2   r2   r3   rp  +  s   rp  c                   @   s   e Zd Zdd ZdS )FavUnfavouriteFortunec           	   
   C   sR  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |jd}|stdditjdW S tjj|d	 }|stdditjdW S tjj||dd\}}| s|  tdd	iW S |  tdd
iW S W n< tyL } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   fortune_teller_idFortune teller id is requiredr   )fortunerY   is_favouritezRemoved from favourite listzAdded to favourite list.)r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   rl  FavouriteUnfavouriteFortuneget_or_createrL  r)   r}   )	r~   r   r   r   r   ry  fortune_objZfavourite_postcreatedr2   r2   r3   r     s,    .zFavUnfavouriteFortune.postNr   r2   r2   r2   r3   rx    s   rx  c                   @   s   e Zd Zdd ZdS )FortuneFavListingc           
   
   C   s  zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S tjj|dd}g }|D ]0}tjj|jjdd}t|dd	j}	||	 qtd
|dW S  ty
 } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r   )rY   r|  Tr   r   rO  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   r}  rl  r{  r   r   rf   extendr}   )
r~   r   r   r   r   Zfav_objZall_DataZfavro  r   r2   r2   r3   rg     s"    .zFortuneFavListing.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )	ContactUsc              
   C   sD  z |j d}|s(tdditjdW S |j d}|sLtdditjdW S |j d}|sptdditjdW S |j d	}|stdditjdW S |j d}|stdd
itjdW S d}td|||||d}|}	tj}
|}tj	||	|
|g|d tddiW S  t
y> } z"tdt|itjdW  Y d }~S d }~0 0 d S )NrJ   r   zFirst name is requiredr   rK   zLast name is requiredrL   r   r   zMessage is requiredr_   zcontact_us_email.html)rJ   rK   rL   r   r   ra   r   )rf   rg   r   r   rh   r   r   ry   r   rz   r|   r(   r}   )r~   r   rJ   rK   rL   r   r   r   rb   r   r   r   r   r2   r2   r3   r     s2    zContactUs.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )UserResetPasswordc              
   C   sX  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |jd}|stdditjdW S |jd}|stdditjdW S |j}t||}|d	krtdd
itjdW S |}	t|	}
|
|_|  tddiW S  tyR } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   old_passwordzold password is requiredr   znew password is requiredFzOld password is incorrectr   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   rM   ri   r   HTTP_403_FORBIDDENrj   r)   r}   )r~   r   r   r   r   r  r   r   r   rM   r   r2   r2   r3   r     s2    .
zUserResetPassword.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )GetNotificationSettingsc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S |jd}|stdditjdW S ||_|  td|jdW S  t y } z"tdt|itjdW  Y d }~S d }~0 0 d S )	Nr   r   r   r   notification_dataznotification data is requiredr   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   notification_statusr)   r}   )r~   r   r   r   r   r  r2   r2   r3   r     s     .zGetNotificationSettings.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )GetUserNotificationsc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S tjj|ddd}t|ddj}td	|d
W S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   T)rY   r   rN  rO  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rt   rR  ZUserNotificationSerializerrf   r}   )r~   r   r   r   r   Znotification_objr   r2   r2   r3   rg     s    .zGetUserNotifications.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )DeleteUserNotificationsc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|j
d}|stdditjdW S tjj|djt d tddiW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   rq  )end_dater   )r   r|   r   r(   r   r   rk   r7   rl   rm   rf   rg   rh   rt   r7  r
   nowr}   )r~   r   r   r   r   Znotification_idr2   r2   r3   rg   $  s    .zDeleteUserNotifications.getNr   r2   r2   r2   r3   r  #  s   r  c                   @   s   e Zd Zdd Zdd ZdS )FortuneBookAppointmentc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S |jd}|stdditjdW S tjj|dd	 }td	|jd
W S  t y } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   ry  rz  Tr  r   )r   rh  )r   r|   r   r(   r   r   rk   r7   rl   rm   r   ri  rg   rh   rl  rh  r}   )r~   r   r   r   r   ry  Zfortune_servicesr2   r2   r3   rg   5  s    .zFortuneBookAppointment.getc                 C   s,  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |jd}|stdditjdW S tjj|dd	 }t }|jd	}|stdd
itjdW S |jd}	|	s tdditjdW S |jd}
|
s&tdditjdW S tjj|
d	 }|sRtdditjdW S |jd}|sxtdditjdW S |jd}|stdditjdW S |j}tjj|d	 }t|	d}|ttdd }|d}tjj|||||	d | ||||d	}tjj||jd |j d dd d|ji}|jr|j}tt j!}|j"d krdd!|jd |j d d"}t#|d#j$||d$}|j"d%krd&}|jd |j d }dd!|jd |j d d"}t#|d#j$||||d'}td(|d)W S  ty& } z"tdt|itj%dW  Y d }~S d }~0 0 d S )*Nr   r   r   r   ry  rz  Tr  appointment_datezAppointment date is requiredappointment_timezAppointment time is requiredservice_namezservice is required)r  zNo service foundservice_typezService type is requiredpricezPrice is requiredrs  %I:%M %p   minutesr  )	r:   rt  rY   r  r  r_  r  r  r  rc   z booked an appointment.Zappointment_booking)rt  r   r^   r:   AndroidBOOKED APPOINTMENTre   r   r   api_keyregistration_iddata_messageIos)r  r  message_titlemessage_bodyr  r   r   )&r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   rl  r@   rm  r  FortuneTellerTimingr
   strptimer   r;   strftimer6   ro   FortuneTellerNotificationsrJ   rK   r   r  r   r   FIREBASE_SERVER_KEYr   r   notify_single_devicer}   )r~   r   r   r   r   ry  r  Zgenerate_appointmentr  r  r  service_objr  r  r  time_objtime	time_slotZ
taken_timeZbook_appointment_objrf   r  
server_keyr  resultr  r  r2   r2   r3   r   G  s    .
"
zFortuneBookAppointment.postNr   r2   r2   r2   r3   r  4  s   r  c                   @   s   e Zd Zdd ZdS )GetBookingListc              
   C   s>   zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |jd}|stdditjdW S |dkrtjjdd	g|d
d}n tjj|djdd	gdd}t|ddj}td|dW S  ty8 } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   booking_typezBooking type is requiredZUpcomingPendingAccepted)appointment_status__inrY   rN  r[   )r  TrO  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   ri  rg   rh   r6   rR  r  AppointmentFortuneTellerrf   r}   )r~   r   r   r   r   r  appoint_objr   r2   r2   r3   rg     s$    . zGetBookingList.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )GetBookingDetailsc              
   C   s  zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|j
d}|stdditjdW S tjj||d}|stdditjdW S t|dd	j}td
|dW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   
booking_idzBooking Id is required)rY   r   No appointment foundTrO  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   ri  rg   rh   r6   r  rf   r}   )r~   r   r   r   r   r  r  r   r2   r2   r3   rg     s     .zGetBookingDetails.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )AddMoneyToWalletc              
   C   s  zjzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|j
}|d}|stdditjdW S |j
d}|stdditjdW S tjj||d	 }|stdd	itjdW S d
}	t|j|jt||	}
|
d dkrj|j	 }|r,| jt|7  _|  ntjj||d tjj|jd |j d dd tddiW S W nz tjjy } z"tdt|itjdW  Y d }~S d }~0  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   rZ   zamount is requiredcard_idcard_id is requiredr   rY   No card found is requiredtruer   TrX   rc   z' seer user added money to their wallet.seer_user_walletrd   z"Money added to wallet successfully)r   r|   r   r(   r   r   rk   r7   rl   rm   rf   rg   rh   SeerUserCardspaymentWithExistingCardthe_user_striper  r;   walletrZ   r)   rr   ro   r{   rJ   rK   stripeerror	CardErrorr}   )r~   r   r   r   r   rf   rZ   r  card_objcapture_valuethePaymentObjr  r2   r2   r3   r     sB    .


 *zAddMoneyToWallet.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )GetWalletDetailc           	   
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }t
jj|d	 }t|j}tjj|ddd d }t|dd	j}td
|dW S  t y } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r[   r  )rY   payment_mode   TrO  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   rr   ZSeerUserWalletSerializerrf   rG   WalletTranscationSerializerr}   )	r~   r   r   r   r   Zwallet_detail
serializerwallet_transcationtranscation_serializerr2   r2   r3   rg     s    .
zGetWalletDetail.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )WalletAllTranscationc              
   C   sR  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|j
d}|stdditjdW S |dkrtjj|ddd}t|d	d
j}nP|dkrtjj|ddd}t|d	d
j}n"tjj|dd}t|d	d
j}td|dW S  tyL } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   transcation_typeztranscation_type is requiredpay)rY   r  rN  TrO  refundr[   r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   ri  rg   rh   rG   rR  r  rf   r}   )r~   r   r   r   r   r  r  r  r2   r2   r3   rg     s(    .zWalletAllTranscation.getNr   r2   r2   r2   r3   r    s   r  )r  c                   @   s   e Zd Zdd Zdd ZdS )getFortuneTimeSlotc                 C   sT   d}|}t |d}|d}|d | }	t |	|}
||
}
|
|}
|
|S )N%Y-%m-%d %I:%M %p%d %B %Y%Y-%m-%drc   )r
   r  r  localize
astimezone)r~   Ztime_struser_timezonefortune_timezoner   time_formatZ	date_part
input_dateZnew_date_formatZcombined_timer  r2   r2   r3   convert_time_to_user_timezone  s    


z0getFortuneTimeSlot.convert_time_to_user_timezonec           (         s  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }| j
jd}| j
jd}| j
jd}t|j}t |}	|	jdd d}	|stdd	itjdW S tjj|d
	 }
|
 stdditjdW S t|
jj}t|
j}ttjj||ddgdjddd}g }t|d  tddD ]} t |d }|!d}g }|D ]}|d |!dkrv|d rv|d d| "|d |||| "|d |||| "|d |||| "|d ||||d |d |d d	}|#| qv|#||d  qRt$d!| g }|D ]n}|d }|d" }|D ]P}|d sbqNd#D ]4}| d$}| d%}|| }|| }|rf|rft|d&}t|d&}||k rf|!d'}|!d(} d}!tt|d)}"t| d(!d(d* |"!d+ }#t|#d)|	k rd,}!|D ]:}$|$%d-\}%}&||%& kr ||&& k r d,}! q\q |#|| |!|d |d |d d. |t t'|d d/7 }qqfqNq4 fd0d1|D }'td2|'d3W S  ty } z"tdt|itj(dW  Y d }~S d }~0 0 d S )4Nr   r   r   rt  r#  r   r   )microsecondtzinfozfortune_teller is requiredrs  zFortune timing data not foundr  r  )rt  r  r  r  T)flatr     )daysz%A	is_activemorning_openingmorning_closingevening_openingevening_closing
chat_pricevideo_pricesession_time)	r#  r  r  r  r  r  r  r  r  )r   converted_slotsz%converted_slots_all_days------------0r  )ZmorningZeveningZ_opening_closingr  r  r  z%Y-%m-%d %H:%M:%Src   z%H:%M:%SFr  )TimeDateZ	Availabler  r  r  r  c                    s"   g | ]}|d    dkr|qS )r  r  )r  )r   slotr  r2   r3   r   Q  r   z*getFortuneTimeSlot.get.<locals>.<listcomp>r   r   ))r   r|   r   r(   r   r   rk   r7   rl   rm   r   ri  rg   pytzr  r  r  rG  rh   r  r   rt  r   r   slotsr   r6   values_listr
   r  r   r   r   r  r  r   r   r   stripr;   r}   )(r~   r   r   r   r   rt  r#  r   r  current_timer  r  ZtimedataZbooked_appointmentsZconverted_slots_all_daysZ
day_offsetZtarget_dateZtarget_date_strr  r  Zconverted_slotZ
open_slotsZday_datarf   	slot_typeZopening_keyZclosing_keyZopening_time_strZclosing_time_strZopening_timeZclosing_timer  Z	date_slotZslot_availableZcompare_timeZdate_time_strZbooked_appointmentbooked_start
booked_endZselected_date_slotsr2   r  r3   rg     s    .$










 
	&%zgetFortuneTimeSlot.getN)r   r   r   r  rg   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )AddUserCardc           
   
   C   sd  z zt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |jd}|stdditjdW S |jst |_|  |jr|j}tjt_tjj||d}|rtjj||d |d	 |d
 |d |d d}t|j}	td|	dW S  ty^ } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r  r  )sourcer   	exp_monthexp_yearcustomerZlast4)rY   r  r   r  r  last_digitsr   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   r   r  r)   r   STRIPE_SECRET_KEYr  r  Customercreate_sourcer  ro   SeerUserCardSerializerr}   )
r~   r   r   r   r   r  user_idZ
createCardZcardObjalldatar2   r2   r3   r   ~  s0    .,
zAddUserCard.postNr   r2   r2   r2   r3   r  }  s   r  c                   @   s   e Zd Zdd ZdS )GetUserCardc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S tjj|d}t|ddj}td|d	W S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )
Nr   r   r   r   r[   TrO  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   r  r  rf   r}   )r~   r   r   r   r   r  r	  r2   r2   r3   rg     s    .zGetUserCard.getNr   r2   r2   r2   r3   r
    s   r
  c                   @   s   e Zd Zdd ZdS )DeleteUserCardc              
   C   s6   zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |jd}|stdditjdW S tjj|d	 }|stdditjdW S tjt_tj|j|j |  tddiW S  ty0 } z"tdt|itjdW  Y d }~S d }~0 0 d S )	Nr   r   r   r   r  r  zNo card foundr   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   r  r   r  r  r  r  delete_sourcer  r  rL  r}   )r~   r   r   r   r   r  r  r2   r2   r3   r     s.    .zDeleteUserCard.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )
PayBookingc                 C   s   zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |jd}|stdditjdW S tjj|d	 }|stdditjdW S |jd}|stdd	itjdW S tjj||d
	 }|stdditjdW S d}	t|j|j|j|	}
|
d dkrtjjt ||t|j|
d d |
d d |
d d d |
d d dd	}d|_|  tddiW S td|
d itjdW S W n< ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r:   appointment_id is requiredr  r  r  r  r  falser   Trf   balance_transactionZreceipt_urlZpayment_method_detailsre   r   r  )	rE   rY   bookingrZ   txn_idrecipet_urlr  	charge_idr  r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   r6   r  r  r  r  r  rG   ro   rH   is_paidr)   r}   )r~   r   r   r   r   r:   appointment_objr  r  r  r  CustTransactionr2   r2   r3   r     s<    .J
zPayBooking.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )PayBookingWalletc           
   
   C   s  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |jd}|stdditjdW S tjj|d	 }|stdditjdW S tjj|d	 }|stdd	itjdW S t|jt|jkr2td
|j td|j tdditjdW S tjjt ||t|jddd}d|_|  t|jt|j }	|	|_|  tddiW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r:   r  r  r[   zNo wallet found for this user.appointmentr  z,You do not have sufficent balance in wallet.r  )rE   rY   r  rZ   r  r  Tr   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   r6   rr   r;   r  rZ   r   rG   ro   rH   r  r)   r}   )
r~   r   r   r   r   r:   r  Z
wallet_objr  Z
new_walletr2   r2   r3   r     s<    . 	zPayBookingWallet.postNr   r2   r2   r2   r3   r    s   r  c           !      C   s  g }i }|dkrJt jj|d}tjj|d}	tjj|d}
tjj|d}n8t jj|d}tjj|d}	tjj|d}
tjj|d	}|D ]}|j}|j}|j}|dkrt	jjd
|dj
| d}nt	jjd|dj
| d}|D ]<}|j}|j|vrt|j|d||j< q|||j d< qq|	D ]}|j}|j}|j}|dkrXt	jjd
|dj
| d}nt	jjd|dj
| d}|D ]>}|j}|j|vrt|j|d||j< n|||j d< qtq|
D ]}|j}|j}|j}|dkrt	jjd
|dj
| d}nt	jjd|dj
| d}|D ]>}|j}|j|vr@t|j|d||j< n|||j d< qq|D ]}|j}|j}|j}|dkrt	jjd
|dj
| d}nt	jjd|dj
| d}|D ]>}|j}|j|vrt|j|d||j< n|||j d< qqZ| D ] \}}d}d}d|v r*d}d}d}d} nd}d}d}d} d|v rd||d | 7 }||d | 7 }d|v r||d | 7 }||d | 7 }d|v r||d |  7 }||d |  7 }d|v r||d | 7 }||d | 7 }||d< ||d< || q|S ) NMale)male_horoscope)male_chinese_zodiac)male_element_name)male_mbti_name)female_horoscope)female_chinese_zodiac)female_element_name)female_mbti_nameFemale)seer_user__genderZhoroscope__horoscopeseer_user_id)r   horoscope_compatibility_scorer'  )r$  Zchinese_zodiac__chinese_zodiac)r   "chinese_zodiac_compatibility_scorer(  )r$  Zfive_element__element_name)r   !five_elements_compatibility_scorer)  )r$  Zmbti__mbti_name)r   mbti_compatibility_scorer*  r         ?g333333?皙?g333333?g?Zaverage_compatibility_scorecompatibility_percentage)CompatibilityHoroscoper7   rl   CompatibilityChineseZodiacCompatibilityFiveElementsCompatibilityMBTIr  r  compatibility_scorer  r  rY   r   r   rf   r  r   r  r!  r  r"  itemsr   )!r   login_user_genderlogin_user_horoscopelogin_user_chinese_zodiaclogin_user_element_namelogin_user_mbti_nameZcompatibility_scorescompatibility_dataZhoroscope_compatibilityZchinese_zodiac_compatibilityZfive_elements_compatibilityZmbti_compatibilitycompatibilityr  r  r2  Zmatching_usersZ
user_signsr   r  r   r  r!  r  r"  r  rf   Zcompatibility_score_totalZcompatibility_percentage_totalZmbti_weightZhoroscope_weightZchinese_zodiac_weightZelement_weightr2   r2   r3   get_compatibility_scores$	  s    







r;  c                   @   s   e Zd Zdd ZdS )	MyMatchesc              
   C   sF  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S tjj|d	 }|stdditj
dW S |jj}|jj}|jj}|jr|jj}	nd }	|jj}
t||
||||	}dd |D }td	|d
W S  ty@ } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r%  z#Sign details not found for the userc                 S   s   g | ]}|d  dkr|qS )r-  F   r2   )r   r:  r2   r2   r3   r   	  r   z!MyMatches.get.<locals>.<listcomp>r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   r  r  r  r  r  r3  r2  rY   r  r;  r}   )r~   r   r   r   r   Zlogin_user_signsr5  r6  r7  r8  r4  r9  Zfiltered_compatibility_datar2   r2   r3   rg   	  s.    .
zMyMatches.getNr   r2   r2   r2   r3   r<  	  s   r<  c                   @   s   e Zd Zdd ZdS )SeerUserProfileDetailc           	   
   C   s,  zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S |j}|d}|stdditjdW S tjj|d	 }|stdditj
dW S t|d|jidj}td	|d
W S  ty& } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r   zseer user id is requiredr&  rr  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   ri  rg   rh   ZSeerUserCompatibilitySerializerr   rf   r}   )	r~   r   r   r   rY   rf   Zmatching_user_userZmatching_user_objr   r2   r2   r3   rg   	  s&    .
zSeerUserProfileDetail.getNr   r2   r2   r2   r3   r>  	  s   r>  c                   @   s   e Zd Zdd ZdS )RatingReviewFrotunetellerc              
   C   s  z~zt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |jd}|stdditj
dW S tjj|d	 }|stdditj
dW S |jd}|stdd	itj
dW S |jd
}|stdditj
dW S tjj||||d tjj|d }	dd tjj|dD }
t|
}t|t|	 }||_|  tddiW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   ry  zfortune_teller_id is requiredzNo fortune teller foundrating_datazrating_data is requiredrw  zreview_data is required)rY   rt  ratingreviewrs  c                 S   s   g | ]}t |jqS r2   )floatrA  )r   rt  r2   r2   r3   r   m
  r   z2RatingReviewFrotuneteller.post.<locals>.<listcomp>r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rl  ru  ro   r   sumrC  rA  r)   r}   )r~   r   r   r   r   ry  r  r@  rw  total_countZ
all_ratingZfinal_ratingZaverager2   r2   r3   r   T
  s<    .zRatingReviewFrotuneteller.postNr   r2   r2   r2   r3   r?  S
  s   r?  c                   @   s   e Zd Zdd ZdS )referAFriendc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S |j}td|dW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r   )r   rW   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rW   r}   )r~   r   r   r   r   Zmy_refer_coder2   r2   r3   rg   y
  s    .zreferAFriend.getNr   r2   r2   r2   r3   rF  x
  s   rF  c                   @   s   e Zd Zdd ZdS )SeerUserInMyContactc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 |j}|dg }tdt	| t
jjt	|d}t|ddj}td|dW S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )	Nr   r   contact_numbers)Zphone_number__inTrO  r   r   )r   r|   r   r(   r   r   rf   rg   r   r   rk   r7   rl   r   r}   )r~   r   r   r   rf   rH  Z
seer_users	user_datar2   r2   r3   r   
  s    .zSeerUserInMyContact.postNr   r2   r2   r2   r3   rG  
  s   rG  c                   @   s   e Zd Zdd ZdS )	AddFriendc              
   C   s6  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}|d}|stdditjdW S ztjj|d}W n( tjy   tdditj
d Y W S 0 tjj||d	 }|stjj||d	d
}|jr|j}	ttj}
|jdkr\dd|jd |j d d}t|
dj|	|d}|jdkrd}|jd |j d }dd|jd |j d d}t|
dj|	|||d}tjj|jd |j d d|d tddiW S tddiW S W n< ty0 } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   	friend_idzfriend_id is requiredzUser not found)	from_userto_userF)rL  rM  acceptedr  Zfriend_request_receivedNEW FRIEND REQUEST RECEIVEDrc    sent you a friend request.r  r  r  r  )rO  r  r]   r   zRequest already sent)r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   DoesNotExistFriendRequestro   r  r   r   r  r   rJ   rK   r   r  rt   r}   )r~   r   r   r   r   rf   rK  friendfriendship_requestr  r  r  r  r  r  r2   r2   r3   r   
  sV    .

"zAddFriend.postNr   r2   r2   r2   r3   rJ  
  s   rJ  c                   @   s   e Zd Zdd ZdS )AcceptRejectRequestc              
   C   sx  z4zt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}|d}|d}|stdditjdW S |stdditjdW S ztjj|d	d
}W n* tjy    tdditj
d Y W S 0 |dkr d|_|  |jjr|jj}	ttj}
|jjdkrtdd|jd |j d d}t|
dj|	|d}|jjdkrd}|jd |j d }dd|jd |j d d}t|
dj|	|||d}tjj|jd |j d d|jd tddiW S |dkr |  tddiW S tdditjdW S W n< tyr } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   
request_idr   request_id is requiredzstatus is requiredFr   rN  0Friendship request not found or already acceptedr  Tr  Zfriend_request_acceptedREQUEST ACCEPTEDrc   z accepted your friend request.r  r  r  r  )rZ  rP  r  r]   zFriend request acceptedZDeclinedzFriend request rejectedz&Status type must be Accepted/Declined ) r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   rR  rQ  rN  r)   rL  r  r   r   r  r   rJ   rK   r   r  rt   ro   rL  r}   )r~   r   r   r   r   rf   rV  Zstatus_typerT  r  r  r  r  r  r  r2   r2   r3   r   
  sb    .




$
zAcceptRejectRequest.postNr   r2   r2   r2   r3   rU  
  s   rU  c                   @   s   e Zd Zdd ZdS )SentRequestsListc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S tjj|dd}t|ddj}td	|d
W S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   F)rL  rN  TrO  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rR  ZSentFriendListSerializerrf   r}   )r~   r   r   r   r   rT  r   r2   r2   r3   rg     s    .zSentRequestsList.getNr   r2   r2   r2   r3   r[    s   r[  c                   @   s   e Zd Zdd ZdS )ReceivedRequestsListc              
   C   s   zzt |}W n< tyJ } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|svtdditj
dW S tjj|dd}t|ddj}td	|d
W S  ty } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   F)rM  rN  TrO  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rR  ZReceivedFriendListSerializerrf   r}   )r~   r   r   r   r   Zreceived_friendlistr   r2   r2   r3   rg   &  s    .zReceivedRequestsList.getNr   r2   r2   r2   r3   r\  %  s   r\  c                   @   s   e Zd Zdd ZdS )
FriendListc           
   
   C   s   zt |}W n: tyF } z"tdt|itjdW  Y d }~S d }~0 0 tjj|d	 }|sptdditj
dS tjtj|dtj|dB tjdd@ d	d
}g }|D ]$}|j|kr|jn|j}|| qt|ddj}	td|	dS )Nr   r   r   r   )rL  )rM  T)rN  rL  rM  rO  r   r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rR  modelsr   select_relatedrL  rM  r   SeerUserFriendSerializerrf   )
r~   r   r   r   r   ZfriendsZfriend_listrS  Zfriend_userr   r2   r2   r3   rg   8  s$    ,"zFriendList.getNr   r2   r2   r2   r3   r]  7  s   r]  c                   @   s   e Zd Zdd ZdS )SearchFriendc           	   
   C   s<   zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}|d}|stdditjdW S tjjt|dt|dB t|d	B d
dj|jd}t|d
d|idj}td|j|dW S  ty6 } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   searchzsearch is required)phone_number__icontains)first_name__icontains)email__icontainsTr   Z
login_userrd  r   )r   r   rf   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   ri  rg   rh   r   r  r   r`  rf   r}   )	r~   r   r   r   r   rf   rb  Zsearch_friendrI  r2   r2   r3   rg   R  s"    .
4zSearchFriend.getNr   r2   r2   r2   r3   ra  Q  s   ra  c                   @   s   e Zd Zdd ZdS )CancelSentRequestc              
   C   s4   zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}|d}|stdditjdW S ztjj|dd}W n( tjy   tdd	itj
d Y W S 0 |  tdd
iW S  ty. } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   rV  rW  FrX  rY  zFriend request cancel)r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   rR  rQ  rL  r}   )r~   r   r   r   r   rf   rV  rT  r2   r2   r3   r   l  s(    .
zCancelSentRequest.postNr   r2   r2   r2   r3   rf  k  s   rf  c                   @   s   e Zd Zdd ZdS )AppointmentReminderMessagec              
   C   s6  zt  }|d}t }|d}tjjdd}|D ]}|j|kr8|j	}|
dd }	t |	d}
t |d}|
| }|tddkr8tjjd	|jj d
|j	 d|jj dt|jjd}tjjd	|jj d|j	 dt|jjd}q8tddiW S  ty0 } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr  %d %b %Yr  appointment_statusr  r   r   hourszHello z!,
 Your today appointment timing z with z= fortune teller, Please join on time.
 Thank you 
 Seer Team.)bodyfrom_r   z,
 You have an appointment at z=. Please be prepared for the session.
 Thank you 
 Seer Team.r   r   r   )r
   r  r  r   todayr6   r7   rl   r  r  r   r  r   clientr   ro   rY   rJ   rt  from_mobile_numberr   r   r|   r(   r   r}   )r~   r   r  r  ro  
today_dater  appointappoint_timenew_timeappointment_datetimecurrent_datetimetime_differencer   r   r2   r2   r3   rg     s6    


 zAppointmentReminderMessage.getNr   r2   r2   r2   r3   rg    s   rg  c                   @   s   e Zd Zdd ZdS )*AppointmentReminderMessagePushNotificationc              
   C   sd  z t  }|d}t }|d}tjjdd}|D ]}|j|kr:|j	}|
dd }	t |	d}
t |d}|
| }|tddkr:|jj}ttj}|jjd	krd
dd|jj d |j	 d |jj d d}t|dj||d}|jjdkr\d}|jjd |jj d }d
dd|jj d |j	 d |jj d d}t|dj||||d}|jj}ttj}|jjd	krd
dd|jj d |j	 d d}t|dj||d}|jjdkr:d}|jjd |jj d }d
dd|jj d |j	 d d}t|dj||||d}q:tddiW S  ty^ } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr  rh  r  ri  r  r   r   rk  r  appointment_reminderAPPOINTMENT REMINDERZHelloz ,
 Your today appointment timingwithz<fortune teller, Please join on time.
 Thank you 
 Seer Team.r  r  r  r  r{  rc    its your appointment reminder.r  z,
 You have an appointment atz;Please be prepared for the session.
 Thank you 
 Seer Team.r   r   r   )r
   r  r  r   ro  r6   r7   rl   r  r  r   r  r   rY   r   r(   r   r  r   rJ   rt  r   r  rK   r   r|   r   r}   )r~   r   r  r  ro  rr  r  rs  rt  ru  rv  rw  rx  seer_user_registration_idr  r  r  r  r  Zfortune_teller_registration_idr   r2   r2   r3   rg     sl    




$$
z.AppointmentReminderMessagePushNotification.getNr   r2   r2   r2   r3   ry    s   ry  c                   @   s   e Zd Zdd ZdS )dummyNotificationc              
   C   sH  zzt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}ttj}|jdkrdddd	}t|d
j||d}|jdk rd}	|jd |j d }
dddd	}t|d
j||	|
|d}tddiW S  tyB } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r   r  rz  r{  zHello seer_user_obj.first_name Your today appointment timing 7:79 with Rahul fortune teller, Please join on time.
 Thank you 
 Seer Team.r  r  r  r  r}  rc   r~  r  r   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   r   r   r  r   r   r  rJ   rK   r}   )r~   r   r   r   r   r  r  r  r  r  r  r2   r2   r3   r     s:    .

zdummyNotification.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )CancelAppointmentc              
   C   sd  z zt |}W n< tyL } z$tdt|itjdW  Y d }~W S d }~0 0 tjj|d	 }|sxtdditj
dW S |j}|d}|stdditjdW S |jd}|stdditjdW S tjj|d	 }|stdd	itj
dW S |j}	|j}
ttj|	d
\}}t|
d | d}t }||  }|d }d}|dkrXd}d}n<|dkrld}d}n(|dkrd}d}ntdditjdW S ||_d|_|j}|| }|jdkrtjj|d	 }|jstjj|||d d|_|   n d|_tjj|||d |   tddiW S  ty^ } z"tdt|itj!dW  Y d }~S d }~0 0 d S )Nr   r   r   r   r   zappointment id is requiredcancellation_reasonzCancellation reason is requiredzAppointment not foundr  rc   z%d %B %Y %I:%M %pi  r      g?
      r+  2   r   r,  Z   zSSorry, you cannot cancel this appointment. It is too close to the appointment time.r   r  )r  )r  refund_amountcancellation_chargesZCanceledr   )"r   r|   r   r(   r   r   rk   r7   rl   rm   r   rf   rg   rh   r6   r  r  r  r  r   r
   r  r  total_secondsr  cancelled_byr  rj  rG   r  AdminRefundRequestro   r)   r}   )r~   r   r   r   r   rf   r:   r  r  r  r  r  r  Zappointment_datetime_startr  rx  Zdifference_hoursr  Zrefund_percentagetotal_amountr  Ztransaction_objr2   r2   r3   r   <  sh    .




zCancelAppointment.postNr   r2   r2   r2   r3   r  ;  s   r  c                   @   s   e Zd Zdd ZdS )DeleteUserAccountViewc              
   C   s   zt |}W n: tyF } z"tdt|itjdW  Y d }~S d }~0 0 tjj|d	 }|sptdditj
dS |}|d u rtdditj
dS ztjj|d}W n& |jy   tdditj
d Y S 0 d|_|  tddiddS )	Nr   r   r   r   zuser_id is requiredTzUser deleted successfully   )r   r|   r   r(   r   r   rk   r7   rl   rm   r   rg   rQ  r   r)   )r~   r   r   r   r   r  r   r2   r2   r3   destroy|  s"    ,zDeleteUserAccountView.destroyN)r   r   r   r  r2   r2   r2   r3   r  {  s   r  )rL   r   django.shortcutsr   rest_framework.viewsr   rest_framework.responser   rest_frameworkr   r^  	functionsr   r
   r   r   django.confr   django.contrib.authr   django.contrib.auth.modelsr   Zrest_framework_simplejwt.tokensr   Zpasslib.hashr   ri   django.template.loaderr   django.corer   django.core.mailr   mathr  r   django.contribr   r   r   Zadmin_panel.modelsr   Zrest_framework.authenticationr   Zjwtauthenticationr   django.core.files.storager   r#   Zadmin_panel.common_functionsserializersZadmin_panel.serializersr   r   Zfortune_teller.modelsZfortune_teller.serializersr   rE  django.db.modelsr   r  pyfcmr   Ztwilio.restr   r    TWILIO_ACCOUNT_SIDZaccount_sidTWILIO_AUTH_TOKENZ
auth_tokenrp  TWILIO_MOBILE_NUMBERrq  r4   r@   rF   rH   rI   r   r   r   r   r   r   r   r   r   r   r   r   r'  r,  r-  r9  r?  r@  rK  rM  rT  rZ  r]  r^  rp  rx  r  r  r  r  r  r  r  r  r  r  r  r  django.utilsr  r  r  r
  r  r  r  r;  r<  r>  r?  rF  rG  rJ  rU  r[  r\  r]  ra  rf  rg  ry  r  r  DestroyAPIViewr  r2   r2   r2   r3   <module>   s    
AD%!- ! laM>"

	',`l9   9 -!-. 'j%:?"T?@