
    xh                     l   % S SK JrJrJrJr  S SKrS SKJr  S SKJ	r	  S SK
Jr  SSKJr  SSKJrJrJrJrJrJrJrJrJrJrJr  S	rS
\R6                   3SSS.r\\\\4      r \\!S'   \"\\#\-  \\#\-     -  4   r$\\!S'   \" S\	S9r%S\$S\ 4S jr& S*S\S\$\ -  S-  S\4S jjr'S\S\"S\4S jr( S*S\S\\\%      S\"\\$4   S-  S\\\%   S4   4S jjr)S\\\   S4   4S jr*S\\\   S4   4S jr+S\\\   S4   4S jr,S\S\4S jr-S \S!\S"\S\4S# jr.S!\S"\4S$ jr/S%\S&\S\4S' jr0S(\S\4S) jr1g)+    )AsyncGeneratorType	TypeAliasTypeVarN)settings)	BaseModel)Organization   )StripeResourceNotFound)CustomerPortalSessionPricePriceListResponseProductExpandedPrice ProductExpandedPriceListResponseSessionStripeListResponseSubscriptionSubscriptionExpandCustomer"SubscriptionExpandCustomerResponsezhttps://api.stripe.com/v1zBearer z!application/x-www-form-urlencodedz2025-03-31.basil)AuthorizationzContent-TypezStripe-VersionAIOTupleParamsAIODictParamsT)bounddatareturnc                     / nU R                  5        H`  u  p#[        U[        5      (       a*  U H"  nUR                  U S3[	        U5      45        M$     MD  UR                  U[	        U5      45        Mb     U$ )zEAccept {foo: [1,2]} format and convert aio-friendly to list of tuplesz[])items
isinstancelistappendstr)r   paramskeyvalueitems        /code/apps/stripe/client.pyparam_helperr)   $   si    Fjjl
eT""#bz3t956  MM3E
+, # M    endpointr$   c                   #    [        U[        5      (       a  [        U5      n[        R                  " S0 [
        R                  D6 ISh  vN nUR                  [         SU  3[        US9 ISh  vN nUR                  S:w  am  UR                  5       I Sh  vN nUR                  S:X  a
  [        5       e[        SUR                   SUR                  S0 5      R                  S	S
5       35      eUR                  5       I Sh  vN sSSS5      ISh  vN   sSSS5      ISh  vN   $  N N N N, N N! , ISh  vN  (       d  f       O= fSSS5      ISh  vN    g! , ISh  vN  (       d  f       g= f7f)z%Makes GET requests to the Stripe API.N/)headersr$      i  Stripe API Error:  - errormessageUnknown error )r    dictr)   aiohttpClientSessionr   AIOHTTP_CONFIGget
STRIPE_URLHEADERSstatusjsonr   	Exceptiontext)r+   r$   sessionresponse
error_datas        r(   
stripe_getrD   0   s:    
 &$f%$$?x'>'>??7;;l!H:&  
 
#%#+==?2
??c)022((9Z^^GUW=X=\=\]fhw=x<yz  "(
 
 
 @??
 3 )
 @
 
 
 @?????s   A	F D.F #E&2D03E&6$D:D2A,D:D4D:E&D6E&F (D8)F 0E&2D:4D:6E&8F :E	 EE	E&F E" F &E=,E/-E=9F c                   #    [         R                  " S
0 [        R                  D6 ISh  vN nUR	                  [
         SU  3[        US9 ISh  vN nUR                  S:w  aS  UR                  5       I Sh  vN n[        SUR                   SUR                  S0 5      R                  SS	5       35      eUR                  5       I Sh  vN sSSS5      ISh  vN   sSSS5      ISh  vN   $  N N N} N, N N! , ISh  vN  (       d  f       O= fSSS5      ISh  vN    g! , ISh  vN  (       d  f       g= f7f)z<Makes POST requests to the Stripe API. Returns response textNr-   )r.   r   r/   r0   r1   r2   r3   r4   r5   )r7   r8   r   r9   postr;   r<   r=   r>   r?   r:   r@   )r+   r   rA   rB   rC   s        r(   stripe_postrG   F   s    $$?x'>'>??7<<l!H:&d   
 
#%#+==?2
((9Z^^GUW=X=\=\]fhw=x<yz  "(
 
 
 @??
 3 )
 @
 
 
 @?????s   )EC4E#D,C6D,$D :C8;AD C:D D,C<D,"E.C>/E6D,8D :D <D,>E D	D	D	D,E%D(&E,E2D53E?Eresponse_modelc                h  #    SnSnU(       a  UR                  5       O0 nSUS'   U(       a  U(       a  XES'   [        XS9I Sh  vN nUR                  U5      nUR                  nU(       a*  UR                  (       a  UR                  S   R
                  nUR                  7v   U(       a  M  gg Nl7f)a  
Generic function to handle paginated GET requests to the Stripe API.

Args:
    endpoint: The Stripe API endpoint (e.g., "products", "subscriptions").
    response_model: The Pydantic model for the *entire* response (including has_more and data).
    params:  Initial query parameters.  These will be *updated* with pagination parameters.

Yields:
    Lists of the data objects from each page.
TNd   limitstarting_after)r$   )copyrD   model_validate_jsonhas_morer   id)r+   rH   r$   rP   rL   local_paramsresultrB   s           r(   _paginated_stripe_getrT   T   s     " H!%N$*6;;=LL
-;)*!(@@!55f=$$%]]2.11Nmm ( As   AB2B0A(B2.B2c                 `   #    SS/S.n [        S[        U 5        Sh  vN nU7v   M   N
 g7f)z9Yield each page of products with associated default pricetruezdata.default_price)activeexpandproductsN)rT   r   r$   pages     r(   list_productsr\   x   s;     +?*@AF+4f d 
 s   .,*,.,.c                 ^   #    SS/0n [        S[        U 5        Sh  vN nU7v   M   N
 g7f)z:Yield each subscription with associated price and customerrX   zdata.customersubscriptionsN)rT   r   rZ   s     r(   list_subscriptionsr_      s<      )*F+;V d 
 s   -+)+-+-c                 R   #    [        S[        5        Sh  vN n U 7v   M   N
 g7f)zYield each pricepricesN)rT   r   )r[   s    r(   list_pricesrb      s$     +H6GH d
Hs   '%#%'%'organizationc           	      4  #    [        SU R                  U R                  U R                  U R                  [
        R                  S.5      I Sh  vN n[        R                  " U5      nUR                  U l	        U R                  S/S9I Sh  vN   U$  NE N7f)zb
Create a Stripe customer for the given organization, saving the customer ID
to the organization.
	customers)nameemailzmetadata[organization_id]zmetadata[organization_slug]zmetadata[region]Nstripe_customer_id)update_fields)rG   rf   rg   rQ   slugr   STRIPE_REGIONr   rO   rh   asave)rc   rB   customers      r(   create_customerrn      s     
 ! %%!'')5+7+<+< ( 6 6	
	 	H ++H5H&.kkL#


,@+A

BBBO	 Cs$   ABB>BBBBprice_idcustomer_idorganization_slugc                    #    [         R                  R                  5       nSU SSUSSSSUS-   U-   S-   US-   S	.n[        S
U5      I S h  vN n[        R
                  " U5      $  N7f)Ncardr
   subscriptionTautor-   z7/settings/subscription?session_id={CHECKOUT_SESSION_ID} )zpayment_method_types[]zline_items[][price]zline_items[][quantity]moderm   zautomatic_tax[enabled]zcustomer_update[address]zcustomer_update[name]ztax_id_collection[enabled]success_url
cancel_urlzcheckout/sessions)r   GLITCHTIP_URLgeturlrG   r   rO   )ro   rp   rq   domainr$   rB   s         r(   create_sessionr}      s      ##**,F"('"#"&$*!'&*

 DD rkF  !!4f==H&&x00 >s   AA'
A%A'c                    #    [         R                  R                  5       nU US-   U-   S-   S.n[        SU5      I S h  vN n[        R
                  " U5      $  N7f)Nr-   z3/settings/subscription?billing_portal_redirect=true)rm   
return_urlzbilling_portal/sessions)r   rz   r{   rG   r   rO   )rp   rq   r|   r$   rB   s        r(   create_portal_sessionr      sk     ##**,F

 @@F !!:FCCH,,X66 Ds   <AAArm   pricec                 j   #    XS.n[        SU5      I S h  vN n[        R                  " U5      $  N7f)N)rm   zitems[][price]r^   )rG   r   rO   )rm   r   r$   rB   s       r(   create_subscriptionr      s2     "<F &99H++H55 :s   313rQ   c                 f   #    [        SU -   5      I S h  vN n[        R                  " U5      $  N7f)Nzsubscriptions/)rD   r   rO   )rQ   rB   s     r(   fetch_subscriptionr      s.      02 566H++H55 7s   1/1)N)2typingr   r   r   r   r7   django.confr   pydanticr   apps.organizations_ext.modelsr	   
exceptionsr   schemar   r   r   r   r   r   r   r   r   r   r   r;   STRIPE_SECRET_KEYr<   r!   tupler#   r   __annotations__r6   intr   r   r)   rD   rG   rT   r\   r_   rb   rn   r}   r   r   r   r5   r*   r(   <module>r      s   ; ;     6 .    )
x99:;7( !sCx1	 1S3YcCi%@ @Ay ACy!	} 	 	 59))N*T1) 	),) )4 )C )" /3!!+A./! m#$t+! DGTM"	!H^D1E,F,LM .	#$d*# >$u+t*;<   *11 #18;110
7S 
7S 
76 6C 6L 66 6 6r*   