o
    Ci                     @   sB  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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Z0G d"d# d#e*Z1G d$d% d%eZ2d&d' Z3e"d(d) Z4d*d+ Z5d,d- Z6G d.d/ d/e*Z7G d0d1 d1eZ8G d2d3 d3eZ9G d4d5 d5eZ:G 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Count)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                   @   s   e Zd ZegZeZdd ZdS )CategoryListViewc           
   
   C   s6  z~t jj|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td	tdd
dddjddjtt|tddtdt dd}| }t|d|iddj}tt|tjtdtjdW S  ty }	 zt j!ddd t"t#|	tj$dd }	~	ww )N	device_idTexpireAt__isnullexpireAt__gt-idz>>>>>>>>>>>>>>>id)flat
craptitude)craptitude__deletedAt__isnull)filterdistinct)active_craptitude_countr   )active_craptitude_count__gt)pk__inthenFdefaultoutput_field
isUnlockedrequestcontextmanycodemessagestatuszError in CategoryListView apiexc_infodetailstatus_code)%Transactionr   r9   r
   timezonenoworder_byfirstplantypePlanTypeFULL_ACCESSCategorycountunlockCategoryprintlistvalues_listannotater   r   r   r   r   CategorySerializerdataResponsesuccess_responserL   HTTP_200_OKcategory_list	Exceptionr   errorr   strHTTP_400_BAD_REQUEST)
r    rD   devicesubscriptionunlock_countunlocked_ids
categoriestotal_categoriesrc   er!   r!   r"   get'   s>   $



zCategoryListView.getN)r%   r&   r'   r   r*   rb   r)   rs   r!   r!   r!   r"   r-   #   s    r-   c                   @   s   e Zd ZegZdd ZdS )CraptitudeListViewc           	   
   C   s   zLt jj||dd }|r|jd }nd}tjj|dddjtt	|t
ddt
dt d	d
}t|d|iddj}tt|tjtdtjdW S  tyh } ztjddd tt|tjdd }~ww )N)session__device_idsession__category_idr4      T)category_iddeletedAt__isnullr5   )roundNumber__lter>   Fr?   rB   rD   rE   rH   rK   zError in CraptitudeListView ApirM   rO   )CraptitudeHistoryr   r9   rU   rV   levelCompleted
Craptitudera   r   r   r   r   CraptitudeSerializerrc   rd   re   rL   rf   craptitude_listrh   r   ri   r   rj   rk   )	r    rD   categoryrl   craptitude_historyunlock_levelcraptitudesrc   rr   r!   r!   r"   rs   V   s0   

zCraptitudeListView.getN)r%   r&   r'   r   r*   rs   r!   r!   r!   r"   rt   S   s    rt   c                   @   r   )TeamListViewNc                 C   r   r   )Teamr   r   r   r!   r!   r"   r#   s   r$   zTeamListView.get_queryset)	r%   r&   r'   TeamSerializerr)   r   r*   r+   r#   r!   r!   r!   r"   r   n   r,   r   c                   @   r   )GameSessionCreateViewNc                 C   r   r   )GameSessionr   r   r   r!   r!   r"   r#   |   r$   z"GameSessionCreateView.get_queryset)	r%   r&   r'   GameSessionSerializerr)   r   r*   r+   r#   r!   r!   r!   r"   r   w   r,   r   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rc   rG   raise_exceptionpkPlease enter valid session idrH   rK   
session_idrG   z Error in PlayerBulkCreateAPIViewrM   rO   )PlayerCreateSerializerrc   is_validr   r   r9   existsrd   fail_responserL   HTTP_404_NOT_FOUNDPlayerdeletesavere   rf   createdMessagerh   r   ri   r   rj   rk   r    rD   sessionkwargs
serializerplayersrc   rr   r!   r!   r"   post   "   zPlayerBulkCreateAPIView.postNr%   r&   r'   r   r!   r!   r!   r"   r          r   c                   @   r   )SentenceBulkCreateAPIViewc              
   K   r   )NTr   r   r   r   rH   rK   r   r   z"Error in SentenceBulkCreateAPIViewrM   rO   )SentenceCreateSerializerrc   r   r   r   r9   r   rd   r   rL   r   Sentencer   r   re   rf   r   rh   r   ri   r   rj   rk   r   r!   r!   r"   r      r   zSentenceBulkCreateAPIView.postNr   r!   r!   r!   r"   r      r   r   c                   @   r   )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 sessionrH   rK   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 SentenceShuffleAPIViewrM   rO   )"r_   r   r   r9   rd   r   rL   r   
