I. Giới thiệu

Báo cáo phát triển này nhằm trình bày cách sử dụng Notion API để tự động hóa lịch tập luyện. Notion là công cụ năng suất toàn diện cho phép người dùng tạo và tổ chức cơ sở dữ liệu, ghi chú, tác vụ và nhiều hơn nữa. Notion API cung cấp cho các nhà phát triển khả năng truy cập lập trình vào các tính năng của Notion, cho phép tự động hóa nhiều tác vụ khác nhau.

Đoạn code được cung cấp minh họa cách sử dụng Notion API để tạo các sự kiện tập luyện trong cơ sở dữ liệu dựa trên lịch trình được định sẵn. Script sẽ lấy các sự kiện hiện có trong một khoảng ngày cụ thể và tạo sự kiện mới cho những ngày chưa có lịch. Lịch tập luyện được định nghĩa trong từ điển days_of_week, ánh xạ mỗi ngày trong tuần tới tên bài tập và danh sách thẻ.

Bằng cách tự động hóa quy trình lập lịch tập luyện với Notion API, các nhà phát triển có thể tiết kiệm thời gian và giảm thiểu lỗi thủ công. Báo cáo này sẽ cung cấp hướng dẫn từng bước giúp bạn thiết lập Notion API và hiểu các thành phần khác nhau của đoạn code.

II. Thiết lập Notion API

Để sử dụng Notion API, bạn cần có tài khoản Notion và một integration đã được thiết lập. Dưới đây là hướng dẫn từng bước để xác thực với Notion API:

  1. Tạo integration trong Notion

    • Đăng nhập vào Notion và điều hướng đến trang Integrations bằng cách nhấp vào biểu tượng hồ sơ ở góc dưới bên trái màn hình, sau đó nhấp vào “Integrations”.
    • Nhấp vào nút “Create a new integration”.
    • Đặt tên cho integration và chọn workspace bạn muốn sử dụng.
    • Nhấp vào nút “Submit” để tạo integration.
  2. Lấy token integration

    • Sau khi integration được tạo, bạn có thể lấy token bằng cách nhấp vào tên integration.
    • Sao chép token integration để dùng trong code của bạn.
  3. Cài đặt gói Notion API

    • Mở terminal hoặc command prompt.

    • Chạy lệnh sau để cài đặt gói Notion API:

      pip install notion-client
      
  4. Thiết lập Notion API client

    • Nhập Notion API client vào code bằng cách thêm dòng sau ở đầu file:

      from notion_client import Client
      
    • Xác thực client bằng cách thêm dòng sau và thay <API Key> bằng token integration của bạn:

      notion = Client(auth="<API Key>")
      
  5. Thiết lập thông tin cơ sở dữ liệu

    • Lấy ID của cơ sở dữ liệu nơi bạn muốn thêm sự kiện.
    • Thay biến database_id trong đoạn code bằng ID cơ sở dữ liệu của bạn.

Đoạn code sử dụng đối tượng notion_client.Client để tương tác với Notion API. Đối tượng Client dùng để xác thực API client và cung cấp quyền truy cập vào các tài nguyên Notion khác nhau như cơ sở dữ liệu và trang.

Biến database_id được đặt thành ID của cơ sở dữ liệu Notion nơi các sự kiện tập luyện sẽ được thêm vào. ID có thể tìm thấy trong URL của cơ sở dữ liệu.

III. Định nghĩa lịch tập luyện

Lịch tập luyện được định nghĩa trong đoạn code bằng các biến sau:

  • start_days_ago: số ngày trước ngày hôm nay để bắt đầu lịch
  • end_days_after: số ngày sau ngày hôm nay để kết thúc lịch
  • days_of_week: từ điển ánh xạ mỗi ngày trong tuần tới tên bài tập và danh sách thẻ.

Từ điển days_of_week dùng để định nghĩa kế hoạch tập luyện cho từng ngày trong tuần. Mỗi ngày là một khóa trong từ điển, giá trị tương ứng là một từ điển khác chứa tên bài tập và danh sách thẻ liên quan. Ví dụ:

days_of_week = {
    "Monday": {"name": "DAY 1", "tag": ["chest", "triceps"]},
    "Tuesday": {"name": "DAY 2", "tag": ["back", "biceps"]},
    "Wednesday": {"name": "DAY 3", "tag": ["lower body", "shoulder"]},
    "Thursday": {"name": "DAY 1", "tag": ["chest", "triceps"]},
    "Friday": {"name": "DAY 2", "tag": ["back", "biceps"]},
    "Saturday": {"name": "DAY 3", "tag": ["lower body", "shoulder"]},
}

Trong ví dụ này, lịch được chia thành ba ngày, mỗi ngày có bài tập cụ thể và các thẻ liên quan.

Các biến start_days_agoend_days_after dùng để định nghĩa khoảng ngày cho lịch tập luyện. start_days_ago chỉ định bao nhiêu ngày trước hôm nay để bắt đầu lịch, và end_days_after chỉ định bao nhiêu ngày sau hôm nay để kết thúc lịch.

Đoạn code sử dụng module datetime để lấy ngày hôm nay và tính toán ngày bắt đầu và kết thúc của lịch tập luyện. Ngày bắt đầu được tính bằng cách trừ start_days_ago từ ngày hôm nay, ngày kết thúc được tính bằng cách cộng end_days_after vào ngày hôm nay. Các ngày được định dạng theo chuỗi %Y-%m-%d.

IV. Truy vấn sự kiện hiện có

