|
|
@@ -10,9 +10,9 @@ import argparse
|
|
|
import asyncio
|
|
|
import json
|
|
|
import sys
|
|
|
-from datetime import date
|
|
|
+from datetime import date, datetime, timedelta
|
|
|
|
|
|
-from room_cal.store import Calendar, DEFAULT_CALENDAR_NAME
|
|
|
+from room_cal.store import DEFAULT_CALENDAR_NAME, get_backend
|
|
|
from room_cal._utils import safe_json_loads, filter_events, service_name
|
|
|
|
|
|
_PREFIX = 'Guest: '
|
|
|
@@ -31,21 +31,23 @@ def _build_description(xd: dict, wk: str, ws: str | None, dc: str) -> str:
|
|
|
|
|
|
|
|
|
async def patch(target: date, new_wifi: str | None, new_ssid: str | None, new_door: str | None, calendar_name: str) -> None:
|
|
|
- cal = Calendar(calendar_name)
|
|
|
- events = await cal.fetch_date_range(target, target)
|
|
|
- reservations = filter_events(events, _PREFIX, all_day=False)
|
|
|
+ backend = get_backend(calendar_name)
|
|
|
+ start = datetime(target.year, target.month, target.day)
|
|
|
+ end = start + timedelta(days=1)
|
|
|
+ records = await backend.fetch_range(start, end)
|
|
|
+ reservations = filter_events(records, _PREFIX, all_day=False)
|
|
|
|
|
|
if not reservations:
|
|
|
print(f"No reservation found overlapping {target}", file=sys.stderr)
|
|
|
sys.exit(1)
|
|
|
|
|
|
if len(reservations) > 1:
|
|
|
- reservations.sort(key=lambda e: e['start'])
|
|
|
+ reservations.sort(key=lambda e: e.start)
|
|
|
event = reservations[-1]
|
|
|
- print(f"Multiple reservations overlap {target}, using the later one ({event['start'].date()} – {event['end'].date()})")
|
|
|
+ print(f"Multiple reservations overlap {target}, using the later one ({event.start.date()} – {event.end.date()})")
|
|
|
else:
|
|
|
event = reservations[0]
|
|
|
- xd = safe_json_loads(event['x_data']) or {}
|
|
|
+ xd = safe_json_loads(event.x_data) or {}
|
|
|
|
|
|
old_wifi = xd.get('wifi_key', '(none)')
|
|
|
old_ssid = xd.get('wifi_ssid')
|
|
|
@@ -55,7 +57,7 @@ async def patch(target: date, new_wifi: str | None, new_ssid: str | None, new_do
|
|
|
ws = new_ssid if new_ssid is not None else old_ssid
|
|
|
dc = new_door if new_door is not None else old_door
|
|
|
|
|
|
- print(f"Reservation: {event['title']} ({event['start'].date()} – {event['end'].date()})")
|
|
|
+ print(f"Reservation: {event.title} ({event.start.date()} – {event.end.date()})")
|
|
|
if new_wifi is not None:
|
|
|
print(f" wifi_key: {old_wifi!r} → {wk!r}")
|
|
|
if new_ssid is not None:
|
|
|
@@ -74,7 +76,7 @@ async def patch(target: date, new_wifi: str | None, new_ssid: str | None, new_do
|
|
|
new_x_data = json.dumps(xd)
|
|
|
new_description = _build_description(xd, wk, ws, dc)
|
|
|
|
|
|
- await cal.update_event(event, description=new_description, x_data=new_x_data)
|
|
|
+ await backend.update(event.uid, description=new_description, x_data=new_x_data)
|
|
|
print("Updated.")
|
|
|
|
|
|
|