Merge remote-tracking branch 'upstream/main'
Some checks are pending
lint / lint (push) Waiting to run
/ release (push) Waiting to run
/ pullrequest (push) Blocked by required conditions

This commit is contained in:
padreug 2025-11-03 23:13:22 +01:00
commit 7cc622fc44
11 changed files with 2314 additions and 2674 deletions

View file

@ -19,7 +19,7 @@ jobs:
needs: [release] needs: [release]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
with: with:
token: ${{ secrets.EXT_GITHUB }} token: ${{ secrets.EXT_GITHUB }}
repository: lnbits/lnbits-extensions repository: lnbits/lnbits-extensions

View file

@ -5,27 +5,27 @@ format: prettier black ruff
check: mypy pyright checkblack checkruff checkprettier check: mypy pyright checkblack checkruff checkprettier
prettier: prettier:
poetry run ./node_modules/.bin/prettier --write . uv run ./node_modules/.bin/prettier --write .
pyright: pyright:
poetry run ./node_modules/.bin/pyright uv run ./node_modules/.bin/pyright
mypy: mypy:
poetry run mypy . uv run mypy .
black: black:
poetry run black . uv run black .
ruff: ruff:
poetry run ruff check . --fix uv run ruff check . --fix
checkruff: checkruff:
poetry run ruff check . uv run ruff check .
checkprettier: checkprettier:
poetry run ./node_modules/.bin/prettier --check . uv run ./node_modules/.bin/prettier --check .
checkblack: checkblack:
poetry run black --check . uv run black --check .
checkeditorconfig: checkeditorconfig:
editorconfig-checker editorconfig-checker
@ -33,14 +33,14 @@ checkeditorconfig:
test: test:
PYTHONUNBUFFERED=1 \ PYTHONUNBUFFERED=1 \
DEBUG=true \ DEBUG=true \
poetry run pytest uv run pytest
install-pre-commit-hook: install-pre-commit-hook:
@echo "Installing pre-commit hook to git" @echo "Installing pre-commit hook to git"
@echo "Uninstall the hook with poetry run pre-commit uninstall" @echo "Uninstall the hook with uv run pre-commit uninstall"
poetry run pre-commit install uv run pre-commit install
pre-commit: pre-commit:
poetry run pre-commit run --all-files uv run pre-commit run --all-files
checkbundle: checkbundle:

View file

@ -37,4 +37,4 @@ def events_start():
scheduled_tasks.append(task) scheduled_tasks.append(task)
__all__ = ["db", "events_ext", "events_static_files", "events_start", "events_stop"] __all__ = ["db", "events_ext", "events_start", "events_static_files", "events_stop"]

View file