setdefaultteam_idappendkeysrandomshuffleanyziptransactionatomicitems	enumerater   r   r5   r   r   re   rf   
getMessagerh   r   ri   r   rj   rk   )r    rD   r   argsr   	sentencesteamssteam_idsshuffled_team_idsteam_mappingshuffled_outputold_teamr   new_team
player_idsidxsentencerr   r!   r!   r"   rs      s\   




zSentenceShuffleAPIView.getN)r%   r&   r'   rs   r!   r!   r!   r"   r      r   r   c                   @   r   )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 )NTr   r   r   r   rH   rK   r   )r   diaperScoredumpsterScore)
totalScorez-totalScorez>>>>>>>>>>>>>>sessionz>>>>>>>>>>>levelCompletedz>>>>>>>>>>>>>>completedLevelz>>>>>>>>>>>>>>>>>>>>>>>>>>>inr|   update_fieldsz Error in RatingBulkCreateAPIViewrM   rO   )%RatingCreateSerializerrc   r   r   r   r9   rV   rd   r   rL   r   Ratingr   r   r   r   r   ra   r	   rU   r^   r}   craptitude_idroundNumberr{   get_or_creater|   RatingGetSerializerre   rf   r   rh   r   ri   r   rj   rk   )r    rD   r   r   r   ratings
max_ratingr7   completedLevelinstancecreatedrc   rr   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   r9   r   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   rc   Tr   optionz#>>>>>>>>>>>>>>>>>>>>>>>>>>>>sessionz">>>>>>>>>>>>>>>>>>>>>>>>>>>>optionz>>>>>>>>>>>>>>>>>>>>1r   z>>>>>>>>>>>>>>>>>>>>2z>>>>>>>>>>>>>>>>>>>>3r   Nr   z>>>>>>>>>>>>>>>>>>>>4z>>>>>>>>>>>>>>>>>>>>>datarK   zError in OptionsAPIViewrM   rO   )r)   rc   r   rs   r^   OptionChoicePART_TWOr   r   r9   r   PART_ONE_AND_PART_TWOr   
CRAPTITUDEr   rV   rx   r   CATEGORYrd   re   rL   rf   r   rh   r   ri   r   rj   rk   )
r    rD   r   r   r   r   r   rc   game_sessionrr   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   rD   r!   r!   r"   SupportViewF  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)successrJ   i  rK   z>>>>>>>>>>>>>>>inzapplication/jsonutf-8rJ   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 mailrM   zEmail sending failed: )methodr   r^   content_typejsonloadsbodydecoderh   r   rs   r   rL   rk   r   rf   r   ri   HTTP_500_INTERNAL_SERVER_ERROR)	rD   rc   r   country_coder   r   r   rJ   rr   r!   r!   r"   SupportCreateViewJ  s@   









r  c                 C   r   )NztermsCondition.htmlr   r   r!   r!   r"   TermsAndConditionViewo  r$   r  c                 C   r   )NzprivacyPolicy.htmlr   r   r!   r!   r"   PrivacyPolicyViews  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 )Nrl   r.   Tr0   r2   r4   z>>>>>>>>>>>>>>>>>>>>plan)r   r>   Fr?   )isActive)rR   r   r9   r   r
   rS   rT   rU   rV   plan_idr^   Planra   r   r   r   r   )r    rm   r
  r!   r!   r"   r#   |  s   $
zPlanListView.get_queryset)	r%   r&   r'   PlanSerializerr)   r   r*   r+   r#   r!   r!   r!   r"   r  w  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   Tr   zAndroid Plan Purchase: rl   orderId	productIdpurchaseTokenrX   )r  rl   Your plan is already active.rH   rK   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)rl   r  notificationTypedefaultsisSubscriptionr"  lastPurchaseTokenr  r   purchase4)	rl   rW   r  r  r  r#  amountr!  r"  zPlan purchased successfully.zError in Android PlanPurchase: zError in Android PlanPurchaserM   rO   ),r)   rc   r   validated_datar   infors   rR   r   r9   r   rd   r   rL   HTTP_409_CONFLICTr   verify_subscriptionrk   r   fromisoformatreplaceresubr  rV   r   r   AndroidTransactionr   dictr  r&  r"  r'  r   createpricere   r   rf   rh   ri   r   rj   )r    rD   r   r   r   rc   rl   r  r  r  reqTypeverifierr2  rm   r!  r"  purchaseOrderIduser_profile_idrW   android_txnr   rr   r!   r!   r"   r     s   













