From 76a1fb13bbea226e3d958e096d0d1286c93b2d81 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 7 Nov 2023 21:29:58 +0100 Subject: [PATCH] fixes for upgrades --- rowers/braintreestuff.py | 23 +++++++++---------- rowers/fakturoid.py | 31 +++++++++----------------- rowers/tests/testdata/testdata.tcx.gz | Bin 4001 -> 3999 bytes 3 files changed, 22 insertions(+), 32 deletions(-) diff --git a/rowers/braintreestuff.py b/rowers/braintreestuff.py index d0a0d49f..54eb336b 100644 --- a/rowers/braintreestuff.py +++ b/rowers/braintreestuff.py @@ -18,6 +18,7 @@ from rowers.tasks import ( from rowers.utils import myqueue import rowers.fakturoid as fakturoid from braintree.exceptions.invalid_signature_error import InvalidSignatureError +from braintree.exceptions.not_found_error import NotFoundError import time import sys, traceback @@ -73,8 +74,7 @@ def process_webhook(notification): subscription = notification.subscription rs = Rower.objects.filter(subscription_id=subscription.id) if rs.count() == 0: # pragma: no cover - with open('braintreewebhooks.log', 'a') as f: - f.write('Could not find rowers with subscription ID ' + + dologging('braintreewebhooks.log','Could not find rowers with subscription ID ' + subscription.id+'\n') return 0 r = rs[0] @@ -82,8 +82,7 @@ def process_webhook(notification): if result: dologging('braintreewebhooks.log','Subscription canceled {id}'.format(id=subscription.id)) return subscription.id - with open('braintreewebhooks.log', 'a') as f: # pragma: no cover - f.write('Could not cancel Subscription: ' + + dologging('braintreewebhooks.log','Could not cancel Subscription: ' + str(subscription.id)+'\n') return 0 # pragma: no cover if notification.kind == 'subscription_charged_unsuccessfully': @@ -112,21 +111,17 @@ def send_invoice(subscription): return 0 else: r = rs[0] - with open('braintreewebhooks.log', 'a') as f: - f.write('Rower '+str(r)+'\n') + dologging('braintreewebhooks.log','Rower '+str(r)+'\n') fakturoid_contact_id = fakturoid.get_contacts(r) - with open('braintreewebhooks.log', 'a') as f: - f.write('Fakturoid Contact ID '+str(fakturoid_contact_id)+'\n') + dologging('braintreewebhooks.log','Fakturoid Contact ID '+str(fakturoid_contact_id)+'\n') if not fakturoid_contact_id: # pragma: no cover fakturoid_contact_id = fakturoid.create_contact(r) - with open('braintreewebhooks.log', 'a') as f: - f.write('Created Fakturoid Contact ID ' + + dologging('braintreewebhooks.log','Created Fakturoid Contact ID ' + str(fakturoid_contact_id)+'\n') transactions = subscription.transactions if transactions: amount = transactions[0].amount - with open('braintreewebhooks.log', 'a') as f: - f.write('Transaction amount '+str(amount)+'\n') + dologging('braintreewebhooks.log','Transaction amount '+str(amount)+'\n') id = fakturoid.create_invoice(r, amount, subscription_id, dosend=True, contact_id=fakturoid_contact_id) return id @@ -261,6 +256,10 @@ def update_subscription(rower, data, method='up'): rower.subscription_id, gatewaydata ) + except NotFoundError: + rower.subscription_id = None + rower.save() + return create_subscription(rower, data) except BaseException as e: # pragma: no cover exc_type, exc_value, exc_traceback = sys.exc_info() dologging('braintree.log','Payment failed with error') diff --git a/rowers/fakturoid.py b/rowers/fakturoid.py index f025a319..116021bb 100644 --- a/rowers/fakturoid.py +++ b/rowers/fakturoid.py @@ -2,6 +2,7 @@ import requests import json from requests.auth import HTTPBasicAuth import urllib.parse +from rowers.utils import dologging from rowsandall_app.settings import ( FAKTUROID_EMAIL, FAKTUROID_API_KEY, @@ -27,19 +28,16 @@ headers = { def get_contacts(rower): res = requests.get(contacts_url, auth=auth, headers=headers) url = contacts_search_url+'?query='+urllib.parse.quote(rower.user.email) - with open('braintreewebhooks.log', 'a') as f: - f.write('Searching Contact url :'+str(url)+'\n') + dologging('braintreewebhooks.log','Searching Contact url :'+str(url)) res = requests.get(url, auth=auth, headers=headers) - with open('braintreewebhooks.log', 'a') as f: - f.write('Searching Contact Status code '+str(res.status_code)+'\n') + dologging('braintreewebhooks.log','Searching Contact Status code '+str(res.status_code)+'\n') if res.status_code != 200: # pragma: no cover return None - with open('braintreewebhooks.log', 'a') as f: - f.write('Status Code '+json.dumps(res.json())+'\n') + dologging('braintreewebhooks.log','Status Code '+json.dumps(res.json())+'\n') if len(res.json()) >= 1: r = res.json()[0] @@ -69,20 +67,17 @@ def create_contact(rower): "web": "" } - with open('braintreewebhooks.log', 'a') as f: - f.write('Creating fakturoid contact for '+str(rower.user.email)+'\n') + dologging('braintreewebhooks.log','Creating fakturoid contact for '+str(rower.user.email)+'\n') res = requests.post(contacts_url, data=json.dumps( post_data), auth=auth, headers=headers) - with open('braintreewebhooks.log', 'a') as f: - f.write('Status Code '+str(res.status_code)+'\n') + dologging('braintreewebhooks.log','Status Code '+str(res.status_code)+'\n') if res.status_code not in [200, 201]: # pragma: no cover return 0 - with open('braintreewebhooks.log', 'a') as f: - f.write('Contact ID'+str(res.json()['id'])+'\n') + dologging('braintreewebhooks.log','Contact ID'+str(res.json()['id'])+'\n') return res.json()['id'] @@ -98,8 +93,7 @@ def create_invoice(rower, amount, braintreeid, dosend=True, if not name: name = 'Rowsandall Subscription' - with open('braintreewebhooks.log', 'a') as f: - f.write('Creating invoice for contact iD '+str(contact_id)+'\n') + dologging('braintreewebhooks.log','Creating invoice for contact iD '+str(contact_id)+'\n') if not contact_id: # pragma: no cover return 0 @@ -123,8 +117,7 @@ def create_invoice(rower, amount, braintreeid, dosend=True, res = requests.post(invoices_url, data=json.dumps( post_data), auth=auth, headers=headers) - with open('braintreewebhooks.log', 'a') as f: - f.write('Invoice Created - status code '+str(res.status_code)+'\n') + dologging('braintreewebhooks.log','Invoice Created - status code '+str(res.status_code)+'\n') if res.status_code not in [200, 201]: # pragma: no cover return 0 @@ -141,8 +134,7 @@ def create_invoice(rower, amount, braintreeid, dosend=True, res = requests.post(urlpay, auth=auth, headers=headers) - with open('braintreewebhooks.log', 'a') as f: - f.write('Invoice Set to paid - status code ' + + dologging('braintreewebhooks.log','Invoice Set to paid - status code ' + str(res.status_code)+'\n') if res.status_code not in [200, 201]: # pragma: no cover @@ -151,8 +143,7 @@ def create_invoice(rower, amount, braintreeid, dosend=True, if dosend: res = requests.post(urlsend, auth=auth, headers=headers) - with open('braintreewebhooks.log', 'a') as f: - f.write('Invoice Sent - status code '+str(res.status_code)+'\n') + dologging('braintreewebhooks.log','Invoice Sent - status code '+str(res.status_code)+'\n') return id diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 9b4213f201cb64b901dc1daba4968f7fa4a1d8a0..ce4576afd640d7915dc5e96c8248cac8d98c8c4d 100644 GIT binary patch literal 3999 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 F0RZgUE{p&G literal 4001 zcmV;S4_@#eiwFqxluBg+|8!+@bYx+4VJ>uIcmVC4TW=dT7J%RLD-1uh4~tUg!o!Q} zx@eOwHbBxX+MwIF#ne_E?b@;-O)mZSOG>HZBp$TK-XS;x<{_{~bJKit$aClM*KaQ` z4qh)e+tt{c`i9>$_jO?eZY)yxx9w__FV>j~0tJ zZ{C>mZgaU>o71byMf!4k`f_>MZ5MYRzIaWC`%@fsZ~wwszB%nzuUGx=-@WaZ>wJT^ zPVjcS`rr(2*j#PS7X*NdU!FhvX?Kb*R_krwtxuQfsO{=#f8J+Tr(M7MwfDM#1N~92 z$-Ld3{rQ1^@A}8x#nooD+%8_@pYQ)$*Prh9U*22_|JtPn0p0h|{ck)xd311a{O$py zpOHVl-|+jvPuEwQ{;R`(_Ai&4!~K`(>!)WY1n9m1`GVjD@{z?Oawa|gF1vpF!*cU{wSLtv|J~pE5$QBPcNedgCuq|}_J6*=!s3og-1_=?_jYyp>hk|| z1LE$ufjcg7>+7fM-K*OFezJQjmWk}mmfH{VY?&VL31NPW`@e5d+^o*e)2%K0mse*e z&%5=j?jlkAVC(I@yVL)EaQC|{*H^1`e|vNOBE18D;a%MA_TiBqy%J*V@N2R=;DH2g zQy~8dg*}P85q$7~;g09K+u>&P+J17`7eD;+muG@I$MBEOn9ljHuJ4oB#N);OuaB>} zNEiM1=iPma`9-)3ua-K4NzyJ>K^@uPG_dCfT@iP36>(1x5nNDkr=&L(SISAon;M?#@=kJtld#;x*i3NqJ|O4R>D=cT2l*-YK}-V5lH>d;oW> zihF>HxJ%-mgi52$d*dd;y)JnVToHF~f(NJ3=bbBQ#xc!@yRV14fbjvXM&7*`nF#mF z#`%iuIAIgPMh*8MCGGb)$$O}XyE6_5GqWb)N*(XTU1S2bhe^*EY{r6s5Jn`1C5O?D+`BHw|y<^Sq!*BCoRN8K7vy zW=5lZO)@Xmq-P7HA&)p2-M&R>hsitR1%oC^%Y;Sk`8koV$ezy@8e7#o&x|Hcggmx+ z{%-P|b8i`tG@hLFqLj?Kwyyc@MqmXw7BZ^Aqqb=&aZ8AR&`CaaG#tO4)o_9rSX=g=V zDk2|D;;zcTv}G$Q1)9u{LEfTC8mA*w%hRI0Ze>PQ)M6_l&&E4ll-9;rGACzFg`w&8)0cU%CM4ZnCG)my z)^%*Pw4;#sMpzfI5h+W)`S3;{Zxd{T-m0>$#WnKxC2uPtPbPR>b(MIWOnkn{{4jYj zmQYn)C82CxUF(544*6gRQPnv?V%ZuS-*o#i$Rn7D#2W9d18ljs)0cTj{Ubc989`#F)XX|#_95Q8Q@@0f~KQTrC3AA@|(y$u*NeQ%wmqPe$o zB43d`Pu7q_R?YK5lgYj1RzE*T-W#+?s?pw2QG0$yy+8K}+10bp{=Pq)K(oTQ0XKzGwoe(`V^7kcQk#29nuosml$D=K& z;XNo1uW5M0LD+fYiU($T6ig1KR+j#uSvrbHeLudK0NPSNx%K9=J|^3`6Ry_NmXOx zy=xVf_at9YlvbhvCQyy`!A(ZDZ{FJh@^S=dywZo~W6@Q}XC?De5qWDYh)U)I6kUsY zRx7r4B=Xi!`lljKMc1*(^`|W}V+8U(=i#aP;YBXGj*ZwEbw90%d^EvfRLOkd zY%JUQ-i|@ul5wJ|u8M`TvF5ZcZADSqB)`H+-QKyPR^6P)SLDgD!B8a7`I}{LSK<9 zM`BL6hoC}F(9qwr|7kVjy~~|%UDS>D2#iHj?jM34Dnl<7p_kk+1#|=N4HW zRp^78jMP_#o?SiYlbvP*fmNZ8zNnfvrvV=;LeFWgCs57x2w^hlYa8%ul6q$tkW_O$ zV%c(=Iicr@(8sLdN1fD{UA3^G9|wKzgz8w8nT2V_Y8w6w&`TchRUunMp`y|HIjMOS z8Fw5Ec?>EIA6@h2-PgDa^`K89js z(ffp6*F+;{a}`C;4gDzSqls4O(jjm~jXP@IyfM%xWj&&<>;@@2{+rZK9=#anwdkpA ztF$>uJye7~7!gu6z(z_Ip>OD??b7kNGp2PSD&vllf*=!VpMz~#`a$&8u-CQE$qQpl zrgKuW>xa>MLqURW!1qwJupXP5HwJo40<0{!Lkc*Vj=0#;G6&JKL8t4Qg%pb}Tso@( zpDIG{3|P`-!HH)!dDNK4(}8>gwxR%C=LXrsj=;o{a!Toz%N9 znE@YLg4Q5{M z@U0jSW#N@Ym`uFBwq)#zg0?nkY)CPx&=a+}e){MIOjIshjFzcr z%ad8&tT}Rr(eGL&dX<`I#Wt7D^c}gomWk+fbG?(vBxtp?%mMUa*D?`wOWvUM(u}*Q z+w~#0Otd1Xa^%|3s&DR#K2(H0~Xc@UvFT4u5Wg@0+I`jc2(@>?Uc?0NUZkY&(QD@gjYH67>K+h(C(wpa@ z>~hA?dg+XU-evSrW!HP;qBVEWjJr|LN8?eMhwrIu2?n&F?HK5hazhoR)N|Pq3}`{y zQP4|ns6slaw^B562Tjcz1${6q7<5uEu4t-8Q}aeaPsz9=WorfRTyx}3-K7(A%S6zw zY3se8%v?_`Xgi2L7g;l?!Z$wnX4lUEeKeA+JDt==KN-88nwmF+p2>){y6{ba(Cqpd zpqE^D1v>Ot6n$PQs15idpbrKZb^Y)|PTrpgdTQRhA@q4AYrvpG&v7#7+xqpx=-C7z zUF0skC?z%g+=-&09|65Ho^4dQbb`Z@E}dDSmx|EGyrwPaq~2rE0pGV0j4{v)8D}x5 zvUEZyT50LPa$iY|6GD-FMvEFFQ} zO4fj0<;aaFlX2-l>zg--ez%gfZk@YGWrMcR=K4|4`&@maM9+RQt6R3Yeh__L$(oT= z-n?ji(drv&ee*^^&$~s;RmNSE*jBfkxHm7Oce(INiQdJcQr{Y-j)Okt!YiF!9|N@J zX%qM6CG@+Mtd)_w7_oK6o&kDm(oC;f0EGZrkKFsB_hX@dxAl(=$BSp(_05OxulnWo zuy}TA!bFeV5ML?cc6M<^6HT-@NKyUTto@ zCf{6NU#w2MKK=BY7vtvKpPVdx_wB3I#o5iz{W-ml>Cjsb=iQd)-G9<0v$Np#=TCQA ztN@AunnxOuc6o&Weny6KZ2mlw-!yG$JNr+1I;)_om6>(=K_pPYR6eP*-!bHDwE z^cH{r>hjlRx-)<;0QUbMFK&IYfAYJ>bn