a
    ee!                    @   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 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+T d dl,m-Z- d dl.Z.d dl/T d dl0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<Z<d dlm=Z= d dl>m?Z? ej@ZAejBZCe?eAeCZDejEZFdd ZGdd  ZHd!d" ZId#d$ ZJdd&d'ZKG d(d) d)eZLG d*d+ d+eZMG d,d- d-eZNG d.d/ d/eZOG d0d1 d1eZPG d2d3 d3eZQG d4d5 d5eZRG d6d7 d7eZSG d8d9 d9eZTG d:d; d;eZUG d<d= d=eZVG d>d? d?eZWG d@dA dAeZXdBdC ZYG dDdE dEeZZG dFdG dGeZ[G dHdI dIeZ\G dJdK dKeZ]G dLdM dMeZ^G dNdO dOeZ_G dPdQ dQeZ`G dRdS dSeZaG dTdU dUeZbG dVdW dWeZcG dXdY dYeZdG dZd[ d[eZeG d\d] d]eZfG d^d_ d_eZgG d`da daeZhG dbdc dceZiG ddde deeZjG dfdg dgeZkG dhdi dieZlG djdk dkeZmG dldm dmeZnG dndo doeZoG dpdq dqeZpG drds dseZqG dtdu dueZrG dvdw dweZsG dxdy dyeZtG dzd{ d{eZuG d|d} d}eZvG d~d de=jwZxdS )    )message)render)APIView)Responsestatus   )*N)datetime	timedelta)settings)authenticate)User)RefreshToken)django_pbkdf2_sha256)render_to_string)mail)EmailMultiAlternatives)messages)forms)authenticated)FileSystemStorage)TransferToConnectedAccount)SeerUserSerializerFortunerTellerReviewSerializer)ContentSerializerFAQSerializer)FCMNotification)TemplateView)generics)Clientc                 C   sV   d}t |d}d}tj| jd }t }t|t| }||| }t|d | S )Nzmedia/fortuneteller_profile)locationz/media/fortuneteller_profiler   /)r   ospathsplitextnamerandomStringFunctionForImagestrsave)imagefullPathfs	fullPath2filetypetheNametheImageNamefilename r2   4/var/www/html/Ryun_Seer/seer/fortune_teller/views.pyuploadTheProfile,   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 NTRANS000001   r   TRANS)FortuneTellerTranscationsobjectsalllasttranscation_idintr(   zfilllastObjtheIdr2   r2   r3   generateTranscationsIdFortune9   s    
rC   c                  C   s`   t j  } | rX| jsdS | j}|dd  }t|d }t|}|d}dt| S dS d S r5   )SeerUserTranscationr:   r;   r<   r=   r>   r(   r?   r@   r2   r2   r3   generateTranscationsIdH   s    
rE   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PAYOUT000001   r   ZPAYOUT)FortunePayoutTranscationr:   r;   r<   r=   r>   r(   r?   r@   r2   r2   r3   generatePayoutTranscationsIdW   s    
rH      c                    s6   t jt j t j  d fddt| D }d| S )N c                 3   s   | ]}t  V  qd S )N)randomchoice).0_
charactersr2   r3   	<genexpr>h       z)generate_referral_code.<locals>.<genexpr>ZFORTUNE)stringascii_uppercaseascii_lowercasedigitsjoinrange)lengthreferral_coder2   rO   r3   generate_referral_codef   s    r[   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r_   The email is already registered)referal_codezInvalid referal code)r]   r^   r_   ra   r`   rj   fortune_telleramountrl   z1You have received your referal bonus successfullyreferal_bonusr   notification_typerl   z#/fortune_teller/email-verify?token=zVerify Accountzemail_verifcation.htmllinkhtml_message z8 fortune teller has been succesfully registered with us.Zfortune_teller_registerr   typezGYou have been successfully registered with us.Please verify your email.)$datagetr   r   HTTP_400_BAD_REQUESThandlerhashFortuneTellerr:   filterfirstHTTP_409_CONFLICTcreater[   GeneralSettingsr;   FotuneTellerWalletrefer_friend_offr>   rm   r)   FortuneTellerNotificationsr   for_useraccess_tokenr(   r   BASE_URLemail_verification_linkr   EMAIL_HOST_USERr   	send_mailAdminNotifications	ExceptionHTTP_500_INTERNAL_SERVER_ERROR)selfrequestrx   r]   r^   r_   r`   ra   rb   new_passwordfortune_teller_obj
check_codero   check_wallet
new_amountverify_tokentokenverify_linkcomplete_linksubjectrt   plain_message
from_emailtoer2   r2   r3   postl   sn    









