| | import os |
| | from typing import List, Dict, Any |
| | from notion_client import Client |
| | from datetime import datetime |
| | from dotenv import load_dotenv |
| |
|
| | load_dotenv() |
| |
|
| | |
| | if not os.getenv("NOTION_TOKEN"): |
| | raise ValueError("NOTION_TOKEN environment variable is not set") |
| | if not os.getenv("NOTION_PARENT_PAGE_ID"): |
| | raise ValueError("NOTION_PARENT_PAGE_ID environment variable is not set") |
| |
|
| | notion = Client(auth=os.getenv("NOTION_TOKEN")) |
| | parent_page_id = os.getenv("NOTION_PARENT_PAGE_ID") |
| |
|
| | def create_tasks_database() -> str: |
| | """ |
| | Create a new Notion database for tasks. |
| | |
| | Returns: |
| | str: The ID of the created database |
| | |
| | Raises: |
| | Exception: If database creation fails |
| | """ |
| | try: |
| | response = notion.databases.create( |
| | parent={"type": "page_id", "page_id": parent_page_id}, |
| | title=[{"type": "text", "text": {"content": f"NotionTaskSense Tasks - {datetime.now().strftime('%Y-%m-%d')}"}}], |
| | properties={ |
| | "Task": {"title": {}}, |
| | "Category": { |
| | "select": { |
| | "options": [ |
| | {"name": "Career", "color": "blue"}, |
| | {"name": "Learning", "color": "green"}, |
| | {"name": "Personal", "color": "orange"}, |
| | {"name": "Outreach", "color": "purple"}, |
| | {"name": "Health", "color": "red"}, |
| | {"name": "Finance", "color": "yellow"} |
| | ] |
| | } |
| | }, |
| | "Priority": { |
| | "select": { |
| | "options": [ |
| | {"name": "High", "color": "red"}, |
| | {"name": "Medium", "color": "yellow"}, |
| | {"name": "Low", "color": "blue"} |
| | ] |
| | } |
| | }, |
| | "Due Date": {"date": {}}, |
| | "Status": { |
| | "select": { |
| | "options": [ |
| | {"name": "To Do", "color": "gray"}, |
| | {"name": "In Progress", "color": "blue"}, |
| | {"name": "Done", "color": "green"} |
| | ] |
| | } |
| | }, |
| | "Notes": {"rich_text": {}} |
| | } |
| | ) |
| | return response["id"] |
| | except Exception as e: |
| | raise Exception(f"Failed to create Notion database: {str(e)}") |
| |
|
| | def push_tasks_to_notion(tasks: List[Dict[str, Any]], db_id: str) -> None: |
| | """ |
| | Add or update tasks in the Notion database. |
| | |
| | Args: |
| | tasks (List[Dict[str, Any]]): List of task dictionaries |
| | db_id (str): Notion database ID |
| | |
| | Raises: |
| | Exception: If pushing tasks fails |
| | """ |
| | try: |
| | for task in tasks: |
| | properties = { |
| | "Task": {"title": [{"text": {"content": task.get("task", "Untitled Task")}}]}, |
| | "Category": {"select": {"name": task.get("category", "Personal")}}, |
| | "Priority": {"select": {"name": task.get("priority", "Medium")}}, |
| | "Status": {"select": {"name": "To Do"}}, |
| | } |
| |
|
| | if "dueDate" in task and task["dueDate"]: |
| | properties["Due Date"] = {"date": {"start": task["dueDate"]}} |
| |
|
| | if "notes" in task and task["notes"]: |
| | properties["Notes"] = {"rich_text": [{"text": {"content": task["notes"]}}]} |
| |
|
| | notion.pages.create( |
| | parent={"database_id": db_id}, |
| | properties=properties |
| | ) |
| | except Exception as e: |
| | raise Exception(f"Failed to push tasks to Notion: {str(e)}") |
| |
|