Added update
This commit is contained in:
parent
69c7cdb49f
commit
08ce55e29e
7 changed files with 171 additions and 37 deletions
|
|
@ -20,7 +20,7 @@ async def create_gerty(wallet_id: str, data: Gerty) -> Gerty:
|
|||
data.lnbits_wallets,
|
||||
data.sats_quote,
|
||||
data.exchange,
|
||||
data.onchain_sats,
|
||||
data.onchain_stats,
|
||||
data.ln_stats,
|
||||
),
|
||||
)
|
||||
|
|
@ -29,6 +29,12 @@ async def create_gerty(wallet_id: str, data: Gerty) -> Gerty:
|
|||
assert gerty, "Newly created gerty couldn't be retrieved"
|
||||
return gerty
|
||||
|
||||
async def update_gerty(gerty_id: str, **kwargs) -> Gerty:
|
||||
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
|
||||
await db.execute(
|
||||
f"UPDATE gerty.gertys SET {q} WHERE id = ?", (*kwargs.values(), gerty_id)
|
||||
)
|
||||
return await get_gerty(gerty_id)
|
||||
|
||||
async def get_gerty(gerty_id: str) -> Optional[Gerty]:
|
||||
row = await db.fetchone("SELECT * FROM gerty.gertys WHERE id = ?", (gerty_id,))
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ async def m001_initial(db):
|
|||
name TEXT NOT NULL,
|
||||
wallet TEXT NOT NULL,
|
||||
lnbits_wallets TEXT,
|
||||
mempool_endpoint TEXT,
|
||||
sats_quote BOOL,
|
||||
exchange TEXT,
|
||||
onchain_stats BOOL,
|
||||
|
|
|
|||
|
|
@ -11,9 +11,10 @@ class Gerty(BaseModel):
|
|||
name: str
|
||||
wallet: str
|
||||
lnbits_wallets: str = Query(None) # Wallets to keep an eye on, {"wallet-id": "wallet-read-key, etc"}
|
||||
mempool_endpoint: str = Query("https://mempool.space") # Mempool endpoint to use
|
||||
sats_quote: bool = Query(False) # Fetch Satoshi quotes
|
||||
exchange: str = Query(None) # BTC <-> Fiat exchange rate to pull ie "USD", in 0.0001 and sats
|
||||
onchain_sats: bool = Query(False) # Onchain stats
|
||||
onchain_stats: bool = Query(False) # Onchain stats
|
||||
ln_stats: bool = Query(False) # ln Sats
|
||||
|
||||
@classmethod
|
||||
|
|
|
|||
|
|
@ -1,19 +1,23 @@
|
|||
{% extends "public.html" %} {% block page %}
|
||||
{% extends "public.html" %} {% block toolbar_title %} {{ gerty.name }}{% endblock %}{% block page %}
|
||||
<div class="q-pa-md">
|
||||
<div class="row q-col-gutter-md" >{% raw %}
|
||||
<div class="col q-pr-sm" v-for="gertywallet in gertywallets" style="max-width:400px">
|
||||
<div class="q-item q-item-type row no-wrap q-pa-none" :style="`background-color: ${walletColors[0].first}`">
|
||||
<div class="q-item__section column q-pa-lg q-mr-none text-white q-item__section--side justify-center" :style="`background-color: ${walletColors[0].second}`" >
|
||||
<i aria-hidden="true" role="presentation" class="material-icons q-icon notranslate text-white" style="font-size: 50px;">sentiment_satisfied</i></div>
|
||||
<div class="q-item__section column q-pa-md q-ml-none text-white q-item__section--main justify-center" style="min-width:200px;">
|
||||
<div class="q-item__label text-white text-h6 text-weight-bolder">{{gertywallet.amount}}</div><div class="q-item__label">Wallet: <b>{{gertywallet.name}}</b></div>
|
||||
</div>{% endraw %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row q-col-gutter-md justify-center">
|
||||
|
||||
|
||||
<div class="col-12 col-sm-6 col-md-5 col-lg-4">
|
||||
<q-card class="q-pa-lg">
|
||||
<q-card-section class="q-pa-none">
|
||||
<div class="text-center">
|
||||
<a href="lightning:{{ lnurl }}">
|
||||
<q-responsive :ratio="1" class="q-mx-md">
|
||||
<qrcode
|
||||
value="{{ lnurl }}"
|
||||
:options="{width: 800}"
|
||||
class="rounded-borders"
|
||||
></qrcode>
|
||||
</q-responsive>
|
||||
</a>
|
||||
</div>
|
||||
<div class="row q-mt-lg q-gutter-sm">
|
||||
<q-btn outline color="grey" @click="copyText('{{ lnurl }}')"
|
||||
>Copy LNURL</q-btn
|
||||
|
|
@ -37,7 +41,6 @@
|
|||
</q-card-section>
|
||||
<q-card-section class="q-pa-none">
|
||||
<q-separator></q-separator>
|
||||
<q-list> {% include "lnurlp/_lnurl.html" %} </q-list>
|
||||
</q-card-section>
|
||||
</q-card>
|
||||
</div>
|
||||
|
|
@ -48,7 +51,45 @@
|
|||
|
||||
new Vue({
|
||||
el: '#vue',
|
||||
mixins: [windowMixin]
|
||||
mixins: [windowMixin],
|
||||
data: function () {
|
||||
return {
|
||||
gertyName: '{{gerty.name}}',
|
||||
walletColors: [
|
||||
{first: "#3f51b5",
|
||||
second: "#1a237e"},
|
||||
{first: "#9c27b0",
|
||||
second: "#4a148c"},
|
||||
{first: "#e91e63",
|
||||
second: "#880e4f"},
|
||||
{first: "#009688",
|
||||
second: "#004d40"},
|
||||
{first: "#ff9800",
|
||||
second: "#e65100"},
|
||||
{first: "#2196f3",
|
||||
second: "#0d47a1"},
|
||||
{first: "#4caf50",
|
||||
second: "#1b5e20"}
|
||||
],
|
||||
gertywallets: [{
|
||||
name:"poo",
|
||||
amount:"200"
|
||||
},
|
||||
{
|
||||
name:"poo",
|
||||
amount:"200"
|
||||
}]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
||||
},
|
||||
created: function () {
|
||||
console.log(this.gerty)
|
||||
// if(){
|
||||
|
||||
// }
|
||||
}
|
||||
})
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
{{ col.label }}
|
||||
</q-th>
|
||||
<q-th auto-width></q-th>
|
||||
<q-th auto-width></q-th>
|
||||
</q-tr>
|
||||
</template>
|
||||
|
||||
|
|
@ -45,17 +46,27 @@
|
|||
unelevated
|
||||
dense
|
||||
size="xs"
|
||||
icon="launch"
|
||||
icon="sentiment_satisfied"
|
||||
:color="($q.dark.isActive) ? 'grey-7' : 'grey-5'"
|
||||
type="a"
|
||||
:href="props.row.gerty"
|
||||
target="_blank"
|
||||
></q-btn>
|
||||
><q-tooltip>Launch software Gerty</q-tooltip></q-btn>
|
||||
</q-td>
|
||||
<q-td v-for="col in props.cols" :key="col.name" :props="props">
|
||||
{{ (col.name == 'tip_options' && col.value ?
|
||||
JSON.parse(col.value).join(", ") : col.value) }}
|
||||
</q-td>
|
||||
<q-td auto-width>
|
||||
<q-btn
|
||||
flat
|
||||
dense
|
||||
size="xs"
|
||||
@click="updateformDialog(props.row.id)"
|
||||
icon="edit"
|
||||
color="light-blue"
|
||||
></q-btn>
|
||||
</q-td>
|
||||
<q-td auto-width>
|
||||
<q-btn
|
||||
flat
|
||||
|
|
@ -90,7 +101,7 @@
|
|||
|
||||
<q-dialog v-model="formDialog.show" position="top" @hide="closeFormDialog">
|
||||
<q-card class="q-pa-lg q-pt-xl" style="width: 500px">
|
||||
<q-form @submit="createGerty" class="q-gutter-md">
|
||||
<q-form @submit="sendFormDataGerty" class="q-gutter-md">
|
||||
<q-input
|
||||
filled
|
||||
dense
|
||||
|
|
@ -106,12 +117,19 @@
|
|||
:options="g.user.walletOptions"
|
||||
label="Wallet *"
|
||||
></q-select>
|
||||
<q-input
|
||||
<q-select
|
||||
filled
|
||||
multiple
|
||||
dense
|
||||
v-model.trim="formDialog.data.lnbits_wallets"
|
||||
label="Wallets to watch (invoice keys, seperated by comma)"
|
||||
></q-input>
|
||||
emit-value
|
||||
v-model="formDialog.data.lnbits_wallets"
|
||||
use-input
|
||||
use-chips
|
||||
multiple
|
||||
hide-dropdown-icon
|
||||
new-value-mode="add-unique"
|
||||
label="Wallets to watch"
|
||||
><q-tooltip>Hit enter to add values</q-tooltip></q-select>
|
||||
<q-select
|
||||
filled
|
||||
dense
|
||||
|
|
@ -138,8 +156,17 @@
|
|||
color="primary"
|
||||
:disable="formDialog.data.wallet == null || formDialog.data.name == null"
|
||||
type="submit"
|
||||
class="q-mr-md"
|
||||
>Create Gerty</q-btn
|
||||
>
|
||||
<q-btn
|
||||
v-if="formDialog.data.id"
|
||||
unelevated
|
||||
color="primary"
|
||||
:disable="formDialog.data.wallet == null || formDialog.data.name == null"
|
||||
type="submit"
|
||||
>Update Gerty</q-btn
|
||||
>
|
||||
<q-btn v-close-popup flat color="grey" class="q-ml-auto"
|
||||
>Cancel</q-btn
|
||||
>
|
||||
|
|
@ -383,15 +410,17 @@
|
|||
show: false,
|
||||
data: {sats_quote: false,
|
||||
onchain_stats: false,
|
||||
ln_stats: false}
|
||||
ln_stats: false,
|
||||
lnbits_wallets:[]}
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
closeFormDialog: function () {
|
||||
this.formDialog.data = {sats_quote: false,
|
||||
onchain_sats: false,
|
||||
ln_stats: false}
|
||||
onchain_stats: false,
|
||||
ln_stats: false,
|
||||
lnbits_wallets:[]}
|
||||
},
|
||||
getGertys: function () {
|
||||
var self = this
|
||||
|
|
@ -407,14 +436,40 @@
|
|||
})
|
||||
})
|
||||
},
|
||||
updateformDialog: function (formId) {
|
||||
var gerty = _.findWhere(this.gertys, {id: formId})
|
||||
this.formDialog.data.id = gerty.id
|
||||
this.formDialog.data.name = gerty.name
|
||||
this.formDialog.data.wallet = gerty.wallet
|
||||
this.formDialog.data.lnbits_wallets = JSON.parse(gerty.lnbits_wallets)
|
||||
this.formDialog.data.exchange = gerty.exchange,
|
||||
this.formDialog.data.sats_quote = Boolean(gerty.sats_quote)
|
||||
this.formDialog.data.onchain_stats = Boolean(gerty.onchain_stats)
|
||||
this.formDialog.data.ln_stats = Boolean(gerty.ln_stats)
|
||||
this.formDialog.show = true
|
||||
},
|
||||
sendFormDataGerty: function () {
|
||||
var self = this
|
||||
if (self.formDialog.data.id) {
|
||||
this.updateGerty(
|
||||
self.g.user.wallets[0].adminkey,
|
||||
self.formDialog.data
|
||||
)
|
||||
} else {
|
||||
this.createGerty(
|
||||
self.g.user.wallets[0].adminkey,
|
||||
self.formDialog.data
|
||||
)
|
||||
}
|
||||
},
|
||||
createGerty: function () {
|
||||
var data = {
|
||||
name: this.formDialog.data.name,
|
||||
wallet: this.formDialog.data.wallet,
|
||||
lnbits_wallets: this.formDialog.data.lnbits_wallets,
|
||||
lnbits_wallets: JSON.stringify(this.formDialog.data.lnbits_wallets),
|
||||
sats_quote: this.formDialog.data.sats_quote,
|
||||
exchange: this.formDialog.data.exchange,
|
||||
onchain_sats: this.formDialog.data.onchain_sats,
|
||||
onchain_stats: this.formDialog.data.onchain_stats,
|
||||
ln_stats: this.formDialog.data.ln_stats
|
||||
}
|
||||
var self = this
|
||||
|
|
@ -435,6 +490,27 @@
|
|||
LNbits.utils.notifyApiError(error)
|
||||
})
|
||||
},
|
||||
updateGerty: function (wallet, data) {
|
||||
var self = this
|
||||
data.lnbits_wallets = JSON.stringify(this.formDialog.data.lnbits_wallets)
|
||||
LNbits.api
|
||||
.request(
|
||||
'PUT',
|
||||
'/gerty/api/v1/gerty/' + data.id,
|
||||
wallet,
|
||||
data
|
||||
)
|
||||
.then(function (response) {
|
||||
self.gertys = _.reject(self.gertys, function (obj) {
|
||||
return obj.id == data.id
|
||||
})
|
||||
self.gertys.push(mapGerty(response.data))
|
||||
self.formDialog.show = false
|
||||
})
|
||||
.catch(function (error) {
|
||||
LNbits.utils.notifyApiError(error)
|
||||
})
|
||||
},
|
||||
deleteGerty: function (gertyId) {
|
||||
var self = this
|
||||
var gerty = _.findWhere(this.gertys, {id: gertyId})
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@ from lnbits.settings import LNBITS_CUSTOM_LOGO, LNBITS_SITE_TITLE
|
|||
|
||||
from . import gerty_ext, gerty_renderer
|
||||
from .crud import get_gerty
|
||||
from .views_api import api_gerty_json
|
||||
|
||||
import json
|
||||
|
||||
templates = Jinja2Templates(directory="templates")
|
||||
|
||||
|
|
@ -28,4 +31,5 @@ async def display(request: Request, gerty_id):
|
|||
raise HTTPException(
|
||||
status_code=HTTPStatus.NOT_FOUND, detail="Gerty does not exist."
|
||||
)
|
||||
return lnurlp_renderer().TemplateResponse("gerty/gerty.html", ctx)
|
||||
gertyData = await api_gerty_json(gerty_id)
|
||||
return gerty_renderer().TemplateResponse("gerty/gerty.html", {"request": request, "gerty": gertyData})
|
||||
|
|
@ -12,12 +12,12 @@ from starlette.exceptions import HTTPException
|
|||
|
||||
from lnbits.core.crud import get_user
|
||||
from lnbits.core.services import create_invoice
|
||||
from lnbits.core.views.api import api_payment
|
||||
from lnbits.core.views.api import api_payment, api_wallet
|
||||
from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key
|
||||
from fastapi.templating import Jinja2Templates
|
||||
|
||||
from . import gerty_ext
|
||||
from .crud import create_gerty, delete_gerty, get_gerty, get_gertys
|
||||
from .crud import create_gerty, update_gerty, delete_gerty, get_gerty, get_gertys
|
||||
from .models import Gerty
|
||||
|
||||
from lnbits.utils.exchange_rates import fiat_amount_as_satoshis
|
||||
|
|
@ -101,7 +101,12 @@ async def api_gerty_json(
|
|||
)
|
||||
gertyReturn = []
|
||||
if gerty.lnbits_wallets != "":
|
||||
gertyReturn.append(gerty.lnbitsWallets)
|
||||
for lnbits_wallet in json.loads(gerty.lnbits_wallets):
|
||||
logger.debug(lnbits_wallet)
|
||||
walletPrint = await api_wallet(wallet=lnbits_wallet)
|
||||
gertyReturn.wallets.append(walletPrint)
|
||||
#logger.debug(walletPrint)
|
||||
logger.debug(gertyReturn)
|
||||
|
||||
if gerty.sats_quote:
|
||||
gertyReturn.append(await api_gerty_satoshi())
|
||||
|
|
@ -111,7 +116,7 @@ async def api_gerty_json(
|
|||
gertyReturn.append(await fiat_amount_as_satoshis(1, gerty.exchange))
|
||||
except:
|
||||
pass
|
||||
if gerty.onchain_sats:
|
||||
if gerty.onchain_stats:
|
||||
async with httpx.AsyncClient() as client:
|
||||
r = await client.get(gerty.mempool_endpoint + "/api/v1/difficulty-adjustment")
|
||||
gertyReturn.append({"difficulty-adjustment": json.dumps(r)})
|
||||
|
|
@ -124,7 +129,7 @@ async def api_gerty_json(
|
|||
async with httpx.AsyncClient() as client:
|
||||
r = await client.get(gerty.mempool_endpoint + "/api/v1/lightning/statistics/latest")
|
||||
gertyReturn.append({"latest": json.dumps(r)})
|
||||
|
||||
logger.debug(gertyReturn)
|
||||
return gertyReturn
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue