a
    fE                 	   @   s  d dl 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mZ d dl	mZ d dlmZ d dlT d dlmZmZ d dlmZmZmZ d dlmZ d dl m!Z! d dl"m#Z# d dl$m%Z% d dl&Z&d dl'm(Z( d dl)m*Z*m+Z+ d dl,Z,d dl-Z-d dl.Z.d dlm/Z/ d dl0m1Z1 d dlm2Z2 d dl3m4Z4 d dl5Z5d dl6Z6d dl3m7Z7 d dl8m9Z9 d dl:m;Z; d dl<Z<d dl=Z=d dl>m?Z? d dl@mAZA d dlBmCZC d dlDZDd d lEmFZF e&Gd!ZHeIeIeId"d#d$ZJeIeIeId%d&d'ZKG d(d) d)ejLZMG d*d+ d+ejLZNG d,d- d-ejLZOG d.d/ d/ejLZPG d0d1 d1ejLZQG d2d3 d3ejLZRG d4d5 d5ejLZSG d6d7 d7ejLZTG d8d9 d9ejLZUG d:d; d;ejLZVG d<d= d=ejLZWG d>d? d?ejLZXd@dA ZYG dBdC dCejLZZG dDdE dEejLZ[G dFdG dGejLZ\G dHdI dIejLZ]G dJdK dKej^Z_G dLdM dMej^Z`G dNdO dOejLZaG dPdQ dQejbZcG dRdS dSejLZdG dTdU dUejeZfG dVdW dWejbZgG dXdY dYejhZiG dZd[ d[ej^ZjG d\d] d]ejbZkG d^d_ d_ej^ZlG d`da daejbZmG dbdc dcejLZnG ddde deejeZoG dfdg dgejbZpG dhdi diejbZqG djdk dkejLZrG dldm dmej^ZsG dndo doej^ZtG dpdq dqejbZuG drds dsejbZve*dtge+e(gdudv Zwe*dtge+e(gdwdx Zxe*dtge+e(gdydz Zye*dtge+e(gd{d| Zze*dtge+e(gd}d~ Z{e*dtge+e(gdd Z|e*dtge+e(gdd Z}dd Z~e*dtge+e(gdd Ze*dtge+e(gdd ZG dd dejLZG dd dejeZG dd dejhZe*dtge+e(gdd ZeAde?je?je?je?jdde?je?jddddde*dtge+e(gdd Ze*dtge+e(gdd Ze*dtge+e(gdd Ze*dtgdd ZdS )    N)response)	Paginator)JsonResponse)reverse)defunct_hash_message)settingsWeb3)&construct_sign_and_send_raw_middleware)Account)encode_defunct)LocalAccount)*)renderHttpResponse)genericspermissionsserializers)Image)DjangoFilterBackend)Mnemonic)signing)IsAuthenticated)api_viewpermission_classes)redirect)
connection)geth_poa_middleware
TICKET_ABIwallet_pool)ContentFile)default_storage)openapi)swagger_auto_schema)timezone)askTvadjango)raw_strencryption_keyreturnc                 C   s   t j|d}|| S )Nsalt)r   Signersign_object)r)   r*   signer r1   /Users/christophesurbier/Dropbox/Mon Mac (MacBook-Air-de-christophe.local)/Documents/Programmation/SellTix/tixsellbackend/api/content.pyencrypt1   s    r3   )encoded_strr*   r+   c                 C   s@   t j|d}z|| W S  t jy:   td|  Y n0 d S )Nr,   zUnable to decode hash )r   r.   unsign_objectBadSignature
ValueError)r4   r*   r0   r1   r1   r2   decrypt7   s
    r8   c                   @   s   e Zd ZejgZdddZdS )findOrCreateUserNc              
   C   s   |j dkr|j}|d }d}ztjj|d}W nB typ } z*tjj|ddd}|  d}W Y d }~n
d }~0 0 dd	lm	} |
|}	d
t|ddj|t|	t|	jd}
t|
ddS tddS d S )NPOSTemailFr;    r;   isOrganizerstripeCustomerIdTr   RefreshTokenOKmany)statusrefUsercreatedrefreshaccesssafe  rF   )methoddataUserobjectsget	Exceptioncreate_usersaverest_framework_simplejwt.tokensrB   for_userUserSerializerstraccess_tokenr   r   )selfrequestformatrP   r;   rH   usererB   rI   jsonToReturnr1   r1   r2   postA   s(    

zfindOrCreateUser.post)N__name__
__module____qualname__r   r   r   rb   r1   r1   r1   r2   r9   ?   s   r9   c                   @   s   e Zd ZdddZdS )ticketCreatedNc           $   
   C   s  |j dkrt|j}|d }|d }|d }|d }|d }|d }	|d }
ztjj||d	}t }||_||_|	|_|
|_	d
|_
d| |_|  tttj}ddlm} ||}||}|jj||d}|j| }tjj|d}|D ]&}|d }|d }t|}ddd |D }d| }|d }||d}|d }dd l}|j|}d}|D ]X} t !d|| j"| j#j$j%| j&|f  | j&|krh| j#j$j%|krhd}t !d  qqht !d| |dkrt }!||!_||!_&t'||!_||!_(||!_)||!_*||!_+||!_,d
|!_
|!  qd|d}"t-|"ddW S  t.yp }# z t /|# t0d d!W  Y d }#~#S d }#~#0 0 n
t0d"d!S d S )#Nr:   transactionHashrG   walletticketContractrefTicketTypeamounttotalAmount)idZwalletAddress__icontains   zTransaction hash r   r   addressabi)rG      r=   c                 S   s   g | ]}d  |qS z{:02x}r^   .0vr1   r1   r2   
<listcomp>       z&ticketCreated.post.<locals>.<listcomp>0x   ether   Tz:====Ticket utilisateur %s %s Contrat %s Compare %d avec %dFu   === Trouve pas besoin de créerzNeedToCreate ?rC   rF   rH   rK     rN   rM   )1rO   rP   rQ   rR   rS   PaymentrG   refTicketType_id	nbTicketsrl   rF   
jsonStriperV   r	   HTTPProviderr   CONTRACT_NODE_URLtixsell.settingsr   to_checksum_addressethcontract	functionsfetchTicketsForOwnercallTicketfilter	bytearrayjoinfrom_weidatetimefromtimestamploggerinforn   rk   refEventrj   ticketIdrZ   	lastOwnerhashedTicket	pricePaid	createdAtrh   r   rT   errorr   )$r\   r]   r^   rP   rh   rG   ri   rj   rk   r   rm   r_   paymentw3r   checkedWalletAddresscheckedTicketAddressr   ticketsZuserTicketsZticketBlockchainr   r   resulthxstrfinalTicketCoder   
finalPriceZpurchasedDater   r   ZneedToCreateticketZ	newTicketra   r`   r1   r1   r2   rb   _   s    



"




"zticketCreated.post)Nrd   re   rf   rb   r1   r1   r1   r2   rg   ^   s   rg   c                   @   s   e Zd ZejgZdddZdS )getUserNonceNc           
   
   C   s   |j dkr|j}|d }| jj}dd l}|dd}z@tjj|j	d}||_
||_|  d|j	|d}t|d	d
W S  ty }	 z t|	 tddW  Y d }	~	S d }	~	0 0 n
tddS d S )Nr:   walletAddressr   i  '  rn   rC   )rF   rG   nonceFrK   r   rN   rM   )rO   rP   r]   r_   randomrandintrQ   rR   rS   rn   r   r   rV   r   rT   r   r   r   )
r\   r]   r^   rP   r   r_   r   r   ra   r`   r1   r1   r2   rb      s(    

"zgetUserNonce.post)Nrc   r1   r1   r1   r2   r      s   r   c                   @   s   e Zd ZdddZdS )stripeReturnAccountNc           	   
   C   s   |j dkr|j}|d }z^tjj|d}tj|j}t	