zRegister.postN__name__
__module____qualname__r   r2   r2   r2   r3   r\   k   s   r\   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|
}t |
_|
  |
j|
j|
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_idr_   r]   r^   	social_iddevice_type	fcm_tokenr   z$Provider and social_id are required.r   rd   re   rc   zdevice_type is requiredzfcm_token is required)r   r   AThis account has been deleted.For more information contact admin.)r]   r^   r   r   r_   r   r   rj   
idr]   r^   r_   ra   is_profile_completedis_stripe_account_connectis_stripe_verifiedrefreshaccessSuccessr   rx   )rx   ry   r   r   rz   r}   r:   r~   r   account_deletedr   r[   r   r   r
   nowlast_activityr)   r   r]   r^   r_   ra   r   r   r   r(   r   r   r   )r   r   rx   r   r_   r]   r^   r   r   r   r   refresh_tokenallDatar   r2   r2   r3   r      s^    








zSocialLogin.postNr   r2   r2   r2   r3   r      s   r   c                   @   s   e Zd Zdd ZdS )LoginMobilec              
   C   s@   z|j }|d}|d}|d}|d}tddd}|sXtdd	itjd
W S |spt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}	||	_||	_||	_t |	_|	  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'  r7   r   country_code is requiredr   phone_number is required)r   r   r   )r   rj   otpr   r   )rx   ry   rK   	randranger   r   rz   r}   r:   r~   r   r   r   r[   r   r   r   r
   r   r   r)   r   r(   r   )r   r   rx   r   r   r   r   the_otpmobile_numberr   userDatar   r2   r2   r3   r     s8    





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   )r   Tzemail_verification_success.htmlzemail_verfication_failed.html)
GETry   r}   r:   r~   r   email_verifiedr)   r   r   )r   r   r   fortune_Objr   r2   r2   r3   ry   0  s    zemailVerification.getNr   r   r   ry   r2   r2   r2   r3   r   /  s   r   c                   @   s   e Zd Zdd ZdS )OtpVerificationc                 C   sV  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|j|jt|	t|	jd
}
td|
dW S  tyP } 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   )rx   ry   r   r   rz   r}   r:   r   r   r   r   r]   r^   r_   ra   r   r   r   r(   r   r   )r   r   rx   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
 }|jdkrtdditjdW S |stdditjdW S |j}	t||	}
