├── .gitignore ├── .idea ├── Jira2Notion.iml ├── encodings.xml ├── inspectionProfiles │ └── Project_Default.xml ├── misc.xml ├── modules.xml ├── vcs.xml └── workspace.xml ├── .pylintrc ├── .vscode └── launch.json ├── Chrome - Jira to Notion.applescript ├── LICENSE ├── Safari - Jira to Notion.applescript ├── config.py ├── gui.py ├── jira_manager.py ├── main.py ├── notion_dao ├── __init__.py ├── api_v1.py ├── api_v2.py ├── dao.py └── factory.py ├── readme.md ├── requirements.txt ├── sample_config.txt └── screenshot.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ -------------------------------------------------------------------------------- /.idea/Jira2Notion.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 13 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 22 | 23 | 24 | 26 | 27 | 31 | 32 | 33 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 1576644203242 81 | 93 | 94 | 95 | 96 | 98 | -------------------------------------------------------------------------------- /.pylintrc: -------------------------------------------------------------------------------- 1 | [MESSAGES CONTROL] 2 | disable=W0703, R0902, R0903, R1716, R0801, C0200, R0916, R0914, W0603 -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | 8 | { 9 | "name": "Python: Module", 10 | "type": "python", 11 | "request": "launch", 12 | "module": "main", 13 | "justMyCode": false 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /Chrome - Jira to Notion.applescript: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keremkoseoglu/Jira2Notion/414c758113129dc4cc9595507f3c55b21ae42dc7/Chrome - Jira to Notion.applescript -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Dr. Kerem Koseoglu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Safari - Jira to Notion.applescript: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keremkoseoglu/Jira2Notion/414c758113129dc4cc9595507f3c55b21ae42dc7/Safari - Jira to Notion.applescript -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | """ Configuration module """ 2 | import json 3 | import os 4 | 5 | 6 | class Config: 7 | """ Configuration class """ 8 | _CONFIG_FILE = "/Users/kerem/Documents/etc/config/jira2notion.txt" # Check sample_config.txt 9 | 10 | def __init__(self): 11 | # Read text file 12 | script_dir = os.path.dirname(__file__) 13 | config_path = os.path.join(script_dir, self._CONFIG_FILE) 14 | txt_file = open(config_path, "r") 15 | txt_content = txt_file.read() 16 | txt_file.close() 17 | json_data = json.loads(txt_content) 18 | 19 | # Parse contents 20 | self.notion_token_v2 = json_data["config"]["notion"]["token_v2"] 21 | self.notion_page = json_data["config"]["notion"]["page"] 22 | self.notion_comment_count = int(json_data["config"]["note"]["comment_count"]) 23 | 24 | self.jira_base_url = json_data["config"]["jira"]["base_url"] 25 | self.jira_username = json_data["config"]["jira"]["username"] 26 | self.jira_password = json_data["config"]["jira"]["password"] 27 | 28 | if "notion_official" in json_data["config"]: 29 | self.notion_official_configured = True 30 | self.notion_official_version = json_data["config"]["notion_official"]["version"] 31 | self.notion_official_token = json_data["config"]["notion_official"]["token"] 32 | self.notion_official_database = json_data["config"]["notion_official"]["database"] 33 | else: 34 | self.notion_official_configured = False 35 | self.notion_official_version = "" 36 | self.notion_official_token = "" 37 | self.notion_official_database = "" 38 | -------------------------------------------------------------------------------- /gui.py: -------------------------------------------------------------------------------- 1 | """ GUI module """ 2 | import tkinter as tk 3 | from tkinter import DISABLED 4 | import sys 5 | 6 | class _Popup(tk.Tk): 7 | """ Popup """ 8 | def __init__(self, callback): 9 | tk.Tk.__init__(self) 10 | self.popup = tk.Toplevel(self) 11 | self.popup.wm_title("Issue") 12 | self.popup.protocol("WM_DELETE_WINDOW", _Popup.on_close) 13 | self.popup.tkraise(self) 14 | tk.Label(self.popup, text="Issue number").pack(side="left", fill="x", pady=10, padx=10) 15 | self.issue_code = tk.StringVar(self.popup) 16 | tk.Entry(self.popup, textvariable=self.issue_code).pack(side="left", fill="x") 17 | self.button = tk.Button(self.popup, text="Transfer", command=self.on_button) 18 | self.button.pack(fill="x") 19 | self.callback = callback 20 | self.withdraw() 21 | 22 | def on_button(self): 23 | """ Called when OK is clicked """ 24 | self.button["state"] = DISABLED 25 | self.popup.update() 26 | self.callback(self.issue_code.get()) 27 | 28 | @staticmethod 29 | def on_close(): 30 | """ Called when window is closed """ 31 | sys.exit(0) 32 | 33 | 34 | def get_value_by_popup(callback): 35 | """ Main Popup function """ 36 | app = _Popup(callback) 37 | app.mainloop() 38 | -------------------------------------------------------------------------------- /jira_manager.py: -------------------------------------------------------------------------------- 1 | """ Jira manager module """ 2 | from jira import JIRA 3 | 4 | 5 | class JiraManager: 6 | """ Jira manager class """ 7 | _ISSUE_URL_DECORATOR = "/browse/" 8 | 9 | def __init__(self, Config): 10 | self._config = Config 11 | 12 | options = { 13 | "server": self._config.jira_base_url 14 | } 15 | self._jira = JIRA( 16 | options, 17 | basic_auth=(self._config.jira_username, self._config.jira_password)) 18 | 19 | def get_issue(self, issue_key: str): 20 | """ Returns the issue having the key issue_key """ 21 | issue = self._jira.issue(issue_key) 22 | return issue 23 | 24 | def get_url(self, issue_key: str) -> str: 25 | """ Returns the issue URL of the given issue key """ 26 | return self._config.jira_base_url + self._ISSUE_URL_DECORATOR + issue_key 27 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | """ Program entry point """ 2 | import sys 3 | from config import Config 4 | from notion_dao.factory import get_instance as get_notion_instance 5 | from jira_manager import JiraManager 6 | from gui import get_value_by_popup 7 | 8 | def sync_issue(issue_code: str): 9 | """ Reads the given issue from Jira and transfers to Notion """ 10 | my_config = Config() 11 | my_jira_manager = JiraManager(my_config) 12 | my_notion_manager = get_notion_instance(my_config) 13 | 14 | issue = my_jira_manager.get_issue(issue_code) 15 | my_notion_manager.create_page(issue, my_jira_manager) 16 | sys.exit(0) 17 | 18 | if __name__ == "__main__": 19 | if len(sys.argv) >= 2: 20 | desired_issue = sys.argv[1] 21 | sync_issue(desired_issue) 22 | else: 23 | get_value_by_popup(sync_issue) 24 | -------------------------------------------------------------------------------- /notion_dao/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keremkoseoglu/Jira2Notion/414c758113129dc4cc9595507f3c55b21ae42dc7/notion_dao/__init__.py -------------------------------------------------------------------------------- /notion_dao/api_v1.py: -------------------------------------------------------------------------------- 1 | """ Notion unofficial API module """ 2 | from jira.resources import Issue 3 | from notion.client import NotionClient 4 | from notion.block import PageBlock 5 | from notion.block import TextBlock 6 | from notion.block import HeaderBlock 7 | from notion.block import TodoBlock 8 | from notion.block import BookmarkBlock 9 | from notion.block import SubheaderBlock 10 | from notion.block import DividerBlock 11 | from notion.block import QuoteBlock 12 | from config import Config 13 | from jira_manager import JiraManager 14 | from notion_dao.dao import NotionDAO 15 | 16 | class APIv1(NotionDAO): 17 | """ Unofficial Notion API implementation """ 18 | def __init__(self, c: Config): 19 | super().__init__(c) 20 | self._client = NotionClient(token_v2=self._config.notion_token_v2) 21 | self._page = self._client.get_block(self._config.notion_page) 22 | 23 | def create_page(self, issue: Issue, jira_man: JiraManager, with_comments: bool = False): 24 | """ Creation of a new Notion page """ 25 | try: 26 | title_key = issue.fields.parent.key 27 | except Exception: 28 | title_key = issue.key 29 | 30 | title = f"{title_key} - {issue.fields.summary}" 31 | 32 | subpage = self._page.children.add_new(PageBlock, title=title) 33 | 34 | subpage.children.add_new( 35 | BookmarkBlock, 36 | link=jira_man.get_url(issue.key), title=issue.key, description=issue.fields.summary) 37 | subpage.children.add_new(TextBlock, title=issue.fields.description) 38 | subpage.children.add_new(DividerBlock) 39 | subpage.children.add_new(HeaderBlock, title="İşler") 40 | subpage.children.add_new(TodoBlock, title="...") 41 | subpage.children.add_new(DividerBlock) 42 | subpage.children.add_new(HeaderBlock, title="Bittiğinde Jira'ya yazılacak") 43 | subpage.children.add_new(SubheaderBlock, title="Request notu") 44 | subpage.children.add_new(TextBlock, title="...") 45 | subpage.children.add_new(SubheaderBlock, title="Soft Config") 46 | subpage.children.add_new(TextBlock, title="...") 47 | subpage.children.add_new(SubheaderBlock, title="Yorum") 48 | subpage.children.add_new(TextBlock, title="...") 49 | 50 | if with_comments: 51 | subpage.children.add_new(DividerBlock) 52 | subpage.children.add_new(HeaderBlock, title="Mevcut yorumlar") 53 | 54 | for i in range(self._config.notion_comment_count): 55 | comment_idx = issue.fields.comment.total - 1 - i 56 | if comment_idx < 0: 57 | break 58 | current_comment = issue.fields.comment.comments[comment_idx] 59 | subpage.children.add_new(QuoteBlock, title=current_comment.body) 60 | subpage.children.add_new(DividerBlock) 61 | -------------------------------------------------------------------------------- /notion_dao/api_v2.py: -------------------------------------------------------------------------------- 1 | """ Notion official API module """ 2 | import json 3 | import requests 4 | from requests.structures import CaseInsensitiveDict 5 | from jira.resources import Issue 6 | from config import Config 7 | from jira_manager import JiraManager 8 | from notion_dao.dao import NotionDAO 9 | 10 | _PAGE_URL = "https://api.notion.com/v1/pages" 11 | 12 | class APIv2(NotionDAO): 13 | """ Official Notion API implementation """ 14 | def __init__(self, c: Config): 15 | super().__init__(c) 16 | 17 | def create_page(self, issue: Issue, jira_man: JiraManager, with_comments: bool = False): 18 | """ Creation of a new Notion page """ 19 | global _PAGE_URL 20 | 21 | # Get details from JIRA 22 | try: 23 | title_key = issue.fields.parent.key 24 | except Exception: 25 | title_key = issue.key 26 | 27 | title = f"{title_key} - {issue.fields.summary}" 28 | link = jira_man.get_url(issue.key) 29 | 30 | description = issue.fields.description 31 | if description is None: 32 | description = "(No description)" 33 | 34 | # Post to Notion 35 | headers = {"Content-Type": "application/json", 36 | "Notion-Version": self._config.notion_official_version, 37 | "Authorization": "Bearer " + self._config.notion_official_token} 38 | 39 | body = { 40 | "parent": { "database_id": self._config.notion_official_database }, 41 | "properties": { 42 | "title": { "title": [{ "text": { "content": title } }] }, 43 | "URL": { "type": "url", "url": link } 44 | }, 45 | "children": [ 46 | { 47 | "object": "block", 48 | "type": "heading_1", 49 | "heading_1": { "text": [{ "type": "text", "text": { "content": "Comments" } } ] } 50 | }, 51 | { 52 | "object": "block", 53 | "type": "paragraph", 54 | "paragraph": { "text": [{ "type": "text", "text": { "content": "..." } } ] } 55 | } 56 | ] 57 | } 58 | 59 | response = requests.post(_PAGE_URL, data=json.dumps(body), headers=headers) 60 | 61 | if response.status_code != 200: 62 | raise Exception(f"Notion API error: {response.reason}") 63 | -------------------------------------------------------------------------------- /notion_dao/dao.py: -------------------------------------------------------------------------------- 1 | """ Notion Data Access Object module """ 2 | from abc import ABC, abstractmethod 3 | from jira.resources import Issue 4 | from jira_manager import JiraManager 5 | from config import Config 6 | 7 | class NotionDAO(ABC): 8 | """ Notion Data Access Object class 9 | This abstract class follows the logic of the well known 10 | Data Access Object design pattern. Google it for details. 11 | """ 12 | def __init__(self, c: Config): 13 | self._config = c 14 | 15 | @abstractmethod 16 | def create_page(self, issue: Issue, jira_man: JiraManager, with_comments: bool = False): 17 | """ Creation of a new Notion page """ 18 | pass 19 | -------------------------------------------------------------------------------- /notion_dao/factory.py: -------------------------------------------------------------------------------- 1 | """ Notion object factory module """ 2 | from config import Config 3 | from notion_dao.dao import NotionDAO 4 | from notion_dao.api_v1 import APIv1 5 | from notion_dao.api_v2 import APIv2 6 | 7 | def get_instance(c: Config) -> NotionDAO: 8 | """ Returns a new notion object """ 9 | if c.notion_official_configured: 10 | result = APIv2(c) 11 | else: 12 | result = APIv1(c) 13 | return result 14 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Jira to Notion 2 | 3 | This little program will capture a Jira issue and create a corresponding Notion subpage. Mac users can fetch the current issue from the foremost Chrome or Safari window. Others will get a popup asking for the issue number. 4 | 5 | ![Screenshot](/screenshot.png?raw=true "Screenshot") 6 | 7 | ## Installation 8 | 9 | ### OS independent 10 | 11 | * Install Python First. The program won't work unless you install Python. [Click here](https://www.python.org/downloads/mac-osx/) to install Python. [The official Python docs](https://docs.python.org/3/using/mac.html) are good enough to help you through the installation. 12 | 13 | * Create a folder (presumably called j2n), and download all of the files in this repository there 14 | 15 | * Open a terminal window, go to the j2n folder and type the following commands: 16 | 17 | ``` 18 | python3 -m venv venv 19 | ``` 20 | 21 | ### Windows 22 | 23 | If you are using Windows, continue with the following commands: 24 | 25 | ``` 26 | venv\Scripts\activate.bat 27 | pip install notion 28 | pip install jira 29 | ``` 30 | 31 | ### Mac / Linux 32 | 33 | If you are using Mac or Linux, continue with the following commands: 34 | 35 | ``` 36 | . venv/bin/activate 37 | pip install notion 38 | pip install jira 39 | ``` 40 | 41 | ## Setup 42 | 43 | ### OS independent 44 | 45 | * Ensure that you have [Notion](www.notion.so) and Jira accounts (doh) 46 | * Create a new config file which looks like sample_config.txt. You are going to fill this file with your credentials. Jira credentials are intuitive. Notion credentials are explained below. 47 | * Ensure that config.py points to your own configuration file, which you have prepared above 48 | 49 | Jira2Notion can run via to distinct API's: The (deferred, slow) unofficial API, and the (recommended, fast) official API. 50 | 51 | If you want to use the unofficial Notion API: 52 | 53 | * Remove the "notion_official" section from your config file 54 | * Fill the "notion" section in your config file with the following values: 55 | * token_v2: The value you should enter here is stored in a cookie called token_v2, which will be found in the browser you are logged in to Notion. 56 | * page: This is the URL of the page you are going to transfer your Jira issues to. Simply copy & paste the page URL from your browser. 57 | * (Optional) modify **notion_dao/api_v1.py** to change the content of your cards 58 | 59 | If you want to use the official API: 60 | 61 | * Follow the steps in [Notion API documentation](https://developers.notion.com) - check "Getting Started" to enable API's in your Notion account. You will end up with a database ID and secret token. 62 | * Put those values into the "notion_official" section of your config file. 63 | * (Optional) modify **notion_dao/api_v2.py** to change the content of your cards 64 | 65 | ### Mac OS (optional) 66 | 67 | If you wish to fetch the Jira issue in your current browser window automatically; open "Chrome - Jira to Notion.applescript" or "Safari - Jira to Notion.applescript" using Apple Script Editor and export as j2n.app (or whatever name you like) 68 | 69 | ## Usage 70 | 71 | ### Windows 72 | 73 | Simply run main.py. This will open a popup and ask for your Jira issue number. The issue you enter here will be read from Jira and transferred to Notion. You can run main.py from the command line by typing: 74 | 75 | ``` 76 | cd j2n 77 | venv\Scripts\activate.bat 78 | python3 main.py 79 | ``` 80 | 81 | Obviously, you should change the folder name j2n with your own installation path. Feel free to create a .bat file including this command for easy startup. 82 | 83 | ### Linux 84 | 85 | Simply run main.py. This will open a popup and ask for your Jira issue number. The issue you enter here will be read from Jira and transferred to Notion. You can run main.py from the command line by typing: 86 | 87 | ``` 88 | cd j2n 89 | . venv/bin/activate 90 | python3 main.py 91 | ``` 92 | 93 | Obviously, you should change the folder name j2n with your own installation path. Feel free to create a .sh file including this command for easy startup. 94 | 95 | ### Mac OS 96 | 97 | Follow the Linux steps for the popup. 98 | 99 | If you have completed the optional Mac setup steps; you can also transfer the Jira issue in your current browser to Notion. 100 | * Open a new issue in Chrome or Safari 101 | * Run j2n.app 102 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | jira 2 | notion -------------------------------------------------------------------------------- /sample_config.txt: -------------------------------------------------------------------------------- 1 | {"config": { 2 | "jira": { 3 | "base_url": "http://www.myjira.com", 4 | "username": "my_jira_user", 5 | "password": "my_jira_pass" 6 | }, 7 | "mac": { 8 | "tmp_file": "/Users/kerem/Downloads/j2n.txt" 9 | }, 10 | "note": { 11 | "comment_count": 3 12 | }, 13 | "notion": { 14 | "token_v2": "111222333444aa", 15 | "page": "https://www.notion.so/my_notion_account/my_notion_page" 16 | }, 17 | "notion_official": { 18 | "version": "2021-05-13", 19 | "token": "secret_a9.......", 20 | "database": "9530bb......." 21 | } 22 | }} -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keremkoseoglu/Jira2Notion/414c758113129dc4cc9595507f3c55b21ae42dc7/screenshot.png --------------------------------------------------------------------------------