Skip to content

Commit b0f571d

Browse files
DoktorShiftpieterjm
authored andcommitted
Merge pull request #6 from DoktorShift/Add-Timezone
Add timezone
2 parents 954f1ab + 835d1ce commit b0f571d

File tree

6 files changed

+68
-4
lines changed

6 files changed

+68
-4
lines changed

crud.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from loguru import logger
1313

1414
from datetime import datetime
15+
from zoneinfo import ZoneInfo
16+
1517
from time import time
1618

1719
import re
@@ -32,7 +34,7 @@ async def create_device(data: CreateLnurldevice, req: Request) -> Lnurldevice:
3234
)
3335

3436
await db.execute(
35-
"INSERT INTO devicetimer.device (id, key, title, wallet, currency, available_start, available_stop, timeout, closed_url, wait_url, maxperday, switches) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
37+
"INSERT INTO devicetimer.device (id, key, title, wallet, currency, available_start, available_stop, timeout, timezone, closed_url, wait_url, maxperday, switches) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
3638
(
3739
device_id,
3840
device_key,
@@ -42,6 +44,7 @@ async def create_device(data: CreateLnurldevice, req: Request) -> Lnurldevice:
4244
data.available_start,
4345
data.available_stop,
4446
data.timeout,
47+
data.timezone,
4548
data.closed_url,
4649
data.wait_url,
4750
data.maxperday,
@@ -80,6 +83,7 @@ async def update_device(
8083
available_start = ?,
8184
available_stop = ?,
8285
timeout = ?,
86+
timezone = ?,
8387
closed_url = ?,
8488
maxperday = ?,
8589
wait_url = ?,
@@ -93,6 +97,7 @@ async def update_device(
9397
data.available_start,
9498
data.available_stop,
9599
data.timeout,
100+
data.timezone,
96101
data.closed_url,
97102
data.maxperday,
98103
data.wait_url,
@@ -240,7 +245,7 @@ async def get_payment_allowed(
240245
device: Lnurldevice, switch: LnurldeviceSwitch
241246
) -> PaymentAllowed:
242247

243-
now = datetime.now()
248+
now = datetime.now(ZoneInfo(device.timezone))
244249
minutes = now.hour * 60 + now.minute
245250

246251
start_minutes = get_minutes(device.available_start)

migrations.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,15 @@ async def m004_redux(db):
5858
ALTER TABLE devicetimer.device ADD COLUMN maxperday INT DEFAULT 0
5959
"""
6060
)
61+
62+
async def m005_redux(db):
63+
await db.execute(
64+
f"""
65+
ALTER TABLE devicetimer.device ADD COLUMN timezone TEXT DEFAULT 'europe/amsterdam';
66+
"""
67+
)
68+
await db.execute(
69+
f"""
70+
UPDATE devicetimer.device SET timezone='europe/amsterdam'
71+
"""
72+
)

models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class CreateLnurldevice(BaseModel):
2626
available_start: str
2727
available_stop: str
2828
timeout: int
29+
timezone: str
2930
maxperday: Optional[int]
3031
closed_url: Optional[str]
3132
wait_url: Optional[str]
@@ -43,6 +44,7 @@ class Lnurldevice(BaseModel):
4344
available_start: str
4445
available_stop: str
4546
timeout: int
47+
timezone: str
4648
maxperday: Optional[int]
4749
closed_url: Optional[str]
4850
wait_url: Optional[str]

tasks.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
11
import asyncio
22

33
from lnbits.core.models import Payment
4-
from lnbits.core.services import websocketUpdater
4+
55
from lnbits.helpers import get_current_extension_name
66
from lnbits.tasks import register_invoice_listener
77

88
from .crud import get_payment, update_payment, get_device
99

10+
from lnbits.extension_manager import version_parse
11+
from lnbits.settings import settings
12+
13+
# from LNbits release 0.12.6 the websocketUpdater function was renamed to websocket_updater
14+
print(settings.version)
15+
print(version_parse(settings.version))
16+
if version_parse(settings.version) >= version_parse("0.12.6"):
17+
from lnbits.core.services import websocket_updater
18+
else:
19+
from lnbits.core.services import websocketUpdater as websocket_updater
20+
1021
async def wait_for_paid_invoices():
1122
invoice_queue = asyncio.Queue()
1223
register_invoice_listener(invoice_queue, get_current_extension_name())
@@ -45,7 +56,7 @@ async def on_invoice_paid(payment: Payment) -> None:
4556
if not switch:
4657
return
4758

48-
return await websocketUpdater(
59+
return await websocket_updater(
4960
device_payment.deviceid,
5061
f"{switch.gpio_pin}-{switch.gpio_duration}"
5162
)

templates/devicetimer/index.html

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,16 @@ <h6 class="text-subtitle1 q-my-none">
233233
:options="currency"
234234
></q-select>
235235

236+
<q-select
237+
filled
238+
dense
239+
v-model.trim="formDialoglnurldevice.data.timezone"
240+
type="text"
241+
label="Timezone for the device"
242+
:options="timezone"
243+
></q-select>
244+
245+
236246
<q-input
237247
filled
238248
dense
@@ -442,6 +452,7 @@ <h6 class="text-subtitle1 q-my-none">
442452
wslocation: window.location.hostname,
443453
filter: '',
444454
currency: 'USD',
455+
timezone: 'Europe/Amsterdam',
445456
lnurlValue: '',
446457
qrcode_url: '',
447458
websocketMessage: '',
@@ -743,6 +754,15 @@ <h6 class="text-subtitle1 q-my-none">
743754
.catch(err => {
744755
LNbits.utils.notifyApiError(err)
745756
})
757+
LNbits.api
758+
.request('GET', '/devicetimer/api/v1/timezones')
759+
.then(response => {
760+
this.timezone = ['Europe/Amsterdam', ...response.data]
761+
})
762+
.catch(err => {
763+
LNbits.utils.notifyApiError(err)
764+
})
765+
746766
}
747767
})
748768
</script>

views_api.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from fastapi import Depends, HTTPException, Query, Request
44
from loguru import logger
55
import re
6+
import zoneinfo
67

78
from lnbits.core.crud import get_user, update_payment_extra
89
from lnbits.decorators import (
@@ -30,6 +31,9 @@
3031
async def api_list_currencies_available():
3132
return list(currencies.keys())
3233

34+
@devicetimer_ext.get("/api/v1/timezones")
35+
async def api_list_timezones_available():
36+
return sorted(zoneinfo.available_timezones(),key=str.lower)
3337

3438
@devicetimer_ext.post("/api/v1/device", dependencies=[Depends(require_admin_key)])
3539
async def api_lnurldevice_create(data: CreateLnurldevice, req: Request):
@@ -38,6 +42,11 @@ async def api_lnurldevice_create(data: CreateLnurldevice, req: Request):
3842
raise HTTPException(
3943
status_code=HTTPStatus.BAD_REQUEST, detail="Opening time format must be hh:mm"
4044
)
45+
46+
if data.timezone not in zoneinfo.available_timezones():
47+
raise HTTPException(
48+
status_code=HTTPStatus.BAD_REQUEST, detail="Illegal timezone"
49+
)
4150

4251
result = re.search("^\d{2}\:\d{2}$",data.available_stop)
4352
if not result:
@@ -64,6 +73,11 @@ async def api_lnurldevice_update(
6473
raise HTTPException(
6574
status_code=HTTPStatus.BAD_REQUEST, detail="Opening time format must be hh:mm"
6675
)
76+
77+
if data.timezone not in zoneinfo.available_timezones():
78+
raise HTTPException(
79+
status_code=HTTPStatus.BAD_REQUEST, detail="Illegal timezone"
80+
)
6781

6882
result = re.search("^\d{2}\:\d{2}$",data.available_stop)
6983
if not result:

0 commit comments

Comments
 (0)