|jdkrtdditjdW S |
r||_||_t |_|  t|}|j|j|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 )Nr_   r`   r   r   r   rc   r   rf   rh   r   z:This email does not exist in our database, please registerT)r_   r   end_date__isnullr   r   z=Your account has not been activated, Please contact to admin.FzPlease verify your email firstr   zLogin Successfullyr   zInvalid password)%rx   ry   r   r   rz   r}   r:   r~   countHTTP_404_NOT_FOUNDr   r   HTTP_401_UNAUTHORIZEDr`   r{   verifyr   r   r   r
   r   r   r)   r   r   r   r]   r^   r_   ra   r   r   r   r(   r   r   r   )r   r   rx   r_   r`   r   r   user
fortuneObjcheck_passwordcheckr   r   r   r2   r2   r3   r   _  sV    






zLoginUser.postNr   r2   r2   r2   r3   r   ^  s   r   c                   @   s   e Zd Zdd ZdS )FortuneTellerForgetPasswordc              
   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 )Nr_   r   zEmail is requiredrh   r   zPThis email does not exist in our database, please enter the valid email address.r   rJ   c                 S   s   g | ]}t tjtj qS r2   )rK   rL   rS   ascii_lettersrV   )rM   nr2   r2   r3   
<listcomp>  rR   z4FortuneTellerForgetPassword.post.<locals>.<listcomp>   z/fortune_teller/forgot/r"   zForgot Passwordzforget_password_email.htmlrr   rs   z8Reset password link has been sent to this email address.zEmail not exists)rx   ry   r   r}   r:   r~   r   r   r   r   rW   rX   r(   r_   r   r   forgot_password_linkr)   r   r   r   r   r   printr   )r   r   rx   r_   r   r   ran_numbaselinkcompletelinkr   rt   r   r   r   r   r2   r2   r3   r     s4    
z FortuneTellerForgetPassword.postNr   r2   r2   r2   r3   r     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"   rh   
LinkExpirylink-expire.html)r_   r   TFforgot.htmlvalid)
r(   r   r$   splitr}   r:   r~   r   r   r   )r   r   rr   
user_emaillink_expiryfortune_objr   r2   r2   r3   ry     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"   rh   r   zChanged successfullyzpassword_success.htmlr   form)r   forgetverificationPOSTis_validcleaned_datary   r(   r   r$   r   r{   r|   r}   r:   r~   r   r`   r   r)   r   successr   )	r   r   r   r   r   rr   r   encrypt_passwordr   r2   r2   r3   r     s    
zforgetPasswordVerification.postNr   r   r   ry   r   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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   user not foundrn   Tmanyr   )r   rx   reviews)r   r   r   r(   r   r   r}   r:   r~   r   r   FortuneTellerSerializerrx   FortunetellerRatingReviewsr   r   )r   r   uidr   r   r   
review_objreview_datar2   r2   r3   ry     s    .
zgetProfile.getNr   r2   r2   r2   r3   r     s   r   c                   @   s   e Zd Zdd ZdS )getServicesc              
   C   sn   z.t jjddd}t|dd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 NT)r   r   r   r   r   r   r   )
Servicer:   r~   ServiceSerializerrx   r   r   r(   r   r   )r   r   servicesserialized_servicesr   r2   r2   r3   ry     s    zgetServices.getNr   r2   r2   r2   r3   r     s   r   c                   @   s   e Zd Zdd ZdS )	getSkillsc              
   C   sn   z.t jjddd}t|dd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 r   )
Skillr:   r~   SkillSerializerrx   r   r   r(   r   r   )r   r   skillsZserialized_skillsr   r2   r2   r3   ry     s    zgetSkills.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )FortuneTellerCompleteProfilec              
   C   s  zFz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}tjj|
dj|jd	 }|r6tdditjdW S |sPtdditjdW S |sjt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 |s:tdditjdW S |sTt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$|_&||_'||_(|r4t)|}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   Fortune teller not foundr   r  r]   r^   r_   genderra   total_experiencebio	languagesr*   bank_detailstimezonerh   ri   services is requiredskills is requiredrc   zgender is requiredrd   re   rg   total_experience is requiredbio is requiredlanguages is requiredztimezone is required-)	horoscope)chinese_zodiac)element_name)rl   r  r  five_elementTr   )-r   r   r   r(   r   r   r}   r:   r~   r   r   rx   ry   excluder   r   rz   mapr>   r   get_astrological_signget_chinese_zodiacget_five_element	HoroscopeChineseZodiacFiveElementsFortuneTellerSignDetailr   r]   r^   ra   r_   r  r   r  r  r	  r
  r   r  r  r4   r*   r)   r   )r   r   r   r   rl   rx   r   r  r]   r^   r_   r  ra   r  r	  r
  r*   r  r  r   yearmonthdayr  zodiacelementhoroscope_objchinese_objelements_objsign_detailfileUrlr2   r2   r3   r     s    .















z!FortuneTellerCompleteProfile.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )FortuneTellerEditProfilec              
   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	}
|d
}|d}|d}|d}td| | stdditjdW S |stdditjdW S |s0tdditjdW S |	sJtdditjdW S |
sdt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 ||_|	|_||_||_|
|_||_||_||_|r||_|  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^   r  r	  r
  r*   r  zimage============r  r  rd   re   r  r  r  r   )r   r   r   r(   r   r   r}   r:   r~   r   r   rx   ry   r   rz   r]   r^   r   r  r  r	  r
  r  r*   r)   r   )r   r   r   r   rl   rx   r   r  r]   r^   r  r	  r
  r*   r  r2   r2   r3   r   Z  s^    .