d t	
| t||_|d rl|d rld|_|  W n. ty } zt	
| W Y d }~n
d }~0 0 dd	i}t|d
dS tddS d S )Nr:   rG   user__id===On recoit de stripe details_submittedcharges_enabledTrF   rC   FrK   rM   rN   )rO   rP   SellerrR   rS   striper   retrievestripe_user_idr   r   jsondumpsstripe_account_jsonstripe_charges_enabledrV   rT   r   r   )	r\   r]   r^   rP   rG   merchantAccountaccountr`   ra   r1   r1   r2   rb      s$    


 zstripeReturnAccount.post)Nr   r1   r1   r1   r2   r      s   r   c                   @   s   e Zd ZejgZdddZdS )createStripeAccountLinkNc              
   C   s  |j dkr|j}|d }d }zrtjj|d}d| d }d| d }td|  td|  tjj	|j
||d	d
}	t|	 |	d }d}
W nR tjy   d}
Y n< ty } z$d}
t| tdd W Y d }~n
d }~0 0 |
|d}t|ddS tddS d S )Nr:   rG   r   'https://www.selltix.live/striperefresh//&https://www.selltix.live/stripereturn/Return url %srefresh_url url %saccount_onboardingr   refresh_url
return_urltypeurlrC   NOTFOUNDERRORr   rN   rF   linkFrK   rM   )rO   rP   r   rR   rS   r   r   r   AccountLinkcreater   rQ   DoesNotExistrT   r   r   r   )r\   r]   r^   rP   rG   r   seller_profiler   r   accountLinkrF   r`   ra   r1   r1   r2   rb      s<    


 zcreateStripeAccountLink.post)Nrc   r1   r1   r1   r2   r      s   r   c                   @   s   e Zd ZejgZdddZdS )createStripeAccountNc              
   C   sx  |j dkrj|j}|d }d }ztjj|d}t }||_tjj	ddddiddidd	}t
d
 t
| |d |_t||_|  dt|j d }	dt|j d }
t
d|
  t
d|	  tjj	|d |	|
dd}t
| |d }d}W nV tjy   d}Y n> tyR } z$d}t
| tdd W Y d }~n
d }~0 0 ||d}t|ddS tddS d S )Nr:   rG   r   FRexpress	requestedT)card_payments	transfers)countryr   capabilitiesr   rn   r   r   r   r   r   r   r   r   rC   r   r   r   rN   r   FrK   rM   )rO   rP   rQ   rR   rS   r   r_   r   r   r   r   r   r   r   r   r   rV   rZ   rn   r   r   rT   r   r   r   )r\   r]   r^   rP   rG   r   r_   r   r   r   r   r   rF   r`   ra   r1   r1   r2   rb     sT    




 zcreateStripeAccount.post)Nrc   r1   r1   r1   r2   r     s   r   c                   @   s   e Zd ZejgZdddZdS )checkPinWalletNc           
   
   C   s   |j dkr|j}|d }z\tjj|jjd}t|j|}t|j	|}t
d|  t
d|  d||d}t|dd	W S  ty }	 z*t|	 d
di}t|dd	W  Y d }	~	S d }	~	0 0 d S )Nr:   codePinr   zwords %sz
private %srC   )rF   words
privateKeyFrK   rF   KO)rO   rP   rQ   rR   rS   r_   rn   r8   r   r   printr   rT   r   r   )
r\   r]   r^   rP   r   r_   r   private_keyra   r`   r1   r1   r2   rb   L  s&    

zcheckPinWallet.post)Nrc   r1   r1   r1   r2   r   J  s   r   c                   @   s   e Zd ZdddZdS )sendLoginCodeNc                 C   s@  |j dkr<|j}|d }d }d}ztjj|d}W n2 tjyf   tjj|ddd}|  d}Y n0 tt	
dd	}tt	
dd	}|d
 | }	ttj}
d|jigd|	 d|	idgdditjd}|
jjjj|d}|jdkr$|	|_tj |_|  d}|rd}nd}||d}nd|jd}t|ddS d S )Nr:   r;   Fr<   r=   r>   Td   i  -z"SellTix - Votre code de connexion:Zcode_selltixtosubjectZdynamic_template_dataSellTix <contact@selltix.live>personalizationsfromZtemplate_idrequest_body   ZNEWUSERrC   r   r   rF   reasonrK   )rO   rP   rQ   rR   rS   r   rU   rV   rZ   r   r   sendgridSendGridAPIClientr   SENDGRID_API_KEYr;   TEMPLATE_ID_CODESELLTIXclientmailsendrb   status_codelastLoginCoder   nowlastLoginCodeDatebodyr   )r\   r]   r^   rP   r;   r_   rH   Znumber_part1Znumber_part2codesgr   rF   ra   r1   r1   r2   rb   g  sV    
zsendLoginCode.post)Nr   r1   r1   r1   r2   r   f  s   r   c                   @   s   e Zd ZdddZdS )checkLoginCodeNc              
   C   s*  |j dkr&|j}|d }|d }ztjj|d}td||jf  |j|krtj	 |j
  dk rddlm} ||}d	t|d
