Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 16 additions & 8 deletions .github/workflows/chore.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,31 @@ jobs:
runs-on: ubuntu-latest

steps:
- name: Get Gitflow App token
uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ secrets.GITFLOW_APP_ID }}
private-key: ${{ secrets.GITFLOW_APP_KEY }}

- name: Checkout Repository
uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}

- name: Merge Source Branch into Develop
run: |
git config --global user.name "bot"
git config --global user.email "bot@colorifix.com"
git fetch
git checkout develop
git fetch origin
git switch develop
git merge --no-ff origin/${{ github.event.pull_request.head.ref }} -m "Merge ${{ github.event.pull_request.head.ref }} into develop"
git push origin develop

- name: Build docs
if: startsWith(github.event.pull_request.head.ref, 'docs/')
run: foo

publish-docs:
name: Publish Documentation
name: Publish documentation
runs-on: ubuntu-latest
if: startsWith(github.event.pull_request.head.ref, 'docs/')
if: startsWith(github.event.pull_request.head.ref, 'docs/') || startsWith(github.event.pull_request.head.ref, 'release/')
permissions:
id-token: write
pages: write
Expand Down Expand Up @@ -66,3 +71,6 @@ jobs:

- name: Deploy pages
uses: actions/deploy-pages@v4

permissions:
contents: write
1 change: 1 addition & 0 deletions .github/workflows/pull.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
pull_request:
branches:
- 'develop'
- 'main'

jobs:
run-tests:
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,14 @@ jobs:
(github.event.pull_request.merged == true &&
startsWith(github.event.pull_request.head.ref, 'release/'))
steps:

- name: Get Gitflow App token
uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ secrets.GITFLOW_APP_ID }}
private-key: ${{ secrets.GITFLOW_APP_KEY }}

- name: Gitflow action
id: gitflow-action
uses: hoangvvo/gitflow-workflow-action@0.3.7
Expand All @@ -35,7 +43,7 @@ jobs:
version_increment: ${{ contains(github.head_ref, 'hotfix/') && 'patch' || '' }}
dry_run: ${{ inputs.dry_run }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}

- name: Checkout code
uses: actions/checkout@v4
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.

## Unreleased

## [2.0.0] - 2026/01/07

- Updating for Notion API version 2025-09-03

## [1.0.0] - 2025/01/31

- First public release
Expand Down
21 changes: 18 additions & 3 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,24 @@ def cover_url() -> str:

@fixture
def example_page_id() -> str:
return "e439b7a7296d45b98805f24c9cfc2115"
return "2cef2075b1dc803a8ec3d142ac105817"


@fixture(scope="session")
def database_id() -> str:
return "2cef2075b1dc8023b0ece0dbf9b278f7"


@fixture(scope="session")
def data_source_id1() -> str:
return "2cef2075b1dc80bab834000b42b068d7"


@fixture
def data_source_id2() -> str:
return "2cef2075b1dc80048d8d000b1b75df8f"


@fixture
def example_page_id_2() -> str:
return "d5bce0a0fe6248d0a120c6c693d9b597"
def block_id() -> str:
return "2cef2075b1dc80a59d6ad9ed97846ff8"
154 changes: 154 additions & 0 deletions docs/get_started/data_sources.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
## Retrieve a data source

=== "Async"

```python
async def main():
async_api = AsyncNotionAPI(access_token='<NOTION_TOKEN>')
data_source = await async_api.get_data_source(data_source_id='<DATA_SOURCE_ID>')
```

=== "Sync"

```python
api = NotionAPI(access_token='<NOTION_TOKEN>')
data_source = api.get_data_source(data_source_id='<DATA_SOURCE_ID>')
```

## Query

=== "Async"

```python
async def main():
async_api = AsyncNotionAPI(access_token='<NOTION_TOKEN>')
data_source = await async_api.get_data_source(data_source_id='<DATA_SOURCE_ID>')

async for page in data_source.query():
...
```

=== "Sync"

```python
api = NotionAPI(access_token='<NOTION_TOKEN>')
data_source = api.get_data_source(data_source_id='<DATA_SOURCE_ID>')

for page in data_source.query():
...
```

### Filters

You can use filter classes in `python_notion_api.models.filters` to create property filters and pass them to the query.

=== "Async"

```python
from python_notion_api.models.filters import SelectFilter

async def main():
async_api = AsyncNotionAPI(access_token='<NOTION_TOKEN>')
data_source = await async_api.get_data_source(data_source_id='<DATA_SOURCE_ID>')

await for page in data_source.query(
filters=SelectFilter(property='<PROPERTY_NAME / PROPERTY_ID>', equals='<VALUE>')
):
...
```

=== "Sync"

```python
from python_notion_api.models.filters import SelectFilter

api = NotionAPI(access_token='<NOTION_TOKEN>')
data_source = api.get_data_source(data_source_id='<DATA_SOURCE_ID>')

for page in data_source.query(
filters=SelectFilter(property='<PROPERTY_NAME / PROPERTY_ID>', equals='<VALUE>')
):
...
```

'and' and 'or' filters are supported:

=== "Async"

```python
from python_notion_api.models.filters import SelectFilter, or_filter, and_filter

async def main():
async_api = AsyncNotionAPI(access_token='<NOTION_TOKEN>')
data_source = await async_api.get_data_source(data_source_id='<DATA_SOURCE_ID>')

await for page in data_source.query(
filters=or_filter([
SelectFilter(property="Select", equals="xxx"),
and_filter([
NumberFilter(property="Number", greater_than=10),
CheckboxFilter(property="Checkbox", equals=True)
])
])
):
...
```

=== "Sync"

```python
from python_notion_api.models.filters import SelectFilter, or_filter, and_filter

api = NotionAPI(access_token='<NOTION_TOKEN>')
data_source = api.get_data_source(data_source_id='<DATA_SOURCE_ID>')

for page in data_source.query(
filters=or_filter([
SelectFilter(property="Select", equals="xxx"),
and_filter([
NumberFilter(property="Number", greater_than=10),
CheckboxFilter(property="Checkbox", equals=True)
])
])
)
...
```

You can read more on filters [here](https://developers.notion.com/reference/post-database-query-filter){:target="_blank"}

### Sorts

You can use `python_notion_api.models.sorts.Sort` class to create sorts and pass them to the query.

=== "Async"

```python
from python_notion_api.models.sorts import Sort

async def main():
async_api = AsyncNotionAPI(access_token='<NOTION_TOKEN>')
data_source = await async_api.get_data_source(data_source_id='<DATA_SOURCE_ID>')

await for page in data_source.query(
sorts=[
Sort(property="Title"),
Sort(property="Date", descending=True)
]
):
```

=== "Sync"

```python
from python_notion_api.models.sorts import Sort

api = NotionAPI(access_token='<NOTION_TOKEN>')
data_source = api.get_data_source(data_source_id='<DATA_SOURCE_ID>')

for page in data_source.query(
sorts=[
Sort(property="Title"),
Sort(property="Date", descending=True)
]
)
```
Loading
Loading