summaryrefslogtreecommitdiff
path: root/providers
diff options
context:
space:
mode:
Diffstat (limited to 'providers')
-rw-r--r--providers/__init__.py18
-rw-r--r--providers/manual.py28
-rw-r--r--providers/sample.py13
3 files changed, 59 insertions, 0 deletions
diff --git a/providers/__init__.py b/providers/__init__.py
new file mode 100644
index 0000000..a32ed09
--- /dev/null
+++ b/providers/__init__.py
@@ -0,0 +1,18 @@
+"""空き枠の取得元。
+
+各 provider は fetch(studio, date) -> list[dict] を持つモジュール。
+返す dict は {"room": str, "hour": int, "status": "free" | "booked"}。
+hour は開始時刻(1時間枠)。studios.json の "provider" で使う provider を選ぶ。
+"""
+
+from . import manual, sample
+
+PROVIDERS = {
+ "sample": sample,
+ "manual": manual,
+}
+
+
+def fetch(studio, date):
+ provider = PROVIDERS[studio["provider"]]
+ return provider.fetch(studio, date)
diff --git a/providers/manual.py b/providers/manual.py
new file mode 100644
index 0000000..4623b26
--- /dev/null
+++ b/providers/manual.py
@@ -0,0 +1,28 @@
+"""manual_slots.json に手で書いた予約済み枠を読む。書いていない枠は空きとみなす。
+
+形式:
+{
+ "uen": {
+ "2026-11-03": {"1st": [18, 19, 20], "2nd": [21]}
+ }
+}
+"""
+
+import json
+from pathlib import Path
+
+PATH = Path(__file__).resolve().parent.parent / "manual_slots.json"
+
+
+def fetch(studio, date):
+ data = json.loads(PATH.read_text(encoding="utf-8")) if PATH.exists() else {}
+ booked = data.get(studio["id"], {}).get(date.isoformat(), {})
+ return [
+ {
+ "room": room,
+ "hour": hour,
+ "status": "booked" if hour in booked.get(room, []) else "free",
+ }
+ for room in studio["rooms"]
+ for hour in range(studio["open"], studio["close"])
+ ]
diff --git a/providers/sample.py b/providers/sample.py
new file mode 100644
index 0000000..86708da
--- /dev/null
+++ b/providers/sample.py
@@ -0,0 +1,13 @@
+"""画面確認用のダミーデータ。日付とスタジオごとに毎回同じ結果を返す。"""
+
+import random
+
+
+def fetch(studio, date):
+ rng = random.Random(f"{studio['id']}:{date.isoformat()}")
+ slots = []
+ for room in studio["rooms"]:
+ for hour in range(studio["open"], studio["close"]):
+ status = "booked" if rng.random() < 0.45 else "free"
+ slots.append({"room": room, "hour": hour, "status": status})
+ return slots