djt|t|jd}	t|	d
dW S ddd}	t|	d
dW S nddi}	t|	d
dW S W nD ty$ }
 z*t|
 ddi}	t|	d
dW  Y d }
~
S d }
~
0 0 d S )Nr:   r   r;   r<   z4=== On compare code recu %s avec code en base %s ===   r   rA   rC   FrD   rF   rG   rI   rJ   rK   r   zcode expiredr   rF   )rO   rP   rQ   rR   rS   r   r   r   r   r   r   total_secondsrW   rB   rX   rY   rZ   r[   r   rT   r   )r\   r]   r^   rP   r   r;   r_   rB   rI   ra   r`   r1   r1   r2   rb     s:    


zcheckLoginCode.post)Nr   r1   r1   r1   r2   r    s   r  c                   @   s   e Zd ZejgZdddZdS )userConnecteWalletFirstTimeNc              
   C   s  |j dkrz|j}|d }tjj|jjd}||_|  zddl	m
} dd l}tttj}td}	|	r|jjtdd td d	}
|
r| }|d u r|d
 qd}
q|dkrtj}tj}nZ|dkrtj}tj}nD|dkrtj}tj}n.|dkrtj}tj }n|dkr(tj!}tj"}td|  |#tj$}|#|}|j%j&|tj'd}|j%(|d}|j)*|#|+|||,dddd}|j%-|}|.d|i |j%j/j0||d}|j%1|j2}td |j%j3|dd}td t| |d }|dkrH|j)4|#|5 }td  t| ||_6|  |7| W n0 t8y } zt9| W Y d }~n
d }~0 0 d!t:|dd"jd#}t;|dd$W S  t8y } z*t9| dd%i}t;|dd$W  Y d }~S d }~0 0 d S )&Nr:   r   r   r   r    DEBUGlayeruD   ===On essaye recupere wallet pour créer smart contract organisateurT      ?Fwallet1wallet2wallet3wallet4wallet5===Wallet Address : rp   latest30gwei0r   r   gasPricegasr  r   z!waiting deploy organizer contract,  timeout4receipt with confirmed trx hash (after trx executed)rF   ro   z=== On a deployedrC   rD   rF   r_   rK   r   )<rO   rP   rQ   rR   rS   r_   rn   r   rV   r   r!   timer	   r   r   r   osgetenvmiddleware_onioninjectr   r   r   
get_walletsleepSELLTIX_WALLETSELLTIX_WALLET_PRIVATE_KEYSELLTIX_WALLET2SELLTIX_WALLET_PRIVATE_KEY2SELLTIX_WALLET3SELLTIX_WALLET_PRIVATE_KEY3SELLTIX_WALLET4SELLTIX_WALLET_PRIVATE_KEY4SELLTIX_WALLET5SELLTIX_WALLET_PRIVATE_KEY5r   ORGAFACTORY_ADDRESSr   r   ORGANISER_FACTORY_ABIget_transaction_countr   deployOrganizerContractbuild_transactionto_weiestimate_gasupdater   sign_transactionsend_raw_transactionrawTransactionwait_for_transaction_receiptZcontractForOrganizerr   organizerContractrelease_walletrT   r   rY   r   )r\   r]   r^   rP   r   r_   r!   r  web3r  
needToWaitwallet_from_poolADRESS_TO_USEPRIVATE_KEY_TO_USEZcheckedContractAddressr   r   r   transactionr  
signed_txnreceiptresultTxrF   ZsmartContractDeployedr`   ra   r1   r1   r2   rb     s    











 
z userConnecteWalletFirstTime.post)Nrc   r1   r1   r1   r2   r    s   r  c                   @   s   e Zd ZejgZdddZdS )createWalletNc              
   C   sV  |j dkrH|j}|d }|d }td}|jdd}|j||d}d }	d }
ztttj}|j	j
 }||j}
|j}	tjj|d}d	|_|	|_|	|_t|
|}||_t|||_d
t| }tt|td|_|  d}|t|ddjd}t|ddW S  t yD } z$d}t!"| t#ddW  Y d }~S d }~0 0 n
t#ddS d S )Nr:   r   rG   english   strength
passphraser   Tr   SECRET_PIN_KEYrC   FrD   r  rK   r   r   rN   rM   )$rO   rP   r   generateto_seedr	   r   r   r   r   r   r   to_hexkeyrq   rQ   rR   rS   generatedWalletr   	publicKeyr3   r   r   intrZ   r  r  pinCoderV   rY   r   rT   r   r   r   )r\   r]   r^   rP   r   rG   mnemor   seed
public_keyr   r   r   r_   encryptedPrivateKeytheCoderF   ra   r`   r1   r1   r2   rb   2  sD    

"zcreateWallet.post)Nrc   r1   r1   r1   r2   rE  0  s   rE  c                   @   s   e Zd ZejgZdddZdS )checkQRCodeNc                 C   s~  |j dkrp|j}|d }|d }d }td|  zdd l}ddlm} |d}	||	}
|
	d}td| |
d	}|d }|d
 }|d }|d }dd l}| }tdt|t|f  t|t| d }td|  |d
krddd}t|ddW S ||tj}||}|jj|td}|j| }|D ]}|d }t|}ddd |D }d| }||krLd}z`tjj| | d}|D ]>}|jrddd}t|dd  W   W S d|_|  qW n0 t y } zt| W Y d }~n
d }~0 0  q&qLW n0 t yX } zt!| W Y d }~n
d }~0 0 d|d}t|ddS t"d d!S d S )"Nr:   qrcoderj   zOn va decrypter %sr   r   asciiz	Valeur %sr   ro      rs   zCompare timestmap %f avec %d<   zDifference %fr   zQRCode trop ancien (>1 minute)rF   causeFrK   rp   r=   c                 S   s   g | ]}d  |qS rt   ru   rv   r1   r1   r2   ry     rz   z$checkQRCode.post.<locals>.<listcomp>r{   FOUND)ZlastOwner__iexactZhashedTicket__iexactu   Billet déjà scanné !TrC   )rF   valeurrM   rN   )#rO   rP   r   r   base64r<  r	   encode	b64decodedecodesplitr  floatr   r   r   r   r   r   r   r   r   r   r   r   r   r   rR   r   lowerscannedrV   rT   r   r   )r\   r]   r^   rP   ZqrCoderj   rb  rc  r	   ZconvertbytesZconvertedbytesZdecodedsamplexZwalletAddresr   r   Z
timeqrcoder  ts
differencera   r   r   r   r   
ticketCoder   r   r   r`   r1   r1   r2   rb   `  sv    






  zcheckQRCode.post)Nrc   r1   r1   r1   r2   rZ  ^  s   rZ  c                 C   s   t  }| j|dd | S )NZPNGru   )ioBytesIOrV   getvalue)imageZimg_byte_arrr1   r1   r2   get_bytes_value  s    rs  c                   @   s   e Zd ZdddZdS )createQRCodeNc              
   C   s  |j dkr|jd}|jd}z<dd l}ddlm} ||tj}d}d}	|	|}
