o
    (Ai                     @   s>  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m	Z	m
Z
mZmZmZmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lT d d	lT 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$ G dd de%Z&G dd de'Z(G dd de'Z)G dd de'Z*G dd de%Z+G dd deZ,G dd deZ-G dd deZ.G d d! d!eZ/G d"d# d#e'Z0G d$d% d%eZ1d&d' Z2e!d(d) Z3d*d+ Z4d,d- Z5G d.d/ d/e'Z6G d0d1 d1eZ7G d2d3 d3eZ8G d4d5 d5eZ9G d6d7 d7eZ:G d8d9 d9eZ;d:e<d;e<fd<d=Z=G d>d? d?eZ>dS )@    N)settingsrender)CaseWhenValueBooleanFieldFQ)AllowAny)APIView)verify_apple_receiptverify_apple_purchase)GooglePlayVerifier)*)CustomAPIException)send_support_email_async)JsonResponse)csrf_exempt)datetime)loggerc                   @   "   e Zd ZeZegZdZdd ZdS )DeviceRegisterViewNc                 C   
   t j S N)Deviceobjectsallself r    '/var/www/html/premium_crap/api/views.pyget_queryset      
zDeviceRegisterView.get_queryset)	__name__
__module____qualname__DeviceSerializerserializer_classr   permission_classespagination_classr"   r    r    r    r!   r      
    r   c                   @   r   )CategoryListViewNc              
   C   s   z\t jj| jd dtddtt dB d }|j	j
tjkr*tj }n|j	j}t|d ttjjddd	d | }tjjd
d jtt|tddtd
t ddW S  ty } z't|d tjddd tjjttdtddtd
t ddW  Y d }~S d }~ww )Ndevice	device_idTexpireAt__isnullexpireAt__gt-idz>>>>>>>>>>>>>>>id)flatF)craptitude__isnull)pk__inthendefaultoutput_field
isUnlockedz>>>>>>>>>>>>>>>>>>>>>>>>ERRORzError in CategoryListViewexc_info   )pk__lter9   )Transactionr   filterkwargsr
   timezonenoworder_byfirstplantypePlanTypeFULL_ACCESSCategorycountunlockCategoryprintlistvalues_listdistinctannotater   r   r   r   	Exceptionr   error)r   subscriptionunlock_countunlocked_idser    r    r!   r"   (   s0   $

zCategoryListView.get_queryset)	r$   r%   r&   CategorySerializerr(   r   r)   r*   r"   r    r    r    r!   r,   #   r+   r,   c                   @   r   )CraptitudeListViewNc                 C   sv   | j d }tjj| j d |dd }|r|jd }nd}tjj|ddjt	t
|tdd	td
t ddS )Ncategoryr-   )session__device_idsession__category_idr4      )category_idr5   T)roundNumber__lter9   Fr:   r=   )rE   CraptitudeHistoryr   rD   rH   rI   levelCompleted
CraptituderU   r   r   r   r   )r   rb   craptitude_historyunlock_levelr    r    r!   r"   D   s   


zCraptitudeListView.get_queryset)	r$   r%   r&   CraptitudeSerializerr(   r   r)   r*   r"   r    r    r    r!   r]   ?   r+   r]   c                   @   r   )TeamListViewNc                 C   r   r   )Teamr   r   r   r    r    r!   r"   Y   r#   zTeamListView.get_queryset)	r$   r%   r&   TeamSerializerr(   r   r)   r*   r"   r    r    r    r!   rj   T   r+   rj   c                   @   r   )GameSessionCreateViewNc                 C   r   r   )GameSessionr   r   r   r    r    r!   r"   b   r#   z"GameSessionCreateView.get_queryset)	r$   r%   r&   GameSessionSerializerr(   r   r)   r*   r"   r    r    r    r!   rm   ]   r+   rm   c                   @      e Zd Zdd ZdS )PlayerBulkCreateAPIViewc              
   K      t |jdd}|jdd z9tjj|d s$ttt	j