zFortuneTellerEditProfile.postNr   r2   r2   r2   r3   r*  Y  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   rn   )mbtir   zYou are (z) type!r   )r   r   r   r(   r   r   r}   r:   r~   r   r   rx   ry   r   rz   r/  evalMBTIr  updatetagliner   )r   r   r   r   rl   r1  first_pair_mbtir2  second_pair_mbtir3  third_pair_mbtir4  fourth_pair_mbticreated_mbti
fetch_mbtir2   r2   r3   r     sD    .



 zAddMbti.postNr   r2   r2   r2   r3   r0    s   r0  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|}	||	 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  imagesr   r   )r   r   r   r(   r   r   r}   r:   r~   r   r   rx   getlistr4   appendr   )
r   r   r   r   rl   rx   rC  
image_urlsr*   
image_pathr2   r2   r3   r     s"    .
zUploadImages.postNr   r2   r2   r2   r3   rB    s   rB  c                   @   s   e Zd Zdd ZdS )FortuneTellerDeleteAccountc              
   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  ru   z* fortune teller has deleted their account.Zfortune_teller_delete_accountrv   zAccount deleted successfully)r   r   r   r(   r   r   r}   r:   r~   r   r   deleter   r   r]   r^   r   )r   r   r   r   rl   r2   r2   r3   ry     s    . zFortuneTellerDeleteAccount.getNr   r2   r2   r2   r3   rH    s   rH  c                   @   s   e Zd Zdd ZdS )GetFortunetellerFaqc              
   C   st   z4t jjdddd}t|ddj}td|dW S  tyn } z"tdt|it	j
d	W  Y d }~S d }~0 0 d S )
NTZFortuneteller)r   rw   -idr   r   r   r   r   )Faqr:   r~   order_byr   rx   r   r   r(   r   r   )r   r   faq_objall_datar   r2   r2   r3   ry     s    zGetFortunetellerFaq.getNr   r2   r2   r2   r3   rJ    s   rJ  c                   @   s   e Zd Zdd ZdS )GetFortunetellerBlogc              
   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 )NBlog)	page_typer   r   r   r   ContentManagementr:   r~   r   r   rx   r   r   r(   r   r   r   r   content_objr   r   r2   r2   r3   ry     s    
zGetFortunetellerBlog.getNr   r2   r2   r2   r3   rP    s   rP  c                   @   s   e Zd Zdd ZdS )GetFortunetellerPrivacyPolicyc              
   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 PolicyfortunetellerrR  	user_typer   r   r   r   rS  rU  r2   r2   r3   ry     s    
z!GetFortunetellerPrivacyPolicy.getNr   r2   r2   r2   r3   rW    s   rW  c                   @   s   e Zd Zdd ZdS )GetFortunetellerTermsc              
   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 & conditionsrX  rY  r   r   r   r   rS  rU  r2   r2   r3   ry   !  s    