|j
j|
td}|jt| }|	|}|jt| }|d	 }t|}d
dd |D }d| }dd l}|d | d t|  }|d}||}dd l}ddlm} |jd|jjddd}|| |jdd |j |dd}t!t"|ddW S  t#y } zHt$%| dd l&}|j'g d|j(d}|)d t!|ddW  Y d }~S d }~0 0 n2dd l&}|j'g d|j(d}|)d t!|ddS d S )NGETZticketAddresstokenIdr   r   Z*0xf4f50f5d16a91980e8534872a0faf7ce4773c52aZB0x3f37c414f762ddb08a5a604cc136bc9d6af37537f1429993c310fa83002ce901rp   rs   r=   c                 S   s   g | ]}d  |qS rt   ru   rv   r1   r1   r2   ry     rz   z$createQRCode.get.<locals>.<listcomp>r{   r   r\  )StyledPilImagero      r|   )versionZerror_correctionZbox_sizeborderT)Zfitz$static/assets/images/logoTixsell.png)Zimage_factoryZembeded_image_pathz	image/png)content_type)r   r   rs   )Zdtype   )*rO   ru  rS   rc  r<  r	   r   r   r   r   r   r   r   r   ZownerOfrS  r   r   r   r   r  rZ   rd  	b64encoder[  Zqrcode.image.styledpilrw  ZQRCode	constantsZERROR_CORRECT_LZadd_datamakeZ
make_imager   rs  rT   r   r   Znumpyzerosuint8fill)r\   r]   r^   rj   rv  rc  r	   r   callerr   r   r   ZownerAddressZcheckedOwnerAddressr   rn  r   r   r   r  ZqrCodeStringmessage_bytesZbase64QrCodeStringr[  rw  Zqrimgr`   npr1   r1   r2   rS     sX    






$
zcreateQRCode.get)N)rd   re   rf   rS   r1   r1   r1   r2   rt    s   rt  c                   @   s   e Zd ZejgZdddZdS )	sendMaticNc              
   C   s`  |j dkrRtjj| jjjd}|j}zddlm	} dd l
}tttj}td}tj}	|rr|jjtdd tj}
tj}d}d}|r| }|d u r|d	 q||krd
}q|d	 q||}||
}|j|d}d|jv r||jd d}n|dd}|j|||d}|||||jj||	d}|jj j!||d}|j"|j#}|jj$|dd}t%&d t%&| |d }|'| |dkrt()tj*}ddiddigd| dgddid}|j+j,j-j.|d}d|_/|0  ddi}ndd i}t1|d
d!W S  t2yN } z*t%&| dd i}t1|d
d!W  Y d }~S d }~0 0 n
t3d"d#S d S )$Nr:   r   r   r    r  r  r
  Tr	  Fr  rl   r}   z0.10)r   r   value)r   r   r  r  r  r   chainIdr  r  r  r  rF   ro   r;   zcsurbier@idevotion.frzrofar@mac.comz)SellTix - Envoi de 0.10 Matic sur wallet )r   r   r   )r   r   r   rC   r   rK   rM   rN   )4rO   rQ   rR   rS   r]   r_   rn   r   r   r!   r  r	   r   r   r   r  r  CHAIN_IDr   r!  r   r$  r%  r"  r#  r   r   r0  rP   r3  r4  	gas_pricer   r6  r7  r8  r9  r   r   r;  r   r   r   r   r   r   rb   	maticSentrV   r   rT   r   )r\   r]   r^   r_   r   r!   r  r   r  r  r?  r@  ZwalletToUser=  r>  ZcheckedTransferTOWalletAddressZcheckedFromWalletAddressr   rl   ZgasEstimateraw_transactionZ	signed_txrC  rD  rF   r   rP   r   ra   r`   r1   r1   r2   rb     s    







	
$zsendMatic.post)Nrc   r1   r1   r1   r2   r    s   r  c                   @   s   e Zd ZejgZdddZdS )verifySignatureNc              
   C   sx  |j dkrj|j}|d }|d }td||f  d }d }ztttj}tj	j
|| jjjd}	|	j}
d|
 }t|d}t| |jjj||d}td	| | f  | | krtd
 d}ddlm} ||	}ntd d}W n> ty6 } z$d}t| tdd W Y d }~n
d }~0 0 |rV|t|t|jd}nd|i}t|ddS tddS d S )Nr:   r   	signaturez"===On verifie signature %s pour %s)r   rn   z9Merci de signer ce message. Le code d'authentication est:)text)r  z===Compare %s avec %sz==Singature okrC   r   rA   z==Singature kor   r   rN   )rF   rI   rJ   rF   FrK   rM   )rO   rP   r   r   r	   r   r   r   rQ   rR   rS   r]   r_   rn   r   r   r   r   recover_messageri  rW   rB   rX   rT   r   r   rZ   r[   r   )r\   r]   r^   rP   r   r  Z
walletUsedrI   r   r_   r   ZmessageToSignmessage_hashrF   rB   r`   ra   r1   r1   r2   rb   X  sH    




 zverifySignature.post)Nrc   r1   r1   r1   r2   r  V  s   r  c                   @   s   e Zd ZdddZdS )r1  Nc           	   
   C   s   |j dkrz|j}|d }ztttj}i }W n< tyl } z$d}t| t	ddW  Y d }~S d }~0 0 t
|ddS t	ddS d S )	Nr:   r   r   r   rN   FrK   rM   )rO   rP   r	   r   r   r   rT   r   r   r   r   )	r\   r]   r^   rP   r   r   ra   r`   rF   r1   r1   r2   rb     s    

 zdeployOrganizerContract.post)Nr   r1   r1   r1   r2   r1    s   r1  c                   @   s8   e Zd ZejgZej Z	e
