todoist/todoist.py

104 lines
3.2 KiB
Python
Executable File

#!/bin/env python
import argparse
import logging
import pytea
import sys
import json
import configparser
import marshmallow.validate
import re
import os
from dataclasses import field
from marshmallow_dataclass import dataclass
from typing import List, Optional
from pytodoist import todoist
from pprint import pprint
from types import SimpleNamespace as Namespace
from jira import JIRA
from pprint import pprint
config = configparser.ConfigParser()
config.read('./config.ini')
logging.basicConfig(stream=sys.stderr, level=logging.INFO, format='%(asctime)s %(levelname)s %(filename)s: %(message)s')
logger = logging.getLogger("todoist-im")
@dataclass
class GiteaUser:
avatar_url: str
full_name: str
id: int
is_admin: bool
language: str
login: str
username: str
@dataclass
class GiteaIssue:
id: int
number: int
assignee: Optional[GiteaUser]
body: str
user: Optional[GiteaUser]
title: str
url: str
# args = parser.parse_args()
# print(args.accumulate(args.integers))
gitea = pytea.API(config['auth']['gitea_url'], token=config['auth']['gitea_token'])
todo = todoist.login(config['auth']['todoist_login'], config['auth']['todoist_pass'])
jiraOptions = {'server': config['auth']['jira_url']}
jira = JIRA(options=jiraOptions, basic_auth=(config['auth']['jira_username'], os.environ['JIRA_API_TOKEN'] ))
userJson = gitea.get("/user").json()
user, _ = GiteaUser.Schema().load(userJson)
for jiraProject in config['jira_projects']:
logger.info("Jira.... " + jiraProject)
totdoistProject = config['jira_projects'][jiraProject]
for issue in jira.search_issues('project='+jiraProject.upper()+' and (assignee = currentUser() or assignee = unassigned) and status = "In Progress" and status = "To Do" '):
addTask = True
#print('{}: {} === {} ==== {} === {}'.format(issue.key, issue.fields.summary, issue.fields.status, totdoistProject, issue.fields.description))
todoProject = todo.get_project(totdoistProject)
tasks = todoProject.get_tasks()
for task in tasks:
if ("["+issue.key +"] "+ issue.fields.summary) == task.content:
logger.info("Task exists in todoist ... %r", issue.fields.summary)
addTask = False
if addTask:
logger.info("Adding ... %r", issue.fields.summary)
task = todoProject.add_task("["+issue.key +"] "+ issue.fields.summary)
task.add_note(config['auth']['jira_url']+'/browse/'+issue.key)
task.add_note("Description: "+str(issue.fields.description))
for giteaProject in config['gitea_projects']:
logger.info("Scanning ... "+ config['auth']['gitea_url'] + "/" + giteaProject)
totdoistProject = config['gitea_projects'][giteaProject]
issuesJson = json.loads(gitea.get("/repos/"+giteaProject.strip()+"/issues" , params={"state": "open", "page": 0}).text)
todoProject = todo.get_project(totdoistProject)
tasks = todoProject.get_tasks()
for issueJson in issuesJson:
addTask = True
issue, _ = GiteaIssue.Schema().load(issueJson)
for task in tasks:
if issue.title == task.content:
logger.info("Task exists in todoist ... %r", issue.title)
addTask = False
if addTask:
logger.info("Adding ... %r", issue.title)
task = todoProject.add_task(issue.title)
task.add_note(config['auth']['gitea_url']+giteaProject+"/issues/"+str(issue.number))