zGetFortunetellerTerms.getNr   r2   r2   r2   r3   r[     s   r[  c                   @   s   e Zd Zdd ZdS )ResetPasswordc           
   
   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}|d}|stdditjdW S |stdditjdW S |j}t||}	t|}|	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  old_passwordr   zold_password is requiredznew_password is requiredr   zThe old password is incorrect)r   r   r   r(   r   r   r}   r:   r~   r   r   rx   ry   rz   r`   r{   r   r|   r)   HTTP_403_FORBIDDENr   )
r   r   r   r   rl   rx   r]  r   r   r   r2   r2   r3   r   +  s2    .


zResetPassword.postNr   r2   r2   r2   r3   r\  *  s   r\  c                   @   s   e Zd Zdd ZdS )NotificationSettingsc              
   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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   notification_statusznotification_status is requiredr   )r   r   r   r(   r   r   r}   r:   r~   r   r   rx   ry   rz   r`  r)   r   )r   r   r   r   rl   rx   r`  r2   r2   r3   r   K  s"    .
zNotificationSettings.postNr   r2   r2   r2   r3   r_  J  s   r_  c                   @   s   e Zd Zdd ZdS )FortunetellerHelpSupportc              
   C   sB   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
}|d}|d}|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 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   titler   ztitle is requiredzmessage is required)rb  r   rl   ru   z, fortune teller requested a help & support .Zfortune_teller_help_supportrv   zMYour request has been submitted successfully. We will revert you back sortly.)r   r   r   r(   r   r   r}   r:   r~   r   rx   ry   r   rz   HelpSupportr   r   r]   r^   r   )r   r   r   r   rl   rx   rb  r   r2   r2   r3   r   b  s(    .

 zFortunetellerHelpSupport.postNr   r2   r2   r2   r3   ra  a  s   ra  c                   @   s   e Zd Zdd ZdS )GetFortunetellerNotificationsc              
   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)rl   r   rK  r   r   r   )r   r   r   r(   r   r   r}   r:   r~   r   r   r   rM  FortuneNotificationSerializerrx   r   )r   r   r   r   rl   notification_objrO  r2   r2   r3   ry   |  s    .z!GetFortunetellerNotifications.getNr   r2   r2   r2   r3   rd  {  s   rd  c                   @   s   e Zd Zdd ZdS )DeleteFortuneNotificationsc              
   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   zid is required)end_dater   )r   r   r   r(   r   r   r}   r:   r~   r   rx   ry   rz   r   r:  r
   r   r   )r   r   r   r   rl   notification_idr2   r2   r3   r     s    .zDeleteFortuneNotifications.postNr   r2   r2   r2   r3   rg    s   rg  c                   @   s   e Zd Zdd Zdd ZdS )FortunetellerTimeSlotsc              
   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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   rn   r   r   )r   r   r   r(   r   r   r}   r:   r~   r   FortuneTellerTimingFortuneTimingSerializerrx   r   )r   r   r   r   rl   fortune_teller_timeZserialize_timer2   r2   r3   ry     s    .
zFortunetellerTimeSlots.getc              
   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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   slotszslots is requiredrn   r   )r   r   r   r(   r   r   r}   r:   r~   r   rx   ry   rz   rk  r   rn  r)   r   )r   r   r   r   rl   rx   rn  rm  r2   r2   r3   r     s$    .
zFortunetellerTimeSlots.postNr   r2   r2   r2   r3   rj    s   rj  c                   @   s   e Zd Zdd ZdS )AppointmentRequestListc              
   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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  PendingT)rl   appointment_statusis_paidrK  r   r   r   )r   r   r   r(   r   r   r}   r:   r~   r   r   FortuneAppointmentBookrM   AppointmentRequestListSerializerrx   r   )r   r   r   r   rl   appoint_objserialize_datar2   r2   r3   ry     s    .zAppointmentRequestList.getNr   r2   r2   r2   r3   ro    s   ro  c                   @   s   e Zd Zdd ZdS )AppointmentDetailsc              
   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 tjj||dd	 }|stdditjdW S t|j}tjj|jjd	 }	|	stdd	itjdW S t|	j}
|
|d
}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   appointment_idappointment id is requiredrp  )rl   r   rq  Appointment not foundr   )	user_dataappointment_datar   r   )r   r   r   r(   r   r   r}   r:   r~   r   query_paramsry   rz   rs  r   rt  rx   SeerUser	seer_userr   r   r   )r   r   r   r   rl   rx   rx  ru  r|  seer_user_objr{  Zcombined_datar2   r2   r3   ry     s0    .


zAppointmentDetails.getNr   r2   r2   r2   r3   rw    s   rw  c                   @   s   e Zd Zdd ZdS )AcceptOrDeclineAppointmentc              
   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}|d}|stdditjdW S |stdditjdW S |dks|d	kr |dkr tjj||d
	 }|stdditjdW S ||_|  tjj|d	 }	|	jr0tjt_tj|	j tjj|jjd	 }
tjjd|j d d|
d |
jr|
j }ttj!}|
j"dkrddd|j d d}t#|dj$||d}|
j"dkrd}d|j d }ddd|j d d}t#|dj$||||d}n|j
d}|s&tdditjdW S tjj||d
	 }|sTtdditjdW S tjj|jjd	 }
||_||_%d|_&|  tjj|d	 }	|	jst'jj||j(dd tjjd|j d d|
d |
jrh|
j }ttj!}|
j"dkrddd|j d d}t#|dj$||d}|
j"dkrhd}d|j d }ddd|j d d}t#|dj$||||d}d }t)d!|j|j*j+d" |j*j, |j-j.|j(|d#}|}tj/}|jj0}t1j2||||g|d$ tjj||d
	 }tjjd|j d d|
d tdd%iW S tdd&iW S W n< tyL } z"tdt|itj3dW  Y d }~S d }~0 0 d S )'Nr   r   r   r   status_typery  zstatus_type is requiredAcceptedDeclined)r   rl   rz  bookingzYour appointment z  has been accepted successfully.appointment_bookingr   rq   r  Androidrq  APPOINTMENT STATUSrw   rb  r   api_keyregistration_iddata_messageIos)r  r  message_titlemessage_bodyr  cancellation_reasonzCancellation reason is requiredZFortuner   appointmentrefund_amountcancellation_chargesz has been declined.zAppointement Cancelledzappointment_cancelled.htmlru   )Z
appoint_idZfortune_teller_nameservice_namepriceZcancel_reasonrs   r   z&Status type must be Accepted/Declined )4r   r   r   r(   r   r   r}   r:   r~   r   rx   ry   rz   rs  r   rq  r)   rD   	charge_idr   STRIPE_SECRET_KEYstriper  Chargecapturer~  r  r   SeerUserNotificationsr   rx  r`  r   FIREBASE_SERVER_KEYr   r   notify_single_devicer  cancelled_byAdminRefundRequestr  r   rl   r]   r^   servicer  r   r_   r   r   r   )r   r   r   r   rl   rx   rx  r  appointment_objtransaction_objZseer_objr  
server_keyr  resultr  r  r  r   rt   r   r   r   r2   r2   r3   r     s    .


	