ddt	j
dW S tjj|d  |j|d}t |dd	j}tt|t	jtt	jdW S  tyb } ztjd
dd tt|t	jdd }~ww )NTdatamanyraise_exceptionpkPlease enter valid session idcodemessagestatus
session_idru   z Error in PlayerBulkCreateAPIViewr?   detailstatus_code)PlayerCreateSerializerrt   is_validrn   r   rD   existsResponsefail_responser   HTTP_404_NOT_FOUNDPlayerdeletesavesuccess_responseHTTP_200_OKcreatedMessagerV   r   rW   r   strHTTP_400_BAD_REQUESTr   requestsessionrE   
serializerplayersrt   r[   r    r    r!   postg   "   zPlayerBulkCreateAPIView.postNr$   r%   r&   r   r    r    r    r!   rq   f       rq   c                   @   rp   )SentenceBulkCreateAPIViewc              
   K   rr   )NTrs   rv   rx   rz   r{   r~   r   r   z"Error in SentenceBulkCreateAPIViewr?   r   )SentenceCreateSerializerrt   r   rn   r   rD   r   r   r   r   r   Sentencer   r   r   r   r   rV   r   rW   r   r   r   r   r    r    r!   r   |   r   zSentenceBulkCreateAPIView.postNr   r    r    r    r!   r   {   r   r   c                   @   rp   )SentenceShuffleAPIViewc                 O   s  t tjj|d}|stttjddtjdS zi }|D ]}||j	g 
| qt | }|dd }		 t|	 tdd t||	D rHnq6d	d
 t||	D }
g }t F | D ]9\}}|
| }dd |D }t| t|D ] \}}||_	|| |_|  |
|j|j|j|j	|jd qvq^W d   n1 sw   Y  tt|tjttjdW S  ty } ztjddd tt |tj!dd}~ww )M
        Shuffle teams first, then shuffle players inside each team.
        r   z#No sentences found for this sessionr{   r~   NTc                 s   s    | ]	\}}||kV  qd S r   r    ).0abr    r    r!   	<genexpr>   s    z-SentenceShuffleAPIView.get.<locals>.<genexpr>c                 S   s   i | ]\}}||qS r    r    )r   oldnewr    r    r!   
<dictcomp>   s    z.SentenceShuffleAPIView.get.<locals>.<dictcomp>c                 S   s   g | ]}|j qS r    )	player_id)r   pr    r    r!   
<listcomp>   s    z.SentenceShuffleAPIView.get.<locals>.<listcomp>)r5   textplayerteamr   zError in SentenceShuffleAPIViewr?   r   )"rR   r   r   rD   r   r   r   r   
setdefaultteam_idappendkeysrandomshuffleanyziptransactionatomicitems	enumerater   r   r5   r   r   r   r   
getMessagerV   r   rW   r   r   r   )r   r   r   argsrE   	sentencesteamssteam_idsshuffled_team_idsteam_mappingshuffled_outputold_teamr   new_team
player_idsidxsentencer[   r    r    r!   get   s\   




zSentenceShuffleAPIView.getN)r$   r%   r&   r   r    r    r    r!   r      r   r   c                   @   rp   )RatingBulkCreateAPIViewc              
   K   s  t |jdd}|jdd tjj|d }|s$ttt	j