zAndroidPlanPurchaseView.postN)r%   r&   r'   __doc__AndroidPurchaseSerializerr)   r   r!   r!   r!   r"   r    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   Tr   zApple Plan Purchase: rl   r  appleTransactionIdoriginalTransactionIdappleReceiptr  If receive appleReceiptrc   latest_receipt_infor   zLastest receipt info: expires_date rw   %Y-%m-%d %H:%M:%Sz#>>>>>>>>>>>>Error in verify receiptverifyAppleReceipt error: Receipt verification failedrH   rK   r  r  z>>>>>>>>>>>>>>>>>>>>>>>>1r@  r  r   4This subscription is already active on another user.rc   rI   rJ   z>>>>>>>>>>>>>>>>>>>>>>>>2EXPIRED)r@  r  r#  zAThis subscription is already active on another user.>>>>>>>>>>>>>r  z>>>>>>>>>>>>>>>>>>>>>>>>3im  )days)
r#  r?  r@  webOrderLineItemIdr!  r"  environmenttransactionReasonr  rl   r"  r   )r  r@  r&  r"  )rl   rW   r  r?  r@  r*  r!  r"  zPlan purchased successfullyz >>>>>>>>>>>>>>>>>Error in apple zError in ApplePlanPurchase: zError in ApplePlanPurchaserM   rO   r!   )0r)   rc   r   r+  r   r,  rs   r   r   strptimesplitrh   r^   rj   ri   rd   r   rL   rk   rS   rT   r  r   r9   rV   r   DeviceGetSerializerr   r   r5   re   rf   AppleTransactionrl   r"  r&  r-  period
PlanPeriodYEAR	timedeltar5  r   r  r@  rR   r6  r   )r    rD   r   rc   rl   r  r?  r@  rA  r2  rm   latest_infoexpires_date_strr"  rr   todayr!  rW   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"   r>    r   r>  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   Tr   zAndroid Plan Restore: rl   r  r  z,Plan restored successfully>>>>>>>>>>>>>>>>ifPlan restored successfullyrK  rK   z->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>first elser  r  rH   r  zverify_subscription data- r  r  r  r  r   r  r  r  r  z%>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ExpiredFN)r&  r"  r'  r@  r?  r  r   zYour plan is expiredr  z&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Not planr   )rl   r  r#  r  r  r!  r"  r%  r   rJ  rl   )r&  r  r'  r"  z/>>>>>>>>>>>>>>>>>>error in android restore viewz&Error in AndroidPlanRestorePurchase - z#Error in AndroidPlanRestorePurchaserM   rO   ),r)   rc   r   r+  r   r,  rS   rT   r&  r"  r'  rS  rd   re   rL   rf   r   r.  rs   r   rk   r   r/  r0  r1  r2  r@  r?  r  r   r3  r   r9   rV   r5  rl   r   r/   updaterh   r^   ri   r   rj   )r    rD   r   r   r   r+  rl   r  r  r[  r\  r8  r2  rm   r!  r"  r9  rW   other_devicerr   r!   r!   r"   r   l  s    






	





zAndroidPlanRestoreView.postN)r%   r&   r'   AndroidPlanRestoreSerializerr)   r   r!   r!   r!   r"   rc  i  r   rc  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   Tr   zApple Plan Restore: rl   r  r?  r@  	isNewUserFrA  r  rB  rc   rC  r   rD  rE  rw   rF  z)>>>>>>>>>>>>Error in verify_apple_receiptrG  rH  rH   rK   z/>>>>>>>>>>>>>>>>>>>>>>>>>>>>>first>>>>>>>>>>>ifzG>>>>>>>>>>>>>>>>>>>>>>>>>>>>>No subscription found for this transactioniG  z*No subscription found for this transactionzC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Plan restored successfullyrd  rK  rI  
-createdAtz=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>not apple_transaction)r&  r"  r  r?  r@  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  r?  r@  r"  rf  z>>>>>>>>>>>>>>>>>>>>>>>>>>>ELSEr   rJ  z$Error in ApplePlanRestorePurchase - z!Error in ApplePlanRestorePurchaserM   rO   )*r)   rc   r   r+  r   r,  rs   r   r   rQ  rR  rh   r^   rj   rd   r   rL   rk   rS   rT   r&  r"  r  rS  re   rf   rT  r   r9   rU   rV   r?  r@  r   r   r5   rl   r   rg  r   ri   r   )r    rD   r   rc   rl   r  r?  r@  is_new_userrA  r"  r2  rm   rY  rZ  rr   r[  r\  apple_transactionplan_device_idrh  r!   r!   r"   r     s   




 














 






zApplePlanRestoreView.postN)r%   r&   r'   ApplePlanRestoreSerializerr)   r   r!   r!   r!   r"   rj    r   rj  c                   @   r   )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.>>>>>>>>>>>>rJ   rc   z)>>>>>>>>>>>>>>>>>>>>>>>>payload not foundzMissing message datarH   rK   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#  rl  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 >>>>>>>>>>>>>>>>>>>>>>>>>> rW   r5   Tr%  )      )r&  r"  r  r'  r   re  )r"     )r  r#  r/   r  FzWebhook handled successfully.z(Error in Android Notification >>>>>>>>>>rM   rO   r!   )-r   r,  rc   rs   rd   r   rL   rk   r   r   base64	b64decoder  intr   r.  r   r/  r0  r1  r2  r3  r   r9   rU   rV   rl   r5   r  r   r   rR   r5  r   rg  r'  r&  r"  r  r   re   rf   rh   r   rj   )r    rD   r   r   encoded_datarc   subscription_datar  r  r#  r8  r2  rm   r!  r"  r  ra  r:  r/   rW   new_txnr`  rl   existingrr   r!   r!   r"   r   W  s   












