From 044696ffce43480332fcf8d32f58ec96369477ff Mon Sep 17 00:00:00 2001 From: benarc Date: Wed, 17 Jan 2024 12:22:26 +0000 Subject: [PATCH] Adding qrcodes --- __pycache__/__init__.cpython-39.pyc | Bin 998 -> 1045 bytes __pycache__/crud.cpython-39.pyc | Bin 2642 -> 2915 bytes __pycache__/lnurl.cpython-39.pyc | Bin 2245 -> 2336 bytes __pycache__/migrations.cpython-39.pyc | Bin 1232 -> 1251 bytes __pycache__/models.cpython-39.pyc | Bin 1410 -> 1270 bytes __pycache__/tasks.cpython-39.pyc | Bin 1247 -> 1282 bytes __pycache__/views.cpython-39.pyc | Bin 2158 -> 2256 bytes __pycache__/views_api.cpython-39.pyc | Bin 3272 -> 3679 bytes crud.py | 16 +++-- lnurl.py | 5 +- models.py | 8 +-- templates/myextension/index.html | 86 ++++++++++++++++++------- templates/myextension/myextension.html | 50 +++++++++++++- views_api.py | 21 +++++- 14 files changed, 143 insertions(+), 43 deletions(-) diff --git a/__pycache__/__init__.cpython-39.pyc b/__pycache__/__init__.cpython-39.pyc index 4eb254d00399c82fea3cce1c521b96f1287b4da1..467dbcca859d1a73d84a176b8723a8e0b66c6fe0 100644 GIT binary patch delta 213 zcmaFHK9z$vk(ZZ?fq{X+h-GQ&-Hp5=j8Xil6(#Yxm8lgasd>ej`FT}5`bfMeZr@5* zn3N{dEw+N9)U?csTP!7s>BYDBkyOT~R+Ll;BkP@<$mpjjiljupBsI4nC$S{8xQK;; zfng;>5f1|cg!tt=`68o^3bNw(_{_Y_lK6PNg34PWND`BUna(oGZGOna!pO)303(Y^ AwEzGB delta 166 zcmbQr@r<1}k(ZZ?fq{YH{_5V;Z5w$-7###tD@x)^QgaJZD@s!HiZk=`s#x_w{3w=? z)Z7A1rdwRc)Z!u*1_p+e x3`IN)3=ra%&E!vvI$~f|@$s2?nI-Y@dIgoYctIkQotVxt%5N56W?^Jx1^`XHHk|+f diff --git a/__pycache__/crud.cpython-39.pyc b/__pycache__/crud.cpython-39.pyc index 2e195a0b467b8cecc6cc958ddd18294ee4ed2155..78b148c45943d6c5f1775669919ec4b988efb84f 100644 GIT binary patch delta 1862 zcmca4@>q;7k(ZZ?fq{XcW%KgXbgqefGK{w-YOB;Uq%h~O<+4X{FfydDq_F02=5j@G zf!S<1+_^kaJh{A4yo?Mf3@Pk6e7XEl{9ramjzF$plpvVRoFfF$pDLWnlggXIIfprg zD}}p-B}yb!I8`u}DV0}}A%$lSa|&+?Ukgi=Xex86a4KV}up~nolZ_-ps$eQ3SPB0e z<`jVx!4{S%u~gwy-V~uZOew-CA}uUY;;F(ZqF}yQig*i4lthYXFoUMV#6KnhnvA#D zQuC7YQ&L|tGB7Y`GTvfJNz!DxCF)$1npl$RTj^R+lA2eXnV;v9Sdw^)8%Y49H77qk zJ+(-a@fLefYGG+=amnN&#%ApU2ADr95G0MDKq63OMGcj z&MgkGf`Y`#TfATv+&~tvy+u+WQ<;nM%cHo8^2;4_Q}a?%Q^4^8AtXRiDZ;?OAP)*) zP@FO_iZHS;vM};7N-#=TG8Ta(HJNX5l_%!pq?W{IrWAt>E#hZjU`S>HWlAV!V_;wa zVQ^GUnB2?~np4B#!Vqgx%UZ%#!qLfe2*~p#sXQ3vaO$<(C&nag?Oy76j#&7h`p;0J_68Kyf4nax^0s zBbzW2D58Y^b20NVaxh9TN--9hOs;2^nf!hwQ&@7?a@nKU85vTTQ&@92ayg?o zbGf3p7#UI+QrL31b9th8z-;y$-dw&YJ}{djhd);!N|2EuRVbA+l`DmF4s!}u3U>=j zlyIt0DpM+#Btr_%9HtcB6uuUgD3Mg=RH0PHR3S-*G$u)gRK8S3unPV;%z7yTDS|C5 zQKG3rsa#+!LMg&6EKy>qLMb9(zG#YA3rm!EibybnrubwoMiZx(j0_A6nvA!YQj#>8 zZt*!6r6!i7hNR{exFnV&-eLiaTQrxs~4-eM0*Ei6qfE&&Oq<|XH+q)zT* zY}RP!Qh)+azhKv(5Cu=a5PyY|)ZBv9ijvg4;>`R!JrHlQ4O619hF@xVPNhOJ*sc_? zs>vIfL$tc;rD&0lA5R zQDkxgs|f2Y=AzWX$(5|~j0+~uWDTt^VOzjn!+w1Bo&+-u?Cb}Xn>1jh%2^K7VH|LP{oUq*s36T zhgSh&EIjjw^RpGHgWZ%_lA2pw#6CHTQqxIl<6k(ZZ?fq{Xc?9lR5W`T`-HjMTBxs|CEC8>GEnfZC~sTC!fjJNpHQ%mBJ zgf$s&@g*0fCYGeeXXcgVXC|jsDd{H`Wa^h0>gVK@7Uk#{Bv$HIBk73GOsTDsL=w#a&#ISW;RXKY1;q7!Mzk%E>1fOH4%k@)eN86w>lb^HNqa-C~32 zy2VzMnpm8l_e%*$(c~nib)wuz0xKDc6d4#8emP8*W7a{InC!cL)@LvqICnXHp|)R6@Y*tRlyOn%08 WhB0ok2dm2D>+BO5Stn<5!~g(iS(8U00AigH!ExzQU z)Wnk1_{_Yr{LJLkD(T6MjKX{%$@t8a+A1LsYw`w0eO7ib>osEu2d`hg0+^G>B*`ib zW=&>V$HxL7yW(8?E{ltPy{W3%SoV?Pa9Q}gC zO8w*{{c4cD%`cdjGBT=8?qk(bS3p%(o>`KSQj}N@Q3!UGI7rLnx2%&`Ar9$g+sf!Z V*^&JWW9(!;j;)L=laFx3003RASz!PG diff --git a/__pycache__/migrations.cpython-39.pyc b/__pycache__/migrations.cpython-39.pyc index 57756e277b6a68c1c018c5527f0b6127216297e0..eb1535d8612abca8b4387fe5bc9fed6f79d3b527 100644 GIT binary patch delta 217 zcmcb>`IwV8k(ZZ?fq{XcjbUl(+KIdi7(Y#1CnlO(nOaejnpd2epQo3bn3-3Sn3R(` z@!CU1*U38=b-0nFC%<6q)sEs)fC5LK5Z54u5Jx8;R|Okg%f!fFutF-PE4pIHMbzOq9ir1I5R&_55${z^C6?% r^!%Znii% diff --git a/__pycache__/models.cpython-39.pyc b/__pycache__/models.cpython-39.pyc index 40cedbde36f5435a1726e3793ac916d4b3ccf12c..8830466963493093a5c6d96526e63429233dc571 100644 GIT binary patch delta 234 zcmZqT{>I6h$ji&cz`($8;n1?w$cenNj0F?5^Vw3kgBdh=CT`d+B=3 zvm`?*O9~T=J$V|FwjfND9WHu`Ns)&e*`^On8+k;K1(q@ANboQsK_(`~B5?)=20u-K e$){OrCi}1|3Gp#7Fz_%6fRr)uF!C@7umb=NnK&N+ delta 331 zcmeyy*~HD8$ji&cz`(%pzI#Gy)I?rc#)gU7`C{%2DcmVMEet6&w z6Blgf=5sDeO)NTn~8ZkAwTWz;|xiDD~B%`Nauxy4$NUy_(}iw{ZlWOHU`VWHB3l*E!$WV1K7F-I~2 E0Js`25dZ)H delta 102 zcmZqTy3fg%$ji&cz`(%ZwX!$$9qUFuRYp#Z^wg60lGNOS$cNRGxPJ}Q!7eti69FUrRJri z7Nr(xGT!1(Pc4Z@lAC;lv4lqqS-_UbhS6bi6_XA(vgj%%RX#!eYGk2nOvOCXzLl;p zdnfxbYiP?LsnADa>t&SW=2VFx3r+4}R^Z`7QZsoYa}y7Wtrjfy;%fT2iFui6sl_EI U)^BcSacAV^MK*Br71miy04bXzR;!`V1Zt;RyMX7lysYR(pnvAzN z(o;*~L4uQSGM2FNgISSGHjI{&r!ncUfVpRxRN1-ot3m8Z%*CuCA*s0qlk1r^tocAf z`XE9tqa-({iXY6@&rQtBOiL{;(XZmsD^E>=aWz?sL>L$tZn1+jO#a8*#0oLKhs9n% Y9-#?r&*n!g?u=|~VDmPcvCU!v0B&tb-~a#s diff --git a/__pycache__/views_api.cpython-39.pyc b/__pycache__/views_api.cpython-39.pyc index 848aa24e55841f0c1d313d188b0e431db5d82155..a2ad3213922a49e408ddaf33b94862ac38d11c03 100644 GIT binary patch delta 1343 zcmX>hd0&Pvk(ZZ?fq{X6@7}W1M4^d%GK?2CYI8EyXQ`)%r7~t|qzLvhrLv|H0RU$=d4s(ihiVRqdUaDM{eu_XU zW0nDmS!$^gDYA2zQsh$P!RicCB6pIez)QIeWhoSB~& zpIT9($$CpDxhOTUBsCsM=9W-tK?;UgN@`9jnmYdU)Djep0%!uonvAzZoxv9PR=QTO zL#>`H#{61>8_C8ZIR*v>F!9S}vJi`o9g>`WS!QZ^aeQJyrd~niEiRj!%;J*d{M-UN zLk0$h&!Bj#Qb{bxM0UsIJeKr&0W`s4bp{58VsJ#WaWS$m3Ni9A7HKdrFjUFuCl+Mt zml^7pq~;bB>sKRL9-o;~tI1R(&A`BLiw{*inHgj^6tgfeFo5u3kR4hK3=Acf3^j~3 z49!fQ3@HpA47JQP%*9G2j3rE2%qfg1OubA^j5W*)SQat_GiWmV{gMU+4=i+cvdZgg zvKEPh!h{1vFoCS+^z#pick>VRb19N%U|`T>0lTV56QqE5vIM)V5t92%LGIuIIgV9; zk%f_ok?lVlbCDiMAM-7il*E!mu*S)XtdqoxK<+Kl28DzovNP_nitC8_<(DW_=9d;J zAj#-~^=fh!!5vqm%fP@eS%FQRMIXcvWS5r^Lks?RNSbnm zAT63KMIs=N$btw}5CQfhbCLdJISyGh48tIaHUi{JP_Q$wh%pwKOrFW6Ik|#8h8ymo zB7@2I*~L{rt}8+q4N5pgVxTbP^7D^(_V){M^$VHI&#s8+Xh@<@n(V_N&1Mb?A+^c5 z9OCjwAq`3)dYX*4n9@^=K%uV5QlvR~4##~qh$AL9a%u`$g1pO8WDN2bh+Skgc@L+p zG}u|(AVHAZZn5Mg=B5_eg7|imMYwdOz)=fP4-!-a5e^{2adI@59%IGiE-rmGcaYiU zoA-0EF*2G?KF00gSmX*)1B&Zg%mt+-MWDdG#Zr)8Tyl%uImp#9#MPz91mt@*i0_I( x9=pYynO6c%SViuWy?E3Z(~aIYlBxvW2yoF-kX8E=w;(AeAvoKSi*YDU~%<3aU~fMQRRHigbz$Se-$t+yX-s zvp^=v&S6TCOOXewFan#T05^#(MKMK{Cq=23DMdMrDOD%cI8`UrBt>NoONwfW8d!^I z3R5tHrurnNm!TXbsksI5sTC!fthcz6i&7IyQsY5Fx426SQV^V!)SOh93`cru2}BJi zj8&}3c#F>&tUDw%w_tKU^J_sCkTFGa3=9ll;+O5@A{HG3kf459W@>qHd}2YSUP0w8 zE}NXp;*#Y2+yXm&1_p-Dpx~^MO)SU++cEhLOS%syj90AAz`#%p4sjMPMixdPMn1+O z4F(2=Dslb9f=vA~Lw%41#roACDn2u%R+IS_OG;u%;w^Tl$mAJplh}TVfSvi9Ri3R% z3e0q57Z>C6%P&!=%r7lc014?8X)!P`XmU~d-d6Ci=^ z2{M5NWCDvAW05h)W~L&o$=n=DlV5SfaBG9?)&UWElLI-$H9#R%Bn#rJf(Qc;A;!SK zaEr^&Ki=8jFT~X^M3cD)?AkRuK;Mm{D!#v(INV9KKgWpmOAiIW+*HH9od&Sxny0=WvrF0!0#!)+@K zb~HCg5ajY(EP08!sYNy*zU|~G+`3Yr@GgR=2MH>I2zwCWF!?sO9%JTYE*^b0H;~z8 zo9%hn7#U3_yYYJ1++r>$Eh%yVDKrEH0ZT!Camg)q=O9 MyE return myextension -async def get_myextension(myextension_id: str) -> Optional[MyExtension]: +async def get_myextension(myextension_id: str, req: Request) -> Optional[MyExtension]: row = await db.fetchone("SELECT * FROM myextension.maintable WHERE id = ?", (myextension_id,)) - return MyExtension(**row) if row else None + if not row: + return None + rowAmended = MyExtension(**row) + rowAmended.lnurlpay = lnurl_encode(req.url_for("myextension.api_lnurl_pay", myextension_id=row.id)._url) + rowAmended.lnurlwithdraw = lnurl_encode(req.url_for("myextension.api_lnurl_withdraw", myextension_id=row.id)._url) + return rowAmended async def get_myextensions(wallet_ids: Union[str, List[str]], req: Request) -> List[MyExtension]: if isinstance(wallet_ids, str): @@ -41,10 +46,9 @@ async def get_myextensions(wallet_ids: Union[str, List[str]], req: Request) -> L f"SELECT * FROM myextension.maintable WHERE wallet IN ({q})", (*wallet_ids,) ) tempRows = [MyExtension(**row) for row in rows] - logger.debug(req.url_for("myextension.api_lnurl_pay", myextension_id=row.id)) for row in tempRows: - row.lnurlpay = req.url_for("myextension.api_lnurl_pay", myextension_id=row.id) - row.lnurlwithdraw = req.url_for("myextension.api_lnurl_withdraw", myextension_id=row.id) + row.lnurlpay = lnurl_encode(req.url_for("myextension.api_lnurl_pay", myextension_id=row.id)._url) + row.lnurlwithdraw = lnurl_encode(req.url_for("myextension.api_lnurl_withdraw", myextension_id=row.id)._url) return tempRows async def update_myextension(myextension_id: str, **kwargs) -> MyExtension: diff --git a/lnurl.py b/lnurl.py index 93305e5..058e2d6 100644 --- a/lnurl.py +++ b/lnurl.py @@ -1,5 +1,6 @@ -# Maybe your extensions needs some LNURL stuff, if so checkout LNURLp/LNURLw extensions/lnurl library in LNbits (to keep things simple the below examples are raw LNURLs) - +# Maybe your extensions needs some LNURL stuff. +# Here is a very simple example of how to do it. +# Feel free to delete this file if you don't need it. from http import HTTPStatus from fastapi import Depends, Query, Request diff --git a/models.py b/models.py index fc44926..513fe77 100644 --- a/models.py +++ b/models.py @@ -18,13 +18,13 @@ class CreateMyExtensionData(BaseModel): class MyExtension(BaseModel): id: str - wallet: str - name: str + wallet: Optional[str] + name: Optional[str] total: Optional[int] lnurlpayamount: Optional[int] lnurlwithdrawamount: Optional[int] - lnurlpay: str - lnurlwithdraw: str + lnurlpay: Optional[str] + lnurlwithdraw: Optional[str] @classmethod def from_row(cls, row: Row) -> "MyExtension": diff --git a/templates/myextension/index.html b/templates/myextension/index.html index 131f81a..0bd9e57 100644 --- a/templates/myextension/index.html +++ b/templates/myextension/index.html @@ -67,17 +67,6 @@ target="_blank" >Open public page - - Click to copy${props.row.id.substring(0,6)}... - @@ -163,22 +152,42 @@ + + - - -
-

- ${ urlDialog.data.lnurlpay }
${ - urlDialog.data.shareUrl } -

+ + +
+
+ + + +
+
+ lnurlpay + +
+
+ lnurlwithdraw + +
+
+ + + + +
+ +
- Copy URL + Close
@@ -186,6 +195,7 @@
{% endblock %} {% block scripts %} {{ window_vars(user) }} {% endblock %} diff --git a/views_api.py b/views_api.py index c270ed2..800ab76 100644 --- a/views_api.py +++ b/views_api.py @@ -38,7 +38,9 @@ from .models import CreateMyExtensionData @myextension_ext.get("/api/v1/temps", status_code=HTTPStatus.OK) async def api_myextensions( - req: Request, all_wallets: bool = Query(False), wallet: WalletTypeInfo = Depends(get_key_type) + req: Request, all_wallets: + bool = Query(False), + wallet: WalletTypeInfo = Depends(get_key_type) ): wallet_ids = [wallet.wallet.id] if all_wallets: @@ -46,14 +48,27 @@ async def api_myextensions( wallet_ids = user.wallet_ids if user else [] return [myextension.dict() for myextension in await get_myextensions(wallet_ids, req)] +## Get a single record -## Get a specific record belonging to a user +@myextension_ext.get("/api/v1/temps/{myextension_id}", status_code=HTTPStatus.OK) +async def api_myextension( + req: Request, + myextension_id: str, + WalletTypeInfo = Depends(get_key_type)): + myextension = await get_myextension(myextension_id, req) + if not myextension: + raise HTTPException( + status_code=HTTPStatus.NOT_FOUND, detail="MyExtension does not exist." + ) + return myextension.dict() + +## update a record @myextension_ext.put("/api/v1/temps/{myextension_id}") async def api_myextension_update( data: CreateMyExtensionData, myextension_id: str, - wallet: WalletTypeInfo = Depends(require_admin_key), + wallet: WalletTypeInfo = Depends(get_key_type), ): if not myextension_id: raise HTTPException(