Add etetasks.py.
This commit is contained in:
parent
8124477398
commit
4498b0b228
1 changed files with 116 additions and 0 deletions
116
etetasks.py
Normal file
116
etetasks.py
Normal file
|
@ -0,0 +1,116 @@
|
|||
'''
|
||||
I wrote this to make tasks for the tasks.org app with an etebase sync server.
|
||||
|
||||
It's not feature comprehensive but it's helpful for bulk task making.
|
||||
|
||||
The CLI is not great, it's easier to do python -i pytasks.py and code up
|
||||
whatever you want.
|
||||
|
||||
https://github.com/tasks/tasks
|
||||
https://github.com/etesync
|
||||
'''
|
||||
import argparse
|
||||
import datetime
|
||||
import etebase
|
||||
import sys
|
||||
import tasks_credentials
|
||||
import time
|
||||
|
||||
from voussoirkit import betterhelp
|
||||
from voussoirkit import passwordy
|
||||
from voussoirkit import pipeable
|
||||
from voussoirkit import timetools
|
||||
from voussoirkit import vlogging
|
||||
|
||||
log = vlogging.getLogger(__name__, '')
|
||||
|
||||
PRODID = 'voussoir/pytasks'
|
||||
|
||||
client = etebase.Client(tasks_credentials.CLIENT_NAME, tasks_credentials.SERVER)
|
||||
account = etebase.Account.login(client, tasks_credentials.USERNAME, tasks_credentials.PASSWORD)
|
||||
collection_manager = account.get_collection_manager()
|
||||
collections = collection_manager.list('etebase.vtodo', etebase.FetchOptions().limit(500000))
|
||||
collections = [c for c in collections.data if not c.deleted]
|
||||
|
||||
todo = collections[0]
|
||||
item_manager = collection_manager.get_item_manager(todo)
|
||||
|
||||
def make_vcal(text, *, categories=[], due=None):
|
||||
now = timetools.now().strftime('%Y%m%dT%H%M%SZ')
|
||||
|
||||
if due is None:
|
||||
due = ''
|
||||
elif isinstance(due, datetime.date):
|
||||
due = 'DUE;VALUE=DATE:' + due.strftime('%Y%m%d')
|
||||
elif isinstance(due, datetime.datetime):
|
||||
due = 'DUE:' + due.strftime('%Y%m%dT%H%M%S')
|
||||
else:
|
||||
raise TypeError(due)
|
||||
|
||||
lines = [
|
||||
'BEGIN:VCALENDAR',
|
||||
'VERSION:2.0',
|
||||
'PRODID:' + PRODID,
|
||||
'BEGIN:VTODO',
|
||||
'DTSTAMP:' + now,
|
||||
'UID:' + passwordy.random_digits(32),
|
||||
due,
|
||||
'CREATED:' + now,
|
||||
'LAST-MODIFIED:' + now,
|
||||
'SUMMARY:' + text,
|
||||
('CATEGORIES:' + ','.join(categories)) if len(categories) > 0 else '',
|
||||
'END:VTODO',
|
||||
'END:VCALENDAR',
|
||||
]
|
||||
lines = [l for l in lines if l]
|
||||
vcal = '\r\n'.join(lines) + '\r\n'
|
||||
return vcal.encode('utf-8')
|
||||
|
||||
def make_item(*args, **kwargs):
|
||||
item = item_manager.create({}, make_vcal(*args, **kwargs))
|
||||
return item
|
||||
|
||||
def publish_items(items):
|
||||
if isinstance(items, etebase.Item):
|
||||
item_manager.batch([items])
|
||||
else:
|
||||
item_manager.batch(list(items))
|
||||
|
||||
def export_argparse(args):
|
||||
items = item_manager.list(etebase.FetchOptions().limit(50000000))
|
||||
items = list(items.data)
|
||||
for item in items:
|
||||
pipeable.stdout(item.content.decode('utf-8'))
|
||||
pipeable.stdout()
|
||||
return 0
|
||||
|
||||
def make_tasks_argparse(args):
|
||||
titles = pipeable.input_many(args.titles, strip=True, skip_blank=True)
|
||||
items = []
|
||||
for title in titles:
|
||||
log.info('Creating task %s.', title)
|
||||
item = make_item(title)
|
||||
items.append(item)
|
||||
publish_items(items)
|
||||
return 0
|
||||
|
||||
@vlogging.main_decorator
|
||||
def main(argv):
|
||||
parser = argparse.ArgumentParser()
|
||||
subparsers = parser.add_subparsers()
|
||||
|
||||
################################################################################################
|
||||
|
||||
p_make_tasks = subparsers.add_parser('make_tasks', aliases=['make-tasks', 'maketasks', 'maketask'])
|
||||
p_make_tasks.add_argument('titles', nargs='+')
|
||||
p_make_tasks.set_defaults(func=make_tasks_argparse)
|
||||
|
||||
################################################################################################
|
||||
|
||||
p_export = subparsers.add_parser('export')
|
||||
p_export.set_defaults(func=export_argparse)
|
||||
|
||||
return betterhelp.go(parser, argv)
|
||||
|
||||
if __name__ == '__main__':
|
||||
raise SystemExit(main(sys.argv[1:]))
|
Loading…
Reference in a new issue