.zAcceptOrDeclineAppointment.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )PastUpcomingAppointmentsc              
   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d}|stdditjdW S |dkrtjj|dd	d
}t|ddj}n.tjj|djddgdd
}t|ddj}td|d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  appoint_typezappointment_type is requiredacceptedr  )rl   rq  rK  Tr   rn   rp  appointment_status__inr   r   )r   r   r   r(   r   r   r}   r:   r~   r   r   r}  ry   rz   rs  rM  rt  rx   r  r   )r   r   r   r   rl   r  ru  rv  r2   r2   r3   ry     s&    . zPastUpcomingAppointments.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )AddMoneyFortuneWalletc           
   
   C   s  zLz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}|stdditjdW S tjt_tjjt|d	 d
|dd}|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  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   r  payment_tokenzpayment_token is requiredrm   zamount is requiredd   usdzAdding money to wallet)rm   currencysourcedescriptionrk   ru   z, fortune teller added money to their wallet.Zfortuneteller_walletrv   z"Money added to wallet successfully)r   r   r   r(   r   r   r}   r:   r~   r   r   rx   ry   rz   r   r  r  r  r  r   r>   walletrm   r)   r   r   r]   r^   error	CardErrorr   )
r   r   r   r   rl   rx   r  rm   chargefortune_teller_walletr2   r2   r3   r     sH    .




 *zAddMoneyFortuneWallet.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )GetFortuneWalletDetailsc              
   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|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  rn   r   r   )r   r   r   r(   r   r   r}   r:   r~   r   r   r   ForutuneTellerWalletSerializerrx   r   )r   r   r   r   rl   wallet_detail
serializerr2   r2   r3   ry     s    .
zGetFortuneWalletDetails.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )GetFortuneWalletAllTranscationc              
   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  r  )rl   payment_modeTr   r   r   )r   r   r   r(   r   r   r}   r:   r~   r   r   r9   WalletTranscationSerializerrx   r   )r   r   r   r   rl   wallet_transcationtranscation_serializerr2   r2   r3   ry     s    .z"GetFortuneWalletAllTranscation.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )MarkBookingCompletedc              
   C   s0  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 	 }|r|j}|j|d  }	t|jt|	 }
ntd	}
tjj|jd
d	 }tjj|jd	 }|rR| j|
7  _|  ntjj||
d tjj|jd	 }tjjt |||
ddd d
|_|  tjjd|j d d|d tjjdt|
 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  rx  zappointment_id not foundrz  r  r   T)r   r   rn   rk   r  r  )r=   r  rl   rm   r  transcation_typezYou appointment :z! has been completed successfully.appointment_completedr  zAmount of $z for the appointment z, has been added to your wallet successfully.Zappointment_earningrp   r   )!r   r   r   r(   r   r   r}   r:   r~   r   r   rx   ry   rs  r   r;   commission_percentager  r>   fortune_teller_idr   rm   r)   r   r~  seer_user_idr9   rC   r  r  rx  r   r   )r   r   r   r   rl   rx  r  general_objcommision_percentr  commision_amountr   
