Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions config.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"id": "events",
"version": "1.6.9",
"version": "1.7.0",
"name": "Events",
"repo": "https://github.com/lnbits/events",
"short_description": "Sell and register event tickets",
"description": "",
"tile": "/events/static/image/events.png",
"min_lnbits_version": "1.6.0",
"min_lnbits_version": "1.7.0-rc1",
"contributors": [
{
"name": "talvasconcelos",
Expand Down
2 changes: 1 addition & 1 deletion crud.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ async def purge_unpaid_tickets(event_id: str) -> None:

async def create_event(data: CreateEvent) -> Event:
event_id = urlsafe_short_hash()
event = Event(id=event_id, time=datetime.now(timezone.utc), **data.dict())
event = Event(id=event_id, time=datetime.now(timezone.utc), **data.model_dump())
event = cast(Event, sync_event_ticket_waves(event))
await db.insert("events.events", event)
return event
Expand Down
10 changes: 6 additions & 4 deletions models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from fastapi import Query
from lnbits.db import FilterModel
from pydantic import BaseModel, EmailStr, Field, validator
from pydantic import BaseModel, EmailStr, Field, field_validator


class PromoCode(BaseModel):
Expand All @@ -12,11 +12,13 @@ class PromoCode(BaseModel):
active: bool = True

# make the promo code uppercase
@validator("code")
@field_validator("code")
@classmethod
def uppercase_code(cls, v):
return v.upper()

@validator("discount_percent")
@field_validator("discount_percent")
@classmethod
def validate_discount_percent(cls, v):
assert 0 <= v <= 100, "Discount must be between 0 and 100."
return v
Expand Down Expand Up @@ -103,7 +105,7 @@ class PublicEvent(BaseModel):
allow_fiat: bool = False
fiat_currency: str = "GBP"
price_per_ticket: float
banner: str | None
banner: str | None = None
extra: PublicEventExtra = Field(default_factory=PublicEventExtra)


Expand Down
12 changes: 8 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
[project]
name = "lnbits-events"
version = "0.0.0"
requires-python = ">=3.10,<3.13"
version = "1.7.0"
requires-python = ">=3.10,<3.14"
description = "LNbits, free and open-source Lightning wallet and accounts system."
authors = [{ name = "Alan Bits", email = "alan@lnbits.com" }]
urls = { Homepage = "https://lnbits.com", Repository = "https://github.com/lnbits/events" }
dependencies = [ "lnbits>=1.6.0" ]
dependencies = [ "lnbits>=1.7.0rc1" ]

[dependency-groups]
dev = [
"black",
"pytest-asyncio",
"pytest",
"mypy",
"mypy==1.17.1",
"pre-commit",
"ruff",
]
Expand All @@ -22,6 +22,10 @@ package-mode = false

# Keep UV configuration independent of a parent LNbits checkout.
[tool.uv]
build-constraint-dependencies = ["scikit-build-core<0.10"]

[tool.poetry.dependencies]
python = ">=3.10,<3.13"

[tool.mypy]
exclude = "(nostr/*)"
Expand Down
16 changes: 8 additions & 8 deletions tests/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ async def test_create_wallet_binding(app, event, monkeypatch):
authorize(app, KeyType.admin)
create = AsyncMock(return_value=event)
monkeypatch.setattr(views_api, "create_event", create)
data = CreateEvent(**event.dict()).dict()
data = CreateEvent(**event.model_dump()).model_dump()
async with AsyncClient(
transport=ASGITransport(app), base_url="http://test"
) as client:
Expand Down Expand Up @@ -430,14 +430,14 @@ def test_notification_urls(event, monkeypatch):
paid=True,
time=event.time,
reg_timestamp=event.time,
extra=TicketExtra.parse_obj(
extra=TicketExtra.model_validate(
{
"ticket_base_url": "https://untrusted.example",
"ticket_wave_id": "primary",
}
),
)
assert "ticket_base_url" not in ticket.extra.dict()
assert "ticket_base_url" not in ticket.extra.model_dump()
assert services._ticket_url(ticket) == "https://example.com/events/ticket/ticket"
event.extra.ticket_waves = services.ensure_ticket_waves(event)
event.extra.ticket_waves[0].use_ticket_image = True
Expand Down Expand Up @@ -478,7 +478,7 @@ async def test_refund_payment_flow(payment_database, app, event, monkeypatch, in
buyer_account = await create_account()
buyer = await create_wallet(user_id=buyer_account.id)
await update_wallet_balance(buyer, 2000)
data = CreateEvent(**event.dict())
data = CreateEvent(**event.model_dump())
data.wallet = organiser.id
event = await crud.create_event(data)
async with AsyncClient(
Expand Down Expand Up @@ -582,7 +582,7 @@ async def organiser_key():
@pytest.mark.asyncio
async def test_close_events_isolates_failures(event, monkeypatch):
event.canceled = True
following = event.copy(update={"id": "following"})
following = event.model_copy(update={"id": "following"})
monkeypatch.setattr(
services, "get_closed_events", AsyncMock(return_value=[event, following])
)
Expand All @@ -601,7 +601,7 @@ async def test_close_events_isolates_failures(event, monkeypatch):
@pytest.mark.asyncio
@pytest.mark.parametrize("conditional", [False, True])
async def test_closed_event_cleanup(database, event, conditional):
data = CreateEvent(**event.dict())
data = CreateEvent(**event.model_dump())
data.closing_date = "2000-01-01"
data.extra.conditional = conditional
data.extra.min_tickets = 1
Expand Down Expand Up @@ -646,7 +646,7 @@ async def test_closed_event_cleanup(database, event, conditional):

@pytest.mark.asyncio
async def test_closed_event_update_reopens_processing(database, app, event):
closed = await crud.create_event(CreateEvent(**event.dict()))
closed = await crud.create_event(CreateEvent(**event.model_dump()))
closed.close_processed = True
await crud.update_event(closed)
authorize(app, KeyType.admin)
Expand All @@ -655,7 +655,7 @@ async def test_closed_event_update_reopens_processing(database, app, event):
) as client:
response = await client.put(
f"/events/api/v1/events/{closed.id}",
json=CreateEvent(**closed.dict()).dict(),
json=CreateEvent(**closed.model_dump()).model_dump(),
)
assert response.status_code == 200
stored = await crud.get_event(closed.id)
Expand Down
Loading
Loading