Trước khi tạo sự kiện tập luyện mới, đoạn code lấy các sự kiện hiện có trong khoảng ngày đã định. Điều này nhằm tránh tạo sự kiện trùng lặp trên cùng một ngày.

Phương thức notion.databases.query() dùng để truy vấn cơ sở dữ liệu Notion và lấy các sự kiện hiện có. Tham số filter dùng để chỉ định điều kiện lọc cho truy vấn. Trong trường hợp này, bộ lọc được đặt để lấy các sự kiện nằm trong khoảng ngày bắt đầu và kết thúc đã định. Dưới đây là ví dụ về bộ lọc được dùng trong truy vấn:

{
    "and": [
        {"property": "Date", "date": {"on_or_after": start_date}},
        {"property": "Date", "date": {"on_or_before": end_date}}
    ]
}

Bộ lọc này trả về các sự kiện có thuộc tính Date nằm giữa start_dateend_date.

Thuộc tính results của phản hồi truy vấn dùng để lấy các sự kiện hiện có trong khoảng ngày. Kết quả được lưu vào biến existing_events để dùng sau trong đoạn code.

existing_events = notion.databases.query(
    **{
        "database_id": database_id,
        "filter": {
            "and": [
                {"property": "Date", "date": {"on_or_after": start_date}},
                {"property": "Date", "date": {"on_or_before": end_date}}
            ]
        },
    }
).get("results")

V. Tạo sự kiện mới

Sau khi đã lấy được các sự kiện hiện có trong khoảng ngày, đoạn code tiến hành tạo sự kiện tập luyện mới cho từng ngày trong khoảng ngày của lịch.

Đoạn code sử dụng vòng lặp for để duyệt qua từng ngày trong khoảng. Sự kiện mới được tạo cho mỗi ngày không phải Chủ nhật:

for date in (datetime.now() + timedelta(days=n) for n in range(-start_days_ago, end_days_after + 1)):
    # skip Sundays
    if date.strftime("%A") == "Sunday":
        continue

Phương thức strftime() dùng để lấy tên ngày trong tuần từ ngày, và nếu tên ngày là “Sunday”, vòng lặp bỏ qua ngày đó và chuyển sang ngày tiếp theo.

Tiếp theo, đoạn code kiểm tra xem đã có sự kiện nào vào ngày hiện tại chưa:

if any(event.get("properties").get("Date").get("date").get("start") == date.strftime("%Y-%m-%d") for event in existing_events):
    print(f"Event already exists for {date.strftime('%Y-%m-%d')}. Skipping.")
    continue

Nếu đã có sự kiện vào ngày hiện tại, vòng lặp bỏ qua ngày đó và chuyển sang ngày tiếp theo.

Nếu không có sự kiện nào vào ngày hiện tại, sự kiện mới được tạo với tên bài tập và thẻ liên quan đến ngày đó trong tuần:

day_of_week = date.strftime("%A")
event_name = days_of_week[day_of_week]["name"]
event_tag = days_of_week[day_of_week]["tag"]
new_event = {
    "Name": {"title": [{"text": {"content": event_name}}]},
    "Date": {"date": {"start": date.strftime("%Y-%m-%d")}},
    "Tag": {"multi_select": [{"name": tag} for tag in event_tag]},
}
notion.pages.create(parent={"database_id": database_id}, properties=new_event)

Tên bài tập và thẻ liên quan đến ngày trong tuần được lấy từ từ điển days_of_week. Từ điển new_event dùng để định nghĩa các thuộc tính của sự kiện mới, bao gồm tên sự kiện, ngày và thẻ. Phương thức notion.pages.create() dùng để tạo sự kiện mới trong cơ sở dữ liệu Notion.

Bằng cách tạo sự kiện mới cho từng ngày trong tuần trong khoảng ngày của lịch, các nhà phát triển có thể tự động hóa quy trình lập lịch tập luyện và đảm bảo kế hoạch luôn được cập nhật và chính xác.

VI. Kết luận

Trong dự án này, chúng ta đã trình bày cách sử dụng Notion API để tự động hóa quy trình tạo lịch tập luyện trong cơ sở dữ liệu Notion. Đoạn code được cung cấp có thể dùng để tạo lịch tập luyện cho một khoảng ngày cụ thể và tự động thêm sự kiện mới vào cơ sở dữ liệu dựa trên kế hoạch tập luyện đã định.

Notion API có thể dùng để tự động hóa nhiều loại tác vụ, chẳng hạn như quản lý danh sách việc cần làm, theo dõi chi phí hoặc sắp xếp tác vụ dự án. Với Notion API, các nhà phát triển có thể xây dựng tích hợp tùy chỉnh và tự động hóa các tác vụ lặp đi lặp lại, tiết kiệm thời gian và tăng năng suất.

Nhìn chung, Notion API cung cấp công cụ mạnh mẽ cho các nhà phát triển để tích hợp Notion vào quy trình làm việc và tự động hóa các tác vụ. Khi Notion ngày càng phổ biến, chúng ta có thể kỳ vọng thấy nhiều nhà phát triển hơn xây dựng tích hợp và tự động hóa tác vụ với Notion API.

Trong tương lai, chúng tôi dự định mở rộng dự án này bằng cách thêm nhiều tính năng hơn và tích hợp với các công cụ khác. Chúng tôi cũng dự định khám phá các trường hợp sử dụng khác của Notion API và tìm hiểu cách nó có thể tự động hóa các tác vụ khác trong quy trình làm việc.


Source code : https://github.com/hobbyworker/notion-workout-scheduler