ZdZefZdZdd ZdS )UserListView)rn   r;   Nc                 C   s   | j j}tjj|jd}|S N)pkr]   r_   rQ   rR   r   rn   r\   r_   querysetr1   r1   r2   get_queryset  s    zUserListView.get_queryset)rd   re   rf   r   r   r   rQ   rR   allr  rY   serializer_classfilterset_fieldsr   filter_backendsswagger_schemar  r1   r1   r1   r2   r    s   
r  c                   @   s"   e Zd ZejgZej Z	e
ZdS )CreateTasksAPICreateViewN)rd   re   rf   r   r   r   TasksrR   r  r  TasksSerializerr  r1   r1   r1   r2   r    s   
r  c                   @   s   e Zd ZdddZdS )	UserLoginNc              
   C   s   |j dkr|j}|d }|d }zVtjj||d}ddlm} ||}dt|dd	jt	|t	|j
d
}	t|	ddW S  ty }
 z$d}t|
 tddW  Y d }
~
S d }
~
0 0 n
tddS d S )Nr:   usernamepassword)r  r  r   rA   rC   FrD   r  rK   r     rN   rM   )rO   rP   rQ   rR   rS   rW   rB   rX   rY   rZ   r[   r   rT   r   r   r   )r\   r]   r^   rP   r  r  r_   rB   rI   ra   r`   rF   r1   r1   r2   rb     s&    


"zUserLogin.post)Nr   r1   r1   r1   r2   r    s   r  c                   @   s8   e Zd ZejgZej Z	e
ZdZefZdZdd ZdS )UserDetailView)r;   r  Nc                 C   s   | j j}tjj|jd}|S r  r  r  r1   r1   r2   r    s    zUserDetailView.get_queryset)rd   re   rf   r   r   r   rQ   rR   r  r  FullUserSerializerr  r  r   r  r  r  r1   r1   r1   r2   r    s   
r  c                   @   s>   e Zd Zej dddZdZe	fZ
ddgZeZdS )EventListViewrefOrganiserrefCategoryrefEventPageTemplate)r  rF   	eventDateslugeventContractpaymentContractrF   r  N)rd   re   rf   EventrR   r  select_relatedr  r  r   r  ordering_fieldsEventSerializerr  r1   r1   r1   r2   r    s
   r  c                   @   s4   e Zd ZejgZej 	d	d	dZ
eZdS )EventCreateViewr  r  r  Nrd   re   rf   r   r   r   r  rR   r  r  r  r  r  r1   r1   r1   r2   r    s   r  c                   @   s4   e Zd ZejgZej 	d	d	dZ
eZdS )EventDetailViewr  r  r  Nr  r1   r1   r1   r2   r    s   r  c                   @   s,   e Zd Zej dddZeZ	dS )EventDetailByIdViewr  r  r  N)
rd   re   rf   r  rR   r  r  r  r  r  r1   r1   r1   r2   r    s   r  c                   @   s2   e Zd ZejgZej 	dZ
dZefZeZdS )EventPayeesListViewr   )r   N)rd   re   rf   r   r   r   EventPayeesrR   r  r  r  r  r   r  EventPayeesSerializerr  r1   r1   r1   r2   r    s
   r  c                   @   s(   e Zd ZejgZej 	dZ
eZdS )EventPayeesDetailViewr   N)rd   re   rf   r   r   r   r  rR   r  r  r  r  r  r1   r1   r1   r2   r    s   r  c                   @   s:   e Zd ZejgZej 	dZ
dZefZeZdd ZdS )ScanUsersListViewr_   r_   c                 C   s   | j j}tjj|jd}|S Nr  r]   r_   	ScanUsersrR   r   rn   r  r1   r1   r2   r     s    zScanUsersListView.get_querysetN)rd   re   rf   r   r   r   r  rR   r  r  r  r  r   r  ScanUsersSerializerr  r  r1   r1   r1   r2   r    s   r  c                   @   s0   e Zd ZejgZej 	dZ
eZdd ZdS )ScanUsersDetailViewr_   c                 C   s   | j j}tjj|jd}|S r  r  r  r1   r1   r2   r  	  s    z ScanUsersDetailView.get_querysetN)rd   re   rf   r   r   r   r  rR   r  r  r  r  r  r  r1   r1   r1   r2   r    s   r  c                   @   s&   e Zd Zej ddZeZ	dS )TicketTypeListViewr   refTicketTypeTemplateN
rd   re   rf   
TicketTyperR   r  r  r  TicketTypeSerializerr  r1   r1   r1   r2   r    s   r  c                   @   s.   e Zd ZejgZej 	d	dZ
eZdS )TicketTypeCreateViewr   r  Nrd   re   rf   r   r   r   r  rR   r  r  r  TicketTypeCreateSerializerr  r1   r1   r1   r2   r    s   r  c                   @   s.   e Zd ZejgZej 	d	dZ
eZdS )TicketTypeUpdateViewr   r  Nr  r1   r1   r1   r2   r    s   r  c                   @   s.   e Zd ZejgZej 	d	dZ
eZdS )TicketTypeDetailViewr   r  N)rd   re   rf   r   r   r   r  rR   r  r  r  r  r  r1   r1   r1   r2   r    s   r  c                   @   s&   e Zd Zej ddZeZ	dS )TicketTypeForEventViewr   r  Nr  r1   r1   r1   r2   r  #  s   r  c                   @   s6   e Zd ZejgZej 	d	dZ
eZdd ZdS )TicketAPIListViewrk   rG   c                 C   s.   | j j}tjj|ddddd}|S )Nro   )rG   rF   z
-createdAtrG   rk   r]   r_   r   rR   r   order_byr  r  r1   r1   r2   r  ,  s    zTicketAPIListView.get_querysetN)rd   re   rf   r   r   r   r   rR   r  r  r  TicketSerializerr  r  r1   r1   r1   r2   r  '  s   r  c                   @   s*   e Zd ZejgZeZdZe	fZ
dd ZdS )TicketSoldForEventAPIListView)ZrefTicketType__refEventc                 C   s,   | j j}tjj|dddd}|S )N)Z%refTicketType__refEvent__refOrganiserr   rG   rk   r  r  r1   r1   r2   r  9  s    z*TicketSoldForEventAPIListView.get_querysetN)rd   re   rf   r   r   r   TicketSoldSerializerr  r  r   r  r  r1   r1   r1   r2   r  2  s
   r  c                   @   s(   e Zd ZejgZej 	dZ
eZdS )TicketDetailViewrk   N)rd   re   rf   r   r   r   r   rR   r  r  r  r  r  r1   r1   r1   r2   r  ?  s   r  c                   @   s"   e Zd ZejgZej Z	e
ZdS )TicketTypeTemplateDetailViewN)rd   re   rf   r   r   r   TicketTypeTemplaterR   r  r  TicketTypeTemplateSerializerr  r1   r1   r1   r2   r  D  s   
r  r:   c           &   
   C   s  | j dkr| jd }| jd }| jd }| jd }| jd }| jd }tjt_| jd }| jd	 }| jd
 }	| jd }
| jd }zt }|d u rt	d ddd}t
|ddW S t	d|  tttj}td}|r|jjtdd |dkrtj}tj}n^|dkr&tj}tj}nF|dkr>tj}tj}n.|dkrVtj}tj}n|dkrltj}tj}t	d|  ||}||}t	d|  |jj|t d}|j!|d}t	d t"|  |j#$|t%|t%|&|||'d!d"d#d$}|j(|}|)d%|i |jj*j+||d&}|j,|j-}t	d'|.|/|j- |j0|}t	d(| |d) }t1| |d*kr6zd|d+ }t2j3j4|d,}| j5j6}t2j3j4|d,}|j7stj8j9|j:d-}t	d.|  |d/ |_7|;  t	d0t%|  t	d1|j7  t<  t=j3j4|	d,} tj>j9|j7d2d3}!tj?j9t%|| j@jAd4d5id6||jBjCt%|d7}"tD }#d|#_E|
|#_F|	|#_G|"|#_H|"d/ |#_It%|d+ |#_Jt%|d+ |#_K||#_L||#_M|#;  d8|"|#j6|!|j7d9}t	| d }t
|ddW W S  tNy2 }$ z.tO|$ dd:d}t
|ddW  Y d }$~$W S d }$~$0 0 ndd;d}t
|ddW S W nx tNy }$ z^tO|$ |r|t1| d<t"|$v rt"|$}%d|%d}n
dd=d}t
|ddW  Y d }$~$S d }$~$0 0 n
tPd>d?S d S )@Nr:   reservationIdrj   rl   rm   ticketTypeIddescriptionZfeesrefOrganizerrk   toUserr   z"===pas de wallet recuperer du poolr   zNo wallet availabler_  FrK   zwallet pool obtenu : r  r   r  r
  r  r  r  r  r  z===Contract Address : rp   r  z===nonce : 40r  r  r  r  r  z1preview trx hash (trx could be in pending status)r  rF   ro   r   r   r<   zon creer customer %srn   z0on va creer payment intent pour un montant de %dzet stripe customer %sz
2020-08-27)customerstripe_versionenabledT
on_session)rl   currencyautomatic_payment_methodssetup_future_usager  stripe_accountapplication_fee_amountrC   )rF   intent
refPaymentephemeralKeyr  u   Problème avec StripeZtransactionRejectedzexecution reverted	exception  rN   )QrO   rP   r   STRIPE_API_KEYr   api_keyr!   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   r0  rZ   r   createReservationrS  r2  r3  r4  r5  r   r6  r7  r8  rO  keccakr9  r;  rQ   rR   rS   r_   rn   r@   Customerr   r;   rV   r'   r  EphemeralKeyPaymentIntentr   r  sellerr   r   rF   
refUser_idr   r   paymentIntentrl   Z
feesSeltixr   
withWalletrT   r   r   )&r]   r  rj   rl   rm   r  r  Zselltix_feesr  rk   r  r   r>  newdictr<  r  r?  r@  r   r   r   r   rA  r  rB  rC  rD  rF   theOrganizerrG   ZtheUserr  
ticketTyper  r  r   r`   Zcausesr1   r1   r2   r  I  s    




























