標準課題 (2023)

2023 年の標準課題は、「簡易共有カレンダー」です。 複数人で情報を共有できるようなカレンダーを作成しましょう。

「オプション」と書いてある場所は、余力のある人だけ対応してくれれば OK です。

データ構造

簡易共有カレンダーですが、以下のようなデータ構造にしましょう。 UID_A などと書いているのは、各ユーザの firebase における User ID (20字以上の長いやつ)です。

{ "calendar": {
    "20231001": {
      "UID_A": {
        "title": "授業P",
        "tag": "jugyo"
      },
      "UID_B": {
        "title": "用事",
        "tag": "private"
      }      
    },
    "20231002": { ... }
  }
}

各ユーザは自分の UID 以下に自身の情報を配置します。 また、’“calendar”’ 以下は、すべての利用者の情報が読み込めるものとします。 セキュリティルールはこんな感じ。

{
    "rules": {
        "calendar": {
            "$date": {
                "$uid": {
                    ".write": "$uid === auth.uid",
                }
            },
            ".read": "auth.uid !== null"
        }
    }
}

基本課題

まずは、各自の予定のカレンダーへの登録機能と、指定日の全員の予定取得機能を Web API を介して取得できるようにしましょう。

  • 指定の日付(例: “20231001”)の各ユーザの情報一覧
    • def get_events(self, date) みたいな関数にすればいいかと。
  • 指定の日付(例: “20231001”)に、自分の user id を指定して、データを書き込む
    • def set_events(self, date, content) みたいな関数にすればいいかと。content は JSON を渡せるようにしておきましょう。

実際に、これらの関数を呼んで予定を登録したり、取得したりできるプログラムをつくりましょう。 対話型のプログラムでもいいですし、上記機能がそれぞれコマンドとして使えるような感じでもいいです。 (あとで、例を追記予定)

データ拡張(オプション)

上のデータ構造では、カレンダーに private なデータをおけなくてイヤですよね。ってことで、event 詳細は、別のところに置くようにしましょう。

  • /events/{$uid}/ 以下に、各ユーザ $uid のイベント詳細を配置する。セキュリティルールも、基本自分のところしか見えないようにする。
  • /calendar/{$date}/{$uid}/ 以下に eventID 属性として配置するが、中身は当人しか見えない。
{ "calendar": {
    "20231001": {
      "UID_A": {
        "title": "授業P",
        "tag": "jugyo"
      },
      "UID_B": {
        "title": "用事",
        "tag": "private",
        "eventID": "EventID0"

      }      
    },
    "20231002": { ... }
  },
  "events": {
    "UID_A": {
      "EventID0": {
        "name": "バイト",
        "場所": "..."
      }
    },
    "UID_B": { ... }
  }
}

さらなる拡張として「グループ共有」機能をつけてもいいですね。group 属性に列挙されたユーザは、詳細情報まで確認できるとか。

  "events": {
    "UID_A": {
      "EventID0": {
        "name": "バイト",
        "場所": "...",
        "group": [ "UID_B", "UID_C"]
      }
    },

GUI をつけましょう(オプション)

日付を選んでカレンダー表示したり、予定を追加したり、詳細情報いれたり、まあ、いろいろ出来そうですよね。 単純に、Input から年月日を入力してもいいですし、PySimpleGUI には CalendarButton とかもあるようです。