@ -2,7 +2,8 @@
"name": "Events", "name": "Events",
"short_description": "Sell and register event tickets", "short_description": "Sell and register event tickets",
"tile": "/events/static/image/events.png", "tile": "/events/static/image/events.png",
"min_lnbits_version": "1.0.0", "lnbits": "1.1.0",
"min_lnbits_version": "1.3.0",
"contributors": [ "contributors": [
{ {
"name": "talvasconcelos", "name": "talvasconcelos",

11
crud.py
View file

@ -1,5 +1,4 @@
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from typing import Optional, Union
from lnbits.db import Database from lnbits.db import Database
from lnbits.helpers import urlsafe_short_hash from lnbits.helpers import urlsafe_short_hash
@ -72,8 +71,8 @@ async def update_ticket(ticket: Ticket) -> Ticket:
return ticket return ticket
async def get_ticket(payment_hash: str) -> Optional[Ticket]: async def get_ticket(payment_hash: str) -> Ticket | None:
row = await db.fetchone( return await db.fetchone(
"SELECT * FROM events.ticket WHERE id = :id", "SELECT * FROM events.ticket WHERE id = :id",
{"id": payment_hash}, {"id": payment_hash},
) )
@ -90,7 +89,7 @@ async def get_ticket(payment_hash: str) -> Optional[Ticket]:
return Ticket(**ticket_data) return Ticket(**ticket_data)
async def get_tickets(wallet_ids: Union[str, list[str]]) -> list[Ticket]: async def get_tickets(wallet_ids: str | list[str]) -> list[Ticket]:
if isinstance(wallet_ids, str): if isinstance(wallet_ids, str):
wallet_ids = [wallet_ids] wallet_ids = [wallet_ids]
q = ",".join([f"'{wallet_id}'" for wallet_id in wallet_ids]) q = ",".join([f"'{wallet_id}'" for wallet_id in wallet_ids])
@ -162,7 +161,7 @@ async def update_event(event: Event) -> Event:
return event return event
async def get_event(event_id: str) -> Optional[Event]: async def get_event(event_id: str) -> Event | None:
return await db.fetchone( return await db.fetchone(
"SELECT * FROM events.events WHERE id = :id", "SELECT * FROM events.events WHERE id = :id",
{"id": event_id}, {"id": event_id},
@ -170,7 +169,7 @@ async def get_event(event_id: str) -> Optional[Event]:
) )
async def get_events(wallet_ids: Union[str, list[str]]) -> list[Event]: async def get_events(wallet_ids: str | list[str]) -> list[Event]:
if isinstance(wallet_ids, str): if isinstance(wallet_ids, str):
wallet_ids = [wallet_ids] wallet_ids = [wallet_ids]
q = ",".join([f"'{wallet_id}'" for wallet_id in wallet_ids]) q = ",".join([f"'{wallet_id}'" for wallet_id in wallet_ids])

View file

@ -1,5 +1,4 @@
from datetime import datetime from datetime import datetime
from typing import Optional
from fastapi import Query from fastapi import Query
from pydantic import BaseModel, EmailStr, root_validator from pydantic import BaseModel, EmailStr, root_validator
@ -15,7 +14,7 @@ class CreateEvent(BaseModel):
currency: str = "sat" currency: str = "sat"
amount_tickets: int = Query(..., ge=0) amount_tickets: int = Query(..., ge=0)
price_per_ticket: float = Query(..., ge=0) price_per_ticket: float = Query(..., ge=0)
banner: Optional[str] = None banner: str | None = None
class CreateTicket(BaseModel): class CreateTicket(BaseModel):
@ -50,7 +49,7 @@ class Event(BaseModel):
price_per_ticket: float price_per_ticket: float
time: datetime time: datetime
sold: int = 0 sold: int = 0
banner: Optional[str] = None banner: str | None = None
class Ticket(BaseModel): class Ticket(BaseModel):

2615
poetry.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,39 +1,34 @@
[tool.poetry] [project]
name = "lnbits-events" name = "lnbits-events"
version = "0.0.0" version = "0.0.0"
requires-python = ">=3.10,<3.13"
description = "LNbits, free and open-source Lightning wallet and accounts system." description = "LNbits, free and open-source Lightning wallet and accounts system."
authors = ["Alan Bits <alan@lnbits.com>"] authors = [{ name = "Alan Bits", email = "alan@lnbits.com" }]
urls = { Homepage = "https://lnbits.com", Repository = "https://github.com/lnbits/events" }
dependencies = [ "lnbits>1" ]
[tool.poetry.dependencies] [tool.poetry]
python = "^3.10 | ^3.9" package-mode = false
lnbits = {version = "*", allow-prereleases = true}
[tool.poetry.group.dev.dependencies] [tool.uv]
black = "^24.3.0" dev-dependencies = [
pytest-asyncio = "^0.21.0" "black",
pytest = "^7.3.2" "pytest-asyncio",
mypy = "^1.5.1" "pytest",
pre-commit = "^3.2.2" "mypy",
ruff = "^0.3.2" "pre-commit",
"ruff",
[build-system] ]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
[tool.mypy] [tool.mypy]
exclude = "(nostr/*)" exclude = "(nostr/*)"
[[tool.mypy.overrides]] plugins = ["pydantic.mypy"]
module = [
"lnbits.*", [tool.pydantic-mypy]
"lnurl.*", init_forbid_extra = true
"loguru.*", init_typed = true
"fastapi.*", warn_required_dynamic_aliases = true
"pydantic.*", warn_untyped_fields = true
"pyqrcode.*",
"shortuuid.*",
"httpx.*",
]
ignore_missing_imports = "True"
[tool.pytest.ini_options] [tool.pytest.ini_options]
log_cli = false log_cli = false
@ -76,6 +71,7 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
# needed for pydantic # needed for pydantic
[tool.ruff.lint.pep8-naming] [tool.ruff.lint.pep8-naming]
classmethod-decorators = [ classmethod-decorators = [
"validator",
"root_validator", "root_validator",
] ]

View file

@ -72,11 +72,10 @@
</q-card> </q-card>
<q-card v-else class="q-pa-lg q-pt-xl lnbits__dialog-card"> <q-card v-else class="q-pa-lg q-pt-xl lnbits__dialog-card">
<div class="text-center q-mb-lg"> <div class="text-center q-mb-lg">
<a class="text-secondary" :href="'lightning:' + receive.paymentReq">
<lnbits-qrcode <lnbits-qrcode
:href="'lightning:' + receive.paymentReq"
:value="'lightning:' + receive.paymentReq.toUpperCase()" :value="'lightning:' + receive.paymentReq.toUpperCase()"
></lnbits-qrcode> ></lnbits-qrcode>
</a>
</div> </div>
<div class="row q-mt-lg"> <div class="row q-mt-lg">
<q-btn outline color="grey" @click="copyText(receive.paymentReq)" <q-btn outline color="grey" @click="copyText(receive.paymentReq)"

2262
uv.lock generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,5 @@
from datetime import datetime, timezone from datetime import datetime, timezone
from http import HTTPStatus from http import HTTPStatus
from typing import Optional
from fastapi import APIRouter, Depends, Query from fastapi import APIRouter, Depends, Query
from lnbits.core.crud import get_standalone_payment, get_user from lnbits.core.crud import get_standalone_payment, get_user
@ -69,7 +68,7 @@ async def api_events_public():
async def api_event_create( async def api_event_create(
data: CreateEvent, data: CreateEvent,
wallet: WalletTypeInfo = Depends(require_admin_key), wallet: WalletTypeInfo = Depends(require_admin_key),
event_id: Optional[str] = None, event_id: str | None = None,
): ):
if event_id: if event_id:
event = await get_event(event_id) event = await get_event(event_id)