ddt	j
dS ztjj|d  t r |j|jd tjj|d	jtd
td d}|d }t|d tjj|jd }|j}tjj|d	\}	}
t|	jd t|d |	j|k rtd ||	_|	jdgd t|j}tt|t	jtt	jdW  d    W S 1 sw   Y  W d S  ty } zt j!ddd t"t#|t	j$dd }~ww )NTrs   rv   rx   rz   r{   r~   r   )r   diaperScoredumpsterScore)
totalScorez-totalScorez>>>>>>>>>>>>>>sessionz>>>>>>>>>>>levelCompletedz>>>>>>>>>>>>>>completedLevelz>>>>>>>>>>>>>>>>>>>>>>>>>>>inre   update_fieldsz Error in RatingBulkCreateAPIViewr?   r   )%RatingCreateSerializerrt   r   rn   r   rD   rI   r   r   r   r   Ratingr   r   r   r   ry   rU   r	   rH   rQ   rf   craptitude_idroundNumberrd   get_or_createre   RatingGetSerializerr   r   r   rV   r   rW   r   r   r   )r   r   r   rE   r   ratings
max_rating
craptitudecompletedLevelinstancecreatedrt   r[   r    r    r!   r      sF   




(zRatingBulkCreateAPIView.postNr   r    r    r    r!   r      r   r   c                   @   r   )RatingScoreGetAPIViewNc                 C   s   t jj| jd dS )Nr   r   )r   r   rD   rE   r   r    r    r!   r"      s   z"RatingScoreGetAPIView.get_queryset)	r$   r%   r&   r   r(   r   r)   r*   r"   r    r    r    r!   r      r+   r   c                   @      e Zd ZeZdd ZdS )OptionsAPIViewc           
   
   O   s  | j |jd}|jdd |jd}t|d t|d zi }|tjkr2td tjj	|d
  |tjkrMtd	 tjj	|d
  tjj	|d
  |tjkrtd
 tjj	|d }|rd|jnd|d< tjj	|d
  tjj	|d
  tjj	|d
  |tjkrtd tjj	|d
  tjj	|d
  tjj	|d
  t|d tt|tjttjdW S  ty }	 ztjddd tt|	tjdd}	~	ww )r   rt   Trv   optionz#>>>>>>>>>>>>>>>>>>>>>>>>>>>>sessionz">>>>>>>>>>>>>>>>>>>>>>>>>>>>optionz>>>>>>>>>>>>>>>>>>>>1r   z>>>>>>>>>>>>>>>>>>>>2z>>>>>>>>>>>>>>>>>>>>3rx   Nr^   z>>>>>>>>>>>>>>>>>>>>4z>>>>>>>>>>>>>>>>>>>>>datar~   zError in OptionsAPIViewr?   r   )r(   rt   r   r   rQ   OptionChoicePART_TWOr   r   rD   r   PART_ONE_AND_PART_TWOr   
CRAPTITUDErn   rI   rb   r   CATEGORYr   r   r   r   r   rV   r   rW   r   r   r   )
r   r   r   r   rE   r   r   rt   game_sessionr[   r    r    r!   r     sB   






zOptionsAPIView.postN)r$   r%   r&   OptionsSerializerr(   r   r    r    r    r!   r          r   c                 C   
   t | dS )Nzsupport.htmlr   r   r    r    r!   SupportView,  r#   r   c           	   
   C   sb  | j dkrtdddddS zwtd | jr9d| jv r9zt| jd	}W n ty8   td
didd Y W S w | j	}t|d |
d}|
d}|
d}|
d}|
d}|
d
}t||||gsrtdddtjdW S t|||||| tdddtjdW S  ty } zt|d tjddd tdd| dtjdW  Y d }~S d }~ww )NPOSTFzInvalid request method)successr}   i  r~   z>>>>>>>>>>>>>>>inzapplication/jsonutf-8r}   zInvalid JSON bodyi  z
>>>>>>datanamecountryCodephoneemailsubjectzAll fields are required.TzEmail sent successfully!z">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>EzError in send support mailr?   zEmail sending failed: )methodr   rQ   content_typejsonloadsbodydecoderV   r   r   r   r   r   r   r   r   rW   HTTP_500_INTERNAL_SERVER_ERROR)	r   rt   r   country_coder   r   r   r}   r[   r    r    r!   SupportCreateView0  s@   









r   c                 C   r   )NztermsCondition.htmlr   r   r    r    r!   TermsAndConditionViewU  r#   r   c                 C   r   )NzprivacyPolicy.htmlr   r   r    r    r!   PrivacyPolicyViewY  r#   r   c                   @   r   )PlanListViewNc                 C   sp   t jj| jd dtddtt dB d }|j	}t
d tjjtt|tddtd	t d
dS )Nr-   r.   Tr0   r2   r4   z>>>>>>>>>>>>>>>>>>>>plan)ry   r9   Fr:   )isActive)rC   r   rD   rE   r
   rF   rG   rH   rI   plan_idrQ   PlanrU   r   r   r   r   )r   rX   r  r    r    r!   r"   b  s   $
zPlanListView.get_queryset)	r$   r%   r&   PlanSerializerr(   r   r)   r*   r"   r    r    r    r!   r   ]  r+   r   c                   @   s   e Zd ZdZeZdd ZdS )AndroidPlanPurchaseViewz1
    Django version of android_plan_purchase
    c                 O   s  | j |jd}|jdd |j}z4td|  |d}|d}|d}|d}	|d	}
tjj	||d

 rOtd tttjddtjdW S t }|||	}|r_|dsqtd tttjddtjdW S |d }td|  t|ddd}t|d d d dd}tdd|dd}|d}td|  ||krtd tttjddtjdW S tjj	|d }|std tttjddtjdW S t E tjj||	d t|j|||d!d"\}}d|_||_ |	|_!||_|j"g d#d$ |
d%kr%tjj#|||j|	|d&|j$||d'	 W d    n	1 s0w   Y  tt%d|j&itj'd(dtj'dW S  t(yj } ztd)|  tj)d*dd+ t*t+|tjd,d }~ww )-Nr   Trv   zAndroid Plan Purchase: r-   orderId	productIdpurchaseTokenrK   )r  r-   Your plan is already active.r{   r~   isSuccessfulInvalid orderIdpayloadzSubscription Data >>>>>>>>> 	startTimeZ+00:00	lineItemsr   
expiryTime\.\..* latestOrderIdobfuscatedExternalAccountIdzuser_profile_id >>>>>>>>> zInvalid order Id.r  Invalid plan selected   )r  r  startAtexpireAt)r-   r  notificationTypedefaultsisSubscriptionr  lastPurchaseTokenr  r   purchase4)	r-   rJ   r  r  r  r  amountr  r  zPlan purchased successfully.zError in Android PlanPurchase: zError in Android PlanPurchaser?   r   ),r(   rt   r   validated_datar   infor   rC   r   rD   r   r   r   r   HTTP_409_CONFLICTr   verify_subscriptionr   r   fromisoformatreplaceresubr  rI   r   r   AndroidTransactionr   dictr  r  r  r  r   createpricer   ry   r   rV   rW   r   r   )r   r   r   rE   r   rt   r-   r  r  r  reqTypeverifierr)  rX   r  r  purchaseOrderIduser_profile_idrJ   android_txnr   r[   r    r    r!   r   s  s   













zAndroidPlanPurchaseView.postN)r$   r%   r&   __doc__AndroidPurchaseSerializerr(   r   r    r    r    r!   r  m  s    r  c                   @   r   )ApplePlanPurchaseViewc                 C   s   z| j |jd}|jdd |j}td|  |d}|d}|d}|d}|d	d
}|rtd z2t|}	|	d }
|
d d d }td|  |d }t	|
dd d |
dd  d}W n8 ty } z,t|d tdt|  tdt|  tttjddtjdW  Y d }~W S d }~ww t }|}d }tjj|d }|std tttjddtjdW S td t|j}tjj||d }|r|j|jkrtjj|jd}|std tt|tjddtjdW S td  t jj||d!d" }|r]|j!r]|j"r]|j"|kr]|j|j!jkrAtd# tt|tjddtjdW S ||j!kr]|j#r]td$ tttj$d$dtj$dW S td% |d u rt|j%t&j'krt|t(d&d' }d
|pyd
|p}d
d
||d
d
||d(
}t jj||d }|st jj)d3i | n|j"|kr|j"}n
||_"|j*d)gd* ||_+||_,d|_#||_"|j*g d+d* t-jj)||||||j.||d, ttd|jitjd-dtjdW S  ty } zt|d. td/|  tjd0dd1 t/t|tjd2d }~ww )4Nr   Trv   zApple Plan Purchase: r-   r  appleTransactionIdoriginalTransactionIdappleReceiptr  If receive appleReceiptrt   latest_receipt_infor   zLastest receipt info: expires_date ra   %Y-%m-%d %H:%M:%Sz#>>>>>>>>>>>>Error in verify receiptverifyAppleReceipt error: Receipt verification failedr{   r~   r  r  z>>>>>>>>>>>>>>>>>>>>>>>>1r7  r  rx   4This subscription is already active on another user.rt   r|   r}   z>>>>>>>>>>>>>>>>>>>>>>>>2EXPIRED)r7  r  r  zAThis subscription is already active on another user.>>>>>>>>>>>>>r  z>>>>>>>>>>>>>>>>>>>>>>>>3im  )days)
r  r6  r7  webOrderLineItemIdr  r  environmenttransactionReasonr  r-   r  r   )r  r7  r  r  )r-   rJ   r  r6  r7  r!  r  r  zPlan purchased successfullyz >>>>>>>>>>>>>>>>>Error in apple zError in ApplePlanPurchase: zError in ApplePlanPurchaser?   r   r    )0r(   rt   r   r"  r   r#  r   r   r   strptimesplitrV   rQ   r   rW   r   r   r   r   rF   rG   r  r   rD   rI   r   DeviceGetSerializerr   ry   r5   r   r   AppleTransactionr-   r  r  r$  period
PlanPeriodYEAR	timedeltar,  r   r  r7  rC   r-  r   )r   r   r   rt   r-   r  r6  r7  r8  r)  rX   latest_infoexpires_date_strr  r[   todayr  rJ   device_dataexisting_userother	apple_txntxn_data	check_txnr    r    r!   r     s   




 




"


	
zApplePlanPurchaseView.postN)r$   r%   r&   ApplePurchaseSerializerr(   r   r    r    r    r!   r5    r   r5  c                   @   r   )AndroidPlanRestoreViewc              
   O   sB  | j |jd}|jdd |j}zetd|  |d }|d }|d }t }	|jrR|j	rR|j	|	krR|j