&



$r  c              
   C   s   | j dkr| jd }| jd }tjt_z<tjj|d}tj	j
||jjd}tjj|djdd W n. ty } zt| W Y d }~n
d }~0 0 d	|d
}td t| t|ddS tddS d S )Nr:   r  r  r   )payment_intentr  )r  r]  rN   rC   )rF   refundz
===Refund FrK   r  )rO   rP   r   r  r   r  rQ   rR   rS   Refundr   r  r   r   r5  rT   r   r   r   r   r   )r]   r  r  r  r  r`   r  r1   r1   r2   refundpaymentintent  s    


 


r  c           	   
   C   s   | j dkrdd l}dd l}dd l}zhd}|j |j|d }|j|tjdgddtj	dd	}t
d
 t
| d||dd}W n< ty } z$t
| dt|d}W Y d }~n
d }~0 0 t|ddS tddS d S )Nr:   r      )secondsZ
allow_joinr]  )expapikeyr   ry  HS256)payloadrP  	algorithmz	===Token rC   zutf-8rF   tokenr   rF   r   FrK   r  rN   )rO   jwtr   r   r   	timedeltard  r   VIDEO_RTC_API_KEYVIDEO_RTC_SECRET_KEYr   r   r   rf  rT   r   rZ   r   r   )	r]   r  r   r   Zexpiration_in_seconds
expirationr  r  r`   r1   r1   r2   getStreamingAuthToken  s.    



$r  c              
   C   s8  | j dkr*dd l}dd l}z| jd }| jd }| jd }| jd }| jd }| jd }| jd	 }	d
}
ddtj d}|||||||	d}tj|
||d}t	d t	|j
 |jdkrd||j
d}nd|j
d}W n> ty } z$t| dt|d}W Y d }~n
d }~0 0 t|ddS tddS d S )Nr:   r   r   userIduserNameis_ownerenable_screensharestart_video_offstart_audio_offhttps://api.daily.co/v1/rooms/application/jsonBearerzContent-TypeAuthorization)Z	room_nameuser_idZ	user_namer  r  r  r  headersr   z===Daily meeting token    rC   r  r   r  FrK   r  rN   )rO   r   r   rP   r   DAILY_API_KEYrequestsrb   r   r   r  r   loadsrT   r   rZ   r   r   )r]   r   r   r   r  r  r  r  r  r  r   r  r   r   r  r`   r1   r1   r2   requestDailyMeetingToken  sD    






	