wallet_objr  r2   r2   r3   r     sF    .
(zMarkBookingCompleted.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )PayoutMoneyc              
   C   sv  z2z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|jd	 }t|jt|k rtdditj
dW S | jt|8  _|  tjjt ||d	 tjj|jd
 |j d | dd tddiW S  typ } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r  payout_amountzPayout amount is requiredrn   z/You do not have sufficent amount in you wallet.)r=   rl   rm   ru   z6 fortune teller has send a request for the payout of $Zfortuneteller_payoutrv   r   )r   r   r   r(   r   r   r}   r:   r~   r   r   rx   ry   r   r   r>   rm   r)   rG   r   rH   r   r]   r^   r   )r   r   r   r   rl   r  r  r2   r2   r3   r   $  s*    .$zPayoutMoney.postNr   r2   r2   r2   r3   r  #  s   r  c                   @   s   e Zd Zdd ZdS )AllPayoutTranscationsc              
   C   st  z0z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d}|jd}|stdditjdW S |d	krtjj|d	d
}t|ddj}nL|dkrtjj|dd
}t|ddj}n"tjj|dd}t|ddj}td|dW S  tyn } z"tdt|itjdW  Y d }~S d }~0 0 d S )Nr   r   r   r  rn   rK  r  ztranscation_type is requiredpending)rl   transcation_statusTr   Zapprovedr   r   )r   r   r   r(   r   r   r}   r:   r~   r   r   rG   rM  r}  ry   rz   PayoutTranscationSerializerrx   r   )r   r   r   r   rl   Z
payout_objr  r  r2   r2   r3   ry   =  s.    .
zAllPayoutTranscations.getNr   r2   r2   r2   r3   r  <  s   r  c                   @   s   e Zd Zdd ZdS )dummyNotificationc              
   C   s  zHz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d	 }|jr>|j}ttj}|jdkrddd	|j d
 |j d |jdd}t|dj||d}	|jdkr>d}
|jd
 |j d }dd|jd
 |j d d}t|d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conversation_startzCHAT STARTED FROM FORTUNE SIDEzYour Chat have started withru   z, Please Join!Z"CHf934bfe890d049339346dd180726c48b)rw   rb  r   r*   twilio_channel_sidr  r  r  )REQUEST ACCEPTEDz sent you a friend request.friend_request_acceptedr  z accepted your friend request.r  r  r   )r   r   r   r(   r   r   r}   r:   r~   r   r   r~  r`  r   r   r  r   r]   r^   r*   r   r  r   )r   r   r   r   rl   r  r  r  r  r  r  r  r2   r2   r3   r   \  sB    .

zdummyNotification.postNr   r2   r2   r2   r3   r  [  s   r  c                   @   s   e Zd Zdd ZdS )OnlineStatusc              
   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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   online_statuszonline_status is requiredr   )r   r   r   r(   r   r   r}   r:   r~   r   r   rx   ry   rz   	is_onliner)   r   )r   r   r   r   rl   rx   r  r2   r2   r3   r     s"    .
zOnlineStatus.postNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )ExpireAppointmentsc              
   C   sv  z2t jjddgd}|D ]}|j}|j}ttj|d\}}t	
|d | d}t	
|d | d}	t|j}
|
|}|
|	}||
}||
}t	t|j}||kr|jdkr|js|jrd|_d|_|  tj  }|r"|j}|j|d	  }t|jt| }n
|j}d
}tjj|jjd }|jrt|j ||j!}t"jj|jd }|r| j#|7  _#|  nt"jj$|j|d n.t%jj$||jd
d d|_d|_&d|_'|  |jdkrt(jj|d }|j)st%jj$||jd
d d|_d|_&d|_'|  qt*ddit+j,dW S  t-yp } z"t*dt|it+j.dW  Y d }~S d }~0 0 d S )Nrp  r  r  r  ru   z%d %B %Y %I:%M %p	CompletedTr  r   r   rn   rk   r  ZExpiredr  r   z)Expired appointments updated successfullyr   )/rs  r:   r~   appointment_timeappointment_dater  r(   stripr   r
   strptimepytzr  localize