|krRt|j}
td tt|
tjd	d
tjdW S td t }|||}|rg|dsytd tttjddtjdW S |d }td|  t|ddd}t|d d d dd}tdd|dd}||	krtd d|_d|_	d|_
d|_d|_d|_|jg dd tttjd dtjdW S tjj |d!! }|s td" tjj"||d#||||d$ d|_||_	||_
||_|jg d%d t|j}
tt|
tjd	d
tjdW S ||j#krEt$jj |j%d&! }|rEtd' tttjd'dtjdW S tjj |d!j&|d( d|_||_||_
||_	|jg d)d t|j}
tt|
tjd	d
tjdW S  t'y } zt(|d* td+|  tj)d,dd- t*t+|tjd.d}~ww )/zDRestore Android subscription for a user based on the purchase token.r   Trv   zAndroid Plan Restore: r-   r  r  z,Plan restored successfully>>>>>>>>>>>>>>>>ifPlan restored successfullyrB  r~   z->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>first elser	  r
  r{   r  zverify_subscription data- r  r  r  r  r   r  r  r  r  z%>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ExpiredFN)r  r  r  r7  r6  r  r   zYour plan is expiredr  z&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Not planr  )r-   r  r  r  r  r  r  r  rx   rA  r-   )r  r  r  r  z/>>>>>>>>>>>>>>>>>>error in android restore viewz&Error in AndroidPlanRestorePurchase - z#Error in AndroidPlanRestorePurchaser?   r   ),r(   rt   r   r"  r   r#  rF   rG   r  r  r  rJ  r   r   r   r   r   r%  r   r   r   r   r&  r'  r(  r)  r7  r6  r  r   r*  r   rD   rI   r,  r-   r   r/   updaterV   rQ   rW   r   r   )r   r   r   rE   r   r"  r-   r  r  rR  rS  r/  r)  rX   r  r  r0  rJ   other_devicer[   r    r    r!   r   R  s    






	