4zAndroidNotificationView.postNr   r!   r!   r!   r"   rq  V  r   rq  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_payloadTrM   zDecoding failed: )rx  urlsafe_b64decoder  rh   lenr   ri   
ValueError)r  padded_payloadfixed_payloadrr   r!   r!   r"   r    s&   r  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 signedPayloadrJ   zMissing signedPayloadrK   )p8keyIdissuerIdbundleId)signed_payload
server_apir   z!Invalid Apple transaction payloadzInvalid order IDzverify_apple_purchase error - zverify_apple_purchase errorTrM   z/Done done verification>>>>>>>>>>>>>>>>>>>>>>>>>r@  transactionIdr  r#  r!  r"  rO  rP  rN  rI  F)r@  r  device__isnullzAppleTransaction ---> zgetUserTransaction ---> )	r?  r#  r@  rN  r!  r"  rO  rP  r  z->>>>>>>>>>>>>>>>>>>>>>>>>if check_transactionz>>>>>>>>>>>>>>>>>>>>>>>>>else)r!  r"  rL  z1>>>>>>>>>>>>>>>>>>>>>>>>>EXPIRED>>>>>>>>>>>>>>>ifrt  )r&  r"  r  r@  r?  r   z3>>>>>>>>>>>>>>>>>>>>>>>>>EXPIRED>>>>>>>>>>>>>>>elsezPlan purchase successfullyrH   z!Error in AppleNotificationView - zError in AppleNotificationViewrO   r!   )"r   r,  rc   rs   rd   rL   rk   r   r   KEY_ID	BUNDLE_IDrf   rh   ri   rj   r   r   rT  r   r9   rV   r5  rl   rR   rg  r   r&  r"  r  r@  r?  r   re   r   )r    rD   r   r   r  json_tinfo_payloadrr   transaction_datar@  r?  r  r#  r!  r"  rO  transaction_reasonweb_order_line_item_idcheck_transactionget_user_transactioninsert_datarl   r!   r!   r"   r     s   

	
$













:zAppleNotificationView.postN)r%   r&   r'   r<  r   r!   r!   r!   r"   r    s    r  )@r1  r   rx  r   django.confr   django.shortcutsr   django.db.modelsr   r   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   r-   rt   CustomListAPIViewr   r   r   r   r   r   r   r   r   r  r  r  r  r  r>  rc  rj  rq  rj   r  r  r!   r!   r!   r"   <module>   sZ    $	0		<+	,
$_ b t