astimezoner   rq  r  twilio_room_namer  r)   r   r;   r   r  r  r>   r}   rl   r   r   r   stripe_connect_account_idrx  r   rm   r   r  r  r  rD   r  r   r   HTTP_200_OKr   r   )r   r   Zappointments_to_expirer  r  r  booked_start
booked_endappointment_datetime_startZappointment_datetime_endZappointment_timezoneZstart_time_appointment_timezoneZend_time_appointment_timezoneZstart_time_appointmentZend_time_appointmentcurrent_timer  r  total_amountr  r   Ztranfer_amountr  r  r   r2   r2   r3   ry     sn    






zExpireAppointments.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )UpdateOnlineStatusc              
   C   s   zDt jjdt tdd d}|D ]}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 )	NTr   )hours)r  Zlast_activity__ltFr   r   r   )r}   r:   r~   r
   r   r   r  r)   r   r   r(   r   r   )r   r   Zinactive_fortune_tellersrl   r   r2   r2   r3   ry     s    
zUpdateOnlineStatus.getNr   r2   r2   r2   r3   r    s   r  c                   @   s   e Zd Zdd ZdS )SuccessPageUrlc              
   C   s   zz|j d}tjj|d }|j}tj	|}t
d| d|_|d rdd|_|  t|dW S |  t|dW S W n. ty } zt|dW  Y d }~S d }~0 0 d S )Nfortuner   zaccount===========TZcharges_enabledzsuccess.htmlr   )r   ry   r}   r:   r~   r   r  r  Accountretriever   r   r   r)   r   r   )r   r   
fortune_idr   Z
account_idaccountr   r2   r2   r3   ry   J  s    
zSuccessPageUrl.getNr   r2   r2   r2   r3   r  I  s   r  c                   @   s   e Zd Zdd ZdS )StripeConnectAccountc           	   
   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}|j}|jrtd|j t|j|j}n&t|}|r||_t||j}|  td|dt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   Ziffr   r   )r   r   r   r(   r   r   r}   r:   r~   r   r   rx   r_   r  r   Zcreate_account_urlr   Zcreate_stripe_connectAccountr)   r  r   )	r   r   r   r   rl   rx   Zfortune_emailZstripe_connect_urlconnect_account_idr2   r2   r3   r   `  s*    .zStripeConnectAccount.postNr   r2   r2   r2   r3   r  _  s   r  c                   @   s   e Zd Zdd ZdS )DeleteFortuneAccountViewc              
   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fortune_id is requiredr  Tz#Fortune teller deleted successfully   )r   r   r   r(   r   r   r}   r:   r~   r   r   ry   DoesNotExistr   r)   )r   r   r   r   rl   r  r   r2   r2   r3   destroy}  s"    ,z DeleteFortuneAccountView.destroyN)r   r   r   r  r2   r2   r2   r3   r  |  s   r  )rI   )yr_   r   django.shortcutsr   rest_framework.viewsr   rest_framework.responser   rest_frameworkr   models	functionsrK   r
   r   django.confr   django.contrib.authr   django.contrib.auth.modelsr   Zrest_framework_simplejwt.tokensr   passlib.hashr   r{   django.template.loaderr   django.corer   django.core.mailr   mathr  rS   django.contribr   rJ   r   Zadmin_panel.modelsjsonauthenticationr   serializersdjango.core.files.storager   r#   admin_panel.common_functionsZadmin_panel.functionsr   Zseer_user.serializersr   r   Zadmin_panel.serializersr   r   pyfcmr   Zdjango.views.genericr   r  r   twilio.restr    TWILIO_ACCOUNT_SIDaccount_sidTWILIO_AUTH_TOKEN
auth_tokenclientTWILIO_MOBILE_NUMBERfrom_mobile_numberr4   rC   rE   rH   r[   r\   r   r   r   r   r   r   r   r   r   r  r  r*  r/  r0  rB  rH  rJ  rP  rW  r[  r\  r_  ra  rd  rg  rj  ro  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  DestroyAPIViewr  r2   r2   r2   r3   <module>   s    

QJ)#2 !
	bA0	

 '& 0*&[V