zAndroidPlanRestoreView.postN)r$   r%   r&   AndroidPlanRestoreSerializerr(   r   r    r    r    r!   rZ  O  r   rZ  c                   @   r   )ApplePlanRestoreViewc              
   C   s  | j |jd}|jdd |j}z3td|  |d}|d}|d}|d}|d	d
}|dd}	d }
|	rtd z*t|	}|d }|d d d }|d }t	|
dd d |
dd  d}
W n. ty } z"t|d tdt|  tttjddtjdW  Y d }~W S d }~ww t }|jr|jr|j|krtd |r|j|krtd ttdddddW S td t|j}tt|tjdd tjdW S tjj||d!d" }|s0td# d
|_d |_d |_d |_d |_ |j!g d$d% |rtd& ttdd'dddW S td tttj"ddtj"dW S |j|kr}td( d
|_d |_d |_d |_d |_ |j!g d$d% |retd) ttdd*dddW S td+ t|j}tt|tjd*d tjdW S |
s|j}
td,|j#  |j$r|j$j%nd }td-|  |r|rt|j%t|krtd. d|_|j|_||_||_ |
|_|j!g d/d% tjj||d!j&|d0 t|j}tt|tjdd tjdW S td1 t'jj|d2 }|rtd3 tttjd3dtjdW S d|_|j|_||_||_ |j|_|j!g d/d% tjj||d!j&|d0 t|j}tt|tjdd tjdW S  tyi } ztd4|  tj(d5dd6 t)t|tjd7d }~ww )8Nr   Trv   zApple Plan Restore: r-   r  r6  r7  	isNewUserFr8  r  r9  rt   r:  r   r;  r<  ra   r=  z)>>>>>>>>>>>>Error in verify_apple_receiptr>  r?  r{   r~   z/>>>>>>>>>>>>>>>>>>>>>>>>>>>>>first>>>>>>>>>>>ifzG>>>>>>>>>>>>>>>>>>>>>>>>>>>>>No subscription found for this transactioniG  z*No subscription found for this transactionzC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Plan restored successfullyr[  rB  r@  
-createdAtz=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>not apple_transaction)r  r  r  r6  r7  r   z4>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Your plan is expiredzYour plan is expired.z8>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>apple_transaction expirezF>>>>>>>>>>>>>>>if is_new_user>>>>>>>>>>>>>>>>>Subscription is expired.zSubscription is expired.z<>>>>>>>>>>>>>>>>else>>>>>>>>>>>>>>>>Subscription is expired.z)Deviceid>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>z/plan_device_id>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>z'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>if not)r  r  r6  r7  r  r]  z>>>>>>>>>>>>>>>>>>>>>>>>>>>ELSErx   rA  z$Error in ApplePlanRestorePurchase - z!Error in ApplePlanRestorePurchaser?   r   )*r(   rt   r   r"  r   r#  r   r   r   rH  rI  rV   rQ   r   r   r   r   r   rF   rG   r  r  r  rJ  r   r   rK  r   rD   rH   rI   r6  r7  r   r   r5   r-   ry   r^  r   rW   r   )r   r   r   rt   r-   r  r6  r7  is_new_userr8  r  r)  rX   rP  rQ  r[   rR  rS  apple_transactionplan_device_idr_  r    r    r!   r     s   




 














 






zApplePlanRestoreView.postN)r$   r%   r&   ApplePlanRestoreSerializerr(   r   r    r    r    r!   ra    r   ra  c                   @   rp   )AndroidNotificationViewc              
   O   s  zt d |jdi d}|s%t d tttjddtjdW S t	t
|d}t d	|  |d
 }|d }|d }t|d }	t }
|
||}|rZ|dslt d tttjddtjdW S |d }t d|  t|ddd}t|d d d dd}tdd|dd}tjj|ddd }t d|  |d}d }|st d  |rt d! |jj}t d" n|}t d#|	 d$|  tjj|d% }t  |||||	||d&}t d'|	  |	dkr0i |d(|i}tjj d8i | t!jj|d)j"d*|||d+ |s/tjj d8i | n|	d,v rxi |d(|i}tjj d8i | t!jj|d) }|rw|j#|krwd*|_$||_%||_&||_#|j'g d-d. tjj|d/j"|d0 n:|	d1krtjj|d1||d2 }|st!jj|d) }|r|j#|krd3|_$d |_%d |_&d |_#|j'g d-d. W d    n	1 sw   Y  tt(g tj)d4dtj)dW S  t*y } zt jd5d*d6 t+t,|tj)d7d }~ww )9Nz*Received Android Notification.>>>>>>>>>>>>r}   rt   z)>>>>>>>>>>>>>>>>>>>>>>>>payload not foundzMissing message datar{   r~   r   z"Android Data>>>>>>>>>>>>>>>>>>> - subscriptionNotificationsubscriptionIdr  r  r	  zInvalid order idr  zSubscription Data: r  r  r  r  r   r  r  r  r  r  )r  r  rc  z'Android Transaction>>>>>>>>>>>>>>>>>>: r  z@>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>if not user_profile_idz&>>>>>>>>>>>>>>>>>>>>>>>>>>if check_txnz>>>>>>>>>>>>>device_idzNotification Type z processed for device r  )r/   r  r  r  r  r  r  z,notificationType >>>>>>>>>>>>>>>>>>>>>>>>>> rJ   r5   Tr  )      )r  r  r  r  r   r\  )r     )r  r  r/   r  FzWebhook handled successfully.z(Error in Android Notification >>>>>>>>>>r?   r   r    )-r   r#  rt   r   r   r   r   r   r   r   base64	b64decoder   intr   r%  r   r&  r'  r(  r)  r*  r   rD   rH   rI   r-   r5   r  r   r   rC   r,  r   r^  r  r  r  r  r   r   r   rV   r   r   )r   r   r   rE   encoded_datart   subscription_datar  r  r  r/  r)  rX   r  r  r  rX  r1  r/   rJ   new_txnrW  r-   existingr[   r    r    r!   r   =  s   












