1- from typing import Any , Dict , Optional
1+ from typing import Any , Dict , List , Optional , Union
22
33import requests
44
5- from notion .model import Page
5+ from notion .model .common .utils import UUIDv4
6+ from notion .model .databases .database import Database
7+ from notion .model .filters import Filter
8+ from notion .model .page import Page
69
710API_BASE_URL = "https://api.notion.com/v1/"
811API_VERSION = "2022-02-22"
@@ -41,7 +44,7 @@ def _paginate(
4144 entity : str ,
4245 payload : Optional [Dict [str , Any ]] = None ,
4346 limit : Optional [int ] = None ,
44- ) -> list :
47+ ) -> List [ dict ] :
4548 if payload is None :
4649 payload = {}
4750
@@ -59,21 +62,65 @@ def _paginate(
5962 return results [:limit ]
6063
6164 # ---------------------------------------------------------------------------
62- # Pages
65+ # Databases
6366 # ---------------------------------------------------------------------------
6467
65- def get_pages (self , database_id , filter_ : Optional [dict ] = None ):
66- return self ._paginate ("post" , f"databases/{ database_id } /query" , filter_ )
68+ def get_database (self , database_id ) -> Database :
69+ "Get a single Notion database by its ID."
70+ data = self ._make_request ("get" , f"databases/{ database_id } " )
71+ return Database .from_json (data ).with_client (self )
72+
73+ def query_database (
74+ self ,
75+ database_id ,
76+ filter_ : Optional [Union [Filter , dict ]] = None ,
77+ sort : Optional [dict ] = None ,
78+ ) -> List [Page ]:
79+ "Query a Notion database for pages given some filter(s)."
80+ filter_ = {
81+ "filter" : filter_ .to_json () if isinstance (filter_ , Filter ) else filter_
82+ }
83+ data = self ._paginate (
84+ "post" , f"databases/{ database_id } /query" , {** filter_ , ** (sort or {})}
85+ )
86+ return [Page .from_json (page_data ).with_client (self ) for page_data in data ]
87+
88+ def create_database (self , database : Database , parent_id : Optional [UUIDv4 ] = None ):
89+ "Create a new Notion database."
90+ if parent_id :
91+ database ._data ["parent" ] = {"type" : "page_id" , "page_id" : parent_id }
92+ response = self ._make_request ("post" , "databases" , database ._data )
93+ database ._data = response
94+ database ._client = self
95+
96+ def update_database (self , database_id , payload : dict ) -> dict :
97+ "Update properties of an existing Notion database."
98+ return self ._make_request ("patch" , f"databases/{ database_id } " , payload )
99+
100+ def delete_database (self , page_id ):
101+ """Deletes the Notion Page with the given ID.
102+
103+ The Notion API does not offer a DELETE method but insteads works by setting the `archived` field.
104+ """
105+ return self .update_database (page_id , {"archived" : True })
106+
107+ # ---------------------------------------------------------------------------
108+ # Pages
109+ # ---------------------------------------------------------------------------
67110
68111 def get_page (self , page_id ):
112+ "Get a single Notion page by its ID."
69113 data = self ._make_request ("get" , f"pages/{ page_id } " )
70114 return Page (client = self , data = data )
71115
72- def create_page (self , page ) -> Page :
73- response = self ._make_request ("post" , "pages" , page )
116+ def create_page (self , page : Union [Page , dict ]) -> Page :
117+ "Create a new Notion page."
118+ page_data = page .to_json () if isinstance (page , Page ) else page
119+ response = self ._make_request ("post" , "pages" , page_data )
74120 return response
75121
76122 def update_page (self , page_id , payload : dict ):
123+ "Update properties of an existing Notion page."
77124 return self ._make_request ("patch" , f"pages/{ page_id } " , payload )
78125
79126 def delete_page (self , page_id ):
@@ -88,12 +135,15 @@ def delete_page(self, page_id):
88135 # ---------------------------------------------------------------------------
89136
90137 def update_block (self , block_id , payload : dict ):
138+ "Update properties of an existing Notion page."
91139 return self ._make_request ("patch" , f"blocks/{ block_id } " , payload )
92140
93141 def retrieve_block_children (self , block_id : str , limit : Optional [int ] = None ):
142+ "Retrieve children of a given block."
94143 return self ._make_request ("get" , f"blocks/{ block_id } /children" )
95144
96145 def append_block_children (self , block_id : str , children : str ):
146+ "Append children blocks to an existing block"
97147 return self ._make_request (
98148 "patch" , f"blocks/{ block_id } /children" , {"children" : children }
99149 )
@@ -105,6 +155,10 @@ def delete_block(self, block_id: str):
105155 """
106156 return self .update_block (block_id , {"archived" : True })
107157
158+ # ---------------------------------------------------------------------------
159+ # Search
160+ # ---------------------------------------------------------------------------
161+
108162 def search (
109163 self ,
110164 query : str ,
@@ -120,4 +174,4 @@ def search(
120174 payload ["filter" ] = filter
121175
122176 results = self ._paginate ("post" , "search" , payload , limit )
123- return [Page ( data = p , client = self ) for p in results ]
177+ return [Page . from_json ( page_data ). with_client ( self ) for page_data in results ]
0 commit comments