From 16e6fff422d5d829f9059d16c6e36fe8e12e2697 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 19 Dec 2024 16:32:38 +0100 Subject: [PATCH 1/3] restoring export settings with idoklad --- rowers/templates/rower_exportsettings.html | 7 ++++++- rowers/views/userviews.py | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/rowers/templates/rower_exportsettings.html b/rowers/templates/rower_exportsettings.html index 56c82066..21e91159 100644 --- a/rowers/templates/rower_exportsettings.html +++ b/rowers/templates/rower_exportsettings.html @@ -208,7 +208,12 @@
  • {% endif %} - + {% if user.is_staff %} +
  • +

    Admin

    +

    iDoklad authorize

    +
  • + {% endif %} diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index 61f2a9c9..7378c1ac 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -1,4 +1,3 @@ - from rowers.views.statements import * from rowers.rower_rules import user_is_not_basic, user_is_coachee From b58dacb863a68e6ff8f68eefbda1310808a505bf Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 26 Dec 2024 12:49:29 +0100 Subject: [PATCH 2/3] sending invoices --- rowers/braintreestuff.py | 2 ++ rowers/idoklad.py | 24 ++++++++++++++++++ rowers/tasks.py | 16 ++++++++++++ .../paymentconfirmationemail_noinvoice.html | 12 +++++++++ rowers/tests/testdata/testdata.tcx.gz | Bin 3999 -> 3999 bytes rowers/views/paymentviews.py | 5 +++- 6 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 rowers/templates/paymentconfirmationemail_noinvoice.html diff --git a/rowers/braintreestuff.py b/rowers/braintreestuff.py index df39ecd6..64ba63b9 100644 --- a/rowers/braintreestuff.py +++ b/rowers/braintreestuff.py @@ -328,6 +328,8 @@ def update_subscription(rower, data, method='up'): '%Y-%m-%d'), method) + _ = idoklad.create_invoice(rower, amount, result.subscription.id, dosend=True) + return True, amount else: # pragma: no cover errors = result.errors.for_object("subscription") diff --git a/rowers/idoklad.py b/rowers/idoklad.py index 2f74ac86..48c7d0a0 100644 --- a/rowers/idoklad.py +++ b/rowers/idoklad.py @@ -14,6 +14,13 @@ contacts_url = 'https://api.idoklad.cz/v3/Contacts' invoice_url = 'https://api.idoklad.cz/v3/IssuedInvoices' email_url = 'https://api.idoklad.cz/v3/Mails/IssuedInvoice/Send' +from rowers.tasks import handle_send_email_noinvoice + +from rowers.utils import myqueue + +import django_rq +queuehigh = django_rq.get_queue('high') + from rowers.models import iDokladToken #idoklad_countries = json.loads(open('rowers/idoklad_countries.json').read())["Data"]["Items"] @@ -86,6 +93,7 @@ def get_contacts(rower): return None # pragma def create_contact(rower): + print("idoklad create contact", rower) token = idoklad_token() if token is None: return None @@ -118,6 +126,14 @@ def create_contact(rower): res = requests.post(contacts_url, json=data, headers=headers) if res.status_code not in [200, 201]: + dologging('idoklad.log','Contact Created - reason '+str(res.reason)+'\n') + _ = myqueue.enqueue( + queuehigh, handle_send_email_noinvoice, + rower.user.email, + rower.user.first_name, + rower.user.last_name, + 'idoklad Contact creation failed for '+str(rower.user.email)+'\n'+str(res.text) + ) return 0 id = res.json()['Data']['Id'] @@ -199,6 +215,14 @@ def create_invoice(rower, amount, braintreeid, dosend=True, contact_id=None, nam dologging('idoklad.log','Invoice Sent - status code '+str(res.status_code)+'\n') if res.status_code not in [200, 201]: dologging('idoklad.log','Invoice Sent - reason '+str(res.text)+'\n') + _ = myqueue.enqueue( + queuehigh, handle_send_email_noinvoice, + rower.user.email, + rower.user.first_name, + rower.user.last_name, + 'idoklad Invoice sending failed for '+str(rower.user.email)+'\n'+str(res.text) + ) + return id diff --git a/rowers/tasks.py b/rowers/tasks.py index 8b4aca87..0382f924 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -1796,6 +1796,22 @@ def sigdig(value, digits=3): fmtstr = "%.0f" return fmtstr % (round(value, places)) +@app.task +def handle_send_email_noinvoice( + useremail, userfirstname, userlastname, reason, **kwargs): + + subject = "Reason" + + from_email = 'Rowsandall ' + d = { + 'name': userfirstname+' '+userlastname, + 'siteurl': siteurl, + 'reason': reason, + } + + _ = send_template_email(from_email, support@rowsandall.com, subject, + 'paymentconfirmationemail_noinvoice.html', + d, **kwargs) @app.task def handle_send_email_alert( diff --git a/rowers/templates/paymentconfirmationemail_noinvoice.html b/rowers/templates/paymentconfirmationemail_noinvoice.html new file mode 100644 index 00000000..88609383 --- /dev/null +++ b/rowers/templates/paymentconfirmationemail_noinvoice.html @@ -0,0 +1,12 @@ +{% extends "emailbase.html" %} + +{% block body %} +

    Dear Admin,

    + + +

    {{ name }}: {{ reason }}.

    + +

    + Best Regards, the Rowsandall Team +

    +{% endblock %} diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 476371d61f3e8e746883e08ee1e0ef82559d1515..bb91d107f419a7dab1a42f54f0ff17d5830c5f2f 100644 GIT binary patch delta 257 zcmV+c0sj7GkU5<>k-)ExnKF&?^t;!NpZ42sxO}uDI@OA07VuEVJ4Ex!e9r zdW)aEKK)~v?hN1_!0!Kp#g#91Pk#HD4)1JHuh!`~JWME;7mw1@_#<8V@Xr4LG+{nz H#DD<+61k9x delta 257 zcmV+c0sj7kX|?&{?(IrcJ{@=P;C27%?BdF6 z^5FdZWOdZ_>8D@57?SXD=pI)y{US9s(-_rY-4!!blK5Ti~{U=>AI}5IGe*Sv5 z)jDnV@@c>AhRa9$#rY3jq?(f7$>COP|0qp)iSX}vH_vE*a>F~}L^=h4-!^4DfdGRPcjX%<*5AXaBWlcoc H#DD<+?cJZS diff --git a/rowers/views/paymentviews.py b/rowers/views/paymentviews.py index 241091c1..e2dbe64c 100644 --- a/rowers/views/paymentviews.py +++ b/rowers/views/paymentviews.py @@ -58,7 +58,10 @@ def process_idokladcallback(request): t.acces_token = result['access_token'], t.refresh_token = result['refresh_token'] t.expires_in = result['expires_in'] - t.id_token = result['id_token'] + try: + t.id_token = result['id_token'] + except KeyError: + pass t.save() except iDokladToken.DoesNotExist: t = iDokladToken( From 4c382759321b70f9df8f2991eda61c5f284a0d78 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 26 Dec 2024 13:15:37 +0100 Subject: [PATCH 3/3] idoklad tested --- rowers/idoklad.py | 1 - rowers/tests/testdata/testdata.tcx.gz | Bin 3999 -> 4000 bytes 2 files changed, 1 deletion(-) diff --git a/rowers/idoklad.py b/rowers/idoklad.py index 48c7d0a0..4c301573 100644 --- a/rowers/idoklad.py +++ b/rowers/idoklad.py @@ -93,7 +93,6 @@ def get_contacts(rower): return None # pragma def create_contact(rower): - print("idoklad create contact", rower) token = idoklad_token() if token is None: return None diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index bb91d107f419a7dab1a42f54f0ff17d5830c5f2f..016a22f25d6de66d25f81921de91e4e1039bd51a 100644 GIT binary patch delta 3913 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 delta 3912 zcmV-O54Z53AD-%@nz}>wc5APhjxad~v)%y71a@{X49(8^9N4Ht-rJdKC`*&aU{rUc4@%HUo zbKG5=uGZ%0>~xX7+#J1Ho_3qX^@lIs(B0iB_PclAaFz#0{p!uCfB*Ble!0#!c;y7| zHmlFh@RrTl#qojwaPj-o6(`TPr?|ITZ~AV1v`j~BR{Oj2J~@%_7XjFl2mvvFKR>(Z z@8A7r|7v-0clTxb`ti#{0(AF4?h(8|-nY0<&O}EX;co!@00)b-)5ravbmx1|`|hHD zu{vGezx!9mUS232`r@qbPV!;Tmq%yomzzUjf3Wy!>!$-At#)tF(`EXxn{=P~UcT7) zY44Bt4iUq_;_}m{9Udf6>yDRy|5&EG|F!FvKb@a$U(NpgdHN-nn;)-#T6X>Bm*vIN z)%tb6{C9ulN2JsI)}6dw9->Vb+5P$H3X5wlapmi$-MiK4>(l?!4T!tu2Clipm9HPK zx36md{&4$NEECzwEmt4p%Vm1NhlKet?*6_)@nUs+oNjH|zdCz)__SMpzwS;F#m}~0 z-Mc&b?`LD zI=ouy3?@mtSOs-tgVVr&o*#5Y+{snMJwZfpLBXAp-c*o#xH)&KOWv(i#N8QURE_d! zh~R?U<7~J)TM_q|I+_5U|0V?7yiF*<% zjW+L%n+W&1@1Y{@&Nv{@=yg$w>htrFcZ7-*JBfx_=cYv{OP+5*p6Vh`)lBiU56P4h zohgSXC4Dz+=Ognh6_K|lCZ%2_^CTt|Brh`}A1flC%sD|0s_={}YR9|zkhiWL@(9LR zB$do3tRY|6cNb?wo+={m3_6_?2c0iD&s%7t{V3#vi6mAN zo`tNQ1lqEl(2pvjARvlR*fT+^&Vk~LT&xyPZ6_HPRIuojr zuOOC;(pj3(Xpa?A^Bfou3qdkjZ2VOJJlPyc$ z&WLe;$(FD7Ns2~?~E4=nkX$37PaT+M7|<>K3iyPRr5SEnm7^i*yj1`$#c%V zWkAw+a?*=ZGV9v9=C>b(ycl2zDw!858nJ2Q$06@cND_}4@{XI#-;g}lLmt6MfS_uU z;kl^H`=;BELY@s<6xBQ*xTuEbo6L_w-WiN2Dw&Uewy5{E$^1Cvx4E~f7HGC?Mdhu? zWAot+kAnX`GH!El-Q~x|JDKQH!mJJR9$HQCb^g$()=yk*}x5hI8(% z^N503DFT2)$Qj*zNXPW8bA!1_`G8(T1D+!e0~h_IrlbT(Dc1^mWt-y&WU_~ zMfN;dLk?Lr&kIc^_m*4z{2+O6&?2cudq+j>`5BRSR1x{yIe}Qy-`;sHI?vCEd_}r_ z($+YlYSl6qxJ7AaKwb=hsJfiH$Sq1c{n4Ji5z%!*^w7xPlzc_Hy#>QwRGu7;SH1L-2GJLz4gfwj4cCm^5n&TcW~~oRK|WQGDJ8W06slljGCd zVkbhrHXmN7hrD2}rB$tI;iYK({G4RICJj&6cp=pI@Vs*+{r0n(=PR=3ll*cdRgI1J zu2odtkbFf^T8RdjKsDM2HyPc&d2a{E%RZp-N*|t&MOPu8mCQ>;@|H}b>eqj71l*NpaoLQ#8uPNRLOhdh$87NaKXI&f?=AqUx3sT+!7@=j6ThR1bNA+#8EEo}5s2jY^?LeiZU- zkaRsTLnyjx*__DNG|!WmAQ&}&8JHnr(aa2*(LC=fA|H$-nb%ZWM4%?~Q;*fjKBKWr zs?3at+{jNoVw1>QL+PK2JQZEXCfA>~%#0Dp`<#cT>W3G(=sGrHXVm?)Ci2k)hfyW- zg|o42>w7x}c}vELuDU7~&c>S4y0jHVX_Nd4D|LJ4iduDZB43dw#|A@xkwBAgAH6R+ z+Pk(E^%&%LxwpD`K7^uH-JHl*EqR4fvKOgC1MI z>p}Fv2ojPCeNqj1B1V0GllnpQxt%E?>(Dz})V7m0*N=kU8Y`&s;UaixQh!7AR1tcg zTV#1up$~2{QePQ*cJ-i7cA5YZUg zQqA>Rk0x5BONYP}HSVZ+^Tt4*l=X-lt{(+Gp@~GGO3-4O&YEV; zhd+$on!w8H8)i3|rfDrpXBfRV-U_QUe70rRxuI5bHwOBgVJWDquV*RSPKBD9Hwt<- z0vL5t@4{pTd~69?gXo>Hs9Vbr*~g-d)2P|?qo9w5B3hk>AIgSrxOwx&KyNAc&(eAG zIL4;tO@F|Dw_-q)g;y3~GV%J_lCdia+S;VCA;qXdPt@l6>7y4gQMqt2TBf3ryXM0m z2R)nUkaXxRPiA?u=ExmJzipZ5Rcf9U+gv)+cjRtcCZgBP^-d;}pw-ec2hfLY%S6yE zd4twVGw!Bt*N5CP(TbqTk!wS%zPTy-P!al&J80>Dx@y>1HhjZvz#juWqG1-Nl6rx% z%hmIY)I6vNz1_A}P^o!RxQ)`B>g#Pq=)EDU4B84qQE#4Y1O6E32@Db=tI%7R%-V*{ zn>UPpTVzeDczv=6T9Ne(q~7JO8c~PdQBmWrb=4RLeaKSpbpyWV$w+-0@CVT|njox; z*GsT}MK$~uv>gY%H4YI~T{R@y=FOYFBbUALOjZ@Nb>JqGs?pTELG;N^vkrAxIu2bM z@TZ=em(a5j%1#;$dYVoNMr)%qjNTawInh#so@STG;*UtdG7$U8j=b>ffPQCCd7?FD(a0S%HE$I3!LVS^NxitDsTxhq8wEWj(>vXXA^{Uk-PMwl+^HZCyIuDegyQ+c(zgH(g_Yrx^!lRUMfN#^P0AxlX{Ou z2Yla3FvdVHWSqsI%F+p;Xr=9~(6^eqVf2!#Z-Oc#H^icqwznGaTQ8kq^dYZltBc%4 zD7x6$tTg;uvUCKtD_H}2l_NKzOva@Ht#95S`t3^Ax^?a%l?~cLo9jnG?{oEkjS@Zk z$*gYK=K4YOc_nK`QhD>D^+l_1sP)Yo1wC&UF;^LPQDR%&a^l{+jNawKDuu z?(EL=@i*qrm!DRg46+&;2cby^rb8D-Y+x zmZ#l+(j~LA;OghEcU!H~W-p)i+itjgv|pV6;6=LW!(W#t%Wktw9P+0RkM7ES9X#pQ z$B!Q!{`@Sn+5WlP{!4m`pS?c)W0~#@;2yy4|AWPqFLqCU`zY*DY)={Y=1D3=$H W($n}OUHb6O{{S>$K54`QfB^vP+x6!F