4zAndroidNotificationView.postNr   r    r    r    r!   rh  <  r   rh  r  returnc              
   C   s   zKz
t | dW W S  ty   Y nw z| ddt| d    }t |dW W S  ty4   Y nw | ddt| d  d   }t |dW S  tye } ztjddd td| d }~ww )Nr   =r  decode_base64_payloadTr?   zDecoding failed: )ro  urlsafe_b64decoder   rV   lenr   rW   
ValueError)r  padded_payloadfixed_payloadr[   r    r    r!   rx    s&   rx  c                   @   s   e Zd ZdZdd ZdS )AppleNotificationViewz5
    Handle Apple App Store Server Notifications
    c                 O   sf  zt d |jdd}|st d tdditjdW S z&t|dtj	dtj
dd	}|r4|d
sDt d tdditjdW W S W n- tyr } z!t d|  t jddd tdt|itjdW  Y d }~W S d }~ww t d|  |d
}|d}|d}	|d}
|dd}|d}|d}|dd}|d}|d}t  tjj||
d }tjj||
dd }t d|  t d|  |	||||||||
d 	}|st d! tjjd/i | nzt d" |r|jnd }tjj||
dj||d# |d$krCt d% tjj|jd&jd/i | |rBd|_d |_d |_d |_d |_|jg d'd( n-t d) tjj|jd&jd/i | |rpd|_||_|
|_||_|	|_|jg d'd( W d    n	1 s{w   Y  tt i tjd*d+tjdW S  ty } zt d,|  t jd-dd t!t|tjd.d }~ww )0NzReceived AppleNotificationsignedPayloadr  z,>>>>>>>>>>>>>>>>>>>>>>>Missing signedPayloadr}   zMissing signedPayloadr~   )p8keyIdissuerIdbundleId)signed_payload
server_apir   z!Invalid Apple transaction payloadzInvalid order IDzverify_apple_purchase error - zverify_apple_purchase errorTr?   z/Done done verification>>>>>>>>>>>>>>>>>>>>>>>>>r7  transactionIdr  r  r  r  rF  rG  rE  r@  F)r7  r  device__isnullzAppleTransaction ---> zgetUserTransaction ---> )	r6  r  r7  rE  r  r  rF  rG  r  z->>>>>>>>>>>>>>>>>>>>>>>>>if check_transactionz>>>>>>>>>>>>>>>>>>>>>>>>>else)r  r  rC  z1>>>>>>>>>>>>>>>>>>>>>>>>>EXPIRED>>>>>>>>>>>>>>>ifrk  )r  r  r  r7  r6  r   z3>>>>>>>>>>>>>>>>>>>>>>>>>EXPIRED>>>>>>>>>>>>>>>elsezPlan purchase successfullyr{   z!Error in AppleNotificationView - zError in AppleNotificationViewr   r    )"r   r#  rt   r   r   r   r   r   r   KEY_ID	BUNDLE_IDr   rV   rW   r   r   r   rK  r   rD   rI   r,  r-   rC   r^  ry   r  r  r  r7  r6  r   r   r   )r   r   r   rE   r  json_tinfo_payloadr[   transaction_datar7  r6  r  r  r  r  rF  transaction_reasonweb_order_line_item_idcheck_transactionget_user_transactioninsert_datar-   r    r    r!   r     s   

	
$













:zAppleNotificationView.postN)r$   r%   r&   r3  r   r    r    r    r!   r~    s    r~  )?r(  r   ro  r   django.confr   django.shortcutsr   django.db.modelsr   r   r   r   r	   r
   rest_framework.permissionsr   rest_framework.viewsr   	api.appler   r   api.googlepayr   api.serializerscore.base_viewscore.custom_exceptionr   
core.emailr   django.httpr   django.views.decorators.csrfr   r   core.loggerr   CustomCreateAPIViewr   CustomListAPIViewr,   r]   rj   rm   rq   r   r   r   r   r   r   r   r   r   r   r  r5  rZ  ra  rh  r   rx  r~  r    r    r    r!   <module>   sZ     			<+	,
$_ b t