$r   c                 C   s  | j dkrdd l}dd l}z4| jd }tjj|d}|j| jkrD|j	}ddl
m} ||j}||j|d |jdd }d}	d	d
tj d}
t|jdt| ddddddddddddddddddddd}tj|	|
|d}td t|j |jdkr6||jd |_|  d||jd}nd|jd}ntddW S W n> ty } z$t| dt|d}W Y d }~n
d }~0 0 t |ddS tddS d S )Nr:   r   r   r   )getEventDateToPArisTimeZone)minutesr~   r  r  r  r  privateTFrs   fr)r   Zeject_at_room_expZenable_people_uiZenable_pip_uiZenable_prejoin_uiZenable_noise_cancellation_uir  Zenable_video_processing_uiZenable_chatZowner_only_broadcastZenable_recordingZenable_advanced_chatZenable_hidden_participantsZenable_mesh_sfuZ!experimental_optimize_large_callsZenable_terse_loggingZsfu_switchoverZenable_adaptive_simulcastZenforce_unique_user_idslang)nameZprivacy
propertiesr  z===Daily Room r  r   rC   )rF   roomr   r  r  rN   rK   r  )!rO   r   r   rP   r  rR   rS   r  r_   durationbackoffice.helpersr!  r  r	  r   r  rZ   rn   rS  	timestampr  rb   r   r   r  r   r  streamingIdrV   r   rT   r   r   )r]   r   r   r   theEventr)  r!  ZtheDateZexpirationDater   r  r   r   r  r`   r1   r1   r2   createDailyRoom9  sj    




$r.  c              
   C   s   | j dk r| jd }| jd }tjt_ztjjt|dddid}t	  t
 }d|_||_||_|d	 |_t|d
 |_d|_|  d||jd}t| t|ddW S  ty } z*t| ddi}t|ddW  Y d}~S d}~0 0 n
tddS dS )z<
        Utiliser pour le paiement des billets offerts.
    r:   rl   rG   eurr  T)rl   r  r  r   rn   r   ro   rC   )rF   r  r  FrK   rF   r   Nr  rN   )rO   rP   r   r  r   r  r  r   rS  r'   r   rF   r  r   r  rl   r   rV   rn   r   r   r   rT   r   r   )r]   rl   rG   r  r   r  r`   r1   r1   r2   createpaymentintent  s6    




$r0  c           
      C   s   | j dkr| jd }| jd }| jd }| jd }| jd }| jd }|d u rt }||_d|_d	|_||_d
|_||_|	  n"tj
j|d}||_d|_|	  t }||_d	|_||_||_||_|j|_|	  ddi}	t|	ddS tddS d S )Nr:   r  r  rj   rk   r  r   ro   r   r
  r   rF   rC   FrK   r  rN   )rO   rP   r   r  rF   rl   r   r  r   rV   rR   rS   TicketToMintrefPayment_idr  r   r   )
r]   r  r  rj   rk   r  r   r   ZticketToMintr  r1   r1   r2   askMintTicket  s>    







r3  c                    sj   t d|   t @}||  dd |jD   fdd| D W  d    S 1 s\0    Y  d S )Nz==DOQUERY %sc                 S   s   g | ]}|d  qS )r   r1   )rw   colr1   r1   r2   ry     rz   zdoQuery.<locals>.<listcomp>c                    s   g | ]}t t |qS r1   )dictzip)rw   rowcolumnsr1   r2   ry     s   )r   r   r   cursorexecuter  fetchall)queryr:  r1   r8  r2   doQuery  s    


r>  c                 C   s0   | j dkr"dtjd}t|ddS tddS d S )Nr:   rC   )rF   r  FrK   r  rN   )rO   r   WEBRTC_API_KEYr   r   )r]   r  r1   r1   r2   getWebRtcApiKey   s    
r@  c                 C   s(  | j dkr| jd }| jd }td||f }d}d}d}|D ]h}z(||d 7 }||d 7 }||d 7 }W q@ ty } z"t| d}d}d}W Y d }~q@d }~0 0 q@td	| }	d}
|	D ]>}z|
|d
 7 }
W q ty } zd}
W Y d }~qd }~0 0 qd||||
d}t|ddS tddS d S )Nr:   refOrgar   aM  SELECT sum("amount") as amount,sum("feesSeltix") as feesseltix,sum("nbTickets") as nbtickets FROM "backoffice_payment" as bpy left join "backoffice_tickettype" as btt on btt.id= bpy."refTicketType_id" left join "backoffice_event" as be on be.id= btt."refEvent_id" where be."refOrganiser_id"='%s' and be."id"='%s' and bpy."status"='1'r   rl   Z	nbticketsZ
feesseltixzselect sum("maxTickets") as max from "backoffice_tickettype" as btt left join "backoffice_event" as be on be.id= btt."refEvent_id"where be."refOrganiser_id"='%s'maxrC   )rF   totalRevenutotalfeesSeltix
totalVente
maxTicketsFrK   r  rN   )rO   rP   r>  rT   r   r   r   r   )r]   rA  r   ZtotalPaymentrC  rE  rD  r   r`   ZqmaxZnbMaxTicketsrB  r  r1   r1   r2   getDashboard*  s>    


rG  c                   @   s   e Zd ZdddZdS )ScanUserLoginNc              
   C   s   |j dkr|j}|d }|d }zZtjj||d}ddlm} ||j}dt	|jdd	jt
|t
|jd
}	t|	ddW S  ty }
 z ddi}	t|	ddW  Y d }
~
S d }
~
0 0 n
tddS d S )Nr:   loginr  )rI  r  r   rA   rC   FrD   r  rK   rF   r   rM   rN   )rO   rP   r  rR   rS   rW   rB   rX   r_   rY   rZ   r[   r   rT   r   )r\   r]   r^   rP   r  r  scanrB   rI   ra   r`   r1   r1   r2   rb   Q  s&    
$zScanUserLogin.post)Nr   r1   r1   r1   r2   rH  P  s   rH  c                   @   s.   e Zd ZejgZej 	d	dZ
eZdS )InvitationAPICreateView	refTicketfromUserN)rd   re   rf   r   r   r   
InvitationrR   r  r  r  InvitationSerializerr  r1   r1   r1   r2   rK  k  s   rK  c                   @   s&   e Zd Zej ddZeZ	dS )InvitationAPIDetailViewrL  rM  N)
rd   re   rf   rN  rR   r  r  r  rO  r  r1   r1   r1   r2   rP  p  s   rP  c           
   
   C   s   | j dkrtd | jd }| jd }tj }|jddtj	tj
