Merge pull request #1263 from lnbits/fix/mypy/gerty

fix mypy issues for gerty
This commit is contained in:
Arc 2023-01-04 19:09:04 +00:00 committed by GitHub
commit 608e78f307
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 102 additions and 105 deletions

View file

@ -5,11 +5,9 @@ from fastapi.staticfiles import StaticFiles
from lnbits.db import Database from lnbits.db import Database
from lnbits.helpers import template_renderer from lnbits.helpers import template_renderer
from lnbits.tasks import catch_everything_and_restart
db = Database("ext_gerty") db = Database("ext_gerty")
gerty_static_files = [ gerty_static_files = [
{ {
"path": "/gerty/static", "path": "/gerty/static",

View file

@ -50,11 +50,12 @@ async def create_gerty(wallet_id: str, data: Gerty) -> Gerty:
return gerty return gerty
async def update_gerty(gerty_id: str, **kwargs) -> Gerty: async def update_gerty(gerty_id: str, **kwargs) -> Optional[Gerty]:
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()]) q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
await db.execute( await db.execute(
f"UPDATE gerty.gertys SET {q} WHERE id = ?", (*kwargs.values(), gerty_id) f"UPDATE gerty.gertys SET {q} WHERE id = ?", (*kwargs.values(), gerty_id)
) )
return await get_gerty(gerty_id) return await get_gerty(gerty_id)
@ -82,7 +83,7 @@ async def delete_gerty(gerty_id: str) -> None:
#############MEMPOOL########### #############MEMPOOL###########
async def get_mempool_info(endPoint: str, gerty) -> Optional[Mempool]: async def get_mempool_info(endPoint: str, gerty) -> dict:
logger.debug(endPoint) logger.debug(endPoint)
endpoints = MempoolEndpoint() endpoints = MempoolEndpoint()
url = "" url = ""

View file

@ -3,15 +3,16 @@ import os
import random import random
import textwrap import textwrap
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import List
import httpx import httpx
from loguru import logger from loguru import logger
from lnbits.core.crud import get_user, get_wallet_for_key from lnbits.core.crud import get_wallet_for_key
from lnbits.settings import settings from lnbits.settings import settings
from lnbits.utils.exchange_rates import satoshis_amount_as_fiat from lnbits.utils.exchange_rates import satoshis_amount_as_fiat
from .crud import get_gerty, get_mempool_info from .crud import get_mempool_info
from .number_prefixer import * from .number_prefixer import *
@ -24,8 +25,8 @@ def get_percent_difference(current, previous, precision=3):
def get_text_item_dict( def get_text_item_dict(
text: str, text: str,
font_size: int, font_size: int,
x_pos: int = None, x_pos: int = -1,
y_pos: int = None, y_pos: int = -1,
gerty_type: str = "Gerty", gerty_type: str = "Gerty",
): ):
# Get line size by font size # Get line size by font size
@ -63,13 +64,41 @@ def get_text_item_dict(
# logger.debug('multilineText') # logger.debug('multilineText')
# logger.debug(multilineText) # logger.debug(multilineText)
text = {"value": multilineText, "size": font_size} data_text = {"value": multilineText, "size": font_size}
if x_pos is None and y_pos is None: if x_pos == -1 and y_pos == -1:
text["position"] = "center" data_text["position"] = "center"
else: else:
text["x"] = x_pos data_text["x"] = x_pos if x_pos > 0 else 0
text["y"] = y_pos data_text["y"] = y_pos if x_pos > 0 else 0
return text return data_text
def get_date_suffix(dayNumber):
if 4 <= dayNumber <= 20 or 24 <= dayNumber <= 30:
return "th"
else:
return ["st", "nd", "rd"][dayNumber % 10 - 1]
def get_time_remaining(seconds, granularity=2):
intervals = (
# ('weeks', 604800), # 60 * 60 * 24 * 7
("days", 86400), # 60 * 60 * 24
("hours", 3600), # 60 * 60
("minutes", 60),
("seconds", 1),
)
result = []
for name, count in intervals:
value = seconds // count
if value:
seconds -= value * count
if value == 1:
name = name.rstrip("s")
result.append("{} {}".format(round(value), name))
return ", ".join(result[:granularity])
# format a number for nice display output # format a number for nice display output
@ -293,8 +322,7 @@ def get_next_update_time(sleep_time_seconds: int = 0, utc_offset: int = 0):
def gerty_should_sleep(utc_offset: int = 0): def gerty_should_sleep(utc_offset: int = 0):
utc_now = datetime.utcnow() utc_now = datetime.utcnow()
local_time = utc_now + timedelta(hours=utc_offset) local_time = utc_now + timedelta(hours=utc_offset)
hours = local_time.strftime("%H") hours = int(local_time.strftime("%H"))
hours = int(hours)
if hours >= 22 and hours <= 23: if hours >= 22 and hours <= 23:
return True return True
else: else:
@ -352,23 +380,17 @@ async def get_mining_stat(stat_slug: str, gerty):
async def api_get_mining_stat(stat_slug: str, gerty): async def api_get_mining_stat(stat_slug: str, gerty):
stat = "" stat = {}
if stat_slug == "mining_current_hash_rate": if stat_slug == "mining_current_hash_rate":
async with httpx.AsyncClient() as client: r = await get_mempool_info("hashrate_1m", gerty)
r = await get_mempool_info("hashrate_1m", gerty) data = r
data = r stat["current"] = data["currentHashrate"]
stat = {} stat["1w"] = data["hashrates"][len(data["hashrates"]) - 7]["avgHashrate"]
stat["current"] = data["currentHashrate"]
stat["1w"] = data["hashrates"][len(data["hashrates"]) - 7]["avgHashrate"]
elif stat_slug == "mining_current_difficulty": elif stat_slug == "mining_current_difficulty":
async with httpx.AsyncClient() as client: r = await get_mempool_info("hashrate_1m", gerty)
r = await get_mempool_info("hashrate_1m", gerty) data = r
data = r stat["current"] = data["currentDifficulty"]
stat = {} stat["previous"] = data["difficulty"][len(data["difficulty"]) - 2]["difficulty"]
stat["current"] = data["currentDifficulty"]
stat["previous"] = data["difficulty"][len(data["difficulty"]) - 2][
"difficulty"
]
return stat return stat
@ -384,7 +406,7 @@ async def get_satoshi():
quote = satoshiQuotes[random.randint(0, len(satoshiQuotes) - 1)] quote = satoshiQuotes[random.randint(0, len(satoshiQuotes) - 1)]
# logger.debug(quote.text) # logger.debug(quote.text)
if len(quote["text"]) > maxQuoteLength: if len(quote["text"]) > maxQuoteLength:
logger.debug("Quote is too long, getting another") logger.trace("Quote is too long, getting another")
return await get_satoshi() return await get_satoshi()
else: else:
return quote return quote
@ -399,15 +421,16 @@ def get_screen_slug_by_index(index: int, screens_list):
# Get a list of text items for the screen number # Get a list of text items for the screen number
async def get_screen_data(screen_num: int, screens_list: dict, gerty): async def get_screen_data(screen_num: int, screens_list: list, gerty):
screen_slug = get_screen_slug_by_index(screen_num, screens_list) screen_slug = get_screen_slug_by_index(screen_num, screens_list)
# first get the relevant slug from the display_preferences # first get the relevant slug from the display_preferences
areas = [] areas: List = []
title = "" title = ""
if screen_slug == "dashboard": if screen_slug == "dashboard":
title = gerty.name title = gerty.name
areas = await get_dashboard(gerty) areas = await get_dashboard(gerty)
if screen_slug == "lnbits_wallets_balance": if screen_slug == "lnbits_wallets_balance":
wallets = await get_lnbits_wallet_balances(gerty) wallets = await get_lnbits_wallet_balances(gerty)
@ -505,10 +528,10 @@ async def get_screen_data(screen_num: int, screens_list: dict, gerty):
title = "Lightning Network" title = "Lightning Network"
areas = await get_lightning_stats(gerty) areas = await get_lightning_stats(gerty)
data = {} data = {
data["title"] = title "title": title,
data["areas"] = areas "areas": areas,
}
return data return data
@ -570,7 +593,7 @@ async def get_dashboard(gerty):
text = [] text = []
text.append( text.append(
get_text_item_dict( get_text_item_dict(
text=await get_time_remaining_next_difficulty_adjustment(gerty), text=await get_time_remaining_next_difficulty_adjustment(gerty) or "0",
font_size=15, font_size=15,
gerty_type=gerty.type, gerty_type=gerty.type,
) )
@ -602,7 +625,7 @@ async def get_lnbits_wallet_balances(gerty):
return wallets return wallets
async def get_placeholder_text(): async def get_placeholder_text(gerty):
return [ return [
get_text_item_dict( get_text_item_dict(
text="Some placeholder text", text="Some placeholder text",
@ -810,14 +833,14 @@ async def get_time_remaining_next_difficulty_adjustment(gerty):
r = await get_mempool_info("difficulty_adjustment", gerty) r = await get_mempool_info("difficulty_adjustment", gerty)
stat = r["remainingTime"] stat = r["remainingTime"]
time = get_time_remaining(stat / 1000, 3) time = get_time_remaining(stat / 1000, 3)
return time return time
async def get_mempool_stat(stat_slug: str, gerty): async def get_mempool_stat(stat_slug: str, gerty):
text = [] text = []
if isinstance(gerty.mempool_endpoint, str): if isinstance(gerty.mempool_endpoint, str):
if stat_slug == "mempool_tx_count": if stat_slug == "mempool_tx_count":
r = get_mempool_info("mempool", gerty) r = await get_mempool_info("mempool", gerty)
if stat_slug == "mempool_tx_count": if stat_slug == "mempool_tx_count":
stat = round(r["count"]) stat = round(r["count"])
text.append( text.append(
@ -921,31 +944,3 @@ async def get_mempool_stat(stat_slug: str, gerty):
) )
) )
return text return text
def get_date_suffix(dayNumber):
if 4 <= dayNumber <= 20 or 24 <= dayNumber <= 30:
return "th"
else:
return ["st", "nd", "rd"][dayNumber % 10 - 1]
def get_time_remaining(seconds, granularity=2):
intervals = (
# ('weeks', 604800), # 60 * 60 * 24 * 7
("days", 86400), # 60 * 60 * 24
("hours", 3600), # 60 * 60
("minutes", 60),
("seconds", 1),
)
result = []
for name, count in intervals:
value = seconds // count
if value:
seconds -= value * count
if value == 1:
name = name.rstrip("s")
result.append("{} {}".format(round(value), name))
return ", ".join(result[:granularity])

View file

@ -1,5 +1,4 @@
from sqlite3 import Row from sqlite3 import Row
from typing import Optional
from fastapi import Query from fastapi import Query
from pydantic import BaseModel from pydantic import BaseModel

View file

@ -32,7 +32,10 @@ gertyname }}{% endraw %}{% endblock %}{% block page %} {% raw %}
</q-card> </q-card>
</div> </div>
<div class="q-pa-md row items-start q-gutter-md" v-if="lnbits_wallets_balance"> <div
class="q-pa-md row items-start q-gutter-md"
v-if="lnbits_wallets_balance[0]"
>
<q-card <q-card
class="q-pa-sm" class="q-pa-sm"
v-for="(wallet, t) in lnbits_wallets_balance" v-for="(wallet, t) in lnbits_wallets_balance"
@ -49,7 +52,7 @@ gertyname }}{% endraw %}{% endblock %}{% block page %} {% raw %}
<div <div
class="q-pa-md row items-start q-gutter-md" class="q-pa-md row items-start q-gutter-md"
v-if="dashboard_onchain || dashboard_mining || lightning_dashboard" v-if="dashboard_onchain[0] || dashboard_mining[0] || lightning_dashboard[0] || url_checker[0]"
> >
<q-card <q-card
class="q-pa-sm" class="q-pa-sm"
@ -67,7 +70,7 @@ gertyname }}{% endraw %}{% endblock %}{% block page %} {% raw %}
</q-card-section> </q-card-section>
</q-card> </q-card>
<q-card class="q-pa-sm" v-if="dashboard_mining" unelevated class="q-pa-sm"> <q-card class="q-pa-sm" v-if="dashboard_mining[0]" unelevated class="q-pa-sm">
<q-card-section> <q-card-section>
<div class="text-h6">Mining</div> <div class="text-h6">Mining</div>
</q-card-section> </q-card-section>
@ -78,7 +81,12 @@ gertyname }}{% endraw %}{% endblock %}{% block page %} {% raw %}
</q-card-section> </q-card-section>
</q-card> </q-card>
<q-card class="q-pa-sm" v-if="lightning_dashboard" unelevated class="q-pa-sm"> <q-card
class="q-pa-sm"
v-if="lightning_dashboard[0]"
unelevated
class="q-pa-sm"
>
<q-card-section> <q-card-section>
<div class="text-h6">Lightning (Last 7 days)</div> <div class="text-h6">Lightning (Last 7 days)</div>
</q-card-section> </q-card-section>
@ -88,7 +96,6 @@ gertyname }}{% endraw %}{% endblock %}{% block page %} {% raw %}
</p> </p>
</q-card-section> </q-card-section>
</q-card> </q-card>
<q-card class="q-pa-sm" v-if="url_checker" unelevated class="q-pa-sm"> <q-card class="q-pa-sm" v-if="url_checker" unelevated class="q-pa-sm">
<q-card-section> <q-card-section>
<div class="text-h6">Servers to check</div> <div class="text-h6">Servers to check</div>
@ -153,7 +160,13 @@ gertyname }}{% endraw %}{% endblock %}{% block page %} {% raw %}
lnbits_wallets_balance: {}, lnbits_wallets_balance: {},
dashboard_onchain: {}, dashboard_onchain: {},
fun_satoshi_quotes: {}, fun_satoshi_quotes: {},
fun_exchange_market_rate: {}, fun_exchange_market_rate: {
unit: ''
},
dashboard_mining: {},
lightning_dashboard: {},
url_checker: {},
dashboard_mining: {},
gerty: [], gerty: [],
gerty_id: `{{gerty}}`, gerty_id: `{{gerty}}`,
gertyname: '', gertyname: '',
@ -182,7 +195,6 @@ gertyname }}{% endraw %}{% endblock %}{% block page %} {% raw %}
LNbits.utils.notifyApiError(error) LNbits.utils.notifyApiError(error)
} }
} }
console.log(this.gerty)
for (let i = 0; i < this.gerty.length; i++) { for (let i = 0; i < this.gerty.length; i++) {
if (this.gerty[i].screen.group == 'lnbits_wallets_balance') { if (this.gerty[i].screen.group == 'lnbits_wallets_balance') {
for (let q = 0; q < this.gerty[i].screen.areas.length; q++) { for (let q = 0; q < this.gerty[i].screen.areas.length; q++) {

View file

@ -1,10 +1,7 @@
import json
from http import HTTPStatus from http import HTTPStatus
from fastapi import Request from fastapi import Depends, Request
from fastapi.params import Depends
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from loguru import logger
from starlette.exceptions import HTTPException from starlette.exceptions import HTTPException
from starlette.responses import HTMLResponse from starlette.responses import HTMLResponse
@ -13,7 +10,6 @@ from lnbits.decorators import check_user_exists
from . import gerty_ext, gerty_renderer from . import gerty_ext, gerty_renderer
from .crud import get_gerty from .crud import get_gerty
from .views_api import api_gerty_json
templates = Jinja2Templates(directory="templates") templates = Jinja2Templates(directory="templates")

View file

@ -1,24 +1,12 @@
import json import json
import math
import os
import random
import time
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
import httpx from fastapi import Depends, Query
from fastapi import Query
from fastapi.params import Depends
from fastapi.templating import Jinja2Templates
from lnurl import decode as decode_lnurl
from loguru import logger from loguru import logger
from starlette.exceptions import HTTPException from starlette.exceptions import HTTPException
from lnbits.core.crud import get_user, get_wallet_for_key from lnbits.core.crud import get_user
from lnbits.core.services import create_invoice
from lnbits.core.views.api import api_payment, api_wallet
from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key
from lnbits.utils.exchange_rates import satoshis_amount_as_fiat
from . import gerty_ext from . import gerty_ext
from .crud import ( from .crud import (
@ -29,8 +17,14 @@ from .crud import (
get_mempool_info, get_mempool_info,
update_gerty, update_gerty,
) )
from .helpers import * from .helpers import (
from .models import Gerty, MempoolEndpoint gerty_should_sleep,
get_next_update_time,
get_satoshi,
get_screen_data,
get_screen_slug_by_index,
)
from .models import Gerty
@gerty_ext.get("/api/v1/gerty", status_code=HTTPStatus.OK) @gerty_ext.get("/api/v1/gerty", status_code=HTTPStatus.OK)
@ -39,7 +33,8 @@ async def api_gertys(
): ):
wallet_ids = [wallet.wallet.id] wallet_ids = [wallet.wallet.id]
if all_wallets: if all_wallets:
wallet_ids = (await get_user(wallet.wallet.user)).wallet_ids user = await get_user(wallet.wallet.user)
wallet_ids = user.wallet_ids if user else []
return [gerty.dict() for gerty in await get_gertys(wallet_ids)] return [gerty.dict() for gerty in await get_gertys(wallet_ids)]
@ -51,7 +46,6 @@ async def api_link_create_or_update(
wallet: WalletTypeInfo = Depends(get_key_type), wallet: WalletTypeInfo = Depends(get_key_type),
gerty_id: str = Query(None), gerty_id: str = Query(None),
): ):
logger.debug(data)
if gerty_id: if gerty_id:
gerty = await get_gerty(gerty_id) gerty = await get_gerty(gerty_id)
if not gerty: if not gerty:
@ -67,6 +61,9 @@ async def api_link_create_or_update(
data.wallet = wallet.wallet.id data.wallet = wallet.wallet.id
gerty = await update_gerty(gerty_id, **data.dict()) gerty = await update_gerty(gerty_id, **data.dict())
assert gerty, HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="Gerty does not exist"
)
else: else:
gerty = await create_gerty(wallet_id=wallet.wallet.id, data=data) gerty = await create_gerty(wallet_id=wallet.wallet.id, data=data)
@ -93,11 +90,11 @@ async def api_gerty_delete(
@gerty_ext.get("/api/v1/gerty/satoshiquote", status_code=HTTPStatus.OK) @gerty_ext.get("/api/v1/gerty/satoshiquote", status_code=HTTPStatus.OK)
async def api_gerty_satoshi(): async def api_gerty_satoshi():
return await get_satoshi return await get_satoshi()
@gerty_ext.get("/api/v1/gerty/pages/{gerty_id}/{p}") @gerty_ext.get("/api/v1/gerty/pages/{gerty_id}/{p}")
async def api_gerty_json(gerty_id: str, p: int = None): # page number async def api_gerty_json(gerty_id: str, p: int = 0): # page number
gerty = await get_gerty(gerty_id) gerty = await get_gerty(gerty_id)
if not gerty: if not gerty:
@ -117,7 +114,7 @@ async def api_gerty_json(gerty_id: str, p: int = None): # page number
enabled_screen_count += 1 enabled_screen_count += 1
enabled_screens.append(screen_slug) enabled_screens.append(screen_slug)
logger.debug("Screeens " + str(enabled_screens)) logger.debug("Screens " + str(enabled_screens))
data = await get_screen_data(p, enabled_screens, gerty) data = await get_screen_data(p, enabled_screens, gerty)
next_screen_number = 0 if ((p + 1) >= enabled_screen_count) else p + 1 next_screen_number = 0 if ((p + 1) >= enabled_screen_count) else p + 1

View file

@ -92,7 +92,6 @@ exclude = """(?x)(
^lnbits/extensions/bleskomat. ^lnbits/extensions/bleskomat.
| ^lnbits/extensions/boltz. | ^lnbits/extensions/boltz.
| ^lnbits/extensions/boltcards. | ^lnbits/extensions/boltcards.
| ^lnbits/extensions/gerty.
| ^lnbits/extensions/invoices. | ^lnbits/extensions/invoices.
| ^lnbits/extensions/livestream. | ^lnbits/extensions/livestream.
| ^lnbits/extensions/lnaddress. | ^lnbits/extensions/lnaddress.