tjd}|jdd	d
| ddd}td t| z@tjj|d}d| }td| ||_|  d|d}W nF ty }	 z,t|	 t|	 dt|	d}W Y d }	~	n
d }	~	0 0 t|ddS tddS d S )Nr:   z==UPLOADVIDEOr   filenames3z	eu-west-3)Zregion_nameendpoint_urlZaws_access_key_idZaws_secret_access_keyZ
put_objectselltixzmedia/videos/)ZBucketKeyr  )ZClientMethodZParamsZ	ExpiresInz===Session url created r   zvideos/z==Enreigstre rC   )rF   ZurlToUploadr   r_  FrK   r  rN   )rO   r   r   rP   boto3sessionSessionr   r   AWS_S3_ENDPOINT_URLAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYZgenerate_presigned_urlr  rR   rS   recordedFilerV   rT   r   r   rZ   r   r   )
r]   r   rQ  rW  r   r   event	file_pathr  r`   r1   r1   r2   getUploadVideoUrlw  sD    




	



$r_  rb   string)r   r  )r   title)r   r'  )rO   r   c              
   C   sD  | j dkr6| jd }| jd }ztjj|d}d}dt|jj|dd}d	d	tj	d
}t
d t
| tj|||d}t
d t
|j |jrt|j}|d dkr|d }	|	d d }
|
|_|  d|
d}n
d|d}W n> ty( } z$t
| dt|d}W Y d }~n
d }~0 0 t|ddS tddS d S )Nr:   r   ra  r   z)https://api.bitmovin.com/v1/streams/videoZFIXED_RESOLUTIONSZcp0hopcd1q7m56d4cj1g)ZencodingProfileZassetUrlra  ZdomainRestrictionIdr  acceptzcontent-typez	X-Api-Key===== Envoi a Bitmovin)r   r  z===== reponse BitmovinrF   SUCCESSrP   r   rn   rC   )rF   recordedStreamingUrlr   r_  FrK   r  rN   )rO   rP   r  rR   rS   rZ   r\  r   r   BITMOVING_AKI_KEYr   r   r  rb   r  r   r  rf  rV   rT   r   r   r   )r]   r   ra  r]  r   r  r  r   responseJsonrP   ZresultIdr  r`   r1   r1   r2   sendToBitmovin  sD    







$ri  c              
   C   s   | j dkr| jd }zdd| }ddtjd}td tj||d}|jrvt	
|j}|d d	krldd
i}n
d|d}W n< ty } z$t| dt|d}W Y d }~n
d }~0 0 t|ddS tddS d S )Nr:   	refStreamz*https://api.bitmovin.com/v1/streams/video/r  rb  rd  )r  rF   re  rC   r   r_  FrK   r  rN   )rO   rP   r   rg  r   r   r  deleter  r   r  rT   r   rZ   r   r   )r]   rj  r   r  r   rh  r  r`   r1   r1   r2   deleteBitmovinStream  s(    




$rl  c              
   C   s  | j dkr|| jd }| jd }| jd }ztjj|d}d|_|  t }| j|_	||_
d|_d|_||_tjj|d}||_|  d	|_|  |jjj}| jj}d
t|j d }	ttj}
d|igd|||	ddgdditjd}|
jjjj|d}|j dkr*d	|_|  ddi}n
ddd}t!|ddW S  t"yz } z t#$| t%ddW  Y d }~S d }~0 0 d S )Nr:   r;   rL  r  r   r]  r=   FTz&https://www.selltix.live/billetoffert/r   u'   SellTix - Un billet vous a été offert)Z	eventnamer;   urlInvitationr   r   r   r   r   rF   rC   r   zSent email failedr_  rK   r  rN   )&rO   rP   r   rR   rS   rF   rV   rN  r_   rM  r  r   	emailSentr  r   rL  hasBeenOfferedrk   r   r&  r;   rZ   rn   r   r   r   r   TEMPLATE_ID_OFFRIRr   r   r   rb   r   r   rT   r   r   r   )r]   r;   rL  r  r   
invitationr   Z	eventNameZ
emailInvitrm  r   rP   r   r  r`   r1   r1   r2   sendInvitation  s^    






rr  c              
   C   sH  | j dkr:| jd }| jd }| jd }| jd }ztjj|d}|jrdddd	}t|d
dW S d}z2tjj|jd}|j	rd
}nd
}||_	|
  W n8 ty }	 z tjj|jd
dd}W Y d }	~	n
d }	~	0 0 |rtd}
|
jdd}|
j||d}d }d }tttj}|jj }||j}|j}d|_||_	||_t||}||_t|||_dt| }tt |t!"d|_#|
  t$ }d|_%d|_&||_'|
  ddl(m)} |*|}dt+|d
djt |t |j,d}t|d
dW S  ty, }	 z$t-.|	 dt |	d	}W Y d }	~	n
d }	~	0 0 t|d
dS t/ddS d S )Nr:   refInvitationr   r   metadatar   r   zInvitation already burnedr_  FrK   Tr<   r=   r>   rF  rG  rH  rJ  r   rL  r   ZoffrirTicketsrA   rC   rD   r  r  rN   )0rO   rP   rN  rR   rS   burnedr   rQ   r  r   rV   rT   rU   r   rM  rN  r	   r   r   r   r   r   r   rO  rP  rq   rQ  rR  r3   r   r   rS  rZ   r  r  rT  r  rF   actionrt  rW   rB   rX   rY   r[   r   r   r   )r]   rs  r   r   rt  rq  r  ZneedToCreateWalletr_   r`   rU  r   rV  rW  r   r   r   rX  rY  taskrB   rI   r1   r1   r2   invitationTransfert7  sr    




*


$rx  )r   urllibr   django.core.paginatorr   django.httpr   django.urlsr   eth_account.messagesr   tixsellr   r<  r	   web3.middlewarer
   eth_accountr   r   eth_account.signers.localr   api.serializersdjango.shortcutsr   r   rest_frameworkr   r   r   PILr   Zdjango_filters.rest_frameworkr   mnemonicr   django.corer   loggingZrest_framework.permissionsr   rest_framework.decoratorsr   r   r   r   ro  r   	django.dbr   r   r   r   r   r   r!   django.core.files.baser"   django.core.files.storager#   r  rV  drf_yasgr$   Zdrf_yasg.utilsr%   django.utilsr&   pytzr*  r'   	getLoggerr   rZ   r3   r8   ListAPIViewr9   rg   r   r   r   r   r   r   r  r  rE  rZ  rs  rt  r  r  r1  ListCreateAPIViewr  r  r  RetrieveUpdateDestroyAPIViewr  r  CreateAPIViewr  r  RetrieveAPIViewr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r.  r0  r3  r>  r@  rG  rH  rK  rP  r_  SchemaTYPE_OBJECTTYPE_STRINGri  rl  rr  rx  r1   r1   r1   r2   <module>   s
  
Z'6D(^.O;j0	 +Eh*
$/)<